aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS.txt12
-rw-r--r--OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnectorModule.cs9
-rw-r--r--OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs2
-rw-r--r--OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs2
-rw-r--r--OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs2
-rw-r--r--OpenSim/Addons/OfflineIM/Service/OfflineIMService.cs2
-rw-r--r--OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs23
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs65
-rw-r--r--OpenSim/Capabilities/Caps.cs95
-rw-r--r--OpenSim/Capabilities/CapsHandlers.cs16
-rw-r--r--OpenSim/Capabilities/Handlers/AvatarPickerSearch/AvatarPickerSearchHandler.cs116
-rw-r--r--OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs4
-rw-r--r--OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs1
-rw-r--r--OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureServerConnector.cs76
-rw-r--r--OpenSim/Capabilities/LLSDAvatarPicker.cs51
-rw-r--r--OpenSim/Capabilities/LLSDStreamHandler.cs2
-rw-r--r--OpenSim/Data/IGridUserData.cs1
-rw-r--r--OpenSim/Data/IHGTravelingData.cs59
-rw-r--r--OpenSim/Data/IProfilesData.cs56
-rw-r--r--OpenSim/Data/IRegionData.cs1
-rw-r--r--OpenSim/Data/MSSQL/MSSQLGridUserData.cs7
-rw-r--r--OpenSim/Data/MSSQL/MSSQLRegionData.cs5
-rw-r--r--OpenSim/Data/MSSQL/MSSQLSimulationData.cs2
-rw-r--r--OpenSim/Data/MSSQL/Resources/RegionStore.migrations12
-rw-r--r--OpenSim/Data/MySQL/MySQLAssetData.cs22
-rw-r--r--OpenSim/Data/MySQL/MySQLGridUserData.cs7
-rw-r--r--OpenSim/Data/MySQL/MySQLGroupsData.cs2
-rw-r--r--OpenSim/Data/MySQL/MySQLHGTravelData.cs80
-rw-r--r--OpenSim/Data/MySQL/MySQLOfflineIMData.cs7
-rw-r--r--OpenSim/Data/MySQL/MySQLRegionData.cs5
-rw-r--r--OpenSim/Data/MySQL/MySQLSimulationData.cs2
-rw-r--r--OpenSim/Data/MySQL/MySQLUserProfilesData.cs1096
-rw-r--r--OpenSim/Data/MySQL/MySQLXAssetData.cs2
-rw-r--r--OpenSim/Data/MySQL/Resources/EstateStore.migrations6
-rw-r--r--OpenSim/Data/MySQL/Resources/FriendsStore.migrations2
-rw-r--r--OpenSim/Data/MySQL/Resources/HGTravelStore.migrations18
-rw-r--r--OpenSim/Data/MySQL/Resources/UserProfiles.migrations83
-rwxr-xr-xOpenSim/Data/Null/NullEstateData.cs28
-rw-r--r--OpenSim/Data/Null/NullRegionData.cs5
-rw-r--r--OpenSim/Data/Null/NullSimulationData.cs20
-rw-r--r--OpenSim/Data/SQLite/Resources/EstateStore.migrations9
-rw-r--r--OpenSim/Data/SQLite/Resources/HGTravelStore.migrations18
-rw-r--r--OpenSim/Data/SQLite/Resources/RegionStore.migrations8
-rw-r--r--OpenSim/Data/SQLite/Resources/UserProfiles.migrations90
-rw-r--r--OpenSim/Data/SQLite/SQLiteGridUserData.cs4
-rw-r--r--OpenSim/Data/SQLite/SQLiteHGTravelData.cs82
-rw-r--r--OpenSim/Data/SQLite/SQLiteSimulationData.cs24
-rw-r--r--OpenSim/Data/SQLite/SQLiteUserProfilesData.cs904
-rw-r--r--OpenSim/Framework/Animation.cs19
-rw-r--r--OpenSim/Framework/BlockingQueue.cs36
-rw-r--r--OpenSim/Framework/CachedTextureEventArg.cs46
-rw-r--r--OpenSim/Framework/ChildAgentDataUpdate.cs20
-rw-r--r--OpenSim/Framework/ClientInfo.cs11
-rw-r--r--OpenSim/Framework/Console/ConsoleUtil.cs47
-rw-r--r--OpenSim/Framework/Console/LocalConsole.cs15
-rw-r--r--OpenSim/Framework/Console/RemoteConsole.cs2
-rw-r--r--OpenSim/Framework/DAMap.cs295
-rw-r--r--OpenSim/Framework/DOMap.cs8
-rw-r--r--OpenSim/Framework/EstateSettings.cs1
-rw-r--r--OpenSim/Framework/IClientAPI.cs11
-rw-r--r--OpenSim/Framework/IPeople.cs47
-rw-r--r--OpenSim/Framework/IScene.cs7
-rw-r--r--OpenSim/Framework/Location.cs16
-rw-r--r--OpenSim/Framework/Monitoring/BaseStatsCollector.cs14
-rw-r--r--OpenSim/Framework/Monitoring/Checks/Check.cs118
-rw-r--r--OpenSim/Framework/Monitoring/ChecksManager.cs262
-rw-r--r--OpenSim/Framework/Monitoring/MemoryWatchdog.cs8
-rw-r--r--OpenSim/Framework/Monitoring/ServerStatsCollector.cs349
-rw-r--r--OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs25
-rwxr-xr-xOpenSim/Framework/Monitoring/Stats/CounterStat.cs163
-rwxr-xr-xOpenSim/Framework/Monitoring/Stats/EventHistogram.cs173
-rw-r--r--OpenSim/Framework/Monitoring/Stats/PercentageStat.cs16
-rw-r--r--OpenSim/Framework/Monitoring/Stats/Stat.cs79
-rw-r--r--OpenSim/Framework/Monitoring/StatsLogger.cs108
-rw-r--r--OpenSim/Framework/Monitoring/StatsManager.cs334
-rw-r--r--OpenSim/Framework/Monitoring/Watchdog.cs1
-rw-r--r--OpenSim/Framework/RegionFlags.cs3
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs46
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs40
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseOutputStreamHandler.cs60
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs4
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs27
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs2
-rw-r--r--OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs15
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs18
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs45
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs16
-rw-r--r--OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs4
-rw-r--r--OpenSim/Framework/Servers/HttpServer/RestSessionService.cs13
-rw-r--r--OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs2
-rw-r--r--OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs20
-rw-r--r--OpenSim/Framework/Servers/MainServer.cs13
-rw-r--r--OpenSim/Framework/Servers/ServerBase.cs254
-rw-r--r--OpenSim/Framework/Tests/LocationTest.cs21
-rw-r--r--OpenSim/Framework/Tests/MundaneFrameworkTests.cs2
-rw-r--r--OpenSim/Framework/Tests/UtilTest.cs82
-rw-r--r--OpenSim/Framework/UserProfiles.cs117
-rw-r--r--OpenSim/Framework/Util.cs143
-rw-r--r--OpenSim/Framework/WebUtil.cs80
-rw-r--r--OpenSim/Region/Application/Application.cs42
-rw-r--r--OpenSim/Region/Application/ConfigurationLoader.cs5
-rw-r--r--OpenSim/Region/Application/OpenSim.cs109
-rw-r--r--OpenSim/Region/Application/OpenSimBase.cs90
-rw-r--r--OpenSim/Region/ClientStack/IClientNetworkServer.cs15
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs139
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs23
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs113
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs6
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs6
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs20
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/RegionConsoleModule.cs2
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs26
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs44
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs104
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs4
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs644
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs7
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs96
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs436
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs72
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs25
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs6
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs16
-rw-r--r--OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs108
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs127
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs59
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs29
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs23
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs12
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs22
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs32
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs6
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs12
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs93
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs449
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs3
-rw-r--r--OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs1343
-rw-r--r--OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs426
-rw-r--r--OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs17
-rw-r--r--OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs258
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs36
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs9
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs69
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs66
-rw-r--r--OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs197
-rw-r--r--OpenSim/Region/CoreModules/Framework/ServiceThrottle/ServiceThrottleModule.cs256
-rw-r--r--OpenSim/Region/CoreModules/Framework/UserManagement/HGUserManagementModule.cs7
-rw-r--r--OpenSim/Region/CoreModules/Framework/UserManagement/Tests/HGUserManagementModuleTests.cs76
-rw-r--r--OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs394
-rw-r--r--OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs64
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs3
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs198
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs6
-rw-r--r--OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs21
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs226
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/Tests/AssetConnectorTests.cs46
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs49
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs20
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs5
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs5
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs66
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs3
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs26
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs69
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs69
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs31
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs6
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/XEstateConnector.cs218
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/XEstateModule.cs256
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/XEstateRequestHandler.cs298
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs51
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs27
-rw-r--r--OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Region/RestartModule.cs30
-rw-r--r--OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs44
-rw-r--r--OpenSim/Region/CoreModules/World/Sound/SoundModule.cs9
-rw-r--r--OpenSim/Region/DataSnapshot/DataRequestHandler.cs4
-rw-r--r--OpenSim/Region/DataSnapshot/SnapshotStore.cs12
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEstateModule.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEventQueue.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs48
-rw-r--r--OpenSim/Region/Framework/Interfaces/IGroupsModule.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/IServiceThrottleModule.cs19
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISoundModule.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs114
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs60
-rw-r--r--OpenSim/Region/Framework/Scenes/KeyframeMotion.cs38
-rw-r--r--OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs33
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs30
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs739
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs17
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs34
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneManager.cs23
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs39
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs109
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs270
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresenceStateMachine.cs113
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SimStatsReporter.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs86
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs88
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs175
-rw-r--r--OpenSim/Region/Framework/Scenes/UuidGatherer.cs76
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs11
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs123
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs6
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/SitStand/SitStandCommandsModule.cs220
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs18
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs59
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs23
-rw-r--r--OpenSim/Region/OptionalModules/Framework/Monitoring/ServerStats.cs339
-rw-r--r--OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs657
-rwxr-xr-xOpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs113
-rw-r--r--OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs11
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs10
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs2
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs60
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs210
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs409
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs173
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs187
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs219
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs137
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs138
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActors.cs156
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs35
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs517
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs2
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs4
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs2
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs635
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs197
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs370
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs296
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSMotors.cs97
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs340
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs394
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs841
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs121
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs144
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs332
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs998
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapes.cs1138
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSTerrainHeightmap.cs30
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs93
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs56
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs48
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt131
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/Tests/BasicVehicles.cs34
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs6
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsScene.cs10
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs249
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs1
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs2
-rw-r--r--OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs6
-rw-r--r--OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs83
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs326
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs133
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs25
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs37
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs85
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs6
-rw-r--r--OpenSim/Server/Base/ServerUtils.cs1
-rw-r--r--OpenSim/Server/Base/ServicesServerBase.cs25
-rw-r--r--OpenSim/Server/Handlers/Asset/AssetServerConnector.cs12
-rw-r--r--OpenSim/Server/Handlers/Asset/AssetServerDeleteHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Asset/AssetServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs30
-rw-r--r--OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs35
-rw-r--r--OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs8
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs2
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs8
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs2
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs201
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/InstantMessageServerConnector.cs7
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs15
-rw-r--r--OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs4
-rw-r--r--OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs9
-rw-r--r--OpenSim/Server/Handlers/Map/MapAddServerConnector.cs2
-rw-r--r--OpenSim/Server/Handlers/Map/MapGetServerConnector.cs2
-rw-r--r--OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs8
-rw-r--r--OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs2
-rw-r--r--OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs112
-rw-r--r--OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs461
-rw-r--r--OpenSim/Server/Handlers/Simulation/AgentHandlers.cs182
-rw-r--r--OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs2
-rw-r--r--OpenSim/Services/AssetService/XAssetService.cs7
-rw-r--r--OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs6
-rw-r--r--OpenSim/Services/Connectors/Grid/GridServicesConnector.cs51
-rw-r--r--OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs2
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs68
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs2
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs138
-rw-r--r--OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs1
-rw-r--r--OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs124
-rw-r--r--OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs10
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs507
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs12
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs8
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs180
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs8
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs114
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs131
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs24
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs30
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs212
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs6
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs8
-rw-r--r--OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs102
-rw-r--r--OpenSim/Services/GridService/GridService.cs85
-rw-r--r--OpenSim/Services/GridService/HypergridLinker.cs2
-rw-r--r--OpenSim/Services/HypergridService/GatekeeperService.cs43
-rw-r--r--OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs50
-rw-r--r--OpenSim/Services/HypergridService/UserAgentService.cs216
-rw-r--r--OpenSim/Services/HypergridService/UserAgentServiceBase.cs84
-rw-r--r--OpenSim/Services/Interfaces/IBansService.cs48
-rw-r--r--OpenSim/Services/Interfaces/IGridService.cs6
-rw-r--r--OpenSim/Services/Interfaces/IHypergridServices.cs5
-rw-r--r--OpenSim/Services/Interfaces/ISimulationService.cs12
-rw-r--r--OpenSim/Services/Interfaces/IUserProfilesService.cs75
-rw-r--r--OpenSim/Services/LLLoginService/LLLoginResponse.cs36
-rw-r--r--OpenSim/Services/LLLoginService/LLLoginService.cs11
-rw-r--r--OpenSim/Services/MapImageService/MapImageService.cs2
-rw-r--r--OpenSim/Services/UserAccountService/GridUserService.cs62
-rw-r--r--OpenSim/Services/UserProfilesService/UserProfilesService.cs187
-rw-r--r--OpenSim/Services/UserProfilesService/UserProfilesServiceBase.cs86
-rw-r--r--OpenSim/Tests/Clients/Assets/AssetsClient.cs126
-rw-r--r--OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs45
-rw-r--r--OpenSim/Tests/Common/Helpers/SceneHelpers.cs54
-rw-r--r--OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs41
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs79
-rw-r--r--OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs28
-rw-r--r--OpenSim/Tests/Common/OpenSimTestCase.cs12
-rw-r--r--OpenSim/Tools/Configger/ConfigurationLoader.cs1
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs7
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/CrossBehaviour.cs6
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/GrabbingBehaviour.cs9
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs47
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs7
-rw-r--r--OpenSim/Tools/pCampBot/Behaviours/TeleportBehaviour.cs9
-rw-r--r--OpenSim/Tools/pCampBot/Bot.cs250
-rw-r--r--OpenSim/Tools/pCampBot/BotManager.cs768
-rw-r--r--OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs13
-rw-r--r--OpenSim/Tools/pCampBot/pCampBot.cs89
-rw-r--r--README.md1
-rw-r--r--ThirdParty/SmartThreadPool/AssemblyInfo.cs61
-rw-r--r--ThirdParty/SmartThreadPool/CallerThreadContext.cs309
-rw-r--r--ThirdParty/SmartThreadPool/CanceledWorkItemsGroup.cs14
-rw-r--r--ThirdParty/SmartThreadPool/EventWaitHandle.cs104
-rw-r--r--ThirdParty/SmartThreadPool/EventWaitHandleFactory.cs82
-rw-r--r--ThirdParty/SmartThreadPool/Exceptions.cs82
-rw-r--r--ThirdParty/SmartThreadPool/Interfaces.cs703
-rw-r--r--ThirdParty/SmartThreadPool/InternalInterfaces.cs27
-rw-r--r--ThirdParty/SmartThreadPool/PriorityQueue.cs465
-rw-r--r--ThirdParty/SmartThreadPool/Properties/AssemblyInfo.cs23
-rw-r--r--ThirdParty/SmartThreadPool/SLExt.cs16
-rw-r--r--ThirdParty/SmartThreadPool/STPEventWaitHandle.cs62
-rw-r--r--ThirdParty/SmartThreadPool/STPPerformanceCounter.cs648
-rw-r--r--ThirdParty/SmartThreadPool/STPStartInfo.cs269
-rw-r--r--ThirdParty/SmartThreadPool/SmartThreadPool.ThreadEntry.cs60
-rw-r--r--ThirdParty/SmartThreadPool/SmartThreadPool.cs2559
-rw-r--r--ThirdParty/SmartThreadPool/SynchronizedDictionary.cs89
-rw-r--r--ThirdParty/SmartThreadPool/WIGStartInfo.cs218
-rw-r--r--ThirdParty/SmartThreadPool/WorkItem.WorkItemResult.cs190
-rw-r--r--ThirdParty/SmartThreadPool/WorkItem.cs659
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemFactory.cs628
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemInfo.cs145
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemResultTWrapper.cs128
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemsGroup.cs759
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs471
-rw-r--r--ThirdParty/SmartThreadPool/WorkItemsQueue.cs973
-rw-r--r--bin/BulletXNA.dllbin610304 -> 618496 bytes
-rw-r--r--bin/BulletXNA.pdbbin1963520 -> 1889792 bytes
-rw-r--r--bin/OpenMetaverse.Http.XML57
-rwxr-xr-xbin/OpenMetaverse.Rendering.Meshmerizer.dllbin24576 -> 24576 bytes
-rw-r--r--bin/OpenMetaverse.StructuredData.XML274
-rwxr-xr-xbin/OpenMetaverse.StructuredData.dllbin114688 -> 102400 bytes
-rw-r--r--bin/OpenMetaverse.XML32181
-rwxr-xr-xbin/OpenMetaverse.dllbin1925120 -> 1785856 bytes
-rw-r--r--bin/OpenMetaverse.dll.config8
-rw-r--r--bin/OpenMetaverseTypes.XML3115
-rwxr-xr-xbin/OpenMetaverseTypes.dllbin122880 -> 114688 bytes
-rw-r--r--bin/OpenSim.32BitLaunch.exe.config36
-rwxr-xr-xbin/OpenSim.exe.config21
-rw-r--r--bin/OpenSim.ini.example44
-rw-r--r--bin/OpenSimDefaults.ini144
-rwxr-xr-xbin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config2
-rw-r--r--bin/Robust.32BitLaunch.exe.config22
-rw-r--r--bin/Robust.HG.ini.example76
-rw-r--r--bin/Robust.exe.config21
-rw-r--r--bin/Robust.ini.example68
-rw-r--r--bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2bin0 -> 11276 bytes
-rw-r--r--bin/assets/TexturesAssetSet/TexturesAssetSet.xml12
-rw-r--r--bin/config-include/Grid.ini12
-rw-r--r--bin/config-include/GridCommon.ini.example9
-rw-r--r--bin/config-include/GridHypergrid.ini1
-rw-r--r--bin/config-include/Standalone.ini12
-rw-r--r--bin/config-include/StandaloneCommon.ini.example49
-rw-r--r--bin/config-include/StandaloneHypergrid.ini8
-rw-r--r--bin/data/LICENSE-README-IMPORTANT.txt2
-rwxr-xr-xbin/lib32/BulletSim.dllbin570368 -> 982528 bytes
-rwxr-xr-xbin/lib32/libBulletSim.dylibbin0 -> 1181656 bytes
-rwxr-xr-xbin/lib32/libBulletSim.sobin1751260 -> 2271724 bytes
-rwxr-xr-xbin/lib64/BulletSim.dllbin720896 -> 1222656 bytes
-rwxr-xr-xbin/lib64/libBulletSim.sobin1908442 -> 2454796 bytes
-rw-r--r--bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.sobin0 -> 140028 bytes
-rw-r--r--bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.sobin0 -> 149368 bytes
-rw-r--r--bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylibbin0 -> 130560 bytes
-rw-r--r--bin/pCampBot.ini.example19
-rw-r--r--prebuild.xml76
447 files changed, 49400 insertions, 30012 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index 8ff55df..8181483 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -58,13 +58,14 @@ where we are today.
58 58
59 59
60= Additional OpenSim Contributors = 60= Additional OpenSim Contributors =
61These folks have contributed code patches to OpenSim to help make it 61These folks have contributed code patches or content to OpenSimulator to help make it
62what it is today. 62what it is today.
63 63
64* aduffy70 64* aduffy70
65* A_Biondi 65* A_Biondi
66* alex_carnell 66* alex_carnell
67* Alan Webb (IBM) 67* Alan Webb (IBM)
68* Aleric
68* Allen Kerensky 69* Allen Kerensky
69* BigFootAg 70* BigFootAg
70* BlueWall Slade 71* BlueWall Slade
@@ -75,11 +76,12 @@ what it is today.
75* controlbreak 76* controlbreak
76* coyled 77* coyled
77* Daedius 78* Daedius
78* Dong Jun Lan (IBM)
79* DoranZemlja
80* daTwitch 79* daTwitch
81* devalnor-#708 80* devalnor-#708
82* dmiles (Daxtron Labs) 81* dmiles (Daxtron Labs)
82* Dong Jun Lan (IBM)
83* DoranZemlja
84* dr0b3rts
83* dslake (Intel) 85* dslake (Intel)
84* FredoChaplin 86* FredoChaplin
85* Garmin Kawaguichi 87* Garmin Kawaguichi
@@ -101,6 +103,7 @@ what it is today.
101* jhurliman 103* jhurliman
102* John R Sohn (XenReborn) 104* John R Sohn (XenReborn)
103* jonc 105* jonc
106* Jon Cundill
104* Junta Kohime 107* Junta Kohime
105* Kayne 108* Kayne
106* Kevin Cozens 109* Kevin Cozens
@@ -161,6 +164,7 @@ what it is today.
161* webmage (IBM) 164* webmage (IBM)
162* Xantor 165* Xantor
163* Y. Nitta 166* Y. Nitta
167* YoshikoFazuku
164* YZh 168* YZh
165* Zackary Geers aka Kunnis Basiat 169* Zackary Geers aka Kunnis Basiat
166* Zha Ewry 170* Zha Ewry
@@ -213,5 +217,3 @@ In addition, we would like to thank:
213* The Mono Project 217* The Mono Project
214* The NANT Developers 218* The NANT Developers
215* Microsoft (.NET, MSSQL-Adapters) 219* Microsoft (.NET, MSSQL-Adapters)
216*x
217
diff --git a/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnectorModule.cs b/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnectorModule.cs
index 4642b2a..7d48516 100644
--- a/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnectorModule.cs
+++ b/OpenSim/Addons/Groups/Hypergrid/GroupsServiceHGConnectorModule.cs
@@ -623,10 +623,13 @@ namespace OpenSim.Groups
623 if (agent != null) 623 if (agent != null)
624 break; 624 break;
625 } 625 }
626 if (agent == null) // oops 626 if (agent != null)
627 return AgentID.ToString(); 627 return Util.ProduceUserUniversalIdentifier(agent);
628
629 // we don't know anything about this foreign user
630 // try asking the user management module, which may know more
631 return m_UserManagement.GetUserUUI(AgentID);
628 632
629 return Util.ProduceUserUniversalIdentifier(agent);
630 } 633 }
631 634
632 private string AgentUUIForOutside(string AgentIDStr) 635 private string AgentUUIForOutside(string AgentIDStr)
diff --git a/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs b/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs
index 6f58922..d2bcba5 100644
--- a/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs
+++ b/OpenSim/Addons/Groups/Hypergrid/HGGroupsServiceRobustConnector.cs
@@ -112,7 +112,7 @@ namespace OpenSim.Groups
112 m_GroupsService = service; 112 m_GroupsService = service;
113 } 113 }
114 114
115 public override byte[] Handle(string path, Stream requestData, 115 protected override byte[] ProcessRequest(string path, Stream requestData,
116 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 116 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
117 { 117 {
118 StreamReader sr = new StreamReader(requestData); 118 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs
index 7e55d3c..249d974 100644
--- a/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs
+++ b/OpenSim/Addons/Groups/Remote/GroupsServiceRobustConnector.cs
@@ -75,7 +75,7 @@ namespace OpenSim.Groups
75 m_GroupsService = service; 75 m_GroupsService = service;
76 } 76 }
77 77
78 public override byte[] Handle(string path, Stream requestData, 78 protected override byte[] ProcessRequest(string path, Stream requestData,
79 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 79 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
80 { 80 {
81 StreamReader sr = new StreamReader(requestData); 81 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs b/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs
index 2b3a01d..32c24db 100644
--- a/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs
+++ b/OpenSim/Addons/OfflineIM/Remote/OfflineIMServiceRobustConnector.cs
@@ -75,7 +75,7 @@ namespace OpenSim.OfflineIM
75 m_OfflineIMService = service; 75 m_OfflineIMService = service;
76 } 76 }
77 77
78 public override byte[] Handle(string path, Stream requestData, 78 protected override byte[] ProcessRequest(string path, Stream requestData,
79 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 79 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
80 { 80 {
81 StreamReader sr = new StreamReader(requestData); 81 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Addons/OfflineIM/Service/OfflineIMService.cs b/OpenSim/Addons/OfflineIM/Service/OfflineIMService.cs
index 6ba022c..6731923 100644
--- a/OpenSim/Addons/OfflineIM/Service/OfflineIMService.cs
+++ b/OpenSim/Addons/OfflineIM/Service/OfflineIMService.cs
@@ -46,7 +46,7 @@ namespace OpenSim.OfflineIM
46{ 46{
47 public class OfflineIMService : OfflineIMServiceBase, IOfflineIMService 47 public class OfflineIMService : OfflineIMServiceBase, IOfflineIMService
48 { 48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 private const int MAX_IM = 25; 50 private const int MAX_IM = 25;
51 51
52 private XmlSerializer m_serializer; 52 private XmlSerializer m_serializer;
diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
index fcb6991..1d63d26 100644
--- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
+++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs
@@ -115,6 +115,8 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
115 Environment.Exit(1); 115 Environment.Exit(1);
116 } 116 }
117 117
118 List<IScene> createdScenes = new List<IScene>();
119
118 for (int i = 0; i < regionsToLoad.Length; i++) 120 for (int i = 0; i < regionsToLoad.Length; i++)
119 { 121 {
120 IScene scene; 122 IScene scene;
@@ -123,17 +125,22 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
123 ")"); 125 ")");
124 126
125 bool changed = m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]); 127 bool changed = m_openSim.PopulateRegionEstateInfo(regionsToLoad[i]);
128
126 m_openSim.CreateRegion(regionsToLoad[i], true, out scene); 129 m_openSim.CreateRegion(regionsToLoad[i], true, out scene);
130 createdScenes.Add(scene);
131
127 if (changed) 132 if (changed)
128 regionsToLoad[i].EstateSettings.Save(); 133 regionsToLoad[i].EstateSettings.Save();
129 134 }
130 if (scene != null) 135
136 foreach (IScene scene in createdScenes)
137 {
138 scene.Start();
139
140 m_newRegionCreatedHandler = OnNewRegionCreated;
141 if (m_newRegionCreatedHandler != null)
131 { 142 {
132 m_newRegionCreatedHandler = OnNewRegionCreated; 143 m_newRegionCreatedHandler(scene);
133 if (m_newRegionCreatedHandler != null)
134 {
135 m_newRegionCreatedHandler(scene);
136 }
137 } 144 }
138 } 145 }
139 } 146 }
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index e50dac6..f3490fb 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -161,6 +161,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
161 availableMethods["admin_acl_add"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListAdd); 161 availableMethods["admin_acl_add"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListAdd);
162 availableMethods["admin_acl_remove"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListRemove); 162 availableMethods["admin_acl_remove"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListRemove);
163 availableMethods["admin_acl_list"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListList); 163 availableMethods["admin_acl_list"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListList);
164 availableMethods["admin_estate_reload"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcEstateReload);
164 165
165 // Misc 166 // Misc
166 availableMethods["admin_refresh_search"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcRefreshSearch); 167 availableMethods["admin_refresh_search"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcRefreshSearch);
@@ -438,18 +439,26 @@ namespace OpenSim.ApplicationPlugins.RemoteController
438 // k, (string)requestData[k], ((string)requestData[k]).Length); 439 // k, (string)requestData[k], ((string)requestData[k]).Length);
439 // } 440 // }
440 441
441 CheckStringParameters(requestData, responseData, new string[] {"filename", "regionid"}); 442 CheckStringParameters(requestData, responseData, new string[] { "filename" });
442 CheckRegionParams(requestData, responseData); 443 CheckRegionParams(requestData, responseData);
443 444
444 Scene scene = null; 445 Scene scene = null;
445 GetSceneFromRegionParams(requestData, responseData, out scene); 446 GetSceneFromRegionParams(requestData, responseData, out scene);
446 string file = (string)requestData["filename"];
447 447
448 responseData["accepted"] = true; 448 if (scene != null)
449 {
450 string file = (string)requestData["filename"];
449 451
450 LoadHeightmap(file, scene.RegionInfo.RegionID); 452 responseData["accepted"] = true;
451 453
452 responseData["success"] = true; 454 LoadHeightmap(file, scene.RegionInfo.RegionID);
455
456 responseData["success"] = true;
457 }
458 else
459 {
460 responseData["success"] = false;
461 }
453 462
454 m_log.Info("[RADMIN]: Load height maps request complete"); 463 m_log.Info("[RADMIN]: Load height maps request complete");
455 } 464 }
@@ -463,23 +472,30 @@ namespace OpenSim.ApplicationPlugins.RemoteController
463 472
464// m_log.DebugFormat("[RADMIN]: Save Terrain: XmlRpc {0}", request.ToString()); 473// m_log.DebugFormat("[RADMIN]: Save Terrain: XmlRpc {0}", request.ToString());
465 474
466 CheckStringParameters(requestData, responseData, new string[] { "filename", "regionid" }); 475 CheckStringParameters(requestData, responseData, new string[] { "filename" });
467 CheckRegionParams(requestData, responseData); 476 CheckRegionParams(requestData, responseData);
468 477
469 Scene region = null; 478 Scene scene = null;
470 GetSceneFromRegionParams(requestData, responseData, out region); 479 GetSceneFromRegionParams(requestData, responseData, out scene);
471 480
472 string file = (string)requestData["filename"]; 481 if (scene != null)
473 m_log.InfoFormat("[RADMIN]: Terrain Saving: {0}", file); 482 {
483 string file = (string)requestData["filename"];
484 m_log.InfoFormat("[RADMIN]: Terrain Saving: {0}", file);
474 485
475 responseData["accepted"] = true; 486 responseData["accepted"] = true;
476 487
477 ITerrainModule terrainModule = region.RequestModuleInterface<ITerrainModule>(); 488 ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>();
478 if (null == terrainModule) throw new Exception("terrain module not available"); 489 if (null == terrainModule) throw new Exception("terrain module not available");
479 490
480 terrainModule.SaveToFile(file); 491 terrainModule.SaveToFile(file);
481 492
482 responseData["success"] = true; 493 responseData["success"] = true;
494 }
495 else
496 {
497 responseData["success"] = false;
498 }
483 499
484 m_log.Info("[RADMIN]: Save height maps request complete"); 500 m_log.Info("[RADMIN]: Save height maps request complete");
485 } 501 }
@@ -831,6 +847,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
831 847
832 IScene newScene; 848 IScene newScene;
833 m_application.CreateRegion(region, out newScene); 849 m_application.CreateRegion(region, out newScene);
850 newScene.Start();
834 851
835 // If an access specification was provided, use it. 852 // If an access specification was provided, use it.
836 // Otherwise accept the default. 853 // Otherwise accept the default.
@@ -1225,7 +1242,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
1225 { 1242 {
1226 GridUserInfo userInfo = m_application.SceneManager.CurrentOrFirstScene.GridUserService.GetGridUserInfo(account.PrincipalID.ToString()); 1243 GridUserInfo userInfo = m_application.SceneManager.CurrentOrFirstScene.GridUserService.GetGridUserInfo(account.PrincipalID.ToString());
1227 if (userInfo != null) 1244 if (userInfo != null)
1228 responseData["lastlogin"] = userInfo.Login; 1245 responseData["lastlogin"] = Util.ToUnixTime(userInfo.Login);
1229 else 1246 else
1230 responseData["lastlogin"] = 0; 1247 responseData["lastlogin"] = 0;
1231 1248
@@ -1902,6 +1919,22 @@ namespace OpenSim.ApplicationPlugins.RemoteController
1902 m_log.Info("[RADMIN]: Access List List Request complete"); 1919 m_log.Info("[RADMIN]: Access List List Request complete");
1903 } 1920 }
1904 1921
1922 private void XmlRpcEstateReload(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
1923 {
1924 m_log.Info("[RADMIN]: Received Estate Reload Request");
1925
1926 Hashtable responseData = (Hashtable)response.Value;
1927// Hashtable requestData = (Hashtable)request.Params[0];
1928
1929 m_application.SceneManager.ForEachScene(s =>
1930 s.RegionInfo.EstateSettings = m_application.EstateDataService.LoadEstateSettings(s.RegionInfo.RegionID, false)
1931 );
1932
1933 responseData["success"] = true;
1934
1935 m_log.Info("[RADMIN]: Estate Reload Request complete");
1936 }
1937
1905 private void XmlRpcGetAgentsMethod(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient) 1938 private void XmlRpcGetAgentsMethod(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
1906 { 1939 {
1907 Hashtable responseData = (Hashtable)response.Value; 1940 Hashtable responseData = (Hashtable)response.Value;
diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs
index 241fef3..30a323e 100644
--- a/OpenSim/Capabilities/Caps.cs
+++ b/OpenSim/Capabilities/Caps.cs
@@ -64,7 +64,11 @@ namespace OpenSim.Framework.Capabilities
64 public string CapsObjectPath { get { return m_capsObjectPath; } } 64 public string CapsObjectPath { get { return m_capsObjectPath; } }
65 65
66 private CapsHandlers m_capsHandlers; 66 private CapsHandlers m_capsHandlers;
67 private Dictionary<string, string> m_externalCapsHandlers; 67
68 private Dictionary<string, PollServiceEventArgs> m_pollServiceHandlers
69 = new Dictionary<string, PollServiceEventArgs>();
70
71 private Dictionary<string, string> m_externalCapsHandlers = new Dictionary<string, string>();
68 72
69 private IHttpServer m_httpListener; 73 private IHttpServer m_httpListener;
70 private UUID m_agentID; 74 private UUID m_agentID;
@@ -134,7 +138,6 @@ namespace OpenSim.Framework.Capabilities
134 138
135 m_agentID = agent; 139 m_agentID = agent;
136 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort, (httpServer == null) ? false : httpServer.UseSSL); 140 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort, (httpServer == null) ? false : httpServer.UseSSL);
137 m_externalCapsHandlers = new Dictionary<string, string>();
138 m_regionName = regionName; 141 m_regionName = regionName;
139 } 142 }
140 143
@@ -145,8 +148,29 @@ namespace OpenSim.Framework.Capabilities
145 /// <param name="handler"></param> 148 /// <param name="handler"></param>
146 public void RegisterHandler(string capName, IRequestHandler handler) 149 public void RegisterHandler(string capName, IRequestHandler handler)
147 { 150 {
148 m_capsHandlers[capName] = handler;
149 //m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path); 151 //m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path);
152 m_capsHandlers[capName] = handler;
153 }
154
155 public void RegisterPollHandler(string capName, PollServiceEventArgs pollServiceHandler)
156 {
157 m_pollServiceHandlers.Add(capName, pollServiceHandler);
158
159 m_httpListener.AddPollServiceHTTPHandler(pollServiceHandler.Url, pollServiceHandler);
160
161// uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
162// string protocol = "http";
163// string hostName = m_httpListenerHostName;
164//
165// if (MainServer.Instance.UseSSL)
166// {
167// hostName = MainServer.Instance.SSLCommonName;
168// port = MainServer.Instance.SSLPort;
169// protocol = "https";
170// }
171
172// RegisterHandler(
173// capName, String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, pollServiceHandler.Url));
150 } 174 }
151 175
152 /// <summary> 176 /// <summary>
@@ -165,13 +189,70 @@ namespace OpenSim.Framework.Capabilities
165 /// </summary> 189 /// </summary>
166 public void DeregisterHandlers() 190 public void DeregisterHandlers()
167 { 191 {
168 if (m_capsHandlers != null) 192 foreach (string capsName in m_capsHandlers.Caps)
193 {
194 m_capsHandlers.Remove(capsName);
195 }
196
197 foreach (PollServiceEventArgs handler in m_pollServiceHandlers.Values)
198 {
199 m_httpListener.RemovePollServiceHTTPHandler("", handler.Url);
200 }
201 }
202
203 public bool TryGetPollHandler(string name, out PollServiceEventArgs pollHandler)
204 {
205 return m_pollServiceHandlers.TryGetValue(name, out pollHandler);
206 }
207
208 public Dictionary<string, PollServiceEventArgs> GetPollHandlers()
209 {
210 return new Dictionary<string, PollServiceEventArgs>(m_pollServiceHandlers);
211 }
212
213 /// <summary>
214 /// Return an LLSD-serializable Hashtable describing the
215 /// capabilities and their handler details.
216 /// </summary>
217 /// <param name="excludeSeed">If true, then exclude the seed cap.</param>
218 public Hashtable GetCapsDetails(bool excludeSeed, List<string> requestedCaps)
219 {
220 Hashtable caps = CapsHandlers.GetCapsDetails(excludeSeed, requestedCaps);
221
222 lock (m_pollServiceHandlers)
169 { 223 {
170 foreach (string capsName in m_capsHandlers.Caps) 224 foreach (KeyValuePair <string, PollServiceEventArgs> kvp in m_pollServiceHandlers)
171 { 225 {
172 m_capsHandlers.Remove(capsName); 226 if (!requestedCaps.Contains(kvp.Key))
227 continue;
228
229 string hostName = m_httpListenerHostName;
230 uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
231 string protocol = "http";
232
233 if (MainServer.Instance.UseSSL)
234 {
235 hostName = MainServer.Instance.SSLCommonName;
236 port = MainServer.Instance.SSLPort;
237 protocol = "https";
238 }
239 //
240 // caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
241
242 caps[kvp.Key] = string.Format("{0}://{1}:{2}{3}", protocol, hostName, port, kvp.Value.Url);
173 } 243 }
174 } 244 }
245
246 // Add the external too
247 foreach (KeyValuePair<string, string> kvp in ExternalCapsHandlers)
248 {
249 if (!requestedCaps.Contains(kvp.Key))
250 continue;
251
252 caps[kvp.Key] = kvp.Value;
253 }
254
255 return caps;
175 } 256 }
176 257
177 public void Activate() 258 public void Activate()
@@ -185,4 +266,4 @@ namespace OpenSim.Framework.Capabilities
185 return m_capsActive.WaitOne(30000); 266 return m_capsActive.WaitOne(30000);
186 } 267 }
187 } 268 }
188} 269} \ No newline at end of file
diff --git a/OpenSim/Capabilities/CapsHandlers.cs b/OpenSim/Capabilities/CapsHandlers.cs
index 458272d..890df90 100644
--- a/OpenSim/Capabilities/CapsHandlers.cs
+++ b/OpenSim/Capabilities/CapsHandlers.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Framework.Capabilities
39 /// </summary> 39 /// </summary>
40 public class CapsHandlers 40 public class CapsHandlers
41 { 41 {
42 private Dictionary <string, IRequestHandler> m_capsHandlers = new Dictionary<string, IRequestHandler>(); 42 private Dictionary<string, IRequestHandler> m_capsHandlers = new Dictionary<string, IRequestHandler>();
43 private IHttpServer m_httpListener; 43 private IHttpServer m_httpListener;
44 private string m_httpListenerHostName; 44 private string m_httpListenerHostName;
45 private uint m_httpListenerPort; 45 private uint m_httpListenerPort;
@@ -184,5 +184,17 @@ namespace OpenSim.Framework.Capabilities
184 184
185 return caps; 185 return caps;
186 } 186 }
187
188 /// <summary>
189 /// Returns a copy of the dictionary of all the HTTP cap handlers
190 /// </summary>
191 /// <returns>
192 /// The dictionary copy. The key is the capability name, the value is the HTTP handler.
193 /// </returns>
194 public Dictionary<string, IRequestHandler> GetCapsHandlers()
195 {
196 lock (m_capsHandlers)
197 return new Dictionary<string, IRequestHandler>(m_capsHandlers);
198 }
187 } 199 }
188} 200} \ No newline at end of file
diff --git a/OpenSim/Capabilities/Handlers/AvatarPickerSearch/AvatarPickerSearchHandler.cs b/OpenSim/Capabilities/Handlers/AvatarPickerSearch/AvatarPickerSearchHandler.cs
new file mode 100644
index 0000000..426174d
--- /dev/null
+++ b/OpenSim/Capabilities/Handlers/AvatarPickerSearch/AvatarPickerSearchHandler.cs
@@ -0,0 +1,116 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Collections.Specialized;
31using System.IO;
32using System.Reflection;
33using System.Web;
34using log4net;
35using Nini.Config;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Framework.Capabilities;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41//using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Services.Interfaces;
43using Caps = OpenSim.Framework.Capabilities.Caps;
44
45namespace OpenSim.Capabilities.Handlers
46{
47 public class AvatarPickerSearchHandler : BaseStreamHandler
48 {
49 private static readonly ILog m_log =
50 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 private IPeople m_PeopleService;
52
53 public AvatarPickerSearchHandler(string path, IPeople peopleService, string name, string description)
54 : base("GET", path, name, description)
55 {
56 m_PeopleService = peopleService;
57 }
58
59 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
60 {
61 // Try to parse the texture ID from the request URL
62 NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
63 string names = query.GetOne("names");
64 string psize = query.GetOne("page_size");
65 string pnumber = query.GetOne("page");
66
67 if (m_PeopleService == null)
68 return FailureResponse(names, (int)System.Net.HttpStatusCode.InternalServerError, httpResponse);
69
70 if (string.IsNullOrEmpty(names) || names.Length < 3)
71 return FailureResponse(names, (int)System.Net.HttpStatusCode.BadRequest, httpResponse);
72
73 m_log.DebugFormat("[AVATAR PICKER SEARCH]: search for {0}", names);
74
75 int page_size = (string.IsNullOrEmpty(psize) ? 500 : Int32.Parse(psize));
76 int page_number = (string.IsNullOrEmpty(pnumber) ? 1 : Int32.Parse(pnumber));
77
78 // Full content request
79 httpResponse.StatusCode = (int)System.Net.HttpStatusCode.OK;
80 //httpResponse.ContentLength = ??;
81 httpResponse.ContentType = "application/llsd+xml";
82
83 List<UserData> users = m_PeopleService.GetUserData(names, page_size, page_number);
84
85 LLSDAvatarPicker osdReply = new LLSDAvatarPicker();
86 osdReply.next_page_url = httpRequest.RawUrl;
87 foreach (UserData u in users)
88 osdReply.agents.Array.Add(ConvertUserData(u));
89
90 string reply = LLSDHelpers.SerialiseLLSDReply(osdReply);
91 return System.Text.Encoding.UTF8.GetBytes(reply);
92 }
93
94 private LLSDPerson ConvertUserData(UserData user)
95 {
96 LLSDPerson p = new LLSDPerson();
97 p.legacy_first_name = user.FirstName;
98 p.legacy_last_name = user.LastName;
99 p.display_name = user.FirstName + " " + user.LastName;
100 if (user.LastName.StartsWith("@"))
101 p.username = user.FirstName.ToLower() + user.LastName.ToLower();
102 else
103 p.username = user.FirstName.ToLower() + "." + user.LastName.ToLower();
104 p.id = user.Id;
105 p.is_display_name_default = false;
106 return p;
107 }
108
109 private byte[] FailureResponse(string names, int statuscode, IOSHttpResponse httpResponse)
110 {
111 m_log.Error("[AVATAR PICKER SEARCH]: Error searching for " + names);
112 httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
113 return System.Text.Encoding.UTF8.GetBytes(string.Empty);
114 }
115 }
116} \ No newline at end of file
diff --git a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs
index c305797..d1503ee 100644
--- a/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs
+++ b/OpenSim/Capabilities/Handlers/FetchInventory2/FetchInventory2Handler.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Capabilities.Handlers
46{ 46{
47 public class FetchInventory2Handler 47 public class FetchInventory2Handler
48 { 48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 50
51 private IInventoryService m_inventoryService; 51 private IInventoryService m_inventoryService;
52 52
@@ -121,4 +121,4 @@ namespace OpenSim.Capabilities.Handlers
121 return llsdItem; 121 return llsdItem;
122 } 122 }
123 } 123 }
124} 124} \ No newline at end of file
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
index aa6203b..57b4667 100644
--- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
+++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
@@ -174,6 +174,7 @@ namespace OpenSim.Capabilities.Handlers
174 174
175 newTexture.Flags = AssetFlags.Collectable; 175 newTexture.Flags = AssetFlags.Collectable;
176 newTexture.Temporary = true; 176 newTexture.Temporary = true;
177 newTexture.Local = true;
177 m_assetService.Store(newTexture); 178 m_assetService.Store(newTexture);
178 WriteTextureData(request, response, newTexture, format); 179 WriteTextureData(request, response, newTexture, format);
179 return true; 180 return true;
diff --git a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureServerConnector.cs b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureServerConnector.cs
new file mode 100644
index 0000000..10ea8ee
--- /dev/null
+++ b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureServerConnector.cs
@@ -0,0 +1,76 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using Nini.Config;
30using OpenSim.Server.Base;
31using OpenSim.Services.Interfaces;
32using OpenSim.Framework.Servers.HttpServer;
33using OpenSim.Server.Handlers.Base;
34using OpenMetaverse;
35
36namespace OpenSim.Capabilities.Handlers
37{
38 public class UploadBakedTextureServerConnector : ServiceConnector
39 {
40 private IAssetService m_AssetService;
41 private string m_ConfigName = "CapsService";
42
43 public UploadBakedTextureServerConnector(IConfigSource config, IHttpServer server, string configName) :
44 base(config, server, configName)
45 {
46 if (configName != String.Empty)
47 m_ConfigName = configName;
48
49 IConfig serverConfig = config.Configs[m_ConfigName];
50 if (serverConfig == null)
51 throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName));
52
53 string assetService = serverConfig.GetString("AssetService", String.Empty);
54
55 if (assetService == String.Empty)
56 throw new Exception("No AssetService in config file");
57
58 Object[] args = new Object[] { config };
59 m_AssetService =
60 ServerUtils.LoadPlugin<IAssetService>(assetService, args);
61
62 if (m_AssetService == null)
63 throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName));
64
65 // NEED TO FIX THIS
66 OpenSim.Framework.Capabilities.Caps caps = new OpenSim.Framework.Capabilities.Caps(server, "", server.Port, "", UUID.Zero, "");
67 server.AddStreamHandler(new RestStreamHandler(
68 "POST",
69 "/CAPS/UploadBakedTexture/",
70 new UploadBakedTextureHandler(caps, m_AssetService, true).UploadBakedTexture,
71 "UploadBakedTexture",
72 "Upload Baked Texture Capability"));
73
74 }
75 }
76} \ No newline at end of file
diff --git a/OpenSim/Capabilities/LLSDAvatarPicker.cs b/OpenSim/Capabilities/LLSDAvatarPicker.cs
new file mode 100644
index 0000000..d0b3f3a
--- /dev/null
+++ b/OpenSim/Capabilities/LLSDAvatarPicker.cs
@@ -0,0 +1,51 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using OpenMetaverse;
29
30namespace OpenSim.Framework.Capabilities
31{
32 [OSDMap]
33 public class LLSDAvatarPicker
34 {
35 public string next_page_url;
36 // an array of LLSDPerson
37 public OSDArray agents = new OSDArray();
38 }
39
40 [OSDMap]
41 public class LLSDPerson
42 {
43 public string username;
44 public string display_name;
45 //'display_name_next_update':d"1970-01-01T00:00:00Z"
46 public string legacy_first_name;
47 public string legacy_last_name;
48 public UUID id;
49 public bool is_display_name_default;
50 }
51} \ No newline at end of file
diff --git a/OpenSim/Capabilities/LLSDStreamHandler.cs b/OpenSim/Capabilities/LLSDStreamHandler.cs
index 5df24b2..4fa1153 100644
--- a/OpenSim/Capabilities/LLSDStreamHandler.cs
+++ b/OpenSim/Capabilities/LLSDStreamHandler.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Framework.Capabilities
48 m_method = method; 48 m_method = method;
49 } 49 }
50 50
51 public override byte[] Handle(string path, Stream request, 51 protected override byte[] ProcessRequest(string path, Stream request,
52 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 52 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
53 { 53 {
54 //Encoding encoding = Util.UTF8; 54 //Encoding encoding = Util.UTF8;
diff --git a/OpenSim/Data/IGridUserData.cs b/OpenSim/Data/IGridUserData.cs
index e15a1f8..9afa477 100644
--- a/OpenSim/Data/IGridUserData.cs
+++ b/OpenSim/Data/IGridUserData.cs
@@ -50,6 +50,7 @@ namespace OpenSim.Data
50 public interface IGridUserData 50 public interface IGridUserData
51 { 51 {
52 GridUserData Get(string userID); 52 GridUserData Get(string userID);
53 GridUserData[] GetAll(string query);
53 bool Store(GridUserData data); 54 bool Store(GridUserData data);
54 } 55 }
55} \ No newline at end of file 56} \ No newline at end of file
diff --git a/OpenSim/Data/IHGTravelingData.cs b/OpenSim/Data/IHGTravelingData.cs
new file mode 100644
index 0000000..452af7b
--- /dev/null
+++ b/OpenSim/Data/IHGTravelingData.cs
@@ -0,0 +1,59 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using OpenMetaverse;
31using OpenSim.Framework;
32
33namespace OpenSim.Data
34{
35 // This MUST be a ref type!
36 public class HGTravelingData
37 {
38 public UUID SessionID;
39 public UUID UserID;
40 public Dictionary<string, string> Data;
41
42 public HGTravelingData()
43 {
44 Data = new Dictionary<string, string>();
45 }
46 }
47
48 /// <summary>
49 /// An interface for connecting to the user grid datastore
50 /// </summary>
51 public interface IHGTravelingData
52 {
53 HGTravelingData Get(UUID sessionID);
54 HGTravelingData[] GetSessions(UUID userID);
55 bool Store(HGTravelingData data);
56 bool Delete(UUID sessionID);
57 void DeleteOld();
58 }
59} \ No newline at end of file
diff --git a/OpenSim/Data/IProfilesData.cs b/OpenSim/Data/IProfilesData.cs
new file mode 100644
index 0000000..0de7f68
--- /dev/null
+++ b/OpenSim/Data/IProfilesData.cs
@@ -0,0 +1,56 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using OpenMetaverse;
30using OpenMetaverse.StructuredData;
31using OpenSim.Framework;
32
33namespace OpenSim.Data
34{
35
36 public interface IProfilesData
37 {
38 OSDArray GetClassifiedRecords(UUID creatorId);
39 bool UpdateClassifiedRecord(UserClassifiedAdd ad, ref string result);
40 bool DeleteClassifiedRecord(UUID recordId);
41 OSDArray GetAvatarPicks(UUID avatarId);
42 UserProfilePick GetPickInfo(UUID avatarId, UUID pickId);
43 bool UpdatePicksRecord(UserProfilePick pick);
44 bool DeletePicksRecord(UUID pickId);
45 bool GetAvatarNotes(ref UserProfileNotes note);
46 bool UpdateAvatarNotes(ref UserProfileNotes note, ref string result);
47 bool GetAvatarProperties(ref UserProfileProperties props, ref string result);
48 bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result);
49 bool UpdateAvatarInterests(UserProfileProperties up, ref string result);
50 bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result);
51 bool GetUserAppData(ref UserAppData props, ref string result);
52 bool SetUserAppData(UserAppData props, ref string result);
53 OSDArray GetUserImageAssets(UUID avatarId);
54 }
55}
56
diff --git a/OpenSim/Data/IRegionData.cs b/OpenSim/Data/IRegionData.cs
index 70e1065..463c621 100644
--- a/OpenSim/Data/IRegionData.cs
+++ b/OpenSim/Data/IRegionData.cs
@@ -81,6 +81,7 @@ namespace OpenSim.Data
81 bool Delete(UUID regionID); 81 bool Delete(UUID regionID);
82 82
83 List<RegionData> GetDefaultRegions(UUID scopeID); 83 List<RegionData> GetDefaultRegions(UUID scopeID);
84 List<RegionData> GetDefaultHypergridRegions(UUID scopeID);
84 List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y); 85 List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y);
85 List<RegionData> GetHyperlinks(UUID scopeID); 86 List<RegionData> GetHyperlinks(UUID scopeID);
86 } 87 }
diff --git a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs b/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
index 1870273..fd52122 100644
--- a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Data.MSSQL
50 { 50 {
51 } 51 }
52 52
53 public GridUserData Get(string userID) 53 public new GridUserData Get(string userID)
54 { 54 {
55 GridUserData[] ret = Get("UserID", userID); 55 GridUserData[] ret = Get("UserID", userID);
56 56
@@ -60,5 +60,10 @@ namespace OpenSim.Data.MSSQL
60 return ret[0]; 60 return ret[0];
61 } 61 }
62 62
63 public GridUserData[] GetAll(string userID)
64 {
65 return base.Get(String.Format("UserID LIKE '{0}%'", userID));
66 }
67
63 } 68 }
64} 69}
diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/MSSQL/MSSQLRegionData.cs
index 0d89706..c0589df 100644
--- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLRegionData.cs
@@ -315,6 +315,11 @@ namespace OpenSim.Data.MSSQL
315 return Get((int)RegionFlags.DefaultRegion, scopeID); 315 return Get((int)RegionFlags.DefaultRegion, scopeID);
316 } 316 }
317 317
318 public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
319 {
320 return Get((int)RegionFlags.DefaultHGRegion, scopeID);
321 }
322
318 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y) 323 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
319 { 324 {
320 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID); 325 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
index 00af3a0..bc5beeb 100644
--- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
@@ -2100,7 +2100,7 @@ VALUES
2100 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); 2100 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
2101 parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); 2101 parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));
2102 2102
2103 if (prim.DynAttrs.Count > 0) 2103 if (prim.DynAttrs.CountNamespaces > 0)
2104 parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml())); 2104 parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml()));
2105 else 2105 else
2106 parameters.Add(_Database.CreateParameter("DynAttrs", null)); 2106 parameters.Add(_Database.CreateParameter("DynAttrs", null));
diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
index b84c2a4..4549801 100644
--- a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
+++ b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
@@ -1153,7 +1153,7 @@ COMMIT
1153 1153
1154BEGIN TRANSACTION 1154BEGIN TRANSACTION
1155 1155
1156ALTER TABLE prims ADD COLUMN DynAttrs TEXT; 1156ALTER TABLE prims ADD DynAttrs TEXT;
1157 1157
1158COMMIT 1158COMMIT
1159 1159
@@ -1161,10 +1161,10 @@ COMMIT
1161 1161
1162BEGIN TRANSACTION 1162BEGIN TRANSACTION
1163 1163
1164ALTER TABLE prims ADD COLUMN `PhysicsShapeType` tinyint(4) NOT NULL default '0'; 1164ALTER TABLE prims ADD `PhysicsShapeType` tinyint(4) NOT NULL default '0';
1165ALTER TABLE prims ADD COLUMN `Density` double NOT NULL default '1000'; 1165ALTER TABLE prims ADD `Density` double NOT NULL default '1000';
1166ALTER TABLE prims ADD COLUMN `GravityModifier` double NOT NULL default '1'; 1166ALTER TABLE prims ADD `GravityModifier` double NOT NULL default '1';
1167ALTER TABLE prims ADD COLUMN `Friction` double NOT NULL default '0.6'; 1167ALTER TABLE prims ADD `Friction` double NOT NULL default '0.6';
1168ALTER TABLE prims ADD COLUMN `Restitution` double NOT NULL default '0.5'; 1168ALTER TABLE prims ADD `Restitution` double NOT NULL default '0.5';
1169 1169
1170COMMIT 1170COMMIT
diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs
index 21dd5aa..59cc22a 100644
--- a/OpenSim/Data/MySQL/MySQLAssetData.cs
+++ b/OpenSim/Data/MySQL/MySQLAssetData.cs
@@ -142,7 +142,8 @@ namespace OpenSim.Data.MySQL
142 } 142 }
143 catch (Exception e) 143 catch (Exception e)
144 { 144 {
145 m_log.Error("[ASSETS DB]: MySql failure fetching asset " + assetID + ": " + e.Message); 145 m_log.Error(
146 string.Format("[ASSETS DB]: MySql failure fetching asset {0}. Exception ", assetID), e);
146 } 147 }
147 } 148 }
148 } 149 }
@@ -243,10 +244,11 @@ namespace OpenSim.Data.MySQL
243 } 244 }
244 catch (Exception e) 245 catch (Exception e)
245 { 246 {
246 m_log.ErrorFormat( 247 m_log.Error(
247 "[ASSETS DB]: " + 248 string.Format(
248 "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString() 249 "[ASSETS DB]: Failure updating access_time for asset {0} with name {1}. Exception ",
249 + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name); 250 asset.FullID, asset.Name),
251 e);
250 } 252 }
251 } 253 }
252 } 254 }
@@ -286,8 +288,8 @@ namespace OpenSim.Data.MySQL
286 } 288 }
287 catch (Exception e) 289 catch (Exception e)
288 { 290 {
289 m_log.ErrorFormat( 291 m_log.Error(
290 "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString(), uuid); 292 string.Format("[ASSETS DB]: MySql failure fetching asset {0}. Exception ", uuid), e);
291 } 293 }
292 } 294 }
293 } 295 }
@@ -346,7 +348,11 @@ namespace OpenSim.Data.MySQL
346 } 348 }
347 catch (Exception e) 349 catch (Exception e)
348 { 350 {
349 m_log.Error("[ASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString()); 351 m_log.Error(
352 string.Format(
353 "[ASSETS DB]: MySql failure fetching asset set from {0}, count {1}. Exception ",
354 start, count),
355 e);
350 } 356 }
351 } 357 }
352 } 358 }
diff --git a/OpenSim/Data/MySQL/MySQLGridUserData.cs b/OpenSim/Data/MySQL/MySQLGridUserData.cs
index a9ce94d..00560c1 100644
--- a/OpenSim/Data/MySQL/MySQLGridUserData.cs
+++ b/OpenSim/Data/MySQL/MySQLGridUserData.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Data.MySQL
46 46
47 public MySQLGridUserData(string connectionString, string realm) : base(connectionString, realm, "GridUserStore") {} 47 public MySQLGridUserData(string connectionString, string realm) : base(connectionString, realm, "GridUserStore") {}
48 48
49 public GridUserData Get(string userID) 49 public new GridUserData Get(string userID)
50 { 50 {
51 GridUserData[] ret = Get("UserID", userID); 51 GridUserData[] ret = Get("UserID", userID);
52 52
@@ -56,6 +56,9 @@ namespace OpenSim.Data.MySQL
56 return ret[0]; 56 return ret[0];
57 } 57 }
58 58
59 59 public GridUserData[] GetAll(string userID)
60 {
61 return base.Get(String.Format("UserID LIKE '{0}%'", userID));
62 }
60 } 63 }
61} \ No newline at end of file 64} \ No newline at end of file
diff --git a/OpenSim/Data/MySQL/MySQLGroupsData.cs b/OpenSim/Data/MySQL/MySQLGroupsData.cs
index 2a1bd6c..0318284 100644
--- a/OpenSim/Data/MySQL/MySQLGroupsData.cs
+++ b/OpenSim/Data/MySQL/MySQLGroupsData.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Data.MySQL
88 if (string.IsNullOrEmpty(pattern)) 88 if (string.IsNullOrEmpty(pattern))
89 pattern = "1 ORDER BY Name LIMIT 100"; 89 pattern = "1 ORDER BY Name LIMIT 100";
90 else 90 else
91 pattern = string.Format("Name LIKE %{0}% ORDER BY Name LIMIT 100", pattern); 91 pattern = string.Format("Name LIKE '%{0}%' ORDER BY Name LIMIT 100", pattern);
92 92
93 return m_Groups.Get(pattern); 93 return m_Groups.Get(pattern);
94 } 94 }
diff --git a/OpenSim/Data/MySQL/MySQLHGTravelData.cs b/OpenSim/Data/MySQL/MySQLHGTravelData.cs
new file mode 100644
index 0000000..e81b880
--- /dev/null
+++ b/OpenSim/Data/MySQL/MySQLHGTravelData.cs
@@ -0,0 +1,80 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using MySql.Data.MySqlClient;
37
38namespace OpenSim.Data.MySQL
39{
40 /// <summary>
41 /// A MySQL Interface for user grid data
42 /// </summary>
43 public class MySQLHGTravelData : MySQLGenericTableHandler<HGTravelingData>, IHGTravelingData
44 {
45// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46
47 public MySQLHGTravelData(string connectionString, string realm) : base(connectionString, realm, "HGTravelStore") { }
48
49 public HGTravelingData Get(UUID sessionID)
50 {
51 HGTravelingData[] ret = Get("SessionID", sessionID.ToString());
52
53 if (ret.Length == 0)
54 return null;
55
56 return ret[0];
57 }
58
59 public HGTravelingData[] GetSessions(UUID userID)
60 {
61 return base.Get("UserID", userID.ToString());
62 }
63
64 public bool Delete(UUID sessionID)
65 {
66 return Delete("SessionID", sessionID.ToString());
67 }
68
69 public void DeleteOld()
70 {
71 using (MySqlCommand cmd = new MySqlCommand())
72 {
73 cmd.CommandText = String.Format("delete from {0} where TMStamp < NOW() - INTERVAL 2 DAY", m_Realm);
74
75 ExecuteNonQuery(cmd);
76 }
77
78 }
79 }
80} \ No newline at end of file
diff --git a/OpenSim/Data/MySQL/MySQLOfflineIMData.cs b/OpenSim/Data/MySQL/MySQLOfflineIMData.cs
index 252f358..bafd204 100644
--- a/OpenSim/Data/MySQL/MySQLOfflineIMData.cs
+++ b/OpenSim/Data/MySQL/MySQLOfflineIMData.cs
@@ -47,13 +47,10 @@ namespace OpenSim.Data.MySQL
47 47
48 public void DeleteOld() 48 public void DeleteOld()
49 { 49 {
50 uint now = (uint)Util.UnixTimeSinceEpoch();
51
52 using (MySqlCommand cmd = new MySqlCommand()) 50 using (MySqlCommand cmd = new MySqlCommand())
53 { 51 {
54 cmd.CommandText = String.Format("delete from {0} where TMStamp < ?tstamp", m_Realm); 52 cmd.CommandText = String.Format("delete from {0} where TMStamp < NOW() - INTERVAL 2 WEEK", m_Realm);
55 cmd.Parameters.AddWithValue("?tstamp", now - 14 * 24 * 60 * 60); // > 2 weeks old 53
56
57 ExecuteNonQuery(cmd); 54 ExecuteNonQuery(cmd);
58 } 55 }
59 56
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index a2d4ae4..2ad7590 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -310,6 +310,11 @@ namespace OpenSim.Data.MySQL
310 return Get((int)RegionFlags.DefaultRegion, scopeID); 310 return Get((int)RegionFlags.DefaultRegion, scopeID);
311 } 311 }
312 312
313 public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
314 {
315 return Get((int)RegionFlags.DefaultHGRegion, scopeID);
316 }
317
313 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y) 318 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
314 { 319 {
315 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID); 320 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs
index 537ec85..feacbb2 100644
--- a/OpenSim/Data/MySQL/MySQLSimulationData.cs
+++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs
@@ -1730,7 +1730,7 @@ namespace OpenSim.Data.MySQL
1730 else 1730 else
1731 cmd.Parameters.AddWithValue("Vehicle", String.Empty); 1731 cmd.Parameters.AddWithValue("Vehicle", String.Empty);
1732 1732
1733 if (prim.DynAttrs.Count > 0) 1733 if (prim.DynAttrs.CountNamespaces > 0)
1734 cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml()); 1734 cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml());
1735 else 1735 else
1736 cmd.Parameters.AddWithValue("DynAttrs", null); 1736 cmd.Parameters.AddWithValue("DynAttrs", null);
diff --git a/OpenSim/Data/MySQL/MySQLUserProfilesData.cs b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs
new file mode 100644
index 0000000..4c6c8e3
--- /dev/null
+++ b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs
@@ -0,0 +1,1096 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Data;
30using System.Reflection;
31using OpenSim.Data;
32using OpenSim.Framework;
33using MySql.Data.MySqlClient;
34using OpenMetaverse;
35using OpenMetaverse.StructuredData;
36using log4net;
37
38namespace OpenSim.Data.MySQL
39{
40 public class UserProfilesData: IProfilesData
41 {
42 static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 #region Properites
45 string ConnectionString
46 {
47 get; set;
48 }
49
50 protected object Lock
51 {
52 get; set;
53 }
54
55 protected virtual Assembly Assembly
56 {
57 get { return GetType().Assembly; }
58 }
59
60 #endregion Properties
61
62 #region class Member Functions
63 public UserProfilesData(string connectionString)
64 {
65 ConnectionString = connectionString;
66 Init();
67 }
68
69 void Init()
70 {
71 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
72 {
73 dbcon.Open();
74
75 Migration m = new Migration(dbcon, Assembly, "UserProfiles");
76 m.Update();
77 }
78 }
79 #endregion Member Functions
80
81 #region Classifieds Queries
82 /// <summary>
83 /// Gets the classified records.
84 /// </summary>
85 /// <returns>
86 /// Array of classified records
87 /// </returns>
88 /// <param name='creatorId'>
89 /// Creator identifier.
90 /// </param>
91 public OSDArray GetClassifiedRecords(UUID creatorId)
92 {
93 OSDArray data = new OSDArray();
94
95 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
96 {
97 string query = "SELECT classifieduuid, name FROM classifieds WHERE creatoruuid = ?Id";
98 dbcon.Open();
99 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
100 {
101 cmd.Parameters.AddWithValue("?Id", creatorId);
102 using( MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default))
103 {
104 if(reader.HasRows)
105 {
106 while (reader.Read())
107 {
108 OSDMap n = new OSDMap();
109 UUID Id = UUID.Zero;
110
111 string Name = null;
112 try
113 {
114 UUID.TryParse(Convert.ToString( reader["classifieduuid"]), out Id);
115 Name = Convert.ToString(reader["name"]);
116 }
117 catch (Exception e)
118 {
119 m_log.DebugFormat("[PROFILES_DATA]" +
120 ": UserAccount exception {0}", e.Message);
121 }
122 n.Add("classifieduuid", OSD.FromUUID(Id));
123 n.Add("name", OSD.FromString(Name));
124 data.Add(n);
125 }
126 }
127 }
128 }
129 }
130 return data;
131 }
132
133 public bool UpdateClassifiedRecord(UserClassifiedAdd ad, ref string result)
134 {
135 string query = string.Empty;
136
137
138 query += "INSERT INTO classifieds (";
139 query += "`classifieduuid`,";
140 query += "`creatoruuid`,";
141 query += "`creationdate`,";
142 query += "`expirationdate`,";
143 query += "`category`,";
144 query += "`name`,";
145 query += "`description`,";
146 query += "`parceluuid`,";
147 query += "`parentestate`,";
148 query += "`snapshotuuid`,";
149 query += "`simname`,";
150 query += "`posglobal`,";
151 query += "`parcelname`,";
152 query += "`classifiedflags`,";
153 query += "`priceforlisting`) ";
154 query += "VALUES (";
155 query += "?ClassifiedId,";
156 query += "?CreatorId,";
157 query += "?CreatedDate,";
158 query += "?ExpirationDate,";
159 query += "?Category,";
160 query += "?Name,";
161 query += "?Description,";
162 query += "?ParcelId,";
163 query += "?ParentEstate,";
164 query += "?SnapshotId,";
165 query += "?SimName,";
166 query += "?GlobalPos,";
167 query += "?ParcelName,";
168 query += "?Flags,";
169 query += "?ListingPrice ) ";
170 query += "ON DUPLICATE KEY UPDATE ";
171 query += "category=?Category, ";
172 query += "expirationdate=?ExpirationDate, ";
173 query += "name=?Name, ";
174 query += "description=?Description, ";
175 query += "parentestate=?ParentEstate, ";
176 query += "posglobal=?GlobalPos, ";
177 query += "parcelname=?ParcelName, ";
178 query += "classifiedflags=?Flags, ";
179 query += "priceforlisting=?ListingPrice, ";
180 query += "snapshotuuid=?SnapshotId";
181
182 if(string.IsNullOrEmpty(ad.ParcelName))
183 ad.ParcelName = "Unknown";
184 if(ad.ParcelId == null)
185 ad.ParcelId = UUID.Zero;
186 if(string.IsNullOrEmpty(ad.Description))
187 ad.Description = "No Description";
188
189 DateTime epoch = new DateTime(1970, 1, 1);
190 DateTime now = DateTime.Now;
191 TimeSpan epochnow = now - epoch;
192 TimeSpan duration;
193 DateTime expiration;
194 TimeSpan epochexp;
195
196 if(ad.Flags == 2)
197 {
198 duration = new TimeSpan(7,0,0,0);
199 expiration = now.Add(duration);
200 epochexp = expiration - epoch;
201 }
202 else
203 {
204 duration = new TimeSpan(365,0,0,0);
205 expiration = now.Add(duration);
206 epochexp = expiration - epoch;
207 }
208 ad.CreationDate = (int)epochnow.TotalSeconds;
209 ad.ExpirationDate = (int)epochexp.TotalSeconds;
210
211 try
212 {
213 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
214 {
215 dbcon.Open();
216 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
217 {
218 cmd.Parameters.AddWithValue("?ClassifiedId", ad.ClassifiedId.ToString());
219 cmd.Parameters.AddWithValue("?CreatorId", ad.CreatorId.ToString());
220 cmd.Parameters.AddWithValue("?CreatedDate", ad.CreationDate.ToString());
221 cmd.Parameters.AddWithValue("?ExpirationDate", ad.ExpirationDate.ToString());
222 cmd.Parameters.AddWithValue("?Category", ad.Category.ToString());
223 cmd.Parameters.AddWithValue("?Name", ad.Name.ToString());
224 cmd.Parameters.AddWithValue("?Description", ad.Description.ToString());
225 cmd.Parameters.AddWithValue("?ParcelId", ad.ParcelId.ToString());
226 cmd.Parameters.AddWithValue("?ParentEstate", ad.ParentEstate.ToString());
227 cmd.Parameters.AddWithValue("?SnapshotId", ad.SnapshotId.ToString ());
228 cmd.Parameters.AddWithValue("?SimName", ad.SimName.ToString());
229 cmd.Parameters.AddWithValue("?GlobalPos", ad.GlobalPos.ToString());
230 cmd.Parameters.AddWithValue("?ParcelName", ad.ParcelName.ToString());
231 cmd.Parameters.AddWithValue("?Flags", ad.Flags.ToString());
232 cmd.Parameters.AddWithValue("?ListingPrice", ad.Price.ToString ());
233
234 cmd.ExecuteNonQuery();
235 }
236 }
237 }
238 catch (Exception e)
239 {
240 m_log.DebugFormat("[PROFILES_DATA]" +
241 ": ClassifiedesUpdate exception {0}", e.Message);
242 result = e.Message;
243 return false;
244 }
245 return true;
246 }
247
248 public bool DeleteClassifiedRecord(UUID recordId)
249 {
250 string query = string.Empty;
251
252 query += "DELETE FROM classifieds WHERE ";
253 query += "classifieduuid = ?ClasifiedId";
254
255 try
256 {
257 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
258 {
259 dbcon.Open();
260
261 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
262 {
263 cmd.Parameters.AddWithValue("?ClassifiedId", recordId.ToString());
264
265 lock(Lock)
266 {
267 cmd.ExecuteNonQuery();
268 }
269 }
270 }
271 }
272 catch (Exception e)
273 {
274 m_log.DebugFormat("[PROFILES_DATA]" +
275 ": DeleteClassifiedRecord exception {0}", e.Message);
276 return false;
277 }
278 return true;
279 }
280
281 public bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result)
282 {
283 string query = string.Empty;
284
285 query += "SELECT * FROM classifieds WHERE ";
286 query += "classifieduuid = ?AdId";
287
288 try
289 {
290 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
291 {
292 dbcon.Open();
293 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
294 {
295 cmd.Parameters.AddWithValue("?AdId", ad.ClassifiedId.ToString());
296
297 using (MySqlDataReader reader = cmd.ExecuteReader())
298 {
299 if(reader.Read ())
300 {
301 ad.CreatorId = new UUID(reader.GetGuid("creatoruuid"));
302 ad.ParcelId = new UUID(reader.GetGuid("parceluuid"));
303 ad.SnapshotId = new UUID(reader.GetGuid("snapshotuuid"));
304 ad.CreationDate = Convert.ToInt32(reader["creationdate"]);
305 ad.ExpirationDate = Convert.ToInt32(reader["expirationdate"]);
306 ad.ParentEstate = Convert.ToInt32(reader["parentestate"]);
307 ad.Flags = (byte)reader.GetUInt32("classifiedflags");
308 ad.Category = reader.GetInt32("category");
309 ad.Price = reader.GetInt16("priceforlisting");
310 ad.Name = reader.GetString("name");
311 ad.Description = reader.GetString("description");
312 ad.SimName = reader.GetString("simname");
313 ad.GlobalPos = reader.GetString("posglobal");
314 ad.ParcelName = reader.GetString("parcelname");
315
316 }
317 }
318 }
319 dbcon.Close();
320 }
321 }
322 catch (Exception e)
323 {
324 m_log.DebugFormat("[PROFILES_DATA]" +
325 ": GetPickInfo exception {0}", e.Message);
326 }
327 return true;
328 }
329 #endregion Classifieds Queries
330
331 #region Picks Queries
332 public OSDArray GetAvatarPicks(UUID avatarId)
333 {
334 string query = string.Empty;
335
336 query += "SELECT `pickuuid`,`name` FROM userpicks WHERE ";
337 query += "creatoruuid = ?Id";
338 OSDArray data = new OSDArray();
339
340 try
341 {
342 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
343 {
344 dbcon.Open();
345 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
346 {
347 cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
348
349 using (MySqlDataReader reader = cmd.ExecuteReader())
350 {
351 if(reader.HasRows)
352 {
353 while (reader.Read())
354 {
355 OSDMap record = new OSDMap();
356
357 record.Add("pickuuid",OSD.FromString((string)reader["pickuuid"]));
358 record.Add("name",OSD.FromString((string)reader["name"]));
359 data.Add(record);
360 }
361 }
362 }
363 }
364 }
365 }
366 catch (Exception e)
367 {
368 m_log.DebugFormat("[PROFILES_DATA]" +
369 ": GetAvatarPicks exception {0}", e.Message);
370 }
371 return data;
372 }
373
374 public UserProfilePick GetPickInfo(UUID avatarId, UUID pickId)
375 {
376 string query = string.Empty;
377 UserProfilePick pick = new UserProfilePick();
378
379 query += "SELECT * FROM userpicks WHERE ";
380 query += "creatoruuid = ?CreatorId AND ";
381 query += "pickuuid = ?PickId";
382
383 try
384 {
385 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
386 {
387 dbcon.Open();
388 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
389 {
390 cmd.Parameters.AddWithValue("?CreatorId", avatarId.ToString());
391 cmd.Parameters.AddWithValue("?PickId", pickId.ToString());
392
393 using (MySqlDataReader reader = cmd.ExecuteReader())
394 {
395 if(reader.HasRows)
396 {
397 reader.Read();
398
399 string description = (string)reader["description"];
400
401 if (string.IsNullOrEmpty(description))
402 description = "No description given.";
403
404 UUID.TryParse((string)reader["pickuuid"], out pick.PickId);
405 UUID.TryParse((string)reader["creatoruuid"], out pick.CreatorId);
406 UUID.TryParse((string)reader["parceluuid"], out pick.ParcelId);
407 UUID.TryParse((string)reader["snapshotuuid"], out pick.SnapshotId);
408 pick.GlobalPos = (string)reader["posglobal"];
409 bool.TryParse((string)reader["toppick"], out pick.TopPick);
410 bool.TryParse((string)reader["enabled"], out pick.Enabled);
411 pick.Name = (string)reader["name"];
412 pick.Desc = description;
413 pick.User = (string)reader["user"];
414 pick.OriginalName = (string)reader["originalname"];
415 pick.SimName = (string)reader["simname"];
416 pick.SortOrder = (int)reader["sortorder"];
417 }
418 }
419 }
420 dbcon.Close();
421 }
422 }
423 catch (Exception e)
424 {
425 m_log.DebugFormat("[PROFILES_DATA]" +
426 ": GetPickInfo exception {0}", e.Message);
427 }
428 return pick;
429 }
430
431 public bool UpdatePicksRecord(UserProfilePick pick)
432 {
433 string query = string.Empty;
434
435 query += "INSERT INTO userpicks VALUES (";
436 query += "?PickId,";
437 query += "?CreatorId,";
438 query += "?TopPick,";
439 query += "?ParcelId,";
440 query += "?Name,";
441 query += "?Desc,";
442 query += "?SnapshotId,";
443 query += "?User,";
444 query += "?Original,";
445 query += "?SimName,";
446 query += "?GlobalPos,";
447 query += "?SortOrder,";
448 query += "?Enabled) ";
449 query += "ON DUPLICATE KEY UPDATE ";
450 query += "parceluuid=?ParcelId,";
451 query += "name=?Name,";
452 query += "description=?Desc,";
453 query += "snapshotuuid=?SnapshotId,";
454 query += "pickuuid=?PickId,";
455 query += "posglobal=?GlobalPos";
456
457 try
458 {
459 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
460 {
461 dbcon.Open();
462 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
463 {
464 cmd.Parameters.AddWithValue("?PickId", pick.PickId.ToString());
465 cmd.Parameters.AddWithValue("?CreatorId", pick.CreatorId.ToString());
466 cmd.Parameters.AddWithValue("?TopPick", pick.TopPick.ToString());
467 cmd.Parameters.AddWithValue("?ParcelId", pick.ParcelId.ToString());
468 cmd.Parameters.AddWithValue("?Name", pick.Name.ToString());
469 cmd.Parameters.AddWithValue("?Desc", pick.Desc.ToString());
470 cmd.Parameters.AddWithValue("?SnapshotId", pick.SnapshotId.ToString());
471 cmd.Parameters.AddWithValue("?User", pick.User.ToString());
472 cmd.Parameters.AddWithValue("?Original", pick.OriginalName.ToString());
473 cmd.Parameters.AddWithValue("?SimName",pick.SimName.ToString());
474 cmd.Parameters.AddWithValue("?GlobalPos", pick.GlobalPos);
475 cmd.Parameters.AddWithValue("?SortOrder", pick.SortOrder.ToString ());
476 cmd.Parameters.AddWithValue("?Enabled", pick.Enabled.ToString());
477
478 cmd.ExecuteNonQuery();
479 }
480 }
481 }
482 catch (Exception e)
483 {
484 m_log.DebugFormat("[PROFILES_DATA]" +
485 ": UpdateAvatarNotes exception {0}", e.Message);
486 return false;
487 }
488 return true;
489 }
490
491 public bool DeletePicksRecord(UUID pickId)
492 {
493 string query = string.Empty;
494
495 query += "DELETE FROM userpicks WHERE ";
496 query += "pickuuid = ?PickId";
497
498 try
499 {
500 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
501 {
502 dbcon.Open();
503
504 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
505 {
506 cmd.Parameters.AddWithValue("?PickId", pickId.ToString());
507
508 cmd.ExecuteNonQuery();
509 }
510 }
511 }
512 catch (Exception e)
513 {
514 m_log.DebugFormat("[PROFILES_DATA]" +
515 ": DeleteUserPickRecord exception {0}", e.Message);
516 return false;
517 }
518 return true;
519 }
520 #endregion Picks Queries
521
522 #region Avatar Notes Queries
523 public bool GetAvatarNotes(ref UserProfileNotes notes)
524 { // WIP
525 string query = string.Empty;
526
527 query += "SELECT `notes` FROM usernotes WHERE ";
528 query += "useruuid = ?Id AND ";
529 query += "targetuuid = ?TargetId";
530 OSDArray data = new OSDArray();
531
532 try
533 {
534 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
535 {
536 dbcon.Open();
537 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
538 {
539 cmd.Parameters.AddWithValue("?Id", notes.UserId.ToString());
540 cmd.Parameters.AddWithValue("?TargetId", notes.TargetId.ToString());
541
542 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
543 {
544 if(reader.HasRows)
545 {
546 reader.Read();
547 notes.Notes = OSD.FromString((string)reader["notes"]);
548 }
549 }
550 }
551 }
552 }
553 catch (Exception e)
554 {
555 m_log.DebugFormat("[PROFILES_DATA]" +
556 ": GetAvatarNotes exception {0}", e.Message);
557 }
558 return true;
559 }
560
561 public bool UpdateAvatarNotes(ref UserProfileNotes note, ref string result)
562 {
563 string query = string.Empty;
564 bool remove;
565
566 if(string.IsNullOrEmpty(note.Notes))
567 {
568 remove = true;
569 query += "DELETE FROM usernotes WHERE ";
570 query += "useruuid=?UserId AND ";
571 query += "targetuuid=?TargetId";
572 }
573 else
574 {
575 remove = false;
576 query += "INSERT INTO usernotes VALUES ( ";
577 query += "?UserId,";
578 query += "?TargetId,";
579 query += "?Notes )";
580 query += "ON DUPLICATE KEY ";
581 query += "UPDATE ";
582 query += "notes=?Notes";
583 }
584
585 try
586 {
587 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
588 {
589 dbcon.Open();
590 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
591 {
592 if(!remove)
593 cmd.Parameters.AddWithValue("?Notes", note.Notes);
594 cmd.Parameters.AddWithValue("?TargetId", note.TargetId.ToString ());
595 cmd.Parameters.AddWithValue("?UserId", note.UserId.ToString());
596
597 cmd.ExecuteNonQuery();
598 }
599 }
600 }
601 catch (Exception e)
602 {
603 m_log.DebugFormat("[PROFILES_DATA]" +
604 ": UpdateAvatarNotes exception {0}", e.Message);
605 return false;
606 }
607 return true;
608
609 }
610 #endregion Avatar Notes Queries
611
612 #region Avatar Properties
613 public bool GetAvatarProperties(ref UserProfileProperties props, ref string result)
614 {
615 string query = string.Empty;
616
617 query += "SELECT * FROM userprofile WHERE ";
618 query += "useruuid = ?Id";
619
620 try
621 {
622 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
623 {
624 dbcon.Open();
625 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
626 {
627 cmd.Parameters.AddWithValue("?Id", props.UserId.ToString());
628
629 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
630 {
631 if(reader.HasRows)
632 {
633 m_log.DebugFormat("[PROFILES_DATA]" +
634 ": Getting data for {0}.", props.UserId);
635 reader.Read();
636 props.WebUrl = (string)reader["profileURL"];
637 UUID.TryParse((string)reader["profileImage"], out props.ImageId);
638 props.AboutText = (string)reader["profileAboutText"];
639 UUID.TryParse((string)reader["profileFirstImage"], out props.FirstLifeImageId);
640 props.FirstLifeText = (string)reader["profileFirstText"];
641 UUID.TryParse((string)reader["profilePartner"], out props.PartnerId);
642 props.WantToMask = (int)reader["profileWantToMask"];
643 props.WantToText = (string)reader["profileWantToText"];
644 props.SkillsMask = (int)reader["profileSkillsMask"];
645 props.SkillsText = (string)reader["profileSkillsText"];
646 props.Language = (string)reader["profileLanguages"];
647 }
648 else
649 {
650 m_log.DebugFormat("[PROFILES_DATA]" +
651 ": No data for {0}", props.UserId);
652
653 props.WebUrl = string.Empty;
654 props.ImageId = UUID.Zero;
655 props.AboutText = string.Empty;
656 props.FirstLifeImageId = UUID.Zero;
657 props.FirstLifeText = string.Empty;
658 props.PartnerId = UUID.Zero;
659 props.WantToMask = 0;
660 props.WantToText = string.Empty;
661 props.SkillsMask = 0;
662 props.SkillsText = string.Empty;
663 props.Language = string.Empty;
664 props.PublishProfile = false;
665 props.PublishMature = false;
666
667 query = "INSERT INTO userprofile (";
668 query += "useruuid, ";
669 query += "profilePartner, ";
670 query += "profileAllowPublish, ";
671 query += "profileMaturePublish, ";
672 query += "profileURL, ";
673 query += "profileWantToMask, ";
674 query += "profileWantToText, ";
675 query += "profileSkillsMask, ";
676 query += "profileSkillsText, ";
677 query += "profileLanguages, ";
678 query += "profileImage, ";
679 query += "profileAboutText, ";
680 query += "profileFirstImage, ";
681 query += "profileFirstText) VALUES (";
682 query += "?userId, ";
683 query += "?profilePartner, ";
684 query += "?profileAllowPublish, ";
685 query += "?profileMaturePublish, ";
686 query += "?profileURL, ";
687 query += "?profileWantToMask, ";
688 query += "?profileWantToText, ";
689 query += "?profileSkillsMask, ";
690 query += "?profileSkillsText, ";
691 query += "?profileLanguages, ";
692 query += "?profileImage, ";
693 query += "?profileAboutText, ";
694 query += "?profileFirstImage, ";
695 query += "?profileFirstText)";
696
697 dbcon.Close();
698 dbcon.Open();
699
700 using (MySqlCommand put = new MySqlCommand(query, dbcon))
701 {
702 put.Parameters.AddWithValue("?userId", props.UserId.ToString());
703 put.Parameters.AddWithValue("?profilePartner", props.PartnerId.ToString());
704 put.Parameters.AddWithValue("?profileAllowPublish", props.PublishProfile);
705 put.Parameters.AddWithValue("?profileMaturePublish", props.PublishMature);
706 put.Parameters.AddWithValue("?profileURL", props.WebUrl);
707 put.Parameters.AddWithValue("?profileWantToMask", props.WantToMask);
708 put.Parameters.AddWithValue("?profileWantToText", props.WantToText);
709 put.Parameters.AddWithValue("?profileSkillsMask", props.SkillsMask);
710 put.Parameters.AddWithValue("?profileSkillsText", props.SkillsText);
711 put.Parameters.AddWithValue("?profileLanguages", props.Language);
712 put.Parameters.AddWithValue("?profileImage", props.ImageId.ToString());
713 put.Parameters.AddWithValue("?profileAboutText", props.AboutText);
714 put.Parameters.AddWithValue("?profileFirstImage", props.FirstLifeImageId.ToString());
715 put.Parameters.AddWithValue("?profileFirstText", props.FirstLifeText);
716
717 put.ExecuteNonQuery();
718 }
719 }
720 }
721 }
722 }
723 }
724 catch (Exception e)
725 {
726 m_log.DebugFormat("[PROFILES_DATA]" +
727 ": Requst properties exception {0}", e.Message);
728 result = e.Message;
729 return false;
730 }
731 return true;
732 }
733
734 public bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result)
735 {
736 string query = string.Empty;
737
738 query += "UPDATE userprofile SET ";
739 query += "profilePartner=?profilePartner, ";
740 query += "profileURL=?profileURL, ";
741 query += "profileImage=?image, ";
742 query += "profileAboutText=?abouttext,";
743 query += "profileFirstImage=?firstlifeimage,";
744 query += "profileFirstText=?firstlifetext ";
745 query += "WHERE useruuid=?uuid";
746
747 try
748 {
749 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
750 {
751 dbcon.Open();
752 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
753 {
754 cmd.Parameters.AddWithValue("?profileURL", props.WebUrl);
755 cmd.Parameters.AddWithValue("?profilePartner", props.PartnerId.ToString());
756 cmd.Parameters.AddWithValue("?image", props.ImageId.ToString());
757 cmd.Parameters.AddWithValue("?abouttext", props.AboutText);
758 cmd.Parameters.AddWithValue("?firstlifeimage", props.FirstLifeImageId.ToString());
759 cmd.Parameters.AddWithValue("?firstlifetext", props.FirstLifeText);
760 cmd.Parameters.AddWithValue("?uuid", props.UserId.ToString());
761
762 cmd.ExecuteNonQuery();
763 }
764 }
765 }
766 catch (Exception e)
767 {
768 m_log.DebugFormat("[PROFILES_DATA]" +
769 ": AgentPropertiesUpdate exception {0}", e.Message);
770
771 return false;
772 }
773 return true;
774 }
775 #endregion Avatar Properties
776
777 #region Avatar Interests
778 public bool UpdateAvatarInterests(UserProfileProperties up, ref string result)
779 {
780 string query = string.Empty;
781
782 query += "UPDATE userprofile SET ";
783 query += "profileWantToMask=?WantMask, ";
784 query += "profileWantToText=?WantText,";
785 query += "profileSkillsMask=?SkillsMask,";
786 query += "profileSkillsText=?SkillsText, ";
787 query += "profileLanguages=?Languages ";
788 query += "WHERE useruuid=?uuid";
789
790 try
791 {
792 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
793 {
794 dbcon.Open();
795 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
796 {
797 cmd.Parameters.AddWithValue("?WantMask", up.WantToMask);
798 cmd.Parameters.AddWithValue("?WantText", up.WantToText);
799 cmd.Parameters.AddWithValue("?SkillsMask", up.SkillsMask);
800 cmd.Parameters.AddWithValue("?SkillsText", up.SkillsText);
801 cmd.Parameters.AddWithValue("?Languages", up.Language);
802 cmd.Parameters.AddWithValue("?uuid", up.UserId.ToString());
803
804 cmd.ExecuteNonQuery();
805 }
806 }
807 }
808 catch (Exception e)
809 {
810 m_log.DebugFormat("[PROFILES_DATA]" +
811 ": AgentInterestsUpdate exception {0}", e.Message);
812 result = e.Message;
813 return false;
814 }
815 return true;
816 }
817 #endregion Avatar Interests
818
819 public OSDArray GetUserImageAssets(UUID avatarId)
820 {
821 OSDArray data = new OSDArray();
822 string query = "SELECT `snapshotuuid` FROM {0} WHERE `creatoruuid` = ?Id";
823
824 // Get classified image assets
825
826
827 try
828 {
829 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
830 {
831 dbcon.Open();
832
833 using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`classifieds`"), dbcon))
834 {
835 cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
836
837 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
838 {
839 if(reader.HasRows)
840 {
841 while (reader.Read())
842 {
843 data.Add(new OSDString((string)reader["snapshotuuid"].ToString ()));
844 }
845 }
846 }
847 }
848
849 dbcon.Close();
850 dbcon.Open();
851
852 using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`userpicks`"), dbcon))
853 {
854 cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
855
856 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
857 {
858 if(reader.HasRows)
859 {
860 while (reader.Read())
861 {
862 data.Add(new OSDString((string)reader["snapshotuuid"].ToString ()));
863 }
864 }
865 }
866 }
867
868 dbcon.Close();
869 dbcon.Open();
870
871 query = "SELECT `profileImage`, `profileFirstImage` FROM `userprofile` WHERE `useruuid` = ?Id";
872
873 using (MySqlCommand cmd = new MySqlCommand(string.Format (query,"`userpicks`"), dbcon))
874 {
875 cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
876
877 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
878 {
879 if(reader.HasRows)
880 {
881 while (reader.Read())
882 {
883 data.Add(new OSDString((string)reader["profileImage"].ToString ()));
884 data.Add(new OSDString((string)reader["profileFirstImage"].ToString ()));
885 }
886 }
887 }
888 }
889 }
890 }
891 catch (Exception e)
892 {
893 m_log.DebugFormat("[PROFILES_DATA]" +
894 ": GetAvatarNotes exception {0}", e.Message);
895 }
896 return data;
897 }
898
899 #region User Preferences
900 public OSDArray GetUserPreferences(UUID avatarId)
901 {
902 string query = string.Empty;
903
904 query += "SELECT imviaemail,visible,email FROM ";
905 query += "usersettings WHERE ";
906 query += "useruuid = ?Id";
907
908 OSDArray data = new OSDArray();
909
910 try
911 {
912 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
913 {
914 dbcon.Open();
915 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
916 {
917 cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
918
919 using (MySqlDataReader reader = cmd.ExecuteReader())
920 {
921 if(reader.HasRows)
922 {
923 reader.Read();
924 OSDMap record = new OSDMap();
925
926 record.Add("imviaemail",OSD.FromString((string)reader["imviaemail"]));
927 record.Add("visible",OSD.FromString((string)reader["visible"]));
928 record.Add("email",OSD.FromString((string)reader["email"]));
929 data.Add(record);
930 }
931 else
932 {
933 using (MySqlCommand put = new MySqlCommand(query, dbcon))
934 {
935 query = "INSERT INTO usersettings VALUES ";
936 query += "(?Id,'false','false', '')";
937
938 lock(Lock)
939 {
940 put.ExecuteNonQuery();
941 }
942 }
943 }
944 }
945 }
946 }
947 }
948 catch (Exception e)
949 {
950 m_log.DebugFormat("[PROFILES_DATA]" +
951 ": Get preferences exception {0}", e.Message);
952 }
953 return data;
954 }
955
956 public bool UpdateUserPreferences(bool emailIm, bool visible, UUID avatarId )
957 {
958 string query = string.Empty;
959
960 query += "UPDATE userpsettings SET ";
961 query += "imviaemail=?ImViaEmail, ";
962 query += "visible=?Visible,";
963 query += "WHERE useruuid=?uuid";
964
965 try
966 {
967 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
968 {
969 dbcon.Open();
970 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
971 {
972 cmd.Parameters.AddWithValue("?ImViaEmail", emailIm.ToString().ToLower ());
973 cmd.Parameters.AddWithValue("?WantText", visible.ToString().ToLower ());
974 cmd.Parameters.AddWithValue("?uuid", avatarId.ToString());
975
976 lock(Lock)
977 {
978 cmd.ExecuteNonQuery();
979 }
980 }
981 }
982 }
983 catch (Exception e)
984 {
985 m_log.DebugFormat("[PROFILES_DATA]" +
986 ": AgentInterestsUpdate exception {0}", e.Message);
987 return false;
988 }
989 return true;
990 }
991 #endregion User Preferences
992
993 #region Integration
994 public bool GetUserAppData(ref UserAppData props, ref string result)
995 {
996 string query = string.Empty;
997
998 query += "SELECT * FROM `userdata` WHERE ";
999 query += "UserId = ?Id AND ";
1000 query += "TagId = ?TagId";
1001
1002 try
1003 {
1004 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
1005 {
1006 dbcon.Open();
1007 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
1008 {
1009 cmd.Parameters.AddWithValue("?Id", props.UserId.ToString());
1010 cmd.Parameters.AddWithValue ("?TagId", props.TagId.ToString());
1011
1012 using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
1013 {
1014 if(reader.HasRows)
1015 {
1016 reader.Read();
1017 props.DataKey = (string)reader["DataKey"];
1018 props.DataVal = (string)reader["DataVal"];
1019 }
1020 else
1021 {
1022 query += "INSERT INTO userdata VALUES ( ";
1023 query += "?UserId,";
1024 query += "?TagId,";
1025 query += "?DataKey,";
1026 query += "?DataVal) ";
1027
1028 using (MySqlCommand put = new MySqlCommand(query, dbcon))
1029 {
1030 put.Parameters.AddWithValue("?Id", props.UserId.ToString());
1031 put.Parameters.AddWithValue("?TagId", props.TagId.ToString());
1032 put.Parameters.AddWithValue("?DataKey", props.DataKey.ToString());
1033 put.Parameters.AddWithValue("?DataVal", props.DataVal.ToString());
1034
1035 lock(Lock)
1036 {
1037 put.ExecuteNonQuery();
1038 }
1039 }
1040 }
1041 }
1042 }
1043 }
1044 }
1045 catch (Exception e)
1046 {
1047 m_log.DebugFormat("[PROFILES_DATA]" +
1048 ": Requst application data exception {0}", e.Message);
1049 result = e.Message;
1050 return false;
1051 }
1052 return true;
1053 }
1054
1055 public bool SetUserAppData(UserAppData props, ref string result)
1056 {
1057 string query = string.Empty;
1058
1059 query += "UPDATE userdata SET ";
1060 query += "TagId = ?TagId, ";
1061 query += "DataKey = ?DataKey, ";
1062 query += "DataVal = ?DataVal WHERE ";
1063 query += "UserId = ?UserId AND ";
1064 query += "TagId = ?TagId";
1065
1066 try
1067 {
1068 using (MySqlConnection dbcon = new MySqlConnection(ConnectionString))
1069 {
1070 dbcon.Open();
1071 using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
1072 {
1073 cmd.Parameters.AddWithValue("?UserId", props.UserId.ToString());
1074 cmd.Parameters.AddWithValue("?TagId", props.TagId.ToString ());
1075 cmd.Parameters.AddWithValue("?DataKey", props.DataKey.ToString ());
1076 cmd.Parameters.AddWithValue("?DataVal", props.DataKey.ToString ());
1077
1078 lock(Lock)
1079 {
1080 cmd.ExecuteNonQuery();
1081 }
1082 }
1083 }
1084 }
1085 catch (Exception e)
1086 {
1087 m_log.DebugFormat("[PROFILES_DATA]" +
1088 ": SetUserData exception {0}", e.Message);
1089 return false;
1090 }
1091 return true;
1092 }
1093 #endregion Integration
1094 }
1095}
1096
diff --git a/OpenSim/Data/MySQL/MySQLXAssetData.cs b/OpenSim/Data/MySQL/MySQLXAssetData.cs
index 15ac921..5f1d2ee 100644
--- a/OpenSim/Data/MySQL/MySQLXAssetData.cs
+++ b/OpenSim/Data/MySQL/MySQLXAssetData.cs
@@ -199,6 +199,8 @@ namespace OpenSim.Data.MySQL
199 /// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks> 199 /// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks>
200 public void StoreAsset(AssetBase asset) 200 public void StoreAsset(AssetBase asset)
201 { 201 {
202// m_log.DebugFormat("[XASSETS DB]: Storing asset {0} {1}", asset.Name, asset.ID);
203
202 lock (m_dbLock) 204 lock (m_dbLock)
203 { 205 {
204 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 206 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
diff --git a/OpenSim/Data/MySQL/Resources/EstateStore.migrations b/OpenSim/Data/MySQL/Resources/EstateStore.migrations
index df82a2e..2d1c2b5 100644
--- a/OpenSim/Data/MySQL/Resources/EstateStore.migrations
+++ b/OpenSim/Data/MySQL/Resources/EstateStore.migrations
@@ -77,5 +77,11 @@ BEGIN;
77ALTER TABLE estate_settings AUTO_INCREMENT = 100; 77ALTER TABLE estate_settings AUTO_INCREMENT = 100;
78COMMIT; 78COMMIT;
79 79
80:VERSION 33 #---------------------
80 81
82BEGIN;
83ALTER TABLE estate_settings ADD COLUMN `AllowLandmark` tinyint(4) NOT NULL default '1';
84ALTER TABLE estate_settings ADD COLUMN `AllowParcelChanges` tinyint(4) NOT NULL default '1';
85ALTER TABLE estate_settings ADD COLUMN `AllowSetHome` tinyint(4) NOT NULL default '1';
86COMMIT;
81 87
diff --git a/OpenSim/Data/MySQL/Resources/FriendsStore.migrations b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations
index 55d82ec..5faf956 100644
--- a/OpenSim/Data/MySQL/Resources/FriendsStore.migrations
+++ b/OpenSim/Data/MySQL/Resources/FriendsStore.migrations
@@ -9,7 +9,7 @@ CREATE TABLE `Friends` (
9 `Offered` VARCHAR(32) NOT NULL DEFAULT 0, 9 `Offered` VARCHAR(32) NOT NULL DEFAULT 0,
10 PRIMARY KEY(`PrincipalID`, `Friend`), 10 PRIMARY KEY(`PrincipalID`, `Friend`),
11 KEY(`PrincipalID`) 11 KEY(`PrincipalID`)
12); 12) ENGINE=InnoDB;
13 13
14COMMIT; 14COMMIT;
15 15
diff --git a/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations b/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations
new file mode 100644
index 0000000..b4e4422
--- /dev/null
+++ b/OpenSim/Data/MySQL/Resources/HGTravelStore.migrations
@@ -0,0 +1,18 @@
1:VERSION 1 # --------------------------
2
3BEGIN;
4
5CREATE TABLE `hg_traveling_data` (
6 `SessionID` VARCHAR(36) NOT NULL,
7 `UserID` VARCHAR(36) NOT NULL,
8 `GridExternalName` VARCHAR(255) NOT NULL DEFAULT '',
9 `ServiceToken` VARCHAR(255) NOT NULL DEFAULT '',
10 `ClientIPAddress` VARCHAR(16) NOT NULL DEFAULT '',
11 `MyIPAddress` VARCHAR(16) NOT NULL DEFAULT '',
12 `TMStamp` timestamp NOT NULL,
13 PRIMARY KEY (`SessionID`),
14 KEY (`UserID`)
15) ENGINE=InnoDB;
16
17COMMIT;
18
diff --git a/OpenSim/Data/MySQL/Resources/UserProfiles.migrations b/OpenSim/Data/MySQL/Resources/UserProfiles.migrations
new file mode 100644
index 0000000..c29f1ab
--- /dev/null
+++ b/OpenSim/Data/MySQL/Resources/UserProfiles.migrations
@@ -0,0 +1,83 @@
1:VERSION 1 # -------------------------------
2
3begin;
4
5CREATE TABLE IF NOT EXISTS `classifieds` (
6 `classifieduuid` char(36) NOT NULL,
7 `creatoruuid` char(36) NOT NULL,
8 `creationdate` int(20) NOT NULL,
9 `expirationdate` int(20) NOT NULL,
10 `category` varchar(20) NOT NULL,
11 `name` varchar(255) NOT NULL,
12 `description` text NOT NULL,
13 `parceluuid` char(36) NOT NULL,
14 `parentestate` int(11) NOT NULL,
15 `snapshotuuid` char(36) NOT NULL,
16 `simname` varchar(255) NOT NULL,
17 `posglobal` varchar(255) NOT NULL,
18 `parcelname` varchar(255) NOT NULL,
19 `classifiedflags` int(8) NOT NULL,
20 `priceforlisting` int(5) NOT NULL,
21 PRIMARY KEY (`classifieduuid`)
22) ENGINE=InnoDB DEFAULT CHARSET=latin1;
23
24
25CREATE TABLE IF NOT EXISTS `usernotes` (
26 `useruuid` varchar(36) NOT NULL,
27 `targetuuid` varchar(36) NOT NULL,
28 `notes` text NOT NULL,
29 UNIQUE KEY `useruuid` (`useruuid`,`targetuuid`)
30) ENGINE=MyISAM DEFAULT CHARSET=latin1;
31
32
33CREATE TABLE IF NOT EXISTS `userpicks` (
34 `pickuuid` varchar(36) NOT NULL,
35 `creatoruuid` varchar(36) NOT NULL,
36 `toppick` enum('true','false') NOT NULL,
37 `parceluuid` varchar(36) NOT NULL,
38 `name` varchar(255) NOT NULL,
39 `description` text NOT NULL,
40 `snapshotuuid` varchar(36) NOT NULL,
41 `user` varchar(255) NOT NULL,
42 `originalname` varchar(255) NOT NULL,
43 `simname` varchar(255) NOT NULL,
44 `posglobal` varchar(255) NOT NULL,
45 `sortorder` int(2) NOT NULL,
46 `enabled` enum('true','false') NOT NULL,
47 PRIMARY KEY (`pickuuid`)
48) ENGINE=MyISAM DEFAULT CHARSET=latin1;
49
50
51CREATE TABLE IF NOT EXISTS `userprofile` (
52 `useruuid` varchar(36) NOT NULL,
53 `profilePartner` varchar(36) NOT NULL,
54 `profileAllowPublish` binary(1) NOT NULL,
55 `profileMaturePublish` binary(1) NOT NULL,
56 `profileURL` varchar(255) NOT NULL,
57 `profileWantToMask` int(3) NOT NULL,
58 `profileWantToText` text NOT NULL,
59 `profileSkillsMask` int(3) NOT NULL,
60 `profileSkillsText` text NOT NULL,
61 `profileLanguages` text NOT NULL,
62 `profileImage` varchar(36) NOT NULL,
63 `profileAboutText` text NOT NULL,
64 `profileFirstImage` varchar(36) NOT NULL,
65 `profileFirstText` text NOT NULL,
66 PRIMARY KEY (`useruuid`)
67) ENGINE=MyISAM DEFAULT CHARSET=latin1;
68
69commit;
70
71:VERSION 2 # -------------------------------
72
73begin;
74CREATE TABLE IF NOT EXISTS `userdata` (
75 `UserId` char(36) NOT NULL,
76 `TagId` varchar(64) NOT NULL,
77 `DataKey` varchar(255),
78 `DataVal` varchar(255),
79 PRIMARY KEY (`UserId`,`TagId`)
80) ENGINE=MyISAM DEFAULT CHARSET=latin1;
81
82commit;
83
diff --git a/OpenSim/Data/Null/NullEstateData.cs b/OpenSim/Data/Null/NullEstateData.cs
index d64136d..1df397d 100755
--- a/OpenSim/Data/Null/NullEstateData.cs
+++ b/OpenSim/Data/Null/NullEstateData.cs
@@ -42,6 +42,22 @@ namespace OpenSim.Data.Null
42 42
43// private string m_connectionString; 43// private string m_connectionString;
44 44
45 private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
46 private EstateSettings m_estate = null;
47
48 private EstateSettings GetEstate()
49 {
50 if (m_estate == null)
51 {
52 // This fools the initialization caller into thinking an estate was fetched (a check in OpenSimBase).
53 // The estate info is pretty empty so don't try banning anyone.
54 m_estate = new EstateSettings();
55 m_estate.EstateID = 1;
56 m_estate.OnSave += StoreEstateSettings;
57 }
58 return m_estate;
59 }
60
45 protected virtual Assembly Assembly 61 protected virtual Assembly Assembly
46 { 62 {
47 get { return GetType().Assembly; } 63 get { return GetType().Assembly; }
@@ -68,21 +84,18 @@ namespace OpenSim.Data.Null
68 84
69 public EstateSettings LoadEstateSettings(UUID regionID, bool create) 85 public EstateSettings LoadEstateSettings(UUID regionID, bool create)
70 { 86 {
71 // This fools the initialization caller into thinking an estate was fetched (a check in OpenSimBase). 87 return GetEstate();
72 // The estate info is pretty empty so don't try banning anyone.
73 EstateSettings oneEstate = new EstateSettings();
74 oneEstate.EstateID = 1;
75 return oneEstate;
76 } 88 }
77 89
78 public void StoreEstateSettings(EstateSettings es) 90 public void StoreEstateSettings(EstateSettings es)
79 { 91 {
92 m_estate = es;
80 return; 93 return;
81 } 94 }
82 95
83 public EstateSettings LoadEstateSettings(int estateID) 96 public EstateSettings LoadEstateSettings(int estateID)
84 { 97 {
85 return new EstateSettings(); 98 return GetEstate();
86 } 99 }
87 100
88 public EstateSettings CreateNewEstate() 101 public EstateSettings CreateNewEstate()
@@ -93,13 +106,14 @@ namespace OpenSim.Data.Null
93 public List<EstateSettings> LoadEstateSettingsAll() 106 public List<EstateSettings> LoadEstateSettingsAll()
94 { 107 {
95 List<EstateSettings> allEstateSettings = new List<EstateSettings>(); 108 List<EstateSettings> allEstateSettings = new List<EstateSettings>();
96 allEstateSettings.Add(new EstateSettings()); 109 allEstateSettings.Add(GetEstate());
97 return allEstateSettings; 110 return allEstateSettings;
98 } 111 }
99 112
100 public List<int> GetEstatesAll() 113 public List<int> GetEstatesAll()
101 { 114 {
102 List<int> result = new List<int>(); 115 List<int> result = new List<int>();
116 result.Add((int)GetEstate().EstateID);
103 return result; 117 return result;
104 } 118 }
105 119
diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index f707d98..d28cd99 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -239,6 +239,11 @@ namespace OpenSim.Data.Null
239 return Get((int)RegionFlags.DefaultRegion, scopeID); 239 return Get((int)RegionFlags.DefaultRegion, scopeID);
240 } 240 }
241 241
242 public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
243 {
244 return Get((int)RegionFlags.DefaultHGRegion, scopeID);
245 }
246
242 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y) 247 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
243 { 248 {
244 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID); 249 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs
index e7e5c41..15824a9 100644
--- a/OpenSim/Data/Null/NullSimulationData.cs
+++ b/OpenSim/Data/Null/NullSimulationData.cs
@@ -77,20 +77,34 @@ namespace OpenSim.Data.Null
77 } 77 }
78 78
79 #region Environment Settings 79 #region Environment Settings
80
81 private Dictionary<UUID, string> EnvironmentSettings = new Dictionary<UUID, string>();
82
80 public string LoadRegionEnvironmentSettings(UUID regionUUID) 83 public string LoadRegionEnvironmentSettings(UUID regionUUID)
81 { 84 {
82 //This connector doesn't support the Environment module yet 85 lock (EnvironmentSettings)
86 {
87 if (EnvironmentSettings.ContainsKey(regionUUID))
88 return EnvironmentSettings[regionUUID];
89 }
83 return string.Empty; 90 return string.Empty;
84 } 91 }
85 92
86 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) 93 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
87 { 94 {
88 //This connector doesn't support the Environment module yet 95 lock (EnvironmentSettings)
96 {
97 EnvironmentSettings[regionUUID] = settings;
98 }
89 } 99 }
90 100
91 public void RemoveRegionEnvironmentSettings(UUID regionUUID) 101 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
92 { 102 {
93 //This connector doesn't support the Environment module yet 103 lock (EnvironmentSettings)
104 {
105 if (EnvironmentSettings.ContainsKey(regionUUID))
106 EnvironmentSettings.Remove(regionUUID);
107 }
94 } 108 }
95 #endregion 109 #endregion
96 110
diff --git a/OpenSim/Data/SQLite/Resources/EstateStore.migrations b/OpenSim/Data/SQLite/Resources/EstateStore.migrations
index 62f6464..0aec49b 100644
--- a/OpenSim/Data/SQLite/Resources/EstateStore.migrations
+++ b/OpenSim/Data/SQLite/Resources/EstateStore.migrations
@@ -86,3 +86,12 @@ begin;
86alter table estate_settings add column DenyMinors tinyint not null default 0; 86alter table estate_settings add column DenyMinors tinyint not null default 0;
87 87
88commit; 88commit;
89
90:VERSION 9
91
92begin;
93alter table estate_settings add column AllowLandmark tinyint not null default '1';
94alter table estate_settings add column AllowParcelChanges tinyint not null default '1';
95alter table estate_settings add column AllowSetHome tinyint not null default '1';
96commit;
97
diff --git a/OpenSim/Data/SQLite/Resources/HGTravelStore.migrations b/OpenSim/Data/SQLite/Resources/HGTravelStore.migrations
new file mode 100644
index 0000000..02612ce
--- /dev/null
+++ b/OpenSim/Data/SQLite/Resources/HGTravelStore.migrations
@@ -0,0 +1,18 @@
1:VERSION 2 # --------------------------
2
3BEGIN;
4
5CREATE TABLE hg_traveling_data(
6 SessionID VARCHAR(36) NOT NULL,
7 UserID VARCHAR(36) NOT NULL,
8 GridExternalName VARCHAR(255) NOT NULL DEFAULT "",
9 ServiceToken VARCHAR(255) NOT NULL DEFAULT "",
10 ClientIPAddress VARCHAR(16) NOT NULL DEFAULT "",
11 MyIPAddress VARCHAR(16) NOT NULL DEFAULT "",
12 TMStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
13 PRIMARY KEY(SessionID),
14 UNIQUE(UserID)
15);
16
17COMMIT;
18
diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations
index c6f4b48..bff039d 100644
--- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations
+++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations
@@ -592,3 +592,11 @@ ALTER TABLE prims ADD COLUMN `Friction` double NOT NULL default '0.6';
592ALTER TABLE prims ADD COLUMN `Restitution` double NOT NULL default '0.5'; 592ALTER TABLE prims ADD COLUMN `Restitution` double NOT NULL default '0.5';
593 593
594COMMIT; 594COMMIT;
595
596:VERSION 29 #---------------- Keyframes
597
598BEGIN;
599
600ALTER TABLE prims ADD COLUMN `KeyframeMotion` blob;
601
602COMMIT;
diff --git a/OpenSim/Data/SQLite/Resources/UserProfiles.migrations b/OpenSim/Data/SQLite/Resources/UserProfiles.migrations
new file mode 100644
index 0000000..16581f6
--- /dev/null
+++ b/OpenSim/Data/SQLite/Resources/UserProfiles.migrations
@@ -0,0 +1,90 @@
1:VERSION 1 # -------------------------------
2
3begin;
4
5CREATE TABLE IF NOT EXISTS classifieds (
6 classifieduuid char(36) NOT NULL PRIMARY KEY,
7 creatoruuid char(36) NOT NULL,
8 creationdate int(20) NOT NULL,
9 expirationdate int(20) NOT NULL,
10 category varchar(20) NOT NULL,
11 name varchar(255) NOT NULL,
12 description text NOT NULL,
13 parceluuid char(36) NOT NULL,
14 parentestate int(11) NOT NULL,
15 snapshotuuid char(36) NOT NULL,
16 simname varchar(255) NOT NULL,
17 posglobal varchar(255) NOT NULL,
18 parcelname varchar(255) NOT NULL,
19 classifiedflags int(8) NOT NULL,
20 priceforlisting int(5) NOT NULL
21);
22
23commit;
24
25begin;
26
27CREATE TABLE IF NOT EXISTS usernotes (
28 useruuid varchar(36) NOT NULL,
29 targetuuid varchar(36) NOT NULL,
30 notes text NOT NULL,
31 UNIQUE (useruuid,targetuuid) ON CONFLICT REPLACE
32);
33
34commit;
35
36begin;
37
38CREATE TABLE IF NOT EXISTS userpicks (
39 pickuuid varchar(36) NOT NULL PRIMARY KEY,
40 creatoruuid varchar(36) NOT NULL,
41 toppick int NOT NULL,
42 parceluuid varchar(36) NOT NULL,
43 name varchar(255) NOT NULL,
44 description text NOT NULL,
45 snapshotuuid varchar(36) NOT NULL,
46 user varchar(255) NOT NULL,
47 originalname varchar(255) NOT NULL,
48 simname varchar(255) NOT NULL,
49 posglobal varchar(255) NOT NULL,
50 sortorder int(2) NOT NULL,
51 enabled int NOT NULL
52);
53
54commit;
55
56begin;
57
58CREATE TABLE IF NOT EXISTS userprofile (
59 useruuid varchar(36) NOT NULL PRIMARY KEY,
60 profilePartner varchar(36) NOT NULL,
61 profileAllowPublish binary(1) NOT NULL,
62 profileMaturePublish binary(1) NOT NULL,
63 profileURL varchar(255) NOT NULL,
64 profileWantToMask int(3) NOT NULL,
65 profileWantToText text NOT NULL,
66 profileSkillsMask int(3) NOT NULL,
67 profileSkillsText text NOT NULL,
68 profileLanguages text NOT NULL,
69 profileImage varchar(36) NOT NULL,
70 profileAboutText text NOT NULL,
71 profileFirstImage varchar(36) NOT NULL,
72 profileFirstText text NOT NULL
73);
74
75commit;
76
77:VERSION 2 # -------------------------------
78
79begin;
80
81CREATE TABLE IF NOT EXISTS userdata (
82 UserId char(36) NOT NULL,
83 TagId varchar(64) NOT NULL,
84 DataKey varchar(255),
85 DataVal varchar(255),
86 PRIMARY KEY (UserId,TagId)
87);
88
89commit;
90
diff --git a/OpenSim/Data/SQLite/SQLiteGridUserData.cs b/OpenSim/Data/SQLite/SQLiteGridUserData.cs
index 1bb5ed8..d8c52f8 100644
--- a/OpenSim/Data/SQLite/SQLiteGridUserData.cs
+++ b/OpenSim/Data/SQLite/SQLiteGridUserData.cs
@@ -56,6 +56,10 @@ namespace OpenSim.Data.SQLite
56 return ret[0]; 56 return ret[0];
57 } 57 }
58 58
59 public GridUserData[] GetAll(string userID)
60 {
61 return base.Get(String.Format("UserID LIKE '{0}%'", userID));
62 }
59 63
60 } 64 }
61} \ No newline at end of file 65} \ No newline at end of file
diff --git a/OpenSim/Data/SQLite/SQLiteHGTravelData.cs b/OpenSim/Data/SQLite/SQLiteHGTravelData.cs
new file mode 100644
index 0000000..db288b2
--- /dev/null
+++ b/OpenSim/Data/SQLite/SQLiteHGTravelData.cs
@@ -0,0 +1,82 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using Mono.Data.Sqlite;
37
38namespace OpenSim.Data.SQLite
39{
40 /// <summary>
41 /// A SQL Interface for user grid data
42 /// </summary>
43 public class SQLiteHGTravelData : SQLiteGenericTableHandler<HGTravelingData>, IHGTravelingData
44 {
45// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46
47 public SQLiteHGTravelData(string connectionString, string realm)
48 : base(connectionString, realm, "HGTravelStore") {}
49
50 public HGTravelingData Get(UUID sessionID)
51 {
52 HGTravelingData[] ret = Get("SessionID", sessionID.ToString());
53
54 if (ret.Length == 0)
55 return null;
56
57 return ret[0];
58 }
59
60 public HGTravelingData[] GetSessions(UUID userID)
61 {
62 return base.Get("UserID", userID.ToString());
63 }
64
65 public bool Delete(UUID sessionID)
66 {
67 return Delete("SessionID", sessionID.ToString());
68 }
69
70 public void DeleteOld()
71 {
72 using (SqliteCommand cmd = new SqliteCommand())
73 {
74 cmd.CommandText = String.Format("delete from {0} where TMStamp < datetime('now', '-2 day') ", m_Realm);
75
76 DoQuery(cmd);
77 }
78
79 }
80
81 }
82} \ No newline at end of file
diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs
index 76f717d..52502b3 100644
--- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs
+++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs
@@ -1244,6 +1244,7 @@ namespace OpenSim.Data.SQLite
1244 createCol(prims, "Friction", typeof(Double)); 1244 createCol(prims, "Friction", typeof(Double));
1245 createCol(prims, "Restitution", typeof(Double)); 1245 createCol(prims, "Restitution", typeof(Double));
1246 1246
1247 createCol(prims, "KeyframeMotion", typeof(Byte[]));
1247 // Add in contraints 1248 // Add in contraints
1248 prims.PrimaryKey = new DataColumn[] { prims.Columns["UUID"] }; 1249 prims.PrimaryKey = new DataColumn[] { prims.Columns["UUID"] };
1249 1250
@@ -1739,6 +1740,20 @@ namespace OpenSim.Data.SQLite
1739 prim.Friction = Convert.ToSingle(row["Friction"]); 1740 prim.Friction = Convert.ToSingle(row["Friction"]);
1740 prim.Restitution = Convert.ToSingle(row["Restitution"]); 1741 prim.Restitution = Convert.ToSingle(row["Restitution"]);
1741 1742
1743
1744 if (!(row["KeyframeMotion"] is DBNull))
1745 {
1746 Byte[] data = (byte[])row["KeyframeMotion"];
1747 if (data.Length > 0)
1748 prim.KeyframeMotion = KeyframeMotion.FromData(null, data);
1749 else
1750 prim.KeyframeMotion = null;
1751 }
1752 else
1753 {
1754 prim.KeyframeMotion = null;
1755 }
1756
1742 return prim; 1757 return prim;
1743 } 1758 }
1744 1759
@@ -2161,7 +2176,7 @@ namespace OpenSim.Data.SQLite
2161 2176
2162 row["MediaURL"] = prim.MediaUrl; 2177 row["MediaURL"] = prim.MediaUrl;
2163 2178
2164 if (prim.DynAttrs.Count > 0) 2179 if (prim.DynAttrs.CountNamespaces > 0)
2165 row["DynAttrs"] = prim.DynAttrs.ToXml(); 2180 row["DynAttrs"] = prim.DynAttrs.ToXml();
2166 else 2181 else
2167 row["DynAttrs"] = null; 2182 row["DynAttrs"] = null;
@@ -2171,6 +2186,13 @@ namespace OpenSim.Data.SQLite
2171 row["GravityModifier"] = (double)prim.GravityModifier; 2186 row["GravityModifier"] = (double)prim.GravityModifier;
2172 row["Friction"] = (double)prim.Friction; 2187 row["Friction"] = (double)prim.Friction;
2173 row["Restitution"] = (double)prim.Restitution; 2188 row["Restitution"] = (double)prim.Restitution;
2189
2190 if (prim.KeyframeMotion != null)
2191 row["KeyframeMotion"] = prim.KeyframeMotion.Serialize();
2192 else
2193 row["KeyframeMotion"] = new Byte[0];
2194
2195
2174 } 2196 }
2175 2197
2176 /// <summary> 2198 /// <summary>
diff --git a/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs b/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs
new file mode 100644
index 0000000..cc1dac1
--- /dev/null
+++ b/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs
@@ -0,0 +1,904 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using log4net;
33#if CSharpSqlite
34using Community.CsharpSqlite.Sqlite;
35#else
36using Mono.Data.Sqlite;
37#endif
38using OpenMetaverse;
39using OpenMetaverse.StructuredData;
40using OpenSim.Framework;
41using OpenSim.Region.Framework.Interfaces;
42
43namespace OpenSim.Data.SQLite
44{
45 public class SQLiteUserProfilesData: IProfilesData
46 {
47 private static readonly ILog m_log =
48 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 private SqliteConnection m_connection;
51 private string m_connectionString;
52
53 private FieldInfo[] m_Fields;
54 private Dictionary<string, FieldInfo> m_FieldMap =
55 new Dictionary<string, FieldInfo>();
56
57 protected virtual Assembly Assembly
58 {
59 get { return GetType().Assembly; }
60 }
61
62 public SQLiteUserProfilesData()
63 {
64 }
65
66 public SQLiteUserProfilesData(string connectionString)
67 {
68 Initialise(connectionString);
69 }
70
71 public void Initialise(string connectionString)
72 {
73 if (Util.IsWindows())
74 Util.LoadArchSpecificWindowsDll("sqlite3.dll");
75
76 m_connectionString = connectionString;
77
78 m_log.Info("[PROFILES_DATA]: Sqlite - connecting: "+m_connectionString);
79
80 m_connection = new SqliteConnection(m_connectionString);
81 m_connection.Open();
82
83 Migration m = new Migration(m_connection, Assembly, "UserProfiles");
84 m.Update();
85 }
86
87 private string[] FieldList
88 {
89 get { return new List<string>(m_FieldMap.Keys).ToArray(); }
90 }
91
92 #region IProfilesData implementation
93 public OSDArray GetClassifiedRecords(UUID creatorId)
94 {
95 OSDArray data = new OSDArray();
96 string query = "SELECT classifieduuid, name FROM classifieds WHERE creatoruuid = :Id";
97 IDataReader reader = null;
98
99 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
100 {
101 cmd.CommandText = query;
102 cmd.Parameters.AddWithValue(":Id", creatorId);
103 reader = cmd.ExecuteReader();
104 }
105
106 while (reader.Read())
107 {
108 OSDMap n = new OSDMap();
109 UUID Id = UUID.Zero;
110 string Name = null;
111 try
112 {
113 UUID.TryParse(Convert.ToString( reader["classifieduuid"]), out Id);
114 Name = Convert.ToString(reader["name"]);
115 }
116 catch (Exception e)
117 {
118 m_log.DebugFormat("[PROFILES_DATA]" +
119 ": UserAccount exception {0}", e.Message);
120 }
121 n.Add("classifieduuid", OSD.FromUUID(Id));
122 n.Add("name", OSD.FromString(Name));
123 data.Add(n);
124 }
125
126 reader.Close();
127
128 return data;
129 }
130 public bool UpdateClassifiedRecord(UserClassifiedAdd ad, ref string result)
131 {
132 string query = string.Empty;
133
134 query += "INSERT OR REPLACE INTO classifieds (";
135 query += "`classifieduuid`,";
136 query += "`creatoruuid`,";
137 query += "`creationdate`,";
138 query += "`expirationdate`,";
139 query += "`category`,";
140 query += "`name`,";
141 query += "`description`,";
142 query += "`parceluuid`,";
143 query += "`parentestate`,";
144 query += "`snapshotuuid`,";
145 query += "`simname`,";
146 query += "`posglobal`,";
147 query += "`parcelname`,";
148 query += "`classifiedflags`,";
149 query += "`priceforlisting`) ";
150 query += "VALUES (";
151 query += ":ClassifiedId,";
152 query += ":CreatorId,";
153 query += ":CreatedDate,";
154 query += ":ExpirationDate,";
155 query += ":Category,";
156 query += ":Name,";
157 query += ":Description,";
158 query += ":ParcelId,";
159 query += ":ParentEstate,";
160 query += ":SnapshotId,";
161 query += ":SimName,";
162 query += ":GlobalPos,";
163 query += ":ParcelName,";
164 query += ":Flags,";
165 query += ":ListingPrice ) ";
166
167 if(string.IsNullOrEmpty(ad.ParcelName))
168 ad.ParcelName = "Unknown";
169 if(ad.ParcelId == null)
170 ad.ParcelId = UUID.Zero;
171 if(string.IsNullOrEmpty(ad.Description))
172 ad.Description = "No Description";
173
174 DateTime epoch = new DateTime(1970, 1, 1);
175 DateTime now = DateTime.Now;
176 TimeSpan epochnow = now - epoch;
177 TimeSpan duration;
178 DateTime expiration;
179 TimeSpan epochexp;
180
181 if(ad.Flags == 2)
182 {
183 duration = new TimeSpan(7,0,0,0);
184 expiration = now.Add(duration);
185 epochexp = expiration - epoch;
186 }
187 else
188 {
189 duration = new TimeSpan(365,0,0,0);
190 expiration = now.Add(duration);
191 epochexp = expiration - epoch;
192 }
193 ad.CreationDate = (int)epochnow.TotalSeconds;
194 ad.ExpirationDate = (int)epochexp.TotalSeconds;
195
196 try {
197 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
198 {
199 cmd.CommandText = query;
200 cmd.Parameters.AddWithValue(":ClassifiedId", ad.ClassifiedId.ToString());
201 cmd.Parameters.AddWithValue(":CreatorId", ad.CreatorId.ToString());
202 cmd.Parameters.AddWithValue(":CreatedDate", ad.CreationDate.ToString());
203 cmd.Parameters.AddWithValue(":ExpirationDate", ad.ExpirationDate.ToString());
204 cmd.Parameters.AddWithValue(":Category", ad.Category.ToString());
205 cmd.Parameters.AddWithValue(":Name", ad.Name.ToString());
206 cmd.Parameters.AddWithValue(":Description", ad.Description.ToString());
207 cmd.Parameters.AddWithValue(":ParcelId", ad.ParcelId.ToString());
208 cmd.Parameters.AddWithValue(":ParentEstate", ad.ParentEstate.ToString());
209 cmd.Parameters.AddWithValue(":SnapshotId", ad.SnapshotId.ToString ());
210 cmd.Parameters.AddWithValue(":SimName", ad.SimName.ToString());
211 cmd.Parameters.AddWithValue(":GlobalPos", ad.GlobalPos.ToString());
212 cmd.Parameters.AddWithValue(":ParcelName", ad.ParcelName.ToString());
213 cmd.Parameters.AddWithValue(":Flags", ad.Flags.ToString());
214 cmd.Parameters.AddWithValue(":ListingPrice", ad.Price.ToString ());
215
216 cmd.ExecuteNonQuery();
217 }
218 }
219 catch (Exception e)
220 {
221 m_log.DebugFormat("[PROFILES_DATA]" +
222 ": ClassifiedesUpdate exception {0}", e.Message);
223 result = e.Message;
224 return false;
225 }
226 return true;
227 }
228 public bool DeleteClassifiedRecord(UUID recordId)
229 {
230 string query = string.Empty;
231
232 query += "DELETE FROM classifieds WHERE ";
233 query += "classifieduuid = :ClasifiedId";
234
235 try
236 {
237 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
238 {
239 cmd.CommandText = query;
240 cmd.Parameters.AddWithValue(":ClassifiedId", recordId.ToString());
241
242 cmd.ExecuteNonQuery();
243 }
244 }
245 catch (Exception e)
246 {
247 m_log.DebugFormat("[PROFILES_DATA]" +
248 ": DeleteClassifiedRecord exception {0}", e.Message);
249 return false;
250 }
251 return true;
252 }
253
254 public bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result)
255 {
256 IDataReader reader = null;
257 string query = string.Empty;
258
259 query += "SELECT * FROM classifieds WHERE ";
260 query += "classifieduuid = :AdId";
261
262 try
263 {
264 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
265 {
266 cmd.CommandText = query;
267 cmd.Parameters.AddWithValue(":AdId", ad.ClassifiedId.ToString());
268
269 using (reader = cmd.ExecuteReader())
270 {
271 if(reader.Read ())
272 {
273 ad.CreatorId = new UUID(reader["creatoruuid"].ToString());
274 ad.ParcelId = new UUID(reader["parceluuid"].ToString ());
275 ad.SnapshotId = new UUID(reader["snapshotuuid"].ToString ());
276 ad.CreationDate = Convert.ToInt32(reader["creationdate"]);
277 ad.ExpirationDate = Convert.ToInt32(reader["expirationdate"]);
278 ad.ParentEstate = Convert.ToInt32(reader["parentestate"]);
279 ad.Flags = (byte) Convert.ToUInt32(reader["classifiedflags"]);
280 ad.Category = Convert.ToInt32(reader["category"]);
281 ad.Price = Convert.ToInt16(reader["priceforlisting"]);
282 ad.Name = reader["name"].ToString();
283 ad.Description = reader["description"].ToString();
284 ad.SimName = reader["simname"].ToString();
285 ad.GlobalPos = reader["posglobal"].ToString();
286 ad.ParcelName = reader["parcelname"].ToString();
287 }
288 }
289 }
290 }
291 catch (Exception e)
292 {
293 m_log.DebugFormat("[PROFILES_DATA]" +
294 ": GetPickInfo exception {0}", e.Message);
295 }
296 return true;
297 }
298
299 public OSDArray GetAvatarPicks(UUID avatarId)
300 {
301 IDataReader reader = null;
302 string query = string.Empty;
303
304 query += "SELECT `pickuuid`,`name` FROM userpicks WHERE ";
305 query += "creatoruuid = :Id";
306 OSDArray data = new OSDArray();
307
308 try
309 {
310 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
311 {
312 cmd.CommandText = query;
313 cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
314
315 using (reader = cmd.ExecuteReader())
316 {
317 while (reader.Read())
318 {
319 OSDMap record = new OSDMap();
320
321 record.Add("pickuuid",OSD.FromString((string)reader["pickuuid"]));
322 record.Add("name",OSD.FromString((string)reader["name"]));
323 data.Add(record);
324 }
325 }
326 }
327 }
328 catch (Exception e)
329 {
330 m_log.DebugFormat("[PROFILES_DATA]" +
331 ": GetAvatarPicks exception {0}", e.Message);
332 }
333 return data;
334 }
335 public UserProfilePick GetPickInfo(UUID avatarId, UUID pickId)
336 {
337 IDataReader reader = null;
338 string query = string.Empty;
339 UserProfilePick pick = new UserProfilePick();
340
341 query += "SELECT * FROM userpicks WHERE ";
342 query += "creatoruuid = :CreatorId AND ";
343 query += "pickuuid = :PickId";
344
345 try
346 {
347 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
348 {
349 cmd.CommandText = query;
350 cmd.Parameters.AddWithValue(":CreatorId", avatarId.ToString());
351 cmd.Parameters.AddWithValue(":PickId", pickId.ToString());
352
353 using (reader = cmd.ExecuteReader())
354 {
355
356 while (reader.Read())
357 {
358 string description = (string)reader["description"];
359
360 if (string.IsNullOrEmpty(description))
361 description = "No description given.";
362
363 UUID.TryParse((string)reader["pickuuid"], out pick.PickId);
364 UUID.TryParse((string)reader["creatoruuid"], out pick.CreatorId);
365 UUID.TryParse((string)reader["parceluuid"], out pick.ParcelId);
366 UUID.TryParse((string)reader["snapshotuuid"], out pick.SnapshotId);
367 pick.GlobalPos = (string)reader["posglobal"];
368 bool.TryParse((string)reader["toppick"].ToString(), out pick.TopPick);
369 bool.TryParse((string)reader["enabled"].ToString(), out pick.Enabled);
370 pick.Name = (string)reader["name"];
371 pick.Desc = description;
372 pick.User = (string)reader["user"];
373 pick.OriginalName = (string)reader["originalname"];
374 pick.SimName = (string)reader["simname"];
375 pick.SortOrder = (int)reader["sortorder"];
376 }
377 }
378 }
379 }
380 catch (Exception e)
381 {
382 m_log.DebugFormat("[PROFILES_DATA]" +
383 ": GetPickInfo exception {0}", e.Message);
384 }
385 return pick;
386 }
387
388 public bool UpdatePicksRecord(UserProfilePick pick)
389 {
390 string query = string.Empty;
391
392 query += "INSERT OR REPLACE INTO userpicks (";
393 query += "pickuuid, ";
394 query += "creatoruuid, ";
395 query += "toppick, ";
396 query += "parceluuid, ";
397 query += "name, ";
398 query += "description, ";
399 query += "snapshotuuid, ";
400 query += "user, ";
401 query += "originalname, ";
402 query += "simname, ";
403 query += "posglobal, ";
404 query += "sortorder, ";
405 query += "enabled ) ";
406 query += "VALUES (";
407 query += ":PickId,";
408 query += ":CreatorId,";
409 query += ":TopPick,";
410 query += ":ParcelId,";
411 query += ":Name,";
412 query += ":Desc,";
413 query += ":SnapshotId,";
414 query += ":User,";
415 query += ":Original,";
416 query += ":SimName,";
417 query += ":GlobalPos,";
418 query += ":SortOrder,";
419 query += ":Enabled) ";
420
421 try
422 {
423 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
424 {
425 int top_pick;
426 int.TryParse(pick.TopPick.ToString(), out top_pick);
427 int enabled;
428 int.TryParse(pick.Enabled.ToString(), out enabled);
429
430 cmd.CommandText = query;
431 cmd.Parameters.AddWithValue(":PickId", pick.PickId.ToString());
432 cmd.Parameters.AddWithValue(":CreatorId", pick.CreatorId.ToString());
433 cmd.Parameters.AddWithValue(":TopPick", top_pick);
434 cmd.Parameters.AddWithValue(":ParcelId", pick.ParcelId.ToString());
435 cmd.Parameters.AddWithValue(":Name", pick.Name.ToString());
436 cmd.Parameters.AddWithValue(":Desc", pick.Desc.ToString());
437 cmd.Parameters.AddWithValue(":SnapshotId", pick.SnapshotId.ToString());
438 cmd.Parameters.AddWithValue(":User", pick.User.ToString());
439 cmd.Parameters.AddWithValue(":Original", pick.OriginalName.ToString());
440 cmd.Parameters.AddWithValue(":SimName",pick.SimName.ToString());
441 cmd.Parameters.AddWithValue(":GlobalPos", pick.GlobalPos);
442 cmd.Parameters.AddWithValue(":SortOrder", pick.SortOrder.ToString ());
443 cmd.Parameters.AddWithValue(":Enabled", enabled);
444
445 cmd.ExecuteNonQuery();
446 }
447 }
448 catch (Exception e)
449 {
450 m_log.DebugFormat("[PROFILES_DATA]" +
451 ": UpdateAvatarNotes exception {0}", e.Message);
452 return false;
453 }
454 return true;
455 }
456
457 public bool DeletePicksRecord(UUID pickId)
458 {
459 string query = string.Empty;
460
461 query += "DELETE FROM userpicks WHERE ";
462 query += "pickuuid = :PickId";
463
464 try
465 {
466 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
467 {
468 cmd.CommandText = query;
469 cmd.Parameters.AddWithValue(":PickId", pickId.ToString());
470 cmd.ExecuteNonQuery();
471 }
472 }
473 catch (Exception e)
474 {
475 m_log.DebugFormat("[PROFILES_DATA]" +
476 ": DeleteUserPickRecord exception {0}", e.Message);
477 return false;
478 }
479 return true;
480 }
481
482 public bool GetAvatarNotes(ref UserProfileNotes notes)
483 {
484 IDataReader reader = null;
485 string query = string.Empty;
486
487 query += "SELECT `notes` FROM usernotes WHERE ";
488 query += "useruuid = :Id AND ";
489 query += "targetuuid = :TargetId";
490 OSDArray data = new OSDArray();
491
492 try
493 {
494 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
495 {
496 cmd.CommandText = query;
497 cmd.Parameters.AddWithValue(":Id", notes.UserId.ToString());
498 cmd.Parameters.AddWithValue(":TargetId", notes.TargetId.ToString());
499
500 using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
501 {
502 while (reader.Read())
503 {
504 notes.Notes = OSD.FromString((string)reader["notes"]);
505 }
506 }
507 }
508 }
509 catch (Exception e)
510 {
511 m_log.DebugFormat("[PROFILES_DATA]" +
512 ": GetAvatarNotes exception {0}", e.Message);
513 }
514 return true;
515 }
516
517 public bool UpdateAvatarNotes(ref UserProfileNotes note, ref string result)
518 {
519 string query = string.Empty;
520 bool remove;
521
522 if(string.IsNullOrEmpty(note.Notes))
523 {
524 remove = true;
525 query += "DELETE FROM usernotes WHERE ";
526 query += "useruuid=:UserId AND ";
527 query += "targetuuid=:TargetId";
528 }
529 else
530 {
531 remove = false;
532 query += "INSERT OR REPLACE INTO usernotes VALUES ( ";
533 query += ":UserId,";
534 query += ":TargetId,";
535 query += ":Notes )";
536 }
537
538 try
539 {
540 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
541 {
542 cmd.CommandText = query;
543
544 if(!remove)
545 cmd.Parameters.AddWithValue(":Notes", note.Notes);
546 cmd.Parameters.AddWithValue(":TargetId", note.TargetId.ToString ());
547 cmd.Parameters.AddWithValue(":UserId", note.UserId.ToString());
548
549 cmd.ExecuteNonQuery();
550 }
551 }
552 catch (Exception e)
553 {
554 m_log.DebugFormat("[PROFILES_DATA]" +
555 ": UpdateAvatarNotes exception {0}", e.Message);
556 return false;
557 }
558 return true;
559 }
560
561 public bool GetAvatarProperties(ref UserProfileProperties props, ref string result)
562 {
563 IDataReader reader = null;
564 string query = string.Empty;
565
566 query += "SELECT * FROM userprofile WHERE ";
567 query += "useruuid = :Id";
568
569 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
570 {
571 cmd.CommandText = query;
572 cmd.Parameters.AddWithValue(":Id", props.UserId.ToString());
573
574
575 try
576 {
577 reader = cmd.ExecuteReader();
578 }
579 catch(Exception e)
580 {
581 m_log.DebugFormat("[PROFILES_DATA]" +
582 ": GetAvatarProperties exception {0}", e.Message);
583 result = e.Message;
584 return false;
585 }
586 if(reader != null && reader.Read())
587 {
588 m_log.DebugFormat("[PROFILES_DATA]" +
589 ": Getting data for {0}.", props.UserId);
590
591 props.WebUrl = (string)reader["profileURL"];
592 UUID.TryParse((string)reader["profileImage"], out props.ImageId);
593 props.AboutText = (string)reader["profileAboutText"];
594 UUID.TryParse((string)reader["profileFirstImage"], out props.FirstLifeImageId);
595 props.FirstLifeText = (string)reader["profileFirstText"];
596 UUID.TryParse((string)reader["profilePartner"], out props.PartnerId);
597 props.WantToMask = (int)reader["profileWantToMask"];
598 props.WantToText = (string)reader["profileWantToText"];
599 props.SkillsMask = (int)reader["profileSkillsMask"];
600 props.SkillsText = (string)reader["profileSkillsText"];
601 props.Language = (string)reader["profileLanguages"];
602 }
603 else
604 {
605 m_log.DebugFormat("[PROFILES_DATA]" +
606 ": No data for {0}", props.UserId);
607
608 props.WebUrl = string.Empty;
609 props.ImageId = UUID.Zero;
610 props.AboutText = string.Empty;
611 props.FirstLifeImageId = UUID.Zero;
612 props.FirstLifeText = string.Empty;
613 props.PartnerId = UUID.Zero;
614 props.WantToMask = 0;
615 props.WantToText = string.Empty;
616 props.SkillsMask = 0;
617 props.SkillsText = string.Empty;
618 props.Language = string.Empty;
619 props.PublishProfile = false;
620 props.PublishMature = false;
621
622 query = "INSERT INTO userprofile (";
623 query += "useruuid, ";
624 query += "profilePartner, ";
625 query += "profileAllowPublish, ";
626 query += "profileMaturePublish, ";
627 query += "profileURL, ";
628 query += "profileWantToMask, ";
629 query += "profileWantToText, ";
630 query += "profileSkillsMask, ";
631 query += "profileSkillsText, ";
632 query += "profileLanguages, ";
633 query += "profileImage, ";
634 query += "profileAboutText, ";
635 query += "profileFirstImage, ";
636 query += "profileFirstText) VALUES (";
637 query += ":userId, ";
638 query += ":profilePartner, ";
639 query += ":profileAllowPublish, ";
640 query += ":profileMaturePublish, ";
641 query += ":profileURL, ";
642 query += ":profileWantToMask, ";
643 query += ":profileWantToText, ";
644 query += ":profileSkillsMask, ";
645 query += ":profileSkillsText, ";
646 query += ":profileLanguages, ";
647 query += ":profileImage, ";
648 query += ":profileAboutText, ";
649 query += ":profileFirstImage, ";
650 query += ":profileFirstText)";
651
652 using (SqliteCommand put = (SqliteCommand)m_connection.CreateCommand())
653 {
654 put.CommandText = query;
655 put.Parameters.AddWithValue(":userId", props.UserId.ToString());
656 put.Parameters.AddWithValue(":profilePartner", props.PartnerId.ToString());
657 put.Parameters.AddWithValue(":profileAllowPublish", props.PublishProfile);
658 put.Parameters.AddWithValue(":profileMaturePublish", props.PublishMature);
659 put.Parameters.AddWithValue(":profileURL", props.WebUrl);
660 put.Parameters.AddWithValue(":profileWantToMask", props.WantToMask);
661 put.Parameters.AddWithValue(":profileWantToText", props.WantToText);
662 put.Parameters.AddWithValue(":profileSkillsMask", props.SkillsMask);
663 put.Parameters.AddWithValue(":profileSkillsText", props.SkillsText);
664 put.Parameters.AddWithValue(":profileLanguages", props.Language);
665 put.Parameters.AddWithValue(":profileImage", props.ImageId.ToString());
666 put.Parameters.AddWithValue(":profileAboutText", props.AboutText);
667 put.Parameters.AddWithValue(":profileFirstImage", props.FirstLifeImageId.ToString());
668 put.Parameters.AddWithValue(":profileFirstText", props.FirstLifeText);
669
670 put.ExecuteNonQuery();
671 }
672 }
673 }
674 return true;
675 }
676
677 public bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result)
678 {
679 string query = string.Empty;
680
681 query += "UPDATE userprofile SET ";
682 query += "profilePartner=:profilePartner, ";
683 query += "profileURL=:profileURL, ";
684 query += "profileImage=:image, ";
685 query += "profileAboutText=:abouttext,";
686 query += "profileFirstImage=:firstlifeimage,";
687 query += "profileFirstText=:firstlifetext ";
688 query += "WHERE useruuid=:uuid";
689
690 try
691 {
692 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
693 {
694 cmd.CommandText = query;
695 cmd.Parameters.AddWithValue(":profileURL", props.WebUrl);
696 cmd.Parameters.AddWithValue(":profilePartner", props.PartnerId.ToString());
697 cmd.Parameters.AddWithValue(":image", props.ImageId.ToString());
698 cmd.Parameters.AddWithValue(":abouttext", props.AboutText);
699 cmd.Parameters.AddWithValue(":firstlifeimage", props.FirstLifeImageId.ToString());
700 cmd.Parameters.AddWithValue(":firstlifetext", props.FirstLifeText);
701 cmd.Parameters.AddWithValue(":uuid", props.UserId.ToString());
702
703 cmd.ExecuteNonQuery();
704 }
705 }
706 catch (Exception e)
707 {
708 m_log.DebugFormat("[PROFILES_DATA]" +
709 ": AgentPropertiesUpdate exception {0}", e.Message);
710
711 return false;
712 }
713 return true;
714 }
715
716 public bool UpdateAvatarInterests(UserProfileProperties up, ref string result)
717 {
718 string query = string.Empty;
719
720 query += "UPDATE userprofile SET ";
721 query += "profileWantToMask=:WantMask, ";
722 query += "profileWantToText=:WantText,";
723 query += "profileSkillsMask=:SkillsMask,";
724 query += "profileSkillsText=:SkillsText, ";
725 query += "profileLanguages=:Languages ";
726 query += "WHERE useruuid=:uuid";
727
728 try
729 {
730 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
731 {
732 cmd.CommandText = query;
733 cmd.Parameters.AddWithValue(":WantMask", up.WantToMask);
734 cmd.Parameters.AddWithValue(":WantText", up.WantToText);
735 cmd.Parameters.AddWithValue(":SkillsMask", up.SkillsMask);
736 cmd.Parameters.AddWithValue(":SkillsText", up.SkillsText);
737 cmd.Parameters.AddWithValue(":Languages", up.Language);
738 cmd.Parameters.AddWithValue(":uuid", up.UserId.ToString());
739
740 cmd.ExecuteNonQuery();
741 }
742 }
743 catch (Exception e)
744 {
745 m_log.DebugFormat("[PROFILES_DATA]" +
746 ": AgentInterestsUpdate exception {0}", e.Message);
747 result = e.Message;
748 return false;
749 }
750 return true;
751 }
752 public bool GetUserAppData(ref UserAppData props, ref string result)
753 {
754 IDataReader reader = null;
755 string query = string.Empty;
756
757 query += "SELECT * FROM `userdata` WHERE ";
758 query += "UserId = :Id AND ";
759 query += "TagId = :TagId";
760
761 try
762 {
763 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
764 {
765 cmd.CommandText = query;
766 cmd.Parameters.AddWithValue(":Id", props.UserId.ToString());
767 cmd.Parameters.AddWithValue (":TagId", props.TagId.ToString());
768
769 using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
770 {
771 if(reader.Read())
772 {
773 props.DataKey = (string)reader["DataKey"];
774 props.DataVal = (string)reader["DataVal"];
775 }
776 else
777 {
778 query += "INSERT INTO userdata VALUES ( ";
779 query += ":UserId,";
780 query += ":TagId,";
781 query += ":DataKey,";
782 query += ":DataVal) ";
783
784 using (SqliteCommand put = (SqliteCommand)m_connection.CreateCommand())
785 {
786 put.Parameters.AddWithValue(":Id", props.UserId.ToString());
787 put.Parameters.AddWithValue(":TagId", props.TagId.ToString());
788 put.Parameters.AddWithValue(":DataKey", props.DataKey.ToString());
789 put.Parameters.AddWithValue(":DataVal", props.DataVal.ToString());
790
791 put.ExecuteNonQuery();
792 }
793 }
794 }
795 }
796 }
797 catch (Exception e)
798 {
799 m_log.DebugFormat("[PROFILES_DATA]" +
800 ": Requst application data exception {0}", e.Message);
801 result = e.Message;
802 return false;
803 }
804 return true;
805 }
806 public bool SetUserAppData(UserAppData props, ref string result)
807 {
808 string query = string.Empty;
809
810 query += "UPDATE userdata SET ";
811 query += "TagId = :TagId, ";
812 query += "DataKey = :DataKey, ";
813 query += "DataVal = :DataVal WHERE ";
814 query += "UserId = :UserId AND ";
815 query += "TagId = :TagId";
816
817 try
818 {
819 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
820 {
821 cmd.CommandText = query;
822 cmd.Parameters.AddWithValue(":UserId", props.UserId.ToString());
823 cmd.Parameters.AddWithValue(":TagId", props.TagId.ToString ());
824 cmd.Parameters.AddWithValue(":DataKey", props.DataKey.ToString ());
825 cmd.Parameters.AddWithValue(":DataVal", props.DataKey.ToString ());
826
827 cmd.ExecuteNonQuery();
828 }
829 }
830 catch (Exception e)
831 {
832 m_log.DebugFormat("[PROFILES_DATA]" +
833 ": SetUserData exception {0}", e.Message);
834 return false;
835 }
836 return true;
837 }
838 public OSDArray GetUserImageAssets(UUID avatarId)
839 {
840 IDataReader reader = null;
841 OSDArray data = new OSDArray();
842 string query = "SELECT `snapshotuuid` FROM {0} WHERE `creatoruuid` = :Id";
843
844 // Get classified image assets
845
846
847 try
848 {
849 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
850 {
851 cmd.CommandText = query;
852 cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
853
854 using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
855 {
856 while(reader.Read())
857 {
858 data.Add(new OSDString((string)reader["snapshotuuid"].ToString()));
859 }
860 }
861 }
862
863 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
864 {
865 cmd.CommandText = query;
866 cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
867
868 using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
869 {
870 if(reader.Read())
871 {
872 data.Add(new OSDString((string)reader["snapshotuuid"].ToString ()));
873 }
874 }
875 }
876
877 query = "SELECT `profileImage`, `profileFirstImage` FROM `userprofile` WHERE `useruuid` = :Id";
878
879 using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
880 {
881 cmd.CommandText = query;
882 cmd.Parameters.AddWithValue(":Id", avatarId.ToString());
883
884 using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
885 {
886 if(reader.Read())
887 {
888 data.Add(new OSDString((string)reader["profileImage"].ToString ()));
889 data.Add(new OSDString((string)reader["profileFirstImage"].ToString ()));
890 }
891 }
892 }
893 }
894 catch (Exception e)
895 {
896 m_log.DebugFormat("[PROFILES_DATA]" +
897 ": GetAvatarNotes exception {0}", e.Message);
898 }
899 return data;
900 }
901 #endregion
902 }
903}
904
diff --git a/OpenSim/Framework/Animation.cs b/OpenSim/Framework/Animation.cs
index 232f5a1..3425505 100644
--- a/OpenSim/Framework/Animation.cs
+++ b/OpenSim/Framework/Animation.cs
@@ -120,5 +120,24 @@ namespace OpenSim.Framework
120 sequenceNum = args["seq_num"].AsInteger(); 120 sequenceNum = args["seq_num"].AsInteger();
121 } 121 }
122 122
123 public override bool Equals(object obj)
124 {
125 Animation other = obj as Animation;
126 if (other != null)
127 {
128 return (other.AnimID.Equals(this.AnimID)
129 && other.SequenceNum == this.SequenceNum
130 && other.ObjectID.Equals(this.ObjectID) );
131 }
132 return base.Equals(obj);
133 }
134
135 public override string ToString()
136 {
137 return "AnimID=" + AnimID.ToString()
138 + "/seq=" + SequenceNum.ToString()
139 + "/objID=" + ObjectID.ToString();
140 }
141
123 } 142 }
124} 143}
diff --git a/OpenSim/Framework/BlockingQueue.cs b/OpenSim/Framework/BlockingQueue.cs
index 3658161..3e90fac 100644
--- a/OpenSim/Framework/BlockingQueue.cs
+++ b/OpenSim/Framework/BlockingQueue.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Framework
58 { 58 {
59 lock (m_queueSync) 59 lock (m_queueSync)
60 { 60 {
61 if (m_queue.Count < 1 && m_pqueue.Count < 1) 61 while (m_queue.Count < 1 && m_pqueue.Count < 1)
62 { 62 {
63 Monitor.Wait(m_queueSync); 63 Monitor.Wait(m_queueSync);
64 } 64 }
@@ -76,9 +76,10 @@ namespace OpenSim.Framework
76 { 76 {
77 lock (m_queueSync) 77 lock (m_queueSync)
78 { 78 {
79 if (m_queue.Count < 1 && m_pqueue.Count < 1) 79 bool success = true;
80 while (m_queue.Count < 1 && m_pqueue.Count < 1 && success)
80 { 81 {
81 Monitor.Wait(m_queueSync, msTimeout); 82 success = Monitor.Wait(m_queueSync, msTimeout);
82 } 83 }
83 84
84 if (m_pqueue.Count > 0) 85 if (m_pqueue.Count > 0)
@@ -89,8 +90,17 @@ namespace OpenSim.Framework
89 } 90 }
90 } 91 }
91 92
93 /// <summary>
94 /// Indicate whether this queue contains the given item.
95 /// </summary>
96 /// <remarks>
97 /// This method is not thread-safe. Do not rely on the result without consistent external locking.
98 /// </remarks>
92 public bool Contains(T item) 99 public bool Contains(T item)
93 { 100 {
101 if (m_queue.Count < 1 && m_pqueue.Count < 1)
102 return false;
103
94 lock (m_queueSync) 104 lock (m_queueSync)
95 { 105 {
96 if (m_pqueue.Contains(item)) 106 if (m_pqueue.Contains(item))
@@ -99,16 +109,28 @@ namespace OpenSim.Framework
99 } 109 }
100 } 110 }
101 111
112 /// <summary>
113 /// Return a count of the number of requests on this queue.
114 /// </summary>
115 /// <remarks>
116 /// This method is not thread-safe. Do not rely on the result without consistent external locking.
117 /// </remarks>
102 public int Count() 118 public int Count()
103 { 119 {
104 lock (m_queueSync) 120 return m_queue.Count + m_pqueue.Count;
105 {
106 return m_queue.Count+m_pqueue.Count;
107 }
108 } 121 }
109 122
123 /// <summary>
124 /// Return the array of items on this queue.
125 /// </summary>
126 /// <remarks>
127 /// This method is not thread-safe. Do not rely on the result without consistent external locking.
128 /// </remarks>
110 public T[] GetQueueArray() 129 public T[] GetQueueArray()
111 { 130 {
131 if (m_queue.Count < 1 && m_pqueue.Count < 1)
132 return new T[0];
133
112 lock (m_queueSync) 134 lock (m_queueSync)
113 { 135 {
114 return m_queue.ToArray(); 136 return m_queue.ToArray();
diff --git a/OpenSim/Framework/CachedTextureEventArg.cs b/OpenSim/Framework/CachedTextureEventArg.cs
new file mode 100644
index 0000000..239fc56
--- /dev/null
+++ b/OpenSim/Framework/CachedTextureEventArg.cs
@@ -0,0 +1,46 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Text;
30using OpenMetaverse;
31
32namespace OpenSim.Framework
33{
34 public class CachedTextureRequestArg
35 {
36 public int BakedTextureIndex;
37 public UUID WearableHashID;
38 }
39
40 public class CachedTextureResponseArg
41 {
42 public int BakedTextureIndex;
43 public UUID BakedTextureID;
44 public String HostName;
45 }
46}
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index 8c32734..2a8e67d 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -171,9 +171,10 @@ namespace OpenSim.Framework
171 /// Soon to be decommissioned 171 /// Soon to be decommissioned
172 /// </summary> 172 /// </summary>
173 /// <param name="cAgent"></param> 173 /// <param name="cAgent"></param>
174 public void CopyFrom(ChildAgentDataUpdate cAgent) 174 public void CopyFrom(ChildAgentDataUpdate cAgent, UUID sid)
175 { 175 {
176 AgentID = new UUID(cAgent.AgentID); 176 AgentID = new UUID(cAgent.AgentID);
177 SessionID = sid;
177 178
178 // next: ??? 179 // next: ???
179 Size = new Vector3(); 180 Size = new Vector3();
@@ -291,7 +292,13 @@ namespace OpenSim.Framework
291 public Vector3 AtAxis; 292 public Vector3 AtAxis;
292 public Vector3 LeftAxis; 293 public Vector3 LeftAxis;
293 public Vector3 UpAxis; 294 public Vector3 UpAxis;
294 public bool ChangedGrid; 295
296 /// <summary>
297 /// Signal on a V2 teleport that Scene.IncomingChildAgentDataUpdate(AgentData ad) should wait for the
298 /// scene presence to become root (triggered when the viewer sends a CompleteAgentMovement UDP packet after
299 /// establishing the connection triggered by it's receipt of a TeleportFinish EQ message).
300 /// </summary>
301 public bool SenderWantsToWaitForRoot;
295 302
296 public float Far; 303 public float Far;
297 public float Aspect; 304 public float Aspect;
@@ -362,8 +369,9 @@ namespace OpenSim.Framework
362 args["left_axis"] = OSD.FromString(LeftAxis.ToString()); 369 args["left_axis"] = OSD.FromString(LeftAxis.ToString());
363 args["up_axis"] = OSD.FromString(UpAxis.ToString()); 370 args["up_axis"] = OSD.FromString(UpAxis.ToString());
364 371
365 372 //backwards compatibility
366 args["changed_grid"] = OSD.FromBoolean(ChangedGrid); 373 args["changed_grid"] = OSD.FromBoolean(SenderWantsToWaitForRoot);
374 args["wait_for_root"] = OSD.FromBoolean(SenderWantsToWaitForRoot);
367 args["far"] = OSD.FromReal(Far); 375 args["far"] = OSD.FromReal(Far);
368 args["aspect"] = OSD.FromReal(Aspect); 376 args["aspect"] = OSD.FromReal(Aspect);
369 377
@@ -536,8 +544,8 @@ namespace OpenSim.Framework
536 if (args["up_axis"] != null) 544 if (args["up_axis"] != null)
537 Vector3.TryParse(args["up_axis"].AsString(), out AtAxis); 545 Vector3.TryParse(args["up_axis"].AsString(), out AtAxis);
538 546
539 if (args["changed_grid"] != null) 547 if (args.ContainsKey("wait_for_root") && args["wait_for_root"] != null)
540 ChangedGrid = args["changed_grid"].AsBoolean(); 548 SenderWantsToWaitForRoot = args["wait_for_root"].AsBoolean();
541 549
542 if (args["far"] != null) 550 if (args["far"] != null)
543 Far = (float)(args["far"].AsReal()); 551 Far = (float)(args["far"].AsReal());
diff --git a/OpenSim/Framework/ClientInfo.cs b/OpenSim/Framework/ClientInfo.cs
index 62acb70..9021315 100644
--- a/OpenSim/Framework/ClientInfo.cs
+++ b/OpenSim/Framework/ClientInfo.cs
@@ -33,12 +33,13 @@ namespace OpenSim.Framework
33{ 33{
34 public class ClientInfo 34 public class ClientInfo
35 { 35 {
36 public AgentCircuitData agentcircuit; 36 public readonly DateTime StartedTime = DateTime.Now;
37 public AgentCircuitData agentcircuit = null;
37 38
38 public Dictionary<uint, byte[]> needAck; 39 public Dictionary<uint, byte[]> needAck;
39 40
40 public List<byte[]> out_packets; 41 public List<byte[]> out_packets = new List<byte[]>();
41 public Dictionary<uint, uint> pendingAcks; 42 public Dictionary<uint, uint> pendingAcks = new Dictionary<uint,uint>();
42 public EndPoint proxyEP; 43 public EndPoint proxyEP;
43 44
44 public uint sequence; 45 public uint sequence;
@@ -53,5 +54,9 @@ namespace OpenSim.Framework
53 public int assetThrottle; 54 public int assetThrottle;
54 public int textureThrottle; 55 public int textureThrottle;
55 public int totalThrottle; 56 public int totalThrottle;
57
58 public Dictionary<string, int> SyncRequests = new Dictionary<string,int>();
59 public Dictionary<string, int> AsyncRequests = new Dictionary<string,int>();
60 public Dictionary<string, int> GenericRequests = new Dictionary<string,int>();
56 } 61 }
57} 62}
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs
index 97a86a8..794bfaf 100644
--- a/OpenSim/Framework/Console/ConsoleUtil.cs
+++ b/OpenSim/Framework/Console/ConsoleUtil.cs
@@ -156,12 +156,32 @@ namespace OpenSim.Framework.Console
156 } 156 }
157 157
158 /// <summary> 158 /// <summary>
159 /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 159 /// Convert a console integer to an int, automatically complaining if a console is given.
160 /// </summary> 160 /// </summary>
161 /// <param name='console'>Can be null if no console is available.</param> 161 /// <param name='console'>Can be null if no console is available.</param>
162 /// <param name='rawConsoleVector'>/param> 162 /// <param name='rawConsoleVector'>/param>
163 /// <param name='vector'></param> 163 /// <param name='vector'></param>
164 /// <returns></returns> 164 /// <returns></returns>
165 public static bool TryParseConsoleBool(ICommandConsole console, string rawConsoleString, out bool b)
166 {
167 if (!bool.TryParse(rawConsoleString, out b))
168 {
169 if (console != null)
170 console.OutputFormat("ERROR: {0} is not a true or false value", rawConsoleString);
171
172 return false;
173 }
174
175 return true;
176 }
177
178 /// <summary>
179 /// Convert a console integer to an int, automatically complaining if a console is given.
180 /// </summary>
181 /// <param name='console'>Can be null if no console is available.</param>
182 /// <param name='rawConsoleInt'>/param>
183 /// <param name='i'></param>
184 /// <returns></returns>
165 public static bool TryParseConsoleInt(ICommandConsole console, string rawConsoleInt, out int i) 185 public static bool TryParseConsoleInt(ICommandConsole console, string rawConsoleInt, out int i)
166 { 186 {
167 if (!int.TryParse(rawConsoleInt, out i)) 187 if (!int.TryParse(rawConsoleInt, out i))
@@ -174,6 +194,31 @@ namespace OpenSim.Framework.Console
174 194
175 return true; 195 return true;
176 } 196 }
197
198 /// <summary>
199 /// Convert a console integer to a natural int, automatically complaining if a console is given.
200 /// </summary>
201 /// <param name='console'>Can be null if no console is available.</param>
202 /// <param name='rawConsoleInt'>/param>
203 /// <param name='i'></param>
204 /// <returns></returns>
205 public static bool TryParseConsoleNaturalInt(ICommandConsole console, string rawConsoleInt, out int i)
206 {
207 if (TryParseConsoleInt(console, rawConsoleInt, out i))
208 {
209 if (i < 0)
210 {
211 if (console != null)
212 console.OutputFormat("ERROR: {0} is not a positive integer", rawConsoleInt);
213
214 return false;
215 }
216
217 return true;
218 }
219
220 return false;
221 }
177 222
178 /// <summary> 223 /// <summary>
179 /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 224 /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs
index d41481f..a967db6 100644
--- a/OpenSim/Framework/Console/LocalConsole.cs
+++ b/OpenSim/Framework/Console/LocalConsole.cs
@@ -426,6 +426,21 @@ namespace OpenSim.Framework.Console
426 System.Console.Write("{0}", prompt); 426 System.Console.Write("{0}", prompt);
427 427
428 break; 428 break;
429 case ConsoleKey.Delete:
430 if (m_cursorXPosition == m_commandLine.Length)
431 break;
432
433 m_commandLine.Remove(m_cursorXPosition, 1);
434
435 SetCursorLeft(0);
436 m_cursorYPosition = SetCursorTop(m_cursorYPosition);
437
438 if (m_echo)
439 System.Console.Write("{0}{1} ", prompt, m_commandLine);
440 else
441 System.Console.Write("{0}", prompt);
442
443 break;
429 case ConsoleKey.End: 444 case ConsoleKey.End:
430 m_cursorXPosition = m_commandLine.Length; 445 m_cursorXPosition = m_commandLine.Length;
431 break; 446 break;
diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs
index 3e3c2b3..8ad7b0d 100644
--- a/OpenSim/Framework/Console/RemoteConsole.cs
+++ b/OpenSim/Framework/Console/RemoteConsole.cs
@@ -234,7 +234,7 @@ namespace OpenSim.Framework.Console
234 string uri = "/ReadResponses/" + sessionID.ToString() + "/"; 234 string uri = "/ReadResponses/" + sessionID.ToString() + "/";
235 235
236 m_Server.AddPollServiceHTTPHandler( 236 m_Server.AddPollServiceHTTPHandler(
237 uri, new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout 237 uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout
238 238
239 XmlDocument xmldoc = new XmlDocument(); 239 XmlDocument xmldoc = new XmlDocument();
240 XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, 240 XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
diff --git a/OpenSim/Framework/DAMap.cs b/OpenSim/Framework/DAMap.cs
index df4a6bc..4995a92 100644
--- a/OpenSim/Framework/DAMap.cs
+++ b/OpenSim/Framework/DAMap.cs
@@ -29,10 +29,12 @@ using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.IO; 31using System.IO;
32using System.Reflection;
32using System.Text; 33using System.Text;
33using System.Xml; 34using System.Xml;
34using System.Xml.Schema; 35using System.Xml.Schema;
35using System.Xml.Serialization; 36using System.Xml.Serialization;
37using log4net;
36using OpenMetaverse; 38using OpenMetaverse;
37using OpenMetaverse.StructuredData; 39using OpenMetaverse.StructuredData;
38 40
@@ -48,13 +50,20 @@ namespace OpenSim.Framework
48 /// within their data store. However, avoid storing large amounts of data because that 50 /// within their data store. However, avoid storing large amounts of data because that
49 /// would slow down database access. 51 /// would slow down database access.
50 /// </remarks> 52 /// </remarks>
51 public class DAMap : IDictionary<string, OSDMap>, IXmlSerializable 53 public class DAMap : IXmlSerializable
52 { 54 {
53 private static readonly int MIN_STORE_NAME_LENGTH = 4; 55// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54 56
55 protected OSDMap m_map; 57 private static readonly int MIN_NAMESPACE_LENGTH = 4;
56 58
57 public DAMap() { m_map = new OSDMap(); } 59 private OSDMap m_map = new OSDMap();
60
61 // WARNING: this is temporary for experimentation only, it will be removed!!!!
62 public OSDMap TopLevelMap
63 {
64 get { return m_map; }
65 set { m_map = value; }
66 }
58 67
59 public XmlSchema GetSchema() { return null; } 68 public XmlSchema GetSchema() { return null; }
60 69
@@ -64,39 +73,34 @@ namespace OpenSim.Framework
64 map.ReadXml(rawXml); 73 map.ReadXml(rawXml);
65 return map; 74 return map;
66 } 75 }
67 76
77 public void ReadXml(XmlReader reader)
78 {
79 ReadXml(reader.ReadInnerXml());
80 }
81
68 public void ReadXml(string rawXml) 82 public void ReadXml(string rawXml)
69 { 83 {
70 // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); 84 // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml);
71 85
72 lock (this) 86 lock (this)
87 {
73 m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); 88 m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml);
89 SanitiseMap(this);
90 }
74 } 91 }
75 92
76 // WARNING: this is temporary for experimentation only, it will be removed!!!! 93 public void WriteXml(XmlWriter writer)
77 public OSDMap TopLevelMap
78 { 94 {
79 get { return m_map; } 95 writer.WriteRaw(ToXml());
80 set { m_map = value; }
81 } 96 }
82
83 97
84 public void ReadXml(XmlReader reader)
85 {
86 ReadXml(reader.ReadInnerXml());
87 }
88
89 public string ToXml() 98 public string ToXml()
90 { 99 {
91 lock (this) 100 lock (this)
92 return OSDParser.SerializeLLSDXmlString(m_map); 101 return OSDParser.SerializeLLSDXmlString(m_map);
93 } 102 }
94 103
95 public void WriteXml(XmlWriter writer)
96 {
97 writer.WriteRaw(ToXml());
98 }
99
100 public void CopyFrom(DAMap other) 104 public void CopyFrom(DAMap other)
101 { 105 {
102 // Deep copy 106 // Deep copy
@@ -104,7 +108,7 @@ namespace OpenSim.Framework
104 string data = null; 108 string data = null;
105 lock (other) 109 lock (other)
106 { 110 {
107 if (other.Count > 0) 111 if (other.CountNamespaces > 0)
108 { 112 {
109 data = OSDParser.SerializeLLSDXmlString(other.m_map); 113 data = OSDParser.SerializeLLSDXmlString(other.m_map);
110 } 114 }
@@ -120,59 +124,132 @@ namespace OpenSim.Framework
120 } 124 }
121 125
122 /// <summary> 126 /// <summary>
123 /// Returns the number of data stores. 127 /// Sanitise the map to remove any namespaces or stores that are not OSDMap.
124 /// </summary> 128 /// </summary>
125 public int Count { get { lock (this) { return m_map.Count; } } } 129 /// <param name='map'>
126 130 /// </param>
127 public bool IsReadOnly { get { return false; } } 131 public static void SanitiseMap(DAMap daMap)
128 132 {
133 List<string> keysToRemove = null;
134
135 OSDMap namespacesMap = daMap.m_map;
136
137 foreach (string key in namespacesMap.Keys)
138 {
139// Console.WriteLine("Processing ns {0}", key);
140 if (!(namespacesMap[key] is OSDMap))
141 {
142 if (keysToRemove == null)
143 keysToRemove = new List<string>();
144
145 keysToRemove.Add(key);
146 }
147 }
148
149 if (keysToRemove != null)
150 {
151 foreach (string key in keysToRemove)
152 {
153// Console.WriteLine ("Removing bad ns {0}", key);
154 namespacesMap.Remove(key);
155 }
156 }
157
158 foreach (OSD nsOsd in namespacesMap.Values)
159 {
160 OSDMap nsOsdMap = (OSDMap)nsOsd;
161 keysToRemove = null;
162
163 foreach (string key in nsOsdMap.Keys)
164 {
165 if (!(nsOsdMap[key] is OSDMap))
166 {
167 if (keysToRemove == null)
168 keysToRemove = new List<string>();
169
170 keysToRemove.Add(key);
171 }
172 }
173
174 if (keysToRemove != null)
175 foreach (string key in keysToRemove)
176 nsOsdMap.Remove(key);
177 }
178 }
179
129 /// <summary> 180 /// <summary>
130 /// Returns the names of the data stores. 181 /// Get the number of namespaces
131 /// </summary> 182 /// </summary>
132 public ICollection<string> Keys { get { lock (this) { return m_map.Keys; } } } 183 public int CountNamespaces { get { lock (this) { return m_map.Count; } } }
133 184
134 /// <summary> 185 /// <summary>
135 /// Returns all the data stores. 186 /// Get the number of stores.
136 /// </summary> 187 /// </summary>
137 public ICollection<OSDMap> Values 188 public int CountStores
138 { 189 {
139 get 190 get
140 { 191 {
192 int count = 0;
193
141 lock (this) 194 lock (this)
142 { 195 {
143 List<OSDMap> stores = new List<OSDMap>(m_map.Count); 196 foreach (OSD osdNamespace in m_map)
144 foreach (OSD llsd in m_map.Values) 197 {
145 stores.Add((OSDMap)llsd); 198 count += ((OSDMap)osdNamespace).Count;
146 return stores; 199 }
147 } 200 }
201
202 return count;
148 } 203 }
149 } 204 }
150 205
151 /// <summary> 206 /// <summary>
152 /// Gets or sets one data store. 207 /// Retrieve a Dynamic Attribute store
153 /// </summary> 208 /// </summary>
154 /// <param name="key">Store name</param> 209 /// <param name="ns">namespace for the store - use "OpenSim" for in-core modules</param>
155 /// <returns></returns> 210 /// <param name="storeName">name of the store within the namespace</param>
156 public OSDMap this[string key] 211 /// <returns>an OSDMap representing the stored data, or null if not found</returns>
157 { 212 public OSDMap GetStore(string ns, string storeName)
158 get 213 {
159 { 214 OSD namespaceOsd;
160 OSD llsd; 215
161 216 lock (this)
162 lock (this) 217 {
218 if (m_map.TryGetValue(ns, out namespaceOsd))
163 { 219 {
164 if (m_map.TryGetValue(key, out llsd)) 220 OSD store;
165 return (OSDMap)llsd; 221
166 else 222 if (((OSDMap)namespaceOsd).TryGetValue(storeName, out store))
167 return null; 223 return (OSDMap)store;
168 } 224 }
169 } 225 }
170 226
171 set 227 return null;
228 }
229
230 /// <summary>
231 /// Saves a Dynamic attribute store
232 /// </summary>
233 /// <param name="ns">namespace for the store - use "OpenSim" for in-core modules</param>
234 /// <param name="storeName">name of the store within the namespace</param>
235 /// <param name="store">an OSDMap representing the data to store</param>
236 public void SetStore(string ns, string storeName, OSDMap store)
237 {
238 ValidateNamespace(ns);
239 OSDMap nsMap;
240
241 lock (this)
172 { 242 {
173 ValidateKey(key); 243 if (!m_map.ContainsKey(ns))
174 lock (this) 244 {
175 m_map[key] = value; 245 nsMap = new OSDMap();
246 m_map[ns] = nsMap;
247 }
248
249 nsMap = (OSDMap)m_map[ns];
250
251// m_log.DebugFormat("[DA MAP]: Setting store to {0}:{1}", ns, storeName);
252 nsMap[storeName] = store;
176 } 253 }
177 } 254 }
178 255
@@ -180,54 +257,46 @@ namespace OpenSim.Framework
180 /// Validate the key used for storing separate data stores. 257 /// Validate the key used for storing separate data stores.
181 /// </summary> 258 /// </summary>
182 /// <param name='key'></param> 259 /// <param name='key'></param>
183 public static void ValidateKey(string key) 260 public static void ValidateNamespace(string ns)
184 { 261 {
185 if (key.Length < MIN_STORE_NAME_LENGTH) 262 if (ns.Length < MIN_NAMESPACE_LENGTH)
186 throw new Exception("Minimum store name length is " + MIN_STORE_NAME_LENGTH); 263 throw new Exception("Minimum namespace length is " + MIN_NAMESPACE_LENGTH);
187 } 264 }
188 265
189 public bool ContainsKey(string key) 266 public bool ContainsStore(string ns, string storeName)
190 { 267 {
191 lock (this) 268 OSD namespaceOsd;
192 return m_map.ContainsKey(key);
193 }
194 269
195 public void Add(string key, OSDMap store)
196 {
197 ValidateKey(key);
198 lock (this)
199 m_map.Add(key, store);
200 }
201
202 public void Add(KeyValuePair<string, OSDMap> kvp)
203 {
204 ValidateKey(kvp.Key);
205 lock (this) 270 lock (this)
206 m_map.Add(kvp.Key, kvp.Value); 271 {
207 } 272 if (m_map.TryGetValue(ns, out namespaceOsd))
273 {
274 return ((OSDMap)namespaceOsd).ContainsKey(storeName);
275 }
276 }
208 277
209 public bool Remove(string key) 278 return false;
210 { 279 }
211 lock (this)
212 return m_map.Remove(key);
213 }
214 280
215 public bool TryGetValue(string key, out OSDMap store) 281 public bool TryGetStore(string ns, string storeName, out OSDMap store)
216 { 282 {
283 OSD namespaceOsd;
284
217 lock (this) 285 lock (this)
218 { 286 {
219 OSD llsd; 287 if (m_map.TryGetValue(ns, out namespaceOsd))
220 if (m_map.TryGetValue(key, out llsd))
221 {
222 store = (OSDMap)llsd;
223 return true;
224 }
225 else
226 { 288 {
227 store = null; 289 OSD storeOsd;
228 return false; 290
291 bool result = ((OSDMap)namespaceOsd).TryGetValue(storeName, out storeOsd);
292 store = (OSDMap)storeOsd;
293
294 return result;
229 } 295 }
230 } 296 }
297
298 store = null;
299 return false;
231 } 300 }
232 301
233 public void Clear() 302 public void Clear()
@@ -235,39 +304,25 @@ namespace OpenSim.Framework
235 lock (this) 304 lock (this)
236 m_map.Clear(); 305 m_map.Clear();
237 } 306 }
238
239 public bool Contains(KeyValuePair<string, OSDMap> kvp)
240 {
241 lock (this)
242 return m_map.ContainsKey(kvp.Key);
243 }
244
245 public void CopyTo(KeyValuePair<string, OSDMap>[] array, int index)
246 {
247 throw new NotImplementedException();
248 }
249 307
250 public bool Remove(KeyValuePair<string, OSDMap> kvp) 308 public bool RemoveStore(string ns, string storeName)
251 { 309 {
252 lock (this) 310 OSD namespaceOsd;
253 return m_map.Remove(kvp.Key);
254 }
255 311
256 public System.Collections.IDictionaryEnumerator GetEnumerator()
257 {
258 lock (this) 312 lock (this)
259 return m_map.GetEnumerator(); 313 {
260 } 314 if (m_map.TryGetValue(ns, out namespaceOsd))
315 {
316 OSDMap namespaceOsdMap = (OSDMap)namespaceOsd;
317 namespaceOsdMap.Remove(storeName);
261 318
262 IEnumerator<KeyValuePair<string, OSDMap>> IEnumerable<KeyValuePair<string, OSDMap>>.GetEnumerator() 319 // Don't keep empty namespaces around
263 { 320 if (namespaceOsdMap.Count <= 0)
264 return null; 321 m_map.Remove(ns);
265 } 322 }
323 }
266 324
267 IEnumerator IEnumerable.GetEnumerator() 325 return false;
268 { 326 }
269 lock (this)
270 return m_map.GetEnumerator();
271 }
272 } 327 }
273} \ No newline at end of file 328} \ No newline at end of file
diff --git a/OpenSim/Framework/DOMap.cs b/OpenSim/Framework/DOMap.cs
index 755e129..f5b650b 100644
--- a/OpenSim/Framework/DOMap.cs
+++ b/OpenSim/Framework/DOMap.cs
@@ -42,22 +42,22 @@ namespace OpenSim.Framework
42 /// This class stores and retrieves dynamic objects. 42 /// This class stores and retrieves dynamic objects.
43 /// </summary> 43 /// </summary>
44 /// <remarks> 44 /// <remarks>
45 /// Experimental - DO NOT USE. 45 /// Experimental - DO NOT USE. Does not yet have namespace support.
46 /// </remarks> 46 /// </remarks>
47 public class DOMap 47 public class DOMap
48 { 48 {
49 private IDictionary<string, object> m_map; 49 private IDictionary<string, object> m_map;
50 50
51 public void Add(string key, object dynObj) 51 public void Add(string ns, string objName, object dynObj)
52 { 52 {
53 DAMap.ValidateKey(key); 53 DAMap.ValidateNamespace(ns);
54 54
55 lock (this) 55 lock (this)
56 { 56 {
57 if (m_map == null) 57 if (m_map == null)
58 m_map = new Dictionary<string, object>(); 58 m_map = new Dictionary<string, object>();
59 59
60 m_map.Add(key, dynObj); 60 m_map.Add(objName, dynObj);
61 } 61 }
62 } 62 }
63 63
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs
index e03750b..5ddbd61 100644
--- a/OpenSim/Framework/EstateSettings.cs
+++ b/OpenSim/Framework/EstateSettings.cs
@@ -430,6 +430,5 @@ namespace OpenSim.Framework
430 { 430 {
431 return l_EstateGroups.Contains(groupID); 431 return l_EstateGroups.Contains(groupID);
432 } 432 }
433
434 } 433 }
435} 434}
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index ad3471a..22cc79d 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -65,6 +65,7 @@ namespace OpenSim.Framework
65 public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes); 65 public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes);
66 66
67 public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 AvSize, WearableCacheItem[] CacheItems); 67 public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 AvSize, WearableCacheItem[] CacheItems);
68 public delegate void CachedTextureRequest(IClientAPI remoteClient, int serial, List<CachedTextureRequestArg> cachedTextureRequest);
68 69
69 public delegate void StartAnim(IClientAPI remoteClient, UUID animID); 70 public delegate void StartAnim(IClientAPI remoteClient, UUID animID);
70 71
@@ -789,6 +790,7 @@ namespace OpenSim.Framework
789 event EstateChangeInfo OnEstateChangeInfo; 790 event EstateChangeInfo OnEstateChangeInfo;
790 event EstateManageTelehub OnEstateManageTelehub; 791 event EstateManageTelehub OnEstateManageTelehub;
791 // [Obsolete("LLClientView Specific.")] 792 // [Obsolete("LLClientView Specific.")]
793 event CachedTextureRequest OnCachedTextureRequest;
792 event SetAppearance OnSetAppearance; 794 event SetAppearance OnSetAppearance;
793 // [Obsolete("LLClientView Specific - Replace and rename OnAvatarUpdate. Difference from SetAppearance?")] 795 // [Obsolete("LLClientView Specific - Replace and rename OnAvatarUpdate. Difference from SetAppearance?")]
794 event AvatarNowWearing OnAvatarNowWearing; 796 event AvatarNowWearing OnAvatarNowWearing;
@@ -832,6 +834,8 @@ namespace OpenSim.Framework
832 /// </remarks> 834 /// </remarks>
833 event UpdateAgent OnAgentUpdate; 835 event UpdateAgent OnAgentUpdate;
834 836
837 event UpdateAgent OnAgentCameraUpdate;
838
835 event AgentRequestSit OnAgentRequestSit; 839 event AgentRequestSit OnAgentRequestSit;
836 event AgentSit OnAgentSit; 840 event AgentSit OnAgentSit;
837 event AvatarPickerRequest OnAvatarPickerRequest; 841 event AvatarPickerRequest OnAvatarPickerRequest;
@@ -1100,14 +1104,15 @@ namespace OpenSim.Framework
1100 /// <param name="textureEntry"></param> 1104 /// <param name="textureEntry"></param>
1101 void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry); 1105 void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry);
1102 1106
1107 void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures);
1108
1103 void SendStartPingCheck(byte seq); 1109 void SendStartPingCheck(byte seq);
1104 1110
1105 /// <summary> 1111 /// <summary>
1106 /// Tell the client that an object has been deleted 1112 /// Tell the client that an object has been deleted
1107 /// </summary> 1113 /// </summary>
1108 /// <param name="regionHandle"></param>
1109 /// <param name="localID"></param> 1114 /// <param name="localID"></param>
1110 void SendKillObject(ulong regionHandle, List<uint> localID); 1115 void SendKillObject(List<uint> localID);
1111 1116
1112 void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs); 1117 void SendAnimations(UUID[] animID, int[] seqs, UUID sourceAgentId, UUID[] objectIDs);
1113 void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args); 1118 void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args);
@@ -1486,7 +1491,7 @@ namespace OpenSim.Framework
1486 void SendChangeUserRights(UUID agentID, UUID friendID, int rights); 1491 void SendChangeUserRights(UUID agentID, UUID friendID, int rights);
1487 void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId); 1492 void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId);
1488 1493
1489 void StopFlying(ISceneEntity presence); 1494 void SendAgentTerseUpdate(ISceneEntity presence);
1490 1495
1491 void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data); 1496 void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data);
1492 } 1497 }
diff --git a/OpenSim/Framework/IPeople.cs b/OpenSim/Framework/IPeople.cs
new file mode 100644
index 0000000..b88e103
--- /dev/null
+++ b/OpenSim/Framework/IPeople.cs
@@ -0,0 +1,47 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using OpenMetaverse;
31
32namespace OpenSim.Framework
33{
34 public class UserData
35 {
36 public UUID Id { get; set; }
37 public string FirstName { get; set; }
38 public string LastName { get; set; }
39 public string HomeURL { get; set; }
40 public Dictionary<string, object> ServerURLs { get; set; }
41 }
42
43 public interface IPeople
44 {
45 List<UserData> GetUserData(string query, int page_size, int page_number);
46 }
47} \ No newline at end of file
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs
index 87ec99e..8164f41 100644
--- a/OpenSim/Framework/IScene.cs
+++ b/OpenSim/Framework/IScene.cs
@@ -136,5 +136,10 @@ namespace OpenSim.Framework
136 ISceneObject DeserializeObject(string representation); 136 ISceneObject DeserializeObject(string representation);
137 137
138 bool CheckClient(UUID agentID, System.Net.IPEndPoint ep); 138 bool CheckClient(UUID agentID, System.Net.IPEndPoint ep);
139
140 /// <summary>
141 /// Start the scene and associated scripts within it.
142 /// </summary>
143 void Start();
139 } 144 }
140} 145} \ No newline at end of file
diff --git a/OpenSim/Framework/Location.cs b/OpenSim/Framework/Location.cs
index 9504e03..0b88834 100644
--- a/OpenSim/Framework/Location.cs
+++ b/OpenSim/Framework/Location.cs
@@ -33,10 +33,10 @@ namespace OpenSim.Framework
33 [Serializable] 33 [Serializable]
34 public class Location : ICloneable 34 public class Location : ICloneable
35 { 35 {
36 private readonly int m_x; 36 private readonly uint m_x;
37 private readonly int m_y; 37 private readonly uint m_y;
38 38
39 public Location(int x, int y) 39 public Location(uint x, uint y)
40 { 40 {
41 m_x = x; 41 m_x = x;
42 m_y = y; 42 m_y = y;
@@ -44,21 +44,21 @@ namespace OpenSim.Framework
44 44
45 public Location(ulong regionHandle) 45 public Location(ulong regionHandle)
46 { 46 {
47 m_x = (int) regionHandle; 47 m_x = (uint)(regionHandle >> 32);
48 m_y = (int) (regionHandle >> 32); 48 m_y = (uint)(regionHandle & (ulong)uint.MaxValue);
49 } 49 }
50 50
51 public ulong RegionHandle 51 public ulong RegionHandle
52 { 52 {
53 get { return Utils.UIntsToLong((uint)m_x, (uint)m_y); } 53 get { return Utils.UIntsToLong(m_x, m_y); }
54 } 54 }
55 55
56 public int X 56 public uint X
57 { 57 {
58 get { return m_x; } 58 get { return m_x; }
59 } 59 }
60 60
61 public int Y 61 public uint Y
62 { 62 {
63 get { return m_y; } 63 get { return m_y; }
64 } 64 }
diff --git a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
index 23dba09..96536e8 100644
--- a/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
+++ b/OpenSim/Framework/Monitoring/BaseStatsCollector.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -44,16 +44,16 @@ namespace OpenSim.Framework.Monitoring
44 sb.Append("MEMORY STATISTICS"); 44 sb.Append("MEMORY STATISTICS");
45 sb.Append(Environment.NewLine); 45 sb.Append(Environment.NewLine);
46 sb.AppendFormat( 46 sb.AppendFormat(
47 "Allocated to OpenSim objects: {0} MB\n", 47 "Heap allocated to OpenSim : {0} MB\n",
48 Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0)); 48 Math.Round(GC.GetTotalMemory(false) / 1024.0 / 1024.0));
49 49
50 sb.AppendFormat( 50 sb.AppendFormat(
51 "OpenSim last object memory churn : {0} MB/s\n", 51 "Last heap allocation rate : {0} MB/s\n",
52 Math.Round((MemoryWatchdog.LastMemoryChurn * 1000) / 1024.0 / 1024, 3)); 52 Math.Round((MemoryWatchdog.LastHeapAllocationRate * 1000) / 1024.0 / 1024, 3));
53 53
54 sb.AppendFormat( 54 sb.AppendFormat(
55 "OpenSim average object memory churn : {0} MB/s\n", 55 "Average heap allocation rate: {0} MB/s\n",
56 Math.Round((MemoryWatchdog.AverageMemoryChurn * 1000) / 1024.0 / 1024, 3)); 56 Math.Round((MemoryWatchdog.AverageHeapAllocationRate * 1000) / 1024.0 / 1024, 3));
57 57
58 Process myprocess = Process.GetCurrentProcess(); 58 Process myprocess = Process.GetCurrentProcess();
59 if (!myprocess.HasExited) 59 if (!myprocess.HasExited)
diff --git a/OpenSim/Framework/Monitoring/Checks/Check.cs b/OpenSim/Framework/Monitoring/Checks/Check.cs
new file mode 100644
index 0000000..594386a
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/Checks/Check.cs
@@ -0,0 +1,118 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Text;
30
31namespace OpenSim.Framework.Monitoring
32{
33 public class Check
34 {
35// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
36
37 public static readonly char[] DisallowedShortNameCharacters = { '.' };
38
39 /// <summary>
40 /// Category of this stat (e.g. cache, scene, etc).
41 /// </summary>
42 public string Category { get; private set; }
43
44 /// <summary>
45 /// Containing name for this stat.
46 /// FIXME: In the case of a scene, this is currently the scene name (though this leaves
47 /// us with a to-be-resolved problem of non-unique region names).
48 /// </summary>
49 /// <value>
50 /// The container.
51 /// </value>
52 public string Container { get; private set; }
53
54 /// <summary>
55 /// Action used to check whether alert should go off.
56 /// </summary>
57 /// <remarks>
58 /// Should return true if check passes. False otherwise.
59 /// </remarks>
60 public Func<Check, bool> CheckFunc { get; private set; }
61
62 /// <summary>
63 /// Message from the last failure, if any. If there is no message or no failure then will be null.
64 /// </summary>
65 /// <remarks>
66 /// Should be set by the CheckFunc when applicable.
67 /// </remarks>
68 public string LastFailureMessage { get; set; }
69
70 public StatVerbosity Verbosity { get; private set; }
71 public string ShortName { get; private set; }
72 public string Name { get; private set; }
73 public string Description { get; private set; }
74
75 public Check(
76 string shortName,
77 string name,
78 string description,
79 string category,
80 string container,
81 Func<Check, bool> checkFunc,
82 StatVerbosity verbosity)
83 {
84 if (ChecksManager.SubCommands.Contains(category))
85 throw new Exception(
86 string.Format("Alert cannot be in category '{0}' since this is reserved for a subcommand", category));
87
88 foreach (char c in DisallowedShortNameCharacters)
89 {
90 if (shortName.IndexOf(c) != -1)
91 throw new Exception(string.Format("Alert name {0} cannot contain character {1}", shortName, c));
92 }
93
94 ShortName = shortName;
95 Name = name;
96 Description = description;
97 Category = category;
98 Container = container;
99 CheckFunc = checkFunc;
100 Verbosity = verbosity;
101 }
102
103 public bool CheckIt()
104 {
105 return CheckFunc(this);
106 }
107
108 public virtual string ToConsoleString()
109 {
110 return string.Format(
111 "{0}.{1}.{2} - {3}",
112 Category,
113 Container,
114 ShortName,
115 Description);
116 }
117 }
118} \ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/ChecksManager.cs b/OpenSim/Framework/Monitoring/ChecksManager.cs
new file mode 100644
index 0000000..e4a7f8c
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/ChecksManager.cs
@@ -0,0 +1,262 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Reflection;
32using System.Text;
33using log4net;
34
35namespace OpenSim.Framework.Monitoring
36{
37 /// <summary>
38 /// Static class used to register/deregister checks on runtime conditions.
39 /// </summary>
40 public static class ChecksManager
41 {
42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 // Subcommand used to list other stats.
45 public const string ListSubCommand = "list";
46
47 // All subcommands
48 public static HashSet<string> SubCommands = new HashSet<string> { ListSubCommand };
49
50 /// <summary>
51 /// Checks categorized by category/container/shortname
52 /// </summary>
53 /// <remarks>
54 /// Do not add or remove directly from this dictionary.
55 /// </remarks>
56 public static SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Check>>> RegisteredChecks
57 = new SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Check>>>();
58
59 public static void RegisterConsoleCommands(ICommandConsole console)
60 {
61 console.Commands.AddCommand(
62 "General",
63 false,
64 "show checks",
65 "show checks",
66 "Show checks configured for this server",
67 "If no argument is specified then info on all checks will be shown.\n"
68 + "'list' argument will show check categories.\n"
69 + "THIS FACILITY IS EXPERIMENTAL",
70 HandleShowchecksCommand);
71 }
72
73 public static void HandleShowchecksCommand(string module, string[] cmd)
74 {
75 ICommandConsole con = MainConsole.Instance;
76
77 if (cmd.Length > 2)
78 {
79 foreach (string name in cmd.Skip(2))
80 {
81 string[] components = name.Split('.');
82
83 string categoryName = components[0];
84// string containerName = components.Length > 1 ? components[1] : null;
85
86 if (categoryName == ListSubCommand)
87 {
88 con.Output("check categories available are:");
89
90 foreach (string category in RegisteredChecks.Keys)
91 con.OutputFormat(" {0}", category);
92 }
93// else
94// {
95// SortedDictionary<string, SortedDictionary<string, Check>> category;
96// if (!Registeredchecks.TryGetValue(categoryName, out category))
97// {
98// con.OutputFormat("No such category as {0}", categoryName);
99// }
100// else
101// {
102// if (String.IsNullOrEmpty(containerName))
103// {
104// OutputConfiguredToConsole(con, category);
105// }
106// else
107// {
108// SortedDictionary<string, Check> container;
109// if (category.TryGetValue(containerName, out container))
110// {
111// OutputContainerChecksToConsole(con, container);
112// }
113// else
114// {
115// con.OutputFormat("No such container {0} in category {1}", containerName, categoryName);
116// }
117// }
118// }
119// }
120 }
121 }
122 else
123 {
124 OutputAllChecksToConsole(con);
125 }
126 }
127
128 /// <summary>
129 /// Registers a statistic.
130 /// </summary>
131 /// <param name='stat'></param>
132 /// <returns></returns>
133 public static bool RegisterCheck(Check check)
134 {
135 SortedDictionary<string, SortedDictionary<string, Check>> category = null, newCategory;
136 SortedDictionary<string, Check> container = null, newContainer;
137
138 lock (RegisteredChecks)
139 {
140 // Check name is not unique across category/container/shortname key.
141 // XXX: For now just return false. This is to avoid problems in regression tests where all tests
142 // in a class are run in the same instance of the VM.
143 if (TryGetCheckParents(check, out category, out container))
144 return false;
145
146 // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed.
147 // This means that we don't need to lock or copy them on iteration, which will be a much more
148 // common operation after startup.
149 if (container != null)
150 newContainer = new SortedDictionary<string, Check>(container);
151 else
152 newContainer = new SortedDictionary<string, Check>();
153
154 if (category != null)
155 newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>(category);
156 else
157 newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>();
158
159 newContainer[check.ShortName] = check;
160 newCategory[check.Container] = newContainer;
161 RegisteredChecks[check.Category] = newCategory;
162 }
163
164 return true;
165 }
166
167 /// <summary>
168 /// Deregister an check
169 /// </summary>>
170 /// <param name='stat'></param>
171 /// <returns></returns>
172 public static bool DeregisterCheck(Check check)
173 {
174 SortedDictionary<string, SortedDictionary<string, Check>> category = null, newCategory;
175 SortedDictionary<string, Check> container = null, newContainer;
176
177 lock (RegisteredChecks)
178 {
179 if (!TryGetCheckParents(check, out category, out container))
180 return false;
181
182 newContainer = new SortedDictionary<string, Check>(container);
183 newContainer.Remove(check.ShortName);
184
185 newCategory = new SortedDictionary<string, SortedDictionary<string, Check>>(category);
186 newCategory.Remove(check.Container);
187
188 newCategory[check.Container] = newContainer;
189 RegisteredChecks[check.Category] = newCategory;
190
191 return true;
192 }
193 }
194
195 public static bool TryGetCheckParents(
196 Check check,
197 out SortedDictionary<string, SortedDictionary<string, Check>> category,
198 out SortedDictionary<string, Check> container)
199 {
200 category = null;
201 container = null;
202
203 lock (RegisteredChecks)
204 {
205 if (RegisteredChecks.TryGetValue(check.Category, out category))
206 {
207 if (category.TryGetValue(check.Container, out container))
208 {
209 if (container.ContainsKey(check.ShortName))
210 return true;
211 }
212 }
213 }
214
215 return false;
216 }
217
218 public static void CheckChecks()
219 {
220 lock (RegisteredChecks)
221 {
222 foreach (SortedDictionary<string, SortedDictionary<string, Check>> category in RegisteredChecks.Values)
223 {
224 foreach (SortedDictionary<string, Check> container in category.Values)
225 {
226 foreach (Check check in container.Values)
227 {
228 if (!check.CheckIt())
229 m_log.WarnFormat(
230 "[CHECKS MANAGER]: Check {0}.{1}.{2} failed with message {3}", check.Category, check.Container, check.ShortName, check.LastFailureMessage);
231 }
232 }
233 }
234 }
235 }
236
237 private static void OutputAllChecksToConsole(ICommandConsole con)
238 {
239 foreach (var category in RegisteredChecks.Values)
240 {
241 OutputCategoryChecksToConsole(con, category);
242 }
243 }
244
245 private static void OutputCategoryChecksToConsole(
246 ICommandConsole con, SortedDictionary<string, SortedDictionary<string, Check>> category)
247 {
248 foreach (var container in category.Values)
249 {
250 OutputContainerChecksToConsole(con, container);
251 }
252 }
253
254 private static void OutputContainerChecksToConsole(ICommandConsole con, SortedDictionary<string, Check> container)
255 {
256 foreach (Check check in container.Values)
257 {
258 con.Output(check.ToConsoleString());
259 }
260 }
261 }
262} \ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
index c6010cd..c474622 100644
--- a/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
+++ b/OpenSim/Framework/Monitoring/MemoryWatchdog.cs
@@ -60,17 +60,17 @@ namespace OpenSim.Framework.Monitoring
60 private static bool m_enabled; 60 private static bool m_enabled;
61 61
62 /// <summary> 62 /// <summary>
63 /// Last memory churn in bytes per millisecond. 63 /// Average heap allocation rate in bytes per millisecond.
64 /// </summary> 64 /// </summary>
65 public static double AverageMemoryChurn 65 public static double AverageHeapAllocationRate
66 { 66 {
67 get { if (m_samples.Count > 0) return m_samples.Average(); else return 0; } 67 get { if (m_samples.Count > 0) return m_samples.Average(); else return 0; }
68 } 68 }
69 69
70 /// <summary> 70 /// <summary>
71 /// Average memory churn in bytes per millisecond. 71 /// Last heap allocation in bytes
72 /// </summary> 72 /// </summary>
73 public static double LastMemoryChurn 73 public static double LastHeapAllocationRate
74 { 74 {
75 get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; } 75 get { if (m_samples.Count > 0) return m_samples.Last(); else return 0; }
76 } 76 }
diff --git a/OpenSim/Framework/Monitoring/ServerStatsCollector.cs b/OpenSim/Framework/Monitoring/ServerStatsCollector.cs
new file mode 100644
index 0000000..ac0f0bc
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/ServerStatsCollector.cs
@@ -0,0 +1,349 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Diagnostics;
31using System.Linq;
32using System.Net.NetworkInformation;
33using System.Text;
34using System.Threading;
35using log4net;
36using Nini.Config;
37using OpenMetaverse.StructuredData;
38using OpenSim.Framework;
39
40namespace OpenSim.Framework.Monitoring
41{
42 public class ServerStatsCollector
43 {
44 private readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
45 private readonly string LogHeader = "[SERVER STATS]";
46
47 public bool Enabled = false;
48 private static Dictionary<string, Stat> RegisteredStats = new Dictionary<string, Stat>();
49
50 public readonly string CategoryServer = "server";
51
52 public readonly string ContainerThreadpool = "threadpool";
53 public readonly string ContainerProcessor = "processor";
54 public readonly string ContainerMemory = "memory";
55 public readonly string ContainerNetwork = "network";
56 public readonly string ContainerProcess = "process";
57
58 public string NetworkInterfaceTypes = "Ethernet";
59
60 readonly int performanceCounterSampleInterval = 500;
61// int lastperformanceCounterSampleTime = 0;
62
63 private class PerfCounterControl
64 {
65 public PerformanceCounter perfCounter;
66 public int lastFetch;
67 public string name;
68 public PerfCounterControl(PerformanceCounter pPc)
69 : this(pPc, String.Empty)
70 {
71 }
72 public PerfCounterControl(PerformanceCounter pPc, string pName)
73 {
74 perfCounter = pPc;
75 lastFetch = 0;
76 name = pName;
77 }
78 }
79
80 PerfCounterControl processorPercentPerfCounter = null;
81
82 // IRegionModuleBase.Initialize
83 public void Initialise(IConfigSource source)
84 {
85 IConfig cfg = source.Configs["Monitoring"];
86
87 if (cfg != null)
88 Enabled = cfg.GetBoolean("ServerStatsEnabled", true);
89
90 if (Enabled)
91 {
92 NetworkInterfaceTypes = cfg.GetString("NetworkInterfaceTypes", "Ethernet");
93 }
94 }
95
96 public void Start()
97 {
98 if (RegisteredStats.Count == 0)
99 RegisterServerStats();
100 }
101
102 public void Close()
103 {
104 if (RegisteredStats.Count > 0)
105 {
106 foreach (Stat stat in RegisteredStats.Values)
107 {
108 StatsManager.DeregisterStat(stat);
109 stat.Dispose();
110 }
111 RegisteredStats.Clear();
112 }
113 }
114
115 private void MakeStat(string pName, string pDesc, string pUnit, string pContainer, Action<Stat> act)
116 {
117 MakeStat(pName, pDesc, pUnit, pContainer, act, MeasuresOfInterest.None);
118 }
119
120 private void MakeStat(string pName, string pDesc, string pUnit, string pContainer, Action<Stat> act, MeasuresOfInterest moi)
121 {
122 string desc = pDesc;
123 if (desc == null)
124 desc = pName;
125 Stat stat = new Stat(pName, pName, desc, pUnit, CategoryServer, pContainer, StatType.Pull, moi, act, StatVerbosity.Debug);
126 StatsManager.RegisterStat(stat);
127 RegisteredStats.Add(pName, stat);
128 }
129
130 public void RegisterServerStats()
131 {
132// lastperformanceCounterSampleTime = Util.EnvironmentTickCount();
133 PerformanceCounter tempPC;
134 Stat tempStat;
135 string tempName;
136
137 try
138 {
139 tempName = "CPUPercent";
140 tempPC = new PerformanceCounter("Processor", "% Processor Time", "_Total");
141 processorPercentPerfCounter = new PerfCounterControl(tempPC);
142 // A long time bug in mono is that CPU percent is reported as CPU percent idle. Windows reports CPU percent busy.
143 tempStat = new Stat(tempName, tempName, "", "percent", CategoryServer, ContainerProcessor,
144 StatType.Pull, (s) => { GetNextValue(s, processorPercentPerfCounter, Util.IsWindows() ? 1 : -1); },
145 StatVerbosity.Info);
146 StatsManager.RegisterStat(tempStat);
147 RegisteredStats.Add(tempName, tempStat);
148
149 MakeStat("TotalProcessorTime", null, "sec", ContainerProcessor,
150 (s) => { s.Value = Process.GetCurrentProcess().TotalProcessorTime.TotalSeconds; });
151
152 MakeStat("UserProcessorTime", null, "sec", ContainerProcessor,
153 (s) => { s.Value = Process.GetCurrentProcess().UserProcessorTime.TotalSeconds; });
154
155 MakeStat("PrivilegedProcessorTime", null, "sec", ContainerProcessor,
156 (s) => { s.Value = Process.GetCurrentProcess().PrivilegedProcessorTime.TotalSeconds; });
157
158 MakeStat("Threads", null, "threads", ContainerProcessor,
159 (s) => { s.Value = Process.GetCurrentProcess().Threads.Count; });
160 }
161 catch (Exception e)
162 {
163 m_log.ErrorFormat("{0} Exception creating 'Process': {1}", LogHeader, e);
164 }
165
166 MakeStat("BuiltinThreadpoolWorkerThreadsAvailable", null, "threads", ContainerThreadpool,
167 s =>
168 {
169 int workerThreads, iocpThreads;
170 ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);
171 s.Value = workerThreads;
172 });
173
174 MakeStat("BuiltinThreadpoolIOCPThreadsAvailable", null, "threads", ContainerThreadpool,
175 s =>
176 {
177 int workerThreads, iocpThreads;
178 ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);
179 s.Value = iocpThreads;
180 });
181
182 if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool && Util.GetSmartThreadPoolInfo() != null)
183 {
184 MakeStat("STPMaxThreads", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().MaxThreads);
185 MakeStat("STPMinThreads", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().MinThreads);
186 MakeStat("STPConcurrency", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().MaxConcurrentWorkItems);
187 MakeStat("STPActiveThreads", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().ActiveThreads);
188 MakeStat("STPInUseThreads", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().InUseThreads);
189 MakeStat("STPWorkItemsWaiting", null, "threads", ContainerThreadpool, s => s.Value = Util.GetSmartThreadPoolInfo().WaitingCallbacks);
190 }
191
192 MakeStat(
193 "HTTPRequestsMade",
194 "Number of outbound HTTP requests made",
195 "requests",
196 ContainerNetwork,
197 s => s.Value = WebUtil.RequestNumber,
198 MeasuresOfInterest.AverageChangeOverTime);
199
200 try
201 {
202 List<string> okInterfaceTypes = new List<string>(NetworkInterfaceTypes.Split(','));
203
204 IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces();
205 foreach (NetworkInterface nic in nics)
206 {
207 if (nic.OperationalStatus != OperationalStatus.Up)
208 continue;
209
210 string nicInterfaceType = nic.NetworkInterfaceType.ToString();
211 if (!okInterfaceTypes.Contains(nicInterfaceType))
212 {
213 m_log.DebugFormat("{0} Not including stats for network interface '{1}' of type '{2}'.",
214 LogHeader, nic.Name, nicInterfaceType);
215 m_log.DebugFormat("{0} To include, add to comma separated list in [Monitoring]NetworkInterfaceTypes={1}",
216 LogHeader, NetworkInterfaceTypes);
217 continue;
218 }
219
220 if (nic.Supports(NetworkInterfaceComponent.IPv4))
221 {
222 IPv4InterfaceStatistics nicStats = nic.GetIPv4Statistics();
223 if (nicStats != null)
224 {
225 MakeStat("BytesRcvd/" + nic.Name, nic.Name, "KB", ContainerNetwork,
226 (s) => { LookupNic(s, (ns) => { return ns.BytesReceived; }, 1024.0); });
227 MakeStat("BytesSent/" + nic.Name, nic.Name, "KB", ContainerNetwork,
228 (s) => { LookupNic(s, (ns) => { return ns.BytesSent; }, 1024.0); });
229 MakeStat("TotalBytes/" + nic.Name, nic.Name, "KB", ContainerNetwork,
230 (s) => { LookupNic(s, (ns) => { return ns.BytesSent + ns.BytesReceived; }, 1024.0); });
231 }
232 }
233 // TODO: add IPv6 (it may actually happen someday)
234 }
235 }
236 catch (Exception e)
237 {
238 m_log.ErrorFormat("{0} Exception creating 'Network Interface': {1}", LogHeader, e);
239 }
240
241 MakeStat("ProcessMemory", null, "MB", ContainerMemory,
242 (s) => { s.Value = Math.Round(Process.GetCurrentProcess().WorkingSet64 / 1024d / 1024d, 3); });
243 MakeStat("HeapMemory", null, "MB", ContainerMemory,
244 (s) => { s.Value = Math.Round(GC.GetTotalMemory(false) / 1024d / 1024d, 3); });
245 MakeStat("LastHeapAllocationRate", null, "MB/sec", ContainerMemory,
246 (s) => { s.Value = Math.Round(MemoryWatchdog.LastHeapAllocationRate * 1000d / 1024d / 1024d, 3); });
247 MakeStat("AverageHeapAllocationRate", null, "MB/sec", ContainerMemory,
248 (s) => { s.Value = Math.Round(MemoryWatchdog.AverageHeapAllocationRate * 1000d / 1024d / 1024d, 3); });
249 }
250
251 // Notes on performance counters:
252 // "How To Read Performance Counters": http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx
253 // "How to get the CPU Usage in C#": http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c
254 // "Mono Performance Counters": http://www.mono-project.com/Mono_Performance_Counters
255 private delegate double PerfCounterNextValue();
256 private void GetNextValue(Stat stat, PerfCounterControl perfControl)
257 {
258 GetNextValue(stat, perfControl, 1.0);
259 }
260 private void GetNextValue(Stat stat, PerfCounterControl perfControl, double factor)
261 {
262 if (Util.EnvironmentTickCountSubtract(perfControl.lastFetch) > performanceCounterSampleInterval)
263 {
264 if (perfControl != null && perfControl.perfCounter != null)
265 {
266 try
267 {
268 // Kludge for factor to run double duty. If -1, subtract the value from one
269 if (factor == -1)
270 stat.Value = 1 - perfControl.perfCounter.NextValue();
271 else
272 stat.Value = perfControl.perfCounter.NextValue() / factor;
273 }
274 catch (Exception e)
275 {
276 m_log.ErrorFormat("{0} Exception on NextValue fetching {1}: {2}", LogHeader, stat.Name, e);
277 }
278 perfControl.lastFetch = Util.EnvironmentTickCount();
279 }
280 }
281 }
282
283 // Lookup the nic that goes with this stat and set the value by using a fetch action.
284 // Not sure about closure with delegates inside delegates.
285 private delegate double GetIPv4StatValue(IPv4InterfaceStatistics interfaceStat);
286 private void LookupNic(Stat stat, GetIPv4StatValue getter, double factor)
287 {
288 // Get the one nic that has the name of this stat
289 IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces().Where(
290 (network) => network.Name == stat.Description);
291 try
292 {
293 foreach (NetworkInterface nic in nics)
294 {
295 IPv4InterfaceStatistics intrStats = nic.GetIPv4Statistics();
296 if (intrStats != null)
297 {
298 double newVal = Math.Round(getter(intrStats) / factor, 3);
299 stat.Value = newVal;
300 }
301 break;
302 }
303 }
304 catch
305 {
306 // There are times interfaces go away so we just won't update the stat for this
307 m_log.ErrorFormat("{0} Exception fetching stat on interface '{1}'", LogHeader, stat.Description);
308 }
309 }
310 }
311
312 public class ServerStatsAggregator : Stat
313 {
314 public ServerStatsAggregator(
315 string shortName,
316 string name,
317 string description,
318 string unitName,
319 string category,
320 string container
321 )
322 : base(
323 shortName,
324 name,
325 description,
326 unitName,
327 category,
328 container,
329 StatType.Push,
330 MeasuresOfInterest.None,
331 null,
332 StatVerbosity.Info)
333 {
334 }
335 public override string ToConsoleString()
336 {
337 StringBuilder sb = new StringBuilder();
338
339 return sb.ToString();
340 }
341
342 public override OSDMap ToOSDMap()
343 {
344 OSDMap ret = new OSDMap();
345
346 return ret;
347 }
348 }
349}
diff --git a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
index 6a68322..f6f458d 100644
--- a/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
+++ b/OpenSim/Framework/Monitoring/SimExtraStatsCollector.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq;
30using System.Text; 31using System.Text;
31using OpenMetaverse; 32using OpenMetaverse;
32using OpenMetaverse.StructuredData; 33using OpenMetaverse.StructuredData;
@@ -39,8 +40,6 @@ namespace OpenSim.Framework.Monitoring
39 /// </summary> 40 /// </summary>
40 public class SimExtraStatsCollector : BaseStatsCollector 41 public class SimExtraStatsCollector : BaseStatsCollector
41 { 42 {
42 private long abnormalClientThreadTerminations;
43
44// private long assetsInCache; 43// private long assetsInCache;
45// private long texturesInCache; 44// private long texturesInCache;
46// private long assetCacheMemoryUsage; 45// private long assetCacheMemoryUsage;
@@ -73,11 +72,6 @@ namespace OpenSim.Framework.Monitoring
73 private volatile float activeScripts; 72 private volatile float activeScripts;
74 private volatile float scriptLinesPerSecond; 73 private volatile float scriptLinesPerSecond;
75 74
76 /// <summary>
77 /// Number of times that a client thread terminated because of an exception
78 /// </summary>
79 public long AbnormalClientThreadTerminations { get { return abnormalClientThreadTerminations; } }
80
81// /// <summary> 75// /// <summary>
82// /// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the 76// /// These statistics are being collected by push rather than pull. Pull would be simpler, but I had the
83// /// notion of providing some flow statistics (which pull wouldn't give us). Though admittedly these 77// /// notion of providing some flow statistics (which pull wouldn't give us). Though admittedly these
@@ -166,11 +160,6 @@ namespace OpenSim.Framework.Monitoring
166 private IDictionary<UUID, PacketQueueStatsCollector> packetQueueStatsCollectors 160 private IDictionary<UUID, PacketQueueStatsCollector> packetQueueStatsCollectors
167 = new Dictionary<UUID, PacketQueueStatsCollector>(); 161 = new Dictionary<UUID, PacketQueueStatsCollector>();
168 162
169 public void AddAbnormalClientThreadTermination()
170 {
171 abnormalClientThreadTerminations++;
172 }
173
174// public void AddAsset(AssetBase asset) 163// public void AddAsset(AssetBase asset)
175// { 164// {
176// assetsInCache++; 165// assetsInCache++;
@@ -324,10 +313,12 @@ Asset service request failures: {3}" + Environment.NewLine,
324 sb.Append(Environment.NewLine); 313 sb.Append(Environment.NewLine);
325 sb.Append("CONNECTION STATISTICS"); 314 sb.Append("CONNECTION STATISTICS");
326 sb.Append(Environment.NewLine); 315 sb.Append(Environment.NewLine);
327 sb.Append( 316
328 string.Format( 317 List<Stat> stats = StatsManager.GetStatsFromEachContainer("clientstack", "ClientLogoutsDueToNoReceives");
329 "Abnormal client thread terminations: {0}" + Environment.NewLine, 318
330 abnormalClientThreadTerminations)); 319 sb.AppendFormat(
320 "Client logouts due to no data receive timeout: {0}\n\n",
321 stats != null ? stats.Sum(s => s.Value).ToString() : "unknown");
331 322
332// sb.Append(Environment.NewLine); 323// sb.Append(Environment.NewLine);
333// sb.Append("INVENTORY STATISTICS"); 324// sb.Append("INVENTORY STATISTICS");
@@ -338,7 +329,7 @@ Asset service request failures: {3}" + Environment.NewLine,
338// InventoryServiceRetrievalFailures)); 329// InventoryServiceRetrievalFailures));
339 330
340 sb.Append(Environment.NewLine); 331 sb.Append(Environment.NewLine);
341 sb.Append("FRAME STATISTICS"); 332 sb.Append("SAMPLE FRAME STATISTICS");
342 sb.Append(Environment.NewLine); 333 sb.Append(Environment.NewLine);
343 sb.Append("Dilatn SimFPS PhyFPS AgntUp RootAg ChldAg Prims AtvPrm AtvScr ScrLPS"); 334 sb.Append("Dilatn SimFPS PhyFPS AgntUp RootAg ChldAg Prims AtvPrm AtvScr ScrLPS");
344 sb.Append(Environment.NewLine); 335 sb.Append(Environment.NewLine);
diff --git a/OpenSim/Framework/Monitoring/Stats/CounterStat.cs b/OpenSim/Framework/Monitoring/Stats/CounterStat.cs
index caea30d..318cf1c 100755
--- a/OpenSim/Framework/Monitoring/Stats/CounterStat.cs
+++ b/OpenSim/Framework/Monitoring/Stats/CounterStat.cs
@@ -34,142 +34,6 @@ using OpenMetaverse.StructuredData;
34 34
35namespace OpenSim.Framework.Monitoring 35namespace OpenSim.Framework.Monitoring
36{ 36{
37// Create a time histogram of events. The histogram is built in a wrap-around
38// array of equally distributed buckets.
39// For instance, a minute long histogram of second sized buckets would be:
40// new EventHistogram(60, 1000)
41public class EventHistogram
42{
43 private int m_timeBase;
44 private int m_numBuckets;
45 private int m_bucketMilliseconds;
46 private int m_lastBucket;
47 private int m_totalHistogramMilliseconds;
48 private long[] m_histogram;
49 private object histoLock = new object();
50
51 public EventHistogram(int numberOfBuckets, int millisecondsPerBucket)
52 {
53 m_numBuckets = numberOfBuckets;
54 m_bucketMilliseconds = millisecondsPerBucket;
55 m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds;
56
57 m_histogram = new long[m_numBuckets];
58 Zero();
59 m_lastBucket = 0;
60 m_timeBase = Util.EnvironmentTickCount();
61 }
62
63 public void Event()
64 {
65 this.Event(1);
66 }
67
68 // Record an event at time 'now' in the histogram.
69 public void Event(int cnt)
70 {
71 lock (histoLock)
72 {
73 // The time as displaced from the base of the histogram
74 int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase);
75
76 // If more than the total time of the histogram, we just start over
77 if (bucketTime > m_totalHistogramMilliseconds)
78 {
79 Zero();
80 m_lastBucket = 0;
81 m_timeBase = Util.EnvironmentTickCount();
82 }
83 else
84 {
85 // To which bucket should we add this event?
86 int bucket = bucketTime / m_bucketMilliseconds;
87
88 // Advance m_lastBucket to the new bucket. Zero any buckets skipped over.
89 while (bucket != m_lastBucket)
90 {
91 // Zero from just after the last bucket to the new bucket or the end
92 for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++)
93 {
94 m_histogram[jj] = 0;
95 }
96 m_lastBucket = bucket;
97 // If the new bucket is off the end, wrap around to the beginning
98 if (bucket > m_numBuckets)
99 {
100 bucket -= m_numBuckets;
101 m_lastBucket = 0;
102 m_histogram[m_lastBucket] = 0;
103 m_timeBase += m_totalHistogramMilliseconds;
104 }
105 }
106 }
107 m_histogram[m_lastBucket] += cnt;
108 }
109 }
110
111 // Get a copy of the current histogram
112 public long[] GetHistogram()
113 {
114 long[] ret = new long[m_numBuckets];
115 lock (histoLock)
116 {
117 int indx = m_lastBucket + 1;
118 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
119 {
120 if (indx >= m_numBuckets)
121 indx = 0;
122 ret[ii] = m_histogram[indx];
123 }
124 }
125 return ret;
126 }
127
128 public OSDMap GetHistogramAsOSDMap()
129 {
130 OSDMap ret = new OSDMap();
131
132 ret.Add("Buckets", OSD.FromInteger(m_numBuckets));
133 ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds));
134 ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds));
135
136 // Compute a number for the first bucket in the histogram.
137 // This will allow readers to know how this histogram relates to any previously read histogram.
138 int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1;
139 ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum));
140
141 ret.Add("Values", GetHistogramAsOSDArray());
142
143 return ret;
144 }
145 // Get a copy of the current histogram
146 public OSDArray GetHistogramAsOSDArray()
147 {
148 OSDArray ret = new OSDArray(m_numBuckets);
149 lock (histoLock)
150 {
151 int indx = m_lastBucket + 1;
152 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
153 {
154 if (indx >= m_numBuckets)
155 indx = 0;
156 ret[ii] = OSD.FromLong(m_histogram[indx]);
157 }
158 }
159 return ret;
160 }
161
162 // Zero out the histogram
163 public void Zero()
164 {
165 lock (histoLock)
166 {
167 for (int ii = 0; ii < m_numBuckets; ii++)
168 m_histogram[ii] = 0;
169 }
170 }
171}
172
173// A statistic that wraps a counter. 37// A statistic that wraps a counter.
174// Built this way mostly so histograms and history can be created. 38// Built this way mostly so histograms and history can be created.
175public class CounterStat : Stat 39public class CounterStat : Stat
@@ -224,5 +88,32 @@ public class CounterStat : Stat
224 } 88 }
225 } 89 }
226 } 90 }
91
92 // CounterStat is a basic stat plus histograms
93 public override OSDMap ToOSDMap()
94 {
95 // Get the foundational instance
96 OSDMap map = base.ToOSDMap();
97
98 map["StatType"] = "CounterStat";
99
100 // If there are any histograms, add a new field that is an array of histograms as OSDMaps
101 if (m_histograms.Count > 0)
102 {
103 lock (counterLock)
104 {
105 if (m_histograms.Count > 0)
106 {
107 OSDArray histos = new OSDArray();
108 foreach (EventHistogram histo in m_histograms.Values)
109 {
110 histos.Add(histo.GetHistogramAsOSDMap());
111 }
112 map.Add("Histograms", histos);
113 }
114 }
115 }
116 return map;
117 }
227} 118}
228} 119}
diff --git a/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs
new file mode 100755
index 0000000..f51f322
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/Stats/EventHistogram.cs
@@ -0,0 +1,173 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenMetaverse.StructuredData;
34
35namespace OpenSim.Framework.Monitoring
36{
37// Create a time histogram of events. The histogram is built in a wrap-around
38// array of equally distributed buckets.
39// For instance, a minute long histogram of second sized buckets would be:
40// new EventHistogram(60, 1000)
41public class EventHistogram
42{
43 private int m_timeBase;
44 private int m_numBuckets;
45 private int m_bucketMilliseconds;
46 private int m_lastBucket;
47 private int m_totalHistogramMilliseconds;
48 private long[] m_histogram;
49 private object histoLock = new object();
50
51 public EventHistogram(int numberOfBuckets, int millisecondsPerBucket)
52 {
53 m_numBuckets = numberOfBuckets;
54 m_bucketMilliseconds = millisecondsPerBucket;
55 m_totalHistogramMilliseconds = m_numBuckets * m_bucketMilliseconds;
56
57 m_histogram = new long[m_numBuckets];
58 Zero();
59 m_lastBucket = 0;
60 m_timeBase = Util.EnvironmentTickCount();
61 }
62
63 public void Event()
64 {
65 this.Event(1);
66 }
67
68 // Record an event at time 'now' in the histogram.
69 public void Event(int cnt)
70 {
71 lock (histoLock)
72 {
73 // The time as displaced from the base of the histogram
74 int bucketTime = Util.EnvironmentTickCountSubtract(m_timeBase);
75
76 // If more than the total time of the histogram, we just start over
77 if (bucketTime > m_totalHistogramMilliseconds)
78 {
79 Zero();
80 m_lastBucket = 0;
81 m_timeBase = Util.EnvironmentTickCount();
82 }
83 else
84 {
85 // To which bucket should we add this event?
86 int bucket = bucketTime / m_bucketMilliseconds;
87
88 // Advance m_lastBucket to the new bucket. Zero any buckets skipped over.
89 while (bucket != m_lastBucket)
90 {
91 // Zero from just after the last bucket to the new bucket or the end
92 for (int jj = m_lastBucket + 1; jj <= Math.Min(bucket, m_numBuckets - 1); jj++)
93 {
94 m_histogram[jj] = 0;
95 }
96 m_lastBucket = bucket;
97 // If the new bucket is off the end, wrap around to the beginning
98 if (bucket > m_numBuckets)
99 {
100 bucket -= m_numBuckets;
101 m_lastBucket = 0;
102 m_histogram[m_lastBucket] = 0;
103 m_timeBase += m_totalHistogramMilliseconds;
104 }
105 }
106 }
107 m_histogram[m_lastBucket] += cnt;
108 }
109 }
110
111 // Get a copy of the current histogram
112 public long[] GetHistogram()
113 {
114 long[] ret = new long[m_numBuckets];
115 lock (histoLock)
116 {
117 int indx = m_lastBucket + 1;
118 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
119 {
120 if (indx >= m_numBuckets)
121 indx = 0;
122 ret[ii] = m_histogram[indx];
123 }
124 }
125 return ret;
126 }
127
128 public OSDMap GetHistogramAsOSDMap()
129 {
130 OSDMap ret = new OSDMap();
131
132 ret.Add("Buckets", OSD.FromInteger(m_numBuckets));
133 ret.Add("BucketMilliseconds", OSD.FromInteger(m_bucketMilliseconds));
134 ret.Add("TotalMilliseconds", OSD.FromInteger(m_totalHistogramMilliseconds));
135
136 // Compute a number for the first bucket in the histogram.
137 // This will allow readers to know how this histogram relates to any previously read histogram.
138 int baseBucketNum = (m_timeBase / m_bucketMilliseconds) + m_lastBucket + 1;
139 ret.Add("BaseNumber", OSD.FromInteger(baseBucketNum));
140
141 ret.Add("Values", GetHistogramAsOSDArray());
142
143 return ret;
144 }
145 // Get a copy of the current histogram
146 public OSDArray GetHistogramAsOSDArray()
147 {
148 OSDArray ret = new OSDArray(m_numBuckets);
149 lock (histoLock)
150 {
151 int indx = m_lastBucket + 1;
152 for (int ii = 0; ii < m_numBuckets; ii++, indx++)
153 {
154 if (indx >= m_numBuckets)
155 indx = 0;
156 ret[ii] = OSD.FromLong(m_histogram[indx]);
157 }
158 }
159 return ret;
160 }
161
162 // Zero out the histogram
163 public void Zero()
164 {
165 lock (histoLock)
166 {
167 for (int ii = 0; ii < m_numBuckets; ii++)
168 m_histogram[ii] = 0;
169 }
170 }
171}
172
173}
diff --git a/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs b/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs
index 60bed55..55ddf06 100644
--- a/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs
+++ b/OpenSim/Framework/Monitoring/Stats/PercentageStat.cs
@@ -29,6 +29,8 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Text; 30using System.Text;
31 31
32using OpenMetaverse.StructuredData;
33
32namespace OpenSim.Framework.Monitoring 34namespace OpenSim.Framework.Monitoring
33{ 35{
34 public class PercentageStat : Stat 36 public class PercentageStat : Stat
@@ -84,5 +86,19 @@ namespace OpenSim.Framework.Monitoring
84 86
85 return sb.ToString(); 87 return sb.ToString();
86 } 88 }
89
90 // PercentageStat is a basic stat plus percent calc
91 public override OSDMap ToOSDMap()
92 {
93 // Get the foundational instance
94 OSDMap map = base.ToOSDMap();
95
96 map["StatType"] = "PercentageStat";
97
98 map.Add("Antecedent", OSD.FromLong(Antecedent));
99 map.Add("Consequent", OSD.FromLong(Consequent));
100
101 return map;
102 }
87 } 103 }
88} \ No newline at end of file 104} \ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/Stats/Stat.cs b/OpenSim/Framework/Monitoring/Stats/Stat.cs
index 2e7665f..2b34493 100644
--- a/OpenSim/Framework/Monitoring/Stats/Stat.cs
+++ b/OpenSim/Framework/Monitoring/Stats/Stat.cs
@@ -27,8 +27,10 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq;
31using System.Reflection;
30using System.Text; 32using System.Text;
31 33using log4net;
32using OpenMetaverse.StructuredData; 34using OpenMetaverse.StructuredData;
33 35
34namespace OpenSim.Framework.Monitoring 36namespace OpenSim.Framework.Monitoring
@@ -38,6 +40,10 @@ namespace OpenSim.Framework.Monitoring
38 /// </summary> 40 /// </summary>
39 public class Stat : IDisposable 41 public class Stat : IDisposable
40 { 42 {
43// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45 public static readonly char[] DisallowedShortNameCharacters = { '.' };
46
41 /// <summary> 47 /// <summary>
42 /// Category of this stat (e.g. cache, scene, etc). 48 /// Category of this stat (e.g. cache, scene, etc).
43 /// </summary> 49 /// </summary>
@@ -95,7 +101,7 @@ namespace OpenSim.Framework.Monitoring
95 /// <remarks> 101 /// <remarks>
96 /// Will be null if no measures of interest require samples. 102 /// Will be null if no measures of interest require samples.
97 /// </remarks> 103 /// </remarks>
98 private static Queue<double> m_samples; 104 private Queue<double> m_samples;
99 105
100 /// <summary> 106 /// <summary>
101 /// Maximum number of statistical samples. 107 /// Maximum number of statistical samples.
@@ -162,6 +168,12 @@ namespace OpenSim.Framework.Monitoring
162 throw new Exception( 168 throw new Exception(
163 string.Format("Stat cannot be in category '{0}' since this is reserved for a subcommand", category)); 169 string.Format("Stat cannot be in category '{0}' since this is reserved for a subcommand", category));
164 170
171 foreach (char c in DisallowedShortNameCharacters)
172 {
173 if (shortName.IndexOf(c) != -1)
174 throw new Exception(string.Format("Stat name {0} cannot contain character {1}", shortName, c));
175 }
176
165 ShortName = shortName; 177 ShortName = shortName;
166 Name = name; 178 Name = name;
167 Description = description; 179 Description = description;
@@ -204,6 +216,8 @@ namespace OpenSim.Framework.Monitoring
204 if (m_samples.Count >= m_maxSamples) 216 if (m_samples.Count >= m_maxSamples)
205 m_samples.Dequeue(); 217 m_samples.Dequeue();
206 218
219// m_log.DebugFormat("[STAT]: Recording value {0} for {1}", newValue, Name);
220
207 m_samples.Enqueue(newValue); 221 m_samples.Enqueue(newValue);
208 } 222 }
209 } 223 }
@@ -211,7 +225,13 @@ namespace OpenSim.Framework.Monitoring
211 public virtual string ToConsoleString() 225 public virtual string ToConsoleString()
212 { 226 {
213 StringBuilder sb = new StringBuilder(); 227 StringBuilder sb = new StringBuilder();
214 sb.AppendFormat("{0}.{1}.{2} : {3} {4}", Category, Container, ShortName, Value, UnitName); 228 sb.AppendFormat(
229 "{0}.{1}.{2} : {3}{4}",
230 Category,
231 Container,
232 ShortName,
233 Value,
234 UnitName == null || UnitName == "" ? "" : string.Format(" {0}", UnitName));
215 235
216 AppendMeasuresOfInterest(sb); 236 AppendMeasuresOfInterest(sb);
217 237
@@ -221,6 +241,8 @@ namespace OpenSim.Framework.Monitoring
221 public virtual OSDMap ToOSDMap() 241 public virtual OSDMap ToOSDMap()
222 { 242 {
223 OSDMap ret = new OSDMap(); 243 OSDMap ret = new OSDMap();
244 ret.Add("StatType", "Stat"); // used by overloading classes to denote type of stat
245
224 ret.Add("Category", OSD.FromString(Category)); 246 ret.Add("Category", OSD.FromString(Category));
225 ret.Add("Container", OSD.FromString(Container)); 247 ret.Add("Container", OSD.FromString(Container));
226 ret.Add("ShortName", OSD.FromString(ShortName)); 248 ret.Add("ShortName", OSD.FromString(ShortName));
@@ -229,31 +251,74 @@ namespace OpenSim.Framework.Monitoring
229 ret.Add("UnitName", OSD.FromString(UnitName)); 251 ret.Add("UnitName", OSD.FromString(UnitName));
230 ret.Add("Value", OSD.FromReal(Value)); 252 ret.Add("Value", OSD.FromReal(Value));
231 253
254 double lastChangeOverTime, averageChangeOverTime;
255 if (ComputeMeasuresOfInterest(out lastChangeOverTime, out averageChangeOverTime))
256 {
257 ret.Add("LastChangeOverTime", OSD.FromReal(lastChangeOverTime));
258 ret.Add("AverageChangeOverTime", OSD.FromReal(averageChangeOverTime));
259 }
260
232 return ret; 261 return ret;
233 } 262 }
234 263
235 protected void AppendMeasuresOfInterest(StringBuilder sb) 264 // Compute the averages over time and return same.
265 // Return 'true' if averages were actually computed. 'false' if no average info.
266 public bool ComputeMeasuresOfInterest(out double lastChangeOverTime, out double averageChangeOverTime)
236 { 267 {
237 if ((MeasuresOfInterest & MeasuresOfInterest.AverageChangeOverTime) 268 bool ret = false;
238 == MeasuresOfInterest.AverageChangeOverTime) 269 lastChangeOverTime = 0;
270 averageChangeOverTime = 0;
271
272 if ((MeasuresOfInterest & MeasuresOfInterest.AverageChangeOverTime) == MeasuresOfInterest.AverageChangeOverTime)
239 { 273 {
240 double totalChange = 0; 274 double totalChange = 0;
275 double? penultimateSample = null;
241 double? lastSample = null; 276 double? lastSample = null;
242 277
243 lock (m_samples) 278 lock (m_samples)
244 { 279 {
280 // m_log.DebugFormat(
281 // "[STAT]: Samples for {0} are {1}",
282 // Name, string.Join(",", m_samples.Select(s => s.ToString()).ToArray()));
283
245 foreach (double s in m_samples) 284 foreach (double s in m_samples)
246 { 285 {
247 if (lastSample != null) 286 if (lastSample != null)
248 totalChange += s - (double)lastSample; 287 totalChange += s - (double)lastSample;
249 288
289 penultimateSample = lastSample;
250 lastSample = s; 290 lastSample = s;
251 } 291 }
252 } 292 }
253 293
294 if (lastSample != null && penultimateSample != null)
295 {
296 lastChangeOverTime
297 = ((double)lastSample - (double)penultimateSample) / (Watchdog.WATCHDOG_INTERVAL_MS / 1000);
298 }
299
254 int divisor = m_samples.Count <= 1 ? 1 : m_samples.Count - 1; 300 int divisor = m_samples.Count <= 1 ? 1 : m_samples.Count - 1;
255 301
256 sb.AppendFormat(", {0:0.##}{1}/s", totalChange / divisor / (Watchdog.WATCHDOG_INTERVAL_MS / 1000), UnitName); 302 averageChangeOverTime = totalChange / divisor / (Watchdog.WATCHDOG_INTERVAL_MS / 1000);
303 ret = true;
304 }
305
306 return ret;
307 }
308
309 protected void AppendMeasuresOfInterest(StringBuilder sb)
310 {
311 double lastChangeOverTime = 0;
312 double averageChangeOverTime = 0;
313
314 if (ComputeMeasuresOfInterest(out lastChangeOverTime, out averageChangeOverTime))
315 {
316 sb.AppendFormat(
317 ", {0:0.##}{1}/s, {2:0.##}{3}/s",
318 lastChangeOverTime,
319 UnitName == null || UnitName == "" ? "" : string.Format(" {0}", UnitName),
320 averageChangeOverTime,
321 UnitName == null || UnitName == "" ? "" : string.Format(" {0}", UnitName));
257 } 322 }
258 } 323 }
259 } 324 }
diff --git a/OpenSim/Framework/Monitoring/StatsLogger.cs b/OpenSim/Framework/Monitoring/StatsLogger.cs
new file mode 100644
index 0000000..1e4fa11
--- /dev/null
+++ b/OpenSim/Framework/Monitoring/StatsLogger.cs
@@ -0,0 +1,108 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using System.Timers;
31using log4net;
32
33namespace OpenSim.Framework.Monitoring
34{
35 /// <summary>
36 /// Provides a means to continuously log stats for debugging purposes.
37 /// </summary>
38 public static class StatsLogger
39 {
40 private static readonly ILog m_statsLog = LogManager.GetLogger("special.StatsLogger");
41
42 private static Timer m_loggingTimer;
43 private static int m_statsLogIntervalMs = 5000;
44
45 public static void RegisterConsoleCommands(ICommandConsole console)
46 {
47 console.Commands.AddCommand(
48 "Debug",
49 false,
50 "debug stats record",
51 "debug stats record start|stop",
52 "Control whether stats are being regularly recorded to a separate file.",
53 "For debug purposes. Experimental.",
54 HandleStatsRecordCommand);
55 }
56
57 public static void HandleStatsRecordCommand(string module, string[] cmd)
58 {
59 ICommandConsole con = MainConsole.Instance;
60
61 if (cmd.Length != 4)
62 {
63 con.Output("Usage: debug stats record start|stop");
64 return;
65 }
66
67 if (cmd[3] == "start")
68 {
69 Start();
70 con.OutputFormat("Now recording all stats to file every {0}ms", m_statsLogIntervalMs);
71 }
72 else if (cmd[3] == "stop")
73 {
74 Stop();
75 con.Output("Stopped recording stats to file.");
76 }
77 }
78
79 public static void Start()
80 {
81 if (m_loggingTimer != null)
82 Stop();
83
84 m_loggingTimer = new Timer(m_statsLogIntervalMs);
85 m_loggingTimer.AutoReset = false;
86 m_loggingTimer.Elapsed += Log;
87 m_loggingTimer.Start();
88 }
89
90 public static void Stop()
91 {
92 if (m_loggingTimer != null)
93 {
94 m_loggingTimer.Stop();
95 }
96 }
97
98 private static void Log(object sender, ElapsedEventArgs e)
99 {
100 m_statsLog.InfoFormat("*** STATS REPORT AT {0} ***", DateTime.Now);
101
102 foreach (string report in StatsManager.GetAllStatsReports())
103 m_statsLog.Info(report);
104
105 m_loggingTimer.Start();
106 }
107 }
108} \ No newline at end of file
diff --git a/OpenSim/Framework/Monitoring/StatsManager.cs b/OpenSim/Framework/Monitoring/StatsManager.cs
index 24db6d4..05ee4c5 100644
--- a/OpenSim/Framework/Monitoring/StatsManager.cs
+++ b/OpenSim/Framework/Monitoring/StatsManager.cs
@@ -26,15 +26,20 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
29using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Linq;
30using System.Text; 32using System.Text;
31 33
34using OpenSim.Framework;
35using OpenMetaverse.StructuredData;
36
32namespace OpenSim.Framework.Monitoring 37namespace OpenSim.Framework.Monitoring
33{ 38{
34 /// <summary> 39 /// <summary>
35 /// Singleton used to provide access to statistics reporters 40 /// Static class used to register/deregister/fetch statistics
36 /// </summary> 41 /// </summary>
37 public class StatsManager 42 public static class StatsManager
38 { 43 {
39 // Subcommand used to list other stats. 44 // Subcommand used to list other stats.
40 public const string AllSubCommand = "all"; 45 public const string AllSubCommand = "all";
@@ -54,13 +59,13 @@ namespace OpenSim.Framework.Monitoring
54 public static SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Stat>>> RegisteredStats 59 public static SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Stat>>> RegisteredStats
55 = new SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Stat>>>(); 60 = new SortedDictionary<string, SortedDictionary<string, SortedDictionary<string, Stat>>>();
56 61
57 private static AssetStatsCollector assetStats; 62// private static AssetStatsCollector assetStats;
58 private static UserStatsCollector userStats; 63// private static UserStatsCollector userStats;
59 private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector(); 64// private static SimExtraStatsCollector simExtraStats = new SimExtraStatsCollector();
60 65
61 public static AssetStatsCollector AssetStats { get { return assetStats; } } 66// public static AssetStatsCollector AssetStats { get { return assetStats; } }
62 public static UserStatsCollector UserStats { get { return userStats; } } 67// public static UserStatsCollector UserStats { get { return userStats; } }
63 public static SimExtraStatsCollector SimExtraStats { get { return simExtraStats; } } 68 public static SimExtraStatsCollector SimExtraStats { get; set; }
64 69
65 public static void RegisterConsoleCommands(ICommandConsole console) 70 public static void RegisterConsoleCommands(ICommandConsole console)
66 { 71 {
@@ -68,14 +73,18 @@ namespace OpenSim.Framework.Monitoring
68 "General", 73 "General",
69 false, 74 false,
70 "show stats", 75 "show stats",
71 "show stats [list|all|<category>]", 76 "show stats [list|all|(<category>[.<container>])+",
72 "Show statistical information for this server", 77 "Show statistical information for this server",
73 "If no final argument is specified then legacy statistics information is currently shown.\n" 78 "If no final argument is specified then legacy statistics information is currently shown.\n"
74 + "If list is specified then statistic categories are shown.\n" 79 + "'list' argument will show statistic categories.\n"
75 + "If all is specified then all registered statistics are shown.\n" 80 + "'all' will show all statistics.\n"
76 + "If a category name is specified then only statistics from that category are shown.\n" 81 + "A <category> name will show statistics from that category.\n"
82 + "A <category>.<container> name will show statistics from that category in that container.\n"
83 + "More than one name can be given separated by spaces.\n"
77 + "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS", 84 + "THIS STATS FACILITY IS EXPERIMENTAL AND DOES NOT YET CONTAIN ALL STATS",
78 HandleShowStatsCommand); 85 HandleShowStatsCommand);
86
87 StatsLogger.RegisterConsoleCommands(console);
79 } 88 }
80 89
81 public static void HandleShowStatsCommand(string module, string[] cmd) 90 public static void HandleShowStatsCommand(string module, string[] cmd)
@@ -84,43 +93,47 @@ namespace OpenSim.Framework.Monitoring
84 93
85 if (cmd.Length > 2) 94 if (cmd.Length > 2)
86 { 95 {
87 var categoryName = cmd[2]; 96 foreach (string name in cmd.Skip(2))
88 var containerName = cmd.Length > 3 ? cmd[3] : String.Empty;
89
90 if (categoryName == AllSubCommand)
91 { 97 {
92 foreach (var category in RegisteredStats.Values) 98 string[] components = name.Split('.');
99
100 string categoryName = components[0];
101 string containerName = components.Length > 1 ? components[1] : null;
102
103 if (categoryName == AllSubCommand)
93 { 104 {
94 OutputCategoryStatsToConsole(con, category); 105 OutputAllStatsToConsole(con);
95 } 106 }
96 } 107 else if (categoryName == ListSubCommand)
97 else if (categoryName == ListSubCommand)
98 {
99 con.Output("Statistic categories available are:");
100 foreach (string category in RegisteredStats.Keys)
101 con.OutputFormat(" {0}", category);
102 }
103 else
104 {
105 SortedDictionary<string, SortedDictionary<string, Stat>> category;
106 if (!RegisteredStats.TryGetValue(categoryName, out category))
107 { 108 {
108 con.OutputFormat("No such category as {0}", categoryName); 109 con.Output("Statistic categories available are:");
110 foreach (string category in RegisteredStats.Keys)
111 con.OutputFormat(" {0}", category);
109 } 112 }
110 else 113 else
111 { 114 {
112 if (String.IsNullOrEmpty(containerName)) 115 SortedDictionary<string, SortedDictionary<string, Stat>> category;
113 OutputCategoryStatsToConsole(con, category); 116 if (!RegisteredStats.TryGetValue(categoryName, out category))
117 {
118 con.OutputFormat("No such category as {0}", categoryName);
119 }
114 else 120 else
115 { 121 {
116 SortedDictionary<string, Stat> container; 122 if (String.IsNullOrEmpty(containerName))
117 if (category.TryGetValue(containerName, out container))
118 { 123 {
119 OutputContainerStatsToConsole(con, container); 124 OutputCategoryStatsToConsole(con, category);
120 } 125 }
121 else 126 else
122 { 127 {
123 con.OutputFormat("No such container {0} in category {1}", containerName, categoryName); 128 SortedDictionary<string, Stat> container;
129 if (category.TryGetValue(containerName, out container))
130 {
131 OutputContainerStatsToConsole(con, container);
132 }
133 else
134 {
135 con.OutputFormat("No such container {0} in category {1}", containerName, categoryName);
136 }
124 } 137 }
125 } 138 }
126 } 139 }
@@ -129,51 +142,187 @@ namespace OpenSim.Framework.Monitoring
129 else 142 else
130 { 143 {
131 // Legacy 144 // Legacy
132 con.Output(SimExtraStats.Report()); 145 if (SimExtraStats != null)
146 con.Output(SimExtraStats.Report());
147 else
148 OutputAllStatsToConsole(con);
133 } 149 }
134 } 150 }
135 151
152 public static List<string> GetAllStatsReports()
153 {
154 List<string> reports = new List<string>();
155
156 foreach (var category in RegisteredStats.Values)
157 reports.AddRange(GetCategoryStatsReports(category));
158
159 return reports;
160 }
161
162 private static void OutputAllStatsToConsole(ICommandConsole con)
163 {
164 foreach (string report in GetAllStatsReports())
165 con.Output(report);
166 }
167
168 private static List<string> GetCategoryStatsReports(
169 SortedDictionary<string, SortedDictionary<string, Stat>> category)
170 {
171 List<string> reports = new List<string>();
172
173 foreach (var container in category.Values)
174 reports.AddRange(GetContainerStatsReports(container));
175
176 return reports;
177 }
178
136 private static void OutputCategoryStatsToConsole( 179 private static void OutputCategoryStatsToConsole(
137 ICommandConsole con, SortedDictionary<string, SortedDictionary<string, Stat>> category) 180 ICommandConsole con, SortedDictionary<string, SortedDictionary<string, Stat>> category)
138 { 181 {
139 foreach (var container in category.Values) 182 foreach (string report in GetCategoryStatsReports(category))
140 { 183 con.Output(report);
141 OutputContainerStatsToConsole(con, container);
142 }
143 } 184 }
144 185
145 private static void OutputContainerStatsToConsole( ICommandConsole con, SortedDictionary<string, Stat> container) 186 private static List<string> GetContainerStatsReports(SortedDictionary<string, Stat> container)
146 { 187 {
188 List<string> reports = new List<string>();
189
147 foreach (Stat stat in container.Values) 190 foreach (Stat stat in container.Values)
148 { 191 reports.Add(stat.ToConsoleString());
149 con.Output(stat.ToConsoleString()); 192
150 } 193 return reports;
151 } 194 }
152 195
153 /// <summary> 196 private static void OutputContainerStatsToConsole(
154 /// Start collecting statistics related to assets. 197 ICommandConsole con, SortedDictionary<string, Stat> container)
155 /// Should only be called once. 198 {
156 /// </summary> 199 foreach (string report in GetContainerStatsReports(container))
157 public static AssetStatsCollector StartCollectingAssetStats() 200 con.Output(report);
201 }
202
203 // Creates an OSDMap of the format:
204 // { categoryName: {
205 // containerName: {
206 // statName: {
207 // "Name": name,
208 // "ShortName": shortName,
209 // ...
210 // },
211 // statName: {
212 // "Name": name,
213 // "ShortName": shortName,
214 // ...
215 // },
216 // ...
217 // },
218 // containerName: {
219 // ...
220 // },
221 // ...
222 // },
223 // categoryName: {
224 // ...
225 // },
226 // ...
227 // }
228 // The passed in parameters will filter the categories, containers and stats returned. If any of the
229 // parameters are either EmptyOrNull or the AllSubCommand value, all of that type will be returned.
230 // Case matters.
231 public static OSDMap GetStatsAsOSDMap(string pCategoryName, string pContainerName, string pStatName)
158 { 232 {
159 assetStats = new AssetStatsCollector(); 233 OSDMap map = new OSDMap();
234
235 foreach (string catName in RegisteredStats.Keys)
236 {
237 // Do this category if null spec, "all" subcommand or category name matches passed parameter.
238 // Skip category if none of the above.
239 if (!(String.IsNullOrEmpty(pCategoryName) || pCategoryName == AllSubCommand || pCategoryName == catName))
240 continue;
160 241
161 return assetStats; 242 OSDMap contMap = new OSDMap();
243 foreach (string contName in RegisteredStats[catName].Keys)
244 {
245 if (!(string.IsNullOrEmpty(pContainerName) || pContainerName == AllSubCommand || pContainerName == contName))
246 continue;
247
248 OSDMap statMap = new OSDMap();
249
250 SortedDictionary<string, Stat> theStats = RegisteredStats[catName][contName];
251 foreach (string statName in theStats.Keys)
252 {
253 if (!(String.IsNullOrEmpty(pStatName) || pStatName == AllSubCommand || pStatName == statName))
254 continue;
255
256 statMap.Add(statName, theStats[statName].ToOSDMap());
257 }
258
259 contMap.Add(contName, statMap);
260 }
261 map.Add(catName, contMap);
262 }
263
264 return map;
162 } 265 }
163 266
164 /// <summary> 267 public static Hashtable HandleStatsRequest(Hashtable request)
165 /// Start collecting statistics related to users.
166 /// Should only be called once.
167 /// </summary>
168 public static UserStatsCollector StartCollectingUserStats()
169 { 268 {
170 userStats = new UserStatsCollector(); 269 Hashtable responsedata = new Hashtable();
270// string regpath = request["uri"].ToString();
271 int response_code = 200;
272 string contenttype = "text/json";
273
274 string pCategoryName = StatsManager.AllSubCommand;
275 string pContainerName = StatsManager.AllSubCommand;
276 string pStatName = StatsManager.AllSubCommand;
277
278 if (request.ContainsKey("cat")) pCategoryName = request["cat"].ToString();
279 if (request.ContainsKey("cont")) pContainerName = request["cat"].ToString();
280 if (request.ContainsKey("stat")) pStatName = request["cat"].ToString();
281
282 string strOut = StatsManager.GetStatsAsOSDMap(pCategoryName, pContainerName, pStatName).ToString();
283
284 // If requestor wants it as a callback function, build response as a function rather than just the JSON string.
285 if (request.ContainsKey("callback"))
286 {
287 strOut = request["callback"].ToString() + "(" + strOut + ");";
288 }
171 289
172 return userStats; 290 // m_log.DebugFormat("{0} StatFetch: uri={1}, cat={2}, cont={3}, stat={4}, resp={5}",
291 // LogHeader, regpath, pCategoryName, pContainerName, pStatName, strOut);
292
293 responsedata["int_response_code"] = response_code;
294 responsedata["content_type"] = contenttype;
295 responsedata["keepalive"] = false;
296 responsedata["str_response_string"] = strOut;
297 responsedata["access_control_allow_origin"] = "*";
298
299 return responsedata;
173 } 300 }
174 301
302// /// <summary>
303// /// Start collecting statistics related to assets.
304// /// Should only be called once.
305// /// </summary>
306// public static AssetStatsCollector StartCollectingAssetStats()
307// {
308// assetStats = new AssetStatsCollector();
309//
310// return assetStats;
311// }
312//
313// /// <summary>
314// /// Start collecting statistics related to users.
315// /// Should only be called once.
316// /// </summary>
317// public static UserStatsCollector StartCollectingUserStats()
318// {
319// userStats = new UserStatsCollector();
320//
321// return userStats;
322// }
323
175 /// <summary> 324 /// <summary>
176 /// Registers a statistic. 325 /// Register a statistic.
177 /// </summary> 326 /// </summary>
178 /// <param name='stat'></param> 327 /// <param name='stat'></param>
179 /// <returns></returns> 328 /// <returns></returns>
@@ -187,7 +336,7 @@ namespace OpenSim.Framework.Monitoring
187 // Stat name is not unique across category/container/shortname key. 336 // Stat name is not unique across category/container/shortname key.
188 // XXX: For now just return false. This is to avoid problems in regression tests where all tests 337 // XXX: For now just return false. This is to avoid problems in regression tests where all tests
189 // in a class are run in the same instance of the VM. 338 // in a class are run in the same instance of the VM.
190 if (TryGetStat(stat, out category, out container)) 339 if (TryGetStatParents(stat, out category, out container))
191 return false; 340 return false;
192 341
193 // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed. 342 // We take a copy-on-write approach here of replacing dictionaries when keys are added or removed.
@@ -223,7 +372,7 @@ namespace OpenSim.Framework.Monitoring
223 372
224 lock (RegisteredStats) 373 lock (RegisteredStats)
225 { 374 {
226 if (!TryGetStat(stat, out category, out container)) 375 if (!TryGetStatParents(stat, out category, out container))
227 return false; 376 return false;
228 377
229 newContainer = new SortedDictionary<string, Stat>(container); 378 newContainer = new SortedDictionary<string, Stat>(container);
@@ -239,12 +388,67 @@ namespace OpenSim.Framework.Monitoring
239 } 388 }
240 } 389 }
241 390
242 public static bool TryGetStats(string category, out SortedDictionary<string, SortedDictionary<string, Stat>> stats) 391 public static bool TryGetStat(string category, string container, string statShortName, out Stat stat)
243 { 392 {
244 return RegisteredStats.TryGetValue(category, out stats); 393 stat = null;
394 SortedDictionary<string, SortedDictionary<string, Stat>> categoryStats;
395
396 lock (RegisteredStats)
397 {
398 if (!TryGetStatsForCategory(category, out categoryStats))
399 return false;
400
401 SortedDictionary<string, Stat> containerStats;
402
403 if (!categoryStats.TryGetValue(container, out containerStats))
404 return false;
405
406 return containerStats.TryGetValue(statShortName, out stat);
407 }
408 }
409
410 public static bool TryGetStatsForCategory(
411 string category, out SortedDictionary<string, SortedDictionary<string, Stat>> stats)
412 {
413 lock (RegisteredStats)
414 return RegisteredStats.TryGetValue(category, out stats);
415 }
416
417 /// <summary>
418 /// Get the same stat for each container in a given category.
419 /// </summary>
420 /// <returns>
421 /// The stats if there were any to fetch. Otherwise null.
422 /// </returns>
423 /// <param name='category'></param>
424 /// <param name='statShortName'></param>
425 public static List<Stat> GetStatsFromEachContainer(string category, string statShortName)
426 {
427 SortedDictionary<string, SortedDictionary<string, Stat>> categoryStats;
428
429 lock (RegisteredStats)
430 {
431 if (!RegisteredStats.TryGetValue(category, out categoryStats))
432 return null;
433
434 List<Stat> stats = null;
435
436 foreach (SortedDictionary<string, Stat> containerStats in categoryStats.Values)
437 {
438 if (containerStats.ContainsKey(statShortName))
439 {
440 if (stats == null)
441 stats = new List<Stat>();
442
443 stats.Add(containerStats[statShortName]);
444 }
445 }
446
447 return stats;
448 }
245 } 449 }
246 450
247 public static bool TryGetStat( 451 public static bool TryGetStatParents(
248 Stat stat, 452 Stat stat,
249 out SortedDictionary<string, SortedDictionary<string, Stat>> category, 453 out SortedDictionary<string, SortedDictionary<string, Stat>> category,
250 out SortedDictionary<string, Stat> container) 454 out SortedDictionary<string, Stat> container)
diff --git a/OpenSim/Framework/Monitoring/Watchdog.cs b/OpenSim/Framework/Monitoring/Watchdog.cs
index 69d2db5..32724ec 100644
--- a/OpenSim/Framework/Monitoring/Watchdog.cs
+++ b/OpenSim/Framework/Monitoring/Watchdog.cs
@@ -380,6 +380,7 @@ namespace OpenSim.Framework.Monitoring
380 if (MemoryWatchdog.Enabled) 380 if (MemoryWatchdog.Enabled)
381 MemoryWatchdog.Update(); 381 MemoryWatchdog.Update();
382 382
383 ChecksManager.CheckChecks();
383 StatsManager.RecordStats(); 384 StatsManager.RecordStats();
384 385
385 m_watchdogTimer.Start(); 386 m_watchdogTimer.Start();
diff --git a/OpenSim/Framework/RegionFlags.cs b/OpenSim/Framework/RegionFlags.cs
index a3089b0..7c6569e 100644
--- a/OpenSim/Framework/RegionFlags.cs
+++ b/OpenSim/Framework/RegionFlags.cs
@@ -48,6 +48,7 @@ namespace OpenSim.Framework
48 NoMove = 64, // Don't allow moving this region 48 NoMove = 64, // Don't allow moving this region
49 Reservation = 128, // This is an inactive reservation 49 Reservation = 128, // This is an inactive reservation
50 Authenticate = 256, // Require authentication 50 Authenticate = 256, // Require authentication
51 Hyperlink = 512 // Record represents a HG link 51 Hyperlink = 512, // Record represents a HG link
52 DefaultHGRegion = 1024 // Record represents a default region for hypergrid teleports only.
52 } 53 }
53} \ No newline at end of file 54} \ No newline at end of file
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 6c04c69..bfd67c7 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -86,26 +86,23 @@ namespace OpenSim.Framework.Servers
86 /// </summary> 86 /// </summary>
87 protected virtual void StartupSpecific() 87 protected virtual void StartupSpecific()
88 { 88 {
89 if (m_console == null) 89 StatsManager.SimExtraStats = new SimExtraStatsCollector();
90 return;
91
92 RegisterCommonCommands(); 90 RegisterCommonCommands();
93 91 RegisterCommonComponents(Config);
94 m_console.Commands.AddCommand("General", false, "quit", 92 }
95 "quit", 93
96 "Quit the application", HandleQuit); 94 protected override void ShutdownSpecific()
95 {
96 m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting...");
97
98 RemovePIDFile();
97 99
98 m_console.Commands.AddCommand("General", false, "shutdown", 100 base.ShutdownSpecific();
99 "shutdown", 101
100 "Quit the application", HandleQuit); 102 Environment.Exit(0);
101 } 103 }
102 104
103 /// <summary> 105 /// <summary>
104 /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing
105 /// </summary>
106 public virtual void ShutdownSpecific() {}
107
108 /// <summary>
109 /// Provides a list of help topics that are available. Overriding classes should append their topics to the 106 /// Provides a list of help topics that are available. Overriding classes should append their topics to the
110 /// information returned when the base method is called. 107 /// information returned when the base method is called.
111 /// </summary> 108 /// </summary>
@@ -153,25 +150,8 @@ namespace OpenSim.Framework.Servers
153 timeTaken.Minutes, timeTaken.Seconds); 150 timeTaken.Minutes, timeTaken.Seconds);
154 } 151 }
155 152
156 /// <summary> 153 public string osSecret
157 /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing
158 /// </summary>
159 public virtual void Shutdown()
160 { 154 {
161 ShutdownSpecific();
162
163 m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting...");
164 RemovePIDFile();
165
166 Environment.Exit(0);
167 }
168
169 private void HandleQuit(string module, string[] args)
170 {
171 Shutdown();
172 }
173
174 public string osSecret {
175 // Secret uuid for the simulator 155 // Secret uuid for the simulator
176 get { return m_osSecret; } 156 get { return m_osSecret; }
177 } 157 }
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index 97035e3..f4b4156 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -54,7 +54,6 @@ namespace OpenSim.Framework.Servers.HttpServer
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); 55 private HttpServerLogWriter httpserverlog = new HttpServerLogWriter();
56 56
57
58 /// <summary> 57 /// <summary>
59 /// This is a pending websocket request before it got an sucessful upgrade response. 58 /// This is a pending websocket request before it got an sucessful upgrade response.
60 /// The consumer must call handler.HandshakeAndUpgrade() to signal to the handler to 59 /// The consumer must call handler.HandshakeAndUpgrade() to signal to the handler to
@@ -81,6 +80,11 @@ namespace OpenSim.Framework.Servers.HttpServer
81 /// </remarks> 80 /// </remarks>
82 public int RequestNumber { get; private set; } 81 public int RequestNumber { get; private set; }
83 82
83 /// <summary>
84 /// Statistic for holding number of requests processed.
85 /// </summary>
86 private Stat m_requestsProcessedStat;
87
84 private volatile int NotSocketErrors = 0; 88 private volatile int NotSocketErrors = 0;
85 public volatile bool HTTPDRunning = false; 89 public volatile bool HTTPDRunning = false;
86 90
@@ -383,6 +387,8 @@ namespace OpenSim.Framework.Servers.HttpServer
383 387
384 if (TryGetPollServiceHTTPHandler(request.UriPath.ToString(), out psEvArgs)) 388 if (TryGetPollServiceHTTPHandler(request.UriPath.ToString(), out psEvArgs))
385 { 389 {
390 psEvArgs.RequestsReceived++;
391
386 PollServiceHttpRequest psreq = new PollServiceHttpRequest(psEvArgs, context, request); 392 PollServiceHttpRequest psreq = new PollServiceHttpRequest(psEvArgs, context, request);
387 393
388 if (psEvArgs.Request != null) 394 if (psEvArgs.Request != null)
@@ -437,9 +443,8 @@ namespace OpenSim.Framework.Servers.HttpServer
437 } 443 }
438 } 444 }
439 445
440 public void OnHandleRequestIOThread(IHttpClientContext context, IHttpRequest request) 446 private void OnHandleRequestIOThread(IHttpClientContext context, IHttpRequest request)
441 { 447 {
442
443 OSHttpRequest req = new OSHttpRequest(context, request); 448 OSHttpRequest req = new OSHttpRequest(context, request);
444 WebSocketRequestDelegate dWebSocketRequestDelegate = null; 449 WebSocketRequestDelegate dWebSocketRequestDelegate = null;
445 lock (m_WebSocketHandlers) 450 lock (m_WebSocketHandlers)
@@ -454,9 +459,8 @@ namespace OpenSim.Framework.Servers.HttpServer
454 } 459 }
455 460
456 OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context); 461 OSHttpResponse resp = new OSHttpResponse(new HttpResponse(context, request),context);
457 462 resp.ReuseContext = true;
458 HandleRequest(req, resp); 463 HandleRequest(req, resp);
459
460 464
461 // !!!HACK ALERT!!! 465 // !!!HACK ALERT!!!
462 // There seems to be a bug in the underlying http code that makes subsequent requests 466 // There seems to be a bug in the underlying http code that makes subsequent requests
@@ -687,7 +691,7 @@ namespace OpenSim.Framework.Servers.HttpServer
687 691
688 if (buffer != null) 692 if (buffer != null)
689 { 693 {
690 if (!response.SendChunked) 694 if (!response.SendChunked && response.ContentLength64 <= 0)
691 response.ContentLength64 = buffer.LongLength; 695 response.ContentLength64 = buffer.LongLength;
692 696
693 response.OutputStream.Write(buffer, 0, buffer.Length); 697 response.OutputStream.Write(buffer, 0, buffer.Length);
@@ -1850,8 +1854,8 @@ namespace OpenSim.Framework.Servers.HttpServer
1850 m_httpListener2.Start(64); 1854 m_httpListener2.Start(64);
1851 1855
1852 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events 1856 // Long Poll Service Manager with 3 worker threads a 25 second timeout for no events
1853// m_PollServiceManager = new PollServiceRequestManager(this, 3, 25000);
1854 m_PollServiceManager = new PollServiceRequestManager(this, 4, 25000); 1857 m_PollServiceManager = new PollServiceRequestManager(this, 4, 25000);
1858 m_PollServiceManager.Start();
1855 HTTPDRunning = true; 1859 HTTPDRunning = true;
1856 1860
1857 //HttpListenerContext context; 1861 //HttpListenerContext context;
@@ -1870,6 +1874,21 @@ namespace OpenSim.Framework.Servers.HttpServer
1870 // useful without inbound HTTP. 1874 // useful without inbound HTTP.
1871 throw e; 1875 throw e;
1872 } 1876 }
1877
1878 m_requestsProcessedStat
1879 = new Stat(
1880 "HTTPRequestsServed",
1881 "Number of inbound HTTP requests processed",
1882 "",
1883 "requests",
1884 "httpserver",
1885 Port.ToString(),
1886 StatType.Pull,
1887 MeasuresOfInterest.AverageChangeOverTime,
1888 stat => stat.Value = RequestNumber,
1889 StatVerbosity.Debug);
1890
1891 StatsManager.RegisterStat(m_requestsProcessedStat);
1873 } 1892 }
1874 1893
1875 public void httpServerDisconnectMonitor(IHttpClientContext source, SocketError err) 1894 public void httpServerDisconnectMonitor(IHttpClientContext source, SocketError err)
@@ -1902,9 +1921,12 @@ namespace OpenSim.Framework.Servers.HttpServer
1902 public void Stop() 1921 public void Stop()
1903 { 1922 {
1904 HTTPDRunning = false; 1923 HTTPDRunning = false;
1924
1925 StatsManager.DeregisterStat(m_requestsProcessedStat);
1926
1905 try 1927 try
1906 { 1928 {
1907// m_PollServiceManager.Stop(); 1929 m_PollServiceManager.Stop();
1908 1930
1909 m_httpListener2.ExceptionThrown -= httpServerException; 1931 m_httpListener2.ExceptionThrown -= httpServerException;
1910 //m_httpListener2.DisconnectHandler = null; 1932 //m_httpListener2.DisconnectHandler = null;
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseOutputStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseOutputStreamHandler.cs
new file mode 100644
index 0000000..72b3065
--- /dev/null
+++ b/OpenSim/Framework/Servers/HttpServer/BaseOutputStreamHandler.cs
@@ -0,0 +1,60 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System.IO;
29
30namespace OpenSim.Framework.Servers.HttpServer
31{
32 /// <summary>
33 /// Base handler for writing to an output stream
34 /// </summary>
35 /// <remarks>
36 /// Inheriting classes should override ProcessRequest() rather than Handle()
37 /// </remarks>
38 public abstract class BaseOutputStreamHandler : BaseRequestHandler, IRequestHandler
39 {
40 protected BaseOutputStreamHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {}
41
42 protected BaseOutputStreamHandler(string httpMethod, string path, string name, string description)
43 : base(httpMethod, path, name, description) {}
44
45 public virtual void Handle(
46 string path, Stream request, Stream response, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
47 {
48 RequestsReceived++;
49
50 ProcessRequest(path, request, response, httpRequest, httpResponse);
51
52 RequestsHandled++;
53 }
54
55 protected virtual void ProcessRequest(
56 string path, Stream request, Stream response, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
57 {
58 }
59 }
60} \ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs
index ae7aaf2..bbac699 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseRequestHandler.cs
@@ -31,6 +31,10 @@ namespace OpenSim.Framework.Servers.HttpServer
31{ 31{
32 public abstract class BaseRequestHandler 32 public abstract class BaseRequestHandler
33 { 33 {
34 public int RequestsReceived { get; protected set; }
35
36 public int RequestsHandled { get; protected set; }
37
34 public virtual string ContentType 38 public virtual string ContentType
35 { 39 {
36 get { return "application/xml"; } 40 get { return "application/xml"; }
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
index 6342983..252cc2a 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseStreamHandler.cs
@@ -29,14 +29,35 @@ using System.IO;
29 29
30namespace OpenSim.Framework.Servers.HttpServer 30namespace OpenSim.Framework.Servers.HttpServer
31{ 31{
32 /// <summary>
33 /// Base streamed request handler.
34 /// </summary>
35 /// <remarks>
36 /// Inheriting classes should override ProcessRequest() rather than Handle()
37 /// </remarks>
32 public abstract class BaseStreamHandler : BaseRequestHandler, IStreamedRequestHandler 38 public abstract class BaseStreamHandler : BaseRequestHandler, IStreamedRequestHandler
33 { 39 {
34 public abstract byte[] Handle(string path, Stream request,
35 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse);
36
37 protected BaseStreamHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {} 40 protected BaseStreamHandler(string httpMethod, string path) : this(httpMethod, path, null, null) {}
38 41
39 protected BaseStreamHandler(string httpMethod, string path, string name, string description) 42 protected BaseStreamHandler(string httpMethod, string path, string name, string description)
40 : base(httpMethod, path, name, description) {} 43 : base(httpMethod, path, name, description) {}
44
45 public virtual byte[] Handle(
46 string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
47 {
48 RequestsReceived++;
49
50 byte[] result = ProcessRequest(path, request, httpRequest, httpResponse);
51
52 RequestsHandled++;
53
54 return result;
55 }
56
57 protected virtual byte[] ProcessRequest(
58 string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
59 {
60 return null;
61 }
41 } 62 }
42} \ No newline at end of file 63} \ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
index b94bfb4..1b03f54 100644
--- a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Framework.Servers.HttpServer
45 m_method = binaryMethod; 45 m_method = binaryMethod;
46 } 46 }
47 47
48 public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 48 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
49 { 49 {
50 byte[] data = ReadFully(request); 50 byte[] data = ReadFully(request);
51 string param = GetParam(path); 51 string param = GetParam(path);
diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
index cb5cce5..b8541cb 100644
--- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs
@@ -32,7 +32,6 @@ namespace OpenSim.Framework.Servers.HttpServer
32{ 32{
33 public interface IRequestHandler 33 public interface IRequestHandler
34 { 34 {
35
36 /// <summary> 35 /// <summary>
37 /// Name for this handler. 36 /// Name for this handler.
38 /// </summary> 37 /// </summary>
@@ -59,6 +58,19 @@ namespace OpenSim.Framework.Servers.HttpServer
59 58
60 // Return path 59 // Return path
61 string Path { get; } 60 string Path { get; }
61
62 /// <summary>
63 /// Number of requests received by this handler
64 /// </summary>
65 int RequestsReceived { get; }
66
67 /// <summary>
68 /// Number of requests handled.
69 /// </summary>
70 /// <remarks>
71 /// Should be equal to RequestsReceived unless requested are being handled slowly or there is deadlock.
72 /// </remarks>
73 int RequestsHandled { get; }
62 } 74 }
63 75
64 public interface IStreamedRequestHandler : IRequestHandler 76 public interface IStreamedRequestHandler : IRequestHandler
@@ -69,7 +81,6 @@ namespace OpenSim.Framework.Servers.HttpServer
69 81
70 public interface IStreamHandler : IRequestHandler 82 public interface IStreamHandler : IRequestHandler
71 { 83 {
72 // Handle request stream, return byte array
73 void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse); 84 void Handle(string path, Stream request, Stream response, IOSHttpRequest httpReqbuest, IOSHttpResponse httpResponse);
74 } 85 }
75 86
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
index c19ac32..3fd3bf7 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs
@@ -50,25 +50,39 @@ namespace OpenSim.Framework.Servers.HttpServer
50 50
51 public enum EventType : int 51 public enum EventType : int
52 { 52 {
53 Normal = 0, 53 LongPoll = 0,
54 LslHttp = 1, 54 LslHttp = 1,
55 Inventory = 2, 55 Inventory = 2,
56 Texture = 3, 56 Texture = 3,
57 Mesh = 4 57 Mesh = 4
58 } 58 }
59 59
60 public string Url { get; set; }
61
62 /// <summary>
63 /// Number of requests received for this poll service.
64 /// </summary>
65 public int RequestsReceived { get; set; }
66
67 /// <summary>
68 /// Number of requests handled by this poll service.
69 /// </summary>
70 public int RequestsHandled { get; set; }
71
60 public PollServiceEventArgs( 72 public PollServiceEventArgs(
61 RequestMethod pRequest, 73 RequestMethod pRequest,
74 string pUrl,
62 HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, 75 HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents,
63 UUID pId, int pTimeOutms) 76 UUID pId, int pTimeOutms)
64 { 77 {
65 Request = pRequest; 78 Request = pRequest;
79 Url = pUrl;
66 HasEvents = pHasEvents; 80 HasEvents = pHasEvents;
67 GetEvents = pGetEvents; 81 GetEvents = pGetEvents;
68 NoEvents = pNoEvents; 82 NoEvents = pNoEvents;
69 Id = pId; 83 Id = pId;
70 TimeOutms = pTimeOutms; 84 TimeOutms = pTimeOutms;
71 Type = EventType.Normal; 85 Type = EventType.LongPoll;
72 } 86 }
73 } 87 }
74} 88}
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
index 723530a..6aa9479 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceHttpRequest.cs
@@ -26,13 +26,19 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
30using System.Reflection;
31using System.Text;
29using HttpServer; 32using HttpServer;
33using log4net;
30using OpenMetaverse; 34using OpenMetaverse;
31 35
32namespace OpenSim.Framework.Servers.HttpServer 36namespace OpenSim.Framework.Servers.HttpServer
33{ 37{
34 public class PollServiceHttpRequest 38 public class PollServiceHttpRequest
35 { 39 {
40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41
36 public readonly PollServiceEventArgs PollServiceArgs; 42 public readonly PollServiceEventArgs PollServiceArgs;
37 public readonly IHttpClientContext HttpContext; 43 public readonly IHttpClientContext HttpContext;
38 public readonly IHttpRequest Request; 44 public readonly IHttpRequest Request;
@@ -48,5 +54,44 @@ namespace OpenSim.Framework.Servers.HttpServer
48 RequestTime = System.Environment.TickCount; 54 RequestTime = System.Environment.TickCount;
49 RequestID = UUID.Random(); 55 RequestID = UUID.Random();
50 } 56 }
57
58 internal void DoHTTPGruntWork(BaseHttpServer server, Hashtable responsedata)
59 {
60 OSHttpResponse response
61 = new OSHttpResponse(new HttpResponse(HttpContext, Request), HttpContext);
62
63 byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
64
65 response.SendChunked = false;
66 response.ContentLength64 = buffer.Length;
67 response.ContentEncoding = Encoding.UTF8;
68
69 try
70 {
71 response.OutputStream.Write(buffer, 0, buffer.Length);
72 }
73 catch (Exception ex)
74 {
75 m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
76 }
77 finally
78 {
79 //response.OutputStream.Close();
80 try
81 {
82 response.OutputStream.Flush();
83 response.Send();
84
85 //if (!response.KeepAlive && response.ReuseContext)
86 // response.FreeContext();
87 }
88 catch (Exception e)
89 {
90 m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
91 }
92
93 PollServiceArgs.RequestsHandled++;
94 }
95 }
51 } 96 }
52} \ No newline at end of file 97} \ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index 5406f00..44f7045 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -64,14 +64,17 @@ namespace OpenSim.Framework.Servers.HttpServer
64 m_server = pSrv; 64 m_server = pSrv;
65 m_WorkerThreadCount = pWorkerThreadCount; 65 m_WorkerThreadCount = pWorkerThreadCount;
66 m_workerThreads = new Thread[m_WorkerThreadCount]; 66 m_workerThreads = new Thread[m_WorkerThreadCount];
67 }
67 68
69 public void Start()
70 {
68 //startup worker threads 71 //startup worker threads
69 for (uint i = 0; i < m_WorkerThreadCount; i++) 72 for (uint i = 0; i < m_WorkerThreadCount; i++)
70 { 73 {
71 m_workerThreads[i] 74 m_workerThreads[i]
72 = Watchdog.StartThread( 75 = Watchdog.StartThread(
73 PoolWorkerJob, 76 PoolWorkerJob,
74 String.Format("PollServiceWorkerThread{0}", i), 77 string.Format("PollServiceWorkerThread{0}:{1}", i, m_server.Port),
75 ThreadPriority.Normal, 78 ThreadPriority.Normal,
76 false, 79 false,
77 false, 80 false,
@@ -81,7 +84,7 @@ namespace OpenSim.Framework.Servers.HttpServer
81 84
82 m_retrysThread = Watchdog.StartThread( 85 m_retrysThread = Watchdog.StartThread(
83 this.CheckRetries, 86 this.CheckRetries,
84 "PollServiceWatcherThread", 87 string.Format("PollServiceWatcherThread:{0}", m_server.Port),
85 ThreadPriority.Normal, 88 ThreadPriority.Normal,
86 false, 89 false,
87 true, 90 true,
@@ -89,7 +92,6 @@ namespace OpenSim.Framework.Servers.HttpServer
89 1000 * 60 * 10); 92 1000 * 60 * 10);
90 } 93 }
91 94
92
93 private void ReQueueEvent(PollServiceHttpRequest req) 95 private void ReQueueEvent(PollServiceHttpRequest req)
94 { 96 {
95 if (m_running) 97 if (m_running)
@@ -103,7 +105,7 @@ namespace OpenSim.Framework.Servers.HttpServer
103 { 105 {
104 if (m_running) 106 if (m_running)
105 { 107 {
106 if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.Normal) 108 if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.LongPoll)
107 { 109 {
108 m_requests.Enqueue(req); 110 m_requests.Enqueue(req);
109 } 111 }
@@ -140,13 +142,13 @@ namespace OpenSim.Framework.Servers.HttpServer
140 } 142 }
141 } 143 }
142 144
143 ~PollServiceRequestManager() 145 public void Stop()
144 { 146 {
145 m_running = false; 147 m_running = false;
146 Thread.Sleep(1000); // let the world move 148 Thread.Sleep(1000); // let the world move
147 149
148 foreach (Thread t in m_workerThreads) 150 foreach (Thread t in m_workerThreads)
149 Watchdog.AbortThread(t.ManagedThreadId); 151 Watchdog.AbortThread(t.ManagedThreadId);
150 152
151 try 153 try
152 { 154 {
@@ -205,7 +207,7 @@ namespace OpenSim.Framework.Servers.HttpServer
205 if (responsedata == null) 207 if (responsedata == null)
206 continue; 208 continue;
207 209
208 if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.Normal) // This is the event queue 210 if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LongPoll) // This is the event queue
209 { 211 {
210 try 212 try
211 { 213 {
diff --git a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
index 07082a8..bd55657 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestDeserialiseHandler.cs
@@ -33,7 +33,7 @@ namespace OpenSim.Framework.Servers.HttpServer
33{ 33{
34 public delegate TResponse RestDeserialiseMethod<TRequest, TResponse>(TRequest request); 34 public delegate TResponse RestDeserialiseMethod<TRequest, TResponse>(TRequest request);
35 35
36 public class RestDeserialiseHandler<TRequest, TResponse> : BaseRequestHandler, IStreamHandler 36 public class RestDeserialiseHandler<TRequest, TResponse> : BaseOutputStreamHandler, IStreamHandler
37 where TRequest : new() 37 where TRequest : new()
38 { 38 {
39 private RestDeserialiseMethod<TRequest, TResponse> m_method; 39 private RestDeserialiseMethod<TRequest, TResponse> m_method;
@@ -48,7 +48,7 @@ namespace OpenSim.Framework.Servers.HttpServer
48 m_method = method; 48 m_method = method;
49 } 49 }
50 50
51 public void Handle(string path, Stream request, Stream responseStream, 51 protected override void ProcessRequest(string path, Stream request, Stream responseStream,
52 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 52 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
53 { 53 {
54 TRequest deserial; 54 TRequest deserial;
diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
index edcd134..83c9848 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
@@ -183,7 +183,7 @@ namespace OpenSim.Framework.Servers.HttpServer
183 183
184 public delegate bool CheckIdentityMethod(string sid, string aid); 184 public delegate bool CheckIdentityMethod(string sid, string aid);
185 185
186 public class RestDeserialiseSecureHandler<TRequest, TResponse> : BaseRequestHandler, IStreamHandler 186 public class RestDeserialiseSecureHandler<TRequest, TResponse> : BaseOutputStreamHandler, IStreamHandler
187 where TRequest : new() 187 where TRequest : new()
188 { 188 {
189 private static readonly ILog m_log 189 private static readonly ILog m_log
@@ -201,7 +201,7 @@ namespace OpenSim.Framework.Servers.HttpServer
201 m_method = method; 201 m_method = method;
202 } 202 }
203 203
204 public void Handle(string path, Stream request, Stream responseStream, 204 protected override void ProcessRequest(string path, Stream request, Stream responseStream,
205 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 205 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
206 { 206 {
207 RestSessionObject<TRequest> deserial = default(RestSessionObject<TRequest>); 207 RestSessionObject<TRequest> deserial = default(RestSessionObject<TRequest>);
@@ -237,7 +237,7 @@ namespace OpenSim.Framework.Servers.HttpServer
237 237
238 public delegate bool CheckTrustedSourceMethod(IPEndPoint peer); 238 public delegate bool CheckTrustedSourceMethod(IPEndPoint peer);
239 239
240 public class RestDeserialiseTrustedHandler<TRequest, TResponse> : BaseRequestHandler, IStreamHandler 240 public class RestDeserialiseTrustedHandler<TRequest, TResponse> : BaseOutputStreamHandler, IStreamHandler
241 where TRequest : new() 241 where TRequest : new()
242 { 242 {
243 private static readonly ILog m_log 243 private static readonly ILog m_log
@@ -260,7 +260,7 @@ namespace OpenSim.Framework.Servers.HttpServer
260 m_method = method; 260 m_method = method;
261 } 261 }
262 262
263 public void Handle(string path, Stream request, Stream responseStream, 263 protected override void ProcessRequest(string path, Stream request, Stream responseStream,
264 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 264 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
265 { 265 {
266 TRequest deserial = default(TRequest); 266 TRequest deserial = default(TRequest);
@@ -292,6 +292,5 @@ namespace OpenSim.Framework.Servers.HttpServer
292 serializer.Serialize(xmlWriter, response); 292 serializer.Serialize(xmlWriter, response);
293 } 293 }
294 } 294 }
295 } 295 }
296 296} \ No newline at end of file
297}
diff --git a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
index 1f17fee..0305dee 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestStreamHandler.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Framework.Servers.HttpServer
48 m_restMethod = restMethod; 48 m_restMethod = restMethod;
49 } 49 }
50 50
51 public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 51 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
52 { 52 {
53 Encoding encoding = Encoding.UTF8; 53 Encoding encoding = Encoding.UTF8;
54 StreamReader streamReader = new StreamReader(request, encoding); 54 StreamReader streamReader = new StreamReader(request, encoding);
diff --git a/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs b/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs
index ee96b47..de89e2e 100644
--- a/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/WebsocketServerHandler.cs
@@ -75,7 +75,7 @@ namespace OpenSim.Framework.Servers.HttpServer
75 /// <summary> 75 /// <summary>
76 /// This is a regular HTTP Request... This may be removed in the future. 76 /// This is a regular HTTP Request... This may be removed in the future.
77 /// </summary> 77 /// </summary>
78 public event RegularHttpRequestDelegate OnRegularHttpRequest; 78// public event RegularHttpRequestDelegate OnRegularHttpRequest;
79 79
80 /// <summary> 80 /// <summary>
81 /// When the upgrade from a HTTP request to a Websocket is completed, this will be fired 81 /// When the upgrade from a HTTP request to a Websocket is completed, this will be fired
@@ -304,15 +304,14 @@ namespace OpenSim.Framework.Servers.HttpServer
304 if (d != null) 304 if (d != null)
305 d(this, new UpgradeCompletedEventArgs()); 305 d(this, new UpgradeCompletedEventArgs());
306 } 306 }
307 catch (IOException fail) 307 catch (IOException)
308 { 308 {
309 Close(string.Empty); 309 Close(string.Empty);
310 } 310 }
311 catch (ObjectDisposedException fail) 311 catch (ObjectDisposedException)
312 { 312 {
313 Close(string.Empty); 313 Close(string.Empty);
314 } 314 }
315
316 } 315 }
317 316
318 /// <summary> 317 /// <summary>
@@ -414,8 +413,6 @@ namespace OpenSim.Framework.Servers.HttpServer
414 _socketState.Header = pheader; 413 _socketState.Header = pheader;
415 } 414 }
416 415
417
418
419 if (_socketState.FrameComplete) 416 if (_socketState.FrameComplete)
420 { 417 {
421 ProcessFrame(_socketState); 418 ProcessFrame(_socketState);
@@ -424,7 +421,6 @@ namespace OpenSim.Framework.Servers.HttpServer
424 _socketState.ExpectedBytes = 0; 421 _socketState.ExpectedBytes = 0;
425 422
426 } 423 }
427
428 } 424 }
429 } 425 }
430 else 426 else
@@ -457,8 +453,7 @@ namespace OpenSim.Framework.Servers.HttpServer
457 _socketState.ReceivedBytes.Clear(); 453 _socketState.ReceivedBytes.Clear();
458 _socketState.ExpectedBytes = 0; 454 _socketState.ExpectedBytes = 0;
459 // do some processing 455 // do some processing
460 } 456 }
461
462 } 457 }
463 } 458 }
464 if (offset > 0) 459 if (offset > 0)
@@ -477,13 +472,12 @@ namespace OpenSim.Framework.Servers.HttpServer
477 { 472 {
478 // We can't read the stream anymore... 473 // We can't read the stream anymore...
479 } 474 }
480
481 } 475 }
482 catch (IOException fail) 476 catch (IOException)
483 { 477 {
484 Close(string.Empty); 478 Close(string.Empty);
485 } 479 }
486 catch (ObjectDisposedException fail) 480 catch (ObjectDisposedException)
487 { 481 {
488 Close(string.Empty); 482 Close(string.Empty);
489 } 483 }
diff --git a/OpenSim/Framework/Servers/MainServer.cs b/OpenSim/Framework/Servers/MainServer.cs
index cfd34bb..57931d4 100644
--- a/OpenSim/Framework/Servers/MainServer.cs
+++ b/OpenSim/Framework/Servers/MainServer.cs
@@ -121,12 +121,14 @@ namespace OpenSim.Framework.Servers
121 + " level >= 2 then long warnings are logged when receiving bad input data.\n" 121 + " level >= 2 then long warnings are logged when receiving bad input data.\n"
122 + " level >= 3 then short notices about all incoming non-poll HTTP requests are logged.\n" 122 + " level >= 3 then short notices about all incoming non-poll HTTP requests are logged.\n"
123 + " level >= 4 then the time taken to fulfill the request is logged.\n" 123 + " level >= 4 then the time taken to fulfill the request is logged.\n"
124 + " level >= 5 then a sample from the beginning of the incoming data is logged.\n" 124 + " level >= 5 then a sample from the beginning of the data is logged.\n"
125 + " level >= 6 then the entire incoming data is logged.\n" 125 + " level >= 6 then the entire data is logged.\n"
126 + " no level is specified then the current level is returned.\n\n" 126 + " no level is specified then the current level is returned.\n\n"
127 + "If out or all and\n" 127 + "If out or all and\n"
128 + " level >= 3 then short notices about all outgoing requests going through WebUtil are logged.\n" 128 + " level >= 3 then short notices about all outgoing requests going through WebUtil are logged.\n"
129 + " level >= 4 then the time taken to fulfill the request is logged.\n", 129 + " level >= 4 then the time taken to fulfill the request is logged.\n"
130 + " level >= 5 then a sample from the beginning of the data is logged.\n"
131 + " level >= 6 then the entire data is logged.\n",
130 HandleDebugHttpCommand); 132 HandleDebugHttpCommand);
131 } 133 }
132 134
@@ -283,7 +285,12 @@ namespace OpenSim.Framework.Servers
283 public static bool RemoveHttpServer(uint port) 285 public static bool RemoveHttpServer(uint port)
284 { 286 {
285 lock (m_Servers) 287 lock (m_Servers)
288 {
289 if (instance != null && instance.Port == port)
290 instance = null;
291
286 return m_Servers.Remove(port); 292 return m_Servers.Remove(port);
293 }
287 } 294 }
288 295
289 /// <summary> 296 /// <summary>
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs
index 1ff8aca..7108314 100644
--- a/OpenSim/Framework/Servers/ServerBase.cs
+++ b/OpenSim/Framework/Servers/ServerBase.cs
@@ -62,6 +62,8 @@ namespace OpenSim.Framework.Servers
62 62
63 protected string m_pidFile = String.Empty; 63 protected string m_pidFile = String.Empty;
64 64
65 protected ServerStatsCollector m_serverStatsCollector;
66
65 /// <summary> 67 /// <summary>
66 /// Server version information. Usually VersionInfo + information about git commit, operating system, etc. 68 /// Server version information. Usually VersionInfo + information about git commit, operating system, etc.
67 /// </summary> 69 /// </summary>
@@ -76,6 +78,11 @@ namespace OpenSim.Framework.Servers
76 78
77 protected void CreatePIDFile(string path) 79 protected void CreatePIDFile(string path)
78 { 80 {
81 if (File.Exists(path))
82 m_log.ErrorFormat(
83 "[SERVER BASE]: Previous pid file {0} still exists on startup. Possibly previously unclean shutdown.",
84 path);
85
79 try 86 try
80 { 87 {
81 string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); 88 string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
@@ -239,7 +246,7 @@ namespace OpenSim.Framework.Servers
239 "Show thread status", HandleShow); 246 "Show thread status", HandleShow);
240 247
241 m_console.Commands.AddCommand( 248 m_console.Commands.AddCommand(
242 "General", false, "threads abort", 249 "Debug", false, "threads abort",
243 "threads abort <thread-id>", 250 "threads abort <thread-id>",
244 "Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort); 251 "Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
245 252
@@ -249,11 +256,180 @@ namespace OpenSim.Framework.Servers
249 "Show thread status. Synonym for \"show threads\"", 256 "Show thread status. Synonym for \"show threads\"",
250 (string module, string[] args) => Notice(GetThreadsReport())); 257 (string module, string[] args) => Notice(GetThreadsReport()));
251 258
259 m_console.Commands.AddCommand (
260 "Debug", false, "debug comms set",
261 "debug comms set serialosdreq true|false",
262 "Set comms parameters. For debug purposes.",
263 HandleDebugCommsSet);
264
265 m_console.Commands.AddCommand (
266 "Debug", false, "debug comms status",
267 "debug comms status",
268 "Show current debug comms parameters.",
269 HandleDebugCommsStatus);
270
271 m_console.Commands.AddCommand (
272 "Debug", false, "debug threadpool set",
273 "debug threadpool set worker|iocp min|max <n>",
274 "Set threadpool parameters. For debug purposes.",
275 HandleDebugThreadpoolSet);
276
277 m_console.Commands.AddCommand (
278 "Debug", false, "debug threadpool status",
279 "debug threadpool status",
280 "Show current debug threadpool parameters.",
281 HandleDebugThreadpoolStatus);
282
252 m_console.Commands.AddCommand( 283 m_console.Commands.AddCommand(
253 "General", false, "force gc", 284 "Debug", false, "force gc",
254 "force gc", 285 "force gc",
255 "Manually invoke runtime garbage collection. For debugging purposes", 286 "Manually invoke runtime garbage collection. For debugging purposes",
256 HandleForceGc); 287 HandleForceGc);
288
289 m_console.Commands.AddCommand(
290 "General", false, "quit",
291 "quit",
292 "Quit the application", (mod, args) => Shutdown());
293
294 m_console.Commands.AddCommand(
295 "General", false, "shutdown",
296 "shutdown",
297 "Quit the application", (mod, args) => Shutdown());
298
299 ChecksManager.RegisterConsoleCommands(m_console);
300 StatsManager.RegisterConsoleCommands(m_console);
301 }
302
303 public void RegisterCommonComponents(IConfigSource configSource)
304 {
305 IConfig networkConfig = configSource.Configs["Network"];
306
307 if (networkConfig != null)
308 {
309 WebUtil.SerializeOSDRequestsPerEndpoint = networkConfig.GetBoolean("SerializeOSDRequests", false);
310 }
311
312 m_serverStatsCollector = new ServerStatsCollector();
313 m_serverStatsCollector.Initialise(configSource);
314 m_serverStatsCollector.Start();
315 }
316
317 private void HandleDebugCommsStatus(string module, string[] args)
318 {
319 Notice("serialosdreq is {0}", WebUtil.SerializeOSDRequestsPerEndpoint);
320 }
321
322 private void HandleDebugCommsSet(string module, string[] args)
323 {
324 if (args.Length != 5)
325 {
326 Notice("Usage: debug comms set serialosdreq true|false");
327 return;
328 }
329
330 if (args[3] != "serialosdreq")
331 {
332 Notice("Usage: debug comms set serialosdreq true|false");
333 return;
334 }
335
336 bool setSerializeOsdRequests;
337
338 if (!ConsoleUtil.TryParseConsoleBool(m_console, args[4], out setSerializeOsdRequests))
339 return;
340
341 WebUtil.SerializeOSDRequestsPerEndpoint = setSerializeOsdRequests;
342
343 Notice("serialosdreq is now {0}", setSerializeOsdRequests);
344 }
345
346 private void HandleDebugThreadpoolStatus(string module, string[] args)
347 {
348 int workerThreads, iocpThreads;
349
350 ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
351 Notice("Min worker threads: {0}", workerThreads);
352 Notice("Min IOCP threads: {0}", iocpThreads);
353
354 ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
355 Notice("Max worker threads: {0}", workerThreads);
356 Notice("Max IOCP threads: {0}", iocpThreads);
357
358 ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);
359 Notice("Available worker threads: {0}", workerThreads);
360 Notice("Available IOCP threads: {0}", iocpThreads);
361 }
362
363 private void HandleDebugThreadpoolSet(string module, string[] args)
364 {
365 if (args.Length != 6)
366 {
367 Notice("Usage: debug threadpool set worker|iocp min|max <n>");
368 return;
369 }
370
371 int newThreads;
372
373 if (!ConsoleUtil.TryParseConsoleInt(m_console, args[5], out newThreads))
374 return;
375
376 string poolType = args[3];
377 string bound = args[4];
378
379 bool fail = false;
380 int workerThreads, iocpThreads;
381
382 if (poolType == "worker")
383 {
384 if (bound == "min")
385 {
386 ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
387
388 if (!ThreadPool.SetMinThreads(newThreads, iocpThreads))
389 fail = true;
390 }
391 else
392 {
393 ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
394
395 if (!ThreadPool.SetMaxThreads(newThreads, iocpThreads))
396 fail = true;
397 }
398 }
399 else
400 {
401 if (bound == "min")
402 {
403 ThreadPool.GetMinThreads(out workerThreads, out iocpThreads);
404
405 if (!ThreadPool.SetMinThreads(workerThreads, newThreads))
406 fail = true;
407 }
408 else
409 {
410 ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
411
412 if (!ThreadPool.SetMaxThreads(workerThreads, newThreads))
413 fail = true;
414 }
415 }
416
417 if (fail)
418 {
419 Notice("ERROR: Could not set {0} {1} threads to {2}", poolType, bound, newThreads);
420 }
421 else
422 {
423 int minWorkerThreads, maxWorkerThreads, minIocpThreads, maxIocpThreads;
424
425 ThreadPool.GetMinThreads(out minWorkerThreads, out minIocpThreads);
426 ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxIocpThreads);
427
428 Notice("Min worker threads now {0}", minWorkerThreads);
429 Notice("Min IOCP threads now {0}", minIocpThreads);
430 Notice("Max worker threads now {0}", maxWorkerThreads);
431 Notice("Max IOCP threads now {0}", maxIocpThreads);
432 }
257 } 433 }
258 434
259 private void HandleForceGc(string module, string[] args) 435 private void HandleForceGc(string module, string[] args)
@@ -641,7 +817,68 @@ namespace OpenSim.Framework.Servers
641 sb.AppendFormat("Total threads active: {0}\n\n", totalThreads); 817 sb.AppendFormat("Total threads active: {0}\n\n", totalThreads);
642 818
643 sb.Append("Main threadpool (excluding script engine pools)\n"); 819 sb.Append("Main threadpool (excluding script engine pools)\n");
644 sb.Append(Util.GetThreadPoolReport()); 820 sb.Append(GetThreadPoolReport());
821
822 return sb.ToString();
823 }
824
825 /// <summary>
826 /// Get a thread pool report.
827 /// </summary>
828 /// <returns></returns>
829 public static string GetThreadPoolReport()
830 {
831 string threadPoolUsed = null;
832 int maxThreads = 0;
833 int minThreads = 0;
834 int allocatedThreads = 0;
835 int inUseThreads = 0;
836 int waitingCallbacks = 0;
837 int completionPortThreads = 0;
838
839 StringBuilder sb = new StringBuilder();
840 if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
841 {
842 STPInfo stpi = Util.GetSmartThreadPoolInfo();
843
844 // ROBUST currently leaves this the FireAndForgetMethod but never actually initializes the threadpool.
845 if (stpi != null)
846 {
847 threadPoolUsed = "SmartThreadPool";
848 maxThreads = stpi.MaxThreads;
849 minThreads = stpi.MinThreads;
850 inUseThreads = stpi.InUseThreads;
851 allocatedThreads = stpi.ActiveThreads;
852 waitingCallbacks = stpi.WaitingCallbacks;
853 }
854 }
855 else if (
856 Util.FireAndForgetMethod == FireAndForgetMethod.QueueUserWorkItem
857 || Util.FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem)
858 {
859 threadPoolUsed = "BuiltInThreadPool";
860 ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads);
861 ThreadPool.GetMinThreads(out minThreads, out completionPortThreads);
862 int availableThreads;
863 ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads);
864 inUseThreads = maxThreads - availableThreads;
865 allocatedThreads = -1;
866 waitingCallbacks = -1;
867 }
868
869 if (threadPoolUsed != null)
870 {
871 sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed);
872 sb.AppendFormat("Max threads : {0}\n", maxThreads);
873 sb.AppendFormat("Min threads : {0}\n", minThreads);
874 sb.AppendFormat("Allocated threads : {0}\n", allocatedThreads < 0 ? "not applicable" : allocatedThreads.ToString());
875 sb.AppendFormat("In use threads : {0}\n", inUseThreads);
876 sb.AppendFormat("Work items waiting : {0}\n", waitingCallbacks < 0 ? "not available" : waitingCallbacks.ToString());
877 }
878 else
879 {
880 sb.AppendFormat("Thread pool not used\n");
881 }
645 882
646 return sb.ToString(); 883 return sb.ToString();
647 } 884 }
@@ -693,5 +930,16 @@ namespace OpenSim.Framework.Servers
693 if (m_console != null) 930 if (m_console != null)
694 m_console.OutputFormat(format, components); 931 m_console.OutputFormat(format, components);
695 } 932 }
933
934 public virtual void Shutdown()
935 {
936 m_serverStatsCollector.Close();
937 ShutdownSpecific();
938 }
939
940 /// <summary>
941 /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing
942 /// </summary>
943 protected virtual void ShutdownSpecific() {}
696 } 944 }
697} 945}
diff --git a/OpenSim/Framework/Tests/LocationTest.cs b/OpenSim/Framework/Tests/LocationTest.cs
index a56ecb4..3d5d1d2 100644
--- a/OpenSim/Framework/Tests/LocationTest.cs
+++ b/OpenSim/Framework/Tests/LocationTest.cs
@@ -51,21 +51,28 @@ namespace OpenSim.Framework.Tests
51 [Test] 51 [Test]
52 public void locationXYRegionHandle() 52 public void locationXYRegionHandle()
53 { 53 {
54 Location TestLocation1 = new Location(256000,256000); 54 Location TestLocation1 = new Location(255000,256000);
55 Location TestLocation2 = new Location(1099511628032000); 55 Location TestLocation2 = new Location(1095216660736000);
56 Assert.That(TestLocation1 == TestLocation2); 56 Assert.That(TestLocation1 == TestLocation2);
57 57
58 Assert.That(TestLocation2.X == 256000 && TestLocation2.Y == 256000, "Test xy location doesn't match regionhandle provided"); 58 Assert.That(TestLocation1.X == 255000 && TestLocation1.Y == 256000, "Test xy location doesn't match position in the constructor");
59 Assert.That(TestLocation2.X == 255000 && TestLocation2.Y == 256000, "Test xy location doesn't match regionhandle provided");
59 60
60 Assert.That(TestLocation2.RegionHandle == 1099511628032000, 61 Assert.That(TestLocation2.RegionHandle == 1095216660736000,
61 "Location RegionHandle Property didn't match regionhandle provided in constructor"); 62 "Location RegionHandle Property didn't match regionhandle provided in constructor");
62 63
64 ulong RegionHandle = TestLocation1.RegionHandle;
65 Assert.That(RegionHandle.Equals(1095216660736000), "Equals(regionhandle) failed to match the position in the constructor");
63 66
64 TestLocation1 = new Location(256001, 256001); 67 TestLocation2 = new Location(RegionHandle);
65 TestLocation2 = new Location(1099511628032000); 68 Assert.That(TestLocation2.Equals(255000, 256000), "Decoded regionhandle failed to match the original position in the constructor");
69
70
71 TestLocation1 = new Location(255001, 256001);
72 TestLocation2 = new Location(1095216660736000);
66 Assert.That(TestLocation1 != TestLocation2); 73 Assert.That(TestLocation1 != TestLocation2);
67 74
68 Assert.That(TestLocation1.Equals(256001, 256001), "Equals(x,y) failed to match the position in the constructor"); 75 Assert.That(TestLocation1.Equals(255001, 256001), "Equals(x,y) failed to match the position in the constructor");
69 76
70 Assert.That(TestLocation2.GetHashCode() == (TestLocation2.X.GetHashCode() ^ TestLocation2.Y.GetHashCode()), "GetHashCode failed to produce the expected hashcode"); 77 Assert.That(TestLocation2.GetHashCode() == (TestLocation2.X.GetHashCode() ^ TestLocation2.Y.GetHashCode()), "GetHashCode failed to produce the expected hashcode");
71 78
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
index 0fbdaf3..08f2af5 100644
--- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
+++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs
@@ -100,7 +100,7 @@ namespace OpenSim.Framework.Tests
100 cadu.AVHeight = Size1.Z; 100 cadu.AVHeight = Size1.Z;
101 101
102 AgentPosition position2 = new AgentPosition(); 102 AgentPosition position2 = new AgentPosition();
103 position2.CopyFrom(cadu); 103 position2.CopyFrom(cadu, position1.SessionID);
104 104
105 Assert.IsTrue( 105 Assert.IsTrue(
106 position2.AgentID == position1.AgentID 106 position2.AgentID == position1.AgentID
diff --git a/OpenSim/Framework/Tests/UtilTest.cs b/OpenSim/Framework/Tests/UtilTest.cs
index 11ca068..3b7f252 100644
--- a/OpenSim/Framework/Tests/UtilTest.cs
+++ b/OpenSim/Framework/Tests/UtilTest.cs
@@ -282,5 +282,87 @@ namespace OpenSim.Framework.Tests
282 String.Format("Incorrect InventoryType mapped from Content-Type {0}", invcontenttypes[i])); 282 String.Format("Incorrect InventoryType mapped from Content-Type {0}", invcontenttypes[i]));
283 } 283 }
284 } 284 }
285
286 [Test]
287 public void FakeParcelIDTests()
288 {
289 byte[] hexBytes8 = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 };
290 byte[] hexBytes16 = {
291 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
292 0x77, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f };
293 UInt64 var64Bit = (UInt64)0xfedcba9876543210;
294
295 //Region handle is for location 255000,256000.
296 ulong regionHandle1 = 1095216660736000;
297 uint x1 = 100;
298 uint y1 = 200;
299 uint z1 = 22;
300 ulong regionHandle2;
301 uint x2, y2, z2;
302 UUID fakeParcelID1, fakeParcelID2, uuid;
303
304 ulong bigInt64 = Util.BytesToUInt64Big(hexBytes8);
305 Assert.AreEqual(var64Bit, bigInt64,
306 "BytesToUint64Bit conversion of 8 bytes to UInt64 failed.");
307
308 //Test building and decoding using some typical input values
309 fakeParcelID1 = Util.BuildFakeParcelID(regionHandle1, x1, y1);
310 Util.ParseFakeParcelID(fakeParcelID1, out regionHandle2, out x2, out y2);
311 Assert.AreEqual(regionHandle1, regionHandle2,
312 "region handle decoded from FakeParcelID wth X/Y failed.");
313 Assert.AreEqual(x1, x2,
314 "X coordinate decoded from FakeParcelID wth X/Y failed.");
315 Assert.AreEqual(y1, y2,
316 "Y coordinate decoded from FakeParcelID wth X/Y failed.");
317
318 fakeParcelID1 = Util.BuildFakeParcelID(regionHandle1, x1, y1, z1);
319 Util.ParseFakeParcelID(fakeParcelID1, out regionHandle2, out x2, out y2, out z2);
320 Assert.AreEqual(regionHandle1, regionHandle2,
321 "region handle decoded from FakeParcelID with X/Y/Z failed.");
322 Assert.AreEqual(x1, x2,
323 "X coordinate decoded from FakeParcelID with X/Y/Z failed.");
324 Assert.AreEqual(y1, y2,
325 "Y coordinate decoded from FakeParcelID with X/Y/Z failed.");
326 Assert.AreEqual(z1, z2,
327 "Z coordinate decoded from FakeParcelID with X/Y/Z failed.");
328
329 //Do some more extreme tests to check the encoding and decoding
330 x1 = 0x55aa;
331 y1 = 0x9966;
332 z1 = 0x5a96;
333
334 fakeParcelID1 = Util.BuildFakeParcelID(var64Bit, x1, y1);
335 Util.ParseFakeParcelID(fakeParcelID1, out regionHandle2, out x2, out y2);
336 Assert.AreEqual(var64Bit, regionHandle2,
337 "region handle decoded from FakeParcelID with X/Y/Z failed.");
338 Assert.AreEqual(x1, x2,
339 "X coordinate decoded from FakeParcelID with X/Y/Z failed.");
340 Assert.AreEqual(y1, y2,
341 "Y coordinate decoded from FakeParcelID with X/Y/Z failed.");
342
343 fakeParcelID1 = Util.BuildFakeParcelID(var64Bit, x1, y1, z1);
344 Util.ParseFakeParcelID(fakeParcelID1, out regionHandle2, out x2, out y2, out z2);
345 Assert.AreEqual(var64Bit, regionHandle2,
346 "region handle decoded from FakeParcelID with X/Y/Z failed.");
347 Assert.AreEqual(x1, x2,
348 "X coordinate decoded from FakeParcelID with X/Y/Z failed.");
349 Assert.AreEqual(y1, y2,
350 "Y coordinate decoded from FakeParcelID with X/Y/Z failed.");
351 Assert.AreEqual(z1, z2,
352 "Z coordinate decoded from FakeParcelID with X/Y/Z failed.");
353
354
355 x1 = 64;
356 y1 = 192;
357 fakeParcelID1 = Util.BuildFakeParcelID(regionHandle1, x1, y1);
358 Util.FakeParcelIDToGlobalPosition(fakeParcelID1, out x2, out y2);
359 Assert.AreEqual(255000+x1, x2,
360 "Global X coordinate decoded from regionHandle failed.");
361 Assert.AreEqual(256000+y1, y2,
362 "Global Y coordinate decoded from regionHandle failed.");
363
364 uuid = new UUID("00dd0700-00d1-0700-3800-000032000000");
365 Util.FakeParcelIDToGlobalPosition(uuid, out x2, out y2);
366 }
285 } 367 }
286} 368}
diff --git a/OpenSim/Framework/UserProfiles.cs b/OpenSim/Framework/UserProfiles.cs
new file mode 100644
index 0000000..6133591
--- /dev/null
+++ b/OpenSim/Framework/UserProfiles.cs
@@ -0,0 +1,117 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using OpenMetaverse;
30
31namespace OpenSim.Framework
32{
33 public class UserClassifiedAdd
34 {
35 public UUID ClassifiedId = UUID.Zero;
36 public UUID CreatorId = UUID.Zero;
37 public int CreationDate = 0;
38 public int ExpirationDate = 0;
39 public int Category = 0;
40 public string Name = string.Empty;
41 public string Description = string.Empty;
42 public UUID ParcelId = UUID.Zero;
43 public int ParentEstate = 0;
44 public UUID SnapshotId = UUID.Zero;
45 public string SimName = string.Empty;
46 public string GlobalPos = "<0,0,0>";
47 public string ParcelName = string.Empty;
48 public byte Flags = 0;
49 public int Price = 0;
50 }
51
52 public class UserProfileProperties
53 {
54 public UUID UserId = UUID.Zero;
55 public UUID PartnerId = UUID.Zero;
56 public bool PublishProfile = false;
57 public bool PublishMature = false;
58 public string WebUrl = string.Empty;
59 public int WantToMask = 0;
60 public string WantToText = string.Empty;
61 public int SkillsMask = 0;
62 public string SkillsText = string.Empty;
63 public string Language = string.Empty;
64 public UUID ImageId = UUID.Zero;
65 public string AboutText = string.Empty;
66 public UUID FirstLifeImageId = UUID.Zero;
67 public string FirstLifeText = string.Empty;
68 }
69
70 public class UserProfilePick
71 {
72 public UUID PickId = UUID.Zero;
73 public UUID CreatorId = UUID.Zero;
74 public bool TopPick = false;
75 public string Name = string.Empty;
76 public string OriginalName = string.Empty;
77 public string Desc = string.Empty;
78 public UUID ParcelId = UUID.Zero;
79 public UUID SnapshotId = UUID.Zero;
80 public string User = string.Empty;
81 public string SimName = string.Empty;
82 public string GlobalPos = "<0,0,0>";
83 public int SortOrder = 0;
84 public bool Enabled = false;
85 }
86
87 public class UserProfileNotes
88 {
89 public UUID UserId;
90 public UUID TargetId;
91 public string Notes;
92 }
93
94 public class UserAccountProperties
95 {
96 public string EmailAddress = string.Empty;
97 public string Firstname = string.Empty;
98 public string LastName = string.Empty;
99 public string Password = string.Empty;
100 public string UserId = string.Empty;
101 }
102
103 public class UserAccountAuth
104 {
105 public string UserId = UUID.Zero.ToString();
106 public string Password = string.Empty;
107 }
108
109 public class UserAppData
110 {
111 public string TagId = string.Empty;
112 public string DataKey = string.Empty;
113 public string UserId = UUID.Zero.ToString();
114 public string DataVal = string.Empty;
115 }
116}
117
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 557f38e..7db575b 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -89,9 +89,30 @@ namespace OpenSim.Framework
89 } 89 }
90 90
91 /// <summary> 91 /// <summary>
92 /// Class for delivering SmartThreadPool statistical information
93 /// </summary>
94 /// <remarks>
95 /// We do it this way so that we do not directly expose STP.
96 /// </remarks>
97 public class STPInfo
98 {
99 public string Name { get; set; }
100 public STPStartInfo STPStartInfo { get; set; }
101 public WIGStartInfo WIGStartInfo { get; set; }
102 public bool IsIdle { get; set; }
103 public bool IsShuttingDown { get; set; }
104 public int MaxThreads { get; set; }
105 public int MinThreads { get; set; }
106 public int InUseThreads { get; set; }
107 public int ActiveThreads { get; set; }
108 public int WaitingCallbacks { get; set; }
109 public int MaxConcurrentWorkItems { get; set; }
110 }
111
112 /// <summary>
92 /// Miscellaneous utility functions 113 /// Miscellaneous utility functions
93 /// </summary> 114 /// </summary>
94 public class Util 115 public static class Util
95 { 116 {
96 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 117 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
97 118
@@ -109,7 +130,7 @@ namespace OpenSim.Framework
109 private static SmartThreadPool m_ThreadPool; 130 private static SmartThreadPool m_ThreadPool;
110 131
111 // Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC. 132 // Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC.
112 private static readonly DateTime unixEpoch = 133 public static readonly DateTime UnixEpoch =
113 DateTime.ParseExact("1970-01-01 00:00:00 +0", "yyyy-MM-dd hh:mm:ss z", DateTimeFormatInfo.InvariantInfo).ToUniversalTime(); 134 DateTime.ParseExact("1970-01-01 00:00:00 +0", "yyyy-MM-dd hh:mm:ss z", DateTimeFormatInfo.InvariantInfo).ToUniversalTime();
114 135
115 private static readonly string rawUUIDPattern 136 private static readonly string rawUUIDPattern
@@ -120,6 +141,11 @@ namespace OpenSim.Framework
120 public static FireAndForgetMethod DefaultFireAndForgetMethod = FireAndForgetMethod.SmartThreadPool; 141 public static FireAndForgetMethod DefaultFireAndForgetMethod = FireAndForgetMethod.SmartThreadPool;
121 public static FireAndForgetMethod FireAndForgetMethod = DefaultFireAndForgetMethod; 142 public static FireAndForgetMethod FireAndForgetMethod = DefaultFireAndForgetMethod;
122 143
144 public static bool IsPlatformMono
145 {
146 get { return Type.GetType("Mono.Runtime") != null; }
147 }
148
123 /// <summary> 149 /// <summary>
124 /// Gets the name of the directory where the current running executable 150 /// Gets the name of the directory where the current running executable
125 /// is located 151 /// is located
@@ -495,20 +521,18 @@ namespace OpenSim.Framework
495 521
496 public static int ToUnixTime(DateTime stamp) 522 public static int ToUnixTime(DateTime stamp)
497 { 523 {
498 TimeSpan t = stamp.ToUniversalTime() - unixEpoch; 524 TimeSpan t = stamp.ToUniversalTime() - UnixEpoch;
499 return (int) t.TotalSeconds; 525 return (int)t.TotalSeconds;
500 } 526 }
501 527
502 public static DateTime ToDateTime(ulong seconds) 528 public static DateTime ToDateTime(ulong seconds)
503 { 529 {
504 DateTime epoch = unixEpoch; 530 return UnixEpoch.AddSeconds(seconds);
505 return epoch.AddSeconds(seconds);
506 } 531 }
507 532
508 public static DateTime ToDateTime(int seconds) 533 public static DateTime ToDateTime(int seconds)
509 { 534 {
510 DateTime epoch = unixEpoch; 535 return UnixEpoch.AddSeconds(seconds);
511 return epoch.AddSeconds(seconds);
512 } 536 }
513 537
514 /// <summary> 538 /// <summary>
@@ -1233,7 +1257,7 @@ namespace OpenSim.Framework
1233 byte[] bytes = 1257 byte[] bytes =
1234 { 1258 {
1235 (byte)regionHandle, (byte)(regionHandle >> 8), (byte)(regionHandle >> 16), (byte)(regionHandle >> 24), 1259 (byte)regionHandle, (byte)(regionHandle >> 8), (byte)(regionHandle >> 16), (byte)(regionHandle >> 24),
1236 (byte)(regionHandle >> 32), (byte)(regionHandle >> 40), (byte)(regionHandle >> 48), (byte)(regionHandle << 56), 1260 (byte)(regionHandle >> 32), (byte)(regionHandle >> 40), (byte)(regionHandle >> 48), (byte)(regionHandle >> 56),
1237 (byte)x, (byte)(x >> 8), 0, 0, 1261 (byte)x, (byte)(x >> 8), 0, 0,
1238 (byte)y, (byte)(y >> 8), 0, 0 }; 1262 (byte)y, (byte)(y >> 8), 0, 0 };
1239 return new UUID(bytes, 0); 1263 return new UUID(bytes, 0);
@@ -1244,7 +1268,7 @@ namespace OpenSim.Framework
1244 byte[] bytes = 1268 byte[] bytes =
1245 { 1269 {
1246 (byte)regionHandle, (byte)(regionHandle >> 8), (byte)(regionHandle >> 16), (byte)(regionHandle >> 24), 1270 (byte)regionHandle, (byte)(regionHandle >> 8), (byte)(regionHandle >> 16), (byte)(regionHandle >> 24),
1247 (byte)(regionHandle >> 32), (byte)(regionHandle >> 40), (byte)(regionHandle >> 48), (byte)(regionHandle << 56), 1271 (byte)(regionHandle >> 32), (byte)(regionHandle >> 40), (byte)(regionHandle >> 48), (byte)(regionHandle >> 56),
1248 (byte)x, (byte)(x >> 8), (byte)z, (byte)(z >> 8), 1272 (byte)x, (byte)(x >> 8), (byte)z, (byte)(z >> 8),
1249 (byte)y, (byte)(y >> 8), 0, 0 }; 1273 (byte)y, (byte)(y >> 8), 0, 0 };
1250 return new UUID(bytes, 0); 1274 return new UUID(bytes, 0);
@@ -1317,7 +1341,7 @@ namespace OpenSim.Framework
1317 ru = "OSX/Mono"; 1341 ru = "OSX/Mono";
1318 else 1342 else
1319 { 1343 {
1320 if (Type.GetType("Mono.Runtime") != null) 1344 if (IsPlatformMono)
1321 ru = "Win/Mono"; 1345 ru = "Win/Mono";
1322 else 1346 else
1323 ru = "Win/.NET"; 1347 ru = "Win/.NET";
@@ -1765,10 +1789,12 @@ namespace OpenSim.Framework
1765 FireAndForget(callback, null); 1789 FireAndForget(callback, null);
1766 } 1790 }
1767 1791
1768 public static void InitThreadPool(int maxThreads) 1792 public static void InitThreadPool(int minThreads, int maxThreads)
1769 { 1793 {
1770 if (maxThreads < 2) 1794 if (maxThreads < 2)
1771 throw new ArgumentOutOfRangeException("maxThreads", "maxThreads must be greater than 2"); 1795 throw new ArgumentOutOfRangeException("maxThreads", "maxThreads must be greater than 2");
1796 if (minThreads > maxThreads || minThreads < 2)
1797 throw new ArgumentOutOfRangeException("minThreads", "minThreads must be greater than 2 and less than or equal to maxThreads");
1772 if (m_ThreadPool != null) 1798 if (m_ThreadPool != null)
1773 throw new InvalidOperationException("SmartThreadPool is already initialized"); 1799 throw new InvalidOperationException("SmartThreadPool is already initialized");
1774 1800
@@ -1776,7 +1802,7 @@ namespace OpenSim.Framework
1776 startInfo.ThreadPoolName = "Util"; 1802 startInfo.ThreadPoolName = "Util";
1777 startInfo.IdleTimeout = 2000; 1803 startInfo.IdleTimeout = 2000;
1778 startInfo.MaxWorkerThreads = maxThreads; 1804 startInfo.MaxWorkerThreads = maxThreads;
1779 startInfo.MinWorkerThreads = 2; 1805 startInfo.MinWorkerThreads = minThreads;
1780 1806
1781 m_ThreadPool = new SmartThreadPool(startInfo); 1807 m_ThreadPool = new SmartThreadPool(startInfo);
1782 } 1808 }
@@ -1851,8 +1877,8 @@ namespace OpenSim.Framework
1851 break; 1877 break;
1852 case FireAndForgetMethod.SmartThreadPool: 1878 case FireAndForgetMethod.SmartThreadPool:
1853 if (m_ThreadPool == null) 1879 if (m_ThreadPool == null)
1854 InitThreadPool(15); 1880 InitThreadPool(2, 15);
1855 m_ThreadPool.QueueWorkItem(SmartThreadPoolCallback, new object[] { realCallback, obj }); 1881 m_ThreadPool.QueueWorkItem((cb, o) => cb(o), realCallback, obj);
1856 break; 1882 break;
1857 case FireAndForgetMethod.Thread: 1883 case FireAndForgetMethod.Thread:
1858 Thread thread = new Thread(delegate(object o) { realCallback(o); }); 1884 Thread thread = new Thread(delegate(object o) { realCallback(o); });
@@ -1864,72 +1890,29 @@ namespace OpenSim.Framework
1864 } 1890 }
1865 1891
1866 /// <summary> 1892 /// <summary>
1867 /// Get a thread pool report. 1893 /// Get information about the current state of the smart thread pool.
1868 /// </summary> 1894 /// </summary>
1869 /// <returns></returns> 1895 /// <returns>
1870 public static string GetThreadPoolReport() 1896 /// null if this isn't the pool being used for non-scriptengine threads.
1897 /// </returns>
1898 public static STPInfo GetSmartThreadPoolInfo()
1871 { 1899 {
1872 string threadPoolUsed = null; 1900 if (m_ThreadPool == null)
1873 int maxThreads = 0; 1901 return null;
1874 int minThreads = 0;
1875 int allocatedThreads = 0;
1876 int inUseThreads = 0;
1877 int waitingCallbacks = 0;
1878 int completionPortThreads = 0;
1879
1880 StringBuilder sb = new StringBuilder();
1881 if (FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
1882 {
1883 // ROBUST currently leaves this the FireAndForgetMethod but never actually initializes the threadpool.
1884 if (m_ThreadPool != null)
1885 {
1886 threadPoolUsed = "SmartThreadPool";
1887 maxThreads = m_ThreadPool.MaxThreads;
1888 minThreads = m_ThreadPool.MinThreads;
1889 inUseThreads = m_ThreadPool.InUseThreads;
1890 allocatedThreads = m_ThreadPool.ActiveThreads;
1891 waitingCallbacks = m_ThreadPool.WaitingCallbacks;
1892 }
1893 }
1894 else if (
1895 FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem
1896 || FireAndForgetMethod == FireAndForgetMethod.UnsafeQueueUserWorkItem)
1897 {
1898 threadPoolUsed = "BuiltInThreadPool";
1899 ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads);
1900 ThreadPool.GetMinThreads(out minThreads, out completionPortThreads);
1901 int availableThreads;
1902 ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads);
1903 inUseThreads = maxThreads - availableThreads;
1904 allocatedThreads = -1;
1905 waitingCallbacks = -1;
1906 }
1907
1908 if (threadPoolUsed != null)
1909 {
1910 sb.AppendFormat("Thread pool used : {0}\n", threadPoolUsed);
1911 sb.AppendFormat("Max threads : {0}\n", maxThreads);
1912 sb.AppendFormat("Min threads : {0}\n", minThreads);
1913 sb.AppendFormat("Allocated threads : {0}\n", allocatedThreads < 0 ? "not applicable" : allocatedThreads.ToString());
1914 sb.AppendFormat("In use threads : {0}\n", inUseThreads);
1915 sb.AppendFormat("Work items waiting : {0}\n", waitingCallbacks < 0 ? "not available" : waitingCallbacks.ToString());
1916 }
1917 else
1918 {
1919 sb.AppendFormat("Thread pool not used\n");
1920 }
1921
1922 return sb.ToString();
1923 }
1924 1902
1925 private static object SmartThreadPoolCallback(object o) 1903 STPInfo stpi = new STPInfo();
1926 { 1904 stpi.Name = m_ThreadPool.Name;
1927 object[] array = (object[])o; 1905 stpi.STPStartInfo = m_ThreadPool.STPStartInfo;
1928 WaitCallback callback = (WaitCallback)array[0]; 1906 stpi.IsIdle = m_ThreadPool.IsIdle;
1929 object obj = array[1]; 1907 stpi.IsShuttingDown = m_ThreadPool.IsShuttingdown;
1908 stpi.MaxThreads = m_ThreadPool.MaxThreads;
1909 stpi.MinThreads = m_ThreadPool.MinThreads;
1910 stpi.InUseThreads = m_ThreadPool.InUseThreads;
1911 stpi.ActiveThreads = m_ThreadPool.ActiveThreads;
1912 stpi.WaitingCallbacks = m_ThreadPool.WaitingCallbacks;
1913 stpi.MaxConcurrentWorkItems = m_ThreadPool.Concurrency;
1930 1914
1931 callback(obj); 1915 return stpi;
1932 return null;
1933 } 1916 }
1934 1917
1935 #endregion FireAndForget Threading Pattern 1918 #endregion FireAndForget Threading Pattern
@@ -2148,7 +2131,7 @@ namespace OpenSim.Framework
2148 /// <param name="secret">the secret part</param> 2131 /// <param name="secret">the secret part</param>
2149 public static bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname, out string secret) 2132 public static bool ParseUniversalUserIdentifier(string value, out UUID uuid, out string url, out string firstname, out string lastname, out string secret)
2150 { 2133 {
2151 uuid = UUID.Zero; url = string.Empty; firstname = "Unknown"; lastname = "User"; secret = string.Empty; 2134 uuid = UUID.Zero; url = string.Empty; firstname = "Unknown"; lastname = "UserUPUUI"; secret = string.Empty;
2152 2135
2153 string[] parts = value.Split(';'); 2136 string[] parts = value.Split(';');
2154 if (parts.Length >= 1) 2137 if (parts.Length >= 1)
@@ -2282,7 +2265,7 @@ namespace OpenSim.Framework
2282 { 2265 {
2283 lock (m_syncRoot) 2266 lock (m_syncRoot)
2284 { 2267 {
2285 m_lowQueue.Enqueue(data); 2268 q.Enqueue(data);
2286 m_s.WaitOne(0); 2269 m_s.WaitOne(0);
2287 m_s.Release(); 2270 m_s.Release();
2288 } 2271 }
@@ -2322,7 +2305,7 @@ namespace OpenSim.Framework
2322 { 2305 {
2323 if (m_highQueue.Count > 0) 2306 if (m_highQueue.Count > 0)
2324 res = m_highQueue.Dequeue(); 2307 res = m_highQueue.Dequeue();
2325 else 2308 else if (m_lowQueue.Count > 0)
2326 res = m_lowQueue.Dequeue(); 2309 res = m_lowQueue.Dequeue();
2327 2310
2328 if (m_highQueue.Count == 0 && m_lowQueue.Count == 0) 2311 if (m_highQueue.Count == 0 && m_lowQueue.Count == 0)
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index bf57fd4..9fa93ea 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -67,6 +67,11 @@ namespace OpenSim.Framework
67 public static int RequestNumber { get; internal set; } 67 public static int RequestNumber { get; internal set; }
68 68
69 /// <summary> 69 /// <summary>
70 /// Control where OSD requests should be serialized per endpoint.
71 /// </summary>
72 public static bool SerializeOSDRequestsPerEndpoint { get; set; }
73
74 /// <summary>
70 /// this is the header field used to communicate the local request id 75 /// this is the header field used to communicate the local request id
71 /// used for performance and debugging 76 /// used for performance and debugging
72 /// </summary> 77 /// </summary>
@@ -145,10 +150,50 @@ namespace OpenSim.Framework
145 150
146 public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed) 151 public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed)
147 { 152 {
148 lock (EndPointLock(url)) 153 if (SerializeOSDRequestsPerEndpoint)
154 {
155 lock (EndPointLock(url))
156 {
157 return ServiceOSDRequestWorker(url, data, method, timeout, compressed);
158 }
159 }
160 else
161 {
162 return ServiceOSDRequestWorker(url, data, method, timeout, compressed);
163 }
164 }
165
166 public static void LogOutgoingDetail(Stream outputStream)
167 {
168 using (StreamReader reader = new StreamReader(Util.Copy(outputStream), Encoding.UTF8))
169 {
170 string output;
171
172 if (DebugLevel == 5)
173 {
174 const int sampleLength = 80;
175 char[] sampleChars = new char[sampleLength];
176 reader.Read(sampleChars, 0, sampleLength);
177 output = new string(sampleChars);
178 }
179 else
180 {
181 output = reader.ReadToEnd();
182 }
183
184 LogOutgoingDetail(output);
185 }
186 }
187
188 public static void LogOutgoingDetail(string output)
189 {
190 if (DebugLevel == 5)
149 { 191 {
150 return ServiceOSDRequestWorker(url,data,method,timeout,compressed); 192 output = output.Substring(0, 80);
193 output = output + "...";
151 } 194 }
195
196 m_log.DebugFormat("[WEB UTIL]: {0}", output.Replace("\n", @"\n"));
152 } 197 }
153 198
154 private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) 199 private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed)
@@ -178,7 +223,11 @@ namespace OpenSim.Framework
178 // If there is some input, write it into the request 223 // If there is some input, write it into the request
179 if (data != null) 224 if (data != null)
180 { 225 {
181 strBuffer = OSDParser.SerializeJsonString(data); 226 strBuffer = OSDParser.SerializeJsonString(data);
227
228 if (DebugLevel >= 5)
229 LogOutgoingDetail(strBuffer);
230
182 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); 231 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
183 232
184 if (compressed) 233 if (compressed)
@@ -358,6 +407,10 @@ namespace OpenSim.Framework
358 if (data != null) 407 if (data != null)
359 { 408 {
360 queryString = BuildQueryString(data); 409 queryString = BuildQueryString(data);
410
411 if (DebugLevel >= 5)
412 LogOutgoingDetail(queryString);
413
361 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); 414 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString);
362 415
363 request.ContentLength = buffer.Length; 416 request.ContentLength = buffer.Length;
@@ -769,6 +822,9 @@ namespace OpenSim.Framework
769 int length = (int)buffer.Length; 822 int length = (int)buffer.Length;
770 request.ContentLength = length; 823 request.ContentLength = length;
771 824
825 if (WebUtil.DebugLevel >= 5)
826 WebUtil.LogOutgoingDetail(buffer);
827
772 request.BeginGetRequestStream(delegate(IAsyncResult res) 828 request.BeginGetRequestStream(delegate(IAsyncResult res)
773 { 829 {
774 Stream requestStream = request.EndGetRequestStream(res); 830 Stream requestStream = request.EndGetRequestStream(res);
@@ -928,11 +984,12 @@ namespace OpenSim.Framework
928 /// <param name="verb"></param> 984 /// <param name="verb"></param>
929 /// <param name="requestUrl"></param> 985 /// <param name="requestUrl"></param>
930 /// <param name="obj"> </param> 986 /// <param name="obj"> </param>
987 /// <param name="timeoutsecs"> </param>
931 /// <returns></returns> 988 /// <returns></returns>
932 /// 989 ///
933 /// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting 990 /// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
934 /// the request. You'll want to make sure you deal with this as they're not uncommon</exception> 991 /// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
935 public static string MakeRequest(string verb, string requestUrl, string obj) 992 public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs)
936 { 993 {
937 int reqnum = WebUtil.RequestNumber++; 994 int reqnum = WebUtil.RequestNumber++;
938 995
@@ -946,6 +1003,8 @@ namespace OpenSim.Framework
946 1003
947 WebRequest request = WebRequest.Create(requestUrl); 1004 WebRequest request = WebRequest.Create(requestUrl);
948 request.Method = verb; 1005 request.Method = verb;
1006 if (timeoutsecs > 0)
1007 request.Timeout = timeoutsecs * 1000;
949 string respstring = String.Empty; 1008 string respstring = String.Empty;
950 1009
951 int tickset = Util.EnvironmentTickCountSubtract(tickstart); 1010 int tickset = Util.EnvironmentTickCountSubtract(tickstart);
@@ -966,6 +1025,9 @@ namespace OpenSim.Framework
966 length = (int)obj.Length; 1025 length = (int)obj.Length;
967 request.ContentLength = length; 1026 request.ContentLength = length;
968 1027
1028 if (WebUtil.DebugLevel >= 5)
1029 WebUtil.LogOutgoingDetail(buffer);
1030
969 Stream requestStream = null; 1031 Stream requestStream = null;
970 try 1032 try
971 { 1033 {
@@ -1039,6 +1101,11 @@ namespace OpenSim.Framework
1039 1101
1040 return respstring; 1102 return respstring;
1041 } 1103 }
1104
1105 public static string MakeRequest(string verb, string requestUrl, string obj)
1106 {
1107 return MakeRequest(verb, requestUrl, obj, -1);
1108 }
1042 } 1109 }
1043 1110
1044 public class SynchronousRestObjectRequester 1111 public class SynchronousRestObjectRequester
@@ -1111,6 +1178,9 @@ namespace OpenSim.Framework
1111 int length = (int)buffer.Length; 1178 int length = (int)buffer.Length;
1112 request.ContentLength = length; 1179 request.ContentLength = length;
1113 1180
1181 if (WebUtil.DebugLevel >= 5)
1182 WebUtil.LogOutgoingDetail(buffer);
1183
1114 Stream requestStream = null; 1184 Stream requestStream = null;
1115 try 1185 try
1116 { 1186 {
@@ -1213,4 +1283,4 @@ namespace OpenSim.Framework
1213 return deserial; 1283 return deserial;
1214 } 1284 }
1215 } 1285 }
1216} 1286} \ No newline at end of file
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index c3e7ec2..3a4e5df 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -103,48 +103,63 @@ namespace OpenSim
103 "[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset"); 103 "[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset");
104 104
105 // Verify the Threadpool allocates or uses enough worker and IO completion threads 105 // Verify the Threadpool allocates or uses enough worker and IO completion threads
106 // .NET 2.0 workerthreads default to 50 * numcores 106 // .NET 2.0, workerthreads default to 50 * numcores
107 // .NET 3.0 workerthreads defaults to 250 * numcores 107 // .NET 3.0, workerthreads defaults to 250 * numcores
108 // .NET 4.0 workerthreads are dynamic based on bitness and OS resources 108 // .NET 4.0, workerthreads are dynamic based on bitness and OS resources
109 // Max IO Completion threads are 1000 on all 3 CLRs. 109 // Max IO Completion threads are 1000 on all 3 CLRs
110 //
111 // Mono 2.10.9 to at least Mono 3.1, workerthreads default to 100 * numcores, iocp threads to 4 * numcores
110 int workerThreadsMin = 500; 112 int workerThreadsMin = 500;
111 int workerThreadsMax = 1000; // may need further adjustment to match other CLR 113 int workerThreadsMax = 1000; // may need further adjustment to match other CLR
112 int iocpThreadsMin = 1000; 114 int iocpThreadsMin = 1000;
113 int iocpThreadsMax = 2000; // may need further adjustment to match other CLR 115 int iocpThreadsMax = 2000; // may need further adjustment to match other CLR
116
117 {
118 int currentMinWorkerThreads, currentMinIocpThreads;
119 System.Threading.ThreadPool.GetMinThreads(out currentMinWorkerThreads, out currentMinIocpThreads);
120 m_log.InfoFormat(
121 "[OPENSIM MAIN]: Runtime gave us {0} min worker threads and {1} min IOCP threads",
122 currentMinWorkerThreads, currentMinIocpThreads);
123 }
124
114 int workerThreads, iocpThreads; 125 int workerThreads, iocpThreads;
115 System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads); 126 System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
116 m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} worker threads and {1} IOCP threads", workerThreads, iocpThreads); 127 m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} max worker threads and {1} max IOCP threads", workerThreads, iocpThreads);
128
117 if (workerThreads < workerThreadsMin) 129 if (workerThreads < workerThreadsMin)
118 { 130 {
119 workerThreads = workerThreadsMin; 131 workerThreads = workerThreadsMin;
120 m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to worker threads to {0}",workerThreads); 132 m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to max worker threads to {0}",workerThreads);
121 } 133 }
122 if (workerThreads > workerThreadsMax) 134 if (workerThreads > workerThreadsMax)
123 { 135 {
124 workerThreads = workerThreadsMax; 136 workerThreads = workerThreadsMax;
125 m_log.InfoFormat("[OPENSIM MAIN]: Limiting worker threads to {0}",workerThreads); 137 m_log.InfoFormat("[OPENSIM MAIN]: Limiting max worker threads to {0}",workerThreads);
126 } 138 }
139
127 // Increase the number of IOCP threads available. 140 // Increase the number of IOCP threads available.
128 // Mono defaults to a tragically low number (24 on 6-core / 8GB Fedora 17) 141 // Mono defaults to a tragically low number (24 on 6-core / 8GB Fedora 17)
129 if (iocpThreads < iocpThreadsMin) 142 if (iocpThreads < iocpThreadsMin)
130 { 143 {
131 iocpThreads = iocpThreadsMin; 144 iocpThreads = iocpThreadsMin;
132 m_log.InfoFormat("[OPENSIM MAIN]: Bumping up IO completion threads to {0}",iocpThreads); 145 m_log.InfoFormat("[OPENSIM MAIN]: Bumping up max IOCP threads to {0}",iocpThreads);
133 } 146 }
134 // Make sure we don't overallocate IOCP threads and thrash system resources 147 // Make sure we don't overallocate IOCP threads and thrash system resources
135 if ( iocpThreads > iocpThreadsMax ) 148 if ( iocpThreads > iocpThreadsMax )
136 { 149 {
137 iocpThreads = iocpThreadsMax; 150 iocpThreads = iocpThreadsMax;
138 m_log.InfoFormat("[OPENSIM MAIN]: Limiting IO completion threads to {0}",iocpThreads); 151 m_log.InfoFormat("[OPENSIM MAIN]: Limiting max IOCP completion threads to {0}",iocpThreads);
139 } 152 }
140 // set the resulting worker and IO completion thread counts back to ThreadPool 153 // set the resulting worker and IO completion thread counts back to ThreadPool
141 if ( System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads) ) 154 if ( System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads) )
142 { 155 {
143 m_log.InfoFormat("[OPENSIM MAIN]: Threadpool set to {0} worker threads and {1} IO completion threads", workerThreads, iocpThreads); 156 m_log.InfoFormat(
157 "[OPENSIM MAIN]: Threadpool set to {0} max worker threads and {1} max IOCP threads",
158 workerThreads, iocpThreads);
144 } 159 }
145 else 160 else
146 { 161 {
147 m_log.Info("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect."); 162 m_log.Warn("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect.");
148 } 163 }
149 164
150 // Check if the system is compatible with OpenSimulator. 165 // Check if the system is compatible with OpenSimulator.
@@ -152,17 +167,16 @@ namespace OpenSim
152 string supported = String.Empty; 167 string supported = String.Empty;
153 if (Util.IsEnvironmentSupported(ref supported)) 168 if (Util.IsEnvironmentSupported(ref supported))
154 { 169 {
155 m_log.Info("Environment is compatible.\n"); 170 m_log.Info("[OPENSIM MAIN]: Environment is supported by OpenSimulator.");
156 } 171 }
157 else 172 else
158 { 173 {
159 m_log.Warn("Environment is unsupported (" + supported + ")\n"); 174 m_log.Warn("[OPENSIM MAIN]: Environment is not supported by OpenSimulator (" + supported + ")\n");
160 } 175 }
161 176
162 // Configure nIni aliases and localles 177 // Configure nIni aliases and localles
163 Culture.SetCurrentCulture(); 178 Culture.SetCurrentCulture();
164 179
165
166 // Validate that the user has the most basic configuration done 180 // Validate that the user has the most basic configuration done
167 // If not, offer to do the most basic configuration for them warning them along the way of the importance of 181 // If not, offer to do the most basic configuration for them warning them along the way of the importance of
168 // reading these files. 182 // reading these files.
diff --git a/OpenSim/Region/Application/ConfigurationLoader.cs b/OpenSim/Region/Application/ConfigurationLoader.cs
index fc3999f..bc7ecb7 100644
--- a/OpenSim/Region/Application/ConfigurationLoader.cs
+++ b/OpenSim/Region/Application/ConfigurationLoader.cs
@@ -201,11 +201,11 @@ namespace OpenSim
201 201
202 envConfigSource.LoadEnv(); 202 envConfigSource.LoadEnv();
203 m_config.Source.Merge(envConfigSource); 203 m_config.Source.Merge(envConfigSource);
204 m_config.Source.ExpandKeyValues();
205 } 204 }
206 205
207
208 ReadConfigSettings(); 206 ReadConfigSettings();
207
208 m_config.Source.ExpandKeyValues();
209 209
210 return m_config; 210 return m_config;
211 } 211 }
@@ -337,7 +337,6 @@ namespace OpenSim
337 config.Set("physics", "OpenDynamicsEngine"); 337 config.Set("physics", "OpenDynamicsEngine");
338 config.Set("meshing", "Meshmerizer"); 338 config.Set("meshing", "Meshmerizer");
339 config.Set("physical_prim", true); 339 config.Set("physical_prim", true);
340 config.Set("see_into_this_sim_from_neighbor", true);
341 config.Set("serverside_object_permissions", true); 340 config.Set("serverside_object_permissions", true);
342 config.Set("storage_plugin", "OpenSim.Data.SQLite.dll"); 341 config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
343 config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3"); 342 config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index a7e7d03..a18a6fe 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -86,6 +86,7 @@ namespace OpenSim
86 IConfig startupConfig = Config.Configs["Startup"]; 86 IConfig startupConfig = Config.Configs["Startup"];
87 IConfig networkConfig = Config.Configs["Network"]; 87 IConfig networkConfig = Config.Configs["Network"];
88 88
89 int stpMinThreads = 2;
89 int stpMaxThreads = 15; 90 int stpMaxThreads = 15;
90 91
91 if (startupConfig != null) 92 if (startupConfig != null)
@@ -112,12 +113,13 @@ namespace OpenSim
112 if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod)) 113 if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod))
113 Util.FireAndForgetMethod = asyncCallMethod; 114 Util.FireAndForgetMethod = asyncCallMethod;
114 115
116 stpMinThreads = startupConfig.GetInt("MinPoolThreads", 15);
115 stpMaxThreads = startupConfig.GetInt("MaxPoolThreads", 15); 117 stpMaxThreads = startupConfig.GetInt("MaxPoolThreads", 15);
116 m_consolePrompt = startupConfig.GetString("ConsolePrompt", @"Region (\R) "); 118 m_consolePrompt = startupConfig.GetString("ConsolePrompt", @"Region (\R) ");
117 } 119 }
118 120
119 if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool) 121 if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
120 Util.InitThreadPool(stpMaxThreads); 122 Util.InitThreadPool(stpMinThreads, stpMaxThreads);
121 123
122 m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); 124 m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod);
123 } 125 }
@@ -170,6 +172,13 @@ namespace OpenSim
170 if (userStatsURI != String.Empty) 172 if (userStatsURI != String.Empty)
171 MainServer.Instance.AddStreamHandler(new OpenSim.UXSimStatusHandler(this)); 173 MainServer.Instance.AddStreamHandler(new OpenSim.UXSimStatusHandler(this));
172 174
175 if (managedStatsURI != String.Empty)
176 {
177 string urlBase = String.Format("/{0}/", managedStatsURI);
178 MainServer.Instance.AddHTTPHandler(urlBase, StatsManager.HandleStatsRequest);
179 m_log.InfoFormat("[OPENSIM] Enabling remote managed stats fetch. URL = {0}", urlBase);
180 }
181
173 if (m_console is RemoteConsole) 182 if (m_console is RemoteConsole)
174 { 183 {
175 if (m_consolePort == 0) 184 if (m_consolePort == 0)
@@ -226,18 +235,6 @@ namespace OpenSim
226 "Force the update of all objects on clients", 235 "Force the update of all objects on clients",
227 HandleForceUpdate); 236 HandleForceUpdate);
228 237
229 m_console.Commands.AddCommand("Debug", false, "debug packet",
230 "debug packet <level> [<avatar-first-name> <avatar-last-name>]",
231 "Turn on packet debugging",
232 "If level > 255 then all incoming and outgoing packets are logged.\n"
233 + "If level <= 255 then incoming AgentUpdate and outgoing SimStats and SimulatorViewerTimeMessage packets are not logged.\n"
234 + "If level <= 200 then incoming RequestImage and outgoing ImagePacket, ImageData, LayerData and CoarseLocationUpdate packets are not logged.\n"
235 + "If level <= 100 then incoming ViewerEffect and AgentAnimation and outgoing ViewerEffect and AvatarAnimation packets are not logged.\n"
236 + "If level <= 50 then outgoing ImprovedTerseObjectUpdate packets are not logged.\n"
237 + "If level <= 0 then no packets are logged.\n"
238 + "If an avatar name is given then only packets from that avatar are logged",
239 Debug);
240
241 m_console.Commands.AddCommand("General", false, "change region", 238 m_console.Commands.AddCommand("General", false, "change region",
242 "change region <region name>", 239 "change region <region name>",
243 "Change current console region", ChangeSelectedRegion); 240 "Change current console region", ChangeSelectedRegion);
@@ -358,21 +355,9 @@ namespace OpenSim
358 m_console.Commands.AddCommand("Regions", false, "delete-region", 355 m_console.Commands.AddCommand("Regions", false, "delete-region",
359 "delete-region <name>", 356 "delete-region <name>",
360 "Delete a region from disk", RunCommand); 357 "Delete a region from disk", RunCommand);
361
362 m_console.Commands.AddCommand("General", false, "modules list",
363 "modules list",
364 "List modules", HandleModules);
365
366 m_console.Commands.AddCommand("General", false, "modules load",
367 "modules load <name>",
368 "Load a module", HandleModules);
369
370 m_console.Commands.AddCommand("General", false, "modules unload",
371 "modules unload <name>",
372 "Unload a module", HandleModules);
373 } 358 }
374 359
375 public override void ShutdownSpecific() 360 protected override void ShutdownSpecific()
376 { 361 {
377 if (m_shutdownCommandsFile != String.Empty) 362 if (m_shutdownCommandsFile != String.Empty)
378 { 363 {
@@ -435,8 +420,8 @@ namespace OpenSim
435 { 420 {
436 RegionInfo regionInfo = presence.Scene.RegionInfo; 421 RegionInfo regionInfo = presence.Scene.RegionInfo;
437 422
438 if (presence.Firstname.ToLower().Contains(mainParams[2].ToLower()) && 423 if (presence.Firstname.ToLower().Equals(mainParams[2].ToLower()) &&
439 presence.Lastname.ToLower().Contains(mainParams[3].ToLower())) 424 presence.Lastname.ToLower().Equals(mainParams[3].ToLower()))
440 { 425 {
441 MainConsole.Instance.Output( 426 MainConsole.Instance.Output(
442 String.Format( 427 String.Format(
@@ -450,6 +435,7 @@ namespace OpenSim
450 presence.ControllingClient.Kick("\nYou have been logged out by an administrator.\n"); 435 presence.ControllingClient.Kick("\nYou have been logged out by an administrator.\n");
451 436
452 presence.Scene.IncomingCloseAgent(presence.UUID, force); 437 presence.Scene.IncomingCloseAgent(presence.UUID, force);
438 break;
453 } 439 }
454 } 440 }
455 441
@@ -566,34 +552,6 @@ namespace OpenSim
566 } 552 }
567 553
568 /// <summary> 554 /// <summary>
569 /// Load, Unload, and list Region modules in use
570 /// </summary>
571 /// <param name="module"></param>
572 /// <param name="cmd"></param>
573 private void HandleModules(string module, string[] cmd)
574 {
575 List<string> args = new List<string>(cmd);
576 args.RemoveAt(0);
577 string[] cmdparams = args.ToArray();
578
579 if (cmdparams.Length > 0)
580 {
581 switch (cmdparams[0].ToLower())
582 {
583 case "list":
584 //TODO: Convert to new region modules
585 break;
586 case "unload":
587 //TODO: Convert to new region modules
588 break;
589 case "load":
590 //TODO: Convert to new region modules
591 break;
592 }
593 }
594 }
595
596 /// <summary>
597 /// Runs commands issued by the server console from the operator 555 /// Runs commands issued by the server console from the operator
598 /// </summary> 556 /// </summary>
599 /// <param name="command">The first argument of the parameter (the command)</param> 557 /// <param name="command">The first argument of the parameter (the command)</param>
@@ -701,45 +659,6 @@ namespace OpenSim
701 RefreshPrompt(); 659 RefreshPrompt();
702 } 660 }
703 661
704 /// <summary>
705 /// Turn on some debugging values for OpenSim.
706 /// </summary>
707 /// <param name="args"></param>
708 protected void Debug(string module, string[] args)
709 {
710 if (args.Length == 1)
711 return;
712
713 switch (args[1])
714 {
715 case "packet":
716 string name = null;
717 if (args.Length == 5)
718 name = string.Format("{0} {1}", args[3], args[4]);
719
720 if (args.Length > 2)
721 {
722 int newDebug;
723 if (int.TryParse(args[2], out newDebug))
724 {
725 SceneManager.SetDebugPacketLevelOnCurrentScene(newDebug, name);
726 // We provide user information elsewhere if any clients had their debug level set.
727// MainConsole.Instance.OutputFormat("Debug packet level set to {0}", newDebug);
728 }
729 else
730 {
731 MainConsole.Instance.Output("Usage: debug packet 0..255");
732 }
733 }
734
735 break;
736
737 default:
738 MainConsole.Instance.Output("Unknown debug command");
739 break;
740 }
741 }
742
743 // see BaseOpenSimServer 662 // see BaseOpenSimServer
744 /// <summary> 663 /// <summary>
745 /// Many commands list objects for debugging. Some of the types are listed here 664 /// Many commands list objects for debugging. Some of the types are listed here
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index 88bd869..4891c1a 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -75,6 +75,7 @@ namespace OpenSim
75 protected int proxyOffset = 0; 75 protected int proxyOffset = 0;
76 76
77 public string userStatsURI = String.Empty; 77 public string userStatsURI = String.Empty;
78 public string managedStatsURI = String.Empty;
78 79
79 protected bool m_autoCreateClientStack = true; 80 protected bool m_autoCreateClientStack = true;
80 81
@@ -199,6 +200,8 @@ namespace OpenSim
199 new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule"); 200 new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule");
200 201
201 m_permsModules = new List<string>(permissionModules.Split(',')); 202 m_permsModules = new List<string>(permissionModules.Split(','));
203
204 managedStatsURI = startupConfig.GetString("ManagedStatsRemoteFetchURI", String.Empty);
202 } 205 }
203 206
204 // Load the simulation data service 207 // Load the simulation data service
@@ -248,10 +251,7 @@ namespace OpenSim
248 } 251 }
249 252
250 if (m_console != null) 253 if (m_console != null)
251 {
252 StatsManager.RegisterConsoleCommands(m_console);
253 AddPluginCommands(m_console); 254 AddPluginCommands(m_console);
254 }
255 } 255 }
256 256
257 protected virtual void AddPluginCommands(ICommandConsole console) 257 protected virtual void AddPluginCommands(ICommandConsole console)
@@ -496,9 +496,6 @@ namespace OpenSim
496 scene.SnmpService.LinkUp(scene); 496 scene.SnmpService.LinkUp(scene);
497 } 497 }
498 498
499 scene.Start();
500 scene.StartScripts();
501
502 return clientServers; 499 return clientServers;
503 } 500 }
504 501
@@ -813,7 +810,7 @@ namespace OpenSim
813 810
814 if (foundClientServer) 811 if (foundClientServer)
815 { 812 {
816 m_clientServers[clientServerElement].NetworkStop(); 813 m_clientServers[clientServerElement].Stop();
817 m_clientServers.RemoveAt(clientServerElement); 814 m_clientServers.RemoveAt(clientServerElement);
818 } 815 }
819 } 816 }
@@ -827,6 +824,7 @@ namespace OpenSim
827 ShutdownClientServer(whichRegion); 824 ShutdownClientServer(whichRegion);
828 IScene scene; 825 IScene scene;
829 CreateRegion(whichRegion, true, out scene); 826 CreateRegion(whichRegion, true, out scene);
827 scene.Start();
830 } 828 }
831 829
832 # region Setup methods 830 # region Setup methods
@@ -840,73 +838,49 @@ namespace OpenSim
840 /// <summary> 838 /// <summary>
841 /// Handler to supply the current status of this sim 839 /// Handler to supply the current status of this sim
842 /// </summary> 840 /// </summary>
841 /// <remarks>
843 /// Currently this is always OK if the simulator is still listening for connections on its HTTP service 842 /// Currently this is always OK if the simulator is still listening for connections on its HTTP service
844 public class SimStatusHandler : IStreamedRequestHandler 843 /// </remarks>
844 public class SimStatusHandler : BaseStreamHandler
845 { 845 {
846 public byte[] Handle(string path, Stream request, 846 public SimStatusHandler() : base("GET", "/simstatus", "SimStatus", "Simulator Status") {}
847
848 protected override byte[] ProcessRequest(string path, Stream request,
847 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 849 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
848 { 850 {
849 return Util.UTF8.GetBytes("OK"); 851 return Util.UTF8.GetBytes("OK");
850 } 852 }
851 853
852 public string Name { get { return "SimStatus"; } } 854 public override string ContentType
853 public string Description { get { return "Simulator Status"; } }
854
855 public string ContentType
856 { 855 {
857 get { return "text/plain"; } 856 get { return "text/plain"; }
858 } 857 }
859
860 public string HttpMethod
861 {
862 get { return "GET"; }
863 }
864
865 public string Path
866 {
867 get { return "/simstatus"; }
868 }
869 } 858 }
870 859
871 /// <summary> 860 /// <summary>
872 /// Handler to supply the current extended status of this sim 861 /// Handler to supply the current extended status of this sim
873 /// Sends the statistical data in a json serialization 862 /// Sends the statistical data in a json serialization
874 /// </summary> 863 /// </summary>
875 public class XSimStatusHandler : IStreamedRequestHandler 864 public class XSimStatusHandler : BaseStreamHandler
876 { 865 {
877 OpenSimBase m_opensim; 866 OpenSimBase m_opensim;
878 string osXStatsURI = String.Empty;
879
880 public string Name { get { return "XSimStatus"; } }
881 public string Description { get { return "Simulator XStatus"; } }
882 867
883 public XSimStatusHandler(OpenSimBase sim) 868 public XSimStatusHandler(OpenSimBase sim)
869 : base("GET", "/" + Util.SHA1Hash(sim.osSecret), "XSimStatus", "Simulator XStatus")
884 { 870 {
885 m_opensim = sim; 871 m_opensim = sim;
886 osXStatsURI = Util.SHA1Hash(sim.osSecret);
887 } 872 }
888 873
889 public byte[] Handle(string path, Stream request, 874 protected override byte[] ProcessRequest(string path, Stream request,
890 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 875 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
891 { 876 {
892 return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); 877 return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest));
893 } 878 }
894 879
895 public string ContentType 880 public override string ContentType
896 { 881 {
897 get { return "text/plain"; } 882 get { return "text/plain"; }
898 } 883 }
899
900 public string HttpMethod
901 {
902 get { return "GET"; }
903 }
904
905 public string Path
906 {
907 // This is for the OpenSimulator instance and is the osSecret hashed
908 get { return "/" + osXStatsURI; }
909 }
910 } 884 }
911 885
912 /// <summary> 886 /// <summary>
@@ -915,42 +889,26 @@ namespace OpenSim
915 /// If the request contains a key, "callback" the response will be wrappend in the 889 /// If the request contains a key, "callback" the response will be wrappend in the
916 /// associated value for jsonp used with ajax/javascript 890 /// associated value for jsonp used with ajax/javascript
917 /// </summary> 891 /// </summary>
918 public class UXSimStatusHandler : IStreamedRequestHandler 892 protected class UXSimStatusHandler : BaseStreamHandler
919 { 893 {
920 OpenSimBase m_opensim; 894 OpenSimBase m_opensim;
921 string osUXStatsURI = String.Empty;
922
923 public string Name { get { return "UXSimStatus"; } }
924 public string Description { get { return "Simulator UXStatus"; } }
925 895
926 public UXSimStatusHandler(OpenSimBase sim) 896 public UXSimStatusHandler(OpenSimBase sim)
897 : base("GET", "/" + sim.userStatsURI, "UXSimStatus", "Simulator UXStatus")
927 { 898 {
928 m_opensim = sim; 899 m_opensim = sim;
929 osUXStatsURI = sim.userStatsURI;
930
931 } 900 }
932 901
933 public byte[] Handle(string path, Stream request, 902 protected override byte[] ProcessRequest(string path, Stream request,
934 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 903 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
935 { 904 {
936 return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest)); 905 return Util.UTF8.GetBytes(m_opensim.StatReport(httpRequest));
937 } 906 }
938 907
939 public string ContentType 908 public override string ContentType
940 { 909 {
941 get { return "text/plain"; } 910 get { return "text/plain"; }
942 } 911 }
943
944 public string HttpMethod
945 {
946 get { return "GET"; }
947 }
948
949 public string Path
950 {
951 // This is for the OpenSimulator instance and is the user provided URI
952 get { return "/" + osUXStatsURI; }
953 }
954 } 912 }
955 913
956 #endregion 914 #endregion
@@ -958,7 +916,7 @@ namespace OpenSim
958 /// <summary> 916 /// <summary>
959 /// Performs any last-minute sanity checking and shuts down the region server 917 /// Performs any last-minute sanity checking and shuts down the region server
960 /// </summary> 918 /// </summary>
961 public override void ShutdownSpecific() 919 protected override void ShutdownSpecific()
962 { 920 {
963 if (proxyUrl.Length > 0) 921 if (proxyUrl.Length > 0)
964 { 922 {
@@ -978,6 +936,8 @@ namespace OpenSim
978 { 936 {
979 m_log.Error("[SHUTDOWN]: Ignoring failure during shutdown - ", e); 937 m_log.Error("[SHUTDOWN]: Ignoring failure during shutdown - ", e);
980 } 938 }
939
940 base.ShutdownSpecific();
981 } 941 }
982 942
983 /// <summary> 943 /// <summary>
diff --git a/OpenSim/Region/ClientStack/IClientNetworkServer.cs b/OpenSim/Region/ClientStack/IClientNetworkServer.cs
index 54a441b..bb7e6d0 100644
--- a/OpenSim/Region/ClientStack/IClientNetworkServer.cs
+++ b/OpenSim/Region/ClientStack/IClientNetworkServer.cs
@@ -38,11 +38,22 @@ namespace OpenSim.Region.ClientStack
38 IPAddress _listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, 38 IPAddress _listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource,
39 AgentCircuitManager authenticateClass); 39 AgentCircuitManager authenticateClass);
40 40
41 void NetworkStop();
42 bool HandlesRegion(Location x); 41 bool HandlesRegion(Location x);
43 void AddScene(IScene x);
44 42
43 /// <summary>
44 /// Add the given scene to be handled by this IClientNetworkServer.
45 /// </summary>
46 /// <param name='scene'></param>
47 void AddScene(IScene scene);
48
49 /// <summary>
50 /// Start sending and receiving data.
51 /// </summary>
45 void Start(); 52 void Start();
53
54 /// <summary>
55 /// Stop sending and receiving data.
56 /// </summary>
46 void Stop(); 57 void Stop();
47 } 58 }
48} 59}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs
new file mode 100644
index 0000000..10a4753
--- /dev/null
+++ b/OpenSim/Region/ClientStack/Linden/Caps/AvatarPickerSearchModule.cs
@@ -0,0 +1,139 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Specialized;
31using System.Drawing;
32using System.Drawing.Imaging;
33using System.Reflection;
34using System.IO;
35using System.Web;
36using log4net;
37using Nini.Config;
38using Mono.Addins;
39using OpenMetaverse;
40using OpenMetaverse.StructuredData;
41using OpenSim.Framework;
42using OpenSim.Framework.Servers;
43using OpenSim.Framework.Servers.HttpServer;
44using OpenSim.Region.Framework.Interfaces;
45using OpenSim.Region.Framework.Scenes;
46using OpenSim.Services.Interfaces;
47using Caps = OpenSim.Framework.Capabilities.Caps;
48using OpenSim.Capabilities.Handlers;
49
50namespace OpenSim.Region.ClientStack.Linden
51{
52
53 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AvatarPickerSearchModule")]
54 public class AvatarPickerSearchModule : INonSharedRegionModule
55 {
56 private static readonly ILog m_log =
57 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
58
59 private Scene m_scene;
60 private IPeople m_People;
61 private bool m_Enabled = false;
62
63 private string m_URL;
64
65 #region ISharedRegionModule Members
66
67 public void Initialise(IConfigSource source)
68 {
69 IConfig config = source.Configs["ClientStack.LindenCaps"];
70 if (config == null)
71 return;
72
73 m_URL = config.GetString("Cap_AvatarPickerSearch", string.Empty);
74 // Cap doesn't exist
75 if (m_URL != string.Empty)
76 m_Enabled = true;
77 }
78
79 public void AddRegion(Scene s)
80 {
81 if (!m_Enabled)
82 return;
83
84 m_scene = s;
85 }
86
87 public void RemoveRegion(Scene s)
88 {
89 if (!m_Enabled)
90 return;
91
92 m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
93 m_scene = null;
94 }
95
96 public void RegionLoaded(Scene s)
97 {
98 if (!m_Enabled)
99 return;
100
101 m_People = m_scene.RequestModuleInterface<IPeople>();
102 m_scene.EventManager.OnRegisterCaps += RegisterCaps;
103 }
104
105 public void PostInitialise()
106 {
107 }
108
109 public void Close() { }
110
111 public string Name { get { return "AvatarPickerSearchModule"; } }
112
113 public Type ReplaceableInterface
114 {
115 get { return null; }
116 }
117
118 #endregion
119
120 public void RegisterCaps(UUID agentID, Caps caps)
121 {
122 UUID capID = UUID.Random();
123
124 if (m_URL == "localhost")
125 {
126// m_log.DebugFormat("[AVATAR PICKER SEARCH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName);
127 caps.RegisterHandler(
128 "AvatarPickerSearch",
129 new AvatarPickerSearchHandler("/CAPS/" + capID + "/", m_People, "AvatarPickerSearch", "Search for avatars by name"));
130 }
131 else
132 {
133 // m_log.DebugFormat("[AVATAR PICKER SEARCH]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName);
134 caps.RegisterHandler("AvatarPickerSearch", m_URL);
135 }
136 }
137
138 }
139}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 8241e07..762e22a 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -282,13 +282,19 @@ namespace OpenSim.Region.ClientStack.Linden
282 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); 282 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
283 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); 283 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
284 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); 284 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
285 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData); 285
286 IRequestHandler getObjectPhysicsDataHandler
287 = new RestStreamHandler(
288 "POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData, "GetObjectPhysicsData", null);
286 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler); 289 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler);
287 IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost); 290 IRequestHandler getObjectCostHandler = new RestStreamHandler("POST", capsBase + m_getObjectCostPath, GetObjectCost);
288 m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler); 291 m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler);
289 IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected); 292 IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected);
290 m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler); 293 m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler);
291 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation); 294
295 IRequestHandler UpdateAgentInformationHandler
296 = new RestStreamHandler(
297 "POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation, "UpdateAgentInformation", null);
292 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler); 298 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
293 299
294 m_HostCapsObj.RegisterHandler( 300 m_HostCapsObj.RegisterHandler(
@@ -361,18 +367,7 @@ namespace OpenSim.Region.ClientStack.Linden
361 foreach (OSD c in capsRequested) 367 foreach (OSD c in capsRequested)
362 validCaps.Add(c.AsString()); 368 validCaps.Add(c.AsString());
363 369
364 Hashtable caps = m_HostCapsObj.CapsHandlers.GetCapsDetails(true, validCaps); 370 string result = LLSDHelpers.SerialiseLLSDReply(m_HostCapsObj.GetCapsDetails(true, validCaps));
365
366 // Add the external too
367 foreach (KeyValuePair<string, string> kvp in m_HostCapsObj.ExternalCapsHandlers)
368 {
369 if (!validCaps.Contains(kvp.Key))
370 continue;
371
372 caps[kvp.Key] = kvp.Value;
373 }
374
375 string result = LLSDHelpers.SerialiseLLSDReply(caps);
376 371
377 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result); 372 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result);
378 373
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
index eb40eb1..725bf06 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
@@ -65,6 +65,13 @@ namespace OpenSim.Region.ClientStack.Linden
65 /// </value> 65 /// </value>
66 public int DebugLevel { get; set; } 66 public int DebugLevel { get; set; }
67 67
68 // Viewer post requests timeout in 60 secs
69 // https://bitbucket.org/lindenlab/viewer-release/src/421c20423df93d650cc305dc115922bb30040999/indra/llmessage/llhttpclient.cpp?at=default#cl-44
70 //
71 private const int VIEWER_TIMEOUT = 60 * 1000;
72 // Just to be safe, we work on a 10 sec shorter cycle
73 private const int SERVER_EQ_TIME_NO_EVENTS = VIEWER_TIMEOUT - (10 * 1000);
74
68 protected Scene m_scene; 75 protected Scene m_scene;
69 76
70 private Dictionary<UUID, int> m_ids = new Dictionary<UUID, int>(); 77 private Dictionary<UUID, int> m_ids = new Dictionary<UUID, int>();
@@ -84,7 +91,6 @@ namespace OpenSim.Region.ClientStack.Linden
84 scene.RegisterModuleInterface<IEventQueue>(this); 91 scene.RegisterModuleInterface<IEventQueue>(this);
85 92
86 scene.EventManager.OnClientClosed += ClientClosed; 93 scene.EventManager.OnClientClosed += ClientClosed;
87 scene.EventManager.OnMakeChildAgent += MakeChildAgent;
88 scene.EventManager.OnRegisterCaps += OnRegisterCaps; 94 scene.EventManager.OnRegisterCaps += OnRegisterCaps;
89 95
90 MainConsole.Instance.Commands.AddCommand( 96 MainConsole.Instance.Commands.AddCommand(
@@ -113,7 +119,6 @@ namespace OpenSim.Region.ClientStack.Linden
113 return; 119 return;
114 120
115 scene.EventManager.OnClientClosed -= ClientClosed; 121 scene.EventManager.OnClientClosed -= ClientClosed;
116 scene.EventManager.OnMakeChildAgent -= MakeChildAgent;
117 scene.EventManager.OnRegisterCaps -= OnRegisterCaps; 122 scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
118 123
119 scene.UnregisterModuleInterface<IEventQueue>(this); 124 scene.UnregisterModuleInterface<IEventQueue>(this);
@@ -182,14 +187,12 @@ namespace OpenSim.Region.ClientStack.Linden
182 { 187 {
183 if (!queues.ContainsKey(agentId)) 188 if (!queues.ContainsKey(agentId))
184 { 189 {
185 /*
186 m_log.DebugFormat( 190 m_log.DebugFormat(
187 "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", 191 "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}",
188 agentId, m_scene.RegionInfo.RegionName); 192 agentId, m_scene.RegionInfo.RegionName);
189 */
190 queues[agentId] = new Queue<OSD>(); 193 queues[agentId] = new Queue<OSD>();
191 } 194 }
192 195
193 return queues[agentId]; 196 return queues[agentId];
194 } 197 }
195 } 198 }
@@ -221,8 +224,17 @@ namespace OpenSim.Region.ClientStack.Linden
221 { 224 {
222 Queue<OSD> queue = GetQueue(avatarID); 225 Queue<OSD> queue = GetQueue(avatarID);
223 if (queue != null) 226 if (queue != null)
227 {
224 lock (queue) 228 lock (queue)
225 queue.Enqueue(ev); 229 queue.Enqueue(ev);
230 }
231 else
232 {
233 OSDMap evMap = (OSDMap)ev;
234 m_log.WarnFormat(
235 "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} when placing message {1} in region {2}",
236 avatarID, evMap["message"], m_scene.Name);
237 }
226 } 238 }
227 catch (NullReferenceException e) 239 catch (NullReferenceException e)
228 { 240 {
@@ -237,44 +249,14 @@ namespace OpenSim.Region.ClientStack.Linden
237 249
238 private void ClientClosed(UUID agentID, Scene scene) 250 private void ClientClosed(UUID agentID, Scene scene)
239 { 251 {
240// m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); 252 //m_log.DebugFormat("[EVENTQUEUE]: Closed client {0} in region {1}", agentID, m_scene.RegionInfo.RegionName);
241
242 int count = 0;
243 while (queues.ContainsKey(agentID) && queues[agentID].Count > 0 && count++ < 5)
244 {
245 Thread.Sleep(1000);
246 }
247 253
248 lock (queues) 254 lock (queues)
249 {
250 queues.Remove(agentID); 255 queues.Remove(agentID);
251 }
252 256
253 List<UUID> removeitems = new List<UUID>(); 257 List<UUID> removeitems = new List<UUID>();
254 lock (m_AvatarQueueUUIDMapping) 258 lock (m_AvatarQueueUUIDMapping)
255 { 259 m_AvatarQueueUUIDMapping.Remove(agentID);
256 foreach (UUID ky in m_AvatarQueueUUIDMapping.Keys)
257 {
258// m_log.DebugFormat("[EVENTQUEUE]: Found key {0} in m_AvatarQueueUUIDMapping while looking for {1}", ky, AgentID);
259 if (ky == agentID)
260 {
261 removeitems.Add(ky);
262 }
263 }
264
265 foreach (UUID ky in removeitems)
266 {
267 UUID eventQueueGetUuid = m_AvatarQueueUUIDMapping[ky];
268 m_AvatarQueueUUIDMapping.Remove(ky);
269
270 string eqgPath = GenerateEqgCapPath(eventQueueGetUuid);
271 MainServer.Instance.RemovePollServiceHTTPHandler("", eqgPath);
272
273// m_log.DebugFormat(
274// "[EVENT QUEUE GET MODULE]: Removed EQG handler {0} for {1} in {2}",
275// eqgPath, agentID, m_scene.RegionInfo.RegionName);
276 }
277 }
278 260
279 UUID searchval = UUID.Zero; 261 UUID searchval = UUID.Zero;
280 262
@@ -295,19 +277,9 @@ namespace OpenSim.Region.ClientStack.Linden
295 foreach (UUID ky in removeitems) 277 foreach (UUID ky in removeitems)
296 m_QueueUUIDAvatarMapping.Remove(ky); 278 m_QueueUUIDAvatarMapping.Remove(ky);
297 } 279 }
298 }
299 280
300 private void MakeChildAgent(ScenePresence avatar) 281 // m_log.DebugFormat("[EVENTQUEUE]: Deleted queues for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName);
301 { 282
302 //m_log.DebugFormat("[EVENTQUEUE]: Make Child agent {0} in region {1}.", avatar.UUID, m_scene.RegionInfo.RegionName);
303 //lock (m_ids)
304 // {
305 //if (m_ids.ContainsKey(avatar.UUID))
306 //{
307 // close the event queue.
308 //m_ids[avatar.UUID] = -1;
309 //}
310 //}
311 } 283 }
312 284
313 /// <summary> 285 /// <summary>
@@ -359,28 +331,9 @@ namespace OpenSim.Region.ClientStack.Linden
359 m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); 331 m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID);
360 } 332 }
361 333
362 string eventQueueGetPath = GenerateEqgCapPath(eventQueueGetUUID); 334 caps.RegisterPollHandler(
363 335 "EventQueueGet",
364 // Register this as a caps handler 336 new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, agentID, SERVER_EQ_TIME_NO_EVENTS));
365 // FIXME: Confusingly, we need to register separate as a capability so that the client is told about
366 // EventQueueGet when it receive capability information, but then we replace the rest handler immediately
367 // afterwards with the poll service. So for now, we'll pass a null instead to simplify code reading, but
368 // really it should be possible to directly register the poll handler as a capability.
369 caps.RegisterHandler("EventQueueGet", new RestHTTPHandler("POST", eventQueueGetPath, null));
370// delegate(Hashtable m_dhttpMethod)
371// {
372// return ProcessQueue(m_dhttpMethod, agentID, caps);
373// }));
374
375 // This will persist this beyond the expiry of the caps handlers
376 // TODO: Add EventQueueGet name/description for diagnostics
377 MainServer.Instance.AddPollServiceHTTPHandler(
378 eventQueueGetPath,
379 new PollServiceEventArgs(null, HasEvents, GetEvents, NoEvents, agentID, 40000));
380
381// m_log.DebugFormat(
382// "[EVENT QUEUE GET MODULE]: Registered EQG handler {0} for {1} in {2}",
383// eventQueueGetPath, agentID, m_scene.RegionInfo.RegionName);
384 337
385 Random rnd = new Random(Environment.TickCount); 338 Random rnd = new Random(Environment.TickCount);
386 lock (m_ids) 339 lock (m_ids)
@@ -398,7 +351,10 @@ namespace OpenSim.Region.ClientStack.Linden
398 Queue<OSD> queue = GetQueue(agentID); 351 Queue<OSD> queue = GetQueue(agentID);
399 if (queue != null) 352 if (queue != null)
400 lock (queue) 353 lock (queue)
354 {
355 //m_log.WarnFormat("POLLED FOR EVENTS BY {0} in {1} -- {2}", agentID, m_scene.RegionInfo.RegionName, queue.Count);
401 return queue.Count > 0; 356 return queue.Count > 0;
357 }
402 358
403 return false; 359 return false;
404 } 360 }
@@ -414,16 +370,21 @@ namespace OpenSim.Region.ClientStack.Linden
414 OSDMap ev = (OSDMap)element; 370 OSDMap ev = (OSDMap)element;
415 m_log.DebugFormat( 371 m_log.DebugFormat(
416 "Eq OUT {0,-30} to {1,-20} {2,-20}", 372 "Eq OUT {0,-30} to {1,-20} {2,-20}",
417 ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.RegionInfo.RegionName); 373 ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.Name);
418 } 374 }
419 } 375 }
420 376
421 public Hashtable GetEvents(UUID requestID, UUID pAgentId) 377 public Hashtable GetEvents(UUID requestID, UUID pAgentId)
422 { 378 {
423 if (DebugLevel >= 2) 379 if (DebugLevel >= 2)
424 m_log.DebugFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.RegionInfo.RegionName); 380 m_log.WarnFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.Name);
381
382 Queue<OSD> queue = GetQueue(pAgentId);
383 if (queue == null)
384 {
385 return NoEvents(requestID, pAgentId);
386 }
425 387
426 Queue<OSD> queue = TryGetQueue(pAgentId);
427 OSD element; 388 OSD element;
428 lock (queue) 389 lock (queue)
429 { 390 {
@@ -794,12 +755,12 @@ namespace OpenSim.Region.ClientStack.Linden
794 755
795 } 756 }
796 757
797 public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID toAgent, bool canVoiceChat, 758 public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID anotherAgent, bool canVoiceChat,
798 bool isModerator, bool textMute) 759 bool isModerator, bool textMute)
799 { 760 {
800 OSD item = EventQueueHelper.ChatterBoxSessionAgentListUpdates(sessionID, fromAgent, canVoiceChat, 761 OSD item = EventQueueHelper.ChatterBoxSessionAgentListUpdates(sessionID, fromAgent, canVoiceChat,
801 isModerator, textMute); 762 isModerator, textMute);
802 Enqueue(item, toAgent); 763 Enqueue(item, fromAgent);
803 //m_log.InfoFormat("########### eq ChatterBoxSessionAgentListUpdates #############\n{0}", item); 764 //m_log.InfoFormat("########### eq ChatterBoxSessionAgentListUpdates #############\n{0}", item);
804 } 765 }
805 766
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
index 141af8a..b3b0b8a 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs
@@ -76,7 +76,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests
76 } 76 }
77 77
78 [Test] 78 [Test]
79 public void AddForClient() 79 public void TestAddForClient()
80 { 80 {
81 TestHelpers.InMethod(); 81 TestHelpers.InMethod();
82// log4net.Config.XmlConfigurator.Configure(); 82// log4net.Config.XmlConfigurator.Configure();
@@ -88,10 +88,10 @@ namespace OpenSim.Region.ClientStack.Linden.Tests
88 } 88 }
89 89
90 [Test] 90 [Test]
91 public void RemoveForClient() 91 public void TestRemoveForClient()
92 { 92 {
93 TestHelpers.InMethod(); 93 TestHelpers.InMethod();
94// log4net.Config.XmlConfigurator.Configure(); 94// TestHelpers.EnableLogging();
95 95
96 UUID spId = TestHelpers.ParseTail(0x1); 96 UUID spId = TestHelpers.ParseTail(0x1);
97 97
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
index 6ec1115..7b15284 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs
@@ -246,8 +246,8 @@ namespace OpenSim.Region.ClientStack.Linden
246 246
247 private Scene m_scene; 247 private Scene m_scene;
248 private MeshCapsDataThrottler m_throttler; 248 private MeshCapsDataThrottler m_throttler;
249 public PollServiceMeshEventArgs(UUID pId, Scene scene) : 249 public PollServiceMeshEventArgs(string uri, UUID pId, Scene scene) :
250 base(null, null, null, null, pId, int.MaxValue) 250 base(null, uri, null, null, null, pId, int.MaxValue)
251 { 251 {
252 m_scene = scene; 252 m_scene = scene;
253 m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId); 253 m_throttler = new MeshCapsDataThrottler(100000, 1400000, 10000, scene, pId);
@@ -361,7 +361,7 @@ namespace OpenSim.Region.ClientStack.Linden
361 string capUrl = "/CAPS/" + UUID.Random() + "/"; 361 string capUrl = "/CAPS/" + UUID.Random() + "/";
362 362
363 // Register this as a poll service 363 // Register this as a poll service
364 PollServiceMeshEventArgs args = new PollServiceMeshEventArgs(agentID, m_scene); 364 PollServiceMeshEventArgs args = new PollServiceMeshEventArgs(capUrl, agentID, m_scene);
365 365
366 args.Type = PollServiceEventArgs.EventType.Mesh; 366 args.Type = PollServiceEventArgs.EventType.Mesh;
367 MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); 367 MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
index 0570144..e053054 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
@@ -84,6 +84,8 @@ namespace OpenSim.Region.ClientStack.Linden
84 84
85 private Dictionary<UUID,PollServiceTextureEventArgs> m_pollservices = new Dictionary<UUID,PollServiceTextureEventArgs>(); 85 private Dictionary<UUID,PollServiceTextureEventArgs> m_pollservices = new Dictionary<UUID,PollServiceTextureEventArgs>();
86 86
87 private string m_URL;
88
87 #region ISharedRegionModule Members 89 #region ISharedRegionModule Members
88 90
89 public void Initialise(IConfigSource source) 91 public void Initialise(IConfigSource source)
@@ -215,7 +217,7 @@ namespace OpenSim.Region.ClientStack.Linden
215 private Scene m_scene; 217 private Scene m_scene;
216 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000); 218 private CapsDataThrottler m_throttler = new CapsDataThrottler(100000, 1400000,10000);
217 public PollServiceTextureEventArgs(UUID pId, Scene scene) : 219 public PollServiceTextureEventArgs(UUID pId, Scene scene) :
218 base(null, null, null, null, pId, int.MaxValue) 220 base(null, "", null, null, null, pId, int.MaxValue)
219 { 221 {
220 m_scene = scene; 222 m_scene = scene;
221 // x is request id, y is userid 223 // x is request id, y is userid
@@ -368,7 +370,11 @@ namespace OpenSim.Region.ClientStack.Linden
368 port = MainServer.Instance.SSLPort; 370 port = MainServer.Instance.SSLPort;
369 protocol = "https"; 371 protocol = "https";
370 } 372 }
371 caps.RegisterHandler("GetTexture", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); 373 IExternalCapsModule handler = m_scene.RequestModuleInterface<IExternalCapsModule>();
374 if (handler != null)
375 handler.RegisterExternalUserCapsHandler(agentID, caps, "GetTexture", capUrl);
376 else
377 caps.RegisterHandler("GetTexture", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
372 m_pollservices[agentID] = args; 378 m_pollservices[agentID] = args;
373 m_capsDict[agentID] = capUrl; 379 m_capsDict[agentID] = capUrl;
374 } 380 }
@@ -380,13 +386,11 @@ namespace OpenSim.Region.ClientStack.Linden
380 386
381 private void DeregisterCaps(UUID agentID, Caps caps) 387 private void DeregisterCaps(UUID agentID, Caps caps)
382 { 388 {
383 string capUrl;
384 PollServiceTextureEventArgs args; 389 PollServiceTextureEventArgs args;
385 if (m_capsDict.TryGetValue(agentID, out capUrl)) 390
386 { 391 MainServer.Instance.RemoveHTTPHandler("", m_URL);
387 MainServer.Instance.RemoveHTTPHandler("", capUrl); 392 m_capsDict.Remove(agentID);
388 m_capsDict.Remove(agentID); 393
389 }
390 if (m_pollservices.TryGetValue(agentID, out args)) 394 if (m_pollservices.TryGetValue(agentID, out args))
391 { 395 {
392 m_pollservices.Remove(agentID); 396 m_pollservices.Remove(agentID);
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/RegionConsoleModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/RegionConsoleModule.cs
index 79d56c4..5196368 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/RegionConsoleModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/RegionConsoleModule.cs
@@ -183,7 +183,7 @@ namespace OpenSim.Region.ClientStack.Linden
183 m_isGod = m_scene.Permissions.IsGod(agentID); 183 m_isGod = m_scene.Permissions.IsGod(agentID);
184 } 184 }
185 185
186 public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 186 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
187 { 187 {
188 StreamReader reader = new StreamReader(request); 188 StreamReader reader = new StreamReader(request);
189 string message = reader.ReadToEnd(); 189 string message = reader.ReadToEnd();
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
index 7d9f935..e4d8a20 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
@@ -68,7 +68,6 @@ namespace OpenSim.Region.ClientStack.Linden
68 /// </summary> 68 /// </summary>
69 private OSDMap m_features = new OSDMap(); 69 private OSDMap m_features = new OSDMap();
70 70
71 private string m_MapImageServerURL = string.Empty;
72 private string m_SearchURL = string.Empty; 71 private string m_SearchURL = string.Empty;
73 private bool m_ExportSupported = false; 72 private bool m_ExportSupported = false;
74 73
@@ -78,15 +77,7 @@ namespace OpenSim.Region.ClientStack.Linden
78 { 77 {
79 IConfig config = source.Configs["SimulatorFeatures"]; 78 IConfig config = source.Configs["SimulatorFeatures"];
80 if (config != null) 79 if (config != null)
81 { 80 {
82 m_MapImageServerURL = config.GetString("MapImageServerURI", string.Empty);
83 if (m_MapImageServerURL != string.Empty)
84 {
85 m_MapImageServerURL = m_MapImageServerURL.Trim();
86 if (!m_MapImageServerURL.EndsWith("/"))
87 m_MapImageServerURL = m_MapImageServerURL + "/";
88 }
89
90 m_SearchURL = config.GetString("SearchServerURI", string.Empty); 81 m_SearchURL = config.GetString("SearchServerURI", string.Empty);
91 82
92 m_ExportSupported = config.GetBoolean("ExportSupported", m_ExportSupported); 83 m_ExportSupported = config.GetBoolean("ExportSupported", m_ExportSupported);
@@ -149,15 +140,16 @@ namespace OpenSim.Region.ClientStack.Linden
149 m_features["PhysicsShapeTypes"] = typesMap; 140 m_features["PhysicsShapeTypes"] = typesMap;
150 141
151 // Extra information for viewers that want to use it 142 // Extra information for viewers that want to use it
152 OSDMap gridServicesMap = new OSDMap(); 143 // TODO: Take these out of here into their respective modules, like map-server-url
153 if (m_MapImageServerURL != string.Empty) 144 OSDMap extrasMap = new OSDMap();
154 gridServicesMap["map-server-url"] = m_MapImageServerURL;
155 if (m_SearchURL != string.Empty) 145 if (m_SearchURL != string.Empty)
156 gridServicesMap["search"] = m_SearchURL; 146 extrasMap["search-server-url"] = m_SearchURL;
157 m_features["GridServices"] = gridServicesMap;
158
159 if (m_ExportSupported) 147 if (m_ExportSupported)
160 m_features["ExportSupported"] = true; 148 extrasMap["ExportSupported"] = true;
149
150 if (extrasMap.Count > 0)
151 m_features["OpenSimExtras"] = extrasMap;
152
161 } 153 }
162 } 154 }
163 155
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
index eca576d..cf95463 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
@@ -64,11 +64,18 @@ namespace OpenSim.Region.ClientStack.Linden
64 64
65 private Scene m_scene; 65 private Scene m_scene;
66 private bool m_persistBakedTextures; 66 private bool m_persistBakedTextures;
67 private string m_URL;
67 68
68 private IBakedTextureModule m_BakedTextureModule; 69 private IBakedTextureModule m_BakedTextureModule;
69 70
70 public void Initialise(IConfigSource source) 71 public void Initialise(IConfigSource source)
71 { 72 {
73 IConfig config = source.Configs["ClientStack.LindenCaps"];
74 if (config == null)
75 return;
76
77 m_URL = config.GetString("Cap_UploadBakedTexture", string.Empty);
78
72 IConfig appearanceConfig = source.Configs["Appearance"]; 79 IConfig appearanceConfig = source.Configs["Appearance"];
73 if (appearanceConfig != null) 80 if (appearanceConfig != null)
74 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 81 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
@@ -280,23 +287,28 @@ namespace OpenSim.Region.ClientStack.Linden
280 287
281 public void RegisterCaps(UUID agentID, Caps caps) 288 public void RegisterCaps(UUID agentID, Caps caps)
282 { 289 {
283 UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler( 290 UUID capID = UUID.Random();
284 caps, m_scene.AssetService, m_persistBakedTextures);
285 291
286 292 //caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture));
287 293 if (m_URL == "localhost")
288 caps.RegisterHandler( 294 {
289 "UploadBakedTexture", 295 UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler(
290 new RestStreamHandler( 296 caps, m_scene.AssetService, m_persistBakedTextures);
291 "POST",
292 "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
293 avatarhandler.UploadBakedTexture,
294 "UploadBakedTexture",
295 agentID.ToString()));
296
297
298
299 297
298 caps.RegisterHandler(
299 "UploadBakedTexture",
300 new RestStreamHandler(
301 "POST",
302 "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
303 avatarhandler.UploadBakedTexture,
304 "UploadBakedTexture",
305 agentID.ToString()));
306
307 }
308 else
309 {
310 caps.RegisterHandler("UploadBakedTexture", m_URL);
311 }
300 } 312 }
301 } 313 }
302} \ No newline at end of file 314}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
index 707cc93..f816ad3 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
@@ -71,9 +71,13 @@ namespace OpenSim.Region.ClientStack.Linden
71 private IInventoryService m_InventoryService; 71 private IInventoryService m_InventoryService;
72 private ILibraryService m_LibraryService; 72 private ILibraryService m_LibraryService;
73 73
74 private bool m_Enabled;
75
76 private string m_fetchInventoryDescendents2Url;
77 private string m_webFetchInventoryDescendentsUrl;
78
74 private static WebFetchInvDescHandler m_webFetchHandler; 79 private static WebFetchInvDescHandler m_webFetchHandler;
75 80
76 private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>();
77 private static Thread[] m_workerThreads = null; 81 private static Thread[] m_workerThreads = null;
78 82
79 private static DoubleQueue<aPollRequest> m_queue = 83 private static DoubleQueue<aPollRequest> m_queue =
@@ -83,22 +87,45 @@ namespace OpenSim.Region.ClientStack.Linden
83 87
84 public void Initialise(IConfigSource source) 88 public void Initialise(IConfigSource source)
85 { 89 {
90 IConfig config = source.Configs["ClientStack.LindenCaps"];
91 if (config == null)
92 return;
93
94 m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty);
95 m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty);
96
97 if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty)
98 {
99 m_Enabled = true;
100 }
86 } 101 }
87 102
88 public void AddRegion(Scene s) 103 public void AddRegion(Scene s)
89 { 104 {
105 if (!m_Enabled)
106 return;
107
90 m_scene = s; 108 m_scene = s;
91 } 109 }
92 110
93 public void RemoveRegion(Scene s) 111 public void RemoveRegion(Scene s)
94 { 112 {
113 if (!m_Enabled)
114 return;
115
95 m_scene.EventManager.OnRegisterCaps -= RegisterCaps; 116 m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
96 m_scene.EventManager.OnDeregisterCaps -= DeregisterCaps; 117
118 foreach (Thread t in m_workerThreads)
119 Watchdog.AbortThread(t.ManagedThreadId);
120
97 m_scene = null; 121 m_scene = null;
98 } 122 }
99 123
100 public void RegionLoaded(Scene s) 124 public void RegionLoaded(Scene s)
101 { 125 {
126 if (!m_Enabled)
127 return;
128
102 m_InventoryService = m_scene.InventoryService; 129 m_InventoryService = m_scene.InventoryService;
103 m_LibraryService = m_scene.LibraryService; 130 m_LibraryService = m_scene.LibraryService;
104 131
@@ -106,7 +133,6 @@ namespace OpenSim.Region.ClientStack.Linden
106 m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService); 133 m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService);
107 134
108 m_scene.EventManager.OnRegisterCaps += RegisterCaps; 135 m_scene.EventManager.OnRegisterCaps += RegisterCaps;
109 m_scene.EventManager.OnDeregisterCaps += DeregisterCaps;
110 136
111 if (m_workerThreads == null) 137 if (m_workerThreads == null)
112 { 138 {
@@ -140,12 +166,6 @@ namespace OpenSim.Region.ClientStack.Linden
140 166
141 #endregion 167 #endregion
142 168
143 ~WebFetchInvDescModule()
144 {
145 foreach (Thread t in m_workerThreads)
146 Watchdog.AbortThread(t.ManagedThreadId);
147 }
148
149 private class PollServiceInventoryEventArgs : PollServiceEventArgs 169 private class PollServiceInventoryEventArgs : PollServiceEventArgs
150 { 170 {
151 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 171 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -155,8 +175,8 @@ namespace OpenSim.Region.ClientStack.Linden
155 175
156 private Scene m_scene; 176 private Scene m_scene;
157 177
158 public PollServiceInventoryEventArgs(Scene scene, UUID pId) : 178 public PollServiceInventoryEventArgs(Scene scene, string url, UUID pId) :
159 base(null, null, null, null, pId, int.MaxValue) 179 base(null, url, null, null, null, pId, int.MaxValue)
160 { 180 {
161 m_scene = scene; 181 m_scene = scene;
162 182
@@ -284,47 +304,53 @@ namespace OpenSim.Region.ClientStack.Linden
284 304
285 private void RegisterCaps(UUID agentID, Caps caps) 305 private void RegisterCaps(UUID agentID, Caps caps)
286 { 306 {
287 string capUrl = "/CAPS/" + UUID.Random() + "/"; 307 if (m_fetchInventoryDescendents2Url == "")
308 return;
288 309
289 // Register this as a poll service 310 // Register this as a poll service
290 PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(m_scene, agentID); 311 PollServiceInventoryEventArgs args
291 312 = new PollServiceInventoryEventArgs(m_scene, "/CAPS/" + UUID.Random() + "/", agentID);
292 args.Type = PollServiceEventArgs.EventType.Inventory; 313 args.Type = PollServiceEventArgs.EventType.Inventory;
293 MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
294
295 string hostName = m_scene.RegionInfo.ExternalHostName;
296 uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
297 string protocol = "http";
298
299 if (MainServer.Instance.UseSSL)
300 {
301 hostName = MainServer.Instance.SSLCommonName;
302 port = MainServer.Instance.SSLPort;
303 protocol = "https";
304 }
305 caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
306 314
307 m_capsDict[agentID] = capUrl; 315 caps.RegisterPollHandler("FetchInventoryDescendents2", args);
316
317// MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
318//
319// string hostName = m_scene.RegionInfo.ExternalHostName;
320// uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
321// string protocol = "http";
322//
323// if (MainServer.Instance.UseSSL)
324// {
325// hostName = MainServer.Instance.SSLCommonName;
326// port = MainServer.Instance.SSLPort;
327// protocol = "https";
328// }
329//
330// caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
308 } 331 }
309 332
310 private void DeregisterCaps(UUID agentID, Caps caps) 333// private void DeregisterCaps(UUID agentID, Caps caps)
311 { 334// {
312 string capUrl; 335// string capUrl;
313 336//
314 if (m_capsDict.TryGetValue(agentID, out capUrl)) 337// if (m_capsDict.TryGetValue(agentID, out capUrl))
315 { 338// {
316 MainServer.Instance.RemoveHTTPHandler("", capUrl); 339// MainServer.Instance.RemoveHTTPHandler("", capUrl);
317 m_capsDict.Remove(agentID); 340// m_capsDict.Remove(agentID);
318 } 341// }
319 } 342// }
320 343
321 private void DoInventoryRequests() 344 private void DoInventoryRequests()
322 { 345 {
323 while (true) 346 while (true)
324 { 347 {
348 Watchdog.UpdateThread();
349
325 aPollRequest poolreq = m_queue.Dequeue(); 350 aPollRequest poolreq = m_queue.Dequeue();
326 351
327 poolreq.thepoll.Process(poolreq); 352 if (poolreq != null && poolreq.thepoll != null)
353 poolreq.thepoll.Process(poolreq);
328 } 354 }
329 } 355 }
330 } 356 }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
index 3995620..15d6f7f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
@@ -424,12 +424,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
424 // foreign user is visiting, we need to try again after the first fail to the local 424 // foreign user is visiting, we need to try again after the first fail to the local
425 // asset service. 425 // asset service.
426 string assetServerURL = string.Empty; 426 string assetServerURL = string.Empty;
427 if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL)) 427 if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL) && !string.IsNullOrEmpty(assetServerURL))
428 { 428 {
429 if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("=")) 429 if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("="))
430 assetServerURL = assetServerURL + "/"; 430 assetServerURL = assetServerURL + "/";
431 431
432 m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id); 432// m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id);
433 AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived); 433 AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived);
434 return; 434 return;
435 } 435 }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index f4ea975..36edd0b 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -84,6 +84,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
84 public event ModifyTerrain OnModifyTerrain; 84 public event ModifyTerrain OnModifyTerrain;
85 public event Action<IClientAPI> OnRegionHandShakeReply; 85 public event Action<IClientAPI> OnRegionHandShakeReply;
86 public event GenericCall1 OnRequestWearables; 86 public event GenericCall1 OnRequestWearables;
87 public event CachedTextureRequest OnCachedTextureRequest;
87 public event SetAppearance OnSetAppearance; 88 public event SetAppearance OnSetAppearance;
88 public event AvatarNowWearing OnAvatarNowWearing; 89 public event AvatarNowWearing OnAvatarNowWearing;
89 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv; 90 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
@@ -95,6 +96,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
95 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 96 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
96 public event UpdateAgent OnPreAgentUpdate; 97 public event UpdateAgent OnPreAgentUpdate;
97 public event UpdateAgent OnAgentUpdate; 98 public event UpdateAgent OnAgentUpdate;
99 public event UpdateAgent OnAgentCameraUpdate;
98 public event AgentRequestSit OnAgentRequestSit; 100 public event AgentRequestSit OnAgentRequestSit;
99 public event AgentSit OnAgentSit; 101 public event AgentSit OnAgentSit;
100 public event AvatarPickerRequest OnAvatarPickerRequest; 102 public event AvatarPickerRequest OnAvatarPickerRequest;
@@ -335,6 +337,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
335 private bool m_VelocityInterpolate = false; 337 private bool m_VelocityInterpolate = false;
336 private const uint MaxTransferBytesPerPacket = 600; 338 private const uint MaxTransferBytesPerPacket = 600;
337 339
340 private volatile bool m_justEditedTerrain = false;
338 341
339 /// <value> 342 /// <value>
340 /// List used in construction of data blocks for an object update packet. This is to stop us having to 343 /// List used in construction of data blocks for an object update packet. This is to stop us having to
@@ -367,7 +370,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
367 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods 370 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods
368 /// cannot retain a reference to it outside of that method. 371 /// cannot retain a reference to it outside of that method.
369 /// </remarks> 372 /// </remarks>
370 private AgentUpdateArgs m_lastAgentUpdateArgs; 373 private AgentUpdateArgs m_thisAgentUpdateArgs = new AgentUpdateArgs();
371 374
372 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); 375 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
373 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers 376 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
@@ -504,6 +507,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
504 m_udpServer = udpServer; 507 m_udpServer = udpServer;
505 m_udpClient = udpClient; 508 m_udpClient = udpClient;
506 m_udpClient.OnQueueEmpty += HandleQueueEmpty; 509 m_udpClient.OnQueueEmpty += HandleQueueEmpty;
510 m_udpClient.HasUpdates += HandleHasUpdates;
507 m_udpClient.OnPacketStats += PopulateStats; 511 m_udpClient.OnPacketStats += PopulateStats;
508 512
509 m_prioritizer = new Prioritizer(m_scene); 513 m_prioritizer = new Prioritizer(m_scene);
@@ -533,7 +537,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
533 // We still perform a force close inside the sync lock since this is intended to attempt close where 537 // We still perform a force close inside the sync lock since this is intended to attempt close where
534 // there is some unidentified connection problem, not where we have issues due to deadlock 538 // there is some unidentified connection problem, not where we have issues due to deadlock
535 if (!IsActive && !force) 539 if (!IsActive && !force)
540 {
541 m_log.DebugFormat(
542 "[CLIENT]: Not attempting to close inactive client {0} in {1} since force flag is not set",
543 Name, m_scene.Name);
544
536 return; 545 return;
546 }
537 547
538 IsActive = false; 548 IsActive = false;
539 CloseWithoutChecks(sendStop); 549 CloseWithoutChecks(sendStop);
@@ -709,12 +719,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
709 //there is a local handler for this packet type 719 //there is a local handler for this packet type
710 if (pprocessor.Async) 720 if (pprocessor.Async)
711 { 721 {
722 ClientInfo cinfo = UDPClient.GetClientInfo();
723 if (!cinfo.AsyncRequests.ContainsKey(packet.Type.ToString()))
724 cinfo.AsyncRequests[packet.Type.ToString()] = 0;
725 cinfo.AsyncRequests[packet.Type.ToString()]++;
726
712 object obj = new AsyncPacketProcess(this, pprocessor.method, packet); 727 object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
713 Util.FireAndForget(ProcessSpecificPacketAsync, obj); 728 Util.FireAndForget(ProcessSpecificPacketAsync, obj);
714 result = true; 729 result = true;
715 } 730 }
716 else 731 else
717 { 732 {
733 ClientInfo cinfo = UDPClient.GetClientInfo();
734 if (!cinfo.SyncRequests.ContainsKey(packet.Type.ToString()))
735 cinfo.SyncRequests[packet.Type.ToString()] = 0;
736 cinfo.SyncRequests[packet.Type.ToString()]++;
737
718 result = pprocessor.method(this, packet); 738 result = pprocessor.method(this, packet);
719 } 739 }
720 } 740 }
@@ -729,6 +749,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
729 } 749 }
730 if (found) 750 if (found)
731 { 751 {
752 ClientInfo cinfo = UDPClient.GetClientInfo();
753 if (!cinfo.GenericRequests.ContainsKey(packet.Type.ToString()))
754 cinfo.GenericRequests[packet.Type.ToString()] = 0;
755 cinfo.GenericRequests[packet.Type.ToString()]++;
756
732 result = method(this, packet); 757 result = method(this, packet);
733 } 758 }
734 } 759 }
@@ -820,12 +845,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
820 handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType); 845 handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType);
821 handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes; 846 handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes;
822 847
823 handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[0]; 848 handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[1];
824// OutPacket(handshake, ThrottleOutPacketType.Task); 849 handshake.RegionInfo4[0] = new RegionHandshakePacket.RegionInfo4Block();
825 // use same as MoveAgentIntoRegion (both should be task ) 850 handshake.RegionInfo4[0].RegionFlagsExtended = args.regionFlags;
851 handshake.RegionInfo4[0].RegionProtocols = 0; // 1 here would indicate that SSB is supported
852
826 OutPacket(handshake, ThrottleOutPacketType.Unknown); 853 OutPacket(handshake, ThrottleOutPacketType.Unknown);
827 } 854 }
828 855
856
829 public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look) 857 public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
830 { 858 {
831 AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete); 859 AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
@@ -1210,9 +1238,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1210 LLHeightFieldMoronize(map); 1238 LLHeightFieldMoronize(map);
1211 1239
1212 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); 1240 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches);
1213 layerpack.Header.Reliable = true; 1241
1242 // When a user edits the terrain, so much data is sent, the data queues up fast and presents a sub optimal editing experience.
1243 // To alleviate this issue, when the user edits the terrain, we start skipping the queues until they're done editing the terrain.
1244 // We also make them unreliable because it's extremely likely that multiple packets will be sent for a terrain patch area
1245 // invalidating previous packets for that area.
1214 1246
1215 OutPacket(layerpack, ThrottleOutPacketType.Task); 1247 // It's possible for an editing user to flood themselves with edited packets but the majority of use cases are such that only a
1248 // tiny percentage of users will be editing the terrain. Other, non-editing users will see the edits much slower.
1249
1250 // One last note on this topic, by the time users are going to be editing the terrain, it's extremely likely that the sim will
1251 // have rezzed already and therefore this is not likely going to cause any additional issues with lost packets, objects or terrain
1252 // patches.
1253
1254 // m_justEditedTerrain is volatile, so test once and duplicate two affected statements so we only have one cache miss.
1255 if (m_justEditedTerrain)
1256 {
1257 layerpack.Header.Reliable = false;
1258 OutPacket(layerpack,
1259 ThrottleOutPacketType.Unknown );
1260 }
1261 else
1262 {
1263 layerpack.Header.Reliable = true;
1264 OutPacket(layerpack,
1265 ThrottleOutPacketType.Task);
1266 }
1216 } 1267 }
1217 catch (Exception e) 1268 catch (Exception e)
1218 { 1269 {
@@ -1580,7 +1631,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1580 OutPacket(pc, ThrottleOutPacketType.Unknown); 1631 OutPacket(pc, ThrottleOutPacketType.Unknown);
1581 } 1632 }
1582 1633
1583 public void SendKillObject(ulong regionHandle, List<uint> localIDs) 1634 public void SendKillObject(List<uint> localIDs)
1584 { 1635 {
1585// foreach (uint id in localIDs) 1636// foreach (uint id in localIDs)
1586// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle); 1637// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
@@ -3797,6 +3848,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3797 ResendPrimUpdate(update); 3848 ResendPrimUpdate(update);
3798 } 3849 }
3799 3850
3851// OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>();
3852// OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>();
3853// OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseUpdateBlocks = new OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>();
3854// OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseAgentUpdateBlocks = new OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>();
3855//
3856// OpenSim.Framework.Lazy<List<EntityUpdate>> objectUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3857// OpenSim.Framework.Lazy<List<EntityUpdate>> compressedUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3858// OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3859// OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3860
3861
3800 private void ProcessEntityUpdates(int maxUpdates) 3862 private void ProcessEntityUpdates(int maxUpdates)
3801 { 3863 {
3802 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); 3864 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>();
@@ -3809,6 +3871,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3809 OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); 3871 OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3810 OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); 3872 OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>();
3811 3873
3874// objectUpdateBlocks.Value.Clear();
3875// compressedUpdateBlocks.Value.Clear();
3876// terseUpdateBlocks.Value.Clear();
3877// terseAgentUpdateBlocks.Value.Clear();
3878// objectUpdates.Value.Clear();
3879// compressedUpdates.Value.Clear();
3880// terseUpdates.Value.Clear();
3881// terseAgentUpdates.Value.Clear();
3882
3812 // Check to see if this is a flush 3883 // Check to see if this is a flush
3813 if (maxUpdates <= 0) 3884 if (maxUpdates <= 0)
3814 { 3885 {
@@ -4137,8 +4208,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4137 4208
4138 void HandleQueueEmpty(ThrottleOutPacketTypeFlags categories) 4209 void HandleQueueEmpty(ThrottleOutPacketTypeFlags categories)
4139 { 4210 {
4211// if (!m_udpServer.IsRunningOutbound)
4212// return;
4213
4140 if ((categories & ThrottleOutPacketTypeFlags.Task) != 0) 4214 if ((categories & ThrottleOutPacketTypeFlags.Task) != 0)
4141 { 4215 {
4216// if (!m_udpServer.IsRunningOutbound)
4217// return;
4218
4142 if (m_maxUpdates == 0 || m_LastQueueFill == 0) 4219 if (m_maxUpdates == 0 || m_LastQueueFill == 0)
4143 { 4220 {
4144 m_maxUpdates = m_udpServer.PrimUpdatesPerCallback; 4221 m_maxUpdates = m_udpServer.PrimUpdatesPerCallback;
@@ -4164,6 +4241,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4164 ImageManager.ProcessImageQueue(m_udpServer.TextureSendLimit); 4241 ImageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
4165 } 4242 }
4166 4243
4244 internal bool HandleHasUpdates(ThrottleOutPacketTypeFlags categories)
4245 {
4246 bool hasUpdates = false;
4247
4248 if ((categories & ThrottleOutPacketTypeFlags.Task) != 0)
4249 {
4250 if (m_entityUpdates.Count > 0)
4251 hasUpdates = true;
4252 else if (m_entityProps.Count > 0)
4253 hasUpdates = true;
4254 }
4255
4256 if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
4257 {
4258 if (ImageManager.HasUpdates())
4259 hasUpdates = true;
4260 }
4261
4262 return hasUpdates;
4263 }
4264
4167 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) 4265 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
4168 { 4266 {
4169 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); 4267 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
@@ -4874,7 +4972,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4874 4972
4875 public void SendForceClientSelectObjects(List<uint> ObjectIDs) 4973 public void SendForceClientSelectObjects(List<uint> ObjectIDs)
4876 { 4974 {
4877 m_log.WarnFormat("[LLCLIENTVIEW] sending select with {0} objects", ObjectIDs.Count); 4975// m_log.DebugFormat("[LLCLIENTVIEW] sending select with {0} objects", ObjectIDs.Count);
4878 4976
4879 bool firstCall = true; 4977 bool firstCall = true;
4880 const int MAX_OBJECTS_PER_PACKET = 251; 4978 const int MAX_OBJECTS_PER_PACKET = 251;
@@ -5031,7 +5129,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5031 SceneObjectPart part = (SceneObjectPart)entity; 5129 SceneObjectPart part = (SceneObjectPart)entity;
5032 5130
5033 attachPoint = part.ParentGroup.AttachmentPoint; 5131 attachPoint = part.ParentGroup.AttachmentPoint;
5034 5132 attachPoint = ((attachPoint % 16) * 16 + (attachPoint / 16));
5035// m_log.DebugFormat( 5133// m_log.DebugFormat(
5036// "[LLCLIENTVIEW]: Sending attachPoint {0} for {1} {2} to {3}", 5134// "[LLCLIENTVIEW]: Sending attachPoint {0} for {1} {2} to {3}",
5037// attachPoint, part.Name, part.LocalId, Name); 5135// attachPoint, part.Name, part.LocalId, Name);
@@ -5059,7 +5157,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5059 pos += 4; 5157 pos += 4;
5060 5158
5061 // Avatar/CollisionPlane 5159 // Avatar/CollisionPlane
5062 data[pos++] = (byte)((attachPoint % 16) * 16 + (attachPoint / 16)); ; 5160 data[pos++] = (byte) attachPoint;
5063 if (avatar) 5161 if (avatar)
5064 { 5162 {
5065 data[pos++] = 1; 5163 data[pos++] = 1;
@@ -5384,7 +5482,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5384 AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject); 5482 AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject);
5385 AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject); 5483 AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject);
5386 AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand); 5484 AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand);
5387 AddLocalPacketHandler(PacketType.RegionHandshakeReply, HandlerRegionHandshakeReply); 5485 AddLocalPacketHandler(PacketType.RegionHandshakeReply, HandlerRegionHandshakeReply, false);
5388 AddLocalPacketHandler(PacketType.AgentWearablesRequest, HandlerAgentWearablesRequest); 5486 AddLocalPacketHandler(PacketType.AgentWearablesRequest, HandlerAgentWearablesRequest);
5389 AddLocalPacketHandler(PacketType.AgentSetAppearance, HandlerAgentSetAppearance); 5487 AddLocalPacketHandler(PacketType.AgentSetAppearance, HandlerAgentSetAppearance);
5390 AddLocalPacketHandler(PacketType.AgentIsNowWearing, HandlerAgentIsNowWearing); 5488 AddLocalPacketHandler(PacketType.AgentIsNowWearing, HandlerAgentIsNowWearing);
@@ -5445,8 +5543,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5445 AddLocalPacketHandler(PacketType.ScriptAnswerYes, HandleScriptAnswerYes, false); 5543 AddLocalPacketHandler(PacketType.ScriptAnswerYes, HandleScriptAnswerYes, false);
5446 AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false); 5544 AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
5447 AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false); 5545 AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
5448 AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage); 5546 AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage, false);
5449 AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest); 5547 AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest, false);
5450 AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest); 5548 AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
5451 AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer); 5549 AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
5452 AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket); 5550 AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
@@ -5478,7 +5576,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5478 AddLocalPacketHandler(PacketType.TeleportCancel, HandleTeleportCancel); 5576 AddLocalPacketHandler(PacketType.TeleportCancel, HandleTeleportCancel);
5479 AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest); 5577 AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest);
5480 AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false); 5578 AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false);
5481 AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest); 5579 AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest, false);
5482 AddLocalPacketHandler(PacketType.ParcelInfoRequest, HandleParcelInfoRequest); 5580 AddLocalPacketHandler(PacketType.ParcelInfoRequest, HandleParcelInfoRequest);
5483 AddLocalPacketHandler(PacketType.ParcelAccessListRequest, HandleParcelAccessListRequest, false); 5581 AddLocalPacketHandler(PacketType.ParcelAccessListRequest, HandleParcelAccessListRequest, false);
5484 AddLocalPacketHandler(PacketType.ParcelAccessListUpdate, HandleParcelAccessListUpdate, false); 5582 AddLocalPacketHandler(PacketType.ParcelAccessListUpdate, HandleParcelAccessListUpdate, false);
@@ -5591,83 +5689,137 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5591 5689
5592 #region Packet Handlers 5690 #region Packet Handlers
5593 5691
5692 public int TotalAgentUpdates { get; set; }
5693
5594 #region Scene/Avatar 5694 #region Scene/Avatar
5595 5695
5596 private bool HandleAgentUpdate(IClientAPI sener, Packet packet) 5696 // Threshold for body rotation to be a significant agent update
5697 private const float QDELTA = 0.000001f;
5698 // Threshold for camera rotation to be a significant agent update
5699 private const float VDELTA = 0.01f;
5700
5701 /// <summary>
5702 /// This checks the update significance against the last update made.
5703 /// </summary>
5704 /// <remarks>Can only be called by one thread at a time</remarks>
5705 /// <returns></returns>
5706 /// <param name='x'></param>
5707 public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5597 { 5708 {
5598 if (OnAgentUpdate != null) 5709 return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
5599 { 5710 }
5600 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
5601 5711
5602 #region Packet Session and User Check 5712 /// <summary>
5603 if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId) 5713 /// This checks the movement/state update significance against the last update made.
5604 { 5714 /// </summary>
5605 PacketPool.Instance.ReturnPacket(packet); 5715 /// <remarks>Can only be called by one thread at a time</remarks>
5606 return false; 5716 /// <returns></returns>
5607 } 5717 /// <param name='x'></param>
5608 #endregion 5718 private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5719 {
5720 float qdelta1 = 1 - (float)Math.Pow(Quaternion.Dot(x.BodyRotation, m_thisAgentUpdateArgs.BodyRotation), 2);
5721 //qdelta2 = 1 - (float)Math.Pow(Quaternion.Dot(x.HeadRotation, m_thisAgentUpdateArgs.HeadRotation), 2);
5722
5723 bool movementSignificant =
5724 (qdelta1 > QDELTA) // significant if body rotation above threshold
5725 // Ignoring head rotation altogether, because it's not being used for anything interesting up the stack
5726 // || (qdelta2 > QDELTA * 10) // significant if head rotation above threshold
5727 || (x.ControlFlags != m_thisAgentUpdateArgs.ControlFlags) // significant if control flags changed
5728 || (x.ControlFlags != (byte)AgentManager.ControlFlags.NONE) // significant if user supplying any movement update commands
5729 || (x.Far != m_thisAgentUpdateArgs.Far) // significant if far distance changed
5730 || (x.Flags != m_thisAgentUpdateArgs.Flags) // significant if Flags changed
5731 || (x.State != m_thisAgentUpdateArgs.State) // significant if Stats changed
5732 ;
5733 //if (movementSignificant)
5734 //{
5735 //m_log.DebugFormat("[LLCLIENTVIEW]: Bod {0} {1}",
5736 // qdelta1, qdelta2);
5737 //m_log.DebugFormat("[LLCLIENTVIEW]: St {0} {1} {2} {3}",
5738 // x.ControlFlags, x.Flags, x.Far, x.State);
5739 //}
5740 return movementSignificant;
5741 }
5609 5742
5610 bool update = false; 5743 /// <summary>
5611 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData; 5744 /// This checks the camera update significance against the last update made.
5612 5745 /// </summary>
5613 if (m_lastAgentUpdateArgs != null) 5746 /// <remarks>Can only be called by one thread at a time</remarks>
5614 { 5747 /// <returns></returns>
5615 // These should be ordered from most-likely to 5748 /// <param name='x'></param>
5616 // least likely to change. I've made an initial 5749 private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5617 // guess at that. 5750 {
5618 update = 5751 float vdelta1 = Vector3.Distance(x.CameraAtAxis, m_thisAgentUpdateArgs.CameraAtAxis);
5619 ( 5752 float vdelta2 = Vector3.Distance(x.CameraCenter, m_thisAgentUpdateArgs.CameraCenter);
5620 (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) || 5753 float vdelta3 = Vector3.Distance(x.CameraLeftAxis, m_thisAgentUpdateArgs.CameraLeftAxis);
5621 (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) || 5754 float vdelta4 = Vector3.Distance(x.CameraUpAxis, m_thisAgentUpdateArgs.CameraUpAxis);
5622 (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) ||
5623 (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) ||
5624 (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) ||
5625 (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) ||
5626 (x.ControlFlags != 0) ||
5627 (x.Far != m_lastAgentUpdateArgs.Far) ||
5628 (x.Flags != m_lastAgentUpdateArgs.Flags) ||
5629 (x.State != m_lastAgentUpdateArgs.State) ||
5630 (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) ||
5631 (x.SessionID != m_lastAgentUpdateArgs.SessionID) ||
5632 (x.AgentID != m_lastAgentUpdateArgs.AgentID)
5633 );
5634 }
5635 else
5636 {
5637 m_lastAgentUpdateArgs = new AgentUpdateArgs();
5638 update = true;
5639 }
5640 5755
5641 if (update) 5756 bool cameraSignificant =
5642 { 5757 (vdelta1 > VDELTA) ||
5643// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name); 5758 (vdelta2 > VDELTA) ||
5759 (vdelta3 > VDELTA) ||
5760 (vdelta4 > VDELTA)
5761 ;
5644 5762
5645 m_lastAgentUpdateArgs.AgentID = x.AgentID; 5763 //if (cameraSignificant)
5646 m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation; 5764 //{
5647 m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis; 5765 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam1 {0} {1}",
5648 m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter; 5766 // x.CameraAtAxis, x.CameraCenter);
5649 m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis; 5767 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam2 {0} {1}",
5650 m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis; 5768 // x.CameraLeftAxis, x.CameraUpAxis);
5651 m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags; 5769 //}
5652 m_lastAgentUpdateArgs.Far = x.Far;
5653 m_lastAgentUpdateArgs.Flags = x.Flags;
5654 m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation;
5655 m_lastAgentUpdateArgs.SessionID = x.SessionID;
5656 m_lastAgentUpdateArgs.State = x.State;
5657 5770
5658 UpdateAgent handlerAgentUpdate = OnAgentUpdate; 5771 return cameraSignificant;
5659 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate; 5772 }
5660 5773
5661 if (handlerPreAgentUpdate != null) 5774 private bool HandleAgentUpdate(IClientAPI sener, Packet packet)
5662 OnPreAgentUpdate(this, m_lastAgentUpdateArgs); 5775 {
5776 // We got here, which means that something in agent update was significant
5663 5777
5664 if (handlerAgentUpdate != null) 5778 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
5665 OnAgentUpdate(this, m_lastAgentUpdateArgs); 5779 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData;
5666 5780
5667 handlerAgentUpdate = null; 5781 if (x.AgentID != AgentId || x.SessionID != SessionId)
5668 handlerPreAgentUpdate = null; 5782 return false;
5669 } 5783
5670 } 5784 // Before we update the current m_thisAgentUpdateArgs, let's check this again
5785 // to see what exactly changed
5786 bool movement = CheckAgentMovementUpdateSignificance(x);
5787 bool camera = CheckAgentCameraUpdateSignificance(x);
5788
5789 m_thisAgentUpdateArgs.AgentID = x.AgentID;
5790 m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
5791 m_thisAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
5792 m_thisAgentUpdateArgs.CameraCenter = x.CameraCenter;
5793 m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
5794 m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
5795 m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
5796 m_thisAgentUpdateArgs.Far = x.Far;
5797 m_thisAgentUpdateArgs.Flags = x.Flags;
5798 m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
5799 m_thisAgentUpdateArgs.SessionID = x.SessionID;
5800 m_thisAgentUpdateArgs.State = x.State;
5801
5802 UpdateAgent handlerAgentUpdate = OnAgentUpdate;
5803 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
5804 UpdateAgent handlerAgentCameraUpdate = OnAgentCameraUpdate;
5805
5806 // Was there a significant movement/state change?
5807 if (movement)
5808 {
5809 if (handlerPreAgentUpdate != null)
5810 OnPreAgentUpdate(this, m_thisAgentUpdateArgs);
5811
5812 if (handlerAgentUpdate != null)
5813 OnAgentUpdate(this, m_thisAgentUpdateArgs);
5814 }
5815 // Was there a significant camera(s) change?
5816 if (camera)
5817 if (handlerAgentCameraUpdate != null)
5818 handlerAgentCameraUpdate(this, m_thisAgentUpdateArgs);
5819
5820 handlerAgentUpdate = null;
5821 handlerPreAgentUpdate = null;
5822 handlerAgentCameraUpdate = null;
5671 5823
5672 PacketPool.Instance.ReturnPacket(packet); 5824 PacketPool.Instance.ReturnPacket(packet);
5673 5825
@@ -6257,6 +6409,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6257 //m_log.Info("[LAND]: LAND:" + modify.ToString()); 6409 //m_log.Info("[LAND]: LAND:" + modify.ToString());
6258 if (modify.ParcelData.Length > 0) 6410 if (modify.ParcelData.Length > 0)
6259 { 6411 {
6412 // Note: the ModifyTerrain event handler sends out updated packets before the end of this event. Therefore,
6413 // a simple boolean value should work and perhaps queue up just a few terrain patch packets at the end of the edit.
6414 m_justEditedTerrain = true; // Prevent terrain packet (Land layer) from being queued, make it unreliable
6260 if (OnModifyTerrain != null) 6415 if (OnModifyTerrain != null)
6261 { 6416 {
6262 for (int i = 0; i < modify.ParcelData.Length; i++) 6417 for (int i = 0; i < modify.ParcelData.Length; i++)
@@ -6272,6 +6427,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6272 } 6427 }
6273 } 6428 }
6274 } 6429 }
6430 m_justEditedTerrain = false; // Queue terrain packet (Land layer) if necessary, make it reliable again
6275 } 6431 }
6276 6432
6277 return true; 6433 return true;
@@ -6633,6 +6789,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6633 } 6789 }
6634 #endregion 6790 #endregion
6635 6791
6792 if (SceneAgent.IsChildAgent)
6793 {
6794 SendCantSitBecauseChildAgentResponse();
6795 return true;
6796 }
6797
6636 AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit; 6798 AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
6637 6799
6638 if (handlerAgentRequestSit != null) 6800 if (handlerAgentRequestSit != null)
@@ -6657,6 +6819,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6657 } 6819 }
6658 #endregion 6820 #endregion
6659 6821
6822 if (SceneAgent.IsChildAgent)
6823 {
6824 SendCantSitBecauseChildAgentResponse();
6825 return true;
6826 }
6827
6660 AgentSit handlerAgentSit = OnAgentSit; 6828 AgentSit handlerAgentSit = OnAgentSit;
6661 if (handlerAgentSit != null) 6829 if (handlerAgentSit != null)
6662 { 6830 {
@@ -6666,6 +6834,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6666 return true; 6834 return true;
6667 } 6835 }
6668 6836
6837 /// <summary>
6838 /// Used when a child agent gets a sit response which should not be fulfilled.
6839 /// </summary>
6840 private void SendCantSitBecauseChildAgentResponse()
6841 {
6842 SendAlertMessage("Try moving closer. Can't sit on object because it is not in the same region as you.");
6843 }
6844
6669 private bool HandleSoundTrigger(IClientAPI sender, Packet Pack) 6845 private bool HandleSoundTrigger(IClientAPI sender, Packet Pack)
6670 { 6846 {
6671 SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack; 6847 SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack;
@@ -7876,129 +8052,145 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7876 //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request"); 8052 //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
7877 8053
7878 TransferRequestPacket transfer = (TransferRequestPacket)Pack; 8054 TransferRequestPacket transfer = (TransferRequestPacket)Pack;
7879 //m_log.Debug("Transfer Request: " + transfer.ToString());
7880 // Validate inventory transfers
7881 // Has to be done here, because AssetCache can't do it
7882 //
7883 UUID taskID = UUID.Zero; 8055 UUID taskID = UUID.Zero;
7884 if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) 8056 if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
7885 { 8057 {
7886 taskID = new UUID(transfer.TransferInfo.Params, 48);
7887 UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
7888 UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
7889
7890// m_log.DebugFormat(
7891// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
7892// requestID, itemID, taskID, Name);
7893
7894 if (!(((Scene)m_scene).Permissions.BypassPermissions())) 8058 if (!(((Scene)m_scene).Permissions.BypassPermissions()))
7895 { 8059 {
7896 if (taskID != UUID.Zero) // Prim 8060 // We're spawning a thread because the permissions check can block this thread
8061 Util.FireAndForget(delegate
7897 { 8062 {
7898 SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); 8063 // This requests the asset if needed
8064 HandleSimInventoryTransferRequestWithPermsCheck(sender, transfer);
8065 });
8066 return true;
8067 }
8068 }
8069 else if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate)
8070 {
8071 //TransferRequestPacket does not include covenant uuid?
8072 //get scene covenant uuid
8073 taskID = m_scene.RegionInfo.RegionSettings.Covenant;
8074 }
7899 8075
7900 if (part == null) 8076 // This is non-blocking
7901 { 8077 MakeAssetRequest(transfer, taskID);
7902 m_log.WarnFormat(
7903 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
7904 Name, requestID, itemID, taskID);
7905 return true;
7906 }
7907 8078
7908 TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID); 8079 return true;
7909 if (tii == null) 8080 }
7910 {
7911 m_log.WarnFormat(
7912 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
7913 Name, requestID, itemID, taskID);
7914 return true;
7915 }
7916 8081
7917 if (tii.Type == (int)AssetType.LSLText) 8082 private void HandleSimInventoryTransferRequestWithPermsCheck(IClientAPI sender, TransferRequestPacket transfer)
7918 { 8083 {
7919 if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId)) 8084 UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
7920 return true; 8085 UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
7921 } 8086 UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
7922 else if (tii.Type == (int)AssetType.Notecard)
7923 {
7924 if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
7925 return true;
7926 }
7927 else
7928 {
7929 // TODO: Change this code to allow items other than notecards and scripts to be successfully
7930 // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
7931 if (part.OwnerID != AgentId)
7932 {
7933 m_log.WarnFormat(
7934 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
7935 Name, requestID, itemID, taskID, part.OwnerID);
7936 return true;
7937 }
7938 8087
7939 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) 8088 //m_log.DebugFormat(
7940 { 8089 // "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
7941 m_log.WarnFormat( 8090 // requestID, itemID, taskID, Name);
7942 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
7943 Name, requestID, itemID, taskID);
7944 return true;
7945 }
7946 8091
7947 if (tii.OwnerID != AgentId) 8092 //m_log.Debug("Transfer Request: " + transfer.ToString());
7948 { 8093 // Validate inventory transfers
7949 m_log.WarnFormat( 8094 // Has to be done here, because AssetCache can't do it
7950 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}", 8095 //
7951 Name, requestID, itemID, taskID, tii.OwnerID); 8096 if (taskID != UUID.Zero) // Prim
7952 return true; 8097 {
7953 } 8098 SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
7954 8099
7955 if (( 8100 if (part == null)
7956 tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) 8101 {
7957 != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) 8102 m_log.WarnFormat(
7958 { 8103 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
7959 m_log.WarnFormat( 8104 Name, requestID, itemID, taskID);
7960 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer", 8105 return;
7961 Name, requestID, itemID, taskID); 8106 }
7962 return true;
7963 }
7964 8107
7965 if (tii.AssetID != requestID) 8108 TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
7966 { 8109 if (tii == null)
7967 m_log.WarnFormat( 8110 {
7968 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}", 8111 m_log.WarnFormat(
7969 Name, requestID, itemID, taskID, tii.AssetID); 8112 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
7970 return true; 8113 Name, requestID, itemID, taskID);
7971 } 8114 return;
7972 } 8115 }
8116
8117 if (tii.Type == (int)AssetType.LSLText)
8118 {
8119 if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
8120 return;
8121 }
8122 else if (tii.Type == (int)AssetType.Notecard)
8123 {
8124 if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
8125 return;
8126 }
8127 else
8128 {
8129 // TODO: Change this code to allow items other than notecards and scripts to be successfully
8130 // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
8131 if (part.OwnerID != AgentId)
8132 {
8133 m_log.WarnFormat(
8134 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
8135 Name, requestID, itemID, taskID, part.OwnerID);
8136 return;
7973 } 8137 }
7974 else // Agent 8138
8139 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
7975 { 8140 {
7976 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 8141 m_log.WarnFormat(
7977 if (invAccess != null) 8142 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
7978 { 8143 Name, requestID, itemID, taskID);
7979 if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID)) 8144 return;
7980 return false; 8145 }
7981 } 8146
7982 else 8147 if (tii.OwnerID != AgentId)
7983 { 8148 {
7984 return false; 8149 m_log.WarnFormat(
7985 } 8150 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
8151 Name, requestID, itemID, taskID, tii.OwnerID);
8152 return;
8153 }
8154
8155 if ((
8156 tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
8157 != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
8158 {
8159 m_log.WarnFormat(
8160 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
8161 Name, requestID, itemID, taskID);
8162 return;
8163 }
8164
8165 if (tii.AssetID != requestID)
8166 {
8167 m_log.WarnFormat(
8168 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
8169 Name, requestID, itemID, taskID, tii.AssetID);
8170 return;
7986 } 8171 }
7987 } 8172 }
7988 } 8173 }
7989 else 8174 else // Agent
7990 if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate) 8175 {
8176 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
8177 if (invAccess != null)
8178 {
8179 if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
8180 return;
8181 }
8182 else
7991 { 8183 {
7992 //TransferRequestPacket does not include covenant uuid? 8184 return;
7993 //get scene covenant uuid
7994 taskID = m_scene.RegionInfo.RegionSettings.Covenant;
7995 } 8185 }
8186 }
7996 8187
8188 // Permissions out of the way, let's request the asset
7997 MakeAssetRequest(transfer, taskID); 8189 MakeAssetRequest(transfer, taskID);
7998 8190
7999 return true;
8000 } 8191 }
8001 8192
8193
8002 private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack) 8194 private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
8003 { 8195 {
8004 AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; 8196 AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
@@ -11729,8 +11921,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11729 } 11921 }
11730 11922
11731 /// <summary> 11923 /// <summary>
11732 /// Send a response back to a client when it asks the asset server (via the region server) if it has
11733 /// its appearance texture cached.
11734 /// </summary> 11924 /// </summary>
11735 /// <remarks> 11925 /// <remarks>
11736 /// At the moment, we always reply that there is no cached texture. 11926 /// At the moment, we always reply that there is no cached texture.
@@ -11738,6 +11928,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11738 /// <param name="simclient"></param> 11928 /// <param name="simclient"></param>
11739 /// <param name="packet"></param> 11929 /// <param name="packet"></param>
11740 /// <returns></returns> 11930 /// <returns></returns>
11931 // TODO: Convert old handler to use new method
11932 /*protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
11933 {
11934 AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
11935
11936 if (cachedtex.AgentData.SessionID != SessionId)
11937 return false;
11938
11939
11940 List<CachedTextureRequestArg> requestArgs = new List<CachedTextureRequestArg>();
11941
11942 for (int i = 0; i < cachedtex.WearableData.Length; i++)
11943 {
11944 CachedTextureRequestArg arg = new CachedTextureRequestArg();
11945 arg.BakedTextureIndex = cachedtex.WearableData[i].TextureIndex;
11946 arg.WearableHashID = cachedtex.WearableData[i].ID;
11947
11948 requestArgs.Add(arg);
11949 }
11950
11951 CachedTextureRequest handlerCachedTextureRequest = OnCachedTextureRequest;
11952 if (handlerCachedTextureRequest != null)
11953 {
11954 handlerCachedTextureRequest(simclient,cachedtex.AgentData.SerialNum,requestArgs);
11955 }
11956
11957 return true;
11958 }*/
11959
11741 protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) 11960 protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
11742 { 11961 {
11743 //m_log.Debug("texture cached: " + packet.ToString()); 11962 //m_log.Debug("texture cached: " + packet.ToString());
@@ -11896,6 +12115,40 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11896 return true; 12115 return true;
11897 } 12116 }
11898 12117
12118 /// <summary>
12119 /// Send a response back to a client when it asks the asset server (via the region server) if it has
12120 /// its appearance texture cached.
12121 /// </summary>
12122 /// <param name="avatar"></param>
12123 /// <param name="serial"></param>
12124 /// <param name="cachedTextures"></param>
12125 /// <returns></returns>
12126 public void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures)
12127 {
12128 ScenePresence presence = avatar as ScenePresence;
12129 if (presence == null)
12130 return;
12131
12132 AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
12133
12134 // TODO: don't create new blocks if recycling an old packet
12135 cachedresp.AgentData.AgentID = m_agentId;
12136 cachedresp.AgentData.SessionID = m_sessionId;
12137 cachedresp.AgentData.SerialNum = serial;
12138 cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cachedTextures.Count];
12139
12140 for (int i = 0; i < cachedTextures.Count; i++)
12141 {
12142 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
12143 cachedresp.WearableData[i].TextureIndex = (byte)cachedTextures[i].BakedTextureIndex;
12144 cachedresp.WearableData[i].TextureID = cachedTextures[i].BakedTextureID;
12145 cachedresp.WearableData[i].HostName = new byte[0];
12146 }
12147
12148 cachedresp.Header.Zerocoded = true;
12149 OutPacket(cachedresp, ThrottleOutPacketType.Task);
12150 }
12151
11899 protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet) 12152 protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet)
11900 { 12153 {
11901 MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; 12154 MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
@@ -11921,8 +12174,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11921 if (part == null) 12174 if (part == null)
11922 { 12175 {
11923 // It's a ghost! tell the client to delete it from view. 12176 // It's a ghost! tell the client to delete it from view.
11924 simClient.SendKillObject(Scene.RegionInfo.RegionHandle, 12177 simClient.SendKillObject(new List<uint> { localId });
11925 new List<uint> { localId });
11926 } 12178 }
11927 else 12179 else
11928 { 12180 {
@@ -12326,7 +12578,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
12326 ClientInfo info = m_udpClient.GetClientInfo(); 12578 ClientInfo info = m_udpClient.GetClientInfo();
12327 12579
12328 info.proxyEP = null; 12580 info.proxyEP = null;
12329 info.agentcircuit = RequestClientInfo(); 12581 if (info.agentcircuit == null)
12582 info.agentcircuit = RequestClientInfo();
12330 12583
12331 return info; 12584 return info;
12332 } 12585 }
@@ -12709,11 +12962,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
12709 OutPacket(dialog, ThrottleOutPacketType.Task); 12962 OutPacket(dialog, ThrottleOutPacketType.Task);
12710 } 12963 }
12711 12964
12712 public void StopFlying(ISceneEntity p) 12965 public void SendAgentTerseUpdate(ISceneEntity p)
12713 { 12966 {
12714 if (p is ScenePresence) 12967 if (p is ScenePresence)
12715 { 12968 {
12716 ScenePresence presence = p as ScenePresence;
12717 // It turns out to get the agent to stop flying, you have to feed it stop flying velocities 12969 // It turns out to get the agent to stop flying, you have to feed it stop flying velocities
12718 // There's no explicit message to send the client to tell it to stop flying.. it relies on the 12970 // There's no explicit message to send the client to tell it to stop flying.. it relies on the
12719 // velocity, collision plane and avatar height 12971 // velocity, collision plane and avatar height
@@ -12721,34 +12973,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
12721 // Add 1/6 the avatar's height to it's position so it doesn't shoot into the air 12973 // Add 1/6 the avatar's height to it's position so it doesn't shoot into the air
12722 // when the avatar stands up 12974 // when the avatar stands up
12723 12975
12724 Vector3 pos = presence.AbsolutePosition;
12725
12726 if (presence.Appearance.AvatarHeight != 127.0f)
12727 pos += new Vector3(0f, 0f, (presence.Appearance.AvatarHeight/6f));
12728 else
12729 pos += new Vector3(0f, 0f, (1.56f/6f));
12730
12731 presence.AbsolutePosition = pos;
12732
12733 // attach a suitable collision plane regardless of the actual situation to force the LLClient to land.
12734 // Collision plane below the avatar's position a 6th of the avatar's height is suitable.
12735 // Mind you, that this method doesn't get called if the avatar's velocity magnitude is greater then a
12736 // certain amount.. because the LLClient wouldn't land in that situation anyway.
12737
12738 // why are we still testing for this really old height value default???
12739 if (presence.Appearance.AvatarHeight != 127.0f)
12740 presence.CollisionPlane = new Vector4(0, 0, 0, pos.Z - presence.Appearance.AvatarHeight/6f);
12741 else
12742 presence.CollisionPlane = new Vector4(0, 0, 0, pos.Z - (1.56f/6f));
12743
12744
12745 ImprovedTerseObjectUpdatePacket.ObjectDataBlock block = 12976 ImprovedTerseObjectUpdatePacket.ObjectDataBlock block =
12746 CreateImprovedTerseBlock(p, false); 12977 CreateImprovedTerseBlock(p, false);
12747 12978
12748 const float TIME_DILATION = 1.0f; 12979 const float TIME_DILATION = 1.0f;
12749 ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f); 12980 ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
12750 12981
12751
12752 ImprovedTerseObjectUpdatePacket packet 12982 ImprovedTerseObjectUpdatePacket packet
12753 = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( 12983 = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(
12754 PacketType.ImprovedTerseObjectUpdate); 12984 PacketType.ImprovedTerseObjectUpdate);
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
index 073c357..41dd4d1 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
@@ -206,6 +206,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
206 } 206 }
207 } 207 }
208 208
209 public bool HasUpdates()
210 {
211 J2KImage image = GetHighestPriorityImage();
212
213 return image != null && image.IsDecoded;
214 }
215
209 public bool ProcessImageQueue(int packetsToSend) 216 public bool ProcessImageQueue(int packetsToSend)
210 { 217 {
211 int packetsSent = 0; 218 int packetsSent = 0;
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
index e52ac37..d52ad7e 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
@@ -31,6 +31,7 @@ using System.Net;
31using System.Threading; 31using System.Threading;
32using log4net; 32using log4net;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Framework.Monitoring;
34using OpenMetaverse; 35using OpenMetaverse;
35using OpenMetaverse.Packets; 36using OpenMetaverse.Packets;
36 37
@@ -81,6 +82,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
81 /// hooked to put more data on the empty queue</summary> 82 /// hooked to put more data on the empty queue</summary>
82 public event QueueEmpty OnQueueEmpty; 83 public event QueueEmpty OnQueueEmpty;
83 84
85 public event Func<ThrottleOutPacketTypeFlags, bool> HasUpdates;
86
84 /// <summary>AgentID for this client</summary> 87 /// <summary>AgentID for this client</summary>
85 public readonly UUID AgentID; 88 public readonly UUID AgentID;
86 /// <summary>The remote address of the connected client</summary> 89 /// <summary>The remote address of the connected client</summary>
@@ -160,6 +163,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
160 private int m_maxRTO = 60000; 163 private int m_maxRTO = 60000;
161 public bool m_deliverPackets = true; 164 public bool m_deliverPackets = true;
162 165
166 private ClientInfo m_info = new ClientInfo();
167
163 /// <summary> 168 /// <summary>
164 /// Default constructor 169 /// Default constructor
165 /// </summary> 170 /// </summary>
@@ -241,20 +246,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
241 // TODO: This data structure is wrong in so many ways. Locking and copying the entire lists 246 // TODO: This data structure is wrong in so many ways. Locking and copying the entire lists
242 // of pending and needed ACKs for every client every time some method wants information about 247 // of pending and needed ACKs for every client every time some method wants information about
243 // this connection is a recipe for poor performance 248 // this connection is a recipe for poor performance
244 ClientInfo info = new ClientInfo(); 249
245 info.pendingAcks = new Dictionary<uint, uint>(); 250 m_info.resendThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate;
246 info.needAck = new Dictionary<uint, byte[]>(); 251 m_info.landThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate;
247 252 m_info.windThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate;
248 info.resendThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate; 253 m_info.cloudThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate;
249 info.landThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate; 254 m_info.taskThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate;
250 info.windThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate; 255 m_info.assetThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate;
251 info.cloudThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate; 256 m_info.textureThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate;
252 info.taskThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate; 257 m_info.totalThrottle = (int)m_throttleCategory.DripRate;
253 info.assetThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate; 258
254 info.textureThrottle = (int)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate; 259 return m_info;
255 info.totalThrottle = (int)m_throttleCategory.DripRate;
256
257 return info;
258 } 260 }
259 261
260 /// <summary> 262 /// <summary>
@@ -646,15 +648,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
646 /// <param name="categories">Throttle categories to fire the callback for</param> 648 /// <param name="categories">Throttle categories to fire the callback for</param>
647 private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories) 649 private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories)
648 { 650 {
649 if (m_nextOnQueueEmpty != 0 && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) 651// if (m_nextOnQueueEmpty != 0 && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty)
652 if (!m_isQueueEmptyRunning && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty)
650 { 653 {
654 m_isQueueEmptyRunning = true;
655
656 int start = Environment.TickCount & Int32.MaxValue;
657 const int MIN_CALLBACK_MS = 30;
658
659 m_nextOnQueueEmpty = start + MIN_CALLBACK_MS;
660 if (m_nextOnQueueEmpty == 0)
661 m_nextOnQueueEmpty = 1;
662
651 // Use a value of 0 to signal that FireQueueEmpty is running 663 // Use a value of 0 to signal that FireQueueEmpty is running
652 m_nextOnQueueEmpty = 0; 664// m_nextOnQueueEmpty = 0;
653 // Asynchronously run the callback 665
654 Util.FireAndForget(FireQueueEmpty, categories); 666 m_categories = categories;
667
668 if (HasUpdates(m_categories))
669 {
670 // Asynchronously run the callback
671 Util.FireAndForget(FireQueueEmpty, categories);
672 }
673 else
674 {
675 m_isQueueEmptyRunning = false;
676 }
655 } 677 }
656 } 678 }
657 679
680 private bool m_isQueueEmptyRunning;
681 private ThrottleOutPacketTypeFlags m_categories = 0;
682
658 /// <summary> 683 /// <summary>
659 /// Fires the OnQueueEmpty callback and sets the minimum time that it 684 /// Fires the OnQueueEmpty callback and sets the minimum time that it
660 /// can be called again 685 /// can be called again
@@ -664,22 +689,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
664 /// signature</param> 689 /// signature</param>
665 private void FireQueueEmpty(object o) 690 private void FireQueueEmpty(object o)
666 { 691 {
667 const int MIN_CALLBACK_MS = 30; 692// int start = Environment.TickCount & Int32.MaxValue;
693// const int MIN_CALLBACK_MS = 30;
668 694
669 ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o; 695// if (m_udpServer.IsRunningOutbound)
670 QueueEmpty callback = OnQueueEmpty; 696// {
671 697 ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o;
672 int start = Environment.TickCount & Int32.MaxValue; 698 QueueEmpty callback = OnQueueEmpty;
673 699
674 if (callback != null) 700 if (callback != null)
675 { 701 {
676 try { callback(categories); } 702// if (m_udpServer.IsRunningOutbound)
677 catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); } 703// {
678 } 704 try { callback(categories); }
705 catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); }
706// }
707 }
708// }
709
710// m_nextOnQueueEmpty = start + MIN_CALLBACK_MS;
711// if (m_nextOnQueueEmpty == 0)
712// m_nextOnQueueEmpty = 1;
713
714// }
679 715
680 m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; 716 m_isQueueEmptyRunning = false;
681 if (m_nextOnQueueEmpty == 0)
682 m_nextOnQueueEmpty = 1;
683 } 717 }
684 internal void ForceThrottleSetting(int throttle, int setting) 718 internal void ForceThrottleSetting(int throttle, int setting)
685 { 719 {
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 4154ef2..ad3f715 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -34,6 +34,7 @@ using System.Net.Sockets;
34using System.Reflection; 34using System.Reflection;
35using System.Threading; 35using System.Threading;
36using log4net; 36using log4net;
37using NDesk.Options;
37using Nini.Config; 38using Nini.Config;
38using OpenMetaverse.Packets; 39using OpenMetaverse.Packets;
39using OpenSim.Framework; 40using OpenSim.Framework;
@@ -62,20 +63,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP
62 m_udpServer = new LLUDPServer(listenIP, ref port, proxyPortOffsetParm, allow_alternate_port, configSource, circuitManager); 63 m_udpServer = new LLUDPServer(listenIP, ref port, proxyPortOffsetParm, allow_alternate_port, configSource, circuitManager);
63 } 64 }
64 65
65 public void NetworkStop()
66 {
67 m_udpServer.Stop();
68 }
69
70 public void AddScene(IScene scene) 66 public void AddScene(IScene scene)
71 { 67 {
72 m_udpServer.AddScene(scene); 68 m_udpServer.AddScene(scene);
73 69
74 StatsManager.RegisterStat( 70 StatsManager.RegisterStat(
75 new Stat( 71 new Stat(
72 "ClientLogoutsDueToNoReceives",
73 "Number of times a client has been logged out because no packets were received before the timeout.",
74 "",
75 "",
76 "clientstack",
77 scene.Name,
78 StatType.Pull,
79 MeasuresOfInterest.None,
80 stat => stat.Value = m_udpServer.ClientLogoutsDueToNoReceives,
81 StatVerbosity.Debug));
82
83 StatsManager.RegisterStat(
84 new Stat(
85 "IncomingUDPReceivesCount",
86 "Number of UDP receives performed",
87 "",
88 "",
89 "clientstack",
90 scene.Name,
91 StatType.Pull,
92 MeasuresOfInterest.AverageChangeOverTime,
93 stat => stat.Value = m_udpServer.UdpReceives,
94 StatVerbosity.Debug));
95
96 StatsManager.RegisterStat(
97 new Stat(
76 "IncomingPacketsProcessedCount", 98 "IncomingPacketsProcessedCount",
77 "Number of inbound UDP packets processed", 99 "Number of inbound LL protocol packets processed",
78 "Number of inbound UDP packets processed", 100 "",
79 "", 101 "",
80 "clientstack", 102 "clientstack",
81 scene.Name, 103 scene.Name,
@@ -83,6 +105,60 @@ namespace OpenSim.Region.ClientStack.LindenUDP
83 MeasuresOfInterest.AverageChangeOverTime, 105 MeasuresOfInterest.AverageChangeOverTime,
84 stat => stat.Value = m_udpServer.IncomingPacketsProcessed, 106 stat => stat.Value = m_udpServer.IncomingPacketsProcessed,
85 StatVerbosity.Debug)); 107 StatVerbosity.Debug));
108
109 StatsManager.RegisterStat(
110 new Stat(
111 "IncomingPacketsMalformedCount",
112 "Number of inbound UDP packets that could not be recognized as LL protocol packets.",
113 "",
114 "",
115 "clientstack",
116 scene.Name,
117 StatType.Pull,
118 MeasuresOfInterest.AverageChangeOverTime,
119 stat => stat.Value = m_udpServer.IncomingMalformedPacketCount,
120 StatVerbosity.Info));
121
122 StatsManager.RegisterStat(
123 new Stat(
124 "IncomingPacketsOrphanedCount",
125 "Number of inbound packets that were not initial connections packets and could not be associated with a viewer.",
126 "",
127 "",
128 "clientstack",
129 scene.Name,
130 StatType.Pull,
131 MeasuresOfInterest.AverageChangeOverTime,
132 stat => stat.Value = m_udpServer.IncomingOrphanedPacketCount,
133 StatVerbosity.Info));
134
135 StatsManager.RegisterStat(
136 new Stat(
137 "OutgoingUDPSendsCount",
138 "Number of UDP sends performed",
139 "",
140 "",
141 "clientstack",
142 scene.Name,
143 StatType.Pull,
144 MeasuresOfInterest.AverageChangeOverTime,
145 stat => stat.Value = m_udpServer.UdpSends,
146 StatVerbosity.Debug));
147
148 StatsManager.RegisterStat(
149 new Stat(
150 "AverageUDPProcessTime",
151 "Average number of milliseconds taken to process each incoming UDP packet in a sample.",
152 "This is for initial receive processing which is separate from the later client LL packet processing stage.",
153 "ms",
154 "clientstack",
155 scene.Name,
156 StatType.Pull,
157 MeasuresOfInterest.None,
158 stat => stat.Value = m_udpServer.AverageReceiveTicksForLastSamplePeriod / TimeSpan.TicksPerMillisecond,
159// stat =>
160// stat.Value = Math.Round(m_udpServer.AverageReceiveTicksForLastSamplePeriod / TimeSpan.TicksPerMillisecond, 7),
161 StatVerbosity.Debug));
86 } 162 }
87 163
88 public bool HandlesRegion(Location x) 164 public bool HandlesRegion(Location x)
@@ -107,10 +183,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
107 /// </summary> 183 /// </summary>
108 public class LLUDPServer : OpenSimUDPBase 184 public class LLUDPServer : OpenSimUDPBase
109 { 185 {
186 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
187
110 /// <summary>Maximum transmission unit, or UDP packet size, for the LLUDP protocol</summary> 188 /// <summary>Maximum transmission unit, or UDP packet size, for the LLUDP protocol</summary>
111 public const int MTU = 1400; 189 public const int MTU = 1400;
112 190
113 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 191 /// <summary>Number of forced client logouts due to no receipt of packets before timeout.</summary>
192 public int ClientLogoutsDueToNoReceives { get; private set; }
193
194 /// <summary>
195 /// Default packet debug level given to new clients
196 /// </summary>
197 public int DefaultClientPacketDebugLevel { get; set; }
114 198
115 /// <summary>The measured resolution of Environment.TickCount</summary> 199 /// <summary>The measured resolution of Environment.TickCount</summary>
116 public readonly float TickCountResolution; 200 public readonly float TickCountResolution;
@@ -184,6 +268,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
184 protected bool m_sendPing; 268 protected bool m_sendPing;
185 269
186 private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>(); 270 private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>();
271
272 /// <summary>
273 /// Event used to signal when queued packets are available for sending.
274 /// </summary>
275 /// <remarks>
276 /// This allows the outbound loop to only operate when there is data to send rather than continuously polling.
277 /// Some data is sent immediately and not queued. That data would not trigger this event.
278 /// </remarks>
279 private AutoResetEvent m_dataPresentEvent = new AutoResetEvent(false);
280
187 private Pool<IncomingPacket> m_incomingPacketPool; 281 private Pool<IncomingPacket> m_incomingPacketPool;
188 282
189 /// <summary> 283 /// <summary>
@@ -204,7 +298,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
204 298
205 public Socket Server { get { return null; } } 299 public Socket Server { get { return null; } }
206 300
207 private int m_malformedCount = 0; // Guard against a spamming attack 301 /// <summary>
302 /// Record how many inbound packets could not be recognized as LLUDP packets.
303 /// </summary>
304 public int IncomingMalformedPacketCount { get; private set; }
305
306 /// <summary>
307 /// Record how many inbound packets could not be associated with a simulator circuit.
308 /// </summary>
309 public int IncomingOrphanedPacketCount { get; private set; }
208 310
209 /// <summary> 311 /// <summary>
210 /// Record current outgoing client for monitoring purposes. 312 /// Record current outgoing client for monitoring purposes.
@@ -461,6 +563,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
461 m_scene = (Scene)scene; 563 m_scene = (Scene)scene;
462 m_location = new Location(m_scene.RegionInfo.RegionHandle); 564 m_location = new Location(m_scene.RegionInfo.RegionHandle);
463 565
566 StatsManager.RegisterStat(
567 new Stat(
568 "InboxPacketsCount",
569 "Number of LL protocol packets waiting for the second stage of processing after initial receive.",
570 "Number of LL protocol packets waiting for the second stage of processing after initial receive.",
571 "",
572 "clientstack",
573 scene.Name,
574 StatType.Pull,
575 MeasuresOfInterest.AverageChangeOverTime,
576 stat => stat.Value = packetInbox.Count,
577 StatVerbosity.Debug));
578
464 // XXX: These stats are also pool stats but we register them separately since they are currently not 579 // XXX: These stats are also pool stats but we register them separately since they are currently not
465 // turned on and off by EnablePools()/DisablePools() 580 // turned on and off by EnablePools()/DisablePools()
466 StatsManager.RegisterStat( 581 StatsManager.RegisterStat(
@@ -521,6 +636,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
521 EnablePoolStats(); 636 EnablePoolStats();
522 637
523 MainConsole.Instance.Commands.AddCommand( 638 MainConsole.Instance.Commands.AddCommand(
639 "Debug", false, "debug lludp packet",
640 "debug lludp packet [--default] <level> [<avatar-first-name> <avatar-last-name>]",
641 "Turn on packet debugging",
642 "If level > 255 then all incoming and outgoing packets are logged.\n"
643 + "If level <= 255 then incoming AgentUpdate and outgoing SimStats and SimulatorViewerTimeMessage packets are not logged.\n"
644 + "If level <= 200 then incoming RequestImage and outgoing ImagePacket, ImageData, LayerData and CoarseLocationUpdate packets are not logged.\n"
645 + "If level <= 100 then incoming ViewerEffect and AgentAnimation and outgoing ViewerEffect and AvatarAnimation packets are not logged.\n"
646 + "If level <= 50 then outgoing ImprovedTerseObjectUpdate packets are not logged.\n"
647 + "If level <= 0 then no packets are logged.\n"
648 + "If --default is specified then the level becomes the default logging level for all subsequent agents.\n"
649 + "In this case, you cannot also specify an avatar name.\n"
650 + "If an avatar name is given then only packets from that avatar are logged.",
651 HandlePacketCommand);
652
653 MainConsole.Instance.Commands.AddCommand(
524 "Debug", 654 "Debug",
525 false, 655 false,
526 "debug lludp start", 656 "debug lludp start",
@@ -559,10 +689,78 @@ namespace OpenSim.Region.ClientStack.LindenUDP
559 "debug lludp status", 689 "debug lludp status",
560 "Return status of LLUDP packet processing.", 690 "Return status of LLUDP packet processing.",
561 HandleStatusCommand); 691 HandleStatusCommand);
692
693 MainConsole.Instance.Commands.AddCommand(
694 "Debug",
695 false,
696 "debug lludp toggle agentupdate",
697 "debug lludp toggle agentupdate",
698 "Toggle whether agentupdate packets are processed or simply discarded.",
699 HandleAgentUpdateCommand);
700 }
701
702 private void HandlePacketCommand(string module, string[] args)
703 {
704 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
705 return;
706
707 bool setAsDefaultLevel = false;
708 OptionSet optionSet = new OptionSet().Add("default", o => setAsDefaultLevel = o != null);
709 List<string> filteredArgs = optionSet.Parse(args);
710
711 string name = null;
712
713 if (filteredArgs.Count == 6)
714 {
715 if (!setAsDefaultLevel)
716 {
717 name = string.Format("{0} {1}", filteredArgs[4], filteredArgs[5]);
718 }
719 else
720 {
721 MainConsole.Instance.OutputFormat("ERROR: Cannot specify a user name when setting default logging level");
722 return;
723 }
724 }
725
726 if (filteredArgs.Count > 3)
727 {
728 int newDebug;
729 if (int.TryParse(filteredArgs[3], out newDebug))
730 {
731 if (setAsDefaultLevel)
732 {
733 DefaultClientPacketDebugLevel = newDebug;
734 MainConsole.Instance.OutputFormat(
735 "Debug packet debug for new clients set to {0} in {1}", DefaultClientPacketDebugLevel, m_scene.Name);
736 }
737 else
738 {
739 m_scene.ForEachScenePresence(sp =>
740 {
741 if (name == null || sp.Name == name)
742 {
743 MainConsole.Instance.OutputFormat(
744 "Packet debug for {0} ({1}) set to {2} in {3}",
745 sp.Name, sp.IsChildAgent ? "child" : "root", newDebug, m_scene.Name);
746
747 sp.ControllingClient.DebugPacketLevel = newDebug;
748 }
749 });
750 }
751 }
752 else
753 {
754 MainConsole.Instance.Output("Usage: debug lludp packet [--default] 0..255 [<first-name> <last-name>]");
755 }
756 }
562 } 757 }
563 758
564 private void HandleStartCommand(string module, string[] args) 759 private void HandleStartCommand(string module, string[] args)
565 { 760 {
761 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
762 return;
763
566 if (args.Length != 4) 764 if (args.Length != 4)
567 { 765 {
568 MainConsole.Instance.Output("Usage: debug lludp start <in|out|all>"); 766 MainConsole.Instance.Output("Usage: debug lludp start <in|out|all>");
@@ -580,6 +778,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
580 778
581 private void HandleStopCommand(string module, string[] args) 779 private void HandleStopCommand(string module, string[] args)
582 { 780 {
781 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
782 return;
783
583 if (args.Length != 4) 784 if (args.Length != 4)
584 { 785 {
585 MainConsole.Instance.Output("Usage: debug lludp stop <in|out|all>"); 786 MainConsole.Instance.Output("Usage: debug lludp stop <in|out|all>");
@@ -597,6 +798,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
597 798
598 private void HandlePoolCommand(string module, string[] args) 799 private void HandlePoolCommand(string module, string[] args)
599 { 800 {
801 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
802 return;
803
600 if (args.Length != 4) 804 if (args.Length != 4)
601 { 805 {
602 MainConsole.Instance.Output("Usage: debug lludp pool <on|off>"); 806 MainConsole.Instance.Output("Usage: debug lludp pool <on|off>");
@@ -627,8 +831,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP
627 } 831 }
628 } 832 }
629 833
834 bool m_discardAgentUpdates;
835
836 private void HandleAgentUpdateCommand(string module, string[] args)
837 {
838 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
839 return;
840
841 m_discardAgentUpdates = !m_discardAgentUpdates;
842
843 MainConsole.Instance.OutputFormat(
844 "Discard AgentUpdates now {0} for {1}", m_discardAgentUpdates, m_scene.Name);
845 }
846
630 private void HandleStatusCommand(string module, string[] args) 847 private void HandleStatusCommand(string module, string[] args)
631 { 848 {
849 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
850 return;
851
632 MainConsole.Instance.OutputFormat( 852 MainConsole.Instance.OutputFormat(
633 "IN LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningInbound ? "enabled" : "disabled"); 853 "IN LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningInbound ? "enabled" : "disabled");
634 854
@@ -636,6 +856,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
636 "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled"); 856 "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled");
637 857
638 MainConsole.Instance.OutputFormat("LLUDP pools in {0} are {1}", m_scene.Name, UsePools ? "on" : "off"); 858 MainConsole.Instance.OutputFormat("LLUDP pools in {0} are {1}", m_scene.Name, UsePools ? "on" : "off");
859
860 MainConsole.Instance.OutputFormat(
861 "Packet debug level for new clients is {0}", DefaultClientPacketDebugLevel);
639 } 862 }
640 863
641 public bool HandlesRegion(Location x) 864 public bool HandlesRegion(Location x)
@@ -721,6 +944,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
721 } 944 }
722 945
723 PacketPool.Instance.ReturnPacket(packet); 946 PacketPool.Instance.ReturnPacket(packet);
947
948 m_dataPresentEvent.Set();
724 } 949 }
725 950
726 /// <summary> 951 /// <summary>
@@ -883,7 +1108,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
883 // Fire this out on a different thread so that we don't hold up outgoing packet processing for 1108 // Fire this out on a different thread so that we don't hold up outgoing packet processing for
884 // everybody else if this is being called due to an ack timeout. 1109 // everybody else if this is being called due to an ack timeout.
885 // This is the same as processing as the async process of a logout request. 1110 // This is the same as processing as the async process of a logout request.
886 Util.FireAndForget(o => DeactivateClientDueToTimeout(client)); 1111 Util.FireAndForget(o => DeactivateClientDueToTimeout(client, timeoutTicks));
887 1112
888 return; 1113 return;
889 } 1114 }
@@ -1002,6 +1227,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1002 outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; 1227 outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
1003 } 1228 }
1004 1229
1230 private void RecordMalformedInboundPacket(IPEndPoint endPoint)
1231 {
1232// if (m_malformedCount < 100)
1233// m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString());
1234
1235 IncomingMalformedPacketCount++;
1236
1237 if ((IncomingMalformedPacketCount % 10000) == 0)
1238 m_log.WarnFormat(
1239 "[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack. Last was from {1}",
1240 IncomingMalformedPacketCount, endPoint);
1241 }
1242
1005 public override void PacketReceived(UDPPacketBuffer buffer) 1243 public override void PacketReceived(UDPPacketBuffer buffer)
1006 { 1244 {
1007 // Debugging/Profiling 1245 // Debugging/Profiling
@@ -1023,6 +1261,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1023// "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}", 1261// "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}",
1024// buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); 1262// buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
1025 1263
1264 RecordMalformedInboundPacket(endPoint);
1265
1026 return; // Drop undersized packet 1266 return; // Drop undersized packet
1027 } 1267 }
1028 1268
@@ -1041,6 +1281,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1041// "[LLUDPSERVER]: Dropping packet with malformed header received from {0} in {1}", 1281// "[LLUDPSERVER]: Dropping packet with malformed header received from {0} in {1}",
1042// buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName); 1282// buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
1043 1283
1284 RecordMalformedInboundPacket(endPoint);
1285
1044 return; // Malformed header 1286 return; // Malformed header
1045 } 1287 }
1046 1288
@@ -1056,34 +1298,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1056 // Only allocate a buffer for zerodecoding if the packet is zerocoded 1298 // Only allocate a buffer for zerodecoding if the packet is zerocoded
1057 ((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null); 1299 ((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null);
1058 } 1300 }
1059 catch (MalformedDataException)
1060 {
1061 }
1062 catch (IndexOutOfRangeException)
1063 {
1064// m_log.WarnFormat(
1065// "[LLUDPSERVER]: Dropping short packet received from {0} in {1}",
1066// buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
1067
1068 return; // Drop short packet
1069 }
1070 catch (Exception e) 1301 catch (Exception e)
1071 { 1302 {
1072 if (m_malformedCount < 100) 1303 if (IncomingMalformedPacketCount < 100)
1073 m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString()); 1304 m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString());
1074
1075 m_malformedCount++;
1076
1077 if ((m_malformedCount % 100000) == 0)
1078 m_log.DebugFormat("[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack.", m_malformedCount);
1079 } 1305 }
1080 1306
1081 // Fail-safe check 1307 // Fail-safe check
1082 if (packet == null) 1308 if (packet == null)
1083 { 1309 {
1084 m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}:", 1310 if (IncomingMalformedPacketCount < 100)
1085 buffer.DataLength, buffer.RemoteEndPoint); 1311 {
1086 m_log.Error(Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); 1312 m_log.WarnFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}, data {2}:",
1313 buffer.DataLength, buffer.RemoteEndPoint, Utils.BytesToHexString(buffer.Data, buffer.DataLength, null));
1314 }
1315
1316 RecordMalformedInboundPacket(endPoint);
1317
1087 return; 1318 return;
1088 } 1319 }
1089 1320
@@ -1127,12 +1358,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1127 queue.Enqueue(buffer); 1358 queue.Enqueue(buffer);
1128 return; 1359 return;
1129 } 1360 }
1361 else if (packet.Type == PacketType.CompleteAgentMovement)
1362 {
1363 // Send ack straight away to let the viewer know that we got it.
1364 SendAckImmediate(endPoint, packet.Header.Sequence);
1365
1366 // We need to copy the endpoint so that it doesn't get changed when another thread reuses the
1367 // buffer.
1368 object[] array = new object[] { new IPEndPoint(endPoint.Address, endPoint.Port), packet };
1369
1370 Util.FireAndForget(HandleCompleteMovementIntoRegion, array);
1371
1372 return;
1373 }
1130 } 1374 }
1131 1375
1132 // Determine which agent this packet came from 1376 // Determine which agent this packet came from
1133 if (client == null || !(client is LLClientView)) 1377 if (client == null || !(client is LLClientView))
1134 { 1378 {
1135 //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); 1379 //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
1380
1381 IncomingOrphanedPacketCount++;
1382
1383 if ((IncomingOrphanedPacketCount % 10000) == 0)
1384 m_log.WarnFormat(
1385 "[LLUDPSERVER]: Received {0} orphaned packets so far. Last was from {1}",
1386 IncomingOrphanedPacketCount, endPoint);
1387
1136 return; 1388 return;
1137 } 1389 }
1138 1390
@@ -1233,6 +1485,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1233 LogPacketHeader(true, udpClient.CircuitCode, 0, packet.Type, (ushort)packet.Length); 1485 LogPacketHeader(true, udpClient.CircuitCode, 0, packet.Type, (ushort)packet.Length);
1234 #endregion BinaryStats 1486 #endregion BinaryStats
1235 1487
1488 if (packet.Type == PacketType.AgentUpdate)
1489 {
1490 if (m_discardAgentUpdates)
1491 return;
1492
1493 ((LLClientView)client).TotalAgentUpdates++;
1494
1495 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
1496
1497 LLClientView llClient = client as LLClientView;
1498 if (agentUpdate.AgentData.SessionID != client.SessionId
1499 || agentUpdate.AgentData.AgentID != client.AgentId
1500 || !(llClient == null || llClient.CheckAgentUpdateSignificance(agentUpdate.AgentData)) )
1501 {
1502 PacketPool.Instance.ReturnPacket(packet);
1503 return;
1504 }
1505 }
1506
1236 #region Ping Check Handling 1507 #region Ping Check Handling
1237 1508
1238 if (packet.Type == PacketType.StartPingCheck) 1509 if (packet.Type == PacketType.StartPingCheck)
@@ -1421,7 +1692,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1421 1692
1422 // We only want to send initial data to new clients, not ones which are being converted from child to root. 1693 // We only want to send initial data to new clients, not ones which are being converted from child to root.
1423 if (client != null) 1694 if (client != null)
1424 client.SceneAgent.SendInitialDataToMe(); 1695 {
1696 AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(uccp.CircuitCode.Code);
1697 bool tp = (aCircuit.teleportFlags > 0);
1698 // Let's delay this for TP agents, otherwise the viewer doesn't know where to get resources from
1699 if (!tp)
1700 client.SceneAgent.SendInitialDataToMe();
1701 }
1425 1702
1426 // Now we know we can handle more data 1703 // Now we know we can handle more data
1427 Thread.Sleep(200); 1704 Thread.Sleep(200);
@@ -1476,6 +1753,72 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1476 } 1753 }
1477 } 1754 }
1478 1755
1756 private void HandleCompleteMovementIntoRegion(object o)
1757 {
1758 IPEndPoint endPoint = null;
1759 IClientAPI client = null;
1760
1761 try
1762 {
1763 object[] array = (object[])o;
1764 endPoint = (IPEndPoint)array[0];
1765 CompleteAgentMovementPacket packet = (CompleteAgentMovementPacket)array[1];
1766
1767 // Determine which agent this packet came from
1768 int count = 20;
1769 bool ready = false;
1770 while (!ready && count-- > 0)
1771 {
1772 if (m_scene.TryGetClient(endPoint, out client) && client.IsActive && client.SceneAgent != null)
1773 {
1774 LLClientView llClientView = (LLClientView)client;
1775 LLUDPClient udpClient = llClientView.UDPClient;
1776 if (udpClient != null && udpClient.IsConnected)
1777 ready = true;
1778 else
1779 {
1780 m_log.Debug("[LLUDPSERVER]: Received a CompleteMovementIntoRegion in " + m_scene.RegionInfo.RegionName + " (not ready yet)");
1781 Thread.Sleep(200);
1782 }
1783 }
1784 else
1785 {
1786 m_log.Debug("[LLUDPSERVER]: Received a CompleteMovementIntoRegion in " + m_scene.RegionInfo.RegionName + " (not ready yet)");
1787 Thread.Sleep(200);
1788 }
1789 }
1790
1791 if (client == null)
1792 return;
1793
1794 IncomingPacket incomingPacket1;
1795
1796 // Inbox insertion
1797 if (UsePools)
1798 {
1799 incomingPacket1 = m_incomingPacketPool.GetObject();
1800 incomingPacket1.Client = (LLClientView)client;
1801 incomingPacket1.Packet = packet;
1802 }
1803 else
1804 {
1805 incomingPacket1 = new IncomingPacket((LLClientView)client, packet);
1806 }
1807
1808 packetInbox.Enqueue(incomingPacket1);
1809 }
1810 catch (Exception e)
1811 {
1812 m_log.ErrorFormat(
1813 "[LLUDPSERVER]: CompleteMovementIntoRegion handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}",
1814 endPoint != null ? endPoint.ToString() : "n/a",
1815 client != null ? client.Name : "unknown",
1816 client != null ? client.AgentId.ToString() : "unknown",
1817 e.Message,
1818 e.StackTrace);
1819 }
1820 }
1821
1479 /// <summary> 1822 /// <summary>
1480 /// Send an ack immediately to the given endpoint. 1823 /// Send an ack immediately to the given endpoint.
1481 /// </summary> 1824 /// </summary>
@@ -1544,6 +1887,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1544 1887
1545 client = new LLClientView(m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); 1888 client = new LLClientView(m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
1546 client.OnLogout += LogoutHandler; 1889 client.OnLogout += LogoutHandler;
1890 client.DebugPacketLevel = DefaultClientPacketDebugLevel;
1547 1891
1548 ((LLClientView)client).DisableFacelights = m_disableFacelights; 1892 ((LLClientView)client).DisableFacelights = m_disableFacelights;
1549 1893
@@ -1562,21 +1906,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1562 /// regular client pings. 1906 /// regular client pings.
1563 /// </remarks> 1907 /// </remarks>
1564 /// <param name='client'></param> 1908 /// <param name='client'></param>
1565 private void DeactivateClientDueToTimeout(LLClientView client) 1909 /// <param name='timeoutTicks'></param>
1910 private void DeactivateClientDueToTimeout(LLClientView client, int timeoutTicks)
1566 { 1911 {
1567 lock (client.CloseSyncLock) 1912 lock (client.CloseSyncLock)
1568 { 1913 {
1914 ClientLogoutsDueToNoReceives++;
1915
1569 m_log.WarnFormat( 1916 m_log.WarnFormat(
1570 "[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}", 1917 "[LLUDPSERVER]: No packets received from {0} agent of {1} for {2}ms in {3}. Disconnecting.",
1571 client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName); 1918 client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, timeoutTicks, m_scene.Name);
1572
1573 StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
1574 1919
1575 if (!client.SceneAgent.IsChildAgent) 1920 if (!client.SceneAgent.IsChildAgent)
1576 client.Kick("Simulator logged you out due to connection timeout"); 1921 client.Kick("Simulator logged you out due to connection timeout.");
1577
1578 client.CloseWithoutChecks(true);
1579 } 1922 }
1923
1924 m_scene.IncomingCloseAgent(client.AgentId, true);
1580 } 1925 }
1581 1926
1582 private void IncomingPacketHandler() 1927 private void IncomingPacketHandler()
@@ -1592,6 +1937,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1592 { 1937 {
1593 IncomingPacket incomingPacket = null; 1938 IncomingPacket incomingPacket = null;
1594 1939
1940 /*
1595 // HACK: This is a test to try and rate limit packet handling on Mono. 1941 // HACK: This is a test to try and rate limit packet handling on Mono.
1596 // If it works, a more elegant solution can be devised 1942 // If it works, a more elegant solution can be devised
1597 if (Util.FireAndForgetCount() < 2) 1943 if (Util.FireAndForgetCount() < 2)
@@ -1599,6 +1945,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1599 //m_log.Debug("[LLUDPSERVER]: Incoming packet handler is sleeping"); 1945 //m_log.Debug("[LLUDPSERVER]: Incoming packet handler is sleeping");
1600 Thread.Sleep(30); 1946 Thread.Sleep(30);
1601 } 1947 }
1948 */
1602 1949
1603 if (packetInbox.Dequeue(100, ref incomingPacket)) 1950 if (packetInbox.Dequeue(100, ref incomingPacket))
1604 { 1951 {
@@ -1694,8 +2041,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1694 2041
1695 // If nothing was sent, sleep for the minimum amount of time before a 2042 // If nothing was sent, sleep for the minimum amount of time before a
1696 // token bucket could get more tokens 2043 // token bucket could get more tokens
2044 //if (!m_packetSent)
2045 // Thread.Sleep((int)TickCountResolution);
2046 //
2047 // Instead, now wait for data present to be explicitly signalled. Evidence so far is that with
2048 // modern mono it reduces CPU base load since there is no more continuous polling.
1697 if (!m_packetSent) 2049 if (!m_packetSent)
1698 Thread.Sleep((int)TickCountResolution); 2050 m_dataPresentEvent.WaitOne(100);
1699 2051
1700 Watchdog.UpdateThread(); 2052 Watchdog.UpdateThread();
1701 } 2053 }
@@ -1912,7 +2264,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1912 if (!client.IsLoggingOut) 2264 if (!client.IsLoggingOut)
1913 { 2265 {
1914 client.IsLoggingOut = true; 2266 client.IsLoggingOut = true;
1915 client.Close(false, false); 2267 m_scene.IncomingCloseAgent(client.AgentId, false);
1916 } 2268 }
1917 } 2269 }
1918 } 2270 }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
index 7035e38..48c5b37 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
@@ -78,6 +78,36 @@ namespace OpenMetaverse
78 public bool IsRunningOutbound { get; private set; } 78 public bool IsRunningOutbound { get; private set; }
79 79
80 /// <summary> 80 /// <summary>
81 /// Number of UDP receives.
82 /// </summary>
83 public int UdpReceives { get; private set; }
84
85 /// <summary>
86 /// Number of UDP sends
87 /// </summary>
88 public int UdpSends { get; private set; }
89
90 /// <summary>
91 /// Number of receives over which to establish a receive time average.
92 /// </summary>
93 private readonly static int s_receiveTimeSamples = 500;
94
95 /// <summary>
96 /// Current number of samples taken to establish a receive time average.
97 /// </summary>
98 private int m_currentReceiveTimeSamples;
99
100 /// <summary>
101 /// Cumulative receive time for the sample so far.
102 /// </summary>
103 private int m_receiveTicksInCurrentSamplePeriod;
104
105 /// <summary>
106 /// The average time taken for each require receive in the last sample.
107 /// </summary>
108 public float AverageReceiveTicksForLastSamplePeriod { get; private set; }
109
110 /// <summary>
81 /// Default constructor 111 /// Default constructor
82 /// </summary> 112 /// </summary>
83 /// <param name="bindAddress">Local IP address to bind the server to</param> 113 /// <param name="bindAddress">Local IP address to bind the server to</param>
@@ -111,6 +141,8 @@ namespace OpenMetaverse
111 141
112 if (!IsRunningInbound) 142 if (!IsRunningInbound)
113 { 143 {
144 m_log.DebugFormat("[UDPBASE]: Starting inbound UDP loop");
145
114 const int SIO_UDP_CONNRESET = -1744830452; 146 const int SIO_UDP_CONNRESET = -1744830452;
115 147
116 IPEndPoint ipep = new IPEndPoint(m_localBindAddress, m_udpPort); 148 IPEndPoint ipep = new IPEndPoint(m_localBindAddress, m_udpPort);
@@ -151,6 +183,8 @@ namespace OpenMetaverse
151 /// </summary> 183 /// </summary>
152 public void StartOutbound() 184 public void StartOutbound()
153 { 185 {
186 m_log.DebugFormat("[UDPBASE]: Starting outbound UDP loop");
187
154 IsRunningOutbound = true; 188 IsRunningOutbound = true;
155 } 189 }
156 190
@@ -158,10 +192,8 @@ namespace OpenMetaverse
158 { 192 {
159 if (IsRunningInbound) 193 if (IsRunningInbound)
160 { 194 {
161 // wait indefinitely for a writer lock. Once this is called, the .NET runtime 195 m_log.DebugFormat("[UDPBASE]: Stopping inbound UDP loop");
162 // will deny any more reader locks, in effect blocking all other send/receive 196
163 // threads. Once we have the lock, we set IsRunningInbound = false to inform the other
164 // threads that the socket is closed.
165 IsRunningInbound = false; 197 IsRunningInbound = false;
166 m_udpSocket.Close(); 198 m_udpSocket.Close();
167 } 199 }
@@ -169,6 +201,8 @@ namespace OpenMetaverse
169 201
170 public void StopOutbound() 202 public void StopOutbound()
171 { 203 {
204 m_log.DebugFormat("[UDPBASE]: Stopping outbound UDP loop");
205
172 IsRunningOutbound = false; 206 IsRunningOutbound = false;
173 } 207 }
174 208
@@ -267,6 +301,8 @@ namespace OpenMetaverse
267 // to AsyncBeginReceive 301 // to AsyncBeginReceive
268 if (IsRunningInbound) 302 if (IsRunningInbound)
269 { 303 {
304 UdpReceives++;
305
270 // Asynchronous mode will start another receive before the 306 // Asynchronous mode will start another receive before the
271 // callback for this packet is even fired. Very parallel :-) 307 // callback for this packet is even fired. Very parallel :-)
272 if (m_asyncPacketHandling) 308 if (m_asyncPacketHandling)
@@ -278,6 +314,8 @@ namespace OpenMetaverse
278 314
279 try 315 try
280 { 316 {
317 int startTick = Util.EnvironmentTickCount();
318
281 // get the length of data actually read from the socket, store it with the 319 // get the length of data actually read from the socket, store it with the
282 // buffer 320 // buffer
283 buffer.DataLength = m_udpSocket.EndReceiveFrom(iar, ref buffer.RemoteEndPoint); 321 buffer.DataLength = m_udpSocket.EndReceiveFrom(iar, ref buffer.RemoteEndPoint);
@@ -285,6 +323,23 @@ namespace OpenMetaverse
285 // call the abstract method PacketReceived(), passing the buffer that 323 // call the abstract method PacketReceived(), passing the buffer that
286 // has just been filled from the socket read. 324 // has just been filled from the socket read.
287 PacketReceived(buffer); 325 PacketReceived(buffer);
326
327 // If more than one thread can be calling AsyncEndReceive() at once (e.g. if m_asyncPacketHandler)
328 // then a particular stat may be inaccurate due to a race condition. We won't worry about this
329 // since this should be rare and won't cause a runtime problem.
330 if (m_currentReceiveTimeSamples >= s_receiveTimeSamples)
331 {
332 AverageReceiveTicksForLastSamplePeriod
333 = (float)m_receiveTicksInCurrentSamplePeriod / s_receiveTimeSamples;
334
335 m_receiveTicksInCurrentSamplePeriod = 0;
336 m_currentReceiveTimeSamples = 0;
337 }
338 else
339 {
340 m_receiveTicksInCurrentSamplePeriod += Util.EnvironmentTickCountSubtract(startTick);
341 m_currentReceiveTimeSamples++;
342 }
288 } 343 }
289 catch (SocketException) { } 344 catch (SocketException) { }
290 catch (ObjectDisposedException) { } 345 catch (ObjectDisposedException) { }
@@ -298,14 +353,13 @@ namespace OpenMetaverse
298 if (!m_asyncPacketHandling) 353 if (!m_asyncPacketHandling)
299 AsyncBeginReceive(); 354 AsyncBeginReceive();
300 } 355 }
301
302 } 356 }
303 } 357 }
304 358
305 public void AsyncBeginSend(UDPPacketBuffer buf) 359 public void AsyncBeginSend(UDPPacketBuffer buf)
306 { 360 {
307 if (IsRunningOutbound) 361// if (IsRunningOutbound)
308 { 362// {
309 try 363 try
310 { 364 {
311 m_udpSocket.BeginSendTo( 365 m_udpSocket.BeginSendTo(
@@ -319,7 +373,7 @@ namespace OpenMetaverse
319 } 373 }
320 catch (SocketException) { } 374 catch (SocketException) { }
321 catch (ObjectDisposedException) { } 375 catch (ObjectDisposedException) { }
322 } 376// }
323 } 377 }
324 378
325 void AsyncEndSend(IAsyncResult result) 379 void AsyncEndSend(IAsyncResult result)
@@ -328,6 +382,8 @@ namespace OpenMetaverse
328 { 382 {
329// UDPPacketBuffer buf = (UDPPacketBuffer)result.AsyncState; 383// UDPPacketBuffer buf = (UDPPacketBuffer)result.AsyncState;
330 m_udpSocket.EndSendTo(result); 384 m_udpSocket.EndSendTo(result);
385
386 UdpSends++;
331 } 387 }
332 catch (SocketException) { } 388 catch (SocketException) { }
333 catch (ObjectDisposedException) { } 389 catch (ObjectDisposedException) { }
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
index 1fdc410..5a2bcee 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
@@ -145,39 +145,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP
145 return packet; 145 return packet;
146 } 146 }
147 147
148 // private byte[] decoded_header = new byte[10];
149 private static PacketType GetType(byte[] bytes) 148 private static PacketType GetType(byte[] bytes)
150 { 149 {
151 byte[] decoded_header = new byte[10 + 8];
152 ushort id; 150 ushort id;
153 PacketFrequency freq; 151 PacketFrequency freq;
152 bool isZeroCoded = (bytes[0] & Helpers.MSG_ZEROCODED) != 0;
154 153
155 if ((bytes[0] & Helpers.MSG_ZEROCODED) != 0) 154 if (bytes[6] == 0xFF)
156 { 155 {
157 Helpers.ZeroDecode(bytes, 16, decoded_header); 156 if (bytes[7] == 0xFF)
158 }
159 else
160 {
161 Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10);
162 }
163
164 if (decoded_header[6] == 0xFF)
165 {
166 if (decoded_header[7] == 0xFF)
167 { 157 {
168 id = (ushort) ((decoded_header[8] << 8) + decoded_header[9]);
169 freq = PacketFrequency.Low; 158 freq = PacketFrequency.Low;
159 if (isZeroCoded && bytes[8] == 0)
160 id = bytes[10];
161 else
162 id = (ushort)((bytes[8] << 8) + bytes[9]);
170 } 163 }
171 else 164 else
172 { 165 {
173 id = decoded_header[7];
174 freq = PacketFrequency.Medium; 166 freq = PacketFrequency.Medium;
167 id = bytes[7];
175 } 168 }
176 } 169 }
177 else 170 else
178 { 171 {
179 id = decoded_header[6];
180 freq = PacketFrequency.High; 172 freq = PacketFrequency.High;
173 id = bytes[6];
181 } 174 }
182 175
183 return Packet.GetType(id, freq); 176 return Packet.GetType(id, freq);
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs
index 556df30..9700224 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/BasicCircuitTests.cs
@@ -33,6 +33,7 @@ using NUnit.Framework;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenMetaverse.Packets; 34using OpenMetaverse.Packets;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Monitoring;
36using OpenSim.Region.Framework.Scenes; 37using OpenSim.Region.Framework.Scenes;
37using OpenSim.Tests.Common; 38using OpenSim.Tests.Common;
38using OpenSim.Tests.Common.Mock; 39using OpenSim.Tests.Common.Mock;
@@ -69,6 +70,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
69 { 70 {
70 base.SetUp(); 71 base.SetUp();
71 m_scene = new SceneHelpers().SetupScene(); 72 m_scene = new SceneHelpers().SetupScene();
73 StatsManager.SimExtraStats = new SimExtraStatsCollector();
72 } 74 }
73 75
74 /// <summary> 76 /// <summary>
@@ -198,7 +200,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
198 public void TestLogoutClientDueToAck() 200 public void TestLogoutClientDueToAck()
199 { 201 {
200 TestHelpers.InMethod(); 202 TestHelpers.InMethod();
201// TestHelpers.EnableLogging(); 203 TestHelpers.EnableLogging();
202 204
203 IniConfigSource ics = new IniConfigSource(); 205 IniConfigSource ics = new IniConfigSource();
204 IConfig config = ics.AddConfig("ClientStack.LindenUDP"); 206 IConfig config = ics.AddConfig("ClientStack.LindenUDP");
@@ -210,8 +212,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
210 212
211 ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID); 213 ScenePresence spAfterAckTimeout = m_scene.GetScenePresence(sp.UUID);
212 Assert.That(spAfterAckTimeout, Is.Null); 214 Assert.That(spAfterAckTimeout, Is.Null);
213
214// TestHelpers.DisableLogging();
215 } 215 }
216 216
217// /// <summary> 217// /// <summary>
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
index 7d9f581..575e54c 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
@@ -29,6 +29,7 @@ using System;
29using System.IO; 29using System.IO;
30using System.Net; 30using System.Net;
31using System.Reflection; 31using System.Reflection;
32using System.Threading;
32using log4net.Config; 33using log4net.Config;
33using Nini.Config; 34using Nini.Config;
34using NUnit.Framework; 35using NUnit.Framework;
@@ -53,6 +54,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
53 [TestFixtureSetUp] 54 [TestFixtureSetUp]
54 public void FixtureInit() 55 public void FixtureInit()
55 { 56 {
57 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
58 Util.FireAndForgetMethod = FireAndForgetMethod.None;
59
56 using ( 60 using (
57 Stream resource 61 Stream resource
58 = GetType().Assembly.GetManifestResourceStream( 62 = GetType().Assembly.GetManifestResourceStream(
@@ -72,9 +76,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
72 } 76 }
73 } 77 }
74 78
79 [TestFixtureTearDown]
80 public void TearDown()
81 {
82 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
83 // threads. Possibly, later tests should be rewritten not to worry about such things.
84 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
85 }
86
75 [SetUp] 87 [SetUp]
76 public void SetUp() 88 public override void SetUp()
77 { 89 {
90 base.SetUp();
91
78 UUID userId = TestHelpers.ParseTail(0x3); 92 UUID userId = TestHelpers.ParseTail(0x3);
79 93
80 J2KDecoderModule j2kdm = new J2KDecoderModule(); 94 J2KDecoderModule j2kdm = new J2KDecoderModule();
diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
index 3764685..d9b0eff 100644
--- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
@@ -166,7 +166,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
166 166
167 // Do Decode! 167 // Do Decode!
168 if (decode) 168 if (decode)
169 Decode(assetID, j2kData); 169 Util.FireAndForget(delegate { Decode(assetID, j2kData); });
170 } 170 }
171 } 171 }
172 172
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 6495f3f..95cc6b7 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -29,6 +29,7 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31using System.IO; 31using System.IO;
32using System.Threading;
32using System.Xml; 33using System.Xml;
33using log4net; 34using log4net;
34using Mono.Addins; 35using Mono.Addins;
@@ -51,6 +52,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 53
53 public int DebugLevel { get; set; } 54 public int DebugLevel { get; set; }
55
56 /// <summary>
57 /// Period to sleep per 100 prims in order to avoid CPU spikes when an avatar with many attachments logs in/changes
58 /// outfit or many avatars with a medium levels of attachments login/change outfit simultaneously.
59 /// </summary>
60 /// <remarks>
61 /// A value of 0 will apply no pause. The pause is specified in milliseconds.
62 /// </remarks>
63 public int ThrottlePer100PrimsRezzed { get; set; }
54 64
55 private Scene m_scene; 65 private Scene m_scene;
56 private IInventoryAccessModule m_invAccessModule; 66 private IInventoryAccessModule m_invAccessModule;
@@ -67,18 +77,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
67 { 77 {
68 IConfig config = source.Configs["Attachments"]; 78 IConfig config = source.Configs["Attachments"];
69 if (config != null) 79 if (config != null)
80 {
70 Enabled = config.GetBoolean("Enabled", true); 81 Enabled = config.GetBoolean("Enabled", true);
82
83 ThrottlePer100PrimsRezzed = config.GetInt("ThrottlePer100PrimsRezzed", 0);
84 }
71 else 85 else
86 {
72 Enabled = true; 87 Enabled = true;
88 }
73 } 89 }
74 90
75 public void AddRegion(Scene scene) 91 public void AddRegion(Scene scene)
76 { 92 {
77 m_scene = scene; 93 m_scene = scene;
78 m_scene.RegisterModuleInterface<IAttachmentsModule>(this);
79
80 if (Enabled) 94 if (Enabled)
81 { 95 {
96 // Only register module with scene if it is enabled. All callers check for a null attachments module.
97 // Ideally, there should be a null attachments module for when this core attachments module has been
98 // disabled. Registering only when enabled allows for other attachments module implementations.
99 m_scene.RegisterModuleInterface<IAttachmentsModule>(this);
82 m_scene.EventManager.OnNewClient += SubscribeToClientEvents; 100 m_scene.EventManager.OnNewClient += SubscribeToClientEvents;
83 m_scene.EventManager.OnStartScript += (localID, itemID) => HandleScriptStateChange(localID, true); 101 m_scene.EventManager.OnStartScript += (localID, itemID) => HandleScriptStateChange(localID, true);
84 m_scene.EventManager.OnStopScript += (localID, itemID) => HandleScriptStateChange(localID, false); 102 m_scene.EventManager.OnStopScript += (localID, itemID) => HandleScriptStateChange(localID, false);
@@ -86,24 +104,43 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
86 MainConsole.Instance.Commands.AddCommand( 104 MainConsole.Instance.Commands.AddCommand(
87 "Debug", 105 "Debug",
88 false, 106 false,
89 "debug attachments", 107 "debug attachments log",
90 "debug attachments [0|1]", 108 "debug attachments log [0|1]",
91 "Turn on attachments debugging\n" 109 "Turn on attachments debug logging",
92 + " <= 0 - turns off debugging\n" 110 " <= 0 - turns off debug logging\n"
93 + " >= 1 - turns on attachment message logging\n", 111 + " >= 1 - turns on attachment message debug logging",
94 HandleDebugAttachments); 112 HandleDebugAttachmentsLog);
113
114 MainConsole.Instance.Commands.AddCommand(
115 "Debug",
116 false,
117 "debug attachments throttle",
118 "debug attachments throttle <ms>",
119 "Turn on attachments throttling.",
120 "This requires a millisecond value. " +
121 " == 0 - disable throttling.\n"
122 + " > 0 - sleeps for this number of milliseconds per 100 prims rezzed.",
123 HandleDebugAttachmentsThrottle);
124
125 MainConsole.Instance.Commands.AddCommand(
126 "Debug",
127 false,
128 "debug attachments status",
129 "debug attachments status",
130 "Show current attachments debug status",
131 HandleDebugAttachmentsStatus);
95 } 132 }
96 133
97 // TODO: Should probably be subscribing to CloseClient too, but this doesn't yet give us IClientAPI 134 // TODO: Should probably be subscribing to CloseClient too, but this doesn't yet give us IClientAPI
98 } 135 }
99 136
100 private void HandleDebugAttachments(string module, string[] args) 137 private void HandleDebugAttachmentsLog(string module, string[] args)
101 { 138 {
102 int debugLevel; 139 int debugLevel;
103 140
104 if (!(args.Length == 3 && int.TryParse(args[2], out debugLevel))) 141 if (!(args.Length == 4 && int.TryParse(args[3], out debugLevel)))
105 { 142 {
106 MainConsole.Instance.OutputFormat("Usage: debug attachments [0|1]"); 143 MainConsole.Instance.OutputFormat("Usage: debug attachments log [0|1]");
107 } 144 }
108 else 145 else
109 { 146 {
@@ -113,6 +150,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
113 } 150 }
114 } 151 }
115 152
153 private void HandleDebugAttachmentsThrottle(string module, string[] args)
154 {
155 int ms;
156
157 if (args.Length == 4 && int.TryParse(args[3], out ms))
158 {
159 ThrottlePer100PrimsRezzed = ms;
160 MainConsole.Instance.OutputFormat(
161 "Attachments rez throttle per 100 prims is now {0} in {1}", ThrottlePer100PrimsRezzed, m_scene.Name);
162
163 return;
164 }
165
166 MainConsole.Instance.OutputFormat("Usage: debug attachments throttle <ms>");
167 }
168
169 private void HandleDebugAttachmentsStatus(string module, string[] args)
170 {
171 MainConsole.Instance.OutputFormat("Settings for {0}", m_scene.Name);
172 MainConsole.Instance.OutputFormat("Debug logging level: {0}", DebugLevel);
173 MainConsole.Instance.OutputFormat("Throttle per 100 prims: {0}ms", ThrottlePer100PrimsRezzed);
174 }
175
116 /// <summary> 176 /// <summary>
117 /// Listen for client triggered running state changes so that we can persist the script's object if necessary. 177 /// Listen for client triggered running state changes so that we can persist the script's object if necessary.
118 /// </summary> 178 /// </summary>
@@ -273,7 +333,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
273 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments(); 333 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments();
274 foreach (AvatarAttachment attach in attachments) 334 foreach (AvatarAttachment attach in attachments)
275 { 335 {
276 uint p = (uint)attach.AttachPoint; 336 uint attachmentPt = (uint)attach.AttachPoint;
277 337
278// m_log.DebugFormat( 338// m_log.DebugFormat(
279// "[ATTACHMENTS MODULE]: Doing initial rez of attachment with itemID {0}, assetID {1}, point {2} for {3} in {4}", 339// "[ATTACHMENTS MODULE]: Doing initial rez of attachment with itemID {0}, assetID {1}, point {2} for {3} in {4}",
@@ -302,13 +362,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
302 // If we're an NPC then skip all the item checks and manipulations since we don't have an 362 // If we're an NPC then skip all the item checks and manipulations since we don't have an
303 // inventory right now. 363 // inventory right now.
304 RezSingleAttachmentFromInventoryInternal( 364 RezSingleAttachmentFromInventoryInternal(
305 sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, p, true, d); 365 sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true, d);
306 } 366 }
307 catch (Exception e) 367 catch (Exception e)
308 { 368 {
309 UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId; 369 UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId;
310 m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}", 370 m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}",
311 attach.ItemID, attach.AssetID, p, agentId, e.Message, e.StackTrace); 371 attach.ItemID, attach.AssetID, attachmentPt, agentId, e.Message, e.StackTrace);
312 } 372 }
313 } 373 }
314 } 374 }
@@ -841,7 +901,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
841 m_scene.ForEachClient( 901 m_scene.ForEachClient(
842 client => 902 client =>
843 { if (client.AgentId != so.AttachedAvatar) 903 { if (client.AgentId != so.AttachedAvatar)
844 client.SendKillObject(m_scene.RegionInfo.RegionHandle, new List<uint>() { so.LocalId }); 904 client.SendKillObject(new List<uint>() { so.LocalId });
845 }); 905 });
846 } 906 }
847 907
@@ -982,8 +1042,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
982 1042
983 if (DebugLevel > 0) 1043 if (DebugLevel > 0)
984 m_log.DebugFormat( 1044 m_log.DebugFormat(
985 "[ATTACHMENTS MODULE]: Rezzed single object {0} for attachment to {1} on point {2} in {3}", 1045 "[ATTACHMENTS MODULE]: Rezzed single object {0} with {1} prims for attachment to {2} on point {3} in {4}",
986 objatt.Name, sp.Name, attachmentPt, m_scene.Name); 1046 objatt.Name, objatt.PrimCount, sp.Name, attachmentPt, m_scene.Name);
987 1047
988 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller. 1048 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
989 objatt.HasGroupChanged = false; 1049 objatt.HasGroupChanged = false;
@@ -1020,7 +1080,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1020 } 1080 }
1021 1081
1022 if (tainted) 1082 if (tainted)
1023 objatt.HasGroupChanged = true; 1083 objatt.HasGroupChanged = true;
1084
1085 if (ThrottlePer100PrimsRezzed > 0)
1086 {
1087 int throttleMs = (int)Math.Round((float)objatt.PrimCount / 100 * ThrottlePer100PrimsRezzed);
1088
1089 if (DebugLevel > 0)
1090 m_log.DebugFormat(
1091 "[ATTACHMENTS MODULE]: Throttling by {0}ms after rez of {1} with {2} prims for attachment to {3} on point {4} in {5}",
1092 throttleMs, objatt.Name, objatt.PrimCount, sp.Name, attachmentPt, m_scene.Name);
1093
1094 Thread.Sleep(throttleMs);
1095 }
1024 1096
1025 return objatt; 1097 return objatt;
1026 } 1098 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 1a38619..62acd78 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -38,6 +38,8 @@ using NUnit.Framework;
38using OpenMetaverse; 38using OpenMetaverse;
39using OpenSim.Framework; 39using OpenSim.Framework;
40using OpenSim.Framework.Communications; 40using OpenSim.Framework.Communications;
41using OpenSim.Framework.Servers;
42using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Region.CoreModules.Avatar.Attachments; 43using OpenSim.Region.CoreModules.Avatar.Attachments;
42using OpenSim.Region.CoreModules.Framework; 44using OpenSim.Region.CoreModules.Framework;
43using OpenSim.Region.CoreModules.Framework.EntityTransfer; 45using OpenSim.Region.CoreModules.Framework.EntityTransfer;
@@ -797,11 +799,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
797 } 799 }
798 800
799 [Test] 801 [Test]
800 public void TestSameSimulatorNeighbouringRegionsTeleport() 802 public void TestSameSimulatorNeighbouringRegionsTeleportV1()
801 { 803 {
802 TestHelpers.InMethod(); 804 TestHelpers.InMethod();
803// TestHelpers.EnableLogging(); 805// TestHelpers.EnableLogging();
804 806
807 BaseHttpServer httpServer = new BaseHttpServer(99999);
808 MainServer.AddHttpServer(httpServer);
809 MainServer.Instance = httpServer;
810
805 AttachmentsModule attModA = new AttachmentsModule(); 811 AttachmentsModule attModA = new AttachmentsModule();
806 AttachmentsModule attModB = new AttachmentsModule(); 812 AttachmentsModule attModB = new AttachmentsModule();
807 EntityTransferModule etmA = new EntityTransferModule(); 813 EntityTransferModule etmA = new EntityTransferModule();
@@ -830,14 +836,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
830 SceneHelpers.SetupSceneModules( 836 SceneHelpers.SetupSceneModules(
831 sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); 837 sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule());
832 838
839 // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
840 lscm.ServiceVersion = "SIMULATION/0.1";
841
833 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); 842 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1);
834 843
835 AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID); 844 AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID);
836 TestClient tc = new TestClient(acd, sceneA, sh.SceneManager); 845 TestClient tc = new TestClient(acd, sceneA);
837 List<TestClient> destinationTestClients = new List<TestClient>(); 846 List<TestClient> destinationTestClients = new List<TestClient>();
838 EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); 847 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
839 848
840 ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager); 849 ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
841 beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32); 850 beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32);
842 851
843 InventoryItemBase attItem = CreateAttachmentItem(sceneA, ua1.PrincipalID, "att", 0x10, 0x20); 852 InventoryItemBase attItem = CreateAttachmentItem(sceneA, ua1.PrincipalID, "att", 0x10, 0x20);
@@ -895,5 +904,115 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
895 // Check events 904 // Check events
896 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); 905 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
897 } 906 }
907
908 [Test]
909 public void TestSameSimulatorNeighbouringRegionsTeleportV2()
910 {
911 TestHelpers.InMethod();
912// TestHelpers.EnableLogging();
913
914 BaseHttpServer httpServer = new BaseHttpServer(99999);
915 MainServer.AddHttpServer(httpServer);
916 MainServer.Instance = httpServer;
917
918 AttachmentsModule attModA = new AttachmentsModule();
919 AttachmentsModule attModB = new AttachmentsModule();
920 EntityTransferModule etmA = new EntityTransferModule();
921 EntityTransferModule etmB = new EntityTransferModule();
922 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
923
924 IConfigSource config = new IniConfigSource();
925 IConfig modulesConfig = config.AddConfig("Modules");
926 modulesConfig.Set("EntityTransferModule", etmA.Name);
927 modulesConfig.Set("SimulationServices", lscm.Name);
928
929 modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule");
930
931 SceneHelpers sh = new SceneHelpers();
932 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
933 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000);
934
935 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
936 SceneHelpers.SetupSceneModules(
937 sceneA, config, new CapabilitiesModule(), etmA, attModA, new BasicInventoryAccessModule());
938 SceneHelpers.SetupSceneModules(
939 sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule());
940
941 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1);
942
943 AgentCircuitData acd = SceneHelpers.GenerateAgentData(ua1.PrincipalID);
944 TestClient tc = new TestClient(acd, sceneA);
945 List<TestClient> destinationTestClients = new List<TestClient>();
946 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
947
948 ScenePresence beforeTeleportSp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
949 beforeTeleportSp.AbsolutePosition = new Vector3(30, 31, 32);
950
951 Assert.That(destinationTestClients.Count, Is.EqualTo(1));
952 Assert.That(destinationTestClients[0], Is.Not.Null);
953
954 InventoryItemBase attItem = CreateAttachmentItem(sceneA, ua1.PrincipalID, "att", 0x10, 0x20);
955
956 sceneA.AttachmentsModule.RezSingleAttachmentFromInventory(
957 beforeTeleportSp, attItem.ID, (uint)AttachmentPoint.Chest);
958
959 Vector3 teleportPosition = new Vector3(10, 11, 12);
960 Vector3 teleportLookAt = new Vector3(20, 21, 22);
961
962 // Here, we need to make clientA's receipt of SendRegionTeleport trigger clientB's CompleteMovement(). This
963 // is to operate the teleport V2 mechanism where the EntityTransferModule will first request the client to
964 // CompleteMovement to the region and then call UpdateAgent to the destination region to confirm the receipt
965 // Both these operations will occur on different threads and will wait for each other.
966 // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1
967 // test protocol, where we are trying to avoid unpredictable async operations in regression tests.
968 tc.OnTestClientSendRegionTeleport
969 += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL)
970 => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null);
971
972 m_numberOfAttachEventsFired = 0;
973 sceneA.RequestTeleportLocation(
974 beforeTeleportSp.ControllingClient,
975 sceneB.RegionInfo.RegionHandle,
976 teleportPosition,
977 teleportLookAt,
978 (uint)TeleportFlags.ViaLocation);
979
980 // Check attachments have made it into sceneB
981 ScenePresence afterTeleportSceneBSp = sceneB.GetScenePresence(ua1.PrincipalID);
982
983 // This is appearance data, as opposed to actually rezzed attachments
984 List<AvatarAttachment> sceneBAttachments = afterTeleportSceneBSp.Appearance.GetAttachments();
985 Assert.That(sceneBAttachments.Count, Is.EqualTo(1));
986 Assert.That(sceneBAttachments[0].AttachPoint, Is.EqualTo((int)AttachmentPoint.Chest));
987 Assert.That(sceneBAttachments[0].ItemID, Is.EqualTo(attItem.ID));
988 Assert.That(sceneBAttachments[0].AssetID, Is.EqualTo(attItem.AssetID));
989 Assert.That(afterTeleportSceneBSp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest));
990
991 // This is the actual attachment
992 List<SceneObjectGroup> actualSceneBAttachments = afterTeleportSceneBSp.GetAttachments();
993 Assert.That(actualSceneBAttachments.Count, Is.EqualTo(1));
994 SceneObjectGroup actualSceneBAtt = actualSceneBAttachments[0];
995 Assert.That(actualSceneBAtt.Name, Is.EqualTo(attItem.Name));
996 Assert.That(actualSceneBAtt.AttachmentPoint, Is.EqualTo((uint)AttachmentPoint.Chest));
997
998 Assert.That(sceneB.GetSceneObjectGroups().Count, Is.EqualTo(1));
999
1000 // Check attachments have been removed from sceneA
1001 ScenePresence afterTeleportSceneASp = sceneA.GetScenePresence(ua1.PrincipalID);
1002
1003 // Since this is appearance data, it is still present on the child avatar!
1004 List<AvatarAttachment> sceneAAttachments = afterTeleportSceneASp.Appearance.GetAttachments();
1005 Assert.That(sceneAAttachments.Count, Is.EqualTo(1));
1006 Assert.That(afterTeleportSceneASp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest));
1007
1008 // This is the actual attachment, which should no longer exist
1009 List<SceneObjectGroup> actualSceneAAttachments = afterTeleportSceneASp.GetAttachments();
1010 Assert.That(actualSceneAAttachments.Count, Is.EqualTo(0));
1011
1012 Assert.That(sceneA.GetSceneObjectGroups().Count, Is.EqualTo(0));
1013
1014 // Check events
1015 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
1016 }
898 } 1017 }
899} 1018}
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index bc79944..09cc998 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -55,6 +55,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
55 55
56 private int m_savetime = 5; // seconds to wait before saving changed appearance 56 private int m_savetime = 5; // seconds to wait before saving changed appearance
57 private int m_sendtime = 2; // seconds to wait before sending changed appearance 57 private int m_sendtime = 2; // seconds to wait before sending changed appearance
58 private bool m_reusetextures = false;
58 59
59 private int m_checkTime = 500; // milliseconds to wait between checks for appearance updates 60 private int m_checkTime = 500; // milliseconds to wait between checks for appearance updates
60 private System.Timers.Timer m_updateTimer = new System.Timers.Timer(); 61 private System.Timers.Timer m_updateTimer = new System.Timers.Timer();
@@ -73,6 +74,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
73 { 74 {
74 m_savetime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime))); 75 m_savetime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime)));
75 m_sendtime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime))); 76 m_sendtime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime)));
77 m_reusetextures = appearanceConfig.GetBoolean("ReuseTextures",m_reusetextures);
78
76 // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime); 79 // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime);
77 } 80 }
78 81
@@ -131,6 +134,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
131 client.OnRequestWearables += Client_OnRequestWearables; 134 client.OnRequestWearables += Client_OnRequestWearables;
132 client.OnSetAppearance += Client_OnSetAppearance; 135 client.OnSetAppearance += Client_OnSetAppearance;
133 client.OnAvatarNowWearing += Client_OnAvatarNowWearing; 136 client.OnAvatarNowWearing += Client_OnAvatarNowWearing;
137 client.OnCachedTextureRequest += Client_OnCachedTextureRequest;
134 } 138 }
135 139
136 #endregion 140 #endregion
@@ -1068,6 +1072,61 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
1068 QueueAppearanceSave(client.AgentId); 1072 QueueAppearanceSave(client.AgentId);
1069 } 1073 }
1070 } 1074 }
1075
1076 /// <summary>
1077 /// Respond to the cached textures request from the client
1078 /// </summary>
1079 /// <param name="client"></param>
1080 /// <param name="serial"></param>
1081 /// <param name="cachedTextureRequest"></param>
1082 private void Client_OnCachedTextureRequest(IClientAPI client, int serial, List<CachedTextureRequestArg> cachedTextureRequest)
1083 {
1084 // m_log.WarnFormat("[AVFACTORY]: Client_OnCachedTextureRequest called for {0} ({1})", client.Name, client.AgentId);
1085 ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
1086
1087 List<CachedTextureResponseArg> cachedTextureResponse = new List<CachedTextureResponseArg>();
1088 foreach (CachedTextureRequestArg request in cachedTextureRequest)
1089 {
1090 UUID texture = UUID.Zero;
1091 int index = request.BakedTextureIndex;
1092
1093 if (m_reusetextures)
1094 {
1095 // this is the most insanely dumb way to do this... however it seems to
1096 // actually work. if the appearance has been reset because wearables have
1097 // changed then the texture entries are zero'd out until the bakes are
1098 // uploaded. on login, if the textures exist in the cache (eg if you logged
1099 // into the simulator recently, then the appearance will pull those and send
1100 // them back in the packet and you won't have to rebake. if the textures aren't
1101 // in the cache then the intial makeroot() call in scenepresence will zero
1102 // them out.
1103 //
1104 // a better solution (though how much better is an open question) is to
1105 // store the hashes in the appearance and compare them. Thats's coming.
1106
1107 Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[index];
1108 if (face != null)
1109 texture = face.TextureID;
1110
1111 // m_log.WarnFormat("[AVFACTORY]: reuse texture {0} for index {1}",texture,index);
1112 }
1113
1114 CachedTextureResponseArg response = new CachedTextureResponseArg();
1115 response.BakedTextureIndex = index;
1116 response.BakedTextureID = texture;
1117 response.HostName = null;
1118
1119 cachedTextureResponse.Add(response);
1120 }
1121
1122 // m_log.WarnFormat("[AVFACTORY]: serial is {0}",serial);
1123 // The serial number appears to be used to match requests and responses
1124 // in the texture transaction. We just send back the serial number
1125 // that was provided in the request. The viewer bumps this for us.
1126 client.SendCachedTextureResponse(sp, serial, cachedTextureResponse);
1127 }
1128
1129
1071 #endregion 1130 #endregion
1072 1131
1073 public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction) 1132 public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction)
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
index 174642d..917f164 100644
--- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
@@ -372,21 +372,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
372 UUID fromAgentID, UUID ownerID, string fromName, ChatTypeEnum type, 372 UUID fromAgentID, UUID ownerID, string fromName, ChatTypeEnum type,
373 string message, ChatSourceType src, bool ignoreDistance) 373 string message, ChatSourceType src, bool ignoreDistance)
374 { 374 {
375 // don't send chat to child agents 375 if (presence.LifecycleState != ScenePresenceState.Running)
376 if (presence.IsChildAgent) return false; 376 return false;
377
378 Vector3 fromRegionPos = fromPos + regionPos;
379 Vector3 toRegionPos = presence.AbsolutePosition +
380 new Vector3(presence.Scene.RegionInfo.RegionLocX * Constants.RegionSize,
381 presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
382 377
383 int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); 378 if (!ignoreDistance)
384
385 if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
386 type == ChatTypeEnum.Say && dis > m_saydistance ||
387 type == ChatTypeEnum.Shout && dis > m_shoutdistance)
388 { 379 {
389 return false; 380 Vector3 fromRegionPos = fromPos + regionPos;
381 Vector3 toRegionPos = presence.AbsolutePosition +
382 new Vector3(presence.Scene.RegionInfo.RegionLocX * Constants.RegionSize,
383 presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
384
385 int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos);
386
387 if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
388 type == ChatTypeEnum.Say && dis > m_saydistance ||
389 type == ChatTypeEnum.Shout && dis > m_shoutdistance)
390 {
391 return false;
392 }
390 } 393 }
391 394
392 // TODO: should change so the message is sent through the avatar rather than direct to the ClientView 395 // TODO: should change so the message is sent through the avatar rather than direct to the ClientView
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index 8056030..b693f2d 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -371,7 +371,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
371 foreach (string fid in outstanding) 371 foreach (string fid in outstanding)
372 { 372 {
373 UUID fromAgentID; 373 UUID fromAgentID;
374 string firstname = "Unknown", lastname = "User"; 374 string firstname = "Unknown", lastname = "UserFMSFOIN";
375 if (!GetAgentInfo(client.Scene.RegionInfo.ScopeID, fid, out fromAgentID, out firstname, out lastname)) 375 if (!GetAgentInfo(client.Scene.RegionInfo.ScopeID, fid, out fromAgentID, out firstname, out lastname))
376 { 376 {
377 m_log.DebugFormat("[FRIENDS MODULE]: skipping malformed friend {0}", fid); 377 m_log.DebugFormat("[FRIENDS MODULE]: skipping malformed friend {0}", fid);
@@ -397,7 +397,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
397 397
398 protected virtual bool GetAgentInfo(UUID scopeID, string fid, out UUID agentID, out string first, out string last) 398 protected virtual bool GetAgentInfo(UUID scopeID, string fid, out UUID agentID, out string first, out string last)
399 { 399 {
400 first = "Unknown"; last = "User"; 400 first = "Unknown"; last = "UserFMGAI";
401 if (!UUID.TryParse(fid, out agentID)) 401 if (!UUID.TryParse(fid, out agentID))
402 return false; 402 return false;
403 403
@@ -498,6 +498,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
498 498
499 protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) 499 protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online)
500 { 500 {
501 //m_log.DebugFormat("[FRIENDS]: Entering StatusNotify for {0}", userID);
502
501 List<string> friendStringIds = friendList.ConvertAll<string>(friend => friend.Friend); 503 List<string> friendStringIds = friendList.ConvertAll<string>(friend => friend.Friend);
502 List<string> remoteFriendStringIds = new List<string>(); 504 List<string> remoteFriendStringIds = new List<string>();
503 foreach (string friendStringId in friendStringIds) 505 foreach (string friendStringId in friendStringIds)
@@ -523,12 +525,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
523 foreach (PresenceInfo friendSession in friendSessions) 525 foreach (PresenceInfo friendSession in friendSessions)
524 { 526 {
525 // let's guard against sessions-gone-bad 527 // let's guard against sessions-gone-bad
526 if (friendSession.RegionID != UUID.Zero) 528 if (friendSession != null && friendSession.RegionID != UUID.Zero)
527 { 529 {
530 //m_log.DebugFormat("[FRIENDS]: Get region {0}", friendSession.RegionID);
528 GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); 531 GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID);
529 //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); 532 if (region != null)
530 m_FriendsSimConnector.StatusNotify(region, userID, friendSession.UserID, online); 533 {
534 m_FriendsSimConnector.StatusNotify(region, userID, friendSession.UserID, online);
535 }
531 } 536 }
537 //else
538 // m_log.DebugFormat("[FRIENDS]: friend session is null or the region is UUID.Zero");
532 } 539 }
533 } 540 }
534 541
@@ -685,7 +692,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
685 // 692 //
686 693
687 // Try local 694 // Try local
688 if (LocalFriendshipTerminated(exfriendID)) 695 if (LocalFriendshipTerminated(client.AgentId, exfriendID))
689 return; 696 return;
690 697
691 PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { exfriendID.ToString() }); 698 PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { exfriendID.ToString() });
@@ -827,13 +834,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
827 return false; 834 return false;
828 } 835 }
829 836
830 public bool LocalFriendshipTerminated(UUID exfriendID) 837 public bool LocalFriendshipTerminated(UUID userID, UUID exfriendID)
831 { 838 {
832 IClientAPI friendClient = LocateClientObject(exfriendID); 839 IClientAPI friendClient = LocateClientObject(exfriendID);
833 if (friendClient != null) 840 if (friendClient != null)
834 { 841 {
835 // the friend in this sim as root agent 842 // the friend in this sim as root agent
836 friendClient.SendTerminateFriend(exfriendID); 843 friendClient.SendTerminateFriend(userID);
837 // update local cache 844 // update local cache
838 RecacheFriends(friendClient); 845 RecacheFriends(friendClient);
839 // we're done 846 // we're done
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
index 637beef..2116605 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
54 m_FriendsModule = fmodule; 54 m_FriendsModule = fmodule;
55 } 55 }
56 56
57 public override byte[] Handle( 57 protected override byte[] ProcessRequest(
58 string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 58 string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
59 { 59 {
60 StreamReader sr = new StreamReader(requestData); 60 StreamReader sr = new StreamReader(requestData);
@@ -193,7 +193,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
193 if (!UUID.TryParse(request["ToID"].ToString(), out toID)) 193 if (!UUID.TryParse(request["ToID"].ToString(), out toID))
194 return FailureResult(); 194 return FailureResult();
195 195
196 if (m_FriendsModule.LocalFriendshipTerminated(toID)) 196 if (m_FriendsModule.LocalFriendshipTerminated(fromID, toID))
197 return SuccessResult(); 197 return SuccessResult();
198 198
199 return FailureResult(); 199 return FailureResult();
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index bf5c0bb..d00945e 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -183,6 +183,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
183 if (Util.ParseUniversalUserIdentifier(finfo.Friend, out id, out url, out first, out last, out tmp)) 183 if (Util.ParseUniversalUserIdentifier(finfo.Friend, out id, out url, out first, out last, out tmp))
184 { 184 {
185 IUserManagement uMan = m_Scenes[0].RequestModuleInterface<IUserManagement>(); 185 IUserManagement uMan = m_Scenes[0].RequestModuleInterface<IUserManagement>();
186 m_log.DebugFormat("[HGFRIENDS MODULE]: caching {0}", finfo.Friend);
186 uMan.AddUser(id, url + ";" + first + " " + last); 187 uMan.AddUser(id, url + ";" + first + " " + last);
187 } 188 }
188 } 189 }
@@ -251,7 +252,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
251 252
252 protected override void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) 253 protected override void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online)
253 { 254 {
254// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering StatusNotify for {0}", userID); 255 //m_log.DebugFormat("[HGFRIENDS MODULE]: Entering StatusNotify for {0}", userID);
255 256
256 // First, let's divide the friends on a per-domain basis 257 // First, let's divide the friends on a per-domain basis
257 Dictionary<string, List<FriendInfo>> friendsPerDomain = new Dictionary<string, List<FriendInfo>>(); 258 Dictionary<string, List<FriendInfo>> friendsPerDomain = new Dictionary<string, List<FriendInfo>>();
@@ -293,7 +294,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
293 294
294 protected override bool GetAgentInfo(UUID scopeID, string fid, out UUID agentID, out string first, out string last) 295 protected override bool GetAgentInfo(UUID scopeID, string fid, out UUID agentID, out string first, out string last)
295 { 296 {
296 first = "Unknown"; last = "User"; 297 first = "Unknown"; last = "UserHGGAI";
297 if (base.GetAgentInfo(scopeID, fid, out agentID, out first, out last)) 298 if (base.GetAgentInfo(scopeID, fid, out agentID, out first, out last))
298 return true; 299 return true;
299 300
@@ -349,7 +350,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
349 350
350 public override FriendInfo[] GetFriendsFromService(IClientAPI client) 351 public override FriendInfo[] GetFriendsFromService(IClientAPI client)
351 { 352 {
352// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); 353 // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name);
353 Boolean agentIsLocal = true; 354 Boolean agentIsLocal = true;
354 if (UserManagementModule != null) 355 if (UserManagementModule != null)
355 agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); 356 agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId);
@@ -362,13 +363,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
362 AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); 363 AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode);
363 if (agentClientCircuit != null) 364 if (agentClientCircuit != null)
364 { 365 {
365 //[XXX] string agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); 366 // Note that this is calling a different interface than base; this one calls with a string param!
366
367 finfos = FriendsService.GetFriends(client.AgentId.ToString()); 367 finfos = FriendsService.GetFriends(client.AgentId.ToString());
368 m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString()); 368 m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString());
369 } 369 }
370 370
371// m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); 371 // m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name);
372 372
373 return finfos; 373 return finfos;
374 } 374 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
index fa8c3f3..6b14fa6 100644
--- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs
@@ -26,27 +26,25 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic;
30using Nini.Config;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Region.Framework.Scenes;
34using OpenSim.Region.Framework.Interfaces;
35using System;
36using System.Reflection;
37using System.Collections; 29using System.Collections;
30using System.Collections.Generic;
38using System.Collections.Specialized; 31using System.Collections.Specialized;
39using System.Reflection;
40using System.IO; 32using System.IO;
33using System.Reflection;
41using System.Web; 34using System.Web;
42using System.Xml; 35using System.Xml;
43using log4net; 36using log4net;
44using Mono.Addins; 37using Mono.Addins;
38using Nini.Config;
39using OpenMetaverse;
45using OpenMetaverse.Messages.Linden; 40using OpenMetaverse.Messages.Linden;
46using OpenMetaverse.StructuredData; 41using OpenMetaverse.StructuredData;
42using OpenSim.Framework;
47using OpenSim.Framework.Capabilities; 43using OpenSim.Framework.Capabilities;
48using OpenSim.Framework.Servers; 44using OpenSim.Framework.Servers;
49using OpenSim.Framework.Servers.HttpServer; 45using OpenSim.Framework.Servers.HttpServer;
46using OpenSim.Region.Framework.Scenes;
47using OpenSim.Region.Framework.Interfaces;
50using Caps = OpenSim.Framework.Capabilities.Caps; 48using Caps = OpenSim.Framework.Capabilities.Caps;
51using OSDArray = OpenMetaverse.StructuredData.OSDArray; 49using OSDArray = OpenMetaverse.StructuredData.OSDArray;
52using OSDMap = OpenMetaverse.StructuredData.OSDMap; 50using OSDMap = OpenMetaverse.StructuredData.OSDMap;
@@ -127,9 +125,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
127 { 125 {
128 string uri = "/CAPS/" + UUID.Random(); 126 string uri = "/CAPS/" + UUID.Random();
129 127
130 caps.RegisterHandler("UntrustedSimulatorMessage", 128 caps.RegisterHandler(
131 new RestStreamHandler("POST", uri, 129 "UntrustedSimulatorMessage",
132 HandleUntrustedSimulatorMessage)); 130 new RestStreamHandler("POST", uri, HandleUntrustedSimulatorMessage, "UntrustedSimulatorMessage", null));
133 } 131 }
134 132
135 private string HandleUntrustedSimulatorMessage(string request, 133 private string HandleUntrustedSimulatorMessage(string request,
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 1627f6c..b321adb 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -392,7 +392,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
392 gim.fromAgentName = fromAgentName; 392 gim.fromAgentName = fromAgentName;
393 gim.fromGroup = fromGroup; 393 gim.fromGroup = fromGroup;
394 gim.imSessionID = imSessionID.Guid; 394 gim.imSessionID = imSessionID.Guid;
395 gim.RegionID = UUID.Zero.Guid; // RegionID.Guid; 395 gim.RegionID = RegionID.Guid;
396 gim.timestamp = timestamp; 396 gim.timestamp = timestamp;
397 gim.toAgentID = toAgentID.Guid; 397 gim.toAgentID = toAgentID.Guid;
398 gim.message = message; 398 gim.message = message;
@@ -728,7 +728,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
728 gim["position_x"] = msg.Position.X.ToString(); 728 gim["position_x"] = msg.Position.X.ToString();
729 gim["position_y"] = msg.Position.Y.ToString(); 729 gim["position_y"] = msg.Position.Y.ToString();
730 gim["position_z"] = msg.Position.Z.ToString(); 730 gim["position_z"] = msg.Position.Z.ToString();
731 gim["region_id"] = msg.RegionID.ToString(); 731 gim["region_id"] = new UUID(msg.RegionID).ToString();
732 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket,Base64FormattingOptions.None); 732 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket,Base64FormattingOptions.None);
733 if (m_MessageKey != String.Empty) 733 if (m_MessageKey != String.Empty)
734 gim["message_key"] = m_MessageKey; 734 gim["message_key"] = m_MessageKey;
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 659b178..d56e469 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -67,10 +67,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
67 /// </summary> 67 /// </summary>
68 protected bool m_merge; 68 protected bool m_merge;
69 69
70 /// <value> 70 protected IInventoryService m_InventoryService;
71 /// We only use this to request modules 71 protected IAssetService m_AssetService;
72 /// </value> 72 protected IUserAccountService m_UserAccountService;
73 protected Scene m_scene;
74 73
75 /// <value> 74 /// <value>
76 /// The stream from which the inventory archive will be loaded. 75 /// The stream from which the inventory archive will be loaded.
@@ -118,9 +117,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
118 protected Dictionary<UUID, UUID> m_creatorIdForAssetId = new Dictionary<UUID, UUID>(); 117 protected Dictionary<UUID, UUID> m_creatorIdForAssetId = new Dictionary<UUID, UUID>();
119 118
120 public InventoryArchiveReadRequest( 119 public InventoryArchiveReadRequest(
121 Scene scene, UserAccount userInfo, string invPath, string loadPath, bool merge) 120 IInventoryService inv, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, string loadPath, bool merge)
122 : this( 121 : this(
123 scene, 122 inv,
123 assets,
124 uacc,
124 userInfo, 125 userInfo,
125 invPath, 126 invPath,
126 new GZipStream(ArchiveHelpers.GetStream(loadPath), CompressionMode.Decompress), 127 new GZipStream(ArchiveHelpers.GetStream(loadPath), CompressionMode.Decompress),
@@ -129,9 +130,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
129 } 130 }
130 131
131 public InventoryArchiveReadRequest( 132 public InventoryArchiveReadRequest(
132 Scene scene, UserAccount userInfo, string invPath, Stream loadStream, bool merge) 133 IInventoryService inv, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, Stream loadStream, bool merge)
133 { 134 {
134 m_scene = scene; 135 m_InventoryService = inv;
136 m_AssetService = assets;
137 m_UserAccountService = uacc;
135 m_merge = merge; 138 m_merge = merge;
136 m_userInfo = userInfo; 139 m_userInfo = userInfo;
137 m_invPath = invPath; 140 m_invPath = invPath;
@@ -162,7 +165,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
162 165
163 List<InventoryFolderBase> folderCandidates 166 List<InventoryFolderBase> folderCandidates
164 = InventoryArchiveUtils.FindFoldersByPath( 167 = InventoryArchiveUtils.FindFoldersByPath(
165 m_scene.InventoryService, m_userInfo.PrincipalID, m_invPath); 168 m_InventoryService, m_userInfo.PrincipalID, m_invPath);
166 169
167 if (folderCandidates.Count == 0) 170 if (folderCandidates.Count == 0)
168 { 171 {
@@ -297,7 +300,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
297 string plainPath = ArchiveConstants.ExtractPlainPathFromIarPath(archivePath); 300 string plainPath = ArchiveConstants.ExtractPlainPathFromIarPath(archivePath);
298 List<InventoryFolderBase> folderCandidates 301 List<InventoryFolderBase> folderCandidates
299 = InventoryArchiveUtils.FindFoldersByPath( 302 = InventoryArchiveUtils.FindFoldersByPath(
300 m_scene.InventoryService, m_userInfo.PrincipalID, plainPath); 303 m_InventoryService, m_userInfo.PrincipalID, plainPath);
301 304
302 if (folderCandidates.Count != 0) 305 if (folderCandidates.Count != 0)
303 { 306 {
@@ -380,7 +383,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
380 = new InventoryFolderBase( 383 = new InventoryFolderBase(
381 newFolderId, newFolderName, m_userInfo.PrincipalID, 384 newFolderId, newFolderName, m_userInfo.PrincipalID,
382 (short)AssetType.Unknown, destFolder.ID, 1); 385 (short)AssetType.Unknown, destFolder.ID, 1);
383 m_scene.InventoryService.AddFolder(destFolder); 386 m_InventoryService.AddFolder(destFolder);
384 387
385 // Record that we have now created this folder 388 // Record that we have now created this folder
386 iarPathExisting += rawDirsToCreate[i] + "/"; 389 iarPathExisting += rawDirsToCreate[i] + "/";
@@ -406,7 +409,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
406 // Don't use the item ID that's in the file 409 // Don't use the item ID that's in the file
407 item.ID = UUID.Random(); 410 item.ID = UUID.Random();
408 411
409 UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.UserAccountService); 412 UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_UserAccountService);
410 if (UUID.Zero != ospResolvedId) // The user exists in this grid 413 if (UUID.Zero != ospResolvedId) // The user exists in this grid
411 { 414 {
412// m_log.DebugFormat("[INVENTORY ARCHIVER]: Found creator {0} via OSPA resolution", ospResolvedId); 415// m_log.DebugFormat("[INVENTORY ARCHIVER]: Found creator {0} via OSPA resolution", ospResolvedId);
@@ -436,7 +439,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
436 // relying on native tar tools. 439 // relying on native tar tools.
437 m_creatorIdForAssetId[item.AssetID] = item.CreatorIdAsUuid; 440 m_creatorIdForAssetId[item.AssetID] = item.CreatorIdAsUuid;
438 441
439 m_scene.AddInventoryItem(item); 442 if (!m_InventoryService.AddItem(item))
443 m_log.WarnFormat("[INVENTORY ARCHIVER]: Unable to save item {0} in folder {1}", item.Name, item.Folder);
440 444
441 return item; 445 return item;
442 } 446 }
@@ -533,7 +537,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
533 AssetBase asset = new AssetBase(assetId, "From IAR", assetType, UUID.Zero.ToString()); 537 AssetBase asset = new AssetBase(assetId, "From IAR", assetType, UUID.Zero.ToString());
534 asset.Data = data; 538 asset.Data = data;
535 539
536 m_scene.AssetService.Store(asset); 540 m_AssetService.Store(asset);
537 541
538 return true; 542 return true;
539 } 543 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index f4f9e2d..ea660bd 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -294,7 +294,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
294 294
295 try 295 try
296 { 296 {
297 request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadStream, merge); 297 request = new InventoryArchiveReadRequest(m_aScene.InventoryService, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadStream, merge);
298 } 298 }
299 catch (EntryPointNotFoundException e) 299 catch (EntryPointNotFoundException e)
300 { 300 {
@@ -342,7 +342,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
342 342
343 try 343 try
344 { 344 {
345 request = new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath, merge); 345 request = new InventoryArchiveReadRequest(m_aScene.InventoryService, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadPath, merge);
346 } 346 }
347 catch (EntryPointNotFoundException e) 347 catch (EntryPointNotFoundException e)
348 { 348 {
@@ -538,7 +538,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
538 } 538 }
539 catch (Exception e) 539 catch (Exception e)
540 { 540 {
541 m_log.ErrorFormat("[INVENTORY ARCHIVER]: Could not authenticate password, {0}", e.Message); 541 m_log.ErrorFormat("[INVENTORY ARCHIVER]: Could not authenticate password, {0}", e);
542 return null; 542 return null;
543 } 543 }
544 */ 544 */
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
index 95f562e..08f199a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
@@ -229,7 +229,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
229 229
230 { 230 {
231 // Test replication of path1 231 // Test replication of path1
232 new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false) 232 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
233 .ReplicateArchivePathToUserInventory( 233 .ReplicateArchivePathToUserInventory(
234 iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 234 iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
235 foldersCreated, nodesLoaded); 235 foldersCreated, nodesLoaded);
@@ -246,7 +246,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
246 246
247 { 247 {
248 // Test replication of path2 248 // Test replication of path2
249 new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false) 249 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
250 .ReplicateArchivePathToUserInventory( 250 .ReplicateArchivePathToUserInventory(
251 iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 251 iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
252 foldersCreated, nodesLoaded); 252 foldersCreated, nodesLoaded);
@@ -291,8 +291,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
291 string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); 291 string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
292 292
293 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName }); 293 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
294 294
295 new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false) 295 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
296 .ReplicateArchivePathToUserInventory( 296 .ReplicateArchivePathToUserInventory(
297 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 297 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
298 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>()); 298 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
@@ -342,8 +342,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
342 string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); 342 string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
343 343
344 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName }); 344 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
345 345
346 new InventoryArchiveReadRequest(scene, ua1, folder1ExistingName, (Stream)null, true) 346 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, folder1ExistingName, (Stream)null, true)
347 .ReplicateArchivePathToUserInventory( 347 .ReplicateArchivePathToUserInventory(
348 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 348 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
349 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>()); 349 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
index 5e7e24c..b85739e 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
@@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
86 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH)); 86 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH));
87 87
88 InventoryArchiveReadRequest iarr 88 InventoryArchiveReadRequest iarr
89 = new InventoryArchiveReadRequest(null, null, null, (Stream)null, false); 89 = new InventoryArchiveReadRequest(null, null, null, null, null, (Stream)null, false);
90 iarr.LoadControlFile(filePath, data); 90 iarr.LoadControlFile(filePath, data);
91 91
92 Assert.That(iarr.ControlFileLoaded, Is.True); 92 Assert.That(iarr.ControlFileLoaded, Is.True);
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index f122d00..e285f21 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -47,10 +47,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
47 47
48 /// <summary> 48 /// <summary>
49 private List<Scene> m_Scenelist = new List<Scene>(); 49 private List<Scene> m_Scenelist = new List<Scene>();
50// private Dictionary<UUID, Scene> m_AgentRegions =
51// new Dictionary<UUID, Scene>();
52 50
53 private IMessageTransferModule m_TransferModule = null; 51 private IMessageTransferModule m_TransferModule;
54 private bool m_Enabled = true; 52 private bool m_Enabled = true;
55 53
56 #region Region Module interface 54 #region Region Module interface
@@ -81,9 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
81// scene.RegisterModuleInterface<IInventoryTransferModule>(this); 79// scene.RegisterModuleInterface<IInventoryTransferModule>(this);
82 80
83 scene.EventManager.OnNewClient += OnNewClient; 81 scene.EventManager.OnNewClient += OnNewClient;
84// scene.EventManager.OnClientClosed += ClientLoggedOut;
85 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; 82 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
86// scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene;
87 } 83 }
88 84
89 public void RegionLoaded(Scene scene) 85 public void RegionLoaded(Scene scene)
@@ -96,11 +92,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
96 m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only"); 92 m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only");
97 m_Enabled = false; 93 m_Enabled = false;
98 94
99 m_Scenelist.Clear(); 95// m_Scenelist.Clear();
100 scene.EventManager.OnNewClient -= OnNewClient; 96// scene.EventManager.OnNewClient -= OnNewClient;
101// scene.EventManager.OnClientClosed -= ClientLoggedOut;
102 scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; 97 scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
103// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
104 } 98 }
105 } 99 }
106 } 100 }
@@ -108,9 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
108 public void RemoveRegion(Scene scene) 102 public void RemoveRegion(Scene scene)
109 { 103 {
110 scene.EventManager.OnNewClient -= OnNewClient; 104 scene.EventManager.OnNewClient -= OnNewClient;
111// scene.EventManager.OnClientClosed -= ClientLoggedOut;
112 scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; 105 scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
113// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
114 m_Scenelist.Remove(scene); 106 m_Scenelist.Remove(scene);
115 } 107 }
116 108
@@ -139,11 +131,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
139 // Inventory giving is conducted via instant message 131 // Inventory giving is conducted via instant message
140 client.OnInstantMessage += OnInstantMessage; 132 client.OnInstantMessage += OnInstantMessage;
141 } 133 }
142
143// protected void OnSetRootAgentScene(UUID id, Scene scene)
144// {
145// m_AgentRegions[id] = scene;
146// }
147 134
148 private Scene FindClientScene(UUID agentId) 135 private Scene FindClientScene(UUID agentId)
149 { 136 {
@@ -188,9 +175,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
188 { 175 {
189 UUID folderID = new UUID(im.binaryBucket, 1); 176 UUID folderID = new UUID(im.binaryBucket, 1);
190 177
191 m_log.DebugFormat("[INVENTORY TRANSFER]: Inserting original folder {0} "+ 178 m_log.DebugFormat(
192 "into agent {1}'s inventory", 179 "[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory",
193 folderID, new UUID(im.toAgentID)); 180 folderID, new UUID(im.toAgentID));
194 181
195 InventoryFolderBase folderCopy 182 InventoryFolderBase folderCopy
196 = scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero); 183 = scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero);
@@ -213,7 +200,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
213 user.ControllingClient.SendBulkUpdateInventory(folderCopy); 200 user.ControllingClient.SendBulkUpdateInventory(folderCopy);
214 201
215 // HACK!! 202 // HACK!!
216 // Insert the ID of the copied item into the IM so that we know which item to move to trash if it 203 // Insert the ID of the copied folder into the IM so that we know which item to move to trash if it
217 // is rejected. 204 // is rejected.
218 // XXX: This is probably a misuse of the session ID slot. 205 // XXX: This is probably a misuse of the session ID slot.
219 im.imSessionID = copyID.Guid; 206 im.imSessionID = copyID.Guid;
@@ -425,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
425 { 412 {
426 folder = new InventoryFolderBase(inventoryID, client.AgentId); 413 folder = new InventoryFolderBase(inventoryID, client.AgentId);
427 folder = invService.GetFolder(folder); 414 folder = invService.GetFolder(folder);
428 415
429 if (folder != null & trashFolder != null) 416 if (folder != null & trashFolder != null)
430 { 417 {
431 previousParentFolderID = folder.ParentID; 418 previousParentFolderID = folder.ParentID;
@@ -477,70 +464,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
477 } 464 }
478 } 465 }
479 466
480// public bool NeedSceneCacheClear(UUID agentID, Scene scene)
481// {
482// if (!m_AgentRegions.ContainsKey(agentID))
483// {
484// // Since we can get here two ways, we need to scan
485// // the scenes here. This is somewhat more expensive
486// // but helps avoid a nasty bug
487// //
488//
489// foreach (Scene s in m_Scenelist)
490// {
491// ScenePresence presence;
492//
493// if (s.TryGetScenePresence(agentID, out presence))
494// {
495// // If the agent is in this scene, then we
496// // are being called twice in a single
497// // teleport. This is wasteful of cycles
498// // but harmless due to this 2nd level check
499// //
500// // If the agent is found in another scene
501// // then the list wasn't current
502// //
503// // If the agent is totally unknown, then what
504// // are we even doing here??
505// //
506// if (s == scene)
507// {
508// //m_log.Debug("[INVTRANSFERMOD]: s == scene. Returning true in " + scene.RegionInfo.RegionName);
509// return true;
510// }
511// else
512// {
513// //m_log.Debug("[INVTRANSFERMOD]: s != scene. Returning false in " + scene.RegionInfo.RegionName);
514// return false;
515// }
516// }
517// }
518// //m_log.Debug("[INVTRANSFERMOD]: agent not in scene. Returning true in " + scene.RegionInfo.RegionName);
519// return true;
520// }
521//
522// // The agent is left in current Scene, so we must be
523// // going to another instance
524// //
525// if (m_AgentRegions[agentID] == scene)
526// {
527// //m_log.Debug("[INVTRANSFERMOD]: m_AgentRegions[agentID] == scene. Returning true in " + scene.RegionInfo.RegionName);
528// m_AgentRegions.Remove(agentID);
529// return true;
530// }
531//
532// // Another region has claimed the agent
533// //
534// //m_log.Debug("[INVTRANSFERMOD]: last resort. Returning false in " + scene.RegionInfo.RegionName);
535// return false;
536// }
537//
538// public void ClientLoggedOut(UUID agentID, Scene scene)
539// {
540// if (m_AgentRegions.ContainsKey(agentID))
541// m_AgentRegions.Remove(agentID);
542// }
543
544 /// <summary> 467 /// <summary>
545 /// 468 ///
546 /// </summary> 469 /// </summary>
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs
new file mode 100644
index 0000000..162a0c3
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs
@@ -0,0 +1,449 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using log4net.Config;
32using Nini.Config;
33using NUnit.Framework;
34using OpenMetaverse;
35using OpenMetaverse.Assets;
36using OpenSim.Framework;
37using OpenSim.Region.CoreModules.Avatar.Inventory.Transfer;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40using OpenSim.Services.Interfaces;
41using OpenSim.Tests.Common;
42using OpenSim.Tests.Common.Mock;
43
44namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer.Tests
45{
46 [TestFixture]
47 public class InventoryTransferModuleTests : OpenSimTestCase
48 {
49 protected TestScene m_scene;
50
51 [SetUp]
52 public override void SetUp()
53 {
54 base.SetUp();
55
56 IConfigSource config = new IniConfigSource();
57 config.AddConfig("Messaging");
58 config.Configs["Messaging"].Set("InventoryTransferModule", "InventoryTransferModule");
59
60 m_scene = new SceneHelpers().SetupScene();
61 SceneHelpers.SetupSceneModules(m_scene, config, new InventoryTransferModule());
62 }
63
64 [Test]
65 public void TestAcceptGivenItem()
66 {
67// TestHelpers.EnableLogging();
68
69 UUID initialSessionId = TestHelpers.ParseTail(0x10);
70 UUID itemId = TestHelpers.ParseTail(0x100);
71 UUID assetId = TestHelpers.ParseTail(0x200);
72
73 UserAccount ua1
74 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
75 UserAccount ua2
76 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
77
78 ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
79 TestClient giverClient = (TestClient)giverSp.ControllingClient;
80
81 ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
82 TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
83
84 // Create the object to test give
85 InventoryItemBase originalItem
86 = UserInventoryHelpers.CreateInventoryItem(
87 m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object);
88
89 byte[] giveImBinaryBucket = new byte[17];
90 byte[] itemIdBytes = itemId.GetBytes();
91 Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
92
93 GridInstantMessage giveIm
94 = new GridInstantMessage(
95 m_scene,
96 giverSp.UUID,
97 giverSp.Name,
98 receiverSp.UUID,
99 (byte)InstantMessageDialog.InventoryOffered,
100 false,
101 "inventory offered msg",
102 initialSessionId,
103 false,
104 Vector3.Zero,
105 giveImBinaryBucket,
106 true);
107
108 giverClient.HandleImprovedInstantMessage(giveIm);
109
110 // These details might not all be correct.
111 GridInstantMessage acceptIm
112 = new GridInstantMessage(
113 m_scene,
114 receiverSp.UUID,
115 receiverSp.Name,
116 giverSp.UUID,
117 (byte)InstantMessageDialog.InventoryAccepted,
118 false,
119 "inventory accepted msg",
120 initialSessionId,
121 false,
122 Vector3.Zero,
123 null,
124 true);
125
126 receiverClient.HandleImprovedInstantMessage(acceptIm);
127
128 // Test for item remaining in the giver's inventory (here we assume a copy item)
129 // TODO: Test no-copy items.
130 InventoryItemBase originalItemAfterGive
131 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
132
133 Assert.That(originalItemAfterGive, Is.Not.Null);
134 Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID));
135
136 // Test for item successfully making it into the receiver's inventory
137 InventoryItemBase receivedItem
138 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Objects/givenObj");
139
140 Assert.That(receivedItem, Is.Not.Null);
141 Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID));
142
143 // Test that on a delete, item still exists and is accessible for the giver.
144 m_scene.InventoryService.DeleteItems(receiverSp.UUID, new List<UUID>() { receivedItem.ID });
145
146 InventoryItemBase originalItemAfterDelete
147 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
148
149 Assert.That(originalItemAfterDelete, Is.Not.Null);
150
151 // TODO: Test scenario where giver deletes their item first.
152 }
153
154 /// <summary>
155 /// Test user rejection of a given item.
156 /// </summary>
157 /// <remarks>
158 /// A rejected item still ends up in the user's trash folder.
159 /// </remarks>
160 [Test]
161 public void TestRejectGivenItem()
162 {
163// TestHelpers.EnableLogging();
164
165 UUID initialSessionId = TestHelpers.ParseTail(0x10);
166 UUID itemId = TestHelpers.ParseTail(0x100);
167 UUID assetId = TestHelpers.ParseTail(0x200);
168
169 UserAccount ua1
170 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
171 UserAccount ua2
172 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
173
174 ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
175 TestClient giverClient = (TestClient)giverSp.ControllingClient;
176
177 ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
178 TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
179
180 // Create the object to test give
181 InventoryItemBase originalItem
182 = UserInventoryHelpers.CreateInventoryItem(
183 m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object);
184
185 GridInstantMessage receivedIm = null;
186 receiverClient.OnReceivedInstantMessage += im => receivedIm = im;
187
188 byte[] giveImBinaryBucket = new byte[17];
189 byte[] itemIdBytes = itemId.GetBytes();
190 Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
191
192 GridInstantMessage giveIm
193 = new GridInstantMessage(
194 m_scene,
195 giverSp.UUID,
196 giverSp.Name,
197 receiverSp.UUID,
198 (byte)InstantMessageDialog.InventoryOffered,
199 false,
200 "inventory offered msg",
201 initialSessionId,
202 false,
203 Vector3.Zero,
204 giveImBinaryBucket,
205 true);
206
207 giverClient.HandleImprovedInstantMessage(giveIm);
208
209 // These details might not all be correct.
210 // Session ID is now the created item ID (!)
211 GridInstantMessage rejectIm
212 = new GridInstantMessage(
213 m_scene,
214 receiverSp.UUID,
215 receiverSp.Name,
216 giverSp.UUID,
217 (byte)InstantMessageDialog.InventoryDeclined,
218 false,
219 "inventory declined msg",
220 new UUID(receivedIm.imSessionID),
221 false,
222 Vector3.Zero,
223 null,
224 true);
225
226 receiverClient.HandleImprovedInstantMessage(rejectIm);
227
228 // Test for item remaining in the giver's inventory (here we assume a copy item)
229 // TODO: Test no-copy items.
230 InventoryItemBase originalItemAfterGive
231 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
232
233 Assert.That(originalItemAfterGive, Is.Not.Null);
234 Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID));
235
236 // Test for item successfully making it into the receiver's inventory
237 InventoryItemBase receivedItem
238 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Trash/givenObj");
239
240 InventoryFolderBase trashFolder
241 = m_scene.InventoryService.GetFolderForType(receiverSp.UUID, AssetType.TrashFolder);
242
243 Assert.That(receivedItem, Is.Not.Null);
244 Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID));
245 Assert.That(receivedItem.Folder, Is.EqualTo(trashFolder.ID));
246
247 // Test that on a delete, item still exists and is accessible for the giver.
248 m_scene.InventoryService.PurgeFolder(trashFolder);
249
250 InventoryItemBase originalItemAfterDelete
251 = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
252
253 Assert.That(originalItemAfterDelete, Is.Not.Null);
254 }
255
256 [Test]
257 public void TestAcceptGivenFolder()
258 {
259 TestHelpers.InMethod();
260// TestHelpers.EnableLogging();
261
262 UUID initialSessionId = TestHelpers.ParseTail(0x10);
263 UUID folderId = TestHelpers.ParseTail(0x100);
264
265 UserAccount ua1
266 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
267 UserAccount ua2
268 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
269
270 ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
271 TestClient giverClient = (TestClient)giverSp.ControllingClient;
272
273 ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
274 TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
275
276 InventoryFolderBase originalFolder
277 = UserInventoryHelpers.CreateInventoryFolder(
278 m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
279
280 byte[] giveImBinaryBucket = new byte[17];
281 giveImBinaryBucket[0] = (byte)AssetType.Folder;
282 byte[] itemIdBytes = folderId.GetBytes();
283 Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
284
285 GridInstantMessage giveIm
286 = new GridInstantMessage(
287 m_scene,
288 giverSp.UUID,
289 giverSp.Name,
290 receiverSp.UUID,
291 (byte)InstantMessageDialog.InventoryOffered,
292 false,
293 "inventory offered msg",
294 initialSessionId,
295 false,
296 Vector3.Zero,
297 giveImBinaryBucket,
298 true);
299
300 giverClient.HandleImprovedInstantMessage(giveIm);
301
302 // These details might not all be correct.
303 GridInstantMessage acceptIm
304 = new GridInstantMessage(
305 m_scene,
306 receiverSp.UUID,
307 receiverSp.Name,
308 giverSp.UUID,
309 (byte)InstantMessageDialog.InventoryAccepted,
310 false,
311 "inventory accepted msg",
312 initialSessionId,
313 false,
314 Vector3.Zero,
315 null,
316 true);
317
318 receiverClient.HandleImprovedInstantMessage(acceptIm);
319
320 // Test for item remaining in the giver's inventory (here we assume a copy item)
321 // TODO: Test no-copy items.
322 InventoryFolderBase originalFolderAfterGive
323 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
324
325 Assert.That(originalFolderAfterGive, Is.Not.Null);
326 Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
327
328 // Test for item successfully making it into the receiver's inventory
329 InventoryFolderBase receivedFolder
330 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "f1");
331
332 Assert.That(receivedFolder, Is.Not.Null);
333 Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
334
335 // Test that on a delete, item still exists and is accessible for the giver.
336 m_scene.InventoryService.DeleteFolders(receiverSp.UUID, new List<UUID>() { receivedFolder.ID });
337
338 InventoryFolderBase originalFolderAfterDelete
339 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
340
341 Assert.That(originalFolderAfterDelete, Is.Not.Null);
342
343 // TODO: Test scenario where giver deletes their item first.
344 }
345
346 /// <summary>
347 /// Test user rejection of a given item.
348 /// </summary>
349 /// <remarks>
350 /// A rejected item still ends up in the user's trash folder.
351 /// </remarks>
352 [Test]
353 public void TestRejectGivenFolder()
354 {
355 TestHelpers.InMethod();
356// TestHelpers.EnableLogging();
357
358 UUID initialSessionId = TestHelpers.ParseTail(0x10);
359 UUID folderId = TestHelpers.ParseTail(0x100);
360
361 UserAccount ua1
362 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
363 UserAccount ua2
364 = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
365
366 ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
367 TestClient giverClient = (TestClient)giverSp.ControllingClient;
368
369 ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
370 TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
371
372 // Create the folder to test give
373 InventoryFolderBase originalFolder
374 = UserInventoryHelpers.CreateInventoryFolder(
375 m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
376
377 GridInstantMessage receivedIm = null;
378 receiverClient.OnReceivedInstantMessage += im => receivedIm = im;
379
380 byte[] giveImBinaryBucket = new byte[17];
381 giveImBinaryBucket[0] = (byte)AssetType.Folder;
382 byte[] itemIdBytes = folderId.GetBytes();
383 Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
384
385 GridInstantMessage giveIm
386 = new GridInstantMessage(
387 m_scene,
388 giverSp.UUID,
389 giverSp.Name,
390 receiverSp.UUID,
391 (byte)InstantMessageDialog.InventoryOffered,
392 false,
393 "inventory offered msg",
394 initialSessionId,
395 false,
396 Vector3.Zero,
397 giveImBinaryBucket,
398 true);
399
400 giverClient.HandleImprovedInstantMessage(giveIm);
401
402 // These details might not all be correct.
403 // Session ID is now the created item ID (!)
404 GridInstantMessage rejectIm
405 = new GridInstantMessage(
406 m_scene,
407 receiverSp.UUID,
408 receiverSp.Name,
409 giverSp.UUID,
410 (byte)InstantMessageDialog.InventoryDeclined,
411 false,
412 "inventory declined msg",
413 new UUID(receivedIm.imSessionID),
414 false,
415 Vector3.Zero,
416 null,
417 true);
418
419 receiverClient.HandleImprovedInstantMessage(rejectIm);
420
421 // Test for item remaining in the giver's inventory (here we assume a copy item)
422 // TODO: Test no-copy items.
423 InventoryFolderBase originalFolderAfterGive
424 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
425
426 Assert.That(originalFolderAfterGive, Is.Not.Null);
427 Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
428
429 // Test for folder successfully making it into the receiver's inventory
430 InventoryFolderBase receivedFolder
431 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "Trash/f1");
432
433 InventoryFolderBase trashFolder
434 = m_scene.InventoryService.GetFolderForType(receiverSp.UUID, AssetType.TrashFolder);
435
436 Assert.That(receivedFolder, Is.Not.Null);
437 Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
438 Assert.That(receivedFolder.ParentID, Is.EqualTo(trashFolder.ID));
439
440 // Test that on a delete, item still exists and is accessible for the giver.
441 m_scene.InventoryService.PurgeFolder(trashFolder);
442
443 InventoryFolderBase originalFolderAfterDelete
444 = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
445
446 Assert.That(originalFolderAfterDelete, Is.Not.Null);
447 }
448 }
449} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs
index bf24030..2bb24ae 100644
--- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs
@@ -57,6 +57,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
57 57
58 public void Initialise(IConfigSource config) 58 public void Initialise(IConfigSource config)
59 { 59 {
60 if(config.Configs["UserProfiles"] != null)
61 return;
62
60 m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); 63 m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled");
61 m_Enabled = true; 64 m_Enabled = true;
62 } 65 }
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
new file mode 100644
index 0000000..56ff2bd
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
@@ -0,0 +1,1343 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.IO;
30using System.Text;
31using System.Collections;
32using System.Collections.Generic;
33using System.Globalization;
34using System.Net;
35using System.Net.Sockets;
36using System.Reflection;
37using System.Xml;
38using OpenMetaverse;
39using OpenMetaverse.StructuredData;
40using log4net;
41using Nini.Config;
42using Nwc.XmlRpc;
43using OpenSim.Framework;
44using OpenSim.Region.Framework.Interfaces;
45using OpenSim.Region.Framework.Scenes;
46using OpenSim.Services.Interfaces;
47using Mono.Addins;
48using OpenSim.Services.Connectors.Hypergrid;
49
50namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
51{
52 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserProfilesModule")]
53 public class UserProfileModule : IProfileModule, INonSharedRegionModule
54 {
55 /// <summary>
56 /// Logging
57 /// </summary>
58 static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
59
60 // The pair of Dictionaries are used to handle the switching of classified ads
61 // by maintaining a cache of classified id to creator id mappings and an interest
62 // count. The entries are removed when the interest count reaches 0.
63 Dictionary<UUID, UUID> m_classifiedCache = new Dictionary<UUID, UUID>();
64 Dictionary<UUID, int> m_classifiedInterest = new Dictionary<UUID, int>();
65
66 public Scene Scene
67 {
68 get; private set;
69 }
70
71 /// <summary>
72 /// Gets or sets the ConfigSource.
73 /// </summary>
74 /// <value>
75 /// The configuration
76 /// </value>
77 public IConfigSource Config {
78 get;
79 set;
80 }
81
82 /// <summary>
83 /// Gets or sets the URI to the profile server.
84 /// </summary>
85 /// <value>
86 /// The profile server URI.
87 /// </value>
88 public string ProfileServerUri {
89 get;
90 set;
91 }
92
93 IProfileModule ProfileModule
94 {
95 get; set;
96 }
97
98 IUserManagement UserManagementModule
99 {
100 get; set;
101 }
102
103 /// <summary>
104 /// Gets or sets a value indicating whether this
105 /// <see cref="OpenSim.Region.Coremodules.UserProfiles.UserProfileModule"/> is enabled.
106 /// </summary>
107 /// <value>
108 /// <c>true</c> if enabled; otherwise, <c>false</c>.
109 /// </value>
110 public bool Enabled {
111 get;
112 set;
113 }
114
115 #region IRegionModuleBase implementation
116 /// <summary>
117 /// This is called to initialize the region module. For shared modules, this is called exactly once, after
118 /// creating the single (shared) instance. For non-shared modules, this is called once on each instance, after
119 /// the instace for the region has been created.
120 /// </summary>
121 /// <param name='source'>
122 /// Source.
123 /// </param>
124 public void Initialise(IConfigSource source)
125 {
126 Config = source;
127 ReplaceableInterface = typeof(IProfileModule);
128
129 IConfig profileConfig = Config.Configs["UserProfiles"];
130
131 if (profileConfig == null)
132 {
133 m_log.Debug("[PROFILES]: UserProfiles disabled, no configuration");
134 Enabled = false;
135 return;
136 }
137
138 // If we find ProfileURL then we configure for FULL support
139 // else we setup for BASIC support
140 ProfileServerUri = profileConfig.GetString("ProfileServiceURL", "");
141 if (ProfileServerUri == "")
142 {
143 Enabled = false;
144 return;
145 }
146
147 m_log.Debug("[PROFILES]: Full Profiles Enabled");
148 ReplaceableInterface = null;
149 Enabled = true;
150 }
151
152 /// <summary>
153 /// Adds the region.
154 /// </summary>
155 /// <param name='scene'>
156 /// Scene.
157 /// </param>
158 public void AddRegion(Scene scene)
159 {
160 if(!Enabled)
161 return;
162
163 Scene = scene;
164 Scene.RegisterModuleInterface<IProfileModule>(this);
165 Scene.EventManager.OnNewClient += OnNewClient;
166 Scene.EventManager.OnMakeRootAgent += HandleOnMakeRootAgent;
167
168 UserManagementModule = Scene.RequestModuleInterface<IUserManagement>();
169 }
170
171 void HandleOnMakeRootAgent (ScenePresence obj)
172 {
173 if(obj.PresenceType == PresenceType.Npc)
174 return;
175
176 Util.FireAndForget(delegate
177 {
178 GetImageAssets(((IScenePresence)obj).UUID);
179 });
180 }
181
182 /// <summary>
183 /// Removes the region.
184 /// </summary>
185 /// <param name='scene'>
186 /// Scene.
187 /// </param>
188 public void RemoveRegion(Scene scene)
189 {
190 if(!Enabled)
191 return;
192 }
193
194 /// <summary>
195 /// This will be called once for every scene loaded. In a shared module this will be multiple times in one
196 /// instance, while a nonshared module instance will only be called once. This method is called after AddRegion
197 /// has been called in all modules for that scene, providing an opportunity to request another module's
198 /// interface, or hook an event from another module.
199 /// </summary>
200 /// <param name='scene'>
201 /// Scene.
202 /// </param>
203 public void RegionLoaded(Scene scene)
204 {
205 if(!Enabled)
206 return;
207 }
208
209 /// <summary>
210 /// If this returns non-null, it is the type of an interface that this module intends to register. This will
211 /// cause the loader to defer loading of this module until all other modules have been loaded. If no other
212 /// module has registered the interface by then, this module will be activated, else it will remain inactive,
213 /// letting the other module take over. This should return non-null ONLY in modules that are intended to be
214 /// easily replaceable, e.g. stub implementations that the developer expects to be replaced by third party
215 /// provided modules.
216 /// </summary>
217 /// <value>
218 /// The replaceable interface.
219 /// </value>
220 public Type ReplaceableInterface
221 {
222 get; private set;
223 }
224
225 /// <summary>
226 /// Called as the instance is closed.
227 /// </summary>
228 public void Close()
229 {
230 }
231
232 /// <value>
233 /// The name of the module
234 /// </value>
235 /// <summary>
236 /// Gets the module name.
237 /// </summary>
238 public string Name
239 {
240 get { return "UserProfileModule"; }
241 }
242 #endregion IRegionModuleBase implementation
243
244 #region Region Event Handlers
245 /// <summary>
246 /// Raises the new client event.
247 /// </summary>
248 /// <param name='client'>
249 /// Client.
250 /// </param>
251 void OnNewClient(IClientAPI client)
252 {
253 //Profile
254 client.OnRequestAvatarProperties += RequestAvatarProperties;
255 client.OnUpdateAvatarProperties += AvatarPropertiesUpdate;
256 client.OnAvatarInterestUpdate += AvatarInterestsUpdate;
257
258 // Classifieds
259 client.AddGenericPacketHandler("avatarclassifiedsrequest", ClassifiedsRequest);
260 client.OnClassifiedInfoUpdate += ClassifiedInfoUpdate;
261 client.OnClassifiedInfoRequest += ClassifiedInfoRequest;
262 client.OnClassifiedDelete += ClassifiedDelete;
263
264 // Picks
265 client.AddGenericPacketHandler("avatarpicksrequest", PicksRequest);
266 client.AddGenericPacketHandler("pickinforequest", PickInfoRequest);
267 client.OnPickInfoUpdate += PickInfoUpdate;
268 client.OnPickDelete += PickDelete;
269
270 // Notes
271 client.AddGenericPacketHandler("avatarnotesrequest", NotesRequest);
272 client.OnAvatarNotesUpdate += NotesUpdate;
273 }
274 #endregion Region Event Handlers
275
276 #region Classified
277 ///
278 /// <summary>
279 /// Handles the avatar classifieds request.
280 /// </summary>
281 /// <param name='sender'>
282 /// Sender.
283 /// </param>
284 /// <param name='method'>
285 /// Method.
286 /// </param>
287 /// <param name='args'>
288 /// Arguments.
289 /// </param>
290 public void ClassifiedsRequest(Object sender, string method, List<String> args)
291 {
292 if (!(sender is IClientAPI))
293 return;
294
295 IClientAPI remoteClient = (IClientAPI)sender;
296
297 UUID targetID;
298 UUID.TryParse(args[0], out targetID);
299
300 // Can't handle NPC yet...
301 ScenePresence p = FindPresence(targetID);
302
303 if (null != p)
304 {
305 if (p.PresenceType == PresenceType.Npc)
306 return;
307 }
308
309 string serverURI = string.Empty;
310 GetUserProfileServerURI(targetID, out serverURI);
311 UUID creatorId = UUID.Zero;
312 Dictionary<UUID, string> classifieds = new Dictionary<UUID, string>();
313
314 OSDMap parameters= new OSDMap();
315 UUID.TryParse(args[0], out creatorId);
316 parameters.Add("creatorId", OSD.FromUUID(creatorId));
317 OSD Params = (OSD)parameters;
318 if(!JsonRpcRequest(ref Params, "avatarclassifiedsrequest", serverURI, UUID.Random().ToString()))
319 {
320 remoteClient.SendAvatarClassifiedReply(new UUID(args[0]), classifieds);
321 return;
322 }
323
324 parameters = (OSDMap)Params;
325
326 OSDArray list = (OSDArray)parameters["result"];
327
328
329 foreach(OSD map in list)
330 {
331 OSDMap m = (OSDMap)map;
332 UUID cid = m["classifieduuid"].AsUUID();
333 string name = m["name"].AsString();
334
335 classifieds[cid] = name;
336
337 lock (m_classifiedCache)
338 {
339 if (!m_classifiedCache.ContainsKey(cid))
340 {
341 m_classifiedCache.Add(cid,creatorId);
342 m_classifiedInterest.Add(cid, 0);
343 }
344
345 m_classifiedInterest[cid]++;
346 }
347 }
348
349 remoteClient.SendAvatarClassifiedReply(new UUID(args[0]), classifieds);
350 }
351
352 public void ClassifiedInfoRequest(UUID queryClassifiedID, IClientAPI remoteClient)
353 {
354 UUID target = remoteClient.AgentId;
355 UserClassifiedAdd ad = new UserClassifiedAdd();
356 ad.ClassifiedId = queryClassifiedID;
357
358 lock (m_classifiedCache)
359 {
360 if (m_classifiedCache.ContainsKey(queryClassifiedID))
361 {
362 target = m_classifiedCache[queryClassifiedID];
363
364 m_classifiedInterest[queryClassifiedID] --;
365
366 if (m_classifiedInterest[queryClassifiedID] == 0)
367 {
368 m_classifiedInterest.Remove(queryClassifiedID);
369 m_classifiedCache.Remove(queryClassifiedID);
370 }
371 }
372 }
373
374 string serverURI = string.Empty;
375 GetUserProfileServerURI(target, out serverURI);
376
377 object Ad = (object)ad;
378 if(!JsonRpcRequest(ref Ad, "classifieds_info_query", serverURI, UUID.Random().ToString()))
379 {
380 remoteClient.SendAgentAlertMessage(
381 "Error getting classified info", false);
382 return;
383 }
384 ad = (UserClassifiedAdd) Ad;
385
386 if(ad.CreatorId == UUID.Zero)
387 return;
388
389 Vector3 globalPos = new Vector3();
390 Vector3.TryParse(ad.GlobalPos, out globalPos);
391
392 remoteClient.SendClassifiedInfoReply(ad.ClassifiedId, ad.CreatorId, (uint)ad.CreationDate, (uint)ad.ExpirationDate,
393 (uint)ad.Category, ad.Name, ad.Description, ad.ParcelId, (uint)ad.ParentEstate,
394 ad.SnapshotId, ad.SimName, globalPos, ad.ParcelName, ad.Flags, ad.Price);
395
396 }
397
398 /// <summary>
399 /// Classifieds info update.
400 /// </summary>
401 /// <param name='queryclassifiedID'>
402 /// Queryclassified I.
403 /// </param>
404 /// <param name='queryCategory'>
405 /// Query category.
406 /// </param>
407 /// <param name='queryName'>
408 /// Query name.
409 /// </param>
410 /// <param name='queryDescription'>
411 /// Query description.
412 /// </param>
413 /// <param name='queryParcelID'>
414 /// Query parcel I.
415 /// </param>
416 /// <param name='queryParentEstate'>
417 /// Query parent estate.
418 /// </param>
419 /// <param name='querySnapshotID'>
420 /// Query snapshot I.
421 /// </param>
422 /// <param name='queryGlobalPos'>
423 /// Query global position.
424 /// </param>
425 /// <param name='queryclassifiedFlags'>
426 /// Queryclassified flags.
427 /// </param>
428 /// <param name='queryclassifiedPrice'>
429 /// Queryclassified price.
430 /// </param>
431 /// <param name='remoteClient'>
432 /// Remote client.
433 /// </param>
434 public void ClassifiedInfoUpdate(UUID queryclassifiedID, uint queryCategory, string queryName, string queryDescription, UUID queryParcelID,
435 uint queryParentEstate, UUID querySnapshotID, Vector3 queryGlobalPos, byte queryclassifiedFlags,
436 int queryclassifiedPrice, IClientAPI remoteClient)
437 {
438 UserClassifiedAdd ad = new UserClassifiedAdd();
439
440 Scene s = (Scene) remoteClient.Scene;
441 Vector3 pos = remoteClient.SceneAgent.AbsolutePosition;
442 ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y);
443 ScenePresence p = FindPresence(remoteClient.AgentId);
444
445 string serverURI = string.Empty;
446 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
447
448 if (land == null)
449 {
450 ad.ParcelName = string.Empty;
451 }
452 else
453 {
454 ad.ParcelName = land.LandData.Name;
455 }
456
457 ad.CreatorId = remoteClient.AgentId;
458 ad.ClassifiedId = queryclassifiedID;
459 ad.Category = Convert.ToInt32(queryCategory);
460 ad.Name = queryName;
461 ad.Description = queryDescription;
462 ad.ParentEstate = Convert.ToInt32(queryParentEstate);
463 ad.SnapshotId = querySnapshotID;
464 ad.SimName = remoteClient.Scene.RegionInfo.RegionName;
465 ad.GlobalPos = queryGlobalPos.ToString ();
466 ad.Flags = queryclassifiedFlags;
467 ad.Price = queryclassifiedPrice;
468 ad.ParcelId = p.currentParcelUUID;
469
470 object Ad = ad;
471
472 OSD.SerializeMembers(Ad);
473
474 if(!JsonRpcRequest(ref Ad, "classified_update", serverURI, UUID.Random().ToString()))
475 {
476 remoteClient.SendAgentAlertMessage(
477 "Error updating classified", false);
478 }
479 }
480
481 /// <summary>
482 /// Classifieds delete.
483 /// </summary>
484 /// <param name='queryClassifiedID'>
485 /// Query classified I.
486 /// </param>
487 /// <param name='remoteClient'>
488 /// Remote client.
489 /// </param>
490 public void ClassifiedDelete(UUID queryClassifiedID, IClientAPI remoteClient)
491 {
492 string serverURI = string.Empty;
493 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
494
495 UUID classifiedId;
496 OSDMap parameters= new OSDMap();
497 UUID.TryParse(queryClassifiedID.ToString(), out classifiedId);
498 parameters.Add("classifiedId", OSD.FromUUID(classifiedId));
499 OSD Params = (OSD)parameters;
500 if(!JsonRpcRequest(ref Params, "classified_delete", serverURI, UUID.Random().ToString()))
501 {
502 remoteClient.SendAgentAlertMessage(
503 "Error classified delete", false);
504 }
505
506 parameters = (OSDMap)Params;
507 }
508 #endregion Classified
509
510 #region Picks
511 /// <summary>
512 /// Handles the avatar picks request.
513 /// </summary>
514 /// <param name='sender'>
515 /// Sender.
516 /// </param>
517 /// <param name='method'>
518 /// Method.
519 /// </param>
520 /// <param name='args'>
521 /// Arguments.
522 /// </param>
523 public void PicksRequest(Object sender, string method, List<String> args)
524 {
525 if (!(sender is IClientAPI))
526 return;
527
528 IClientAPI remoteClient = (IClientAPI)sender;
529
530 UUID targetId;
531 UUID.TryParse(args[0], out targetId);
532
533 // Can't handle NPC yet...
534 ScenePresence p = FindPresence(targetId);
535
536 if (null != p)
537 {
538 if (p.PresenceType == PresenceType.Npc)
539 return;
540 }
541
542 string serverURI = string.Empty;
543 GetUserProfileServerURI(targetId, out serverURI);
544
545 Dictionary<UUID, string> picks = new Dictionary<UUID, string>();
546
547 OSDMap parameters= new OSDMap();
548 parameters.Add("creatorId", OSD.FromUUID(targetId));
549 OSD Params = (OSD)parameters;
550 if(!JsonRpcRequest(ref Params, "avatarpicksrequest", serverURI, UUID.Random().ToString()))
551 {
552 remoteClient.SendAvatarPicksReply(new UUID(args[0]), picks);
553 return;
554 }
555
556 parameters = (OSDMap)Params;
557
558 OSDArray list = (OSDArray)parameters["result"];
559
560 foreach(OSD map in list)
561 {
562 OSDMap m = (OSDMap)map;
563 UUID cid = m["pickuuid"].AsUUID();
564 string name = m["name"].AsString();
565
566 m_log.DebugFormat("[PROFILES]: PicksRequest {0}", name);
567
568 picks[cid] = name;
569 }
570 remoteClient.SendAvatarPicksReply(new UUID(args[0]), picks);
571 }
572
573 /// <summary>
574 /// Handles the pick info request.
575 /// </summary>
576 /// <param name='sender'>
577 /// Sender.
578 /// </param>
579 /// <param name='method'>
580 /// Method.
581 /// </param>
582 /// <param name='args'>
583 /// Arguments.
584 /// </param>
585 public void PickInfoRequest(Object sender, string method, List<String> args)
586 {
587 if (!(sender is IClientAPI))
588 return;
589
590 UUID targetID;
591 UUID.TryParse(args[0], out targetID);
592 string serverURI = string.Empty;
593 GetUserProfileServerURI(targetID, out serverURI);
594 IClientAPI remoteClient = (IClientAPI)sender;
595
596 UserProfilePick pick = new UserProfilePick();
597 UUID.TryParse(args[0], out pick.CreatorId);
598 UUID.TryParse(args[1], out pick.PickId);
599
600
601 object Pick = (object)pick;
602 if(!JsonRpcRequest(ref Pick, "pickinforequest", serverURI, UUID.Random().ToString()))
603 {
604 remoteClient.SendAgentAlertMessage(
605 "Error selecting pick", false);
606 }
607 pick = (UserProfilePick) Pick;
608 if(pick.SnapshotId == UUID.Zero)
609 {
610 // In case of a new UserPick, the data may not be ready and we would send wrong data, skip it...
611 m_log.DebugFormat("[PROFILES]: PickInfoRequest: SnapshotID is {0}", UUID.Zero.ToString());
612 return;
613 }
614
615 Vector3 globalPos;
616 Vector3.TryParse(pick.GlobalPos,out globalPos);
617
618 m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString());
619
620 remoteClient.SendPickInfoReply(pick.PickId,pick.CreatorId,pick.TopPick,pick.ParcelId,pick.Name,
621 pick.Desc,pick.SnapshotId,pick.User,pick.OriginalName,pick.SimName,
622 globalPos,pick.SortOrder,pick.Enabled);
623 }
624
625 /// <summary>
626 /// Updates the userpicks
627 /// </summary>
628 /// <param name='remoteClient'>
629 /// Remote client.
630 /// </param>
631 /// <param name='pickID'>
632 /// Pick I.
633 /// </param>
634 /// <param name='creatorID'>
635 /// the creator of the pick
636 /// </param>
637 /// <param name='topPick'>
638 /// Top pick.
639 /// </param>
640 /// <param name='name'>
641 /// Name.
642 /// </param>
643 /// <param name='desc'>
644 /// Desc.
645 /// </param>
646 /// <param name='snapshotID'>
647 /// Snapshot I.
648 /// </param>
649 /// <param name='sortOrder'>
650 /// Sort order.
651 /// </param>
652 /// <param name='enabled'>
653 /// Enabled.
654 /// </param>
655 public void PickInfoUpdate(IClientAPI remoteClient, UUID pickID, UUID creatorID, bool topPick, string name, string desc, UUID snapshotID, int sortOrder, bool enabled)
656 {
657
658 m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString());
659 UserProfilePick pick = new UserProfilePick();
660 string serverURI = string.Empty;
661 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
662 ScenePresence p = FindPresence(remoteClient.AgentId);
663
664 Vector3 avaPos = p.AbsolutePosition;
665 // Getting the global position for the Avatar
666 Vector3 posGlobal = new Vector3(remoteClient.Scene.RegionInfo.RegionLocX*Constants.RegionSize + avaPos.X,
667 remoteClient.Scene.RegionInfo.RegionLocY*Constants.RegionSize + avaPos.Y,
668 avaPos.Z);
669
670 string landOwnerName = string.Empty;
671 ILandObject land = p.Scene.LandChannel.GetLandObject(avaPos.X, avaPos.Y);
672 if(land.LandData.IsGroupOwned)
673 {
674 IGroupsModule groupMod = p.Scene.RequestModuleInterface<IGroupsModule>();
675 UUID groupId = land.LandData.GroupID;
676 GroupRecord groupRecord = groupMod.GetGroupRecord(groupId);
677 landOwnerName = groupRecord.GroupName;
678 }
679 else
680 {
681 IUserAccountService accounts = p.Scene.RequestModuleInterface<IUserAccountService>();
682 UserAccount user = accounts.GetUserAccount(p.Scene.RegionInfo.ScopeID, land.LandData.OwnerID);
683 landOwnerName = user.Name;
684 }
685
686 pick.PickId = pickID;
687 pick.CreatorId = creatorID;
688 pick.TopPick = topPick;
689 pick.Name = name;
690 pick.Desc = desc;
691 pick.ParcelId = p.currentParcelUUID;
692 pick.SnapshotId = snapshotID;
693 pick.User = landOwnerName;
694 pick.SimName = remoteClient.Scene.RegionInfo.RegionName;
695 pick.GlobalPos = posGlobal.ToString();
696 pick.SortOrder = sortOrder;
697 pick.Enabled = enabled;
698
699 object Pick = (object)pick;
700 if(!JsonRpcRequest(ref Pick, "picks_update", serverURI, UUID.Random().ToString()))
701 {
702 remoteClient.SendAgentAlertMessage(
703 "Error updating pick", false);
704 }
705
706 m_log.DebugFormat("[PROFILES]: Finish PickInfoUpdate {0} {1}", pick.Name, pick.PickId.ToString());
707 }
708
709 /// <summary>
710 /// Delete a Pick
711 /// </summary>
712 /// <param name='remoteClient'>
713 /// Remote client.
714 /// </param>
715 /// <param name='queryPickID'>
716 /// Query pick I.
717 /// </param>
718 public void PickDelete(IClientAPI remoteClient, UUID queryPickID)
719 {
720 string serverURI = string.Empty;
721 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
722
723 OSDMap parameters= new OSDMap();
724 parameters.Add("pickId", OSD.FromUUID(queryPickID));
725 OSD Params = (OSD)parameters;
726 if(!JsonRpcRequest(ref Params, "picks_delete", serverURI, UUID.Random().ToString()))
727 {
728 remoteClient.SendAgentAlertMessage(
729 "Error picks delete", false);
730 }
731 }
732 #endregion Picks
733
734 #region Notes
735 /// <summary>
736 /// Handles the avatar notes request.
737 /// </summary>
738 /// <param name='sender'>
739 /// Sender.
740 /// </param>
741 /// <param name='method'>
742 /// Method.
743 /// </param>
744 /// <param name='args'>
745 /// Arguments.
746 /// </param>
747 public void NotesRequest(Object sender, string method, List<String> args)
748 {
749 UserProfileNotes note = new UserProfileNotes();
750
751 if (!(sender is IClientAPI))
752 return;
753
754 IClientAPI remoteClient = (IClientAPI)sender;
755 string serverURI = string.Empty;
756 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
757 note.TargetId = remoteClient.AgentId;
758 UUID.TryParse(args[0], out note.UserId);
759
760 object Note = (object)note;
761 if(!JsonRpcRequest(ref Note, "avatarnotesrequest", serverURI, UUID.Random().ToString()))
762 {
763 remoteClient.SendAvatarNotesReply(note.TargetId, note.Notes);
764 return;
765 }
766 note = (UserProfileNotes) Note;
767
768 remoteClient.SendAvatarNotesReply(note.TargetId, note.Notes);
769 }
770
771 /// <summary>
772 /// Avatars the notes update.
773 /// </summary>
774 /// <param name='remoteClient'>
775 /// Remote client.
776 /// </param>
777 /// <param name='queryTargetID'>
778 /// Query target I.
779 /// </param>
780 /// <param name='queryNotes'>
781 /// Query notes.
782 /// </param>
783 public void NotesUpdate(IClientAPI remoteClient, UUID queryTargetID, string queryNotes)
784 {
785 UserProfileNotes note = new UserProfileNotes();
786
787 note.UserId = remoteClient.AgentId;
788 note.TargetId = queryTargetID;
789 note.Notes = queryNotes;
790
791 string serverURI = string.Empty;
792 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
793
794 object Note = note;
795 if(!JsonRpcRequest(ref Note, "avatar_notes_update", serverURI, UUID.Random().ToString()))
796 {
797 return;
798 }
799 }
800 #endregion Notes
801
802 #region Avatar Properties
803 /// <summary>
804 /// Update the avatars interests .
805 /// </summary>
806 /// <param name='remoteClient'>
807 /// Remote client.
808 /// </param>
809 /// <param name='wantmask'>
810 /// Wantmask.
811 /// </param>
812 /// <param name='wanttext'>
813 /// Wanttext.
814 /// </param>
815 /// <param name='skillsmask'>
816 /// Skillsmask.
817 /// </param>
818 /// <param name='skillstext'>
819 /// Skillstext.
820 /// </param>
821 /// <param name='languages'>
822 /// Languages.
823 /// </param>
824 public void AvatarInterestsUpdate(IClientAPI remoteClient, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages)
825 {
826 UserProfileProperties prop = new UserProfileProperties();
827
828 prop.UserId = remoteClient.AgentId;
829 prop.WantToMask = (int)wantmask;
830 prop.WantToText = wanttext;
831 prop.SkillsMask = (int)skillsmask;
832 prop.SkillsText = skillstext;
833 prop.Language = languages;
834
835 string serverURI = string.Empty;
836 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
837
838 object Param = prop;
839 if(!JsonRpcRequest(ref Param, "avatar_interests_update", serverURI, UUID.Random().ToString()))
840 {
841 remoteClient.SendAgentAlertMessage(
842 "Error updating interests", false);
843 }
844 }
845
846 public void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID)
847 {
848 if ( String.IsNullOrEmpty(avatarID.ToString()) || String.IsNullOrEmpty(remoteClient.AgentId.ToString()))
849 {
850 // Looking for a reason that some viewers are sending null Id's
851 m_log.DebugFormat("[PROFILES]: This should not happen remoteClient.AgentId {0} - avatarID {1}", remoteClient.AgentId, avatarID);
852 return;
853 }
854
855 // Can't handle NPC yet...
856 ScenePresence p = FindPresence(avatarID);
857
858 if (null != p)
859 {
860 if (p.PresenceType == PresenceType.Npc)
861 return;
862 }
863
864 string serverURI = string.Empty;
865 bool foreign = GetUserProfileServerURI(avatarID, out serverURI);
866
867 UserAccount account = null;
868 Dictionary<string,object> userInfo;
869
870 if (!foreign)
871 {
872 account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, avatarID);
873 }
874 else
875 {
876 userInfo = new Dictionary<string, object>();
877 }
878
879 Byte[] charterMember = new Byte[1];
880 string born = String.Empty;
881 uint flags = 0x00;
882
883 if (null != account)
884 {
885 if (account.UserTitle == "")
886 {
887 charterMember[0] = (Byte)((account.UserFlags & 0xf00) >> 8);
888 }
889 else
890 {
891 charterMember = Utils.StringToBytes(account.UserTitle);
892 }
893
894 born = Util.ToDateTime(account.Created).ToString(
895 "M/d/yyyy", CultureInfo.InvariantCulture);
896 flags = (uint)(account.UserFlags & 0xff);
897 }
898 else
899 {
900 if (GetUserAccountData(avatarID, out userInfo) == true)
901 {
902 if ((string)userInfo["user_title"] == "")
903 {
904 charterMember[0] = (Byte)(((Byte)userInfo["user_flags"] & 0xf00) >> 8);
905 }
906 else
907 {
908 charterMember = Utils.StringToBytes((string)userInfo["user_title"]);
909 }
910
911 int val_born = (int)userInfo["user_created"];
912 born = Util.ToDateTime(val_born).ToString(
913 "M/d/yyyy", CultureInfo.InvariantCulture);
914
915 // picky, picky
916 int val_flags = (int)userInfo["user_flags"];
917 flags = (uint)(val_flags & 0xff);
918 }
919 }
920
921 UserProfileProperties props = new UserProfileProperties();
922 string result = string.Empty;
923
924 props.UserId = avatarID;
925 GetProfileData(ref props, out result);
926
927 remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, charterMember , props.FirstLifeText, flags,
928 props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId);
929
930
931 remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, (uint)props.SkillsMask,
932 props.SkillsText, props.Language);
933 }
934
935 /// <summary>
936 /// Updates the avatar properties.
937 /// </summary>
938 /// <param name='remoteClient'>
939 /// Remote client.
940 /// </param>
941 /// <param name='newProfile'>
942 /// New profile.
943 /// </param>
944 public void AvatarPropertiesUpdate(IClientAPI remoteClient, UserProfileData newProfile)
945 {
946 if (remoteClient.AgentId == newProfile.ID)
947 {
948 UserProfileProperties prop = new UserProfileProperties();
949
950 prop.UserId = remoteClient.AgentId;
951 prop.WebUrl = newProfile.ProfileUrl;
952 prop.ImageId = newProfile.Image;
953 prop.AboutText = newProfile.AboutText;
954 prop.FirstLifeImageId = newProfile.FirstLifeImage;
955 prop.FirstLifeText = newProfile.FirstLifeAboutText;
956
957 string serverURI = string.Empty;
958 GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
959
960 object Prop = prop;
961
962 if(!JsonRpcRequest(ref Prop, "avatar_properties_update", serverURI, UUID.Random().ToString()))
963 {
964 remoteClient.SendAgentAlertMessage(
965 "Error updating properties", false);
966 }
967
968 RequestAvatarProperties(remoteClient, newProfile.ID);
969 }
970 }
971
972 /// <summary>
973 /// Gets the profile data.
974 /// </summary>
975 /// <returns>
976 /// The profile data.
977 /// </returns>
978 /// <param name='userID'>
979 /// User I.
980 /// </param>
981 bool GetProfileData(ref UserProfileProperties properties, out string message)
982 {
983 // Can't handle NPC yet...
984 ScenePresence p = FindPresence(properties.UserId);
985
986 if (null != p)
987 {
988 if (p.PresenceType == PresenceType.Npc)
989 {
990 message = "Id points to NPC";
991 return false;
992 }
993 }
994
995 string serverURI = string.Empty;
996 GetUserProfileServerURI(properties.UserId, out serverURI);
997
998 // This is checking a friend on the home grid
999 // Not HG friend
1000 if ( String.IsNullOrEmpty(serverURI))
1001 {
1002 message = "No Presence - foreign friend";
1003 return false;
1004 }
1005
1006 object Prop = (object)properties;
1007 JsonRpcRequest(ref Prop, "avatar_properties_request", serverURI, UUID.Random().ToString());
1008 properties = (UserProfileProperties)Prop;
1009
1010 message = "Success";
1011 return true;
1012 }
1013 #endregion Avatar Properties
1014
1015 #region Utils
1016 bool GetImageAssets(UUID avatarId)
1017 {
1018 string profileServerURI = string.Empty;
1019 string assetServerURI = string.Empty;
1020
1021 bool foreign = GetUserProfileServerURI(avatarId, out profileServerURI);
1022
1023 if(!foreign)
1024 return true;
1025
1026 assetServerURI = UserManagementModule.GetUserServerURL(avatarId, "AssetServerURI");
1027
1028 OSDMap parameters= new OSDMap();
1029 parameters.Add("avatarId", OSD.FromUUID(avatarId));
1030 OSD Params = (OSD)parameters;
1031 if(!JsonRpcRequest(ref Params, "image_assets_request", profileServerURI, UUID.Random().ToString()))
1032 {
1033 return false;
1034 }
1035
1036 parameters = (OSDMap)Params;
1037
1038 OSDArray list = (OSDArray)parameters["result"];
1039
1040 foreach(OSD asset in list)
1041 {
1042 OSDString assetId = (OSDString)asset;
1043
1044 Scene.AssetService.Get(string.Format("{0}/{1}",assetServerURI, assetId.AsString()));
1045 }
1046 return true;
1047 }
1048
1049 /// <summary>
1050 /// Gets the user account data.
1051 /// </summary>
1052 /// <returns>
1053 /// The user profile data.
1054 /// </returns>
1055 /// <param name='userID'>
1056 /// If set to <c>true</c> user I.
1057 /// </param>
1058 /// <param name='userInfo'>
1059 /// If set to <c>true</c> user info.
1060 /// </param>
1061 bool GetUserAccountData(UUID userID, out Dictionary<string, object> userInfo)
1062 {
1063 Dictionary<string,object> info = new Dictionary<string, object>();
1064
1065 if (UserManagementModule.IsLocalGridUser(userID))
1066 {
1067 // Is local
1068 IUserAccountService uas = Scene.UserAccountService;
1069 UserAccount account = uas.GetUserAccount(Scene.RegionInfo.ScopeID, userID);
1070
1071 info["user_flags"] = account.UserFlags;
1072 info["user_created"] = account.Created;
1073
1074 if (!String.IsNullOrEmpty(account.UserTitle))
1075 info["user_title"] = account.UserTitle;
1076 else
1077 info["user_title"] = "";
1078
1079 userInfo = info;
1080
1081 return false;
1082 }
1083 else
1084 {
1085 // Is Foreign
1086 string home_url = UserManagementModule.GetUserServerURL(userID, "HomeURI");
1087
1088 if (String.IsNullOrEmpty(home_url))
1089 {
1090 info["user_flags"] = 0;
1091 info["user_created"] = 0;
1092 info["user_title"] = "Unavailable";
1093
1094 userInfo = info;
1095 return true;
1096 }
1097
1098 UserAgentServiceConnector uConn = new UserAgentServiceConnector(home_url);
1099
1100 Dictionary<string, object> account = uConn.GetUserInfo(userID);
1101
1102 if (account.Count > 0)
1103 {
1104 if (account.ContainsKey("user_flags"))
1105 info["user_flags"] = account["user_flags"];
1106 else
1107 info["user_flags"] = "";
1108
1109 if (account.ContainsKey("user_created"))
1110 info["user_created"] = account["user_created"];
1111 else
1112 info["user_created"] = "";
1113
1114 info["user_title"] = "HG Visitor";
1115 }
1116 else
1117 {
1118 info["user_flags"] = 0;
1119 info["user_created"] = 0;
1120 info["user_title"] = "HG Visitor";
1121 }
1122 userInfo = info;
1123 return true;
1124 }
1125 }
1126
1127 /// <summary>
1128 /// Gets the user profile server UR.
1129 /// </summary>
1130 /// <returns>
1131 /// The user profile server UR.
1132 /// </returns>
1133 /// <param name='userID'>
1134 /// If set to <c>true</c> user I.
1135 /// </param>
1136 /// <param name='serverURI'>
1137 /// If set to <c>true</c> server UR.
1138 /// </param>
1139 bool GetUserProfileServerURI(UUID userID, out string serverURI)
1140 {
1141 bool local;
1142 local = UserManagementModule.IsLocalGridUser(userID);
1143
1144 if (!local)
1145 {
1146 serverURI = UserManagementModule.GetUserServerURL(userID, "ProfileServerURI");
1147 // Is Foreign
1148 return true;
1149 }
1150 else
1151 {
1152 serverURI = ProfileServerUri;
1153 // Is local
1154 return false;
1155 }
1156 }
1157
1158 /// <summary>
1159 /// Finds the presence.
1160 /// </summary>
1161 /// <returns>
1162 /// The presence.
1163 /// </returns>
1164 /// <param name='clientID'>
1165 /// Client I.
1166 /// </param>
1167 ScenePresence FindPresence(UUID clientID)
1168 {
1169 ScenePresence p;
1170
1171 p = Scene.GetScenePresence(clientID);
1172 if (p != null && !p.IsChildAgent)
1173 return p;
1174
1175 return null;
1176 }
1177 #endregion Util
1178
1179 #region Web Util
1180 /// <summary>
1181 /// Sends json-rpc request with a serializable type.
1182 /// </summary>
1183 /// <returns>
1184 /// OSD Map.
1185 /// </returns>
1186 /// <param name='parameters'>
1187 /// Serializable type .
1188 /// </param>
1189 /// <param name='method'>
1190 /// Json-rpc method to call.
1191 /// </param>
1192 /// <param name='uri'>
1193 /// URI of json-rpc service.
1194 /// </param>
1195 /// <param name='jsonId'>
1196 /// Id for our call.
1197 /// </param>
1198 bool JsonRpcRequest(ref object parameters, string method, string uri, string jsonId)
1199 {
1200 if (jsonId == null)
1201 throw new ArgumentNullException ("jsonId");
1202 if (uri == null)
1203 throw new ArgumentNullException ("uri");
1204 if (method == null)
1205 throw new ArgumentNullException ("method");
1206 if (parameters == null)
1207 throw new ArgumentNullException ("parameters");
1208
1209 // Prep our payload
1210 OSDMap json = new OSDMap();
1211
1212 json.Add("jsonrpc", OSD.FromString("2.0"));
1213 json.Add("id", OSD.FromString(jsonId));
1214 json.Add("method", OSD.FromString(method));
1215
1216 json.Add("params", OSD.SerializeMembers(parameters));
1217
1218 string jsonRequestData = OSDParser.SerializeJsonString(json);
1219 byte[] content = Encoding.UTF8.GetBytes(jsonRequestData);
1220
1221 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
1222
1223 webRequest.ContentType = "application/json-rpc";
1224 webRequest.Method = "POST";
1225
1226 Stream dataStream = webRequest.GetRequestStream();
1227 dataStream.Write(content, 0, content.Length);
1228 dataStream.Close();
1229
1230 WebResponse webResponse = null;
1231 try
1232 {
1233 webResponse = webRequest.GetResponse();
1234 }
1235 catch (WebException e)
1236 {
1237 Console.WriteLine("Web Error" + e.Message);
1238 Console.WriteLine ("Please check input");
1239 return false;
1240 }
1241
1242 Stream rstream = webResponse.GetResponseStream();
1243
1244 OSDMap mret = new OSDMap();
1245 try
1246 {
1247 mret = (OSDMap)OSDParser.DeserializeJson(rstream);
1248 }
1249 catch (Exception e)
1250 {
1251 m_log.DebugFormat("[PROFILES]: JsonRpcRequest Error {0} - remote user with legacy profiles?", e.Message);
1252 return false;
1253 }
1254
1255
1256 if (mret.ContainsKey("error"))
1257 return false;
1258
1259 // get params...
1260 OSD.DeserializeMembers(ref parameters, (OSDMap) mret["result"]);
1261 return true;
1262 }
1263
1264 /// <summary>
1265 /// Sends json-rpc request with OSD parameter.
1266 /// </summary>
1267 /// <returns>
1268 /// The rpc request.
1269 /// </returns>
1270 /// <param name='data'>
1271 /// data - incoming as parameters, outgong as result/error
1272 /// </param>
1273 /// <param name='method'>
1274 /// Json-rpc method to call.
1275 /// </param>
1276 /// <param name='uri'>
1277 /// URI of json-rpc service.
1278 /// </param>
1279 /// <param name='jsonId'>
1280 /// If set to <c>true</c> json identifier.
1281 /// </param>
1282 bool JsonRpcRequest(ref OSD data, string method, string uri, string jsonId)
1283 {
1284 OSDMap map = new OSDMap();
1285
1286 map["jsonrpc"] = "2.0";
1287 if(string.IsNullOrEmpty(jsonId))
1288 map["id"] = UUID.Random().ToString();
1289 else
1290 map["id"] = jsonId;
1291
1292 map["method"] = method;
1293 map["params"] = data;
1294
1295 string jsonRequestData = OSDParser.SerializeJsonString(map);
1296 byte[] content = Encoding.UTF8.GetBytes(jsonRequestData);
1297
1298 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
1299 webRequest.ContentType = "application/json-rpc";
1300 webRequest.Method = "POST";
1301
1302 Stream dataStream = webRequest.GetRequestStream();
1303 dataStream.Write(content, 0, content.Length);
1304 dataStream.Close();
1305
1306 WebResponse webResponse = null;
1307 try
1308 {
1309 webResponse = webRequest.GetResponse();
1310 }
1311 catch (WebException e)
1312 {
1313 Console.WriteLine("Web Error" + e.Message);
1314 Console.WriteLine ("Please check input");
1315 return false;
1316 }
1317
1318 Stream rstream = webResponse.GetResponseStream();
1319
1320 OSDMap response = new OSDMap();
1321 try
1322 {
1323 response = (OSDMap)OSDParser.DeserializeJson(rstream);
1324 }
1325 catch (Exception e)
1326 {
1327 m_log.DebugFormat("[PROFILES]: JsonRpcRequest Error {0} - remote user with legacy profiles?", e.Message);
1328 return false;
1329 }
1330
1331 if(response.ContainsKey("error"))
1332 {
1333 data = response["error"];
1334 return false;
1335 }
1336
1337 data = response;
1338
1339 return true;
1340 }
1341 #endregion Web Util
1342 }
1343} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
index fff86d5..de8925d 100644
--- a/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Caps/CapabilitiesModule.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Linq;
31using System.Reflection; 32using System.Reflection;
32using System.Text; 33using System.Text;
33using log4net; 34using log4net;
@@ -37,6 +38,7 @@ using OpenMetaverse;
37using OpenSim.Framework; 38using OpenSim.Framework;
38using OpenSim.Framework.Console; 39using OpenSim.Framework.Console;
39using OpenSim.Framework.Servers; 40using OpenSim.Framework.Servers;
41using OpenSim.Framework.Servers.HttpServer;
40using OpenSim.Region.Framework.Interfaces; 42using OpenSim.Region.Framework.Interfaces;
41using OpenSim.Region.Framework.Scenes; 43using OpenSim.Region.Framework.Scenes;
42using Caps=OpenSim.Framework.Capabilities.Caps; 44using Caps=OpenSim.Framework.Capabilities.Caps;
@@ -57,8 +59,9 @@ namespace OpenSim.Region.CoreModules.Framework
57 /// </summary> 59 /// </summary>
58 protected Dictionary<uint, Caps> m_capsObjects = new Dictionary<uint, Caps>(); 60 protected Dictionary<uint, Caps> m_capsObjects = new Dictionary<uint, Caps>();
59 61
60 protected Dictionary<UUID, string> capsPaths = new Dictionary<UUID, string>(); 62 protected Dictionary<UUID, string> m_capsPaths = new Dictionary<UUID, string>();
61 protected Dictionary<UUID, Dictionary<ulong, string>> childrenSeeds 63
64 protected Dictionary<UUID, Dictionary<ulong, string>> m_childrenSeeds
62 = new Dictionary<UUID, Dictionary<ulong, string>>(); 65 = new Dictionary<UUID, Dictionary<ulong, string>>();
63 66
64 public void Initialise(IConfigSource source) 67 public void Initialise(IConfigSource source)
@@ -70,9 +73,24 @@ namespace OpenSim.Region.CoreModules.Framework
70 m_scene = scene; 73 m_scene = scene;
71 m_scene.RegisterModuleInterface<ICapabilitiesModule>(this); 74 m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
72 75
73 MainConsole.Instance.Commands.AddCommand("Comms", false, "show caps", 76 MainConsole.Instance.Commands.AddCommand(
74 "show caps", 77 "Comms", false, "show caps list",
75 "Shows all registered capabilities for users", HandleShowCapsCommand); 78 "show caps list",
79 "Shows list of registered capabilities for users.", HandleShowCapsListCommand);
80
81 MainConsole.Instance.Commands.AddCommand(
82 "Comms", false, "show caps stats by user",
83 "show caps stats by user [<first-name> <last-name>]",
84 "Shows statistics on capabilities use by user.",
85 "If a user name is given, then prints a detailed breakdown of caps use ordered by number of requests received.",
86 HandleShowCapsStatsByUserCommand);
87
88 MainConsole.Instance.Commands.AddCommand(
89 "Comms", false, "show caps stats by cap",
90 "show caps stats by cap [<cap-name>]",
91 "Shows statistics on capabilities use by capability.",
92 "If a capability name is given, then prints a detailed breakdown of use by each user.",
93 HandleShowCapsStatsByCapCommand);
76 } 94 }
77 95
78 public void RegionLoaded(Scene scene) 96 public void RegionLoaded(Scene scene)
@@ -106,35 +124,38 @@ namespace OpenSim.Region.CoreModules.Framework
106 if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags)) 124 if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags))
107 return; 125 return;
108 126
127 Caps caps;
109 String capsObjectPath = GetCapsPath(agentId); 128 String capsObjectPath = GetCapsPath(agentId);
110 129
111 if (m_capsObjects.ContainsKey(circuitCode)) 130 lock (m_capsObjects)
112 { 131 {
113 Caps oldCaps = m_capsObjects[circuitCode]; 132 if (m_capsObjects.ContainsKey(circuitCode))
114 133 {
115 m_log.DebugFormat( 134 Caps oldCaps = m_capsObjects[circuitCode];
116 "[CAPS]: Recreating caps for agent {0}. Old caps path {1}, new caps path {2}. ", 135
117 agentId, oldCaps.CapsObjectPath, capsObjectPath); 136 //m_log.WarnFormat(
118 // This should not happen. The caller code is confused. We need to fix that. 137 // "[CAPS]: Recreating caps for agent {0} in region {1}. Old caps path {2}, new caps path {3}. ",
119 // CAPs can never be reregistered, or the client will be confused. 138 // agentId, m_scene.RegionInfo.RegionName, oldCaps.CapsObjectPath, capsObjectPath);
120 // Hence this return here. 139 }
121 //return;
122 }
123
124 Caps caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
125 (MainServer.Instance == null) ? 0: MainServer.Instance.Port,
126 capsObjectPath, agentId, m_scene.RegionInfo.RegionName);
127 140
128 m_capsObjects[circuitCode] = caps; 141 caps = new Caps(MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
142 (MainServer.Instance == null) ? 0: MainServer.Instance.Port,
143 capsObjectPath, agentId, m_scene.RegionInfo.RegionName);
129 144
145 m_capsObjects[circuitCode] = caps;
146 }
130 m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps); 147 m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps);
131 } 148 }
132 149
133 public void RemoveCaps(UUID agentId, uint circuitCode) 150 public void RemoveCaps(UUID agentId, uint circuitCode)
134 { 151 {
135 if (childrenSeeds.ContainsKey(agentId)) 152 m_log.DebugFormat("[CAPS]: Remove caps for agent {0} in region {1}", agentId, m_scene.RegionInfo.RegionName);
153 lock (m_childrenSeeds)
136 { 154 {
137 childrenSeeds.Remove(agentId); 155 if (m_childrenSeeds.ContainsKey(agentId))
156 {
157 m_childrenSeeds.Remove(agentId);
158 }
138 } 159 }
139 160
140 lock (m_capsObjects) 161 lock (m_capsObjects)
@@ -180,16 +201,22 @@ namespace OpenSim.Region.CoreModules.Framework
180 201
181 public void SetAgentCapsSeeds(AgentCircuitData agent) 202 public void SetAgentCapsSeeds(AgentCircuitData agent)
182 { 203 {
183 capsPaths[agent.AgentID] = agent.CapsPath; 204 lock (m_capsPaths)
184 childrenSeeds[agent.AgentID] 205 m_capsPaths[agent.AgentID] = agent.CapsPath;
185 = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds); 206
207 lock (m_childrenSeeds)
208 m_childrenSeeds[agent.AgentID]
209 = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
186 } 210 }
187 211
188 public string GetCapsPath(UUID agentId) 212 public string GetCapsPath(UUID agentId)
189 { 213 {
190 if (capsPaths.ContainsKey(agentId)) 214 lock (m_capsPaths)
191 { 215 {
192 return capsPaths[agentId]; 216 if (m_capsPaths.ContainsKey(agentId))
217 {
218 return m_capsPaths[agentId];
219 }
193 } 220 }
194 221
195 return null; 222 return null;
@@ -198,17 +225,24 @@ namespace OpenSim.Region.CoreModules.Framework
198 public Dictionary<ulong, string> GetChildrenSeeds(UUID agentID) 225 public Dictionary<ulong, string> GetChildrenSeeds(UUID agentID)
199 { 226 {
200 Dictionary<ulong, string> seeds = null; 227 Dictionary<ulong, string> seeds = null;
201 if (childrenSeeds.TryGetValue(agentID, out seeds)) 228
202 return seeds; 229 lock (m_childrenSeeds)
230 if (m_childrenSeeds.TryGetValue(agentID, out seeds))
231 return seeds;
232
203 return new Dictionary<ulong, string>(); 233 return new Dictionary<ulong, string>();
204 } 234 }
205 235
206 public void DropChildSeed(UUID agentID, ulong handle) 236 public void DropChildSeed(UUID agentID, ulong handle)
207 { 237 {
208 Dictionary<ulong, string> seeds; 238 Dictionary<ulong, string> seeds;
209 if (childrenSeeds.TryGetValue(agentID, out seeds)) 239
240 lock (m_childrenSeeds)
210 { 241 {
211 seeds.Remove(handle); 242 if (m_childrenSeeds.TryGetValue(agentID, out seeds))
243 {
244 seeds.Remove(handle);
245 }
212 } 246 }
213 } 247 }
214 248
@@ -216,53 +250,339 @@ namespace OpenSim.Region.CoreModules.Framework
216 { 250 {
217 Dictionary<ulong, string> seeds; 251 Dictionary<ulong, string> seeds;
218 string returnval; 252 string returnval;
219 if (childrenSeeds.TryGetValue(agentID, out seeds)) 253
254 lock (m_childrenSeeds)
220 { 255 {
221 if (seeds.TryGetValue(handle, out returnval)) 256 if (m_childrenSeeds.TryGetValue(agentID, out seeds))
222 return returnval; 257 {
258 if (seeds.TryGetValue(handle, out returnval))
259 return returnval;
260 }
223 } 261 }
262
224 return null; 263 return null;
225 } 264 }
226 265
227 public void SetChildrenSeed(UUID agentID, Dictionary<ulong, string> seeds) 266 public void SetChildrenSeed(UUID agentID, Dictionary<ulong, string> seeds)
228 { 267 {
229 //m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count); 268 //m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count);
230 childrenSeeds[agentID] = seeds; 269
270 lock (m_childrenSeeds)
271 m_childrenSeeds[agentID] = seeds;
231 } 272 }
232 273
233 public void DumpChildrenSeeds(UUID agentID) 274 public void DumpChildrenSeeds(UUID agentID)
234 { 275 {
235 m_log.Info("================ ChildrenSeed "+m_scene.RegionInfo.RegionName+" ================"); 276 m_log.Info("================ ChildrenSeed "+m_scene.RegionInfo.RegionName+" ================");
236 foreach (KeyValuePair<ulong, string> kvp in childrenSeeds[agentID]) 277
278 lock (m_childrenSeeds)
279 {
280 foreach (KeyValuePair<ulong, string> kvp in m_childrenSeeds[agentID])
281 {
282 uint x, y;
283 Utils.LongToUInts(kvp.Key, out x, out y);
284 x = x / Constants.RegionSize;
285 y = y / Constants.RegionSize;
286 m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
287 }
288 }
289 }
290
291 private void HandleShowCapsListCommand(string module, string[] cmdParams)
292 {
293 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
294 return;
295
296 StringBuilder capsReport = new StringBuilder();
297 capsReport.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
298
299 lock (m_capsObjects)
237 { 300 {
238 uint x, y; 301 foreach (KeyValuePair<uint, Caps> kvp in m_capsObjects)
239 Utils.LongToUInts(kvp.Key, out x, out y); 302 {
240 x = x / Constants.RegionSize; 303 capsReport.AppendFormat("** Circuit {0}:\n", kvp.Key);
241 y = y / Constants.RegionSize; 304 Caps caps = kvp.Value;
242 m_log.Info(" >> "+x+", "+y+": "+kvp.Value); 305
306 for (IDictionaryEnumerator kvp2 = caps.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); )
307 {
308 Uri uri = new Uri(kvp2.Value.ToString());
309 capsReport.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery);
310 }
311
312 foreach (KeyValuePair<string, PollServiceEventArgs> kvp2 in caps.GetPollHandlers())
313 capsReport.AppendFormat(m_showCapsCommandFormat, kvp2.Key, kvp2.Value.Url);
314
315 foreach (KeyValuePair<string, string> kvp3 in caps.ExternalCapsHandlers)
316 capsReport.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value);
317 }
243 } 318 }
319
320 MainConsole.Instance.Output(capsReport.ToString());
244 } 321 }
245 322
246 private void HandleShowCapsCommand(string module, string[] cmdparams) 323 private void HandleShowCapsStatsByCapCommand(string module, string[] cmdParams)
247 { 324 {
248 StringBuilder caps = new StringBuilder(); 325 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
249 caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName); 326 return;
327
328 if (cmdParams.Length != 5 && cmdParams.Length != 6)
329 {
330 MainConsole.Instance.Output("Usage: show caps stats by cap [<cap-name>]");
331 return;
332 }
333
334 StringBuilder sb = new StringBuilder();
335 sb.AppendFormat("Region {0}:\n", m_scene.Name);
336
337 if (cmdParams.Length == 5)
338 {
339 BuildSummaryStatsByCapReport(sb);
340 }
341 else if (cmdParams.Length == 6)
342 {
343 BuildDetailedStatsByCapReport(sb, cmdParams[5]);
344 }
345
346 MainConsole.Instance.Output(sb.ToString());
347 }
348
349 private void BuildDetailedStatsByCapReport(StringBuilder sb, string capName)
350 {
351 /*
352 sb.AppendFormat("Capability name {0}\n", capName);
353
354 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
355 cdt.AddColumn("User Name", 34);
356 cdt.AddColumn("Req Received", 12);
357 cdt.AddColumn("Req Handled", 12);
358 cdt.Indent = 2;
359
360 Dictionary<string, int> receivedStats = new Dictionary<string, int>();
361 Dictionary<string, int> handledStats = new Dictionary<string, int>();
362
363 m_scene.ForEachScenePresence(
364 sp =>
365 {
366 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
250 367
251 foreach (KeyValuePair<uint, Caps> kvp in m_capsObjects) 368 if (caps == null)
369 return;
370
371 Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
372
373 IRequestHandler reqHandler;
374 if (capsHandlers.TryGetValue(capName, out reqHandler))
375 {
376 receivedStats[sp.Name] = reqHandler.RequestsReceived;
377 handledStats[sp.Name] = reqHandler.RequestsHandled;
378 }
379 else
380 {
381 PollServiceEventArgs pollHandler = null;
382 if (caps.TryGetPollHandler(capName, out pollHandler))
383 {
384 receivedStats[sp.Name] = pollHandler.RequestsReceived;
385 handledStats[sp.Name] = pollHandler.RequestsHandled;
386 }
387 }
388 }
389 );
390
391 foreach (KeyValuePair<string, int> kvp in receivedStats.OrderByDescending(kp => kp.Value))
252 { 392 {
253 caps.AppendFormat("** Circuit {0}:\n", kvp.Key); 393 cdt.AddRow(kvp.Key, kvp.Value, handledStats[kvp.Key]);
394 }
395
396 sb.Append(cdt.ToString());
397 */
398 }
399
400 private void BuildSummaryStatsByCapReport(StringBuilder sb)
401 {
402 /*
403 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
404 cdt.AddColumn("Name", 34);
405 cdt.AddColumn("Req Received", 12);
406 cdt.AddColumn("Req Handled", 12);
407 cdt.Indent = 2;
408
409 Dictionary<string, int> receivedStats = new Dictionary<string, int>();
410 Dictionary<string, int> handledStats = new Dictionary<string, int>();
254 411
255 for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.GetCapsDetails(false, null).GetEnumerator(); kvp2.MoveNext(); ) 412 m_scene.ForEachScenePresence(
413 sp =>
256 { 414 {
257 Uri uri = new Uri(kvp2.Value.ToString()); 415 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
258 caps.AppendFormat(m_showCapsCommandFormat, kvp2.Key, uri.PathAndQuery); 416
417 if (caps == null)
418 return;
419
420 foreach (IRequestHandler reqHandler in caps.CapsHandlers.GetCapsHandlers().Values)
421 {
422 string reqName = reqHandler.Name ?? "";
423
424 if (!receivedStats.ContainsKey(reqName))
425 {
426 receivedStats[reqName] = reqHandler.RequestsReceived;
427 handledStats[reqName] = reqHandler.RequestsHandled;
428 }
429 else
430 {
431 receivedStats[reqName] += reqHandler.RequestsReceived;
432 handledStats[reqName] += reqHandler.RequestsHandled;
433 }
434 }
435
436 foreach (KeyValuePair<string, PollServiceEventArgs> kvp in caps.GetPollHandlers())
437 {
438 string name = kvp.Key;
439 PollServiceEventArgs pollHandler = kvp.Value;
440
441 if (!receivedStats.ContainsKey(name))
442 {
443 receivedStats[name] = pollHandler.RequestsReceived;
444 handledStats[name] = pollHandler.RequestsHandled;
445 }
446 else
447 {
448 receivedStats[name] += pollHandler.RequestsReceived;
449 handledStats[name] += pollHandler.RequestsHandled;
450 }
451 }
259 } 452 }
453 );
454
455 foreach (KeyValuePair<string, int> kvp in receivedStats.OrderByDescending(kp => kp.Value))
456 cdt.AddRow(kvp.Key, kvp.Value, handledStats[kvp.Key]);
457
458 sb.Append(cdt.ToString());
459 */
460 }
461
462 private void HandleShowCapsStatsByUserCommand(string module, string[] cmdParams)
463 {
464 /*
465 if (SceneManager.Instance.CurrentScene != null && SceneManager.Instance.CurrentScene != m_scene)
466 return;
467
468 if (cmdParams.Length != 5 && cmdParams.Length != 7)
469 {
470 MainConsole.Instance.Output("Usage: show caps stats by user [<first-name> <last-name>]");
471 return;
472 }
473
474 StringBuilder sb = new StringBuilder();
475 sb.AppendFormat("Region {0}:\n", m_scene.Name);
476
477 if (cmdParams.Length == 5)
478 {
479 BuildSummaryStatsByUserReport(sb);
480 }
481 else if (cmdParams.Length == 7)
482 {
483 string firstName = cmdParams[5];
484 string lastName = cmdParams[6];
485
486 ScenePresence sp = m_scene.GetScenePresence(firstName, lastName);
487
488 if (sp == null)
489 return;
260 490
261 foreach (KeyValuePair<string, string> kvp3 in kvp.Value.ExternalCapsHandlers) 491 BuildDetailedStatsByUserReport(sb, sp);
262 caps.AppendFormat(m_showCapsCommandFormat, kvp3.Key, kvp3.Value);
263 } 492 }
264 493
265 MainConsole.Instance.Output(caps.ToString()); 494 MainConsole.Instance.Output(sb.ToString());
495 */
496 }
497
498 private void BuildDetailedStatsByUserReport(StringBuilder sb, ScenePresence sp)
499 {
500 /*
501 sb.AppendFormat("Avatar name {0}, type {1}\n", sp.Name, sp.IsChildAgent ? "child" : "root");
502
503 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
504 cdt.AddColumn("Cap Name", 34);
505 cdt.AddColumn("Req Received", 12);
506 cdt.AddColumn("Req Handled", 12);
507 cdt.Indent = 2;
508
509 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
510
511 if (caps == null)
512 return;
513
514 List<CapTableRow> capRows = new List<CapTableRow>();
515
516 foreach (IRequestHandler reqHandler in caps.CapsHandlers.GetCapsHandlers().Values)
517 capRows.Add(new CapTableRow(reqHandler.Name, reqHandler.RequestsReceived, reqHandler.RequestsHandled));
518
519 foreach (KeyValuePair<string, PollServiceEventArgs> kvp in caps.GetPollHandlers())
520 capRows.Add(new CapTableRow(kvp.Key, kvp.Value.RequestsReceived, kvp.Value.RequestsHandled));
521
522 foreach (CapTableRow ctr in capRows.OrderByDescending(ctr => ctr.RequestsReceived))
523 cdt.AddRow(ctr.Name, ctr.RequestsReceived, ctr.RequestsHandled);
524
525 sb.Append(cdt.ToString());
526 */
527 }
528
529 private void BuildSummaryStatsByUserReport(StringBuilder sb)
530 {
531 /*
532 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
533 cdt.AddColumn("Name", 32);
534 cdt.AddColumn("Type", 5);
535 cdt.AddColumn("Req Received", 12);
536 cdt.AddColumn("Req Handled", 12);
537 cdt.Indent = 2;
538
539 m_scene.ForEachScenePresence(
540 sp =>
541 {
542 Caps caps = m_scene.CapsModule.GetCapsForUser(sp.UUID);
543
544 if (caps == null)
545 return;
546
547 Dictionary<string, IRequestHandler> capsHandlers = caps.CapsHandlers.GetCapsHandlers();
548
549 int totalRequestsReceived = 0;
550 int totalRequestsHandled = 0;
551
552 foreach (IRequestHandler reqHandler in capsHandlers.Values)
553 {
554 totalRequestsReceived += reqHandler.RequestsReceived;
555 totalRequestsHandled += reqHandler.RequestsHandled;
556 }
557
558 Dictionary<string, PollServiceEventArgs> capsPollHandlers = caps.GetPollHandlers();
559
560 foreach (PollServiceEventArgs handler in capsPollHandlers.Values)
561 {
562 totalRequestsReceived += handler.RequestsReceived;
563 totalRequestsHandled += handler.RequestsHandled;
564 }
565
566 cdt.AddRow(sp.Name, sp.IsChildAgent ? "child" : "root", totalRequestsReceived, totalRequestsHandled);
567 }
568 );
569
570 sb.Append(cdt.ToString());
571 */
572 }
573
574 private class CapTableRow
575 {
576 public string Name { get; set; }
577 public int RequestsReceived { get; set; }
578 public int RequestsHandled { get; set; }
579
580 public CapTableRow(string name, int requestsReceived, int requestsHandled)
581 {
582 Name = name;
583 RequestsReceived = requestsReceived;
584 RequestsHandled = requestsHandled;
585 }
266 } 586 }
267 } 587 }
268} 588}
diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs
index 1f1568f..0c632b1 100644
--- a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs
@@ -44,11 +44,12 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule
44 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DAExampleModule")] 44 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DAExampleModule")]
45 public class DAExampleModule : INonSharedRegionModule 45 public class DAExampleModule : INonSharedRegionModule
46 { 46 {
47// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 48
49 private static readonly bool ENABLED = false; // enable for testing 49 private readonly bool ENABLED = false; // enable for testing
50 50
51 public const string DANamespace = "DAExample Module"; 51 public const string Namespace = "Example";
52 public const string StoreName = "DA";
52 53
53 protected Scene m_scene; 54 protected Scene m_scene;
54 protected IDialogModule m_dialogMod; 55 protected IDialogModule m_dialogMod;
@@ -65,6 +66,8 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule
65 m_scene = scene; 66 m_scene = scene;
66 m_scene.EventManager.OnSceneGroupMove += OnSceneGroupMove; 67 m_scene.EventManager.OnSceneGroupMove += OnSceneGroupMove;
67 m_dialogMod = m_scene.RequestModuleInterface<IDialogModule>(); 68 m_dialogMod = m_scene.RequestModuleInterface<IDialogModule>();
69
70 m_log.DebugFormat("[DA EXAMPLE MODULE]: Added region {0}", m_scene.Name);
68 } 71 }
69 } 72 }
70 73
@@ -91,7 +94,7 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule
91 if (sop == null) 94 if (sop == null)
92 return true; 95 return true;
93 96
94 if (!sop.DynAttrs.TryGetValue(DANamespace, out attrs)) 97 if (!sop.DynAttrs.TryGetStore(Namespace, StoreName, out attrs))
95 attrs = new OSDMap(); 98 attrs = new OSDMap();
96 99
97 OSDInteger newValue; 100 OSDInteger newValue;
@@ -106,12 +109,14 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule
106 109
107 attrs["moves"] = newValue; 110 attrs["moves"] = newValue;
108 111
109 sop.DynAttrs[DANamespace] = attrs; 112 sop.DynAttrs.SetStore(Namespace, StoreName, attrs);
110 } 113 }
111 114
112 sop.ParentGroup.HasGroupChanged = true; 115 sop.ParentGroup.HasGroupChanged = true;
113 116
114 m_dialogMod.SendGeneralAlert(string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue)); 117 string msg = string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue);
118 m_log.DebugFormat("[DA EXAMPLE MODULE]: {0}", msg);
119 m_dialogMod.SendGeneralAlert(msg);
115 120
116 return true; 121 return true;
117 } 122 }
diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs
index 650aa35..166a994 100644
--- a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs
@@ -64,8 +64,8 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule
64 64
65 private Scene m_scene; 65 private Scene m_scene;
66 private IDialogModule m_dialogMod; 66 private IDialogModule m_dialogMod;
67 67
68 public string Name { get { return "DOExample Module"; } } 68 public string Name { get { return "DO"; } }
69 public Type ReplaceableInterface { get { return null; } } 69 public Type ReplaceableInterface { get { return null; } }
70 70
71 public void Initialise(IConfigSource source) {} 71 public void Initialise(IConfigSource source) {}
@@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule
106 106
107// Console.WriteLine("Here for {0}", so.Name); 107// Console.WriteLine("Here for {0}", so.Name);
108 108
109 if (rootPart.DynAttrs.TryGetValue(DAExampleModule.DANamespace, out attrs)) 109 if (rootPart.DynAttrs.TryGetStore(DAExampleModule.Namespace, DAExampleModule.StoreName, out attrs))
110 { 110 {
111 movesSoFar = attrs["moves"].AsInteger(); 111 movesSoFar = attrs["moves"].AsInteger();
112 112
@@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule
114 "[DO EXAMPLE MODULE]: Found saved moves {0} for {1} in {2}", movesSoFar, so.Name, m_scene.Name); 114 "[DO EXAMPLE MODULE]: Found saved moves {0} for {1} in {2}", movesSoFar, so.Name, m_scene.Name);
115 } 115 }
116 116
117 rootPart.DynObjs.Add(Name, new MyObject(movesSoFar)); 117 rootPart.DynObjs.Add(DAExampleModule.Namespace, Name, new MyObject(movesSoFar));
118 } 118 }
119 119
120 private bool OnSceneGroupMove(UUID groupId, Vector3 delta) 120 private bool OnSceneGroupMove(UUID groupId, Vector3 delta)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index ed867b8..ed14c12 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -280,10 +280,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
280 280
281 private void OnConnectionClosed(IClientAPI client) 281 private void OnConnectionClosed(IClientAPI client)
282 { 282 {
283 if (client.IsLoggingOut) 283 if (client.IsLoggingOut && m_entityTransferStateMachine.UpdateInTransit(client.AgentId, AgentTransferState.Aborting))
284 { 284 {
285 m_entityTransferStateMachine.UpdateInTransit(client.AgentId, AgentTransferState.Aborting);
286
287 m_log.DebugFormat( 285 m_log.DebugFormat(
288 "[ENTITY TRANSFER MODULE]: Aborted teleport request from {0} in {1} due to simultaneous logout", 286 "[ENTITY TRANSFER MODULE]: Aborted teleport request from {0} in {1} due to simultaneous logout",
289 client.Name, Scene.Name); 287 client.Name, Scene.Name);
@@ -318,7 +316,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
318 m_log.DebugFormat( 316 m_log.DebugFormat(
319 "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2}@{3} - agent is already in transit.", 317 "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2}@{3} - agent is already in transit.",
320 sp.Name, sp.UUID, position, regionHandle); 318 sp.Name, sp.UUID, position, regionHandle);
321 319
320 sp.ControllingClient.SendTeleportFailed("Previous teleport process incomplete. Please retry shortly.");
321
322 return; 322 return;
323 } 323 }
324 324
@@ -691,6 +691,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
691 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); 691 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
692 } 692 }
693 693
694 if (version.Equals("SIMULATION/0.2"))
695 TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
696 else
697 TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
698 }
699
700 private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
701 IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason)
702 {
703 ulong destinationHandle = finalDestination.RegionHandle;
704 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
705
706 m_log.DebugFormat(
707 "[ENTITY TRANSFER MODULE]: Using TP V1 for {0} going from {1} to {2}",
708 sp.Name, Scene.Name, finalDestination.RegionName);
709
694 // Let's create an agent there if one doesn't exist yet. 710 // Let's create an agent there if one doesn't exist yet.
695 // NOTE: logout will always be false for a non-HG teleport. 711 // NOTE: logout will always be false for a non-HG teleport.
696 bool logout = false; 712 bool logout = false;
@@ -712,7 +728,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
712 m_interRegionTeleportCancels.Value++; 728 m_interRegionTeleportCancels.Value++;
713 729
714 m_log.DebugFormat( 730 m_log.DebugFormat(
715 "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after CreateAgent on client request", 731 "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after CreateAgent on client request",
716 sp.Name, finalDestination.RegionName, sp.Scene.Name); 732 sp.Name, finalDestination.RegionName, sp.Scene.Name);
717 733
718 return; 734 return;
@@ -734,11 +750,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
734 // OK, it got this agent. Let's close some child agents 750 // OK, it got this agent. Let's close some child agents
735 sp.CloseChildAgents(newRegionX, newRegionY); 751 sp.CloseChildAgents(newRegionX, newRegionY);
736 752
737 IClientIPEndpoint ipepClient; 753 IClientIPEndpoint ipepClient;
754 string capsPath = String.Empty;
738 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) 755 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY))
739 { 756 {
740 m_log.DebugFormat( 757 m_log.DebugFormat(
741 "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for incoming agent {3} from {4}", 758 "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for incoming agent {3} from {4}",
742 finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name); 759 finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name);
743 760
744 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); 761 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent...");
@@ -785,10 +802,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
785 // Let's send a full update of the agent. This is a synchronous call. 802 // Let's send a full update of the agent. This is a synchronous call.
786 AgentData agent = new AgentData(); 803 AgentData agent = new AgentData();
787 sp.CopyTo(agent); 804 sp.CopyTo(agent);
788 agent.Position = position; 805 agent.Position = agentCircuit.startpos;
789 SetCallbackURL(agent, sp.Scene.RegionInfo); 806 SetCallbackURL(agent, sp.Scene.RegionInfo);
790 807
791 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent...");
792 808
793 // We will check for an abort before UpdateAgent since UpdateAgent will require an active viewer to 809 // We will check for an abort before UpdateAgent since UpdateAgent will require an active viewer to
794 // establish th econnection to the destination which makes it return true. 810 // establish th econnection to the destination which makes it return true.
@@ -821,10 +837,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
821 } 837 }
822 838
823 m_log.WarnFormat( 839 m_log.WarnFormat(
824 "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Keeping avatar in source region.", 840 "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Keeping avatar in {2}",
825 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); 841 sp.Name, finalDestination.RegionName, sp.Scene.Name);
826 842
827 Fail(sp, finalDestination, logout, "Connection between viewer and destination region could not be established."); 843 Fail(sp, finalDestination, logout, currentAgentCircuit.SessionID.ToString(), "Connection between viewer and destination region could not be established.");
828 return; 844 return;
829 } 845 }
830 846
@@ -833,10 +849,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
833 m_interRegionTeleportCancels.Value++; 849 m_interRegionTeleportCancels.Value++;
834 850
835 m_log.DebugFormat( 851 m_log.DebugFormat(
836 "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after UpdateAgent on client request", 852 "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after UpdateAgent on client request",
837 sp.Name, finalDestination.RegionName, sp.Scene.Name); 853 sp.Name, finalDestination.RegionName, sp.Scene.Name);
838 854
839 CleanupFailedInterRegionTeleport(sp, finalDestination); 855 CleanupFailedInterRegionTeleport(sp, currentAgentCircuit.SessionID.ToString(), finalDestination);
840 856
841 return; 857 return;
842 } 858 }
@@ -850,6 +866,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
850 // closes our existing agent which is still signalled as root. 866 // closes our existing agent which is still signalled as root.
851 sp.IsChildAgent = true; 867 sp.IsChildAgent = true;
852 868
869 // OK, send TPFinish to the client, so that it starts the process of contacting the destination region
853 if (m_eqModule != null) 870 if (m_eqModule != null)
854 { 871 {
855 m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID); 872 m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID);
@@ -879,8 +896,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
879 m_log.WarnFormat( 896 m_log.WarnFormat(
880 "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", 897 "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.",
881 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); 898 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
882 899
883 Fail(sp, finalDestination, logout, "Destination region did not signal teleport completion."); 900 Fail(sp, finalDestination, logout, currentAgentCircuit.SessionID.ToString(), "Destination region did not signal teleport completion.");
884 901
885 return; 902 return;
886 } 903 }
@@ -908,13 +925,187 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
908 925
909 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) 926 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg))
910 { 927 {
928 if (!sp.Scene.IncomingPreCloseAgent(sp))
929 return;
930
911 // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before 931 // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before
912 // they regard the new region as the current region after receiving the AgentMovementComplete 932 // they regard the new region as the current region after receiving the AgentMovementComplete
913 // response. If close is sent before then, it will cause the viewer to quit instead. 933 // response. If close is sent before then, it will cause the viewer to quit instead.
914 // 934 //
915 // This sleep can be increased if necessary. However, whilst it's active, 935 // This sleep can be increased if necessary. However, whilst it's active,
916 // an agent cannot teleport back to this region if it has teleported away. 936 // an agent cannot teleport back to this region if it has teleported away.
917 Thread.Sleep(3000); 937 Thread.Sleep(2000);
938
939 sp.Scene.IncomingCloseAgent(sp.UUID, false);
940 }
941 else
942 {
943 // now we have a child agent in this region.
944 sp.Reset();
945 }
946 }
947
948 private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
949 IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason)
950 {
951 ulong destinationHandle = finalDestination.RegionHandle;
952 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
953
954 // Let's create an agent there if one doesn't exist yet.
955 // NOTE: logout will always be false for a non-HG teleport.
956 bool logout = false;
957 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout))
958 {
959 m_interRegionTeleportFailures.Value++;
960
961 sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason));
962
963 m_log.DebugFormat(
964 "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}",
965 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason);
966
967 return;
968 }
969
970 if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Cancelling)
971 {
972 m_interRegionTeleportCancels.Value++;
973
974 m_log.DebugFormat(
975 "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after CreateAgent on client request",
976 sp.Name, finalDestination.RegionName, sp.Scene.Name);
977
978 return;
979 }
980 else if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Aborting)
981 {
982 m_interRegionTeleportAborts.Value++;
983
984 m_log.DebugFormat(
985 "[ENTITY TRANSFER MODULE]: Aborted teleport of {0} to {1} from {2} after CreateAgent due to previous client close.",
986 sp.Name, finalDestination.RegionName, sp.Scene.Name);
987
988 return;
989 }
990
991 // Past this point we have to attempt clean up if the teleport fails, so update transfer state.
992 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
993
994 IClientIPEndpoint ipepClient;
995 string capsPath = String.Empty;
996 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY))
997 {
998 m_log.DebugFormat(
999 "[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for agent {3} from {4}",
1000 finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name);
1001
1002 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent...");
1003 #region IP Translation for NAT
1004 // Uses ipepClient above
1005 if (sp.ClientView.TryGet(out ipepClient))
1006 {
1007 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
1008 }
1009 #endregion
1010 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
1011 }
1012 else
1013 {
1014 agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle);
1015 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
1016 }
1017
1018 // We need to set this here to avoid an unlikely race condition when teleporting to a neighbour simulator,
1019 // where that neighbour simulator could otherwise request a child agent create on the source which then
1020 // closes our existing agent which is still signalled as root.
1021 //sp.IsChildAgent = true;
1022
1023 // New protocol: send TP Finish directly, without prior ES or EAC. That's what happens in the Linden grid
1024 if (m_eqModule != null)
1025 m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID);
1026 else
1027 sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4,
1028 teleportFlags, capsPath);
1029
1030 m_log.DebugFormat(
1031 "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}",
1032 capsPath, sp.Scene.RegionInfo.RegionName, sp.Name);
1033
1034 // Let's send a full update of the agent.
1035 AgentData agent = new AgentData();
1036 sp.CopyTo(agent);
1037 agent.Position = agentCircuit.startpos;
1038 agent.SenderWantsToWaitForRoot = true;
1039 //SetCallbackURL(agent, sp.Scene.RegionInfo);
1040
1041 // Reset the do not close flag. This must be done before the destination opens child connections (here
1042 // triggered by UpdateAgent) to avoid race conditions. However, we also want to reset it as late as possible
1043 // to avoid a situation where an unexpectedly early call to Scene.NewUserConnection() wrongly results
1044 // in no close.
1045 sp.DoNotCloseAfterTeleport = false;
1046
1047 // Send the Update. If this returns true, we know the client has contacted the destination
1048 // via CompleteMovementIntoRegion, so we can let go.
1049 // If it returns false, something went wrong, and we need to abort.
1050 if (!UpdateAgent(reg, finalDestination, agent, sp))
1051 {
1052 if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Aborting)
1053 {
1054 m_interRegionTeleportAborts.Value++;
1055
1056 m_log.DebugFormat(
1057 "[ENTITY TRANSFER MODULE]: Aborted teleport of {0} to {1} from {2} after UpdateAgent due to previous client close.",
1058 sp.Name, finalDestination.RegionName, sp.Scene.Name);
1059
1060 return;
1061 }
1062
1063 m_log.WarnFormat(
1064 "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Keeping avatar in {2}",
1065 sp.Name, finalDestination.RegionName, sp.Scene.Name);
1066
1067 Fail(sp, finalDestination, logout, currentAgentCircuit.SessionID.ToString(), "Connection between viewer and destination region could not be established.");
1068 return;
1069 }
1070
1071 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
1072
1073 // Need to signal neighbours whether child agents may need closing irrespective of whether this
1074 // one needed closing. We also need to close child agents as quickly as possible to avoid complicated
1075 // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back
1076 // to a neighbour A2 then off to a non-neighbour C). Closing child agents any later requires complex
1077 // distributed checks to avoid problems in rapid reteleporting scenarios and where child agents are
1078 // abandoned without proper close by viewer but then re-used by an incoming connection.
1079 sp.CloseChildAgents(newRegionX, newRegionY);
1080
1081 // May need to logout or other cleanup
1082 AgentHasMovedAway(sp, logout);
1083
1084 // Well, this is it. The agent is over there.
1085 KillEntity(sp.Scene, sp.LocalId);
1086
1087 // Now let's make it officially a child agent
1088 sp.MakeChildAgent();
1089
1090 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
1091 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg))
1092 {
1093 if (!sp.Scene.IncomingPreCloseAgent(sp))
1094 return;
1095
1096 // RED ALERT!!!!
1097 // PLEASE DO NOT DECREASE THIS WAIT TIME UNDER ANY CIRCUMSTANCES.
1098 // THE VIEWERS SEEM TO NEED SOME TIME AFTER RECEIVING MoveAgentIntoRegion
1099 // BEFORE THEY SETTLE IN THE NEW REGION.
1100 // DECREASING THE WAIT TIME HERE WILL EITHER RESULT IN A VIEWER CRASH OR
1101 // IN THE AVIE BEING PLACED IN INFINITY FOR A COUPLE OF SECONDS.
1102 Thread.Sleep(15000);
1103
1104 // OK, it got this agent. Let's close everything
1105 // If we shouldn't close the agent due to some other region renewing the connection
1106 // then this will be handled in IncomingCloseAgent under lock conditions
1107 m_log.DebugFormat(
1108 "[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport", sp.Name, Scene.Name);
918 1109
919 sp.Scene.IncomingCloseAgent(sp.UUID, false); 1110 sp.Scene.IncomingCloseAgent(sp.UUID, false);
920 } 1111 }
@@ -934,17 +1125,20 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
934 /// <remarks> 1125 /// <remarks>
935 /// <param name='sp'> </param> 1126 /// <param name='sp'> </param>
936 /// <param name='finalDestination'></param> 1127 /// <param name='finalDestination'></param>
937 protected virtual void CleanupFailedInterRegionTeleport(ScenePresence sp, GridRegion finalDestination) 1128 protected virtual void CleanupFailedInterRegionTeleport(ScenePresence sp, string auth_token, GridRegion finalDestination)
938 { 1129 {
939 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); 1130 m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
940 1131
941 sp.IsChildAgent = false; 1132 if (sp.IsChildAgent) // We had set it to child before attempted TP (V1)
942 ReInstantiateScripts(sp); 1133 {
943 1134 sp.IsChildAgent = false;
944 EnableChildAgents(sp); 1135 ReInstantiateScripts(sp);
945 1136
1137 EnableChildAgents(sp);
1138 }
946 // Finally, kill the agent we just created at the destination. 1139 // Finally, kill the agent we just created at the destination.
947 Scene.SimulationService.CloseAgent(finalDestination, sp.UUID); 1140 // XXX: Possibly this should be done asynchronously.
1141 Scene.SimulationService.CloseAgent(finalDestination, sp.UUID, auth_token);
948 } 1142 }
949 1143
950 /// <summary> 1144 /// <summary>
@@ -954,9 +1148,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
954 /// <param name='finalDestination'></param> 1148 /// <param name='finalDestination'></param>
955 /// <param name='logout'></param> 1149 /// <param name='logout'></param>
956 /// <param name='reason'>Human readable reason for teleport failure. Will be sent to client.</param> 1150 /// <param name='reason'>Human readable reason for teleport failure. Will be sent to client.</param>
957 protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout, string reason) 1151 protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout, string auth_code, string reason)
958 { 1152 {
959 CleanupFailedInterRegionTeleport(sp, finalDestination); 1153 CleanupFailedInterRegionTeleport(sp, auth_code, finalDestination);
960 1154
961 m_interRegionTeleportFailures.Value++; 1155 m_interRegionTeleportFailures.Value++;
962 1156
@@ -1654,10 +1848,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1654 List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); 1848 List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles);
1655 List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); 1849 List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles);
1656 1850
1657 //Dump("Current Neighbors", neighbourHandles); 1851// Dump("Current Neighbors", neighbourHandles);
1658 //Dump("Previous Neighbours", previousRegionNeighbourHandles); 1852// Dump("Previous Neighbours", previousRegionNeighbourHandles);
1659 //Dump("New Neighbours", newRegions); 1853// Dump("New Neighbours", newRegions);
1660 //Dump("Old Neighbours", oldRegions); 1854// Dump("Old Neighbours", oldRegions);
1661 1855
1662 /// Update the scene presence's known regions here on this region 1856 /// Update the scene presence's known regions here on this region
1663 sp.DropOldNeighbours(oldRegions); 1857 sp.DropOldNeighbours(oldRegions);
@@ -1665,8 +1859,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1665 /// Collect as many seeds as possible 1859 /// Collect as many seeds as possible
1666 Dictionary<ulong, string> seeds; 1860 Dictionary<ulong, string> seeds;
1667 if (sp.Scene.CapsModule != null) 1861 if (sp.Scene.CapsModule != null)
1668 seeds 1862 seeds = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID));
1669 = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID));
1670 else 1863 else
1671 seeds = new Dictionary<ulong, string>(); 1864 seeds = new Dictionary<ulong, string>();
1672 1865
@@ -1736,6 +1929,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1736 newAgent = true; 1929 newAgent = true;
1737 else 1930 else
1738 newAgent = false; 1931 newAgent = false;
1932// continue;
1739 1933
1740 if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) 1934 if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle)
1741 { 1935 {
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index d372c0e..1cf1884 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -53,8 +53,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54 54
55 private int m_levelHGTeleport = 0; 55 private int m_levelHGTeleport = 0;
56 private string m_ThisHomeURI;
56 57
57 private GatekeeperServiceConnector m_GatekeeperConnector; 58 private GatekeeperServiceConnector m_GatekeeperConnector;
59 private IUserAgentService m_UAS;
58 60
59 protected bool m_RestrictAppearanceAbroad; 61 protected bool m_RestrictAppearanceAbroad;
60 protected string m_AccountName; 62 protected string m_AccountName;
@@ -143,6 +145,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
143 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); 145 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
144 } 146 }
145 } 147 }
148
149 moduleConfig = source.Configs["Hypergrid"];
150 if (moduleConfig != null)
151 {
152 m_ThisHomeURI = moduleConfig.GetString("HomeURI", string.Empty);
153 if (m_ThisHomeURI != string.Empty && !m_ThisHomeURI.EndsWith("/"))
154 m_ThisHomeURI += '/';
155 }
146 } 156 }
147 157
148 public override void AddRegion(Scene scene) 158 public override void AddRegion(Scene scene)
@@ -161,11 +171,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
161 if (!so.IsAttachment) 171 if (!so.IsAttachment)
162 return; 172 return;
163 173
164 if (so.Scene.UserManagementModule.IsLocalGridUser(so.AttachedAvatar)) 174 if (so.AttachedAvatar == UUID.Zero || Scene.UserManagementModule.IsLocalGridUser(so.AttachedAvatar))
165 return; 175 return;
166 176
167 // foreign user 177 // foreign user
168 AgentCircuitData aCircuit = so.Scene.AuthenticateHandler.GetAgentCircuitData(so.AttachedAvatar); 178 AgentCircuitData aCircuit = Scene.AuthenticateHandler.GetAgentCircuitData(so.AttachedAvatar);
169 if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) 179 if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
170 { 180 {
171 if (aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) 181 if (aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
@@ -173,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
173 string url = aCircuit.ServiceURLs["AssetServerURI"].ToString(); 183 string url = aCircuit.ServiceURLs["AssetServerURI"].ToString();
174 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Incoming attachement {0} for HG user {1} with asset server {2}", so.Name, so.AttachedAvatar, url); 184 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Incoming attachement {0} for HG user {1} with asset server {2}", so.Name, so.AttachedAvatar, url);
175 Dictionary<UUID, AssetType> ids = new Dictionary<UUID, AssetType>(); 185 Dictionary<UUID, AssetType> ids = new Dictionary<UUID, AssetType>();
176 HGUuidGatherer uuidGatherer = new HGUuidGatherer(so.Scene.AssetService, url); 186 HGUuidGatherer uuidGatherer = new HGUuidGatherer(Scene.AssetService, url);
177 uuidGatherer.GatherAssetUuids(so, ids); 187 uuidGatherer.GatherAssetUuids(so, ids);
178 188
179 foreach (KeyValuePair<UUID, AssetType> kvp in ids) 189 foreach (KeyValuePair<UUID, AssetType> kvp in ids)
@@ -194,7 +204,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
194 base.RegionLoaded(scene); 204 base.RegionLoaded(scene);
195 205
196 if (m_Enabled) 206 if (m_Enabled)
207 {
197 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); 208 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
209 m_UAS = scene.RequestModuleInterface<IUserAgentService>();
210 if (m_UAS == null)
211 m_UAS = new UserAgentServiceConnector(m_ThisHomeURI);
212
213 }
198 } 214 }
199 215
200 public override void RemoveRegion(Scene scene) 216 public override void RemoveRegion(Scene scene)
@@ -272,8 +288,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
272 if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) 288 if (agentCircuit.ServiceURLs.ContainsKey("HomeURI"))
273 { 289 {
274 string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); 290 string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString();
275 IUserAgentService connector = new UserAgentServiceConnector(userAgentDriver); 291 IUserAgentService connector;
276 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); 292
293 if (userAgentDriver.Equals(m_ThisHomeURI) && m_UAS != null)
294 connector = m_UAS;
295 else
296 connector = new UserAgentServiceConnector(userAgentDriver);
297
298 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, false, out reason);
277 logout = success; // flag for later logout from this grid; this is an HG TP 299 logout = success; // flag for later logout from this grid; this is an HG TP
278 300
279 if (success) 301 if (success)
@@ -552,12 +574,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
552 if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) 574 if (uMan != null && uMan.IsLocalGridUser(obj.AgentId))
553 { 575 {
554 // local grid user 576 // local grid user
577 m_UAS.LogoutAgent(obj.AgentId, obj.SessionId);
555 return; 578 return;
556 } 579 }
557 580
558 AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode); 581 AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode);
559 582 if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("HomeURI"))
560 if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
561 { 583 {
562 string url = aCircuit.ServiceURLs["HomeURI"].ToString(); 584 string url = aCircuit.ServiceURLs["HomeURI"].ToString();
563 IUserAgentService security = new UserAgentServiceConnector(url); 585 IUserAgentService security = new UserAgentServiceConnector(url);
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
index 7871eda..144895c 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs
@@ -73,6 +73,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
73 73
74 private AssetMetadata FetchMetadata(string url, UUID assetID) 74 private AssetMetadata FetchMetadata(string url, UUID assetID)
75 { 75 {
76 if (string.IsNullOrEmpty(url))
77 return null;
78
76 if (!url.EndsWith("/") && !url.EndsWith("=")) 79 if (!url.EndsWith("/") && !url.EndsWith("="))
77 url = url + "/"; 80 url = url + "/";
78 81
@@ -92,6 +95,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
92 AssetBase asset = m_scene.AssetService.Get(assetID.ToString()); 95 AssetBase asset = m_scene.AssetService.Get(assetID.ToString());
93 if (asset == null) 96 if (asset == null)
94 { 97 {
98 if (string.IsNullOrEmpty(url))
99 return null;
100
95 if (!url.EndsWith("/") && !url.EndsWith("=")) 101 if (!url.EndsWith("/") && !url.EndsWith("="))
96 url = url + "/"; 102 url = url + "/";
97 103
@@ -109,6 +115,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
109 115
110 public bool PostAsset(string url, AssetBase asset) 116 public bool PostAsset(string url, AssetBase asset)
111 { 117 {
118 if (string.IsNullOrEmpty(url))
119 return false;
120
112 if (asset != null) 121 if (asset != null)
113 { 122 {
114 if (!url.EndsWith("/") && !url.EndsWith("=")) 123 if (!url.EndsWith("/") && !url.EndsWith("="))
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index b2b628d..ce7ed26 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -62,6 +62,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
62 private string m_ThisGatekeeper; 62 private string m_ThisGatekeeper;
63 private bool m_RestrictInventoryAccessAbroad; 63 private bool m_RestrictInventoryAccessAbroad;
64 64
65 private bool m_bypassPermissions = true;
66
65// private bool m_Initialized = false; 67// private bool m_Initialized = false;
66 68
67 #region INonSharedRegionModule 69 #region INonSharedRegionModule
@@ -100,6 +102,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
100 } 102 }
101 else 103 else
102 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!"); 104 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
105
106 m_bypassPermissions = !Util.GetConfigVarFromSections<bool>(source, "serverside_object_permissions",
107 new string[] { "Startup", "Permissions" }, true);
108
103 } 109 }
104 } 110 }
105 } 111 }
@@ -114,6 +120,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
114 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; 120 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem;
115 scene.EventManager.OnTeleportStart += TeleportStart; 121 scene.EventManager.OnTeleportStart += TeleportStart;
116 scene.EventManager.OnTeleportFail += TeleportFail; 122 scene.EventManager.OnTeleportFail += TeleportFail;
123
124 // We're fgoing to enforce some stricter permissions if Outbound is false
125 scene.Permissions.OnTakeObject += CanTakeObject;
126 scene.Permissions.OnTakeCopyObject += CanTakeObject;
127 scene.Permissions.OnTransferUserInventory += OnTransferUserInventory;
117 } 128 }
118 129
119 #endregion 130 #endregion
@@ -135,7 +146,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
135 if (sp is ScenePresence) 146 if (sp is ScenePresence)
136 { 147 {
137 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId); 148 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
138 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) 149 if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
139 { 150 {
140 if (m_RestrictInventoryAccessAbroad) 151 if (m_RestrictInventoryAccessAbroad)
141 { 152 {
@@ -185,8 +196,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
185 } 196 }
186 } 197 }
187 198
188 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 199 public void UploadInventoryItem(UUID avatarID, AssetType type, UUID assetID, string name, int userlevel)
189 { 200 {
201 if (type == AssetType.Link)
202 return;
203
190 string userAssetServer = string.Empty; 204 string userAssetServer = string.Empty;
191 if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) 205 if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission)
192 { 206 {
@@ -221,7 +235,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
221 { 235 {
222 UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data); 236 UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data);
223 237
224 UploadInventoryItem(remoteClient.AgentId, newAssetID, "", 0); 238 UploadInventoryItem(remoteClient.AgentId, AssetType.Unknown, newAssetID, "", 0);
225 239
226 return newAssetID; 240 return newAssetID;
227 } 241 }
@@ -232,7 +246,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
232 protected override void ExportAsset(UUID agentID, UUID assetID) 246 protected override void ExportAsset(UUID agentID, UUID assetID)
233 { 247 {
234 if (!assetID.Equals(UUID.Zero)) 248 if (!assetID.Equals(UUID.Zero))
235 UploadInventoryItem(agentID, assetID, "", 0); 249 UploadInventoryItem(agentID, AssetType.Unknown, assetID, "", 0);
236 else 250 else
237 m_log.Debug("[HGScene]: Scene.Inventory did not create asset"); 251 m_log.Debug("[HGScene]: Scene.Inventory did not create asset");
238 } 252 }
@@ -244,7 +258,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
244 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 258 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
245 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 259 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
246 { 260 {
247 m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); 261 m_log.DebugFormat("[HGScene]: RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID);
248 262
249 //if (fromTaskID.Equals(UUID.Zero)) 263 //if (fromTaskID.Equals(UUID.Zero))
250 //{ 264 //{
@@ -297,7 +311,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
297 if (m_Scene.TryGetScenePresence(userID, out sp)) 311 if (m_Scene.TryGetScenePresence(userID, out sp))
298 { 312 {
299 AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 313 AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
300 if (aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) 314 if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
301 { 315 {
302 assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString(); 316 assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString();
303 assetServerURL = assetServerURL.Trim(new char[] { '/' }); 317 assetServerURL = assetServerURL.Trim(new char[] { '/' });
@@ -348,7 +362,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
348 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId); 362 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId);
349 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); 363 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
350 364
351 inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray()); 365 List<InventoryFolderBase> keep = new List<InventoryFolderBase>();
366
367 foreach (InventoryFolderBase f in content.Folders)
368 {
369 if (f.Name != "My Suitcase" && f.Name != "Current Outfit")
370 keep.Add(f);
371 }
372
373 inv.SendBulkUpdateInventory(keep.ToArray(), content.Items.ToArray());
352 } 374 }
353 } 375 }
354 } 376 }
@@ -381,7 +403,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
381 403
382 foreach (InventoryFolderBase f in content.Folders) 404 foreach (InventoryFolderBase f in content.Folders)
383 { 405 {
384 if (f.Name != "My Suitcase") 406 if (f.Name != "My Suitcase" && f.Name != "Current Outfit")
385 { 407 {
386 f.Name = f.Name + " (Unavailable)"; 408 f.Name = f.Name + " (Unavailable)";
387 keep.Add(f); 409 keep.Add(f);
@@ -406,5 +428,36 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
406 } 428 }
407 429
408 #endregion 430 #endregion
431
432 #region Permissions
433
434 private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene)
435 {
436 if (m_bypassPermissions) return true;
437
438 if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(stealer))
439 {
440 SceneObjectGroup sog = null;
441 if (m_Scene.TryGetSceneObjectGroup(objectID, out sog) && sog.OwnerID == stealer)
442 return true;
443
444 return false;
445 }
446
447 return true;
448 }
449
450 private bool OnTransferUserInventory(UUID itemID, UUID userID, UUID recipientID)
451 {
452 if (m_bypassPermissions) return true;
453
454 if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(recipientID))
455 return false;
456
457 return true;
458 }
459
460
461 #endregion
409 } 462 }
410} \ No newline at end of file 463} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index d09ea3e..89bb037 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -358,7 +358,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
358 bool asAttachment) 358 bool asAttachment)
359 { 359 {
360 CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); 360 CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
361 Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); 361// Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
362 362
363 foreach (SceneObjectGroup objectGroup in objlist) 363 foreach (SceneObjectGroup objectGroup in objlist)
364 { 364 {
@@ -379,7 +379,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
379 objectGroup.AbsolutePosition.Z); 379 objectGroup.AbsolutePosition.Z);
380 380
381 Quaternion inventoryStoredRotation = objectGroup.GroupRotation; 381 Quaternion inventoryStoredRotation = objectGroup.GroupRotation;
382 originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; 382 //originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
383 383
384 // Restore attachment data after trip through the sim 384 // Restore attachment data after trip through the sim
385 if (objectGroup.RootPart.AttachPoint > 0) 385 if (objectGroup.RootPart.AttachPoint > 0)
@@ -423,9 +423,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
423 else 423 else
424 itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment); 424 itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment);
425 425
426 // Restore the position of each group now that it has been stored to inventory. 426// // Restore the position of each group now that it has been stored to inventory.
427 foreach (SceneObjectGroup objectGroup in objlist) 427// foreach (SceneObjectGroup objectGroup in objlist)
428 objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; 428// objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
429 429
430 InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); 430 InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
431 431
@@ -707,6 +707,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
707 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); 707 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
708 if (f != null) 708 if (f != null)
709 folder = m_Scene.InventoryService.GetFolder(f); 709 folder = m_Scene.InventoryService.GetFolder(f);
710
711 if(folder.Type == 14 || folder.Type == 16)
712 {
713 // folder.Type = 6;
714 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.Object);
715 }
710 } 716 }
711 } 717 }
712 718
@@ -803,7 +809,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
803 } 809 }
804 810
805 objlist.Add(g); 811 objlist.Add(g);
806 veclist.Add(new Vector3(0, 0, 0)); 812 veclist.Add(Vector3.Zero);
807 813
808 float offsetHeight = 0; 814 float offsetHeight = 0;
809 pos = m_Scene.GetNewRezLocation( 815 pos = m_Scene.GetNewRezLocation(
@@ -880,7 +886,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
880 return null; 886 return null;
881 } 887 }
882 888
883 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, rez_pos, attachment)) 889 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, rez_pos, veclist, attachment))
884 return null; 890 return null;
885 891
886 for (int i = 0; i < objlist.Count; i++) 892 for (int i = 0; i < objlist.Count; i++)
@@ -979,10 +985,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
979 /// <param name="item"></param> 985 /// <param name="item"></param>
980 /// <param name="objlist"></param> 986 /// <param name="objlist"></param>
981 /// <param name="pos"></param> 987 /// <param name="pos"></param>
988 /// <param name="veclist">
989 /// List of vector position adjustments for a coalesced objects. For ordinary objects
990 /// this list will contain just Vector3.Zero. The order of adjustments must match the order of objlist
991 /// </param>
982 /// <param name="isAttachment"></param> 992 /// <param name="isAttachment"></param>
983 /// <returns>true if we can processed with rezzing, false if we need to abort</returns> 993 /// <returns>true if we can processed with rezzing, false if we need to abort</returns>
984 private bool DoPreRezWhenFromItem( 994 private bool DoPreRezWhenFromItem(
985 IClientAPI remoteClient, InventoryItemBase item, List<SceneObjectGroup> objlist, Vector3 pos, bool isAttachment) 995 IClientAPI remoteClient, InventoryItemBase item, List<SceneObjectGroup> objlist,
996 Vector3 pos, List<Vector3> veclist, bool isAttachment)
986 { 997 {
987 UUID fromUserInventoryItemId = UUID.Zero; 998 UUID fromUserInventoryItemId = UUID.Zero;
988 999
@@ -1005,28 +1016,29 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1005 } 1016 }
1006 } 1017 }
1007 1018
1008 int primcount = 0; 1019 for (int i = 0; i < objlist.Count; i++)
1009 foreach (SceneObjectGroup g in objlist)
1010 primcount += g.PrimCount;
1011
1012 if (!m_Scene.Permissions.CanRezObject(
1013 primcount, remoteClient.AgentId, pos)
1014 && !isAttachment)
1015 { 1020 {
1016 // The client operates in no fail mode. It will 1021 SceneObjectGroup g = objlist[i];
1017 // have already removed the item from the folder
1018 // if it's no copy.
1019 // Put it back if it's not an attachment
1020 //
1021 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!isAttachment))
1022 remoteClient.SendBulkUpdateInventory(item);
1023 1022
1024 ILandObject land = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y); 1023 if (!m_Scene.Permissions.CanRezObject(
1025 remoteClient.SendAlertMessage(string.Format( 1024 g.PrimCount, remoteClient.AgentId, pos + veclist[i])
1026 "Can't rez object '{0}' at <{1:F3}, {2:F3}, {3:F3}> on parcel '{4}' in region {5}.", 1025 && !isAttachment)
1027 item.Name, pos.X, pos.Y, pos.Z, land != null ? land.LandData.Name : "Unknown", m_Scene.RegionInfo.RegionName)); 1026 {
1027 // The client operates in no fail mode. It will
1028 // have already removed the item from the folder
1029 // if it's no copy.
1030 // Put it back if it's not an attachment
1031 //
1032 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!isAttachment))
1033 remoteClient.SendBulkUpdateInventory(item);
1028 1034
1029 return false; 1035 ILandObject land = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y);
1036 remoteClient.SendAlertMessage(string.Format(
1037 "Can't rez object '{0}' at <{1:F3}, {2:F3}, {3:F3}> on parcel '{4}' in region {5}.",
1038 item.Name, pos.X, pos.Y, pos.Z, land != null ? land.LandData.Name : "Unknown", m_Scene.Name));
1039
1040 return false;
1041 }
1030 } 1042 }
1031 1043
1032 for (int i = 0; i < objlist.Count; i++) 1044 for (int i = 0; i < objlist.Count; i++)
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
index d07cff4..69d7e16 100644
--- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
@@ -176,7 +176,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
176 m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName); 176 m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
177 simpleName = GetInventoryPathFromName(simpleName); 177 simpleName = GetInventoryPathFromName(simpleName);
178 178
179 InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName, false); 179 InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, simpleName, iarFileName, false);
180 try 180 try
181 { 181 {
182 HashSet<InventoryNodeBase> nodes = archread.Execute(); 182 HashSet<InventoryNodeBase> nodes = archread.Execute();
@@ -185,7 +185,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
185 // didn't find the subfolder with the given name; place it on the top 185 // didn't find the subfolder with the given name; place it on the top
186 m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName); 186 m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
187 archread.Close(); 187 archread.Close();
188 archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName, false); 188 archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, "/", iarFileName, false);
189 archread.Execute(); 189 archread.Execute();
190 } 190 }
191 191
diff --git a/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs b/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs
new file mode 100644
index 0000000..8838612
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Search/BasicSearchModule.cs
@@ -0,0 +1,197 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Collections.Generic;
29using System.IO;
30using System.Reflection;
31using System.Threading;
32
33using OpenSim.Framework;
34using OpenSim.Framework.Console;
35using OpenSim.Framework.Monitoring;
36using OpenSim.Region.ClientStack.LindenUDP;
37using OpenSim.Region.Framework;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40using OpenSim.Services.Interfaces;
41using OpenSim.Services.Connectors.Hypergrid;
42
43using OpenMetaverse;
44using OpenMetaverse.Packets;
45using log4net;
46using Nini.Config;
47using Mono.Addins;
48
49using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
50
51namespace OpenSim.Region.CoreModules.Framework.Search
52{
53 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BasicSearchModule")]
54 public class BasicSearchModule : ISharedRegionModule
55 {
56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
57
58 protected bool m_Enabled;
59 protected List<Scene> m_Scenes = new List<Scene>();
60
61 private IGroupsModule m_GroupsService = null;
62
63 #region ISharedRegionModule
64
65 public void Initialise(IConfigSource config)
66 {
67 string umanmod = config.Configs["Modules"].GetString("SearchModule", Name);
68 if (umanmod == Name)
69 {
70 m_Enabled = true;
71 m_log.DebugFormat("[BASIC SEARCH MODULE]: {0} is enabled", Name);
72 }
73 }
74
75 public bool IsSharedModule
76 {
77 get { return true; }
78 }
79
80 public virtual string Name
81 {
82 get { return "BasicSearchModule"; }
83 }
84
85 public Type ReplaceableInterface
86 {
87 get { return null; }
88 }
89
90 public void AddRegion(Scene scene)
91 {
92 if (m_Enabled)
93 {
94 m_Scenes.Add(scene);
95
96 scene.EventManager.OnMakeRootAgent += new Action<ScenePresence>(EventManager_OnMakeRootAgent);
97 scene.EventManager.OnMakeChildAgent += new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
98 }
99 }
100
101 public void RemoveRegion(Scene scene)
102 {
103 if (m_Enabled)
104 {
105 m_Scenes.Remove(scene);
106
107 scene.EventManager.OnMakeRootAgent -= new Action<ScenePresence>(EventManager_OnMakeRootAgent);
108 scene.EventManager.OnMakeChildAgent -= new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
109 }
110 }
111
112 public void RegionLoaded(Scene s)
113 {
114 if (!m_Enabled)
115 return;
116
117 if (m_GroupsService == null)
118 {
119 m_GroupsService = s.RequestModuleInterface<IGroupsModule>();
120
121 // No Groups Service Connector, then group search won't work...
122 if (m_GroupsService == null)
123 m_log.Warn("[BASIC SEARCH MODULE]: Could not get IGroupsModule");
124 }
125 }
126
127 public void PostInitialise()
128 {
129 }
130
131 public void Close()
132 {
133 m_Scenes.Clear();
134 }
135
136 #endregion ISharedRegionModule
137
138
139 #region Event Handlers
140
141 void EventManager_OnMakeRootAgent(ScenePresence sp)
142 {
143 sp.ControllingClient.OnDirFindQuery += OnDirFindQuery;
144 }
145
146 void EventManager_OnMakeChildAgent(ScenePresence sp)
147 {
148 sp.ControllingClient.OnDirFindQuery -= OnDirFindQuery;
149 }
150
151 void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart)
152 {
153 if (((DirFindFlags)queryFlags & DirFindFlags.People) == DirFindFlags.People)
154 {
155 if (string.IsNullOrEmpty(queryText))
156 remoteClient.SendDirPeopleReply(queryID, new DirPeopleReplyData[0]);
157
158 List<UserAccount> accounts = m_Scenes[0].UserAccountService.GetUserAccounts(m_Scenes[0].RegionInfo.ScopeID, queryText);
159 DirPeopleReplyData[] hits = new DirPeopleReplyData[accounts.Count];
160 int i = 0;
161 foreach (UserAccount acc in accounts)
162 {
163 DirPeopleReplyData d = new DirPeopleReplyData();
164 d.agentID = acc.PrincipalID;
165 d.firstName = acc.FirstName;
166 d.lastName = acc.LastName;
167 d.online = false;
168
169 hits[i++] = d;
170 }
171
172 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
173 remoteClient.SendDirPeopleReply(queryID, hits);
174 }
175 else if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
176 {
177 if (m_GroupsService == null)
178 {
179 m_log.Warn("[BASIC SEARCH MODULE]: Groups service is not available. Unable to search groups.");
180 remoteClient.SendAlertMessage("Groups search is not enabled");
181 return;
182 }
183
184 if (string.IsNullOrEmpty(queryText))
185 remoteClient.SendDirGroupsReply(queryID, new DirGroupsReplyData[0]);
186
187 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
188 remoteClient.SendDirGroupsReply(queryID, m_GroupsService.FindGroups(remoteClient, queryText).ToArray());
189 }
190
191 }
192
193 #endregion Event Handlers
194
195 }
196
197} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/ServiceThrottle/ServiceThrottleModule.cs b/OpenSim/Region/CoreModules/Framework/ServiceThrottle/ServiceThrottleModule.cs
new file mode 100644
index 0000000..a70261e
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/ServiceThrottle/ServiceThrottleModule.cs
@@ -0,0 +1,256 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Threading;
32using log4net;
33using Mono.Addins;
34using Nini.Config;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Region.Framework.Interfaces;
38using OpenSim.Framework.Monitoring;
39using OpenSim.Region.Framework.Scenes;
40using GridRegion = OpenSim.Services.Interfaces.GridRegion;
41
42namespace OpenSim.Region.CoreModules.Framework
43{
44 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "GridServiceThrottleModule")]
45 public class ServiceThrottleModule : ISharedRegionModule, IServiceThrottleModule
46 {
47 private static readonly ILog m_log = LogManager.GetLogger(
48 MethodBase.GetCurrentMethod().DeclaringType);
49
50 private readonly List<Scene> m_scenes = new List<Scene>();
51 private System.Timers.Timer m_timer = new System.Timers.Timer();
52
53 private Queue<Action> m_RequestQueue = new Queue<Action>();
54 private Dictionary<string, List<string>> m_Pending = new Dictionary<string, List<string>>();
55 private int m_Interval;
56
57 #region ISharedRegionModule
58
59 public void Initialise(IConfigSource config)
60 {
61 m_Interval = Util.GetConfigVarFromSections<int>(config, "Interval", new string[] { "ServiceThrottle" }, 5000);
62
63 m_timer = new System.Timers.Timer();
64 m_timer.AutoReset = false;
65 m_timer.Enabled = true;
66 m_timer.Interval = 15000; // 15 secs at first
67 m_timer.Elapsed += ProcessQueue;
68 m_timer.Start();
69
70 //Watchdog.StartThread(
71 // ProcessQueue,
72 // "GridServiceRequestThread",
73 // ThreadPriority.BelowNormal,
74 // true,
75 // false);
76 }
77
78 public void AddRegion(Scene scene)
79 {
80 lock (m_scenes)
81 {
82 m_scenes.Add(scene);
83 scene.RegisterModuleInterface<IServiceThrottleModule>(this);
84 scene.EventManager.OnNewClient += OnNewClient;
85 scene.EventManager.OnMakeRootAgent += OnMakeRootAgent;
86 }
87 }
88
89 public void RegionLoaded(Scene scene)
90 {
91 }
92
93 public void RemoveRegion(Scene scene)
94 {
95 lock (m_scenes)
96 {
97 m_scenes.Remove(scene);
98 scene.EventManager.OnNewClient -= OnNewClient;
99 }
100 }
101
102 public void PostInitialise()
103 {
104 }
105
106 public void Close()
107 {
108 }
109
110 public string Name
111 {
112 get { return "ServiceThrottleModule"; }
113 }
114
115 public Type ReplaceableInterface
116 {
117 get { return null; }
118 }
119
120 #endregion ISharedRegionMOdule
121
122 #region Events
123
124 void OnNewClient(IClientAPI client)
125 {
126 client.OnRegionHandleRequest += OnRegionHandleRequest;
127 }
128
129 void OnMakeRootAgent(ScenePresence obj)
130 {
131 lock (m_timer)
132 {
133 if (!m_timer.Enabled)
134 {
135 m_timer.Interval = m_Interval;
136 m_timer.Enabled = true;
137 m_timer.Start();
138 }
139 }
140 }
141
142 public void OnRegionHandleRequest(IClientAPI client, UUID regionID)
143 {
144 //m_log.DebugFormat("[SERVICE THROTTLE]: RegionHandleRequest {0}", regionID);
145 ulong handle = 0;
146 if (IsLocalRegionHandle(regionID, out handle))
147 {
148 client.SendRegionHandle(regionID, handle);
149 return;
150 }
151
152 Action action = delegate
153 {
154 GridRegion r = m_scenes[0].GridService.GetRegionByUUID(UUID.Zero, regionID);
155
156 if (r != null && r.RegionHandle != 0)
157 client.SendRegionHandle(regionID, r.RegionHandle);
158 };
159
160 Enqueue("region", regionID.ToString(), action);
161 }
162
163 #endregion Events
164
165 #region IServiceThrottleModule
166
167 public void Enqueue(string category, string itemid, Action continuation)
168 {
169 lock (m_RequestQueue)
170 {
171 if (m_Pending.ContainsKey(category))
172 {
173 if (m_Pending[category].Contains(itemid))
174 // Don't enqueue, it's already pending
175 return;
176 }
177 else
178 m_Pending.Add(category, new List<string>());
179
180 m_Pending[category].Add(itemid);
181
182 m_RequestQueue.Enqueue(delegate
183 {
184 lock (m_RequestQueue)
185 m_Pending[category].Remove(itemid);
186
187 continuation();
188 });
189 }
190 }
191
192 #endregion IServiceThrottleModule
193
194 #region Process Continuation Queue
195
196 private void ProcessQueue(object sender, System.Timers.ElapsedEventArgs e)
197 {
198 //m_log.DebugFormat("[YYY]: Process queue with {0} continuations", m_RequestQueue.Count);
199
200 while (m_RequestQueue.Count > 0)
201 {
202 Action continuation = null;
203 lock (m_RequestQueue)
204 continuation = m_RequestQueue.Dequeue();
205
206 if (continuation != null)
207 continuation();
208 }
209
210 if (AreThereRootAgents())
211 {
212 lock (m_timer)
213 {
214 m_timer.Interval = 1000; // 1 sec
215 m_timer.Enabled = true;
216 m_timer.Start();
217 }
218 }
219 else
220 lock (m_timer)
221 m_timer.Enabled = false;
222
223 }
224
225 #endregion Process Continuation Queue
226
227 #region Misc
228
229 private bool IsLocalRegionHandle(UUID regionID, out ulong regionHandle)
230 {
231 regionHandle = 0;
232 foreach (Scene s in m_scenes)
233 if (s.RegionInfo.RegionID == regionID)
234 {
235 regionHandle = s.RegionInfo.RegionHandle;
236 return true;
237 }
238 return false;
239 }
240
241 private bool AreThereRootAgents()
242 {
243 foreach (Scene s in m_scenes)
244 {
245 foreach (ScenePresence sp in s.GetScenePresences())
246 if (!sp.IsChildAgent)
247 return true;
248 }
249
250 return false;
251 }
252
253 #endregion Misc
254 }
255
256}
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/HGUserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/HGUserManagementModule.cs
index 4ef57fe..245c808 100644
--- a/OpenSim/Region/CoreModules/Framework/UserManagement/HGUserManagementModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/UserManagement/HGUserManagementModule.cs
@@ -50,16 +50,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
50 { 50 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
53
54 #region ISharedRegionModule 53 #region ISharedRegionModule
55 54
56 public new void Initialise(IConfigSource config) 55 public new void Initialise(IConfigSource config)
57 { 56 {
58 string umanmod = config.Configs["Modules"].GetString("UserManagementModule", base.Name); 57 string umanmod = config.Configs["Modules"].GetString("UserManagementModule", null);
59 if (umanmod == Name) 58 if (umanmod == Name)
60 { 59 {
61 m_Enabled = true; 60 m_Enabled = true;
62 RegisterConsoleCmds(); 61 Init();
63 m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name); 62 m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name);
64 } 63 }
65 } 64 }
@@ -71,7 +70,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
71 70
72 #endregion ISharedRegionModule 71 #endregion ISharedRegionModule
73 72
74 protected override void AddAdditionalUsers(UUID avatarID, string query, List<UserData> users) 73 protected override void AddAdditionalUsers(string query, List<UserData> users)
75 { 74 {
76 if (query.Contains("@")) // First.Last@foo.com, maybe? 75 if (query.Contains("@")) // First.Last@foo.com, maybe?
77 { 76 {
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/Tests/HGUserManagementModuleTests.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/Tests/HGUserManagementModuleTests.cs
new file mode 100644
index 0000000..9d36aa5
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/UserManagement/Tests/HGUserManagementModuleTests.cs
@@ -0,0 +1,76 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using Nini.Config;
30using NUnit.Framework;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Region.CoreModules.Framework.UserManagement;
34using OpenSim.Tests.Common;
35using OpenSim.Tests.Common.Mock;
36
37namespace OpenSim.Region.CoreModules.Framework.UserManagement.Tests
38{
39 [TestFixture]
40 public class HGUserManagementModuleTests : OpenSimTestCase
41 {
42 /// <summary>
43 /// Test that a new HG agent (i.e. one without a user account) has their name cached in the UMM upon creation.
44 /// </summary>
45 [Test]
46 public void TestCachedUserNameForNewAgent()
47 {
48 TestHelpers.InMethod();
49// TestHelpers.EnableLogging();
50
51 HGUserManagementModule hgumm = new HGUserManagementModule();
52 UUID userId = TestHelpers.ParseStem("11");
53 string firstName = "Fred";
54 string lastName = "Astaire";
55 string homeUri = "example.com";
56
57 IConfigSource config = new IniConfigSource();
58 config.AddConfig("Modules");
59 config.Configs["Modules"].Set("UserManagementModule", hgumm.Name);
60
61 SceneHelpers sceneHelpers = new SceneHelpers();
62 TestScene scene = sceneHelpers.SetupScene();
63 SceneHelpers.SetupSceneModules(scene, config, hgumm);
64
65 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
66 acd.firstname = firstName;
67 acd.lastname = lastName;
68 acd.ServiceURLs["HomeURI"] = "http://" + homeUri;
69
70 SceneHelpers.AddScenePresence(scene, acd);
71
72 string name = hgumm.GetUserName(userId);
73 Assert.That(name, Is.EqualTo(string.Format("{0}.{1} @{2}", firstName, lastName, homeUri)));
74 }
75 }
76} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs
index 77e8b00..8c983e6 100644
--- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs
@@ -28,9 +28,11 @@ using System;
28using System.Collections.Generic; 28using System.Collections.Generic;
29using System.IO; 29using System.IO;
30using System.Reflection; 30using System.Reflection;
31using System.Threading;
31 32
32using OpenSim.Framework; 33using OpenSim.Framework;
33using OpenSim.Framework.Console; 34using OpenSim.Framework.Console;
35using OpenSim.Framework.Monitoring;
34using OpenSim.Region.ClientStack.LindenUDP; 36using OpenSim.Region.ClientStack.LindenUDP;
35using OpenSim.Region.Framework; 37using OpenSim.Region.Framework;
36using OpenSim.Region.Framework.Interfaces; 38using OpenSim.Region.Framework.Interfaces;
@@ -44,25 +46,19 @@ using log4net;
44using Nini.Config; 46using Nini.Config;
45using Mono.Addins; 47using Mono.Addins;
46 48
49using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
50
47namespace OpenSim.Region.CoreModules.Framework.UserManagement 51namespace OpenSim.Region.CoreModules.Framework.UserManagement
48{ 52{
49 public class UserData
50 {
51 public UUID Id { get; set; }
52 public string FirstName { get; set; }
53 public string LastName { get; set; }
54 public string HomeURL { get; set; }
55 public Dictionary<string, object> ServerURLs { get; set; }
56 }
57
58 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserManagementModule")] 53 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserManagementModule")]
59 public class UserManagementModule : ISharedRegionModule, IUserManagement 54 public class UserManagementModule : ISharedRegionModule, IUserManagement, IPeople
60 { 55 {
61 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
62 57
63 protected bool m_Enabled; 58 protected bool m_Enabled;
64 protected List<Scene> m_Scenes = new List<Scene>(); 59 protected List<Scene> m_Scenes = new List<Scene>();
65 60
61 protected IServiceThrottleModule m_ServiceThrottle;
66 // The cache 62 // The cache
67 protected Dictionary<UUID, UserData> m_UserCache = new Dictionary<UUID, UserData>(); 63 protected Dictionary<UUID, UserData> m_UserCache = new Dictionary<UUID, UserData>();
68 64
@@ -74,7 +70,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
74 if (umanmod == Name) 70 if (umanmod == Name)
75 { 71 {
76 m_Enabled = true; 72 m_Enabled = true;
77 RegisterConsoleCmds(); 73 Init();
78 m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name); 74 m_log.DebugFormat("[USER MANAGEMENT MODULE]: {0} is enabled", Name);
79 } 75 }
80 } 76 }
@@ -101,6 +97,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
101 m_Scenes.Add(scene); 97 m_Scenes.Add(scene);
102 98
103 scene.RegisterModuleInterface<IUserManagement>(this); 99 scene.RegisterModuleInterface<IUserManagement>(this);
100 scene.RegisterModuleInterface<IPeople>(this);
104 scene.EventManager.OnNewClient += new EventManager.OnNewClientDelegate(EventManager_OnNewClient); 101 scene.EventManager.OnNewClient += new EventManager.OnNewClientDelegate(EventManager_OnNewClient);
105 scene.EventManager.OnPrimsLoaded += new EventManager.PrimsLoaded(EventManager_OnPrimsLoaded); 102 scene.EventManager.OnPrimsLoaded += new EventManager.PrimsLoaded(EventManager_OnPrimsLoaded);
106 } 103 }
@@ -117,6 +114,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
117 114
118 public void RegionLoaded(Scene s) 115 public void RegionLoaded(Scene s)
119 { 116 {
117 if (m_Enabled && m_ServiceThrottle == null)
118 m_ServiceThrottle = s.RequestModuleInterface<IServiceThrottleModule>();
120 } 119 }
121 120
122 public void PostInitialise() 121 public void PostInitialise()
@@ -143,7 +142,6 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
143 s.ForEachSOG(delegate(SceneObjectGroup sog) { CacheCreators(sog); }); 142 s.ForEachSOG(delegate(SceneObjectGroup sog) { CacheCreators(sog); });
144 } 143 }
145 144
146
147 void EventManager_OnNewClient(IClientAPI client) 145 void EventManager_OnNewClient(IClientAPI client)
148 { 146 {
149 client.OnConnectionClosed += new Action<IClientAPI>(HandleConnectionClosed); 147 client.OnConnectionClosed += new Action<IClientAPI>(HandleConnectionClosed);
@@ -157,21 +155,40 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
157 client.OnAvatarPickerRequest -= new AvatarPickerRequest(HandleAvatarPickerRequest); 155 client.OnAvatarPickerRequest -= new AvatarPickerRequest(HandleAvatarPickerRequest);
158 } 156 }
159 157
160 void HandleUUIDNameRequest(UUID uuid, IClientAPI remote_client) 158 void HandleUUIDNameRequest(UUID uuid, IClientAPI client)
161 { 159 {
160// m_log.DebugFormat(
161// "[USER MANAGEMENT MODULE]: Handling request for name binding of UUID {0} from {1}",
162// uuid, remote_client.Name);
163
162 if (m_Scenes[0].LibraryService != null && (m_Scenes[0].LibraryService.LibraryRootFolder.Owner == uuid)) 164 if (m_Scenes[0].LibraryService != null && (m_Scenes[0].LibraryService.LibraryRootFolder.Owner == uuid))
163 { 165 {
164 remote_client.SendNameReply(uuid, "Mr", "OpenSim"); 166 client.SendNameReply(uuid, "Mr", "OpenSim");
165 } 167 }
166 else 168 else
167 { 169 {
168 string[] names = GetUserNames(uuid); 170 string[] names = new string[2];
169 if (names.Length == 2) 171 if (TryGetUserNamesFromCache(uuid, names))
170 { 172 {
171 //m_log.DebugFormat("[XXX] HandleUUIDNameRequest {0} is {1} {2}", uuid, names[0], names[1]); 173 client.SendNameReply(uuid, names[0], names[1]);
172 remote_client.SendNameReply(uuid, names[0], names[1]); 174 return;
173 } 175 }
174 176
177 // Not found in cache, queue continuation
178 m_ServiceThrottle.Enqueue("name", uuid.ToString(), delegate
179 {
180 //m_log.DebugFormat("[YYY]: Name request {0}", uuid);
181 bool foundRealName = TryGetUserNames(uuid, names);
182
183 if (names.Length == 2)
184 {
185 if (!foundRealName)
186 m_log.DebugFormat("[USER MANAGEMENT MODULE]: Sending {0} {1} for {2} to {3} since no bound name found", names[0], names[1], uuid, client.Name);
187
188 client.SendNameReply(uuid, names[0], names[1]);
189 }
190 });
191
175 } 192 }
176 } 193 }
177 194
@@ -181,29 +198,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
181 198
182 m_log.DebugFormat("[USER MANAGEMENT MODULE]: HandleAvatarPickerRequest for {0}", query); 199 m_log.DebugFormat("[USER MANAGEMENT MODULE]: HandleAvatarPickerRequest for {0}", query);
183 200
184 // searhc the user accounts service 201 List<UserData> users = GetUserData(query, 500, 1);
185 List<UserAccount> accs = m_Scenes[0].UserAccountService.GetUserAccounts(m_Scenes[0].RegionInfo.ScopeID, query);
186
187 List<UserData> users = new List<UserData>();
188 if (accs != null)
189 {
190 foreach (UserAccount acc in accs)
191 {
192 UserData ud = new UserData();
193 ud.FirstName = acc.FirstName;
194 ud.LastName = acc.LastName;
195 ud.Id = acc.PrincipalID;
196 users.Add(ud);
197 }
198 }
199
200 // search the local cache
201 foreach (UserData data in m_UserCache.Values)
202 if (users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null &&
203 (data.FirstName.StartsWith(query) || data.LastName.StartsWith(query)))
204 users.Add(data);
205
206 AddAdditionalUsers(avatarID, query, users);
207 202
208 AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply); 203 AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply);
209 // TODO: don't create new blocks if recycling an old packet 204 // TODO: don't create new blocks if recycling an old packet
@@ -249,12 +244,51 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
249 client.SendAvatarPickerReply(agent_data, data_args); 244 client.SendAvatarPickerReply(agent_data, data_args);
250 } 245 }
251 246
252 protected virtual void AddAdditionalUsers(UUID avatarID, string query, List<UserData> users) 247 protected virtual void AddAdditionalUsers(string query, List<UserData> users)
253 { 248 {
254 } 249 }
255 250
256 #endregion Event Handlers 251 #endregion Event Handlers
257 252
253 #region IPeople
254
255 public List<UserData> GetUserData(string query, int page_size, int page_number)
256 {
257 // search the user accounts service
258 List<UserAccount> accs = m_Scenes[0].UserAccountService.GetUserAccounts(m_Scenes[0].RegionInfo.ScopeID, query);
259
260 List<UserData> users = new List<UserData>();
261 if (accs != null)
262 {
263 foreach (UserAccount acc in accs)
264 {
265 UserData ud = new UserData();
266 ud.FirstName = acc.FirstName;
267 ud.LastName = acc.LastName;
268 ud.Id = acc.PrincipalID;
269 users.Add(ud);
270 }
271 }
272
273 // search the local cache
274 lock (m_UserCache)
275 {
276 foreach (UserData data in m_UserCache.Values)
277 {
278 if (users.Find(delegate(UserData d) { return d.Id == data.Id; }) == null &&
279 (data.FirstName.ToLower().StartsWith(query.ToLower()) || data.LastName.ToLower().StartsWith(query.ToLower())))
280 users.Add(data);
281 }
282 }
283
284 AddAdditionalUsers(query, users);
285
286 return users;
287
288 }
289
290 #endregion IPeople
291
258 private void CacheCreators(SceneObjectGroup sog) 292 private void CacheCreators(SceneObjectGroup sog)
259 { 293 {
260 //m_log.DebugFormat("[USER MANAGEMENT MODULE]: processing {0} {1}; {2}", sog.RootPart.Name, sog.RootPart.CreatorData, sog.RootPart.CreatorIdentification); 294 //m_log.DebugFormat("[USER MANAGEMENT MODULE]: processing {0} {1}; {2}", sog.RootPart.Name, sog.RootPart.CreatorData, sog.RootPart.CreatorIdentification);
@@ -268,26 +302,56 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
268 } 302 }
269 } 303 }
270 304
271 private string[] GetUserNames(UUID uuid) 305 /// <summary>
306 ///
307 /// </summary>
308 /// <param name="uuid"></param>
309 /// <param name="names">Caller please provide a properly instantiated array for names, string[2]</param>
310 /// <returns></returns>
311 private bool TryGetUserNames(UUID uuid, string[] names)
272 { 312 {
273 string[] returnstring = new string[2]; 313 if (names == null)
314 names = new string[2];
315
316 if (TryGetUserNamesFromCache(uuid, names))
317 return true;
274 318
319 if (TryGetUserNamesFromServices(uuid, names))
320 return true;
321
322 return false;
323 }
324
325 private bool TryGetUserNamesFromCache(UUID uuid, string[] names)
326 {
275 lock (m_UserCache) 327 lock (m_UserCache)
276 { 328 {
277 if (m_UserCache.ContainsKey(uuid)) 329 if (m_UserCache.ContainsKey(uuid))
278 { 330 {
279 returnstring[0] = m_UserCache[uuid].FirstName; 331 names[0] = m_UserCache[uuid].FirstName;
280 returnstring[1] = m_UserCache[uuid].LastName; 332 names[1] = m_UserCache[uuid].LastName;
281 return returnstring; 333
334 return true;
282 } 335 }
283 } 336 }
284 337
338 return false;
339 }
340
341 /// <summary>
342 /// Try to get the names bound to the given uuid, from the services.
343 /// </summary>
344 /// <returns>True if the name was found, false if not.</returns>
345 /// <param name='uuid'></param>
346 /// <param name='names'>The array of names if found. If not found, then names[0] = "Unknown" and names[1] = "User"</param>
347 private bool TryGetUserNamesFromServices(UUID uuid, string[] names)
348 {
285 UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(UUID.Zero, uuid); 349 UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(UUID.Zero, uuid);
286 350
287 if (account != null) 351 if (account != null)
288 { 352 {
289 returnstring[0] = account.FirstName; 353 names[0] = account.FirstName;
290 returnstring[1] = account.LastName; 354 names[1] = account.LastName;
291 355
292 UserData user = new UserData(); 356 UserData user = new UserData();
293 user.FirstName = account.FirstName; 357 user.FirstName = account.FirstName;
@@ -295,14 +359,42 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
295 359
296 lock (m_UserCache) 360 lock (m_UserCache)
297 m_UserCache[uuid] = user; 361 m_UserCache[uuid] = user;
362
363 return true;
298 } 364 }
299 else 365 else
300 { 366 {
301 returnstring[0] = "Unknown"; 367 // Let's try the GridUser service
302 returnstring[1] = "User"; 368 GridUserInfo uInfo = m_Scenes[0].GridUserService.GetGridUserInfo(uuid.ToString());
303 } 369 if (uInfo != null)
370 {
371 string url, first, last, tmp;
372 UUID u;
373 if (Util.ParseUniversalUserIdentifier(uInfo.UserID, out u, out url, out first, out last, out tmp))
374 {
375 AddUser(uuid, first, last, url);
376
377 if (m_UserCache.ContainsKey(uuid))
378 {
379 names[0] = m_UserCache[uuid].FirstName;
380 names[1] = m_UserCache[uuid].LastName;
381
382 return true;
383 }
384 }
385 else
386 m_log.DebugFormat("[USER MANAGEMENT MODULE]: Unable to parse UUI {0}", uInfo.UserID);
387 }
388 else
389 {
390 m_log.DebugFormat("[USER MANAGEMENT MODULE]: No grid user found for {0}", uuid);
391 }
392
393 names[0] = "Unknown";
394 names[1] = "UserUMMTGUN8";
304 395
305 return returnstring; 396 return false;
397 }
306 } 398 }
307 399
308 #region IUserManagement 400 #region IUserManagement
@@ -338,16 +430,11 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
338 430
339 public string GetUserName(UUID uuid) 431 public string GetUserName(UUID uuid)
340 { 432 {
341 string[] names = GetUserNames(uuid); 433 string[] names = new string[2];
342 if (names.Length == 2) 434 TryGetUserNames(uuid, names);
343 {
344 string firstname = names[0];
345 string lastname = names[1];
346 435
347 return firstname + " " + lastname; 436 return names[0] + " " + names[1];
348 437
349 }
350 return "(hippos)";
351 } 438 }
352 439
353 public string GetUserHomeURL(UUID userID) 440 public string GetUserHomeURL(UUID userID)
@@ -394,14 +481,20 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
394 481
395 public string GetUserUUI(UUID userID) 482 public string GetUserUUI(UUID userID)
396 { 483 {
397 UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID);
398 if (account != null)
399 return userID.ToString();
400
401 UserData ud; 484 UserData ud;
402 lock (m_UserCache) 485 lock (m_UserCache)
403 m_UserCache.TryGetValue(userID, out ud); 486 m_UserCache.TryGetValue(userID, out ud);
404 487
488 if (ud == null) // It's not in the cache
489 {
490 string[] names = new string[2];
491 // This will pull the data from either UserAccounts or GridUser
492 // and stick it into the cache
493 TryGetUserNamesFromServices(userID, names);
494 lock (m_UserCache)
495 m_UserCache.TryGetValue(userID, out ud);
496 }
497
405 if (ud != null) 498 if (ud != null)
406 { 499 {
407 string homeURL = ud.HomeURL; 500 string homeURL = ud.HomeURL;
@@ -451,72 +544,75 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
451 //m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, creatorData {1}", id, creatorData); 544 //m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, creatorData {1}", id, creatorData);
452 545
453 UserData oldUser; 546 UserData oldUser;
454 //lock the whole block - prevent concurrent update
455 lock (m_UserCache) 547 lock (m_UserCache)
548 m_UserCache.TryGetValue(id, out oldUser);
549
550 if (oldUser != null)
456 { 551 {
457 m_UserCache.TryGetValue (id, out oldUser); 552 if (creatorData == null || creatorData == String.Empty)
458 if (oldUser != null)
459 { 553 {
460 if (creatorData == null || creatorData == String.Empty) 554 //ignore updates without creator data
461 { 555 return;
462 //ignore updates without creator data
463 return;
464 }
465 //try update unknown users
466 //and creator's home URL's
467 if ((oldUser.FirstName == "Unknown" && !creatorData.Contains ("Unknown")) || (oldUser.HomeURL != null && !creatorData.StartsWith (oldUser.HomeURL)))
468 {
469 m_UserCache.Remove (id);
470// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData,oldUser.HomeURL);
471 }
472 else
473 {
474 //we have already a valid user within the cache
475 return;
476 }
477 } 556 }
478 557
479 UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount (m_Scenes [0].RegionInfo.ScopeID, id); 558 //try update unknown users, but don't update anyone else
480 559 if (oldUser.FirstName == "Unknown" && !creatorData.Contains("Unknown"))
481 if (account != null)
482 { 560 {
483 AddUser (id, account.FirstName, account.LastName); 561 lock (m_UserCache)
562 m_UserCache.Remove(id);
563 m_log.DebugFormat("[USER MANAGEMENT MODULE]: Re-adding user with id {0}, creatorData [{1}] and old HomeURL {2}", id, creatorData, oldUser.HomeURL);
484 } 564 }
485 else 565 else
486 { 566 {
487 UserData user = new UserData (); 567 //we have already a valid user within the cache
488 user.Id = id; 568 return;
569 }
570 }
489 571
490 if (creatorData != null && creatorData != string.Empty) 572 UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
491 { 573
492 //creatorData = <endpoint>;<name> 574 if (account != null)
575 {
576 AddUser(id, account.FirstName, account.LastName);
577 }
578 else
579 {
580 UserData user = new UserData();
581 user.Id = id;
582
583 if (!string.IsNullOrEmpty(creatorData))
584 {
585 //creatorData = <endpoint>;<name>
493 586
494 string[] parts = creatorData.Split (';'); 587 string[] parts = creatorData.Split(';');
495 if (parts.Length >= 1) 588 if (parts.Length >= 1)
589 {
590 user.HomeURL = parts[0];
591 try
496 { 592 {
497 user.HomeURL = parts [0]; 593 Uri uri = new Uri(parts[0]);
498 try 594 user.LastName = "@" + uri.Authority;
499 { 595 }
500 Uri uri = new Uri (parts [0]); 596 catch (UriFormatException)
501 user.LastName = "@" + uri.Authority; 597 {
502 } 598 m_log.DebugFormat("[SCENE]: Unable to parse Uri {0}", parts[0]);
503 catch (UriFormatException) 599 user.LastName = "@unknown";
504 {
505 m_log.DebugFormat ("[SCENE]: Unable to parse Uri {0}", parts [0]);
506 user.LastName = "@unknown";
507 }
508 } 600 }
509 if (parts.Length >= 2)
510 user.FirstName = parts [1].Replace (' ', '.');
511 }
512 else
513 {
514 user.FirstName = "Unknown";
515 user.LastName = "User";
516 } 601 }
517 602 if (parts.Length >= 2)
518 AddUserInternal (user); 603 user.FirstName = parts[1].Replace(' ', '.');
604 }
605 else
606 {
607 // Temporarily add unknown user entries of this type into the cache so that we can distinguish
608 // this source from other recent (hopefully resolved) bugs that fail to retrieve a user name binding
609 // TODO: Can be removed when GUN* unknown users have definitely dropped significantly or
610 // disappeared.
611 user.FirstName = "Unknown";
612 user.LastName = "UserUMMAU4";
519 } 613 }
614
615 AddUserInternal(user);
520 } 616 }
521 } 617 }
522 618
@@ -541,9 +637,21 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
541 637
542 #endregion IUserManagement 638 #endregion IUserManagement
543 639
640 protected void Init()
641 {
642 RegisterConsoleCmds();
643 }
644
544 protected void RegisterConsoleCmds() 645 protected void RegisterConsoleCmds()
545 { 646 {
546 MainConsole.Instance.Commands.AddCommand("Users", true, 647 MainConsole.Instance.Commands.AddCommand("Users", true,
648 "show name",
649 "show name <uuid>",
650 "Show the bindings between a single user UUID and a user name",
651 String.Empty,
652 HandleShowUser);
653
654 MainConsole.Instance.Commands.AddCommand("Users", true,
547 "show names", 655 "show names",
548 "show names", 656 "show names",
549 "Show the bindings between user UUIDs and user names", 657 "Show the bindings between user UUIDs and user names",
@@ -551,26 +659,56 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
551 HandleShowUsers); 659 HandleShowUsers);
552 } 660 }
553 661
554 private void HandleShowUsers(string module, string[] cmd) 662 private void HandleShowUser(string module, string[] cmd)
555 { 663 {
664 if (cmd.Length < 3)
665 {
666 MainConsole.Instance.OutputFormat("Usage: show name <uuid>");
667 return;
668 }
669
670 UUID userId;
671 if (!ConsoleUtil.TryParseConsoleUuid(MainConsole.Instance, cmd[2], out userId))
672 return;
673
674 string[] names;
675
676 UserData ud;
677
556 lock (m_UserCache) 678 lock (m_UserCache)
557 { 679 {
558 if (m_UserCache.Count == 0) 680 if (!m_UserCache.TryGetValue(userId, out ud))
559 { 681 {
560 MainConsole.Instance.Output("No users found"); 682 MainConsole.Instance.OutputFormat("No name known for user with id {0}", userId);
561 return; 683 return;
562 } 684 }
563 685 }
564 MainConsole.Instance.Output("UUID User Name"); 686
565 MainConsole.Instance.Output("-----------------------------------------------------------------------------"); 687 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
688 cdt.AddColumn("UUID", 36);
689 cdt.AddColumn("Name", 30);
690 cdt.AddColumn("HomeURL", 40);
691 cdt.AddRow(userId, string.Format("{0} {1}", ud.FirstName, ud.LastName), ud.HomeURL);
692
693 MainConsole.Instance.Output(cdt.ToString());
694 }
695
696 private void HandleShowUsers(string module, string[] cmd)
697 {
698 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
699 cdt.AddColumn("UUID", 36);
700 cdt.AddColumn("Name", 30);
701 cdt.AddColumn("HomeURL", 40);
702
703 lock (m_UserCache)
704 {
566 foreach (KeyValuePair<UUID, UserData> kvp in m_UserCache) 705 foreach (KeyValuePair<UUID, UserData> kvp in m_UserCache)
567 { 706 cdt.AddRow(kvp.Key, string.Format("{0} {1}", kvp.Value.FirstName, kvp.Value.LastName), kvp.Value.HomeURL);
568 MainConsole.Instance.Output(String.Format("{0} {1} {2} ({3})",
569 kvp.Key, kvp.Value.FirstName, kvp.Value.LastName, kvp.Value.HomeURL));
570 }
571
572 return;
573 } 707 }
708
709 MainConsole.Instance.Output(cdt.ToString());
574 } 710 }
711
575 } 712 }
713
576} \ No newline at end of file 714} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index 7b11658..f196973 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -31,6 +31,7 @@ using System.Reflection;
31using log4net; 31using log4net;
32using Nini.Config; 32using Nini.Config;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenMetaverse.StructuredData;
34using Mono.Addins; 35using Mono.Addins;
35using OpenSim.Framework; 36using OpenSim.Framework;
36using OpenSim.Region.CoreModules.World.WorldMap; 37using OpenSim.Region.CoreModules.World.WorldMap;
@@ -48,20 +49,63 @@ namespace OpenSim.Region.CoreModules.Hypergrid
48 // Remember the map area that each client has been exposed to in this region 49 // Remember the map area that each client has been exposed to in this region
49 private Dictionary<UUID, List<MapBlockData>> m_SeenMapBlocks = new Dictionary<UUID, List<MapBlockData>>(); 50 private Dictionary<UUID, List<MapBlockData>> m_SeenMapBlocks = new Dictionary<UUID, List<MapBlockData>>();
50 51
52 private string m_MapImageServerURL = string.Empty;
53
54 private IUserManagement m_UserManagement;
55
51 #region INonSharedRegionModule Members 56 #region INonSharedRegionModule Members
52 57
53 public override void Initialise(IConfigSource config) 58 public override void Initialise(IConfigSource source)
54 { 59 {
55 if (Util.GetConfigVarFromSections<string>( 60 if (Util.GetConfigVarFromSections<string>(
56 config, "WorldMapModule", new string[] { "Map", "Startup" }, "WorldMap") == "HGWorldMap") 61 source, "WorldMapModule", new string[] { "Map", "Startup" }, "WorldMap") == "HGWorldMap")
62 {
57 m_Enabled = true; 63 m_Enabled = true;
64
65 m_MapImageServerURL = Util.GetConfigVarFromSections<string>(source, "MapTileURL", new string[] {"LoginService", "HGWorldMap", "SimulatorFeatures"});
66
67 if (!string.IsNullOrEmpty(m_MapImageServerURL))
68 {
69 m_MapImageServerURL = m_MapImageServerURL.Trim();
70 if (!m_MapImageServerURL.EndsWith("/"))
71 m_MapImageServerURL = m_MapImageServerURL + "/";
72 }
73
74
75 }
58 } 76 }
59 77
60 public override void AddRegion(Scene scene) 78 public override void AddRegion(Scene scene)
61 { 79 {
80 if (!m_Enabled)
81 return;
82
62 base.AddRegion(scene); 83 base.AddRegion(scene);
63 84
64 scene.EventManager.OnClientClosed += new EventManager.ClientClosed(EventManager_OnClientClosed); 85 scene.EventManager.OnClientClosed += EventManager_OnClientClosed;
86 }
87
88 public override void RegionLoaded(Scene scene)
89 {
90 if (!m_Enabled)
91 return;
92
93 base.RegionLoaded(scene);
94 ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface<ISimulatorFeaturesModule>();
95
96 if (featuresModule != null)
97 featuresModule.OnSimulatorFeaturesRequest += OnSimulatorFeaturesRequest;
98
99 m_UserManagement = m_scene.RequestModuleInterface<IUserManagement>();
100
101 }
102
103 public override void RemoveRegion(Scene scene)
104 {
105 if (!m_Enabled)
106 return;
107
108 scene.EventManager.OnClientClosed -= EventManager_OnClientClosed;
65 } 109 }
66 110
67 public override string Name 111 public override string Name
@@ -115,6 +159,20 @@ namespace OpenSim.Region.CoreModules.Hypergrid
115 return mapBlocks; 159 return mapBlocks;
116 } 160 }
117 161
162 private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features)
163 {
164 if (m_UserManagement != null && !string.IsNullOrEmpty(m_MapImageServerURL) && !m_UserManagement.IsLocalGridUser(agentID))
165 {
166 OSD extras = new OSDMap();
167 if (features.ContainsKey("OpenSimExtras"))
168 extras = features["OpenSimExtras"];
169 else
170 features["OpenSimExtras"] = extras;
171
172 ((OSDMap)extras)["map-server-url"] = m_MapImageServerURL;
173
174 }
175 }
118 } 176 }
119 177
120 class MapArea 178 class MapArea
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index 2b13a8b..6eb25ef 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -412,7 +412,6 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
412 //public bool HttpVerboseThrottle = true; // not implemented 412 //public bool HttpVerboseThrottle = true; // not implemented
413 public List<string> HttpCustomHeaders = null; 413 public List<string> HttpCustomHeaders = null;
414 public bool HttpPragmaNoCache = true; 414 public bool HttpPragmaNoCache = true;
415 private Thread httpThread;
416 415
417 // Request info 416 // Request info
418 private UUID _itemID; 417 private UUID _itemID;
@@ -622,7 +621,7 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
622 { 621 {
623 if (!WorkItem.Cancel()) 622 if (!WorkItem.Cancel())
624 { 623 {
625 WorkItem.Abort(); 624 WorkItem.Cancel(true);
626 } 625 }
627 } 626 }
628 catch (Exception) 627 catch (Exception)
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs
new file mode 100644
index 0000000..e812d81
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs
@@ -0,0 +1,198 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Net;
32using System.Reflection;
33using System.Runtime.Serialization;
34using System.Text;
35using System.Threading;
36using log4net.Config;
37using NUnit.Framework;
38using OpenMetaverse;
39using OpenMetaverse.Assets;
40using OpenSim.Framework;
41using OpenSim.Region.CoreModules.Scripting.HttpRequest;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Tests.Common;
44using OpenSim.Tests.Common.Mock;
45
46namespace OpenSim.Region.CoreModules.Scripting.HttpRequest.Tests
47{
48 class TestWebRequestCreate : IWebRequestCreate
49 {
50 public TestWebRequest NextRequest { get; set; }
51
52 public WebRequest Create(Uri uri)
53 {
54// NextRequest.RequestUri = uri;
55
56 return NextRequest;
57
58// return new TestWebRequest(new SerializationInfo(typeof(TestWebRequest), new FormatterConverter()), new StreamingContext());
59 }
60 }
61
62 class TestWebRequest : WebRequest
63 {
64 public override string ContentType { get; set; }
65 public override string Method { get; set; }
66
67 public Func<IAsyncResult, WebResponse> OnEndGetResponse { get; set; }
68
69 public TestWebRequest() : base()
70 {
71// Console.WriteLine("created");
72 }
73
74// public TestWebRequest(SerializationInfo serializationInfo, StreamingContext streamingContext)
75// : base(serializationInfo, streamingContext)
76// {
77// Console.WriteLine("created");
78// }
79
80 public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)
81 {
82// Console.WriteLine("bish");
83 TestAsyncResult tasr = new TestAsyncResult();
84 callback(tasr);
85
86 return tasr;
87 }
88
89 public override WebResponse EndGetResponse(IAsyncResult asyncResult)
90 {
91// Console.WriteLine("bosh");
92 return OnEndGetResponse(asyncResult);
93 }
94 }
95
96 class TestHttpWebResponse : HttpWebResponse
97 {
98 public string Response { get; set; }
99
100 public TestHttpWebResponse(SerializationInfo serializationInfo, StreamingContext streamingContext)
101 : base(serializationInfo, streamingContext) {}
102
103 public override Stream GetResponseStream()
104 {
105 return new MemoryStream(Encoding.UTF8.GetBytes(Response));
106 }
107 }
108
109 class TestAsyncResult : IAsyncResult
110 {
111 WaitHandle m_wh = new ManualResetEvent(true);
112
113 object IAsyncResult.AsyncState
114 {
115 get {
116 throw new System.NotImplementedException ();
117 }
118 }
119
120 WaitHandle IAsyncResult.AsyncWaitHandle
121 {
122 get { return m_wh; }
123 }
124
125 bool IAsyncResult.CompletedSynchronously
126 {
127 get { return false; }
128 }
129
130 bool IAsyncResult.IsCompleted
131 {
132 get { return true; }
133 }
134 }
135
136 /// <summary>
137 /// Test script http request code.
138 /// </summary>
139 /// <remarks>
140 /// This class uses some very hacky workarounds in order to mock HttpWebResponse which are Mono dependent (though
141 /// alternative code can be written to make this work for Windows). However, the value of being able to
142 /// regression test this kind of code is very high.
143 /// </remarks>
144 [TestFixture]
145 public class ScriptsHttpRequestsTests : OpenSimTestCase
146 {
147 /// <summary>
148 /// Test what happens when we get a 404 response from a call.
149 /// </summary>
150 [Test]
151 public void Test404Response()
152 {
153 TestHelpers.InMethod();
154// TestHelpers.EnableLogging();
155
156 if (!Util.IsPlatformMono)
157 Assert.Ignore("Ignoring test since can only currently run on Mono");
158
159 string rawResponse = "boom";
160
161 TestWebRequestCreate twrc = new TestWebRequestCreate();
162
163 TestWebRequest twr = new TestWebRequest();
164 //twr.OnEndGetResponse += ar => new TestHttpWebResponse(null, new StreamingContext());
165 twr.OnEndGetResponse += ar =>
166 {
167 SerializationInfo si = new SerializationInfo(typeof(HttpWebResponse), new FormatterConverter());
168 StreamingContext sc = new StreamingContext();
169// WebHeaderCollection headers = new WebHeaderCollection();
170// si.AddValue("m_HttpResponseHeaders", headers);
171 si.AddValue("uri", new Uri("test://arrg"));
172// si.AddValue("m_Certificate", null);
173 si.AddValue("version", HttpVersion.Version11);
174 si.AddValue("statusCode", HttpStatusCode.NotFound);
175 si.AddValue("contentLength", 0);
176 si.AddValue("method", "GET");
177 si.AddValue("statusDescription", "Not Found");
178 si.AddValue("contentType", null);
179 si.AddValue("cookieCollection", new CookieCollection());
180
181 TestHttpWebResponse thwr = new TestHttpWebResponse(si, sc);
182 thwr.Response = rawResponse;
183
184 throw new WebException("no message", null, WebExceptionStatus.ProtocolError, thwr);
185 };
186
187 twrc.NextRequest = twr;
188
189 WebRequest.RegisterPrefix("test", twrc);
190 HttpRequestClass hr = new HttpRequestClass();
191 hr.Url = "test://something";
192 hr.SendRequest();
193
194 Assert.That(hr.Status, Is.EqualTo((int)HttpStatusCode.NotFound));
195 Assert.That(hr.ResponseBody, Is.EqualTo(rawResponse));
196 }
197 }
198} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 2a4d440..1983fed 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -219,7 +219,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
219 219
220 string uri = "/lslhttp/" + urlcode.ToString(); 220 string uri = "/lslhttp/" + urlcode.ToString();
221 221
222 PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode, 25000); 222 PollServiceEventArgs args
223 = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000);
223 args.Type = PollServiceEventArgs.EventType.LslHttp; 224 args.Type = PollServiceEventArgs.EventType.LslHttp;
224 m_HttpServer.AddPollServiceHTTPHandler(uri, args); 225 m_HttpServer.AddPollServiceHTTPHandler(uri, args);
225 226
@@ -266,7 +267,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
266 267
267 string uri = "/lslhttps/" + urlcode.ToString(); 268 string uri = "/lslhttps/" + urlcode.ToString();
268 269
269 PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, urlcode, 25000); 270 PollServiceEventArgs args
271 = new PollServiceEventArgs(HttpRequestHandler, uri, HasEvents, GetEvents, NoEvents, urlcode, 25000);
270 args.Type = PollServiceEventArgs.EventType.LslHttp; 272 args.Type = PollServiceEventArgs.EventType.LslHttp;
271 m_HttpsServer.AddPollServiceHTTPHandler(uri, args); 273 m_HttpsServer.AddPollServiceHTTPHandler(uri, args);
272 274
diff --git a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
index fccf053..ad33f23 100644
--- a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
@@ -45,6 +45,7 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
45 { 45 {
46 private static readonly ILog m_log = 46 private static readonly ILog m_log =
47 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 47 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 private static string LogHeader = "[MODULE COMMS]";
48 49
49 private Dictionary<string,object> m_constants = new Dictionary<string,object>(); 50 private Dictionary<string,object> m_constants = new Dictionary<string,object>();
50 51
@@ -148,7 +149,7 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
148 MethodInfo mi = GetMethodInfoFromType(target.GetType(), meth, true); 149 MethodInfo mi = GetMethodInfoFromType(target.GetType(), meth, true);
149 if (mi == null) 150 if (mi == null)
150 { 151 {
151 m_log.WarnFormat("[MODULE COMMANDS] Failed to register method {0}", meth); 152 m_log.WarnFormat("{0} Failed to register method {1}", LogHeader, meth);
152 return; 153 return;
153 } 154 }
154 155
@@ -163,9 +164,9 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
163 164
164 public void RegisterScriptInvocation(object target, MethodInfo mi) 165 public void RegisterScriptInvocation(object target, MethodInfo mi)
165 { 166 {
166 m_log.DebugFormat("[MODULE COMMANDS] Register method {0} from type {1}", mi.Name, (target is Type) ? ((Type)target).Name : target.GetType().Name); 167// m_log.DebugFormat("[MODULE COMMANDS] Register method {0} from type {1}", mi.Name, (target is Type) ? ((Type)target).Name : target.GetType().Name);
167 168
168 Type delegateType; 169 Type delegateType = typeof(void);
169 List<Type> typeArgs = mi.GetParameters() 170 List<Type> typeArgs = mi.GetParameters()
170 .Select(p => p.ParameterType) 171 .Select(p => p.ParameterType)
171 .ToList(); 172 .ToList();
@@ -176,8 +177,16 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
176 } 177 }
177 else 178 else
178 { 179 {
179 typeArgs.Add(mi.ReturnType); 180 try
180 delegateType = Expression.GetFuncType(typeArgs.ToArray()); 181 {
182 typeArgs.Add(mi.ReturnType);
183 delegateType = Expression.GetFuncType(typeArgs.ToArray());
184 }
185 catch (Exception e)
186 {
187 m_log.ErrorFormat("{0} Failed to create function signature. Most likely more than 5 parameters. Method={1}. Error={2}",
188 LogHeader, mi.Name, e);
189 }
181 } 190 }
182 191
183 Delegate fcall; 192 Delegate fcall;
@@ -325,7 +334,7 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
325 /// </summary> 334 /// </summary>
326 public void RegisterConstant(string cname, object value) 335 public void RegisterConstant(string cname, object value)
327 { 336 {
328 m_log.DebugFormat("[MODULE COMMANDS] register constant <{0}> with value {1}",cname,value.ToString()); 337// m_log.DebugFormat("[MODULE COMMANDS] register constant <{0}> with value {1}",cname,value.ToString());
329 lock (m_constants) 338 lock (m_constants)
330 { 339 {
331 m_constants.Add(cname,value); 340 m_constants.Add(cname,value);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs
new file mode 100644
index 0000000..323535a
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs
@@ -0,0 +1,226 @@
1
2/*
3 * Copyright (c) Contributors, http://opensimulator.org/
4 * See CONTRIBUTORS.TXT for a full list of copyright holders.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the OpenSimulator Project nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29using log4net;
30using Mono.Addins;
31using Nini.Config;
32using System;
33using System.Collections.Generic;
34using System.Reflection;
35using OpenSim.Framework;
36using OpenSim.Framework.Console;
37using OpenSim.Server.Base;
38using OpenSim.Server.Handlers;
39using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Framework.Servers;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Services.Interfaces;
44using GridRegion = OpenSim.Services.Interfaces.GridRegion;
45using OpenMetaverse;
46
47namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Profile
48{
49 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LocalUserProfilesServicesConnector")]
50 public class LocalUserProfilesServicesConnector : ISharedRegionModule
51 {
52 private static readonly ILog m_log =
53 LogManager.GetLogger(
54 MethodBase.GetCurrentMethod().DeclaringType);
55
56 private Dictionary<UUID, Scene> regions = new Dictionary<UUID, Scene>();
57
58 public IUserProfilesService ServiceModule
59 {
60 get; private set;
61 }
62
63 public bool Enabled
64 {
65 get; private set;
66 }
67
68 public string Name
69 {
70 get
71 {
72 return "LocalUserProfilesServicesConnector";
73 }
74 }
75
76 public string ConfigName
77 {
78 get; private set;
79 }
80
81 public Type ReplaceableInterface
82 {
83 get { return null; }
84 }
85
86 public LocalUserProfilesServicesConnector()
87 {
88 m_log.Debug("[LOCAL USERPROFILES SERVICE CONNECTOR]: LocalUserProfileServicesConnector no params");
89 }
90
91 public LocalUserProfilesServicesConnector(IConfigSource source)
92 {
93 m_log.Debug("[LOCAL USERPROFILES SERVICE CONNECTOR]: LocalUserProfileServicesConnector instantiated directly.");
94 InitialiseService(source);
95 }
96
97 public void InitialiseService(IConfigSource source)
98 {
99 ConfigName = "UserProfilesService";
100
101 // Instantiate the request handler
102 IHttpServer Server = MainServer.Instance;
103
104 IConfig config = source.Configs[ConfigName];
105 if (config == null)
106 {
107 m_log.Error("[LOCAL USERPROFILES SERVICE CONNECTOR]: UserProfilesService missing from OpenSim.ini");
108 return;
109 }
110
111 if(!config.GetBoolean("Enabled",false))
112 {
113 Enabled = false;
114 return;
115 }
116
117 Enabled = true;
118
119 string serviceDll = config.GetString("LocalServiceModule",
120 String.Empty);
121
122 if (serviceDll == String.Empty)
123 {
124 m_log.Error("[LOCAL USERPROFILES SERVICE CONNECTOR]: No LocalServiceModule named in section UserProfilesService");
125 return;
126 }
127
128 Object[] args = new Object[] { source, ConfigName };
129 ServiceModule =
130 ServerUtils.LoadPlugin<IUserProfilesService>(serviceDll,
131 args);
132
133 if (ServiceModule == null)
134 {
135 m_log.Error("[LOCAL USERPROFILES SERVICE CONNECTOR]: Can't load user profiles service");
136 return;
137 }
138
139 Enabled = true;
140
141 JsonRpcProfileHandlers handler = new JsonRpcProfileHandlers(ServiceModule);
142
143 Server.AddJsonRPCHandler("avatarclassifiedsrequest", handler.AvatarClassifiedsRequest);
144 Server.AddJsonRPCHandler("classified_update", handler.ClassifiedUpdate);
145 Server.AddJsonRPCHandler("classifieds_info_query", handler.ClassifiedInfoRequest);
146 Server.AddJsonRPCHandler("classified_delete", handler.ClassifiedDelete);
147 Server.AddJsonRPCHandler("avatarpicksrequest", handler.AvatarPicksRequest);
148 Server.AddJsonRPCHandler("pickinforequest", handler.PickInfoRequest);
149 Server.AddJsonRPCHandler("picks_update", handler.PicksUpdate);
150 Server.AddJsonRPCHandler("picks_delete", handler.PicksDelete);
151 Server.AddJsonRPCHandler("avatarnotesrequest", handler.AvatarNotesRequest);
152 Server.AddJsonRPCHandler("avatar_notes_update", handler.NotesUpdate);
153 Server.AddJsonRPCHandler("avatar_properties_request", handler.AvatarPropertiesRequest);
154 Server.AddJsonRPCHandler("avatar_properties_update", handler.AvatarPropertiesUpdate);
155 Server.AddJsonRPCHandler("avatar_interests_update", handler.AvatarInterestsUpdate);
156 Server.AddJsonRPCHandler("image_assets_request", handler.AvatarImageAssetsRequest);
157 Server.AddJsonRPCHandler("user_data_request", handler.RequestUserAppData);
158 Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData);
159
160 }
161
162 #region ISharedRegionModule implementation
163
164 void ISharedRegionModule.PostInitialise()
165 {
166 if(!Enabled)
167 return;
168 }
169
170 #endregion
171
172 #region IRegionModuleBase implementation
173
174 void IRegionModuleBase.Initialise(IConfigSource source)
175 {
176 IConfig moduleConfig = source.Configs["Modules"];
177 if (moduleConfig != null)
178 {
179 string name = moduleConfig.GetString("UserProfilesServices", "");
180 if (name == Name)
181 {
182 InitialiseService(source);
183 m_log.Info("[LOCAL USERPROFILES SERVICE CONNECTOR]: Local user profiles connector enabled");
184 }
185 }
186 }
187
188 void IRegionModuleBase.Close()
189 {
190 return;
191 }
192
193 void IRegionModuleBase.AddRegion(Scene scene)
194 {
195 if (!Enabled)
196 return;
197
198 lock (regions)
199 {
200 if (regions.ContainsKey(scene.RegionInfo.RegionID))
201 m_log.ErrorFormat("[LOCAL USERPROFILES SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
202 else
203 regions.Add(scene.RegionInfo.RegionID, scene);
204 }
205 }
206
207 void IRegionModuleBase.RemoveRegion(Scene scene)
208 {
209 if (!Enabled)
210 return;
211
212 lock (regions)
213 {
214 if (regions.ContainsKey(scene.RegionInfo.RegionID))
215 regions.Remove(scene.RegionInfo.RegionID);
216 }
217 }
218
219 void IRegionModuleBase.RegionLoaded(Scene scene)
220 {
221 if (!Enabled)
222 return;
223 }
224 #endregion
225 }
226} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
index d221d68..9f58175 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
@@ -322,7 +322,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
322 // a copy of the local asset. 322 // a copy of the local asset.
323 m_Cache.Cache(asset); 323 m_Cache.Cache(asset);
324 324
325 if (asset.Temporary || asset.Local) 325 if (asset.Local)
326 { 326 {
327 if (m_Cache != null) 327 if (m_Cache != null)
328 m_Cache.Cache(asset); 328 m_Cache.Cache(asset);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs
index 480cd69..52b1039 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs
@@ -258,7 +258,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
258 if (m_Cache != null) 258 if (m_Cache != null)
259 m_Cache.Cache(asset); 259 m_Cache.Cache(asset);
260 260
261 if (asset.Temporary || asset.Local) 261 if (asset.Local)
262 { 262 {
263// m_log.DebugFormat( 263// m_log.DebugFormat(
264// "[LOCAL ASSET SERVICE CONNECTOR]: Returning asset {0} {1} without querying database since status Temporary = {2}, Local = {3}", 264// "[LOCAL ASSET SERVICE CONNECTOR]: Returning asset {0} {1} without querying database since status Temporary = {2}, Local = {3}",
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/Tests/AssetConnectorTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/Tests/AssetConnectorTests.cs
index 1982473..4f75191 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/Tests/AssetConnectorTests.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/Tests/AssetConnectorTests.cs
@@ -42,7 +42,7 @@ using OpenSim.Tests.Common;
42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests 42namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests
43{ 43{
44 [TestFixture] 44 [TestFixture]
45 public class AssetConnectorsTests : OpenSimTestCase 45 public class AssetConnectorTests : OpenSimTestCase
46 { 46 {
47 [Test] 47 [Test]
48 public void TestAddAsset() 48 public void TestAddAsset()
@@ -77,7 +77,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests
77 // TODO: Add cache and check that this does receive a copy of the asset 77 // TODO: Add cache and check that this does receive a copy of the asset
78 } 78 }
79 79
80 [Test]
81 public void TestAddTemporaryAsset() 80 public void TestAddTemporaryAsset()
82 { 81 {
83 TestHelpers.InMethod(); 82 TestHelpers.InMethod();
@@ -93,8 +92,45 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests
93 LocalAssetServicesConnector lasc = new LocalAssetServicesConnector(); 92 LocalAssetServicesConnector lasc = new LocalAssetServicesConnector();
94 lasc.Initialise(config); 93 lasc.Initialise(config);
95 94
95 // If it is remote, it should be stored
96 AssetBase a2 = AssetHelpers.CreateNotecardAsset();
97 a2.Local = false;
98 a2.Temporary = true;
99
100 lasc.Store(a2);
101
102 AssetBase retreivedA2 = lasc.Get(a2.ID);
103 Assert.That(retreivedA2.ID, Is.EqualTo(a2.ID));
104 Assert.That(retreivedA2.Metadata.ID, Is.EqualTo(a2.Metadata.ID));
105 Assert.That(retreivedA2.Data.Length, Is.EqualTo(a2.Data.Length));
106
107 AssetMetadata retrievedA2Metadata = lasc.GetMetadata(a2.ID);
108 Assert.That(retrievedA2Metadata.ID, Is.EqualTo(a2.ID));
109
110 byte[] retrievedA2Data = lasc.GetData(a2.ID);
111 Assert.That(retrievedA2Data.Length, Is.EqualTo(a2.Data.Length));
112
113 // TODO: Add cache and check that this does receive a copy of the asset
114 }
115
116 [Test]
117 public void TestAddLocalAsset()
118 {
119 TestHelpers.InMethod();
120// TestHelpers.EnableLogging();
121
122 IConfigSource config = new IniConfigSource();
123 config.AddConfig("Modules");
124 config.Configs["Modules"].Set("AssetServices", "LocalAssetServicesConnector");
125 config.AddConfig("AssetService");
126 config.Configs["AssetService"].Set("LocalServiceModule", "OpenSim.Services.AssetService.dll:AssetService");
127 config.Configs["AssetService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
128
129 LocalAssetServicesConnector lasc = new LocalAssetServicesConnector();
130 lasc.Initialise(config);
131
96 AssetBase a1 = AssetHelpers.CreateNotecardAsset(); 132 AssetBase a1 = AssetHelpers.CreateNotecardAsset();
97 a1.Temporary = true; 133 a1.Local = true;
98 134
99 lasc.Store(a1); 135 lasc.Store(a1);
100 136
@@ -106,7 +142,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests
106 } 142 }
107 143
108 [Test] 144 [Test]
109 public void TestAddLocalAsset() 145 public void TestAddTemporaryLocalAsset()
110 { 146 {
111 TestHelpers.InMethod(); 147 TestHelpers.InMethod();
112// TestHelpers.EnableLogging(); 148// TestHelpers.EnableLogging();
@@ -121,8 +157,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.Tests
121 LocalAssetServicesConnector lasc = new LocalAssetServicesConnector(); 157 LocalAssetServicesConnector lasc = new LocalAssetServicesConnector();
122 lasc.Initialise(config); 158 lasc.Initialise(config);
123 159
160 // If it is local, it should not be stored
124 AssetBase a1 = AssetHelpers.CreateNotecardAsset(); 161 AssetBase a1 = AssetHelpers.CreateNotecardAsset();
125 a1.Local = true; 162 a1.Local = true;
163 a1.Temporary = true;
126 164
127 lasc.Store(a1); 165 lasc.Store(a1);
128 166
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index c0c2ca7..31ef79b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -56,6 +56,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
56 56
57 public LocalGridServicesConnector() 57 public LocalGridServicesConnector()
58 { 58 {
59 m_log.Debug("[LOCAL GRID SERVICE CONNECTOR]: LocalGridServicesConnector no parms.");
59 } 60 }
60 61
61 public LocalGridServicesConnector(IConfigSource source) 62 public LocalGridServicesConnector(IConfigSource source)
@@ -142,10 +143,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
142 143
143 scene.RegisterModuleInterface<IGridService>(this); 144 scene.RegisterModuleInterface<IGridService>(this);
144 145
145 if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID)) 146 lock (m_LocalCache)
146 m_log.ErrorFormat("[LOCAL GRID SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!"); 147 {
147 else 148 if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID))
148 m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene)); 149 m_log.ErrorFormat("[LOCAL GRID SERVICE CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
150 else
151 m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene));
152 }
149 } 153 }
150 154
151 public void RemoveRegion(Scene scene) 155 public void RemoveRegion(Scene scene)
@@ -153,8 +157,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
153 if (!m_Enabled) 157 if (!m_Enabled)
154 return; 158 return;
155 159
156 m_LocalCache[scene.RegionInfo.RegionID].Clear(); 160 lock (m_LocalCache)
157 m_LocalCache.Remove(scene.RegionInfo.RegionID); 161 {
162 m_LocalCache[scene.RegionInfo.RegionID].Clear();
163 m_LocalCache.Remove(scene.RegionInfo.RegionID);
164 }
158 } 165 }
159 166
160 public void RegionLoaded(Scene scene) 167 public void RegionLoaded(Scene scene)
@@ -191,12 +198,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
191 198
192 // First see if it's a neighbour, even if it isn't on this sim. 199 // First see if it's a neighbour, even if it isn't on this sim.
193 // Neighbour data is cached in memory, so this is fast 200 // Neighbour data is cached in memory, so this is fast
194 foreach (RegionCache rcache in m_LocalCache.Values) 201
202 lock (m_LocalCache)
195 { 203 {
196 region = rcache.GetRegionByPosition(x, y); 204 foreach (RegionCache rcache in m_LocalCache.Values)
197 if (region != null)
198 { 205 {
199 return region; 206 region = rcache.GetRegionByPosition(x, y);
207 if (region != null)
208 {
209 return region;
210 }
200 } 211 }
201 } 212 }
202 213
@@ -224,6 +235,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
224 return m_GridService.GetDefaultRegions(scopeID); 235 return m_GridService.GetDefaultRegions(scopeID);
225 } 236 }
226 237
238 public List<GridRegion> GetDefaultHypergridRegions(UUID scopeID)
239 {
240 return m_GridService.GetDefaultHypergridRegions(scopeID);
241 }
242
227 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) 243 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y)
228 { 244 {
229 return m_GridService.GetFallbackRegions(scopeID, x, y); 245 return m_GridService.GetFallbackRegions(scopeID, x, y);
@@ -245,12 +261,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
245 { 261 {
246 System.Text.StringBuilder caps = new System.Text.StringBuilder(); 262 System.Text.StringBuilder caps = new System.Text.StringBuilder();
247 263
248 foreach (KeyValuePair<UUID, RegionCache> kvp in m_LocalCache) 264 lock (m_LocalCache)
249 { 265 {
250 caps.AppendFormat("*** Neighbours of {0} ({1}) ***\n", kvp.Value.RegionName, kvp.Key); 266 foreach (KeyValuePair<UUID, RegionCache> kvp in m_LocalCache)
251 List<GridRegion> regions = kvp.Value.GetNeighbours(); 267 {
252 foreach (GridRegion r in regions) 268 caps.AppendFormat("*** Neighbours of {0} ({1}) ***\n", kvp.Value.RegionName, kvp.Key);
253 caps.AppendFormat(" {0} @ {1}-{2}\n", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); 269 List<GridRegion> regions = kvp.Value.GetNeighbours();
270 foreach (GridRegion r in regions)
271 caps.AppendFormat(" {0} @ {1}-{2}\n", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize);
272 }
254 } 273 }
255 274
256 MainConsole.Instance.Output(caps.ToString()); 275 MainConsole.Instance.Output(caps.ToString());
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index b2646ba..6a57d1f 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -277,6 +277,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
277 return rinfo; 277 return rinfo;
278 } 278 }
279 279
280 public List<GridRegion> GetDefaultHypergridRegions(UUID scopeID)
281 {
282 List<GridRegion> rinfo = m_LocalGridService.GetDefaultHypergridRegions(scopeID);
283 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Local GetDefaultHypergridRegions {0} found {1} regions", name, rinfo.Count);
284 List<GridRegion> grinfo = m_RemoteGridService.GetDefaultHypergridRegions(scopeID);
285
286 if (grinfo != null)
287 {
288 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetDefaultHypergridRegions {0} found {1} regions", name, grinfo.Count);
289 foreach (GridRegion r in grinfo)
290 {
291 m_RegionInfoCache.Cache(r);
292 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
293 rinfo.Add(r);
294 }
295 }
296
297 return rinfo;
298 }
299
280 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) 300 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y)
281 { 301 {
282 List<GridRegion> rinfo = m_LocalGridService.GetFallbackRegions(scopeID, x, y); 302 List<GridRegion> rinfo = m_LocalGridService.GetFallbackRegions(scopeID, x, y);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs
index 221f815..e05d186 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/GridUser/ActivityDetector.cs
@@ -81,6 +81,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.GridUser
81 81
82 public void OnConnectionClose(IClientAPI client) 82 public void OnConnectionClose(IClientAPI client)
83 { 83 {
84 if (client == null)
85 return;
86 if (client.SceneAgent == null)
87 return;
88
84 if (client.SceneAgent.IsChildAgent) 89 if (client.SceneAgent.IsChildAgent)
85 return; 90 return;
86 91
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index e474ef6..58576d1 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -233,6 +233,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
233 if (sp != null) 233 if (sp != null)
234 { 234 {
235 AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 235 AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
236 if (aCircuit == null)
237 return;
238 if (aCircuit.ServiceURLs == null)
239 return;
240
236 if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) 241 if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
237 { 242 {
238 inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); 243 inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
index 1e434b9..2fc8ee3 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
@@ -1,11 +1,41 @@
1using System; 1/*
2using System.Collections.Generic; 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
3 27
28using System;
29using System.Collections.Generic;
30using System.Threading;
4using OpenSim.Framework; 31using OpenSim.Framework;
5using OpenMetaverse; 32using OpenMetaverse;
6 33
7namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory 34namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
8{ 35{
36 /// <summary>
37 /// Cache root and system inventory folders to reduce number of potentially remote inventory calls and associated holdups.
38 /// </summary>
9 public class InventoryCache 39 public class InventoryCache
10 { 40 {
11 private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour 41 private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour
@@ -16,8 +46,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
16 46
17 public void Cache(UUID userID, InventoryFolderBase root) 47 public void Cache(UUID userID, InventoryFolderBase root)
18 { 48 {
19 lock (m_RootFolders) 49 m_RootFolders.AddOrUpdate(userID, root, CACHE_EXPIRATION_SECONDS);
20 m_RootFolders.AddOrUpdate(userID, root, CACHE_EXPIRATION_SECONDS);
21 } 50 }
22 51
23 public InventoryFolderBase GetRootFolder(UUID userID) 52 public InventoryFolderBase GetRootFolder(UUID userID)
@@ -31,14 +60,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
31 60
32 public void Cache(UUID userID, AssetType type, InventoryFolderBase folder) 61 public void Cache(UUID userID, AssetType type, InventoryFolderBase folder)
33 { 62 {
34 lock (m_FolderTypes) 63 Dictionary<AssetType, InventoryFolderBase> ff = null;
64 if (!m_FolderTypes.TryGetValue(userID, out ff))
65 {
66 ff = new Dictionary<AssetType, InventoryFolderBase>();
67 m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS);
68 }
69
70 // We need to lock here since two threads could potentially retrieve the same dictionary
71 // and try to add a folder for that type simultaneously. Dictionary<>.Add() is not described as thread-safe in the SDK
72 // even if the folders are identical.
73 lock (ff)
35 { 74 {
36 Dictionary<AssetType, InventoryFolderBase> ff = null;
37 if (!m_FolderTypes.TryGetValue(userID, out ff))
38 {
39 ff = new Dictionary<AssetType, InventoryFolderBase>();
40 m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS);
41 }
42 if (!ff.ContainsKey(type)) 75 if (!ff.ContainsKey(type))
43 ff.Add(type, folder); 76 ff.Add(type, folder);
44 } 77 }
@@ -50,8 +83,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
50 if (m_FolderTypes.TryGetValue(userID, out ff)) 83 if (m_FolderTypes.TryGetValue(userID, out ff))
51 { 84 {
52 InventoryFolderBase f = null; 85 InventoryFolderBase f = null;
53 if (ff.TryGetValue(type, out f)) 86
54 return f; 87 lock (ff)
88 {
89 if (ff.TryGetValue(type, out f))
90 return f;
91 }
55 } 92 }
56 93
57 return null; 94 return null;
@@ -59,8 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
59 96
60 public void Cache(UUID userID, InventoryCollection inv) 97 public void Cache(UUID userID, InventoryCollection inv)
61 { 98 {
62 lock (m_Inventories) 99 m_Inventories.AddOrUpdate(userID, inv, 120);
63 m_Inventories.AddOrUpdate(userID, inv, 120);
64 } 100 }
65 101
66 public InventoryCollection GetUserInventory(UUID userID) 102 public InventoryCollection GetUserInventory(UUID userID)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
index ec5751d..99913a9 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
@@ -196,7 +196,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
196 Util.FireAndForget(delegate 196 Util.FireAndForget(delegate
197 { 197 {
198 foreach (InventoryItemBase item in items) 198 foreach (InventoryItemBase item in items)
199 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); 199 if (!string.IsNullOrEmpty(item.CreatorData))
200 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
200 }); 201 });
201 } 202 }
202 203
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index 2d3ba82..7f78076 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -195,18 +195,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
195 { 195 {
196 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID); 196 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
197 197
198 if (invCol != null && UserManager != null) 198 // Commenting this for now, because it's causing more grief than good
199 { 199 //if (invCol != null && UserManager != null)
200 // Protect ourselves against the caller subsequently modifying the items list 200 //{
201 List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items); 201 // // Protect ourselves against the caller subsequently modifying the items list
202 202 // List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
203 if (items != null && items.Count > 0) 203
204 Util.FireAndForget(delegate 204 // if (items != null && items.Count > 0)
205 { 205 // //Util.FireAndForget(delegate
206 foreach (InventoryItemBase item in items) 206 // //{
207 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); 207 // foreach (InventoryItemBase item in items)
208 }); 208 // if (!string.IsNullOrEmpty(item.CreatorData))
209 } 209 // UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
210 // //});
211 //}
210 212
211 return invCol; 213 return invCol;
212 } 214 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs
index 172bea1..516ad40 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs
@@ -79,7 +79,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence
79 79
80 public void OnConnectionClose(IClientAPI client) 80 public void OnConnectionClose(IClientAPI client)
81 { 81 {
82 if (!client.SceneAgent.IsChildAgent) 82 if (client != null && client.SceneAgent != null && !client.SceneAgent.IsChildAgent)
83 { 83 {
84// m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName); 84// m_log.DebugFormat("[PRESENCE DETECTOR]: Detected client logout {0} in {1}", client.AgentId, client.Scene.RegionInfo.RegionName);
85 m_PresenceService.LogoutAgent(client.SessionId); 85 m_PresenceService.LogoutAgent(client.SessionId);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 8b8bb37..a9aa73c 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -46,9 +46,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 /// <summary> 48 /// <summary>
49 /// Version of this service 49 /// Version of this service.
50 /// </summary> 50 /// </summary>
51 private const string m_Version = "SIMULATION/0.1"; 51 /// <remarks>
52 /// Currently valid versions are "SIMULATION/0.1" and "SIMULATION/0.2"
53 /// </remarks>
54 public string ServiceVersion { get; set; }
52 55
53 /// <summary> 56 /// <summary>
54 /// Map region ID to scene. 57 /// Map region ID to scene.
@@ -62,28 +65,39 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
62 65
63 #region Region Module interface 66 #region Region Module interface
64 67
65 public void Initialise(IConfigSource config) 68 public void Initialise(IConfigSource configSource)
66 { 69 {
67 IConfig moduleConfig = config.Configs["Modules"]; 70 IConfig moduleConfig = configSource.Configs["Modules"];
68 if (moduleConfig != null) 71 if (moduleConfig != null)
69 { 72 {
70 string name = moduleConfig.GetString("SimulationServices", ""); 73 string name = moduleConfig.GetString("SimulationServices", "");
71 if (name == Name) 74 if (name == Name)
72 { 75 {
73 //IConfig userConfig = config.Configs["SimulationService"]; 76 InitialiseService(configSource);
74 //if (userConfig == null)
75 //{
76 // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpenSim.ini");
77 // return;
78 //}
79 77
80 m_ModuleEnabled = true; 78 m_ModuleEnabled = true;
81 79
82 m_log.Info("[SIMULATION CONNECTOR]: Local simulation enabled"); 80 m_log.Info("[LOCAL SIMULATION CONNECTOR]: Local simulation enabled.");
83 } 81 }
84 } 82 }
85 } 83 }
86 84
85 public void InitialiseService(IConfigSource configSource)
86 {
87 ServiceVersion = "SIMULATION/0.2";
88 IConfig config = configSource.Configs["SimulationService"];
89 if (config != null)
90 {
91 ServiceVersion = config.GetString("ConnectorProtocolVersion", ServiceVersion);
92
93 if (ServiceVersion != "SIMULATION/0.1" && ServiceVersion != "SIMULATION/0.2")
94 throw new Exception(string.Format("Invalid ConnectorProtocolVersion {0}", ServiceVersion));
95
96 m_log.InfoFormat(
97 "[LOCAL SIMULATION CONNECTOR]: Initialzied with connector protocol version {0}", ServiceVersion);
98 }
99 }
100
87 public void PostInitialise() 101 public void PostInitialise()
88 { 102 {
89 } 103 }
@@ -250,30 +264,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
250 return true; 264 return true;
251 } 265 }
252 266
253 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
254 {
255 agent = null;
256
257 if (destination == null)
258 return false;
259
260 if (m_scenes.ContainsKey(destination.RegionID))
261 {
262// m_log.DebugFormat(
263// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
264// s.RegionInfo.RegionName, destination.RegionHandle);
265
266 return m_scenes[destination.RegionID].IncomingRetrieveRootAgent(id, out agent);
267 }
268
269 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate");
270 return false;
271 }
272
273 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) 267 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
274 { 268 {
275 reason = "Communications failure"; 269 reason = "Communications failure";
276 version = m_Version; 270 version = ServiceVersion;
277 if (destination == null) 271 if (destination == null)
278 return false; 272 return false;
279 273
@@ -306,12 +300,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
306 return false; 300 return false;
307 } 301 }
308 302
309 public bool CloseChildAgent(GridRegion destination, UUID id) 303 public bool CloseAgent(GridRegion destination, UUID id, string auth_token)
310 {
311 return CloseAgent(destination, id);
312 }
313
314 public bool CloseAgent(GridRegion destination, UUID id)
315 { 304 {
316 if (destination == null) 305 if (destination == null)
317 return false; 306 return false;
@@ -322,7 +311,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
322// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", 311// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
323// s.RegionInfo.RegionName, destination.RegionHandle); 312// s.RegionInfo.RegionName, destination.RegionHandle);
324 313
325 Util.FireAndForget(delegate { m_scenes[destination.RegionID].IncomingCloseAgent(id, false); }); 314 m_scenes[destination.RegionID].IncomingCloseAgent(id, false, auth_token);
326 return true; 315 return true;
327 } 316 }
328 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); 317 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
@@ -383,4 +372,4 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
383 372
384 #endregion 373 #endregion
385 } 374 }
386} 375} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index c8698ca..8bd1d10 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -50,9 +50,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
50 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RemoteSimulationConnectorModule")] 50 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RemoteSimulationConnectorModule")]
51 public class RemoteSimulationConnectorModule : ISharedRegionModule, ISimulationService 51 public class RemoteSimulationConnectorModule : ISharedRegionModule, ISimulationService
52 { 52 {
53 private bool initialized = false;
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 54
55 private bool initialized = false;
56 protected bool m_enabled = false; 56 protected bool m_enabled = false;
57 protected Scene m_aScene; 57 protected Scene m_aScene;
58 // RemoteSimulationConnector does not care about local regions; it delegates that to the Local module 58 // RemoteSimulationConnector does not care about local regions; it delegates that to the Local module
@@ -64,27 +64,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
64 64
65 #region Region Module interface 65 #region Region Module interface
66 66
67 public virtual void Initialise(IConfigSource config) 67 public virtual void Initialise(IConfigSource configSource)
68 { 68 {
69 69 IConfig moduleConfig = configSource.Configs["Modules"];
70 IConfig moduleConfig = config.Configs["Modules"];
71 if (moduleConfig != null) 70 if (moduleConfig != null)
72 { 71 {
73 string name = moduleConfig.GetString("SimulationServices", ""); 72 string name = moduleConfig.GetString("SimulationServices", "");
74 if (name == Name) 73 if (name == Name)
75 { 74 {
76 //IConfig userConfig = config.Configs["SimulationService"]; 75 m_localBackend = new LocalSimulationConnectorModule();
77 //if (userConfig == null) 76
78 //{ 77 m_localBackend.InitialiseService(configSource);
79 // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpenSim.ini");
80 // return;
81 //}
82 78
83 m_remoteConnector = new SimulationServiceConnector(); 79 m_remoteConnector = new SimulationServiceConnector();
84 80
85 m_enabled = true; 81 m_enabled = true;
86 82
87 m_log.Info("[SIMULATION CONNECTOR]: Remote simulation enabled"); 83 m_log.Info("[REMOTE SIMULATION CONNECTOR]: Remote simulation enabled.");
88 } 84 }
89 } 85 }
90 } 86 }
@@ -142,8 +138,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
142 } 138 }
143 139
144 protected virtual void InitOnce(Scene scene) 140 protected virtual void InitOnce(Scene scene)
145 { 141 {
146 m_localBackend = new LocalSimulationConnectorModule();
147 m_aScene = scene; 142 m_aScene = scene;
148 //m_regionClient = new RegionToRegionClient(m_aScene, m_hyperlinkService); 143 //m_regionClient = new RegionToRegionClient(m_aScene, m_hyperlinkService);
149 m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName); 144 m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName);
@@ -194,7 +189,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
194 return false; 189 return false;
195 190
196 // Try local first 191 // Try local first
197 if (m_localBackend.IsLocalRegion(destination.RegionHandle)) 192 if (m_localBackend.IsLocalRegion(destination.RegionID))
198 return m_localBackend.UpdateAgent(destination, cAgentData); 193 return m_localBackend.UpdateAgent(destination, cAgentData);
199 194
200 return m_remoteConnector.UpdateAgent(destination, cAgentData); 195 return m_remoteConnector.UpdateAgent(destination, cAgentData);
@@ -206,30 +201,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
206 return false; 201 return false;
207 202
208 // Try local first 203 // Try local first
209 if (m_localBackend.IsLocalRegion(destination.RegionHandle)) 204 if (m_localBackend.IsLocalRegion(destination.RegionID))
210 return m_localBackend.UpdateAgent(destination, cAgentData); 205 return m_localBackend.UpdateAgent(destination, cAgentData);
211 206
212 return m_remoteConnector.UpdateAgent(destination, cAgentData); 207 return m_remoteConnector.UpdateAgent(destination, cAgentData);
213 } 208 }
214 209
215 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
216 {
217 agent = null;
218
219 if (destination == null)
220 return false;
221
222 // Try local first
223 if (m_localBackend.RetrieveAgent(destination, id, out agent))
224 return true;
225
226 // else do the remote thing
227 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
228 return m_remoteConnector.RetrieveAgent(destination, id, out agent);
229
230 return false;
231 }
232
233 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) 210 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
234 { 211 {
235 reason = "Communications failure"; 212 reason = "Communications failure";
@@ -262,34 +239,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
262 return false; 239 return false;
263 } 240 }
264 241
265 public bool CloseChildAgent(GridRegion destination, UUID id) 242 public bool CloseAgent(GridRegion destination, UUID id, string auth_token)
266 {
267 if (destination == null)
268 return false;
269
270 // Try local first
271 if (m_localBackend.CloseChildAgent(destination, id))
272 return true;
273
274 // else do the remote thing
275 if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
276 return m_remoteConnector.CloseChildAgent(destination, id);
277
278 return false;
279 }
280
281 public bool CloseAgent(GridRegion destination, UUID id)
282 { 243 {
283 if (destination == null) 244 if (destination == null)
284 return false; 245 return false;
285 246
286 // Try local first 247 // Try local first
287 if (m_localBackend.CloseAgent(destination, id)) 248 if (m_localBackend.CloseAgent(destination, id, auth_token))
288 return true; 249 return true;
289 250
290 // else do the remote thing 251 // else do the remote thing
291 if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) 252 if (!m_localBackend.IsLocalRegion(destination.RegionID))
292 return m_remoteConnector.CloseAgent(destination, id); 253 return m_remoteConnector.CloseAgent(destination, id, auth_token);
293 254
294 return false; 255 return false;
295 } 256 }
@@ -311,7 +272,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
311 } 272 }
312 273
313 // else do the remote thing 274 // else do the remote thing
314 if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) 275 if (!m_localBackend.IsLocalRegion(destination.RegionID))
315 return m_remoteConnector.CreateObject(destination, newPosition, sog, isLocalCall); 276 return m_remoteConnector.CreateObject(destination, newPosition, sog, isLocalCall);
316 277
317 return false; 278 return false;
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs
index 4d49794..173b603 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementCommands.cs
@@ -76,6 +76,13 @@ namespace OpenSim.Region.CoreModules.World.Estate
76 " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3, all corners = -1.", 76 " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3, all corners = -1.",
77 consoleSetTerrainHeights); 77 consoleSetTerrainHeights);
78 78
79 m_module.Scene.AddCommand("Regions", m_module, "set water height",
80 "set water height <height> [<x>] [<y>]",
81 "Sets the water height in meters. If <x> and <y> are specified, it will only set it on regions with a matching coordinate. " +
82 "Specify -1 in <x> or <y> to wildcard that coordinate.",
83 consoleSetWaterHeight);
84
85
79 m_module.Scene.AddCommand( 86 m_module.Scene.AddCommand(
80 "Estates", m_module, "estate show", "estate show", "Shows all estates on the simulator.", ShowEstatesCommand); 87 "Estates", m_module, "estate show", "estate show", "Shows all estates on the simulator.", ShowEstatesCommand);
81 } 88 }
@@ -121,7 +128,29 @@ namespace OpenSim.Region.CoreModules.World.Estate
121 } 128 }
122 } 129 }
123 } 130 }
124 131 protected void consoleSetWaterHeight(string module, string[] args)
132 {
133 string heightstring = args[3];
134
135 int x = (args.Length > 4 ? int.Parse(args[4]) : -1);
136 int y = (args.Length > 5 ? int.Parse(args[5]) : -1);
137
138 if (x == -1 || m_module.Scene.RegionInfo.RegionLocX == x)
139 {
140 if (y == -1 || m_module.Scene.RegionInfo.RegionLocY == y)
141 {
142 double selectedheight = double.Parse(heightstring);
143
144 m_log.Debug("[ESTATEMODULE]: Setting water height in " + m_module.Scene.RegionInfo.RegionName + " to " +
145 string.Format(" {0}", selectedheight));
146 m_module.Scene.RegionInfo.RegionSettings.WaterHeight = selectedheight;
147
148 m_module.Scene.RegionInfo.RegionSettings.Save();
149 m_module.TriggerRegionInfoChange();
150 m_module.sendRegionHandshakeToAll();
151 }
152 }
153 }
125 protected void consoleSetTerrainHeights(string module, string[] args) 154 protected void consoleSetTerrainHeights(string module, string[] args)
126 { 155 {
127 string num = args[3]; 156 string num = args[3];
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index a5f5749..1808fdd 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -572,7 +572,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
572 if (!Scene.TeleportClientHome(user, s.ControllingClient)) 572 if (!Scene.TeleportClientHome(user, s.ControllingClient))
573 { 573 {
574 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); 574 s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
575 s.ControllingClient.Close(); 575 Scene.IncomingCloseAgent(s.UUID, false);
576 } 576 }
577 } 577 }
578 } 578 }
@@ -807,7 +807,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
807 if (!Scene.TeleportClientHome(prey, s.ControllingClient)) 807 if (!Scene.TeleportClientHome(prey, s.ControllingClient))
808 { 808 {
809 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); 809 s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
810 s.ControllingClient.Close(); 810 Scene.IncomingCloseAgent(s.UUID, false);
811 } 811 }
812 } 812 }
813 } 813 }
@@ -830,7 +830,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
830 if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient)) 830 if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient))
831 { 831 {
832 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); 832 p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out.");
833 p.ControllingClient.Close(); 833 Scene.IncomingCloseAgent(p.UUID, false);
834 } 834 }
835 } 835 }
836 } 836 }
diff --git a/OpenSim/Region/CoreModules/World/Estate/XEstateConnector.cs b/OpenSim/Region/CoreModules/World/Estate/XEstateConnector.cs
new file mode 100644
index 0000000..73e706c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Estate/XEstateConnector.cs
@@ -0,0 +1,218 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31
32using OpenSim.Services.Interfaces;
33using GridRegion = OpenSim.Services.Interfaces.GridRegion;
34using OpenSim.Server.Base;
35using OpenSim.Framework.Servers.HttpServer;
36using OpenSim.Framework;
37using OpenSim.Region.Framework.Scenes;
38
39using OpenMetaverse;
40using log4net;
41
42namespace OpenSim.Region.CoreModules.World.Estate
43{
44 public class EstateConnector
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 protected XEstateModule m_EstateModule;
49
50 public EstateConnector(XEstateModule module)
51 {
52 m_EstateModule = module;
53 }
54
55 public void SendTeleportHomeOneUser(uint EstateID, UUID PreyID)
56 {
57 Dictionary<string, object> sendData = new Dictionary<string, object>();
58 sendData["METHOD"] = "teleport_home_one_user";
59
60 sendData["EstateID"] = EstateID.ToString();
61 sendData["PreyID"] = PreyID.ToString();
62
63 SendToEstate(EstateID, sendData);
64 }
65
66 public void SendTeleportHomeAllUsers(uint EstateID)
67 {
68 Dictionary<string, object> sendData = new Dictionary<string, object>();
69 sendData["METHOD"] = "teleport_home_all_users";
70
71 sendData["EstateID"] = EstateID.ToString();
72
73 SendToEstate(EstateID, sendData);
74 }
75
76 public bool SendUpdateCovenant(uint EstateID, UUID CovenantID)
77 {
78 Dictionary<string, object> sendData = new Dictionary<string, object>();
79 sendData["METHOD"] = "update_covenant";
80
81 sendData["CovenantID"] = CovenantID.ToString();
82 sendData["EstateID"] = EstateID.ToString();
83
84 // Handle local regions locally
85 //
86 foreach (Scene s in m_EstateModule.Scenes)
87 {
88 if (s.RegionInfo.EstateSettings.EstateID == EstateID)
89 s.RegionInfo.RegionSettings.Covenant = CovenantID;
90// s.ReloadEstateData();
91 }
92
93 SendToEstate(EstateID, sendData);
94
95 return true;
96 }
97
98 public bool SendUpdateEstate(uint EstateID)
99 {
100 Dictionary<string, object> sendData = new Dictionary<string, object>();
101 sendData["METHOD"] = "update_estate";
102
103 sendData["EstateID"] = EstateID.ToString();
104
105 // Handle local regions locally
106 //
107 foreach (Scene s in m_EstateModule.Scenes)
108 {
109 if (s.RegionInfo.EstateSettings.EstateID == EstateID)
110 s.ReloadEstateData();
111 }
112
113 SendToEstate(EstateID, sendData);
114
115 return true;
116 }
117
118 public void SendEstateMessage(uint EstateID, UUID FromID, string FromName, string Message)
119 {
120 Dictionary<string, object> sendData = new Dictionary<string, object>();
121 sendData["METHOD"] = "estate_message";
122
123 sendData["EstateID"] = EstateID.ToString();
124 sendData["FromID"] = FromID.ToString();
125 sendData["FromName"] = FromName;
126 sendData["Message"] = Message;
127
128 SendToEstate(EstateID, sendData);
129 }
130
131 private void SendToEstate(uint EstateID, Dictionary<string, object> sendData)
132 {
133 List<UUID> regions = m_EstateModule.Scenes[0].GetEstateRegions((int)EstateID);
134
135 UUID ScopeID = UUID.Zero;
136
137 // Handle local regions locally
138 //
139 lock (m_EstateModule.Scenes)
140 {
141 foreach (Scene s in m_EstateModule.Scenes)
142 {
143 if (regions.Contains(s.RegionInfo.RegionID))
144 {
145 // All regions in one estate are in the same scope.
146 // Use that scope.
147 //
148 ScopeID = s.RegionInfo.ScopeID;
149 regions.Remove(s.RegionInfo.RegionID);
150 }
151 }
152 }
153
154 // Our own region should always be in the above list.
155 // In a standalone this would not be true. But then,
156 // Scope ID is not relevat there. Use first scope.
157 //
158 if (ScopeID == UUID.Zero)
159 ScopeID = m_EstateModule.Scenes[0].RegionInfo.ScopeID;
160
161 // Don't send to the same instance twice
162 //
163 List<string> done = new List<string>();
164
165 // Send to remote regions
166 //
167 foreach (UUID regionID in regions)
168 {
169 GridRegion region = m_EstateModule.Scenes[0].GridService.GetRegionByUUID(ScopeID, regionID);
170 if (region != null)
171 {
172 string url = "http://" + region.ExternalHostName + ":" + region.HttpPort;
173 if (done.Contains(url))
174 continue;
175
176 Call(region, sendData);
177 done.Add(url);
178 }
179 }
180 }
181
182 private bool Call(GridRegion region, Dictionary<string, object> sendData)
183 {
184 string reqString = ServerUtils.BuildQueryString(sendData);
185 // m_log.DebugFormat("[XESTATE CONNECTOR]: queryString = {0}", reqString);
186 try
187 {
188 string url = "http://" + region.ExternalHostName + ":" + region.HttpPort;
189 string reply = SynchronousRestFormsRequester.MakeRequest("POST",
190 url + "/estate",
191 reqString);
192 if (reply != string.Empty)
193 {
194 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
195
196 if (replyData.ContainsKey("RESULT"))
197 {
198 if (replyData["RESULT"].ToString().ToLower() == "true")
199 return true;
200 else
201 return false;
202 }
203 else
204 m_log.DebugFormat("[XESTATE CONNECTOR]: reply data does not contain result field");
205
206 }
207 else
208 m_log.DebugFormat("[XESTATE CONNECTOR]: received empty reply");
209 }
210 catch (Exception e)
211 {
212 m_log.DebugFormat("[XESTATE CONNECTOR]: Exception when contacting remote sim: {0}", e.Message);
213 }
214
215 return false;
216 }
217 }
218}
diff --git a/OpenSim/Region/CoreModules/World/Estate/XEstateModule.cs b/OpenSim/Region/CoreModules/World/Estate/XEstateModule.cs
new file mode 100644
index 0000000..f54ab2c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Estate/XEstateModule.cs
@@ -0,0 +1,256 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using log4net;
33using Nini.Config;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Communications;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40using OpenSim.Services.Interfaces;
41using OpenSim.Server.Base;
42using OpenSim.Framework.Servers;
43using OpenSim.Framework.Servers.HttpServer;
44using Mono.Addins;
45
46namespace OpenSim.Region.CoreModules.World.Estate
47{
48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "XEstate")]
49 public class XEstateModule : ISharedRegionModule
50 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 protected List<Scene> m_Scenes = new List<Scene>();
54 protected bool m_InInfoUpdate = false;
55
56 public bool InInfoUpdate
57 {
58 get { return m_InInfoUpdate; }
59 set { m_InInfoUpdate = value; }
60 }
61
62 public List<Scene> Scenes
63 {
64 get { return m_Scenes; }
65 }
66
67 protected EstateConnector m_EstateConnector;
68
69 public void Initialise(IConfigSource config)
70 {
71 int port = 0;
72
73 IConfig estateConfig = config.Configs["Estate"];
74 if (estateConfig != null)
75 {
76 port = estateConfig.GetInt("Port", 0);
77 }
78
79 m_EstateConnector = new EstateConnector(this);
80
81 // Instantiate the request handler
82 IHttpServer server = MainServer.GetHttpServer((uint)port);
83 server.AddStreamHandler(new EstateRequestHandler(this));
84 }
85
86 public void PostInitialise()
87 {
88 }
89
90 public void Close()
91 {
92 }
93
94 public void AddRegion(Scene scene)
95 {
96 lock (m_Scenes)
97 m_Scenes.Add(scene);
98
99 scene.EventManager.OnNewClient += OnNewClient;
100 }
101
102 public void RegionLoaded(Scene scene)
103 {
104 IEstateModule em = scene.RequestModuleInterface<IEstateModule>();
105
106 em.OnRegionInfoChange += OnRegionInfoChange;
107 em.OnEstateInfoChange += OnEstateInfoChange;
108 em.OnEstateMessage += OnEstateMessage;
109 }
110
111 public void RemoveRegion(Scene scene)
112 {
113 scene.EventManager.OnNewClient -= OnNewClient;
114
115 lock (m_Scenes)
116 m_Scenes.Remove(scene);
117 }
118
119 public string Name
120 {
121 get { return "EstateModule"; }
122 }
123
124 public Type ReplaceableInterface
125 {
126 get { return null; }
127 }
128
129 private Scene FindScene(UUID RegionID)
130 {
131 foreach (Scene s in Scenes)
132 {
133 if (s.RegionInfo.RegionID == RegionID)
134 return s;
135 }
136
137 return null;
138 }
139
140 private void OnRegionInfoChange(UUID RegionID)
141 {
142 Scene s = FindScene(RegionID);
143 if (s == null)
144 return;
145
146 if (!m_InInfoUpdate)
147 m_EstateConnector.SendUpdateCovenant(s.RegionInfo.EstateSettings.EstateID, s.RegionInfo.RegionSettings.Covenant);
148 }
149
150 private void OnEstateInfoChange(UUID RegionID)
151 {
152 Scene s = FindScene(RegionID);
153 if (s == null)
154 return;
155
156 if (!m_InInfoUpdate)
157 m_EstateConnector.SendUpdateEstate(s.RegionInfo.EstateSettings.EstateID);
158 }
159
160 private void OnEstateMessage(UUID RegionID, UUID FromID, string FromName, string Message)
161 {
162 Scene senderScenes = FindScene(RegionID);
163 if (senderScenes == null)
164 return;
165
166 uint estateID = senderScenes.RegionInfo.EstateSettings.EstateID;
167
168 foreach (Scene s in Scenes)
169 {
170 if (s.RegionInfo.EstateSettings.EstateID == estateID)
171 {
172 IDialogModule dm = s.RequestModuleInterface<IDialogModule>();
173
174 if (dm != null)
175 {
176 dm.SendNotificationToUsersInRegion(FromID, FromName,
177 Message);
178 }
179 }
180 }
181 if (!m_InInfoUpdate)
182 m_EstateConnector.SendEstateMessage(estateID, FromID, FromName, Message);
183 }
184
185 private void OnNewClient(IClientAPI client)
186 {
187 client.OnEstateTeleportOneUserHomeRequest += OnEstateTeleportOneUserHomeRequest;
188 client.OnEstateTeleportAllUsersHomeRequest += OnEstateTeleportAllUsersHomeRequest;
189
190 }
191
192 private void OnEstateTeleportOneUserHomeRequest(IClientAPI client, UUID invoice, UUID senderID, UUID prey)
193 {
194 if (prey == UUID.Zero)
195 return;
196
197 if (!(client.Scene is Scene))
198 return;
199
200 Scene scene = (Scene)client.Scene;
201
202 uint estateID = scene.RegionInfo.EstateSettings.EstateID;
203
204 if (!scene.Permissions.CanIssueEstateCommand(client.AgentId, false))
205 return;
206
207 foreach (Scene s in Scenes)
208 {
209 if (s == scene)
210 continue; // Already handles by estate module
211 if (s.RegionInfo.EstateSettings.EstateID != estateID)
212 continue;
213
214 ScenePresence p = scene.GetScenePresence(prey);
215 if (p != null && !p.IsChildAgent)
216 {
217 p.ControllingClient.SendTeleportStart(16);
218 scene.TeleportClientHome(prey, p.ControllingClient);
219 }
220 }
221
222 m_EstateConnector.SendTeleportHomeOneUser(estateID, prey);
223 }
224
225 private void OnEstateTeleportAllUsersHomeRequest(IClientAPI client, UUID invoice, UUID senderID)
226 {
227 if (!(client.Scene is Scene))
228 return;
229
230 Scene scene = (Scene)client.Scene;
231
232 uint estateID = scene.RegionInfo.EstateSettings.EstateID;
233
234 if (!scene.Permissions.CanIssueEstateCommand(client.AgentId, false))
235 return;
236
237 foreach (Scene s in Scenes)
238 {
239 if (s == scene)
240 continue; // Already handles by estate module
241 if (s.RegionInfo.EstateSettings.EstateID != estateID)
242 continue;
243
244 scene.ForEachScenePresence(delegate(ScenePresence p) {
245 if (p != null && !p.IsChildAgent)
246 {
247 p.ControllingClient.SendTeleportStart(16);
248 scene.TeleportClientHome(p.ControllingClient.AgentId, p.ControllingClient);
249 }
250 });
251 }
252
253 m_EstateConnector.SendTeleportHomeAllUsers(estateID);
254 }
255 }
256}
diff --git a/OpenSim/Region/CoreModules/World/Estate/XEstateRequestHandler.cs b/OpenSim/Region/CoreModules/World/Estate/XEstateRequestHandler.cs
new file mode 100644
index 0000000..2366767
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Estate/XEstateRequestHandler.cs
@@ -0,0 +1,298 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Reflection;
32using System.Xml;
33
34using OpenSim.Framework;
35using OpenSim.Server.Base;
36using OpenSim.Framework.Servers.HttpServer;
37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Region.Framework.Interfaces;
39
40using OpenMetaverse;
41using log4net;
42
43namespace OpenSim.Region.CoreModules.World.Estate
44{
45 public class EstateRequestHandler : BaseStreamHandler
46 {
47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48
49 protected XEstateModule m_EstateModule;
50 protected Object m_RequestLock = new Object();
51
52 public EstateRequestHandler(XEstateModule fmodule)
53 : base("POST", "/estate")
54 {
55 m_EstateModule = fmodule;
56 }
57
58 protected override byte[] ProcessRequest(string path, Stream requestData,
59 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
60 {
61 StreamReader sr = new StreamReader(requestData);
62 string body = sr.ReadToEnd();
63 sr.Close();
64 body = body.Trim();
65
66 m_log.DebugFormat("[XESTATE HANDLER]: query String: {0}", body);
67
68 try
69 {
70 lock (m_RequestLock)
71 {
72 Dictionary<string, object> request =
73 ServerUtils.ParseQueryString(body);
74
75 if (!request.ContainsKey("METHOD"))
76 return FailureResult();
77
78 string method = request["METHOD"].ToString();
79 request.Remove("METHOD");
80
81 try
82 {
83 m_EstateModule.InInfoUpdate = false;
84
85 switch (method)
86 {
87 case "update_covenant":
88 return UpdateCovenant(request);
89 case "update_estate":
90 return UpdateEstate(request);
91 case "estate_message":
92 return EstateMessage(request);
93 case "teleport_home_one_user":
94 return TeleportHomeOneUser(request);
95 case "teleport_home_all_users":
96 return TeleportHomeAllUsers(request);
97 }
98 }
99 finally
100 {
101 m_EstateModule.InInfoUpdate = false;
102 }
103 }
104 }
105 catch (Exception e)
106 {
107 m_log.Debug("[XESTATE]: Exception {0}" + e.ToString());
108 }
109
110 return FailureResult();
111 }
112
113 byte[] TeleportHomeAllUsers(Dictionary<string, object> request)
114 {
115 UUID PreyID = UUID.Zero;
116 int EstateID = 0;
117
118 if (!request.ContainsKey("EstateID"))
119 return FailureResult();
120
121 if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
122 return FailureResult();
123
124 foreach (Scene s in m_EstateModule.Scenes)
125 {
126 if (s.RegionInfo.EstateSettings.EstateID == EstateID)
127 {
128 s.ForEachScenePresence(delegate(ScenePresence p) {
129 if (p != null && !p.IsChildAgent)
130 {
131 p.ControllingClient.SendTeleportStart(16);
132 s.TeleportClientHome(p.ControllingClient.AgentId, p.ControllingClient);
133 }
134 });
135 }
136 }
137
138 return SuccessResult();
139 }
140
141 byte[] TeleportHomeOneUser(Dictionary<string, object> request)
142 {
143 UUID PreyID = UUID.Zero;
144 int EstateID = 0;
145
146 if (!request.ContainsKey("PreyID") ||
147 !request.ContainsKey("EstateID"))
148 {
149 return FailureResult();
150 }
151
152 if (!UUID.TryParse(request["PreyID"].ToString(), out PreyID))
153 return FailureResult();
154
155 if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
156 return FailureResult();
157
158 foreach (Scene s in m_EstateModule.Scenes)
159 {
160 if (s.RegionInfo.EstateSettings.EstateID == EstateID)
161 {
162 ScenePresence p = s.GetScenePresence(PreyID);
163 if (p != null && !p.IsChildAgent)
164 {
165 p.ControllingClient.SendTeleportStart(16);
166 s.TeleportClientHome(PreyID, p.ControllingClient);
167 }
168 }
169 }
170
171 return SuccessResult();
172 }
173
174 byte[] EstateMessage(Dictionary<string, object> request)
175 {
176 UUID FromID = UUID.Zero;
177 string FromName = String.Empty;
178 string Message = String.Empty;
179 int EstateID = 0;
180
181 if (!request.ContainsKey("FromID") ||
182 !request.ContainsKey("FromName") ||
183 !request.ContainsKey("Message") ||
184 !request.ContainsKey("EstateID"))
185 {
186 return FailureResult();
187 }
188
189 if (!UUID.TryParse(request["FromID"].ToString(), out FromID))
190 return FailureResult();
191
192 if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
193 return FailureResult();
194
195 FromName = request["FromName"].ToString();
196 Message = request["Message"].ToString();
197
198 foreach (Scene s in m_EstateModule.Scenes)
199 {
200 if (s.RegionInfo.EstateSettings.EstateID == EstateID)
201 {
202 IDialogModule dm = s.RequestModuleInterface<IDialogModule>();
203
204 if (dm != null)
205 {
206 dm.SendNotificationToUsersInRegion(FromID, FromName,
207 Message);
208 }
209 }
210 }
211
212 return SuccessResult();
213 }
214
215 byte[] UpdateCovenant(Dictionary<string, object> request)
216 {
217 UUID CovenantID = UUID.Zero;
218 int EstateID = 0;
219
220 if (!request.ContainsKey("CovenantID") || !request.ContainsKey("EstateID"))
221 return FailureResult();
222
223 if (!UUID.TryParse(request["CovenantID"].ToString(), out CovenantID))
224 return FailureResult();
225
226 if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
227 return FailureResult();
228
229 foreach (Scene s in m_EstateModule.Scenes)
230 {
231 if (s.RegionInfo.EstateSettings.EstateID == (uint)EstateID)
232 s.RegionInfo.RegionSettings.Covenant = CovenantID;
233 }
234
235 return SuccessResult();
236 }
237
238 byte[] UpdateEstate(Dictionary<string, object> request)
239 {
240 int EstateID = 0;
241
242 if (!request.ContainsKey("EstateID"))
243 return FailureResult();
244 if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
245 return FailureResult();
246
247 foreach (Scene s in m_EstateModule.Scenes)
248 {
249 if (s.RegionInfo.EstateSettings.EstateID == (uint)EstateID)
250 s.ReloadEstateData();
251 }
252 return SuccessResult();
253 }
254
255 private byte[] FailureResult()
256 {
257 return BoolResult(false);
258 }
259
260 private byte[] SuccessResult()
261 {
262 return BoolResult(true);
263 }
264
265 private byte[] BoolResult(bool value)
266 {
267 XmlDocument doc = new XmlDocument();
268
269 XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
270 "", "");
271
272 doc.AppendChild(xmlnode);
273
274 XmlElement rootElement = doc.CreateElement("", "ServerResponse",
275 "");
276
277 doc.AppendChild(rootElement);
278
279 XmlElement result = doc.CreateElement("", "RESULT", "");
280 result.AppendChild(doc.CreateTextNode(value.ToString()));
281
282 rootElement.AppendChild(result);
283
284 return DocToBytes(doc);
285 }
286
287 private byte[] DocToBytes(XmlDocument doc)
288 {
289 MemoryStream ms = new MemoryStream();
290 XmlTextWriter xw = new XmlTextWriter(ms, null);
291 xw.Formatting = Formatting.Indented;
292 doc.WriteTo(xw);
293 xw.Flush();
294
295 return ms.ToArray();
296 }
297 }
298}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index c307998..dbc9296 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -74,6 +74,7 @@ namespace OpenSim.Region.CoreModules.World.Land
74 74
75 protected IUserManagement m_userManager; 75 protected IUserManagement m_userManager;
76 protected IPrimCountModule m_primCountModule; 76 protected IPrimCountModule m_primCountModule;
77 protected IDialogModule m_Dialog;
77 78
78 // Minimum for parcels to work is 64m even if we don't actually use them. 79 // Minimum for parcels to work is 64m even if we don't actually use them.
79 #pragma warning disable 0429 80 #pragma warning disable 0429
@@ -161,6 +162,7 @@ namespace OpenSim.Region.CoreModules.World.Land
161 { 162 {
162 m_userManager = m_scene.RequestModuleInterface<IUserManagement>(); 163 m_userManager = m_scene.RequestModuleInterface<IUserManagement>();
163 m_primCountModule = m_scene.RequestModuleInterface<IPrimCountModule>(); 164 m_primCountModule = m_scene.RequestModuleInterface<IPrimCountModule>();
165 m_Dialog = m_scene.RequestModuleInterface<IDialogModule>();
164 } 166 }
165 167
166 public void RemoveRegion(Scene scene) 168 public void RemoveRegion(Scene scene)
@@ -213,6 +215,7 @@ namespace OpenSim.Region.CoreModules.World.Land
213 client.OnPreAgentUpdate += ClientOnPreAgentUpdate; 215 client.OnPreAgentUpdate += ClientOnPreAgentUpdate;
214 client.OnParcelEjectUser += ClientOnParcelEjectUser; 216 client.OnParcelEjectUser += ClientOnParcelEjectUser;
215 client.OnParcelFreezeUser += ClientOnParcelFreezeUser; 217 client.OnParcelFreezeUser += ClientOnParcelFreezeUser;
218 client.OnSetStartLocationRequest += ClientOnSetHome;
216 219
217 EntityBase presenceEntity; 220 EntityBase presenceEntity;
218 if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) 221 if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence)
@@ -1896,7 +1899,53 @@ namespace OpenSim.Region.CoreModules.World.Land
1896 land.LandData.ParcelAccessList.Add(entry); 1899 land.LandData.ParcelAccessList.Add(entry);
1897 } 1900 }
1898 } 1901 }
1899 1902
1903 /// <summary>
1904 /// Sets the Home Point. The LoginService uses this to know where to put a user when they log-in
1905 /// </summary>
1906 /// <param name="remoteClient"></param>
1907 /// <param name="regionHandle"></param>
1908 /// <param name="position"></param>
1909 /// <param name="lookAt"></param>
1910 /// <param name="flags"></param>
1911 public virtual void ClientOnSetHome(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
1912 {
1913 // Let's find the parcel in question
1914 ILandObject land = landChannel.GetLandObject(position);
1915 if (land == null || m_scene.GridUserService == null)
1916 {
1917 m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed.");
1918 return;
1919 }
1920
1921 // Gather some data
1922 ulong gpowers = remoteClient.GetGroupPowers(land.LandData.GroupID);
1923 SceneObjectGroup telehub = null;
1924 if (m_scene.RegionInfo.RegionSettings.TelehubObject != UUID.Zero)
1925 // Does the telehub exist in the scene?
1926 telehub = m_scene.GetSceneObjectGroup(m_scene.RegionInfo.RegionSettings.TelehubObject);
1927
1928 // Can the user set home here?
1929 if (// (a) gods and land managers can set home
1930 m_scene.Permissions.IsAdministrator(remoteClient.AgentId) ||
1931 m_scene.Permissions.IsGod(remoteClient.AgentId) ||
1932 // (b) land owners can set home
1933 remoteClient.AgentId == land.LandData.OwnerID ||
1934 // (c) members of the land-associated group in roles that can set home
1935 ((gpowers & (ulong)GroupPowers.AllowSetHome) == (ulong)GroupPowers.AllowSetHome) ||
1936 // (d) parcels with telehubs can be the home of anyone
1937 (telehub != null && land.ContainsPoint((int)telehub.AbsolutePosition.X, (int)telehub.AbsolutePosition.Y)))
1938 {
1939 if (m_scene.GridUserService.SetHome(remoteClient.AgentId.ToString(), land.RegionUUID, position, lookAt))
1940 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
1941 m_Dialog.SendAlertToUser(remoteClient, "Home position set.");
1942 else
1943 m_Dialog.SendAlertToUser(remoteClient, "Set Home request failed.");
1944 }
1945 else
1946 m_Dialog.SendAlertToUser(remoteClient, "You are not allowed to set your home location in this parcel.");
1947 }
1948
1900 protected void InstallInterfaces() 1949 protected void InstallInterfaces()
1901 { 1950 {
1902 Command clearCommand 1951 Command clearCommand
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 07d00c0..ce4bd0f 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -82,14 +82,14 @@ namespace OpenSim.Region.CoreModules.World.Land
82 82
83 set { m_landData = value; } 83 set { m_landData = value; }
84 } 84 }
85 85
86 public IPrimCounts PrimCounts { get; set; } 86 public IPrimCounts PrimCounts { get; set; }
87 87
88 public UUID RegionUUID 88 public UUID RegionUUID
89 { 89 {
90 get { return m_scene.RegionInfo.RegionID; } 90 get { return m_scene.RegionInfo.RegionID; }
91 } 91 }
92 92
93 public Vector3 StartPoint 93 public Vector3 StartPoint
94 { 94 {
95 get 95 get
@@ -102,11 +102,11 @@ namespace OpenSim.Region.CoreModules.World.Land
102 return new Vector3(x * 4, y * 4, 0); 102 return new Vector3(x * 4, y * 4, 0);
103 } 103 }
104 } 104 }
105 105
106 return new Vector3(-1, -1, -1); 106 return new Vector3(-1, -1, -1);
107 } 107 }
108 } 108 }
109 109
110 public Vector3 EndPoint 110 public Vector3 EndPoint
111 { 111 {
112 get 112 get
@@ -117,15 +117,15 @@ namespace OpenSim.Region.CoreModules.World.Land
117 { 117 {
118 if (LandBitmap[x, y]) 118 if (LandBitmap[x, y])
119 { 119 {
120 return new Vector3(x * 4, y * 4, 0); 120 return new Vector3(x * 4 + 4, y * 4 + 4, 0);
121 } 121 }
122 } 122 }
123 } 123 }
124 124
125 return new Vector3(-1, -1, -1); 125 return new Vector3(-1, -1, -1);
126 } 126 }
127 } 127 }
128 128
129 #region Constructors 129 #region Constructors
130 130
131 public LandObject(UUID owner_id, bool is_group_owned, Scene scene) 131 public LandObject(UUID owner_id, bool is_group_owned, Scene scene)
@@ -249,13 +249,6 @@ namespace OpenSim.Region.CoreModules.World.Land
249 if (estateModule != null) 249 if (estateModule != null)
250 regionFlags = estateModule.GetRegionFlags(); 250 regionFlags = estateModule.GetRegionFlags();
251 251
252 // In a perfect world, this would have worked.
253 //
254// if ((landData.Flags & (uint)ParcelFlags.AllowLandmark) != 0)
255// regionFlags |= (uint)RegionFlags.AllowLandmark;
256// if (landData.OwnerID == remote_client.AgentId)
257// regionFlags |= (uint)RegionFlags.AllowSetHome;
258
259 int seq_id; 252 int seq_id;
260 if (snap_selection && (sequence_id == 0)) 253 if (snap_selection && (sequence_id == 0))
261 { 254 {
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
index e434b2e..0e79733 100644
--- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
@@ -546,7 +546,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
546 { 546 {
547 ConsoleDisplayList cdl = new ConsoleDisplayList(); 547 ConsoleDisplayList cdl = new ConsoleDisplayList();
548 cdl.AddRow("Name", so.Name); 548 cdl.AddRow("Name", so.Name);
549 cdl.AddRow("Descrition", so.Description); 549 cdl.AddRow("Description", so.Description);
550 cdl.AddRow("Local ID", so.LocalId); 550 cdl.AddRow("Local ID", so.LocalId);
551 cdl.AddRow("UUID", so.UUID); 551 cdl.AddRow("UUID", so.UUID);
552 cdl.AddRow("Location", string.Format("{0} @ {1}", so.AbsolutePosition, so.Scene.Name)); 552 cdl.AddRow("Location", string.Format("{0} @ {1}", so.AbsolutePosition, so.Scene.Name));
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index 26e9131..50855fe 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -1453,6 +1453,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1453 1453
1454 bool permission = false; 1454 bool permission = false;
1455 1455
1456// m_log.DebugFormat("[PERMISSIONS MODULE]: Checking rez object at {0} in {1}", objectPosition, m_scene.Name);
1457
1456 ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); 1458 ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y);
1457 if (land == null) return false; 1459 if (land == null) return false;
1458 1460
diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
index 9c441ed..0c74b49 100644
--- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
+++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
@@ -48,8 +48,8 @@ namespace OpenSim.Region.CoreModules.World.Region
48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RestartModule")] 48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RestartModule")]
49 public class RestartModule : INonSharedRegionModule, IRestartModule 49 public class RestartModule : INonSharedRegionModule, IRestartModule
50 { 50 {
51// private static readonly ILog m_log = 51 private static readonly ILog m_log =
52// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53 53
54 protected Scene m_Scene; 54 protected Scene m_Scene;
55 protected Timer m_CountdownTimer = null; 55 protected Timer m_CountdownTimer = null;
@@ -223,11 +223,25 @@ namespace OpenSim.Region.CoreModules.World.Region
223 223
224 public void SetTimer(int intervalSeconds) 224 public void SetTimer(int intervalSeconds)
225 { 225 {
226 m_CountdownTimer = new Timer(); 226 if (intervalSeconds > 0)
227 m_CountdownTimer.AutoReset = false; 227 {
228 m_CountdownTimer.Interval = intervalSeconds * 1000; 228 m_CountdownTimer = new Timer();
229 m_CountdownTimer.Elapsed += OnTimer; 229 m_CountdownTimer.AutoReset = false;
230 m_CountdownTimer.Start(); 230 m_CountdownTimer.Interval = intervalSeconds * 1000;
231 m_CountdownTimer.Elapsed += OnTimer;
232 m_CountdownTimer.Start();
233 }
234 else if (m_CountdownTimer != null)
235 {
236 m_CountdownTimer.Stop();
237 m_CountdownTimer = null;
238 }
239 else
240 {
241 m_log.WarnFormat(
242 "[RESTART MODULE]: Tried to set restart timer to {0} in {1}, which is not a valid interval",
243 intervalSeconds, m_Scene.Name);
244 }
231 } 245 }
232 246
233 private void OnTimer(object source, ElapsedEventArgs e) 247 private void OnTimer(object source, ElapsedEventArgs e)
@@ -332,4 +346,4 @@ namespace OpenSim.Region.CoreModules.World.Region
332 } 346 }
333 } 347 }
334 } 348 }
335} \ No newline at end of file 349}
diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
index b4348c9..66059fb 100644
--- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
+++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
@@ -144,7 +144,20 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
144 <Flags>None</Flags> 144 <Flags>None</Flags>
145 <CollisionSound><Guid>00000000-0000-0000-0000-000000000000</Guid></CollisionSound> 145 <CollisionSound><Guid>00000000-0000-0000-0000-000000000000</Guid></CollisionSound>
146 <CollisionSoundVolume>0</CollisionSoundVolume> 146 <CollisionSoundVolume>0</CollisionSoundVolume>
147 <DynAttrs><llsd><map><key>MyStore</key><map><key>the answer</key><integer>42</integer></map></map></llsd></DynAttrs> 147 <DynAttrs>
148 <llsd>
149 <map>
150 <key>MyNamespace</key>
151 <map>
152 <key>MyStore</key>
153 <map>
154 <key>the answer</key>
155 <integer>42</integer>
156 </map>
157 </map>
158 </map>
159 </llsd>
160 </DynAttrs>
148 </SceneObjectPart> 161 </SceneObjectPart>
149 </RootPart> 162 </RootPart>
150 <OtherParts /> 163 <OtherParts />
@@ -333,7 +346,20 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
333 <EveryoneMask>0</EveryoneMask> 346 <EveryoneMask>0</EveryoneMask>
334 <NextOwnerMask>2147483647</NextOwnerMask> 347 <NextOwnerMask>2147483647</NextOwnerMask>
335 <Flags>None</Flags> 348 <Flags>None</Flags>
336 <DynAttrs><llsd><map><key>MyStore</key><map><key>last words</key><string>Rosebud</string></map></map></llsd></DynAttrs> 349 <DynAttrs>
350 <llsd>
351 <map>
352 <key>MyNamespace</key>
353 <map>
354 <key>MyStore</key>
355 <map>
356 <key>last words</key>
357 <string>Rosebud</string>
358 </map>
359 </map>
360 </map>
361 </llsd>
362 </DynAttrs>
337 <SitTargetAvatar><UUID>00000000-0000-0000-0000-000000000000</UUID></SitTargetAvatar> 363 <SitTargetAvatar><UUID>00000000-0000-0000-0000-000000000000</UUID></SitTargetAvatar>
338 </SceneObjectPart> 364 </SceneObjectPart>
339 <OtherParts /> 365 <OtherParts />
@@ -362,7 +388,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
362 Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790"))); 388 Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790")));
363 Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d"))); 389 Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d")));
364 Assert.That(rootPart.Name, Is.EqualTo("PrimMyRide")); 390 Assert.That(rootPart.Name, Is.EqualTo("PrimMyRide"));
365 OSDMap store = rootPart.DynAttrs["MyStore"]; 391 OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore");
366 Assert.AreEqual(42, store["the answer"].AsInteger()); 392 Assert.AreEqual(42, store["the answer"].AsInteger());
367 393
368 // TODO: Check other properties 394 // TODO: Check other properties
@@ -414,13 +440,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
414 rp.CreatorID = rpCreatorId; 440 rp.CreatorID = rpCreatorId;
415 rp.Shape = shape; 441 rp.Shape = shape;
416 442
443 string daNamespace = "MyNamespace";
417 string daStoreName = "MyStore"; 444 string daStoreName = "MyStore";
418 string daKey = "foo"; 445 string daKey = "foo";
419 string daValue = "bar"; 446 string daValue = "bar";
420 OSDMap myStore = new OSDMap(); 447 OSDMap myStore = new OSDMap();
421 myStore.Add(daKey, daValue); 448 myStore.Add(daKey, daValue);
422 rp.DynAttrs = new DAMap(); 449 rp.DynAttrs = new DAMap();
423 rp.DynAttrs[daStoreName] = myStore; 450 rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore);
424 451
425 SceneObjectGroup so = new SceneObjectGroup(rp); 452 SceneObjectGroup so = new SceneObjectGroup(rp);
426 453
@@ -481,7 +508,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
481 Assert.That(name, Is.EqualTo(rpName)); 508 Assert.That(name, Is.EqualTo(rpName));
482 Assert.That(creatorId, Is.EqualTo(rpCreatorId)); 509 Assert.That(creatorId, Is.EqualTo(rpCreatorId));
483 Assert.NotNull(daMap); 510 Assert.NotNull(daMap);
484 Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); 511 Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString());
485 } 512 }
486 513
487 [Test] 514 [Test]
@@ -496,7 +523,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
496 Assert.That(rootPart.UUID, Is.EqualTo(new UUID("9be68fdd-f740-4a0f-9675-dfbbb536b946"))); 523 Assert.That(rootPart.UUID, Is.EqualTo(new UUID("9be68fdd-f740-4a0f-9675-dfbbb536b946")));
497 Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("b46ef588-411e-4a8b-a284-d7dcfe8e74ef"))); 524 Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("b46ef588-411e-4a8b-a284-d7dcfe8e74ef")));
498 Assert.That(rootPart.Name, Is.EqualTo("PrimFun")); 525 Assert.That(rootPart.Name, Is.EqualTo("PrimFun"));
499 OSDMap store = rootPart.DynAttrs["MyStore"]; 526 OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore");
500 Assert.AreEqual("Rosebud", store["last words"].AsString()); 527 Assert.AreEqual("Rosebud", store["last words"].AsString());
501 528
502 // TODO: Check other properties 529 // TODO: Check other properties
@@ -522,13 +549,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
522 rp.CreatorID = rpCreatorId; 549 rp.CreatorID = rpCreatorId;
523 rp.Shape = shape; 550 rp.Shape = shape;
524 551
552 string daNamespace = "MyNamespace";
525 string daStoreName = "MyStore"; 553 string daStoreName = "MyStore";
526 string daKey = "foo"; 554 string daKey = "foo";
527 string daValue = "bar"; 555 string daValue = "bar";
528 OSDMap myStore = new OSDMap(); 556 OSDMap myStore = new OSDMap();
529 myStore.Add(daKey, daValue); 557 myStore.Add(daKey, daValue);
530 rp.DynAttrs = new DAMap(); 558 rp.DynAttrs = new DAMap();
531 rp.DynAttrs[daStoreName] = myStore; 559 rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore);
532 560
533 SceneObjectGroup so = new SceneObjectGroup(rp); 561 SceneObjectGroup so = new SceneObjectGroup(rp);
534 562
@@ -585,7 +613,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
585 Assert.That(name, Is.EqualTo(rpName)); 613 Assert.That(name, Is.EqualTo(rpName));
586 Assert.That(creatorId, Is.EqualTo(rpCreatorId)); 614 Assert.That(creatorId, Is.EqualTo(rpCreatorId));
587 Assert.NotNull(daMap); 615 Assert.NotNull(daMap);
588 Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); 616 Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString());
589 } 617 }
590 } 618 }
591} \ No newline at end of file 619} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
index 883045a..d093224 100644
--- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
+++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
@@ -369,6 +369,15 @@ namespace OpenSim.Region.CoreModules.World.Sound
369 }); 369 });
370 } 370 }
371 371
372 public void SetSoundQueueing(UUID objectID, bool shouldQueue)
373 {
374 SceneObjectPart part;
375 if (!m_scene.TryGetSceneObjectPart(objectID, out part))
376 return;
377
378 part.SoundQueueing = shouldQueue;
379 }
380
372 #endregion 381 #endregion
373 } 382 }
374} 383}
diff --git a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
index 32e93b4..50276ae 100644
--- a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
+++ b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Region.DataSnapshot
63 63
64 public Hashtable OnGetSnapshot(Hashtable keysvals) 64 public Hashtable OnGetSnapshot(Hashtable keysvals)
65 { 65 {
66 m_log.Info("[DATASNAPSHOT] Received collection request"); 66 m_log.Debug("[DATASNAPSHOT] Received collection request");
67 Hashtable reply = new Hashtable(); 67 Hashtable reply = new Hashtable();
68 int statuscode = 200; 68 int statuscode = 200;
69 69
@@ -80,7 +80,7 @@ namespace OpenSim.Region.DataSnapshot
80 80
81 public Hashtable OnValidate(Hashtable keysvals) 81 public Hashtable OnValidate(Hashtable keysvals)
82 { 82 {
83 m_log.Info("[DATASNAPSHOT] Received validation request"); 83 m_log.Debug("[DATASNAPSHOT] Received validation request");
84 Hashtable reply = new Hashtable(); 84 Hashtable reply = new Hashtable();
85 int statuscode = 200; 85 int statuscode = 200;
86 86
diff --git a/OpenSim/Region/DataSnapshot/SnapshotStore.cs b/OpenSim/Region/DataSnapshot/SnapshotStore.cs
index aa3d2ff..480aaaf 100644
--- a/OpenSim/Region/DataSnapshot/SnapshotStore.cs
+++ b/OpenSim/Region/DataSnapshot/SnapshotStore.cs
@@ -120,7 +120,7 @@ namespace OpenSim.Region.DataSnapshot
120 provider.Stale = false; 120 provider.Stale = false;
121 m_scenes[provider.GetParentScene] = true; 121 m_scenes[provider.GetParentScene] = true;
122 122
123 m_log.Info("[DATASNAPSHOT]: Generated fragment response for provider type " + provider.Name); 123 m_log.Debug("[DATASNAPSHOT]: Generated fragment response for provider type " + provider.Name);
124 } 124 }
125 else 125 else
126 { 126 {
@@ -134,7 +134,7 @@ namespace OpenSim.Region.DataSnapshot
134 data = factory.ImportNode(node, true); 134 data = factory.ImportNode(node, true);
135 } 135 }
136 136
137 m_log.Info("[DATASNAPSHOT]: Retrieved fragment response for provider type " + provider.Name); 137 m_log.Debug("[DATASNAPSHOT]: Retrieved fragment response for provider type " + provider.Name);
138 } 138 }
139 139
140 return data; 140 return data;
@@ -154,7 +154,7 @@ namespace OpenSim.Region.DataSnapshot
154 154
155 if (!m_scenes[scene]) 155 if (!m_scenes[scene])
156 { 156 {
157 m_log.Info("[DATASNAPSHOT]: Attempting to retrieve snapshot from cache."); 157 m_log.Debug("[DATASNAPSHOT]: Attempting to retrieve snapshot from cache.");
158 //get snapshot from cache 158 //get snapshot from cache
159 String path = DataFileNameScene(scene); 159 String path = DataFileNameScene(scene);
160 160
@@ -168,11 +168,11 @@ namespace OpenSim.Region.DataSnapshot
168 regionElement = factory.ImportNode(node, true); 168 regionElement = factory.ImportNode(node, true);
169 } 169 }
170 170
171 m_log.Info("[DATASNAPSHOT]: Obtained snapshot from cache for " + scene.RegionInfo.RegionName); 171 m_log.Debug("[DATASNAPSHOT]: Obtained snapshot from cache for " + scene.RegionInfo.RegionName);
172 } 172 }
173 else 173 else
174 { 174 {
175 m_log.Info("[DATASNAPSHOT]: Attempting to generate snapshot."); 175 m_log.Debug("[DATASNAPSHOT]: Attempting to generate snapshot.");
176 //make snapshot 176 //make snapshot
177 regionElement = MakeRegionNode(scene, factory); 177 regionElement = MakeRegionNode(scene, factory);
178 178
@@ -211,7 +211,7 @@ namespace OpenSim.Region.DataSnapshot
211 211
212 m_scenes[scene] = false; 212 m_scenes[scene] = false;
213 213
214 m_log.Info("[DATASNAPSHOT]: Generated new snapshot for " + scene.RegionInfo.RegionName); 214 m_log.Debug("[DATASNAPSHOT]: Generated new snapshot for " + scene.RegionInfo.RegionName);
215 } 215 }
216 216
217 return regionElement; 217 return regionElement;
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
index 292efa4..d49b24e 100644
--- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
@@ -40,7 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces
40 40
41 uint GetRegionFlags(); 41 uint GetRegionFlags();
42 bool IsManager(UUID avatarID); 42 bool IsManager(UUID avatarID);
43 43
44 /// <summary> 44 /// <summary>
45 /// Tell all clients about the current state of the region (terrain textures, water height, etc.). 45 /// Tell all clients about the current state of the region (terrain textures, water height, etc.).
46 /// </summary> 46 /// </summary>
diff --git a/OpenSim/Region/Framework/Interfaces/IEventQueue.cs b/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
index 5512642..3780ece 100644
--- a/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
@@ -53,7 +53,7 @@ namespace OpenSim.Region.Framework.Interfaces
53 UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog, 53 UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog,
54 uint timeStamp, bool offline, int parentEstateID, Vector3 position, 54 uint timeStamp, bool offline, int parentEstateID, Vector3 position,
55 uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket); 55 uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket);
56 void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID toAgent, bool canVoiceChat, 56 void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID anotherAgent, bool canVoiceChat,
57 bool isModerator, bool textMute); 57 bool isModerator, bool textMute);
58 void ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage, UUID avatarID); 58 void ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage, UUID avatarID);
59 void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID); 59 void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID);
diff --git a/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs b/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs
new file mode 100644
index 0000000..a730cfd
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs
@@ -0,0 +1,48 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using OpenMetaverse;
30using OpenSim.Framework;
31using Caps=OpenSim.Framework.Capabilities.Caps;
32
33namespace OpenSim.Region.Framework.Interfaces
34{
35 public interface IExternalCapsModule
36 {
37 /// <summary>
38 /// This function extends the simple URL configuration in the caps handlers
39 /// to facilitate more interesting computation when an external handler is
40 /// sent to the viewer.
41 /// </summary>
42 /// <param name="agentID">New user UUID</param>
43 /// <param name="caps">Internal caps registry, where the external handler will be registered</param>
44 /// <param name="capName">Name of the specific cap we are registering</param>
45 /// <param name="urlSkel">The skeleton URL provided in the caps configuration</param>
46 bool RegisterExternalUserCapsHandler(UUID agentID, Caps caps, String capName, String urlSkel);
47 }
48}
diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
index 6885327..9ae5e87 100644
--- a/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IGroupsModule.cs
@@ -97,5 +97,7 @@ namespace OpenSim.Region.Framework.Interfaces
97 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID); 97 void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InviteeID, UUID RoleID);
98 void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID InviteeID, UUID RoleID); 98 void InviteGroup(IClientAPI remoteClient, UUID agentID, UUID GroupID, UUID InviteeID, UUID RoleID);
99 void NotifyChange(UUID GroupID); 99 void NotifyChange(UUID GroupID);
100
101 List<DirGroupsReplyData> FindGroups(IClientAPI remoteClient, string query);
100 } 102 }
101} \ No newline at end of file 103} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/IServiceThrottleModule.cs b/OpenSim/Region/Framework/Interfaces/IServiceThrottleModule.cs
new file mode 100644
index 0000000..198256f
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IServiceThrottleModule.cs
@@ -0,0 +1,19 @@
1using System;
2using System.Collections.Generic;
3
4namespace OpenSim.Region.Framework.Interfaces
5{
6 public interface IServiceThrottleModule
7 {
8 /// <summary>
9 /// Enqueue a continuation meant to get a resource from elsewhere.
10 /// As usual with CPS, caller beware: if that continuation is a never-ending computation,
11 /// the whole thread will be blocked, and no requests are processed
12 /// </summary>
13 /// <param name="category">Category of the resource (e.g. name, region)</param>
14 /// <param name="itemid">The resource identifier</param>
15 /// <param name="continuation">The continuation to be executed</param>
16 void Enqueue(string category, string itemid, Action continuation);
17 }
18
19}
diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
index 68af492..8372ddd 100644
--- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
@@ -104,7 +104,6 @@ namespace OpenSim.Region.Framework.Interfaces
104 /// <param name="sound">Sound asset ID</param> 104 /// <param name="sound">Sound asset ID</param>
105 /// <param name="volume">Sound volume</param> 105 /// <param name="volume">Sound volume</param>
106 /// <param name="triggered">Triggered or not.</param> 106 /// <param name="triggered">Triggered or not.</param>
107 /// <param name="flags"></param>
108 /// <param name="radius">Sound radius</param> 107 /// <param name="radius">Sound radius</param>
109 /// <param name="useMaster">Play using sound master</param> 108 /// <param name="useMaster">Play using sound master</param>
110 /// <param name="isMaster">Play as sound master</param> 109 /// <param name="isMaster">Play as sound master</param>
@@ -123,5 +122,12 @@ namespace OpenSim.Region.Framework.Interfaces
123 /// <param name="max">AABB top north-east corner</param> 122 /// <param name="max">AABB top north-east corner</param>
124 void TriggerSoundLimited(UUID objectID, UUID sound, double volume, 123 void TriggerSoundLimited(UUID objectID, UUID sound, double volume,
125 Vector3 min, Vector3 max); 124 Vector3 min, Vector3 max);
125
126 /// <summary>
127 /// Set whether sounds on the given prim should be queued.
128 /// </summary>
129 /// <param name='objectID'></param>
130 /// <param name='shouldQueue'></param>
131 void SetSoundQueueing(UUID objectID, bool shouldQueue);
126 } 132 }
127} \ No newline at end of file 133} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index 66edfed..b7400ea 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -28,8 +28,11 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31using System.Text;
31using log4net; 32using log4net;
32using OpenMetaverse; 33using OpenMetaverse;
34using OpenMetaverse.StructuredData;
35
33using OpenSim.Framework; 36using OpenSim.Framework;
34 37
35using Animation = OpenSim.Framework.Animation; 38using Animation = OpenSim.Framework.Animation;
@@ -60,6 +63,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
60 ResetDefaultAnimation(); 63 ResetDefaultAnimation();
61 } 64 }
62 65
66 public AnimationSet(OSDArray pArray)
67 {
68 ResetDefaultAnimation();
69 FromOSDArray(pArray);
70 }
71
63 public bool HasAnimation(UUID animID) 72 public bool HasAnimation(UUID animID)
64 { 73 {
65 if (m_defaultAnimation.AnimID == animID) 74 if (m_defaultAnimation.AnimID == animID)
@@ -218,5 +227,110 @@ namespace OpenSim.Region.Framework.Scenes.Animation
218 foreach (OpenSim.Framework.Animation anim in theArray) 227 foreach (OpenSim.Framework.Animation anim in theArray)
219 m_animations.Add(anim); 228 m_animations.Add(anim);
220 } 229 }
230
231 // Create representation of this AnimationSet as an OSDArray.
232 // First two entries in the array are the default and implicitDefault animations
233 // followed by the other animations.
234 public OSDArray ToOSDArray()
235 {
236 OSDArray ret = new OSDArray();
237 ret.Add(DefaultAnimation.PackUpdateMessage());
238 ret.Add(ImplicitDefaultAnimation.PackUpdateMessage());
239
240 foreach (OpenSim.Framework.Animation anim in m_animations)
241 ret.Add(anim.PackUpdateMessage());
242
243 return ret;
244 }
245
246 public void FromOSDArray(OSDArray pArray)
247 {
248 this.Clear();
249
250 if (pArray.Count >= 1)
251 {
252 m_defaultAnimation = new OpenSim.Framework.Animation((OSDMap)pArray[0]);
253 }
254 if (pArray.Count >= 2)
255 {
256 m_implicitDefaultAnimation = new OpenSim.Framework.Animation((OSDMap)pArray[1]);
257 }
258 for (int ii = 2; ii < pArray.Count; ii++)
259 {
260 m_animations.Add(new OpenSim.Framework.Animation((OSDMap)pArray[ii]));
261 }
262 }
263
264 // Compare two AnimationSets and return 'true' if the default animations are the same
265 // and all of the animations in the list are equal.
266 public override bool Equals(object obj)
267 {
268 AnimationSet other = obj as AnimationSet;
269 if (other != null)
270 {
271 if (this.DefaultAnimation.Equals(other.DefaultAnimation)
272 && this.ImplicitDefaultAnimation.Equals(other.ImplicitDefaultAnimation))
273 {
274 // The defaults are the same. Is the list of animations the same?
275 OpenSim.Framework.Animation[] thisAnims = this.ToArray();
276 OpenSim.Framework.Animation[] otherAnims = other.ToArray();
277 if (thisAnims.Length == 0 && otherAnims.Length == 0)
278 return true; // the common case
279 if (thisAnims.Length == otherAnims.Length)
280 {
281 // Do this the hard way but since the list is usually short this won't take long.
282 foreach (OpenSim.Framework.Animation thisAnim in thisAnims)
283 {
284 bool found = false;
285 foreach (OpenSim.Framework.Animation otherAnim in otherAnims)
286 {
287 if (thisAnim.Equals(otherAnim))
288 {
289 found = true;
290 break;
291 }
292 }
293 if (!found)
294 {
295 // If anything is not in the other list, these are not equal
296 return false;
297 }
298 }
299 // Found everything in the other list. Since lists are equal length, they must be equal.
300 return true;
301 }
302 }
303 return false;
304 }
305 // Don't know what was passed, but the base system will figure it out for me.
306 return base.Equals(obj);
307 }
308
309 public override string ToString()
310 {
311 StringBuilder buff = new StringBuilder();
312 buff.Append("dflt=");
313 buff.Append(DefaultAnimation.ToString());
314 buff.Append(",iDflt=");
315 if (DefaultAnimation.Equals(ImplicitDefaultAnimation))
316 buff.Append("same");
317 else
318 buff.Append(ImplicitDefaultAnimation.ToString());
319 if (m_animations.Count > 0)
320 {
321 buff.Append(",anims=");
322 bool firstTime = true;
323 foreach (OpenSim.Framework.Animation anim in m_animations)
324 {
325 if (!firstTime)
326 buff.Append(",");
327 buff.Append("<");
328 buff.Append(anim.ToString());
329 buff.Append(">");
330 firstTime = false;
331 }
332 }
333 return buff.ToString();
334 }
221 } 335 }
222} 336}
diff --git a/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs
index c2b0468..b79dd8f 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs
@@ -104,5 +104,31 @@ namespace OpenSim.Region.Framework.Scenes.Animation
104 104
105 return UUID.Zero; 105 return UUID.Zero;
106 } 106 }
107
108 /// <summary>
109 /// Get the name of the animation given a UUID. If there is no matching animation
110 /// return the UUID as a string.
111 /// </summary>
112 public static string GetDefaultAnimationName(UUID uuid)
113 {
114 string ret = "unknown";
115 if (AnimsUUID.ContainsValue(uuid))
116 {
117 foreach (KeyValuePair<string, UUID> kvp in AnimsUUID)
118 {
119 if (kvp.Value == uuid)
120 {
121 ret = kvp.Key;
122 break;
123 }
124 }
125 }
126 else
127 {
128 ret = uuid.ToString();
129 }
130
131 return ret;
132 }
107 } 133 }
108} \ No newline at end of file 134} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 65c279e..5529a25 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -93,7 +93,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
93 GetAnimName(animID), animID, m_scenePresence.Name); 93 GetAnimName(animID), animID, m_scenePresence.Name);
94 94
95 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID)) 95 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
96 {
96 SendAnimPack(); 97 SendAnimPack();
98 m_scenePresence.TriggerScenePresenceUpdated();
99 }
97 } 100 }
98 101
99 // Called from scripts 102 // Called from scripts
@@ -132,7 +135,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
132 GetAnimName(animID), animID, m_scenePresence.Name); 135 GetAnimName(animID), animID, m_scenePresence.Name);
133 136
134 if (m_animations.Remove(animID, allowNoDefault)) 137 if (m_animations.Remove(animID, allowNoDefault))
138 {
135 SendAnimPack(); 139 SendAnimPack();
140 m_scenePresence.TriggerScenePresenceUpdated();
141 }
136 } 142 }
137 143
138 public void avnChangeAnim(UUID animID, bool addRemove, bool sendPack) 144 public void avnChangeAnim(UUID animID, bool addRemove, bool sendPack)
@@ -180,8 +186,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
180 /// The movement animation is reserved for "main" animations 186 /// The movement animation is reserved for "main" animations
181 /// that are mutually exclusive, e.g. flying and sitting. 187 /// that are mutually exclusive, e.g. flying and sitting.
182 /// </summary> 188 /// </summary>
183 public void TrySetMovementAnimation(string anim) 189 /// <returns>'true' if the animation was updated</returns>
190 public bool TrySetMovementAnimation(string anim)
184 { 191 {
192 bool ret = false;
185 if (!m_scenePresence.IsChildAgent) 193 if (!m_scenePresence.IsChildAgent)
186 { 194 {
187// m_log.DebugFormat( 195// m_log.DebugFormat(
@@ -198,6 +206,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
198 // 16384 is CHANGED_ANIMATION 206 // 16384 is CHANGED_ANIMATION
199 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION}); 207 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION});
200 SendAnimPack(); 208 SendAnimPack();
209 ret = true;
201 } 210 }
202 } 211 }
203 else 212 else
@@ -206,6 +215,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
206 "[SCENE PRESENCE ANIMATOR]: Tried to set movement animation {0} on child presence {1}", 215 "[SCENE PRESENCE ANIMATOR]: Tried to set movement animation {0} on child presence {1}",
207 anim, m_scenePresence.Name); 216 anim, m_scenePresence.Name);
208 } 217 }
218 return ret;
209 } 219 }
210 220
211 /// <summary> 221 /// <summary>
@@ -439,8 +449,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
439 /// <summary> 449 /// <summary>
440 /// Update the movement animation of this avatar according to its current state 450 /// Update the movement animation of this avatar according to its current state
441 /// </summary> 451 /// </summary>
442 public void UpdateMovementAnimations() 452 /// <returns>'true' if the animation was changed</returns>
453 public bool UpdateMovementAnimations()
443 { 454 {
455 bool ret = false;
444 lock (m_animations) 456 lock (m_animations)
445 { 457 {
446 string newMovementAnimation = DetermineMovementAnimation(); 458 string newMovementAnimation = DetermineMovementAnimation();
@@ -454,9 +466,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
454 466
455 // Only set it if it's actually changed, give a script 467 // Only set it if it's actually changed, give a script
456 // a chance to stop a default animation 468 // a chance to stop a default animation
457 TrySetMovementAnimation(CurrentMovementAnimation); 469 ret = TrySetMovementAnimation(CurrentMovementAnimation);
458 } 470 }
459 } 471 }
472 return ret;
460 } 473 }
461 474
462 public UUID[] GetAnimationArray() 475 public UUID[] GetAnimationArray()
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index f555b49..11a0146 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -104,14 +104,8 @@ namespace OpenSim.Region.Framework.Scenes
104 // better than losing the object for now. 104 // better than losing the object for now.
105 if (permissionToDelete) 105 if (permissionToDelete)
106 { 106 {
107 List<uint> killIDs = new List<uint>();
108
109 foreach (SceneObjectGroup g in objectGroups) 107 foreach (SceneObjectGroup g in objectGroups)
110 { killIDs.Add(g.LocalId); 108 g.DeleteGroupFromScene(false);
111 g.DeleteGroupFromScene(true);
112 }
113
114 m_scene.SendKillObject(killIDs);
115 } 109 }
116 } 110 }
117 111
@@ -160,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes
160 if (x.permissionToDelete) 154 if (x.permissionToDelete)
161 { 155 {
162 foreach (SceneObjectGroup g in x.objectGroups) 156 foreach (SceneObjectGroup g in x.objectGroups)
163 m_scene.DeleteSceneObject(g, false); 157 m_scene.DeleteSceneObject(g, true);
164 } 158 }
165 } 159 }
166 catch (Exception e) 160 catch (Exception e)
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 4733547..6e8eb91 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -743,7 +743,7 @@ namespace OpenSim.Region.Framework.Scenes
743 public event OnIncomingSceneObjectDelegate OnIncomingSceneObject; 743 public event OnIncomingSceneObjectDelegate OnIncomingSceneObject;
744 public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so); 744 public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so);
745 745
746 public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel); 746 public delegate void NewInventoryItemUploadComplete(UUID avatarID, AssetType type, UUID assetID, string name, int userlevel);
747 747
748 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete; 748 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete;
749 749
@@ -974,6 +974,8 @@ namespace OpenSim.Region.Framework.Scenes
974 public delegate void RegionStarted(Scene scene); 974 public delegate void RegionStarted(Scene scene);
975 public event RegionStarted OnRegionStarted; 975 public event RegionStarted OnRegionStarted;
976 976
977 public delegate void RegionHeartbeatStart(Scene scene);
978 public event RegionHeartbeatStart OnRegionHeartbeatStart;
977 public delegate void RegionHeartbeatEnd(Scene scene); 979 public delegate void RegionHeartbeatEnd(Scene scene);
978 public event RegionHeartbeatEnd OnRegionHeartbeatEnd; 980 public event RegionHeartbeatEnd OnRegionHeartbeatEnd;
979 981
@@ -1024,6 +1026,16 @@ namespace OpenSim.Region.Framework.Scenes
1024 /// </remarks> 1026 /// </remarks>
1025 public event TeleportFail OnTeleportFail; 1027 public event TeleportFail OnTeleportFail;
1026 1028
1029// public delegate void GatherUuids(SceneObjectPart sop, IDictionary<UUID, AssetType> assetUuids);
1030//
1031// /// <summary>
1032// /// Triggered when UUIDs referenced by a scene object are being gathered for archiving, hg transfer, etc.
1033// /// </summary>
1034// /// <remarks>
1035// /// The listener should add references to the IDictionary<UUID, AssetType> as appropriate.
1036// /// </remarks>
1037// public event GatherUuids OnGatherUuids;
1038
1027 public class MoneyTransferArgs : EventArgs 1039 public class MoneyTransferArgs : EventArgs
1028 { 1040 {
1029 public UUID sender; 1041 public UUID sender;
@@ -2160,7 +2172,7 @@ namespace OpenSim.Region.Framework.Scenes
2160 } 2172 }
2161 } 2173 }
2162 2174
2163 public void TriggerOnNewInventoryItemUploadComplete(UUID agentID, UUID AssetID, String AssetName, int userlevel) 2175 public void TriggerOnNewInventoryItemUploadComplete(UUID agentID, AssetType type, UUID AssetID, String AssetName, int userlevel)
2164 { 2176 {
2165 NewInventoryItemUploadComplete handlerNewInventoryItemUpdateComplete = OnNewInventoryItemUploadComplete; 2177 NewInventoryItemUploadComplete handlerNewInventoryItemUpdateComplete = OnNewInventoryItemUploadComplete;
2166 if (handlerNewInventoryItemUpdateComplete != null) 2178 if (handlerNewInventoryItemUpdateComplete != null)
@@ -2169,7 +2181,7 @@ namespace OpenSim.Region.Framework.Scenes
2169 { 2181 {
2170 try 2182 try
2171 { 2183 {
2172 d(agentID, AssetID, AssetName, userlevel); 2184 d(agentID, type, AssetID, AssetName, userlevel);
2173 } 2185 }
2174 catch (Exception e) 2186 catch (Exception e)
2175 { 2187 {
@@ -3096,6 +3108,27 @@ namespace OpenSim.Region.Framework.Scenes
3096 } 3108 }
3097 } 3109 }
3098 3110
3111 public void TriggerRegionHeartbeatStart(Scene scene)
3112 {
3113 RegionHeartbeatStart handler = OnRegionHeartbeatStart;
3114
3115 if (handler != null)
3116 {
3117 foreach (RegionHeartbeatStart d in handler.GetInvocationList())
3118 {
3119 try
3120 {
3121 d(scene);
3122 }
3123 catch (Exception e)
3124 {
3125 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionHeartbeatStart failed - continuing {0} - {1}",
3126 e.Message, e.StackTrace);
3127 }
3128 }
3129 }
3130 }
3131
3099 public void TriggerRegionHeartbeatEnd(Scene scene) 3132 public void TriggerRegionHeartbeatEnd(Scene scene)
3100 { 3133 {
3101 RegionHeartbeatEnd handler = OnRegionHeartbeatEnd; 3134 RegionHeartbeatEnd handler = OnRegionHeartbeatEnd;
@@ -3251,5 +3284,26 @@ namespace OpenSim.Region.Framework.Scenes
3251 handler(scenePresence); 3284 handler(scenePresence);
3252 } 3285 }
3253 } 3286 }
3287
3288// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary<UUID, AssetType> assetUuids)
3289// {
3290// GatherUuids handler = OnGatherUuids;
3291//
3292// if (handler != null)
3293// {
3294// foreach (GatherUuids d in handler.GetInvocationList())
3295// {
3296// try
3297// {
3298// d(sop, assetUuids);
3299// }
3300// catch (Exception e)
3301// {
3302// m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}",
3303// e.Message, e.StackTrace);
3304// }
3305// }
3306// }
3307// }
3254 } 3308 }
3255} 3309}
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
index 276b61f..c0057ee 100644
--- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
+++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
@@ -1,6 +1,29 @@
1// Proprietary code of Avination Virtual Limited 1/*
2// (c) 2012 Melanie Thielker 2 * Copyright (c) Contributors, http://opensimulator.org/
3// 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
4 27
5using System; 28using System;
6using System.Timers; 29using System.Timers;
@@ -32,7 +55,6 @@ namespace OpenSim.Region.Framework.Scenes
32 private object m_lockObject = new object(); 55 private object m_lockObject = new object();
33 private object m_timerLock = new object(); 56 private object m_timerLock = new object();
34 private const double m_tickDuration = 50.0; 57 private const double m_tickDuration = 50.0;
35 private Scene m_scene;
36 58
37 public double TickDuration 59 public double TickDuration
38 { 60 {
@@ -46,8 +68,6 @@ namespace OpenSim.Region.Framework.Scenes
46 m_timer.AutoReset = true; 68 m_timer.AutoReset = true;
47 m_timer.Elapsed += OnTimer; 69 m_timer.Elapsed += OnTimer;
48 70
49 m_scene = scene;
50
51 m_timer.Start(); 71 m_timer.Start();
52 } 72 }
53 73
@@ -71,13 +91,13 @@ namespace OpenSim.Region.Framework.Scenes
71 { 91 {
72 m.OnTimer(TickDuration); 92 m.OnTimer(TickDuration);
73 } 93 }
74 catch (Exception inner) 94 catch (Exception)
75 { 95 {
76 // Don't stop processing 96 // Don't stop processing
77 } 97 }
78 } 98 }
79 } 99 }
80 catch (Exception e) 100 catch (Exception)
81 { 101 {
82 // Keep running no matter what 102 // Keep running no matter what
83 } 103 }
@@ -134,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes
134 [Serializable] 154 [Serializable]
135 public class KeyframeMotion 155 public class KeyframeMotion
136 { 156 {
137 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 157// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
138 158
139 public enum PlayMode : int 159 public enum PlayMode : int
140 { 160 {
diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
index c11174d..f208afb 100644
--- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
+++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
@@ -46,47 +46,33 @@ using OpenSim.Region.Framework.Scenes;
46 46
47namespace OpenSim.Region.Framework.Scenes 47namespace OpenSim.Region.Framework.Scenes
48{ 48{
49 public class RegionStatsHandler : IStreamedRequestHandler 49 public class RegionStatsHandler : BaseStreamHandler
50 { 50 {
51 //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
53 private string osRXStatsURI = String.Empty;
54 private string osXStatsURI = String.Empty; 53 private string osXStatsURI = String.Empty;
55 //private string osSecret = String.Empty; 54 //private string osSecret = String.Empty;
56 private OpenSim.Framework.RegionInfo regionInfo; 55 private OpenSim.Framework.RegionInfo regionInfo;
57 public string localZone = TimeZone.CurrentTimeZone.StandardName; 56 public string localZone = TimeZone.CurrentTimeZone.StandardName;
58 public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); 57 public TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
59 58
60 public string Name { get { return "RegionStats"; } } 59 public RegionStatsHandler(RegionInfo region_info)
61 public string Description { get { return "Region Statistics"; } } 60 : base("GET", "/" + Util.SHA1Hash(region_info.regionSecret), "RegionStats", "Region Statistics")
62
63 public RegionStatsHandler(RegionInfo region_info)
64 { 61 {
65 regionInfo = region_info; 62 regionInfo = region_info;
66 osRXStatsURI = Util.SHA1Hash(regionInfo.regionSecret);
67 osXStatsURI = Util.SHA1Hash(regionInfo.osSecret); 63 osXStatsURI = Util.SHA1Hash(regionInfo.osSecret);
68 } 64 }
69 65
70 public byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 66 protected override byte[] ProcessRequest(
67 string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
71 { 68 {
72 return Util.UTF8.GetBytes(Report()); 69 return Util.UTF8.GetBytes(Report());
73 } 70 }
74 71
75 public string ContentType 72 public override string ContentType
76 { 73 {
77 get { return "text/plain"; } 74 get { return "text/plain"; }
78 } 75 }
79
80 public string HttpMethod
81 {
82 get { return "GET"; }
83 }
84
85 public string Path
86 {
87 // This is for the region and is the regionSecret hashed
88 get { return "/" + osRXStatsURI; }
89 }
90 76
91 private string Report() 77 private string Report()
92 { 78 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index d2e41f8..4337b5a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes
139 { 139 {
140 userlevel = 1; 140 userlevel = 1;
141 } 141 }
142 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); 142 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel);
143 143
144 return true; 144 return true;
145 } 145 }
@@ -178,7 +178,7 @@ namespace OpenSim.Region.Framework.Scenes
178 { 178 {
179 userlevel = 1; 179 userlevel = 1;
180 } 180 }
181 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); 181 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel);
182 182
183 if (originalFolder != UUID.Zero) 183 if (originalFolder != UUID.Zero)
184 { 184 {
@@ -411,19 +411,21 @@ namespace OpenSim.Region.Framework.Scenes
411// itemUpd.NextPermissions, itemUpd.GroupPermissions, itemUpd.EveryOnePermissions, item.Flags, 411// itemUpd.NextPermissions, itemUpd.GroupPermissions, itemUpd.EveryOnePermissions, item.Flags,
412// item.NextPermissions, item.GroupPermissions, item.EveryOnePermissions, item.CurrentPermissions); 412// item.NextPermissions, item.GroupPermissions, item.EveryOnePermissions, item.CurrentPermissions);
413 413
414 bool sendUpdate = false;
415
414 if (itemUpd.NextPermissions != 0) // Use this to determine validity. Can never be 0 if valid 416 if (itemUpd.NextPermissions != 0) // Use this to determine validity. Can never be 0 if valid
415 { 417 {
416 // Create a set of base permissions that will not include export if the user 418 // Create a set of base permissions that will not include export if the user
417 // is not allowed to change the export flag. 419 // is not allowed to change the export flag.
418 bool denyExportChange = false; 420 bool denyExportChange = false;
419 421
420 m_log.InfoFormat("[XXX]: B: {0} O: {1} E: {2}", itemUpd.BasePermissions, itemUpd.CurrentPermissions, itemUpd.EveryOnePermissions); 422// m_log.DebugFormat("[XXX]: B: {0} O: {1} E: {2}", itemUpd.BasePermissions, itemUpd.CurrentPermissions, itemUpd.EveryOnePermissions);
421 423
422 // If the user is not the creator or doesn't have "E" in both "B" and "O", deny setting export 424 // If the user is not the creator or doesn't have "E" in both "B" and "O", deny setting export
423 if ((item.BasePermissions & (uint)(PermissionMask.All | PermissionMask.Export)) != (uint)(PermissionMask.All | PermissionMask.Export) || (item.CurrentPermissions & (uint)PermissionMask.Export) == 0 || item.CreatorIdAsUuid != item.Owner) 425 if ((item.BasePermissions & (uint)(PermissionMask.All | PermissionMask.Export)) != (uint)(PermissionMask.All | PermissionMask.Export) || (item.CurrentPermissions & (uint)PermissionMask.Export) == 0 || item.CreatorIdAsUuid != item.Owner)
424 denyExportChange = true; 426 denyExportChange = true;
425 427
426 m_log.InfoFormat("[XXX]: Deny Export Update {0}", denyExportChange); 428// m_log.DebugFormat("[XXX]: Deny Export Update {0}", denyExportChange);
427 429
428 // If it is already set, force it set and also force full perm 430 // If it is already set, force it set and also force full perm
429 // else prevent setting it. It can and should never be set unless 431 // else prevent setting it. It can and should never be set unless
@@ -447,7 +449,7 @@ namespace OpenSim.Region.Framework.Scenes
447 // If the new state is exportable, force full perm 449 // If the new state is exportable, force full perm
448 if ((itemUpd.EveryOnePermissions & (uint)PermissionMask.Export) != 0) 450 if ((itemUpd.EveryOnePermissions & (uint)PermissionMask.Export) != 0)
449 { 451 {
450 m_log.InfoFormat("[XXX]: Force full perm"); 452// m_log.DebugFormat("[XXX]: Force full perm");
451 itemUpd.NextPermissions = (uint)(PermissionMask.All); 453 itemUpd.NextPermissions = (uint)(PermissionMask.All);
452 } 454 }
453 } 455 }
@@ -484,8 +486,13 @@ namespace OpenSim.Region.Framework.Scenes
484 item.SalePrice = itemUpd.SalePrice; 486 item.SalePrice = itemUpd.SalePrice;
485 item.SaleType = itemUpd.SaleType; 487 item.SaleType = itemUpd.SaleType;
486 488
489 if (item.InvType == (int)InventoryType.Wearable && (item.Flags & 0xf) == 0 && (itemUpd.Flags & 0xf) != 0)
490 {
491 item.Flags = (uint)(item.Flags & 0xfffffff0) | (itemUpd.Flags & 0xf);
492 sendUpdate = true;
493 }
494
487 InventoryService.UpdateItem(item); 495 InventoryService.UpdateItem(item);
488 remoteClient.SendBulkUpdateInventory(item);
489 } 496 }
490 497
491 if (UUID.Zero != transactionID) 498 if (UUID.Zero != transactionID)
@@ -495,6 +502,14 @@ namespace OpenSim.Region.Framework.Scenes
495 AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); 502 AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item);
496 } 503 }
497 } 504 }
505 else
506 {
507 // This MAY be problematic, if it is, another solution
508 // needs to be found. If inventory item flags are updated
509 // the viewer's notion of the item needs to be refreshed.
510 if (sendUpdate)
511 remoteClient.SendBulkUpdateInventory(item);
512 }
498 } 513 }
499 else 514 else
500 { 515 {
@@ -548,6 +563,9 @@ namespace OpenSim.Region.Framework.Scenes
548 { 563 {
549 //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); 564 //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
550 565
566 if (!Permissions.CanTransferUserInventory(itemId, senderId, recipient))
567 return null;
568
551 InventoryItemBase item = new InventoryItemBase(itemId, senderId); 569 InventoryItemBase item = new InventoryItemBase(itemId, senderId);
552 item = InventoryService.GetItem(item); 570 item = InventoryService.GetItem(item);
553 571
@@ -2124,7 +2142,10 @@ namespace OpenSim.Region.Framework.Scenes
2124 { 2142 {
2125 // If we don't have permission, stop right here 2143 // If we don't have permission, stop right here
2126 if (!permissionToTakeCopy) 2144 if (!permissionToTakeCopy)
2145 {
2146 remoteClient.SendAlertMessage("You don't have permission to take the object");
2127 return; 2147 return;
2148 }
2128 2149
2129 permissionToTake = true; 2150 permissionToTake = true;
2130 // Don't delete 2151 // Don't delete
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index ce6415a..421cb08 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -416,6 +416,7 @@ namespace OpenSim.Region.Framework.Scenes
416 void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args) 416 void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args)
417 { 417 {
418 // TODO: don't create new blocks if recycling an old packet 418 // TODO: don't create new blocks if recycling an old packet
419 bool discardableEffects = true;
419 ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count]; 420 ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
420 for (int i = 0; i < args.Count; i++) 421 for (int i = 0; i < args.Count; i++)
421 { 422 {
@@ -427,17 +428,34 @@ namespace OpenSim.Region.Framework.Scenes
427 effect.Type = args[i].Type; 428 effect.Type = args[i].Type;
428 effect.TypeData = args[i].TypeData; 429 effect.TypeData = args[i].TypeData;
429 effectBlockArray[i] = effect; 430 effectBlockArray[i] = effect;
431
432 if ((EffectType)effect.Type != EffectType.LookAt && (EffectType)effect.Type != EffectType.Beam)
433 discardableEffects = false;
434
435 //m_log.DebugFormat("[YYY]: VE {0} {1} {2}", effect.AgentID, effect.Duration, (EffectType)effect.Type);
430 } 436 }
431 437
432 ForEachClient( 438 ForEachScenePresence(sp =>
433 delegate(IClientAPI client)
434 { 439 {
435 if (client.AgentId != remoteClient.AgentId) 440 if (sp.ControllingClient.AgentId != remoteClient.AgentId)
436 client.SendViewerEffect(effectBlockArray); 441 {
437 } 442 if (!discardableEffects ||
438 ); 443 (discardableEffects && ShouldSendDiscardableEffect(remoteClient, sp)))
444 {
445 //m_log.DebugFormat("[YYY]: Sending to {0}", sp.UUID);
446 sp.ControllingClient.SendViewerEffect(effectBlockArray);
447 }
448 //else
449 // m_log.DebugFormat("[YYY]: Not sending to {0}", sp.UUID);
450 }
451 });
439 } 452 }
440 453
454 private bool ShouldSendDiscardableEffect(IClientAPI thisClient, ScenePresence other)
455 {
456 return Vector3.Distance(other.CameraPosition, thisClient.SceneAgent.AbsolutePosition) < 10;
457 }
458
441 private class DescendentsRequestData 459 private class DescendentsRequestData
442 { 460 {
443 public IClientAPI RemoteClient; 461 public IClientAPI RemoteClient;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index b189599..d6d2df4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -151,7 +151,7 @@ namespace OpenSim.Region.Framework.Scenes
151 public SynchronizeSceneHandler SynchronizeScene; 151 public SynchronizeSceneHandler SynchronizeScene;
152 152
153 /// <summary> 153 /// <summary>
154 /// Used to prevent simultaneous calls to RemoveClient() for the same agent from interfering with each other. 154 /// Used to prevent simultaneous calls to code that adds and removes agents.
155 /// </summary> 155 /// </summary>
156 private object m_removeClientLock = new object(); 156 private object m_removeClientLock = new object();
157 157
@@ -230,6 +230,8 @@ namespace OpenSim.Region.Framework.Scenes
230 public bool m_seeIntoBannedRegion = false; 230 public bool m_seeIntoBannedRegion = false;
231 public int MaxUndoCount = 5; 231 public int MaxUndoCount = 5;
232 232
233 public bool SeeIntoRegion { get; set; }
234
233 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet; 235 // Using this for RegionReady module to prevent LoginsDisabled from changing under our feet;
234 public bool LoginLock = false; 236 public bool LoginLock = false;
235 237
@@ -396,10 +398,12 @@ namespace OpenSim.Region.Framework.Scenes
396 if (value) 398 if (value)
397 { 399 {
398 if (!m_active) 400 if (!m_active)
399 Start(); 401 Start(false);
400 } 402 }
401 else 403 else
402 { 404 {
405 // This appears assymetric with Start() above but is not - setting m_active = false stops the loops
406 // XXX: Possibly this should be in an explicit Stop() method for symmetry.
403 m_active = false; 407 m_active = false;
404 } 408 }
405 } 409 }
@@ -859,9 +863,11 @@ namespace OpenSim.Region.Framework.Scenes
859 //Animation states 863 //Animation states
860 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); 864 m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
861 865
866
867 MaxUndoCount = startupConfig.GetInt("MaxPrimUndos", 20);
868
862 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true); 869 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
863 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true); 870 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
864
865 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys); 871 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys);
866 if (RegionInfo.NonphysPrimMin > 0) 872 if (RegionInfo.NonphysPrimMin > 0)
867 { 873 {
@@ -1332,7 +1338,7 @@ namespace OpenSim.Region.Framework.Scenes
1332 Thread.Sleep(500); 1338 Thread.Sleep(500);
1333 1339
1334 // Stop all client threads. 1340 // Stop all client threads.
1335 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); 1341 ForEachScenePresence(delegate(ScenePresence avatar) { IncomingCloseAgent(avatar.UUID, false); });
1336 1342
1337 m_log.Debug("[SCENE]: TriggerSceneShuttingDown"); 1343 m_log.Debug("[SCENE]: TriggerSceneShuttingDown");
1338 EventManager.TriggerSceneShuttingDown(this); 1344 EventManager.TriggerSceneShuttingDown(this);
@@ -1361,10 +1367,18 @@ namespace OpenSim.Region.Framework.Scenes
1361 } 1367 }
1362 } 1368 }
1363 1369
1370 public override void Start()
1371 {
1372 Start(true);
1373 }
1374
1364 /// <summary> 1375 /// <summary>
1365 /// Start the scene 1376 /// Start the scene
1366 /// </summary> 1377 /// </summary>
1367 public void Start() 1378 /// <param name='startScripts'>
1379 /// Start the scripts within the scene.
1380 /// </param>
1381 public void Start(bool startScripts)
1368 { 1382 {
1369 m_active = true; 1383 m_active = true;
1370 1384
@@ -1401,6 +1415,8 @@ namespace OpenSim.Region.Framework.Scenes
1401 m_heartbeatThread 1415 m_heartbeatThread
1402 = Watchdog.StartThread( 1416 = Watchdog.StartThread(
1403 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); 1417 Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
1418
1419 StartScripts();
1404 } 1420 }
1405 1421
1406 /// <summary> 1422 /// <summary>
@@ -1557,6 +1573,8 @@ namespace OpenSim.Region.Framework.Scenes
1557 1573
1558 try 1574 try
1559 { 1575 {
1576 EventManager.TriggerRegionHeartbeatStart(this);
1577
1560 // Apply taints in terrain module to terrain in physics scene 1578 // Apply taints in terrain module to terrain in physics scene
1561 if (Frame % m_update_terrain == 0) 1579 if (Frame % m_update_terrain == 0)
1562 { 1580 {
@@ -2939,6 +2957,7 @@ namespace OpenSim.Region.Framework.Scenes
2939 { 2957 {
2940 ScenePresence sp; 2958 ScenePresence sp;
2941 bool vialogin; 2959 bool vialogin;
2960 bool reallyNew = true;
2942 2961
2943 // Validation occurs in LLUDPServer 2962 // Validation occurs in LLUDPServer
2944 // 2963 //
@@ -2997,16 +3016,21 @@ namespace OpenSim.Region.Framework.Scenes
2997 m_log.WarnFormat( 3016 m_log.WarnFormat(
2998 "[SCENE]: Already found {0} scene presence for {1} in {2} when asked to add new scene presence", 3017 "[SCENE]: Already found {0} scene presence for {1} in {2} when asked to add new scene presence",
2999 sp.IsChildAgent ? "child" : "root", sp.Name, RegionInfo.RegionName); 3018 sp.IsChildAgent ? "child" : "root", sp.Name, RegionInfo.RegionName);
3019 reallyNew = false;
3000 } 3020 }
3001 3021
3002 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the 3022 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the
3003 // client is for a root or child agent. 3023 // client is for a root or child agent.
3004 client.SceneAgent = sp; 3024 client.SceneAgent = sp;
3005 3025
3006 // Cache the user's name 3026 // This is currently also being done earlier in NewUserConnection for real users to see if this
3027 // resolves problems where HG agents are occasionally seen by others as "Unknown user" in chat and other
3028 // places. However, we still need to do it here for NPCs.
3007 CacheUserName(sp, aCircuit); 3029 CacheUserName(sp, aCircuit);
3008 3030
3009 EventManager.TriggerOnNewClient(client); 3031 if (reallyNew)
3032 EventManager.TriggerOnNewClient(client);
3033
3010 if (vialogin) 3034 if (vialogin)
3011 EventManager.TriggerOnClientLogin(client); 3035 EventManager.TriggerOnClientLogin(client);
3012 } 3036 }
@@ -3027,7 +3051,7 @@ namespace OpenSim.Region.Framework.Scenes
3027 { 3051 {
3028 string first = aCircuit.firstname, last = aCircuit.lastname; 3052 string first = aCircuit.firstname, last = aCircuit.lastname;
3029 3053
3030 if (sp.PresenceType == PresenceType.Npc) 3054 if (sp != null && sp.PresenceType == PresenceType.Npc)
3031 { 3055 {
3032 UserManagementModule.AddUser(aCircuit.AgentID, first, last); 3056 UserManagementModule.AddUser(aCircuit.AgentID, first, last);
3033 } 3057 }
@@ -3105,7 +3129,8 @@ namespace OpenSim.Region.Framework.Scenes
3105 if (sp != null) 3129 if (sp != null)
3106 { 3130 {
3107 PresenceService.LogoutAgent(sp.ControllingClient.SessionId); 3131 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
3108 sp.ControllingClient.Close(); 3132
3133 IncomingCloseAgent(sp.UUID, false);
3109 } 3134 }
3110 3135
3111 // BANG! SLASH! 3136 // BANG! SLASH!
@@ -3244,8 +3269,6 @@ namespace OpenSim.Region.Framework.Scenes
3244 { 3269 {
3245 //client.OnNameFromUUIDRequest += HandleUUIDNameRequest; 3270 //client.OnNameFromUUIDRequest += HandleUUIDNameRequest;
3246 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; 3271 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
3247 client.OnSetStartLocationRequest += SetHomeRezPoint;
3248 client.OnRegionHandleRequest += RegionHandleRequest;
3249 } 3272 }
3250 3273
3251 public virtual void SubscribeToClientNetworkEvents(IClientAPI client) 3274 public virtual void SubscribeToClientNetworkEvents(IClientAPI client)
@@ -3371,8 +3394,6 @@ namespace OpenSim.Region.Framework.Scenes
3371 { 3394 {
3372 //client.OnNameFromUUIDRequest -= HandleUUIDNameRequest; 3395 //client.OnNameFromUUIDRequest -= HandleUUIDNameRequest;
3373 client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest; 3396 client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest;
3374 client.OnSetStartLocationRequest -= SetHomeRezPoint;
3375 client.OnRegionHandleRequest -= RegionHandleRequest;
3376 } 3397 }
3377 3398
3378 public virtual void UnSubscribeToClientNetworkEvents(IClientAPI client) 3399 public virtual void UnSubscribeToClientNetworkEvents(IClientAPI client)
@@ -3498,33 +3519,6 @@ namespace OpenSim.Region.Framework.Scenes
3498 } 3519 }
3499 3520
3500 /// <summary> 3521 /// <summary>
3501 /// Sets the Home Point. The LoginService uses this to know where to put a user when they log-in
3502 /// </summary>
3503 /// <param name="remoteClient"></param>
3504 /// <param name="regionHandle"></param>
3505 /// <param name="position"></param>
3506 /// <param name="lookAt"></param>
3507 /// <param name="flags"></param>
3508 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3509 {
3510 //Add half the avatar's height so that the user doesn't fall through prims
3511 ScenePresence presence;
3512 if (TryGetScenePresence(remoteClient.AgentId, out presence))
3513 {
3514 if (presence.Appearance != null)
3515 {
3516 position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
3517 }
3518 }
3519
3520 if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3521 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3522 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
3523 else
3524 m_dialogModule.SendAlertToUser(remoteClient, "Set Home request Failed.");
3525 }
3526
3527 /// <summary>
3528 /// Get the avatar apperance for the given client. 3522 /// Get the avatar apperance for the given client.
3529 /// </summary> 3523 /// </summary>
3530 /// <param name="client"></param> 3524 /// <param name="client"></param>
@@ -3548,63 +3542,69 @@ namespace OpenSim.Region.Framework.Scenes
3548 } 3542 }
3549 } 3543 }
3550 3544
3545 /// <summary>
3546 /// Remove the given client from the scene.
3547 /// </summary>
3548 /// <remarks>
3549 /// Only clientstack code should call this directly. All other code should call IncomingCloseAgent() instead
3550 /// to properly operate the state machine and avoid race conditions with other close requests (such as directly
3551 /// from viewers).
3552 /// </remarks>
3553 /// <param name='agentID'>ID of agent to close</param>
3554 /// <param name='closeChildAgents'>
3555 /// Close the neighbour child agents associated with this client.
3556 /// </param>
3551 public override void RemoveClient(UUID agentID, bool closeChildAgents) 3557 public override void RemoveClient(UUID agentID, bool closeChildAgents)
3552 { 3558 {
3553// CheckHeartbeat(); 3559 AgentCircuitData acd = m_authenticateHandler.GetAgentCircuitData(agentID);
3554 bool isChildAgent = false;
3555 AgentCircuitData acd;
3556 3560
3557 lock (m_removeClientLock) 3561 // Shouldn't be necessary since RemoveClient() is currently only called by IClientAPI.Close() which
3562 // in turn is only called by Scene.IncomingCloseAgent() which checks whether the presence exists or not
3563 // However, will keep for now just in case.
3564 if (acd == null)
3558 { 3565 {
3559 acd = m_authenticateHandler.GetAgentCircuitData(agentID); 3566 m_log.ErrorFormat(
3567 "[SCENE]: No agent circuit found for {0} in {1}, aborting Scene.RemoveClient", agentID, Name);
3560 3568
3561 if (acd == null) 3569 return;
3562 { 3570 }
3563 m_log.ErrorFormat("[SCENE]: No agent circuit found for {0}, aborting Scene.RemoveClient", agentID); 3571 else
3564 return; 3572 {
3565 } 3573 m_authenticateHandler.RemoveCircuit(agentID);
3566 else
3567 {
3568 // We remove the acd up here to avoid later race conditions if two RemoveClient() calls occurred
3569 // simultaneously.
3570 // We also need to remove by agent ID since NPCs will have no circuit code.
3571 m_authenticateHandler.RemoveCircuit(agentID);
3572 }
3573 } 3574 }
3574 3575
3576 // TODO: Can we now remove this lock?
3575 lock (acd) 3577 lock (acd)
3576 { 3578 {
3579 bool isChildAgent = false;
3580
3577 ScenePresence avatar = GetScenePresence(agentID); 3581 ScenePresence avatar = GetScenePresence(agentID);
3578 3582
3583 // Shouldn't be necessary since RemoveClient() is currently only called by IClientAPI.Close() which
3584 // in turn is only called by Scene.IncomingCloseAgent() which checks whether the presence exists or not
3585 // However, will keep for now just in case.
3579 if (avatar == null) 3586 if (avatar == null)
3580 { 3587 {
3581 m_log.WarnFormat( 3588 m_log.ErrorFormat(
3582 "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID); 3589 "[SCENE]: Called RemoveClient() with agent ID {0} but no such presence is in the scene.", agentID);
3583 3590
3584 return; 3591 return;
3585 } 3592 }
3586 3593
3587 try 3594 try
3588 { 3595 {
3589 isChildAgent = avatar.IsChildAgent; 3596 isChildAgent = avatar.IsChildAgent;
3590 3597
3591 m_log.DebugFormat( 3598 m_log.DebugFormat(
3592 "[SCENE]: Removing {0} agent {1} {2} from {3}", 3599 "[SCENE]: Removing {0} agent {1} {2} from {3}",
3593 (isChildAgent ? "child" : "root"), avatar.Name, agentID, RegionInfo.RegionName); 3600 isChildAgent ? "child" : "root", avatar.Name, agentID, Name);
3594 3601
3595 // Don't do this to root agents, it's not nice for the viewer 3602 // Don't do this to root agents, it's not nice for the viewer
3596 if (closeChildAgents && isChildAgent) 3603 if (closeChildAgents && isChildAgent)
3597 { 3604 {
3598 // Tell a single agent to disconnect from the region. 3605 // Tell a single agent to disconnect from the region.
3599 IEventQueue eq = RequestModuleInterface<IEventQueue>(); 3606 // Let's do this via UDP
3600 if (eq != null) 3607 avatar.ControllingClient.SendShutdownConnectionNotice();
3601 {
3602 eq.DisableSimulator(RegionInfo.RegionHandle, avatar.UUID);
3603 }
3604 else
3605 {
3606 avatar.ControllingClient.SendShutdownConnectionNotice();
3607 }
3608 } 3608 }
3609 3609
3610 // Only applies to root agents. 3610 // Only applies to root agents.
@@ -3620,16 +3620,13 @@ namespace OpenSim.Region.Framework.Scenes
3620 if (closeChildAgents && CapsModule != null) 3620 if (closeChildAgents && CapsModule != null)
3621 CapsModule.RemoveCaps(agentID, avatar.ControllingClient.CircuitCode); 3621 CapsModule.RemoveCaps(agentID, avatar.ControllingClient.CircuitCode);
3622 3622
3623// // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever
3624// // this method is doing is HORRIBLE!!!
3625 // Commented pending deletion since this method no longer appears to do anything at all
3626// avatar.Scene.NeedSceneCacheClear(avatar.UUID);
3627
3628 if (closeChildAgents && !isChildAgent) 3623 if (closeChildAgents && !isChildAgent)
3629 { 3624 {
3630 List<ulong> regions = avatar.KnownRegionHandles; 3625 List<ulong> regions = avatar.KnownRegionHandles;
3631 regions.Remove(RegionInfo.RegionHandle); 3626 regions.Remove(RegionInfo.RegionHandle);
3632 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3627
3628 // This ends up being done asynchronously so that a logout isn't held up where there are many present but unresponsive neighbours.
3629 m_sceneGridService.SendCloseChildAgentConnections(agentID, acd.SessionID.ToString(), regions);
3633 } 3630 }
3634 3631
3635 m_eventManager.TriggerClientClosed(agentID, this); 3632 m_eventManager.TriggerClientClosed(agentID, this);
@@ -3646,7 +3643,7 @@ namespace OpenSim.Region.Framework.Scenes
3646 delegate(IClientAPI client) 3643 delegate(IClientAPI client)
3647 { 3644 {
3648 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway 3645 //We can safely ignore null reference exceptions. It means the avatar is dead and cleaned up anyway
3649 try { client.SendKillObject(avatar.RegionHandle, new List<uint> { avatar.LocalId }); } 3646 try { client.SendKillObject(new List<uint> { avatar.LocalId }); }
3650 catch (NullReferenceException) { } 3647 catch (NullReferenceException) { }
3651 }); 3648 });
3652 } 3649 }
@@ -3727,7 +3724,8 @@ namespace OpenSim.Region.Framework.Scenes
3727 } 3724 }
3728 deleteIDs.Add(localID); 3725 deleteIDs.Add(localID);
3729 } 3726 }
3730 ForEachClient(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, deleteIDs); }); 3727
3728 ForEachClient(c => c.SendKillObject(deleteIDs));
3731 } 3729 }
3732 3730
3733 #endregion 3731 #endregion
@@ -3763,13 +3761,13 @@ namespace OpenSim.Region.Framework.Scenes
3763 /// is activated later when the viewer sends the initial UseCircuitCodePacket UDP packet (in the case of 3761 /// is activated later when the viewer sends the initial UseCircuitCodePacket UDP packet (in the case of
3764 /// the LLUDP stack). 3762 /// the LLUDP stack).
3765 /// </remarks> 3763 /// </remarks>
3766 /// <param name="agent">CircuitData of the agent who is connecting</param> 3764 /// <param name="acd">CircuitData of the agent who is connecting</param>
3767 /// <param name="reason">Outputs the reason for the false response on this string</param> 3765 /// <param name="reason">Outputs the reason for the false response on this string</param>
3768 /// <param name="requirePresenceLookup">True for normal presence. False for NPC 3766 /// <param name="requirePresenceLookup">True for normal presence. False for NPC
3769 /// or other applications where a full grid/Hypergrid presence may not be required.</param> 3767 /// or other applications where a full grid/Hypergrid presence may not be required.</param>
3770 /// <returns>True if the region accepts this agent. False if it does not. False will 3768 /// <returns>True if the region accepts this agent. False if it does not. False will
3771 /// also return a reason.</returns> 3769 /// also return a reason.</returns>
3772 public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup) 3770 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, out string reason, bool requirePresenceLookup)
3773 { 3771 {
3774 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || 3772 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 ||
3775 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); 3773 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0);
@@ -3789,15 +3787,15 @@ namespace OpenSim.Region.Framework.Scenes
3789 m_log.DebugFormat( 3787 m_log.DebugFormat(
3790 "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", 3788 "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})",
3791 RegionInfo.RegionName, 3789 RegionInfo.RegionName,
3792 (agent.child ? "child" : "root"), 3790 (acd.child ? "child" : "root"),
3793 agent.firstname, 3791 acd.firstname,
3794 agent.lastname, 3792 acd.lastname,
3795 agent.AgentID, 3793 acd.AgentID,
3796 agent.circuitcode, 3794 acd.circuitcode,
3797 agent.IPAddress, 3795 acd.IPAddress,
3798 agent.Viewer, 3796 acd.Viewer,
3799 ((TPFlags)teleportFlags).ToString(), 3797 ((TPFlags)teleportFlags).ToString(),
3800 agent.startpos 3798 acd.startpos
3801 ); 3799 );
3802 3800
3803 if (!LoginsEnabled) 3801 if (!LoginsEnabled)
@@ -3815,7 +3813,7 @@ namespace OpenSim.Region.Framework.Scenes
3815 { 3813 {
3816 foreach (string viewer in m_AllowedViewers) 3814 foreach (string viewer in m_AllowedViewers)
3817 { 3815 {
3818 if (viewer == agent.Viewer.Substring(0, viewer.Length).Trim().ToLower()) 3816 if (viewer == acd.Viewer.Substring(0, viewer.Length).Trim().ToLower())
3819 { 3817 {
3820 ViewerDenied = false; 3818 ViewerDenied = false;
3821 break; 3819 break;
@@ -3832,7 +3830,7 @@ namespace OpenSim.Region.Framework.Scenes
3832 { 3830 {
3833 foreach (string viewer in m_BannedViewers) 3831 foreach (string viewer in m_BannedViewers)
3834 { 3832 {
3835 if (viewer == agent.Viewer.Substring(0, viewer.Length).Trim().ToLower()) 3833 if (viewer == acd.Viewer.Substring(0, viewer.Length).Trim().ToLower())
3836 { 3834 {
3837 ViewerDenied = true; 3835 ViewerDenied = true;
3838 break; 3836 break;
@@ -3844,54 +3842,129 @@ namespace OpenSim.Region.Framework.Scenes
3844 { 3842 {
3845 m_log.DebugFormat( 3843 m_log.DebugFormat(
3846 "[SCENE]: Access denied for {0} {1} using {2}", 3844 "[SCENE]: Access denied for {0} {1} using {2}",
3847 agent.firstname, agent.lastname, agent.Viewer); 3845 acd.firstname, acd.lastname, acd.Viewer);
3848 reason = "Access denied, your viewer is banned by the region owner"; 3846 reason = "Access denied, your viewer is banned by the region owner";
3849 return false; 3847 return false;
3850 } 3848 }
3851 3849
3852 ScenePresence sp = GetScenePresence(agent.AgentID); 3850 ILandObject land;
3851 ScenePresence sp;
3853 3852
3854 // If we have noo presence here or if that presence is a zombie root 3853 lock (m_removeClientLock)
3855 // presence that will be kicled, we need a new CAPS object.
3856 if (sp == null || (sp != null && !sp.IsChildAgent))
3857 { 3854 {
3858 if (CapsModule != null) 3855 sp = GetScenePresence(acd.AgentID);
3856
3857 // We need to ensure that we are not already removing the scene presence before we ask it not to be
3858 // closed.
3859 if (sp != null && sp.IsChildAgent
3860 && (sp.LifecycleState == ScenePresenceState.Running
3861 || sp.LifecycleState == ScenePresenceState.PreRemove))
3859 { 3862 {
3860 lock (agent) 3863 m_log.DebugFormat(
3864 "[SCENE]: Reusing existing child scene presence for {0}, state {1} in {2}",
3865 sp.Name, sp.LifecycleState, Name);
3866
3867 // In the case where, for example, an A B C D region layout, an avatar may
3868 // teleport from A -> D, but then -> C before A has asked B to close its old child agent. When C
3869 // renews the lease on the child agent at B, we must make sure that the close from A does not succeed.
3870 //
3871 // XXX: In the end, this should not be necessary if child agents are closed without delay on
3872 // teleport, since realistically, the close request should always be processed before any other
3873 // region tried to re-establish a child agent. This is much simpler since the logic below is
3874 // vulnerable to an issue when a viewer quits a region without sending a proper logout but then
3875 // re-establishes the connection on a relogin. This could wrongly set the DoNotCloseAfterTeleport
3876 // flag when no teleport had taken place (and hence no close was going to come).
3877// if (!acd.ChildrenCapSeeds.ContainsKey(RegionInfo.RegionHandle))
3878// {
3879// m_log.DebugFormat(
3880// "[SCENE]: Setting DoNotCloseAfterTeleport for child scene presence {0} in {1} because source will attempt close.",
3881// sp.Name, Name);
3882//
3883// sp.DoNotCloseAfterTeleport = true;
3884// }
3885// else if (EntityTransferModule.IsInTransit(sp.UUID))
3886
3887 sp.LifecycleState = ScenePresenceState.Running;
3888
3889 if (EntityTransferModule.IsInTransit(sp.UUID))
3861 { 3890 {
3862 CapsModule.SetAgentCapsSeeds(agent); 3891 sp.DoNotCloseAfterTeleport = true;
3863 CapsModule.CreateCaps(agent.AgentID, agent.circuitcode); 3892
3893 m_log.DebugFormat(
3894 "[SCENE]: Set DoNotCloseAfterTeleport for child scene presence {0} in {1} because this region will attempt end-of-teleport close from a previous close.",
3895 sp.Name, Name);
3864 } 3896 }
3865 } 3897 }
3866 } 3898 }
3867 3899
3900 // Need to poll here in case we are currently deleting an sp. Letting threads run over each other will
3901 // allow unpredictable things to happen.
3868 if (sp != null) 3902 if (sp != null)
3869 { 3903 {
3870 if (!sp.IsChildAgent) 3904 const int polls = 10;
3905 const int pollInterval = 1000;
3906 int pollsLeft = polls;
3907
3908 while (sp.LifecycleState == ScenePresenceState.Removing && pollsLeft-- > 0)
3909 Thread.Sleep(pollInterval);
3910
3911 if (sp.LifecycleState == ScenePresenceState.Removing)
3871 { 3912 {
3872 // We have a zombie from a crashed session.
3873 // Or the same user is trying to be root twice here, won't work.
3874 // Kill it.
3875 m_log.WarnFormat( 3913 m_log.WarnFormat(
3876 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.", 3914 "[SCENE]: Agent {0} in {1} was still being removed after {2}s. Aborting NewUserConnection.",
3877 sp.Name, sp.UUID, RegionInfo.RegionName); 3915 sp.Name, Name, polls * pollInterval / 1000);
3878 3916
3879 sp.ControllingClient.Close(true, true); 3917 return false;
3880 sp = null; 3918 }
3919 else if (polls != pollsLeft)
3920 {
3921 m_log.DebugFormat(
3922 "[SCENE]: NewUserConnection for agent {0} in {1} had to wait {2}s for in-progress removal to complete on an old presence.",
3923 sp.Name, Name, polls * pollInterval / 1000);
3881 } 3924 }
3882 } 3925 }
3883 3926
3884 lock (agent) 3927 // TODO: can we remove this lock?
3928 lock (acd)
3885 { 3929 {
3886 //On login test land permisions 3930 if (sp != null && !sp.IsChildAgent)
3931 {
3932 // We have a root agent. Is it in transit?
3933 if (!EntityTransferModule.IsInTransit(sp.UUID))
3934 {
3935 // We have a zombie from a crashed session.
3936 // Or the same user is trying to be root twice here, won't work.
3937 // Kill it.
3938 m_log.WarnFormat(
3939 "[SCENE]: Existing root scene presence detected for {0} {1} in {2} when connecting. Removing existing presence.",
3940 sp.Name, sp.UUID, RegionInfo.RegionName);
3941
3942 if (sp.ControllingClient != null)
3943 IncomingCloseAgent(sp.UUID, true);
3944
3945 sp = null;
3946 }
3947 //else
3948 // m_log.WarnFormat("[SCENE]: Existing root scene presence for {0} {1} in {2}, but agent is in trasit", sp.Name, sp.UUID, RegionInfo.RegionName);
3949 }
3950
3951 // Optimistic: add or update the circuit data with the new agent circuit data and teleport flags.
3952 // We need the circuit data here for some of the subsequent checks. (groups, for example)
3953 // If the checks fail, we remove the circuit.
3954 acd.teleportFlags = teleportFlags;
3955 m_authenticateHandler.AddNewCircuit(acd.circuitcode, acd);
3956
3957 land = LandChannel.GetLandObject(acd.startpos.X, acd.startpos.Y);
3958
3959 // On login test land permisions
3887 if (vialogin) 3960 if (vialogin)
3888 { 3961 {
3889 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>(); 3962 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
3890 if (cache != null) 3963 if (cache != null)
3891 cache.Remove(agent.firstname + " " + agent.lastname); 3964 cache.Remove(acd.firstname + " " + acd.lastname);
3892 if (!TestLandRestrictions(agent.AgentID, out reason, ref agent.startpos.X, ref agent.startpos.Y)) 3965 if (land != null && !TestLandRestrictions(acd.AgentID, out reason, ref acd.startpos.X, ref acd.startpos.Y))
3893 { 3966 {
3894 m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString()); 3967 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3895 return false; 3968 return false;
3896 } 3969 }
3897 } 3970 }
@@ -3902,40 +3975,49 @@ namespace OpenSim.Region.Framework.Scenes
3902 { 3975 {
3903 try 3976 try
3904 { 3977 {
3905 if (!VerifyUserPresence(agent, out reason)) 3978 if (!VerifyUserPresence(acd, out reason))
3979 {
3980 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3906 return false; 3981 return false;
3907 } catch (Exception e) 3982 }
3983 }
3984 catch (Exception e)
3908 { 3985 {
3909 m_log.ErrorFormat( 3986 m_log.ErrorFormat(
3910 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); 3987 "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
3988
3989 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3911 return false; 3990 return false;
3912 } 3991 }
3913 } 3992 }
3914 3993
3915 try 3994 try
3916 { 3995 {
3917 // Always check estate if this is a login. Always 3996 if (!AuthorizeUser(acd, (vialogin ? false : SeeIntoRegion), out reason))
3918 // check if banned regions are to be blacked out.
3919 if (vialogin || (!m_seeIntoBannedRegion))
3920 { 3997 {
3921 if (!AuthorizeUser(agent, out reason)) 3998 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3922 { 3999 return false;
3923 return false;
3924 }
3925 } 4000 }
3926 } 4001 }
3927 catch (Exception e) 4002 catch (Exception e)
3928 { 4003 {
3929 m_log.ErrorFormat( 4004 m_log.ErrorFormat(
3930 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace); 4005 "[SCENE]: Exception authorizing user {0}{1}", e.Message, e.StackTrace);
4006
4007 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
3931 return false; 4008 return false;
3932 } 4009 }
3933 4010
3934 m_log.InfoFormat( 4011 m_log.InfoFormat(
3935 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", 4012 "[SCENE]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3936 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, 4013 Name, (acd.child ? "child" : "root"), acd.firstname, acd.lastname,
3937 agent.AgentID, agent.circuitcode); 4014 acd.AgentID, acd.circuitcode);
3938 4015
4016 if (CapsModule != null)
4017 {
4018 CapsModule.SetAgentCapsSeeds(acd);
4019 CapsModule.CreateCaps(acd.AgentID, acd.circuitcode);
4020 }
3939 } 4021 }
3940 else 4022 else
3941 { 4023 {
@@ -3943,43 +4025,60 @@ namespace OpenSim.Region.Framework.Scenes
3943 // uses down the line. 4025 // uses down the line.
3944 sp.TeleportFlags = (TPFlags)teleportFlags; 4026 sp.TeleportFlags = (TPFlags)teleportFlags;
3945 4027
4028 // We must carry out a further authorization check if there's an
4029 // attempt to make a child agent into a root agent, since SeeIntoRegion may have allowed a child
4030 // agent to login to a region where a full avatar would not be allowed.
4031 //
4032 // We determine whether this is a CreateAgent for a future non-child agent by inspecting
4033 // TeleportFlags, which will be default for a child connection. This relies on input from the source
4034 // region.
4035 if (sp.TeleportFlags != TPFlags.Default)
4036 {
4037 if (!AuthorizeUser(acd, false, out reason))
4038 return false;
4039 }
4040
3946 if (sp.IsChildAgent) 4041 if (sp.IsChildAgent)
3947 { 4042 {
3948 m_log.DebugFormat( 4043 m_log.DebugFormat(
3949 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", 4044 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}",
3950 agent.AgentID, RegionInfo.RegionName); 4045 acd.AgentID, RegionInfo.RegionName);
3951 4046
3952 sp.AdjustKnownSeeds(); 4047 sp.AdjustKnownSeeds();
3953 4048
3954 if (CapsModule != null) 4049 if (CapsModule != null)
3955 CapsModule.SetAgentCapsSeeds(agent); 4050 {
4051 CapsModule.SetAgentCapsSeeds(acd);
4052 CapsModule.CreateCaps(acd.AgentID, acd.circuitcode);
4053 }
3956 } 4054 }
3957 } 4055 }
3958 }
3959 4056
3960 // In all cases, add or update the circuit data with the new agent circuit data and teleport flags 4057 // Try caching an incoming user name much earlier on to see if this helps with an issue
3961 agent.teleportFlags = teleportFlags; 4058 // where HG users are occasionally seen by others as "Unknown User" because their UUIDName
3962 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); 4059 // request for the HG avatar appears to trigger before the user name is cached.
4060 CacheUserName(null, acd);
4061 }
3963 4062
3964 if (CapsModule != null) 4063 if (CapsModule != null)
3965 { 4064 {
3966 CapsModule.ActivateCaps(agent.circuitcode); 4065 CapsModule.ActivateCaps(acd.circuitcode);
3967 } 4066 }
3968 4067
3969 if (vialogin) 4068 if (vialogin)
3970 { 4069 {
3971// CleanDroppedAttachments(); 4070// CleanDroppedAttachments();
3972 4071
3973 if (TestBorderCross(agent.startpos, Cardinals.E)) 4072 if (TestBorderCross(acd.startpos, Cardinals.E))
3974 { 4073 {
3975 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); 4074 Border crossedBorder = GetCrossedBorder(acd.startpos, Cardinals.E);
3976 agent.startpos.X = crossedBorder.BorderLine.Z - 1; 4075 acd.startpos.X = crossedBorder.BorderLine.Z - 1;
3977 } 4076 }
3978 4077
3979 if (TestBorderCross(agent.startpos, Cardinals.N)) 4078 if (TestBorderCross(acd.startpos, Cardinals.N))
3980 { 4079 {
3981 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.N); 4080 Border crossedBorder = GetCrossedBorder(acd.startpos, Cardinals.N);
3982 agent.startpos.Y = crossedBorder.BorderLine.Z - 1; 4081 acd.startpos.Y = crossedBorder.BorderLine.Z - 1;
3983 } 4082 }
3984 4083
3985 //Mitigate http://opensimulator.org/mantis/view.php?id=3522 4084 //Mitigate http://opensimulator.org/mantis/view.php?id=3522
@@ -3989,39 +4088,39 @@ namespace OpenSim.Region.Framework.Scenes
3989 { 4088 {
3990 lock (EastBorders) 4089 lock (EastBorders)
3991 { 4090 {
3992 if (agent.startpos.X > EastBorders[0].BorderLine.Z) 4091 if (acd.startpos.X > EastBorders[0].BorderLine.Z)
3993 { 4092 {
3994 m_log.Warn("FIX AGENT POSITION"); 4093 m_log.Warn("FIX AGENT POSITION");
3995 agent.startpos.X = EastBorders[0].BorderLine.Z * 0.5f; 4094 acd.startpos.X = EastBorders[0].BorderLine.Z * 0.5f;
3996 if (agent.startpos.Z > 720) 4095 if (acd.startpos.Z > 720)
3997 agent.startpos.Z = 720; 4096 acd.startpos.Z = 720;
3998 } 4097 }
3999 } 4098 }
4000 lock (NorthBorders) 4099 lock (NorthBorders)
4001 { 4100 {
4002 if (agent.startpos.Y > NorthBorders[0].BorderLine.Z) 4101 if (acd.startpos.Y > NorthBorders[0].BorderLine.Z)
4003 { 4102 {
4004 m_log.Warn("FIX Agent POSITION"); 4103 m_log.Warn("FIX Agent POSITION");
4005 agent.startpos.Y = NorthBorders[0].BorderLine.Z * 0.5f; 4104 acd.startpos.Y = NorthBorders[0].BorderLine.Z * 0.5f;
4006 if (agent.startpos.Z > 720) 4105 if (acd.startpos.Z > 720)
4007 agent.startpos.Z = 720; 4106 acd.startpos.Z = 720;
4008 } 4107 }
4009 } 4108 }
4010 } else 4109 } else
4011 { 4110 {
4012 if (agent.startpos.X > EastBorders[0].BorderLine.Z) 4111 if (acd.startpos.X > EastBorders[0].BorderLine.Z)
4013 { 4112 {
4014 m_log.Warn("FIX AGENT POSITION"); 4113 m_log.Warn("FIX AGENT POSITION");
4015 agent.startpos.X = EastBorders[0].BorderLine.Z * 0.5f; 4114 acd.startpos.X = EastBorders[0].BorderLine.Z * 0.5f;
4016 if (agent.startpos.Z > 720) 4115 if (acd.startpos.Z > 720)
4017 agent.startpos.Z = 720; 4116 acd.startpos.Z = 720;
4018 } 4117 }
4019 if (agent.startpos.Y > NorthBorders[0].BorderLine.Z) 4118 if (acd.startpos.Y > NorthBorders[0].BorderLine.Z)
4020 { 4119 {
4021 m_log.Warn("FIX Agent POSITION"); 4120 m_log.Warn("FIX Agent POSITION");
4022 agent.startpos.Y = NorthBorders[0].BorderLine.Z * 0.5f; 4121 acd.startpos.Y = NorthBorders[0].BorderLine.Z * 0.5f;
4023 if (agent.startpos.Z > 720) 4122 if (acd.startpos.Z > 720)
4024 agent.startpos.Z = 720; 4123 acd.startpos.Z = 720;
4025 } 4124 }
4026 } 4125 }
4027 4126
@@ -4037,12 +4136,12 @@ namespace OpenSim.Region.Framework.Scenes
4037 { 4136 {
4038 // We have multiple SpawnPoints, Route the agent to a random or sequential one 4137 // We have multiple SpawnPoints, Route the agent to a random or sequential one
4039 if (SpawnPointRouting == "random") 4138 if (SpawnPointRouting == "random")
4040 agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation( 4139 acd.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation(
4041 telehub.AbsolutePosition, 4140 telehub.AbsolutePosition,
4042 telehub.GroupRotation 4141 telehub.GroupRotation
4043 ); 4142 );
4044 else 4143 else
4045 agent.startpos = spawnpoints[SpawnPoint()].GetLocation( 4144 acd.startpos = spawnpoints[SpawnPoint()].GetLocation(
4046 telehub.AbsolutePosition, 4145 telehub.AbsolutePosition,
4047 telehub.GroupRotation 4146 telehub.GroupRotation
4048 ); 4147 );
@@ -4050,7 +4149,7 @@ namespace OpenSim.Region.Framework.Scenes
4050 else 4149 else
4051 { 4150 {
4052 // We have a single SpawnPoint and will route the agent to it 4151 // We have a single SpawnPoint and will route the agent to it
4053 agent.startpos = spawnpoints[0].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); 4152 acd.startpos = spawnpoints[0].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
4054 } 4153 }
4055 4154
4056 return true; 4155 return true;
@@ -4063,7 +4162,7 @@ namespace OpenSim.Region.Framework.Scenes
4063 { 4162 {
4064 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 4163 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
4065 { 4164 {
4066 agent.startpos = land.LandData.UserLocation; 4165 acd.startpos = land.LandData.UserLocation;
4067 } 4166 }
4068 } 4167 }
4069 */// This is now handled properly in ScenePresence.MakeRootAgent 4168 */// This is now handled properly in ScenePresence.MakeRootAgent
@@ -4158,7 +4257,7 @@ namespace OpenSim.Region.Framework.Scenes
4158 /// <param name="reason">outputs the reason to this string</param> 4257 /// <param name="reason">outputs the reason to this string</param>
4159 /// <returns>True if the region accepts this agent. False if it does not. False will 4258 /// <returns>True if the region accepts this agent. False if it does not. False will
4160 /// also return a reason.</returns> 4259 /// also return a reason.</returns>
4161 protected virtual bool AuthorizeUser(AgentCircuitData agent, out string reason) 4260 protected virtual bool AuthorizeUser(AgentCircuitData agent, bool bypassAccessControl, out string reason)
4162 { 4261 {
4163 reason = String.Empty; 4262 reason = String.Empty;
4164 4263
@@ -4177,67 +4276,75 @@ namespace OpenSim.Region.Framework.Scenes
4177 } 4276 }
4178 } 4277 }
4179 4278
4180 if (RegionInfo.EstateSettings != null) 4279 // We only test the things below when we want to cut off
4280 // child agents from being present in the scene for which their root
4281 // agent isn't allowed. Otherwise, we allow child agents. The test for
4282 // the root is done elsewhere (QueryAccess)
4283 if (!bypassAccessControl)
4181 { 4284 {
4182 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID, 0)) 4285 if (RegionInfo.EstateSettings != null)
4183 { 4286 {
4184 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 4287 int flags = GetUserFlags(agent.AgentID);
4185 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4288 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID, flags))
4186 reason = String.Format("Denied access to region {0}: You have been banned from that region.", 4289 {
4187 RegionInfo.RegionName); 4290 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
4188 return false; 4291 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
4292 reason = String.Format("Denied access to region {0}: You have been banned from that region.",
4293 RegionInfo.RegionName);
4294 return false;
4295 }
4189 } 4296 }
4190 } 4297 else
4191 else
4192 {
4193 m_log.ErrorFormat("[CONNECTION BEGIN]: Estate Settings is null!");
4194 }
4195
4196 List<UUID> agentGroups = new List<UUID>();
4197
4198 if (m_groupsModule != null)
4199 {
4200 GroupMembershipData[] GroupMembership = m_groupsModule.GetMembershipData(agent.AgentID);
4201
4202 if (GroupMembership != null)
4203 { 4298 {
4204 for (int i = 0; i < GroupMembership.Length; i++) 4299 m_log.ErrorFormat("[CONNECTION BEGIN]: Estate Settings is null!");
4205 agentGroups.Add(GroupMembership[i].GroupID);
4206 } 4300 }
4207 else 4301
4302 List<UUID> agentGroups = new List<UUID>();
4303
4304 if (m_groupsModule != null)
4208 { 4305 {
4209 m_log.ErrorFormat("[CONNECTION BEGIN]: GroupMembership is null!"); 4306 GroupMembershipData[] GroupMembership = m_groupsModule.GetMembershipData(agent.AgentID);
4307
4308 if (GroupMembership != null)
4309 {
4310 for (int i = 0; i < GroupMembership.Length; i++)
4311 agentGroups.Add(GroupMembership[i].GroupID);
4312 }
4313 else
4314 {
4315 m_log.ErrorFormat("[CONNECTION BEGIN]: GroupMembership is null!");
4316 }
4210 } 4317 }
4211 }
4212 4318
4213 bool groupAccess = false; 4319 bool groupAccess = false;
4214 UUID[] estateGroups = RegionInfo.EstateSettings.EstateGroups; 4320 UUID[] estateGroups = RegionInfo.EstateSettings.EstateGroups;
4215 4321
4216 if (estateGroups != null) 4322 if (estateGroups != null)
4217 {
4218 foreach (UUID group in estateGroups)
4219 { 4323 {
4220 if (agentGroups.Contains(group)) 4324 foreach (UUID group in estateGroups)
4221 { 4325 {
4222 groupAccess = true; 4326 if (agentGroups.Contains(group))
4223 break; 4327 {
4328 groupAccess = true;
4329 break;
4330 }
4224 } 4331 }
4225 } 4332 }
4226 } 4333 else
4227 else 4334 {
4228 { 4335 m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!");
4229 m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!"); 4336 }
4230 }
4231 4337
4232 if (!RegionInfo.EstateSettings.PublicAccess && 4338 if (!RegionInfo.EstateSettings.PublicAccess &&
4233 !RegionInfo.EstateSettings.HasAccess(agent.AgentID) && 4339 !RegionInfo.EstateSettings.HasAccess(agent.AgentID) &&
4234 !groupAccess) 4340 !groupAccess)
4235 { 4341 {
4236 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate", 4342 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate",
4237 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4343 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
4238 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", 4344 reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
4239 RegionInfo.RegionName); 4345 RegionInfo.RegionName);
4240 return false; 4346 return false;
4347 }
4241 } 4348 }
4242 4349
4243 // TODO: estate/region settings are not properly hooked up 4350 // TODO: estate/region settings are not properly hooked up
@@ -4367,8 +4474,6 @@ namespace OpenSim.Region.Framework.Scenes
4367 m_log.DebugFormat( 4474 m_log.DebugFormat(
4368 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); 4475 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
4369 4476
4370 // XPTO: if this agent is not allowed here as root, always return false
4371
4372 // We have to wait until the viewer contacts this region after receiving EAC. 4477 // We have to wait until the viewer contacts this region after receiving EAC.
4373 // That calls AddNewClient, which finally creates the ScenePresence 4478 // That calls AddNewClient, which finally creates the ScenePresence
4374 int flags = GetUserFlags(cAgentData.AgentID); 4479 int flags = GetUserFlags(cAgentData.AgentID);
@@ -4390,13 +4495,39 @@ namespace OpenSim.Region.Framework.Scenes
4390 } 4495 }
4391 4496
4392 // We have to wait until the viewer contacts this region 4497 // We have to wait until the viewer contacts this region
4393 // after receiving the EnableSimulator HTTP Event Queue message. This triggers the viewer to send 4498 // after receiving the EnableSimulator HTTP Event Queue message (for the v1 teleport protocol)
4499 // or TeleportFinish (for the v2 teleport protocol). This triggers the viewer to send
4394 // a UseCircuitCode packet which in turn calls AddNewClient which finally creates the ScenePresence. 4500 // a UseCircuitCode packet which in turn calls AddNewClient which finally creates the ScenePresence.
4395 ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); 4501 ScenePresence sp = WaitGetScenePresence(cAgentData.AgentID);
4396 4502
4397 if (childAgentUpdate != null) 4503 if (sp != null)
4398 { 4504 {
4399 childAgentUpdate.ChildAgentDataUpdate(cAgentData); 4505 if (cAgentData.SessionID != sp.ControllingClient.SessionId)
4506 {
4507 m_log.WarnFormat(
4508 "[SCENE]: Attempt to update agent {0} with invalid session id {1} (possibly from simulator in older version; tell them to update).",
4509 sp.UUID, cAgentData.SessionID);
4510
4511 Console.WriteLine(String.Format("[SCENE]: Attempt to update agent {0} ({1}) with invalid session id {2}",
4512 sp.UUID, sp.ControllingClient.SessionId, cAgentData.SessionID));
4513 }
4514
4515 sp.ChildAgentDataUpdate(cAgentData);
4516
4517 int ntimes = 20;
4518 if (cAgentData.SenderWantsToWaitForRoot)
4519 {
4520 while (sp.IsChildAgent && ntimes-- > 0)
4521 Thread.Sleep(1000);
4522
4523 m_log.DebugFormat(
4524 "[SCENE]: Found presence {0} {1} {2} in {3} after {4} waits",
4525 sp.Name, sp.UUID, sp.IsChildAgent ? "child" : "root", Name, 20 - ntimes);
4526
4527 if (sp.IsChildAgent)
4528 return false;
4529 }
4530
4400 return true; 4531 return true;
4401 } 4532 }
4402 4533
@@ -4415,6 +4546,11 @@ namespace OpenSim.Region.Framework.Scenes
4415 ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID); 4546 ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID);
4416 if (childAgentUpdate != null) 4547 if (childAgentUpdate != null)
4417 { 4548 {
4549// if (childAgentUpdate.ControllingClient.SessionId != cAgentData.SessionID)
4550// // Only warn for now
4551// m_log.WarnFormat("[SCENE]: Attempt at updating position of agent {0} with invalid session id {1}. Neighbor running older version?",
4552// childAgentUpdate.UUID, cAgentData.SessionID);
4553
4418 // I can't imagine *yet* why we would get an update if the agent is a root agent.. 4554 // I can't imagine *yet* why we would get an update if the agent is a root agent..
4419 // however to avoid a race condition crossing borders.. 4555 // however to avoid a race condition crossing borders..
4420 if (childAgentUpdate.IsChildAgent) 4556 if (childAgentUpdate.IsChildAgent)
@@ -4451,10 +4587,6 @@ namespace OpenSim.Region.Framework.Scenes
4451 m_log.WarnFormat( 4587 m_log.WarnFormat(
4452 "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout", 4588 "[SCENE PRESENCE]: Did not find presence with id {0} in {1} before timeout",
4453 agentID, RegionInfo.RegionName); 4589 agentID, RegionInfo.RegionName);
4454// else
4455// m_log.DebugFormat(
4456// "[SCENE PRESENCE]: Found presence {0} {1} {2} in {3} after {4} waits",
4457// sp.Name, sp.UUID, sp.IsChildAgent ? "child" : "root", RegionInfo.RegionName, 10 - ntimes);
4458 4590
4459 return sp; 4591 return sp;
4460 } 4592 }
@@ -4471,6 +4603,42 @@ namespace OpenSim.Region.Framework.Scenes
4471 4603
4472 return false; 4604 return false;
4473 } 4605 }
4606 /// <summary>
4607 /// Authenticated close (via network)
4608 /// </summary>
4609 /// <param name="agentID"></param>
4610 /// <param name="force"></param>
4611 /// <param name="auth_token"></param>
4612 /// <returns></returns>
4613 public bool IncomingCloseAgent(UUID agentID, bool force, string auth_token)
4614 {
4615 //m_log.DebugFormat("[SCENE]: Processing incoming close agent {0} in region {1} with auth_token {2}", agentID, RegionInfo.RegionName, auth_token);
4616
4617 // Check that the auth_token is valid
4618 AgentCircuitData acd = AuthenticateHandler.GetAgentCircuitData(agentID);
4619
4620 if (acd == null)
4621 {
4622 m_log.DebugFormat(
4623 "[SCENE]: Request to close agent {0} but no such agent in scene {1}. May have been closed previously.",
4624 agentID, Name);
4625
4626 return false;
4627 }
4628
4629 if (acd.SessionID.ToString() == auth_token)
4630 {
4631 return IncomingCloseAgent(agentID, force);
4632 }
4633 else
4634 {
4635 m_log.WarnFormat(
4636 "[SCENE]: Request to close agent {0} with invalid authorization token {1} in {2}",
4637 agentID, auth_token, Name);
4638 }
4639
4640 return false;
4641 }
4474 4642
4475 public bool IncomingCloseAgent(UUID agentID) 4643 public bool IncomingCloseAgent(UUID agentID)
4476 { 4644 {
@@ -4483,6 +4651,50 @@ namespace OpenSim.Region.Framework.Scenes
4483 } 4651 }
4484 4652
4485 /// <summary> 4653 /// <summary>
4654 /// Tell a single agent to prepare to close.
4655 /// </summary>
4656 /// <remarks>
4657 /// This should only be called if we may close the agent but there will be some delay in so doing. Meant for
4658 /// internal use - other callers should almost certainly called IncomingCloseAgent().
4659 /// </remarks>
4660 /// <param name="sp"></param>
4661 /// <returns>true if pre-close state notification was successful. false if the agent
4662 /// was not in a state where it could transition to pre-close.</returns>
4663 public bool IncomingPreCloseAgent(ScenePresence sp)
4664 {
4665 lock (m_removeClientLock)
4666 {
4667 // We need to avoid a race condition where in, for example, an A B C D region layout, an avatar may
4668 // teleport from A -> D, but then -> C before A has asked B to close its old child agent. We do not
4669 // want to obey this close since C may have renewed the child agent lease on B.
4670 if (sp.DoNotCloseAfterTeleport)
4671 {
4672 m_log.DebugFormat(
4673 "[SCENE]: Not pre-closing {0} agent {1} in {2} since another simulator has re-established the child connection",
4674 sp.IsChildAgent ? "child" : "root", sp.Name, Name);
4675
4676 // Need to reset the flag so that a subsequent close after another teleport can succeed.
4677 sp.DoNotCloseAfterTeleport = false;
4678
4679 return false;
4680 }
4681
4682 if (sp.LifecycleState != ScenePresenceState.Running)
4683 {
4684 m_log.DebugFormat(
4685 "[SCENE]: Called IncomingPreCloseAgent() for {0} in {1} but presence is already in state {2}",
4686 sp.Name, Name, sp.LifecycleState);
4687
4688 return false;
4689 }
4690
4691 sp.LifecycleState = ScenePresenceState.PreRemove;
4692
4693 return true;
4694 }
4695 }
4696
4697 /// <summary>
4486 /// Tell a single agent to disconnect from the region. 4698 /// Tell a single agent to disconnect from the region.
4487 /// </summary> 4699 /// </summary>
4488 /// <param name="agentID"></param> 4700 /// <param name="agentID"></param>
@@ -4492,16 +4704,55 @@ namespace OpenSim.Region.Framework.Scenes
4492 /// </param> 4704 /// </param>
4493 public bool IncomingCloseAgent(UUID agentID, bool force) 4705 public bool IncomingCloseAgent(UUID agentID, bool force)
4494 { 4706 {
4495 //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); 4707 ScenePresence sp;
4496 4708
4497 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); 4709 lock (m_removeClientLock)
4498 if (presence != null) 4710 {
4711 sp = GetScenePresence(agentID);
4712
4713 if (sp == null)
4714 {
4715 m_log.DebugFormat(
4716 "[SCENE]: Called IncomingCloseAgent() with agent ID {0} but no such presence is in {1}",
4717 agentID, Name);
4718
4719 return false;
4720 }
4721
4722 if (sp.LifecycleState != ScenePresenceState.Running && sp.LifecycleState != ScenePresenceState.PreRemove)
4723 {
4724 m_log.DebugFormat(
4725 "[SCENE]: Called IncomingCloseAgent() for {0} in {1} but presence is already in state {2}",
4726 sp.Name, Name, sp.LifecycleState);
4727
4728 return false;
4729 }
4730
4731 // We need to avoid a race condition where in, for example, an A B C D region layout, an avatar may
4732 // teleport from A -> D, but then -> C before A has asked B to close its old child agent. We do not
4733 // want to obey this close since C may have renewed the child agent lease on B.
4734 if (sp.DoNotCloseAfterTeleport)
4735 {
4736 m_log.DebugFormat(
4737 "[SCENE]: Not closing {0} agent {1} in {2} since another simulator has re-established the child connection",
4738 sp.IsChildAgent ? "child" : "root", sp.Name, Name);
4739
4740 // Need to reset the flag so that a subsequent close after another teleport can succeed.
4741 sp.DoNotCloseAfterTeleport = false;
4742
4743 return false;
4744 }
4745
4746 sp.LifecycleState = ScenePresenceState.Removing;
4747 }
4748
4749 if (sp != null)
4499 { 4750 {
4500 presence.ControllingClient.Close(force, force); 4751 sp.ControllingClient.Close(force, force);
4501 return true; 4752 return true;
4502 } 4753 }
4503 4754
4504 // Agent not here 4755 // Agent not here
4505 return false; 4756 return false;
4506 } 4757 }
4507 4758
@@ -5091,21 +5342,6 @@ namespace OpenSim.Region.Framework.Scenes
5091 5342
5092 #endregion 5343 #endregion
5093 5344
5094 public void RegionHandleRequest(IClientAPI client, UUID regionID)
5095 {
5096 ulong handle = 0;
5097 if (regionID == RegionInfo.RegionID)
5098 handle = RegionInfo.RegionHandle;
5099 else
5100 {
5101 GridRegion r = GridService.GetRegionByUUID(UUID.Zero, regionID);
5102 if (r != null)
5103 handle = r.RegionHandle;
5104 }
5105
5106 if (handle != 0)
5107 client.SendRegionHandle(regionID, handle);
5108 }
5109 5345
5110// Commented pending deletion since this method no longer appears to do anything at all 5346// Commented pending deletion since this method no longer appears to do anything at all
5111// public bool NeedSceneCacheClear(UUID agentID) 5347// public bool NeedSceneCacheClear(UUID agentID)
@@ -5657,12 +5893,12 @@ Environment.Exit(1);
5657 List<SceneObjectGroup> objects, 5893 List<SceneObjectGroup> objects,
5658 out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ) 5894 out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
5659 { 5895 {
5660 minX = 256; 5896 minX = float.MaxValue;
5661 maxX = -256; 5897 maxX = float.MinValue;
5662 minY = 256; 5898 minY = float.MaxValue;
5663 maxY = -256; 5899 maxY = float.MinValue;
5664 minZ = 8192; 5900 minZ = float.MaxValue;
5665 maxZ = -256; 5901 maxZ = float.MinValue;
5666 5902
5667 List<Vector3> offsets = new List<Vector3>(); 5903 List<Vector3> offsets = new List<Vector3>();
5668 5904
@@ -5802,17 +6038,6 @@ Environment.Exit(1);
5802 { 6038 {
5803 reason = "You are banned from the region"; 6039 reason = "You are banned from the region";
5804 6040
5805 if (EntityTransferModule.IsInTransit(agentID))
5806 {
5807 reason = "Agent is still in transit from this region";
5808
5809 m_log.WarnFormat(
5810 "[SCENE]: Denying agent {0} entry into {1} since region still has them registered as in transit",
5811 agentID, RegionInfo.RegionName);
5812
5813 return false;
5814 }
5815
5816 if (Permissions.IsGod(agentID)) 6041 if (Permissions.IsGod(agentID))
5817 { 6042 {
5818 reason = String.Empty; 6043 reason = String.Empty;
@@ -5862,9 +6087,9 @@ Environment.Exit(1);
5862 6087
5863 try 6088 try
5864 { 6089 {
5865 if (!AuthorizeUser(aCircuit, out reason)) 6090 if (!AuthorizeUser(aCircuit, false, out reason))
5866 { 6091 {
5867 // m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID); 6092 //m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
5868 return false; 6093 return false;
5869 } 6094 }
5870 } 6095 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 74c9582..1dac676 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -218,6 +218,19 @@ namespace OpenSim.Region.Framework.Scenes
218 #region Add/Remove Agent/Avatar 218 #region Add/Remove Agent/Avatar
219 219
220 public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type); 220 public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
221
222 /// <summary>
223 /// Remove the given client from the scene.
224 /// </summary>
225 /// <remarks>
226 /// Only clientstack code should call this directly. All other code should call IncomingCloseAgent() instead
227 /// to properly operate the state machine and avoid race conditions with other close requests (such as directly
228 /// from viewers).
229 /// </remarks>
230 /// <param name='agentID'>ID of agent to close</param>
231 /// <param name='closeChildAgents'>
232 /// Close the neighbour child agents associated with this client.
233 /// </param>
221 public abstract void RemoveClient(UUID agentID, bool closeChildAgents); 234 public abstract void RemoveClient(UUID agentID, bool closeChildAgents);
222 235
223 public bool TryGetScenePresence(UUID agentID, out object scenePresence) 236 public bool TryGetScenePresence(UUID agentID, out object scenePresence)
@@ -562,6 +575,10 @@ namespace OpenSim.Region.Framework.Scenes
562 get { return false; } 575 get { return false; }
563 } 576 }
564 577
578 public virtual void Start()
579 {
580 }
581
565 public void Restart() 582 public void Restart()
566 { 583 {
567 // This has to be here to fire the event 584 // This has to be here to fire the event
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 775a4c2..52f46f2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -200,7 +200,7 @@ namespace OpenSim.Region.Framework.Scenes
200 /// This Closes child agents on neighboring regions 200 /// This Closes child agents on neighboring regions
201 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 201 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
202 /// </summary> 202 /// </summary>
203 protected void SendCloseChildAgentAsync(UUID agentID, ulong regionHandle) 203 protected void SendCloseChildAgent(UUID agentID, ulong regionHandle, string auth_token)
204 { 204 {
205 // let's do our best, but there's not much we can do if the neighbour doesn't accept. 205 // let's do our best, but there's not much we can do if the neighbour doesn't accept.
206 206
@@ -209,23 +209,25 @@ namespace OpenSim.Region.Framework.Scenes
209 Utils.LongToUInts(regionHandle, out x, out y); 209 Utils.LongToUInts(regionHandle, out x, out y);
210 210
211 GridRegion destination = m_scene.GridService.GetRegionByPosition(m_regionInfo.ScopeID, (int)x, (int)y); 211 GridRegion destination = m_scene.GridService.GetRegionByPosition(m_regionInfo.ScopeID, (int)x, (int)y);
212 m_scene.SimulationService.CloseChildAgent(destination, agentID);
213 }
214 212
215 private void SendCloseChildAgentCompleted(IAsyncResult iar) 213 m_log.DebugFormat(
216 { 214 "[SCENE COMMUNICATION SERVICE]: Sending close agent ID {0} to {1}", agentID, destination.RegionName);
217 SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState; 215
218 icon.EndInvoke(iar); 216 m_scene.SimulationService.CloseAgent(destination, agentID, auth_token);
219 } 217 }
220 218
221 public void SendCloseChildAgentConnections(UUID agentID, List<ulong> regionslst) 219 /// <summary>
220 /// Closes a child agents in a collection of regions. Does so asynchronously
221 /// so that the caller doesn't wait.
222 /// </summary>
223 /// <param name="agentID"></param>
224 /// <param name="regionslst"></param>
225 public void SendCloseChildAgentConnections(UUID agentID, string auth_code, List<ulong> regionslst)
222 { 226 {
223 foreach (ulong handle in regionslst) 227 foreach (ulong handle in regionslst)
224 { 228 {
225 SendCloseChildAgentDelegate d = SendCloseChildAgentAsync; 229 ulong handleCopy = handle;
226 d.BeginInvoke(agentID, handle, 230 Util.FireAndForget((o) => { SendCloseChildAgent(agentID, handleCopy, auth_code); });
227 SendCloseChildAgentCompleted,
228 d);
229 } 231 }
230 } 232 }
231 233
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index e599e90..b0f8991 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -631,40 +631,16 @@ namespace OpenSim.Region.Framework.Scenes
631 protected internal ScenePresence CreateAndAddChildScenePresence( 631 protected internal ScenePresence CreateAndAddChildScenePresence(
632 IClientAPI client, AvatarAppearance appearance, PresenceType type) 632 IClientAPI client, AvatarAppearance appearance, PresenceType type)
633 { 633 {
634 ScenePresence newAvatar = null;
635
636 // ScenePresence always defaults to child agent 634 // ScenePresence always defaults to child agent
637 newAvatar = new ScenePresence(client, m_parentScene, appearance, type); 635 ScenePresence presence = new ScenePresence(client, m_parentScene, appearance, type);
638
639 AddScenePresence(newAvatar);
640
641 return newAvatar;
642 }
643
644 /// <summary>
645 /// Add a presence to the scene
646 /// </summary>
647 /// <param name="presence"></param>
648 protected internal void AddScenePresence(ScenePresence presence)
649 {
650 // Always a child when added to the scene
651 bool child = presence.IsChildAgent;
652
653 if (child)
654 {
655 m_numChildAgents++;
656 }
657 else
658 {
659 m_numRootAgents++;
660 presence.AddToPhysicalScene(false);
661 }
662 636
663 Entities[presence.UUID] = presence; 637 Entities[presence.UUID] = presence;
664 638
665 m_scenePresencesLock.EnterWriteLock(); 639 m_scenePresencesLock.EnterWriteLock();
666 try 640 try
667 { 641 {
642 m_numChildAgents++;
643
668 Dictionary<UUID, ScenePresence> newmap = new Dictionary<UUID, ScenePresence>(m_scenePresenceMap); 644 Dictionary<UUID, ScenePresence> newmap = new Dictionary<UUID, ScenePresence>(m_scenePresenceMap);
669 List<ScenePresence> newlist = new List<ScenePresence>(m_scenePresenceArray); 645 List<ScenePresence> newlist = new List<ScenePresence>(m_scenePresenceArray);
670 646
@@ -675,7 +651,7 @@ namespace OpenSim.Region.Framework.Scenes
675 } 651 }
676 else 652 else
677 { 653 {
678 // Remember the old presene reference from the dictionary 654 // Remember the old presence reference from the dictionary
679 ScenePresence oldref = newmap[presence.UUID]; 655 ScenePresence oldref = newmap[presence.UUID];
680 // Replace the presence reference in the dictionary with the new value 656 // Replace the presence reference in the dictionary with the new value
681 newmap[presence.UUID] = presence; 657 newmap[presence.UUID] = presence;
@@ -691,6 +667,8 @@ namespace OpenSim.Region.Framework.Scenes
691 { 667 {
692 m_scenePresencesLock.ExitWriteLock(); 668 m_scenePresencesLock.ExitWriteLock();
693 } 669 }
670
671 return presence;
694 } 672 }
695 673
696 /// <summary> 674 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index c70342f..c5c083a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -420,29 +420,6 @@ namespace OpenSim.Region.Framework.Scenes
420 return false; 420 return false;
421 } 421 }
422 422
423 /// <summary>
424 /// Set the debug packet level on each current scene. This level governs which packets are printed out to the
425 /// console.
426 /// </summary>
427 /// <param name="newDebug"></param>
428 /// <param name="name">Name of avatar to debug</param>
429 public void SetDebugPacketLevelOnCurrentScene(int newDebug, string name)
430 {
431 ForEachSelectedScene(scene =>
432 scene.ForEachScenePresence(sp =>
433 {
434 if (name == null || sp.Name == name)
435 {
436 m_log.DebugFormat(
437 "Packet debug for {0} ({1}) set to {2}",
438 sp.Name, sp.IsChildAgent ? "child" : "root", newDebug);
439
440 sp.ControllingClient.DebugPacketLevel = newDebug;
441 }
442 })
443 );
444 }
445
446 public List<ScenePresence> GetCurrentSceneAvatars() 423 public List<ScenePresence> GetCurrentSceneAvatars()
447 { 424 {
448 List<ScenePresence> avatars = new List<ScenePresence>(); 425 List<ScenePresence> avatars = new List<ScenePresence>();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index f8624e7..8c50a81 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -67,6 +67,12 @@ namespace OpenSim.Region.Framework.Scenes
67 { 67 {
68 int scriptsStarted = 0; 68 int scriptsStarted = 0;
69 69
70 if (m_scene == null)
71 {
72 m_log.DebugFormat("[PRIM INVENTORY]: m_scene is null. Unable to create script instances");
73 return 0;
74 }
75
70 // Don't start scripts if they're turned off in the region! 76 // Don't start scripts if they're turned off in the region!
71 if (!m_scene.RegionInfo.RegionSettings.DisableScripts) 77 if (!m_scene.RegionInfo.RegionSettings.DisableScripts)
72 { 78 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3e1dcaa..6deb870 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1868,11 +1868,11 @@ namespace OpenSim.Region.Framework.Scenes
1868 /// <summary> 1868 /// <summary>
1869 /// Delete this group from its scene. 1869 /// Delete this group from its scene.
1870 /// </summary> 1870 /// </summary>
1871 /// 1871 /// <remarks>
1872 /// This only handles the in-world consequences of deletion (e.g. any avatars sitting on it are forcibly stood 1872 /// This only handles the in-world consequences of deletion (e.g. any avatars sitting on it are forcibly stood
1873 /// up and all avatars receive notification of its removal. Removal of the scene object from database backup 1873 /// up and all avatars receive notification of its removal. Removal of the scene object from database backup
1874 /// must be handled by the caller. 1874 /// must be handled by the caller.
1875 /// 1875 /// </remarks>
1876 /// <param name="silent">If true then deletion is not broadcast to clients</param> 1876 /// <param name="silent">If true then deletion is not broadcast to clients</param>
1877 public void DeleteGroupFromScene(bool silent) 1877 public void DeleteGroupFromScene(bool silent)
1878 { 1878 {
@@ -1886,10 +1886,10 @@ namespace OpenSim.Region.Framework.Scenes
1886 { 1886 {
1887 SceneObjectPart part = parts[i]; 1887 SceneObjectPart part = parts[i];
1888 1888
1889 Scene.ForEachRootScenePresence(delegate(ScenePresence avatar) 1889 Scene.ForEachScenePresence(sp =>
1890 { 1890 {
1891 if (avatar.ParentID == LocalId) 1891 if (!sp.IsChildAgent && sp.ParentID == LocalId)
1892 avatar.StandUp(); 1892 sp.StandUp();
1893 1893
1894 if (!silent) 1894 if (!silent)
1895 { 1895 {
@@ -1897,9 +1897,9 @@ namespace OpenSim.Region.Framework.Scenes
1897 if (part == m_rootPart) 1897 if (part == m_rootPart)
1898 { 1898 {
1899 if (!IsAttachment 1899 if (!IsAttachment
1900 || AttachedAvatar == avatar.ControllingClient.AgentId 1900 || AttachedAvatar == sp.UUID
1901 || !HasPrivateAttachmentPoint) 1901 || !HasPrivateAttachmentPoint)
1902 avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId }); 1902 sp.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
1903 } 1903 }
1904 } 1904 }
1905 }); 1905 });
@@ -2208,7 +2208,7 @@ namespace OpenSim.Region.Framework.Scenes
2208 if (!userExposed) 2208 if (!userExposed)
2209 dupe.IsAttachment = true; 2209 dupe.IsAttachment = true;
2210 2210
2211 dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); 2211 dupe.m_sittingAvatars = new List<UUID>();
2212 2212
2213 if (!userExposed) 2213 if (!userExposed)
2214 { 2214 {
@@ -3811,20 +3811,23 @@ namespace OpenSim.Region.Framework.Scenes
3811 /// <summary> 3811 /// <summary>
3812 /// Update just the root prim position in a linkset 3812 /// Update just the root prim position in a linkset
3813 /// </summary> 3813 /// </summary>
3814 /// <param name="pos"></param> 3814 /// <param name="newPos"></param>
3815 public void UpdateRootPosition(Vector3 pos) 3815 public void UpdateRootPosition(Vector3 newPos)
3816 { 3816 {
3817 // needs to be called with phys building true 3817 // needs to be called with phys building true
3818 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); 3818 Vector3 oldPos;
3819 Vector3 oldPos = 3819
3820 new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, 3820 // FIXME: This improves the situation where editing just the root prim of an attached object would send
3821 AbsolutePosition.Y + m_rootPart.OffsetPosition.Y, 3821 // all the other parts to oblivion after detach/reattach. However, a problem remains since the root prim
3822 AbsolutePosition.Z + m_rootPart.OffsetPosition.Z); 3822 // still ends up in the wrong position on reattach.
3823 if (IsAttachment)
3824 oldPos = RootPart.OffsetPosition;
3825 else
3826 oldPos = AbsolutePosition + RootPart.OffsetPosition;
3827
3823 Vector3 diff = oldPos - newPos; 3828 Vector3 diff = oldPos - newPos;
3824 Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
3825 Quaternion partRotation = m_rootPart.RotationOffset; 3829 Quaternion partRotation = m_rootPart.RotationOffset;
3826 axDiff *= Quaternion.Inverse(partRotation); 3830 diff *= Quaternion.Inverse(partRotation);
3827 diff = axDiff;
3828 3831
3829 SceneObjectPart[] parts = m_parts.GetArray(); 3832 SceneObjectPart[] parts = m_parts.GetArray();
3830 for (int i = 0; i < parts.Length; i++) 3833 for (int i = 0; i < parts.Length; i++)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 261e958..cf03d7c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -231,6 +231,13 @@ namespace OpenSim.Region.Framework.Scenes
231 231
232 public double SoundRadius; 232 public double SoundRadius;
233 233
234 /// <summary>
235 /// Should sounds played from this prim be queued?
236 /// </summary>
237 /// <remarks>
238 /// This should only be changed by sound modules. It is up to sound modules as to how they interpret this setting.
239 /// </remarks>
240 public bool SoundQueueing { get; set; }
234 241
235 public uint TimeStampFull; 242 public uint TimeStampFull;
236 243
@@ -383,8 +390,6 @@ namespace OpenSim.Region.Framework.Scenes
383 390
384 private SOPVehicle m_vehicleParams = null; 391 private SOPVehicle m_vehicleParams = null;
385 392
386 private KeyframeMotion m_keyframeMotion = null;
387
388 public KeyframeMotion KeyframeMotion 393 public KeyframeMotion KeyframeMotion
389 { 394 {
390 get; set; 395 get; set;
@@ -536,7 +541,11 @@ namespace OpenSim.Region.Framework.Scenes
536 CreatorID = uuid; 541 CreatorID = uuid;
537 } 542 }
538 if (parts.Length >= 2) 543 if (parts.Length >= 2)
544 {
539 CreatorData = parts[1]; 545 CreatorData = parts[1];
546 if (!CreatorData.EndsWith("/"))
547 CreatorData += "/";
548 }
540 if (parts.Length >= 3) 549 if (parts.Length >= 3)
541 name = parts[2]; 550 name = parts[2];
542 551
@@ -815,7 +824,8 @@ namespace OpenSim.Region.Framework.Scenes
815 } 824 }
816 825
817 // Tell the physics engines that this prim changed. 826 // Tell the physics engines that this prim changed.
818 ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); 827 if (ParentGroup != null && ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene != null)
828 ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
819 } 829 }
820 catch (Exception e) 830 catch (Exception e)
821 { 831 {
@@ -933,7 +943,7 @@ namespace OpenSim.Region.Framework.Scenes
933 //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString()); 943 //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString());
934 } 944 }
935 945
936 if (ParentGroup != null) 946 if (ParentGroup != null && ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene != null)
937 ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); 947 ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
938 //} 948 //}
939 } 949 }
@@ -1218,23 +1228,14 @@ namespace OpenSim.Region.Framework.Scenes
1218 // the mappings more consistant. 1228 // the mappings more consistant.
1219 public Vector3 SitTargetPositionLL 1229 public Vector3 SitTargetPositionLL
1220 { 1230 {
1221 get { return new Vector3(m_sitTargetPosition.X, m_sitTargetPosition.Y,m_sitTargetPosition.Z); } 1231 get { return m_sitTargetPosition; }
1222 set { m_sitTargetPosition = value; } 1232 set { m_sitTargetPosition = value; }
1223 } 1233 }
1224 1234
1225 public Quaternion SitTargetOrientationLL 1235 public Quaternion SitTargetOrientationLL
1226 { 1236 {
1227 get 1237 get { return m_sitTargetOrientation; }
1228 { 1238 set { m_sitTargetOrientation = value; }
1229 return new Quaternion(
1230 m_sitTargetOrientation.X,
1231 m_sitTargetOrientation.Y,
1232 m_sitTargetOrientation.Z,
1233 m_sitTargetOrientation.W
1234 );
1235 }
1236
1237 set { m_sitTargetOrientation = new Quaternion(value.X, value.Y, value.Z, value.W); }
1238 } 1239 }
1239 1240
1240 public bool Stopped 1241 public bool Stopped
@@ -4350,30 +4351,31 @@ namespace OpenSim.Region.Framework.Scenes
4350 } 4351 }
4351 } 4352 }
4352 4353
4353 public void UpdateGroupPosition(Vector3 pos) 4354 public void UpdateGroupPosition(Vector3 newPos)
4354 { 4355 {
4355 if ((pos.X != GroupPosition.X) || 4356 Vector3 oldPos = GroupPosition;
4356 (pos.Y != GroupPosition.Y) || 4357
4357 (pos.Z != GroupPosition.Z)) 4358 if ((newPos.X != oldPos.X) ||
4359 (newPos.Y != oldPos.Y) ||
4360 (newPos.Z != oldPos.Z))
4358 { 4361 {
4359 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
4360 GroupPosition = newPos; 4362 GroupPosition = newPos;
4361 ScheduleTerseUpdate(); 4363 ScheduleTerseUpdate();
4362 } 4364 }
4363 } 4365 }
4364 4366
4365 /// <summary> 4367 /// <summary>
4366 /// 4368 /// Update this part's offset position.
4367 /// </summary> 4369 /// </summary>
4368 /// <param name="pos"></param> 4370 /// <param name="pos"></param>
4369 public void UpdateOffSet(Vector3 pos) 4371 public void UpdateOffSet(Vector3 newPos)
4370 { 4372 {
4371 if ((pos.X != OffsetPosition.X) || 4373 Vector3 oldPos = OffsetPosition;
4372 (pos.Y != OffsetPosition.Y) ||
4373 (pos.Z != OffsetPosition.Z))
4374 {
4375 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
4376 4374
4375 if ((newPos.X != oldPos.X) ||
4376 (newPos.Y != oldPos.Y) ||
4377 (newPos.Z != oldPos.Z))
4378 {
4377 if (ParentGroup.RootPart.GetStatusSandbox()) 4379 if (ParentGroup.RootPart.GetStatusSandbox())
4378 { 4380 {
4379 if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10) 4381 if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10)
@@ -4520,7 +4522,7 @@ namespace OpenSim.Region.Framework.Scenes
4520 // For now, we use the NINJA naming scheme for identifying joints. 4522 // For now, we use the NINJA naming scheme for identifying joints.
4521 // In the future, we can support other joint specification schemes such as a 4523 // In the future, we can support other joint specification schemes such as a
4522 // custom checkbox in the viewer GUI. 4524 // custom checkbox in the viewer GUI.
4523 if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints) 4525 if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
4524 { 4526 {
4525 return IsHingeJoint() || IsBallJoint(); 4527 return IsHingeJoint() || IsBallJoint();
4526 } 4528 }
@@ -4642,6 +4644,11 @@ namespace OpenSim.Region.Framework.Scenes
4642 } 4644 }
4643 } 4645 }
4644*/ 4646*/
4647 if (pa != null)
4648 {
4649 pa.SetMaterial(Material);
4650 DoPhysicsPropertyUpdate(UsePhysics, true);
4651 }
4645 } 4652 }
4646 else // it already has a physical representation 4653 else // it already has a physical representation
4647 { 4654 {
@@ -5014,6 +5021,14 @@ namespace OpenSim.Region.Framework.Scenes
5014 oldTex.DefaultTexture = fallbackOldFace; 5021 oldTex.DefaultTexture = fallbackOldFace;
5015 } 5022 }
5016 5023
5024 // Materials capable viewers can send a ObjectImage packet
5025 // when nothing in TE has changed. MaterialID should be updated
5026 // by the RenderMaterials CAP handler, so updating it here may cause a
5027 // race condtion. Therefore, if no non-materials TE fields have changed,
5028 // we should ignore any changes and not update Shape.TextureEntry
5029
5030 bool otherFieldsChanged = false;
5031
5017 for (int i = 0 ; i < GetNumberOfSides(); i++) 5032 for (int i = 0 ; i < GetNumberOfSides(); i++)
5018 { 5033 {
5019 5034
@@ -5040,18 +5055,36 @@ namespace OpenSim.Region.Framework.Scenes
5040 // Max change, skip the rest of testing 5055 // Max change, skip the rest of testing
5041 if (changeFlags == (Changed.TEXTURE | Changed.COLOR)) 5056 if (changeFlags == (Changed.TEXTURE | Changed.COLOR))
5042 break; 5057 break;
5058
5059 if (!otherFieldsChanged)
5060 {
5061 if (oldFace.Bump != newFace.Bump) otherFieldsChanged = true;
5062 if (oldFace.Fullbright != newFace.Fullbright) otherFieldsChanged = true;
5063 if (oldFace.Glow != newFace.Glow) otherFieldsChanged = true;
5064 if (oldFace.MediaFlags != newFace.MediaFlags) otherFieldsChanged = true;
5065 if (oldFace.OffsetU != newFace.OffsetU) otherFieldsChanged = true;
5066 if (oldFace.OffsetV != newFace.OffsetV) otherFieldsChanged = true;
5067 if (oldFace.RepeatU != newFace.RepeatU) otherFieldsChanged = true;
5068 if (oldFace.RepeatV != newFace.RepeatV) otherFieldsChanged = true;
5069 if (oldFace.Rotation != newFace.Rotation) otherFieldsChanged = true;
5070 if (oldFace.Shiny != newFace.Shiny) otherFieldsChanged = true;
5071 if (oldFace.TexMapType != newFace.TexMapType) otherFieldsChanged = true;
5072 }
5043 } 5073 }
5044 5074
5045 m_shape.TextureEntry = newTex.GetBytes(); 5075 if (changeFlags != 0 || otherFieldsChanged)
5046 if (changeFlags != 0) 5076 {
5047 TriggerScriptChangedEvent(changeFlags); 5077 m_shape.TextureEntry = newTex.GetBytes();
5048 UpdateFlag = UpdateRequired.FULL; 5078 if (changeFlags != 0)
5049 ParentGroup.HasGroupChanged = true; 5079 TriggerScriptChangedEvent(changeFlags);
5080 UpdateFlag = UpdateRequired.FULL;
5081 ParentGroup.HasGroupChanged = true;
5050 5082
5051 //This is madness.. 5083 //This is madness..
5052 //ParentGroup.ScheduleGroupForFullUpdate(); 5084 //ParentGroup.ScheduleGroupForFullUpdate();
5053 //This is sparta 5085 //This is sparta
5054 ScheduleFullUpdate(); 5086 ScheduleFullUpdate();
5087 }
5055 } 5088 }
5056 5089
5057 5090
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index d04d87b..3be0623 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -696,7 +696,8 @@ namespace OpenSim.Region.Framework.Scenes
696 /// </param> 696 /// </param>
697 public void StopScriptInstance(TaskInventoryItem item) 697 public void StopScriptInstance(TaskInventoryItem item)
698 { 698 {
699 m_part.ParentGroup.Scene.EventManager.TriggerStopScript(m_part.LocalId, item.ItemID); 699 if (m_part.ParentGroup.Scene != null)
700 m_part.ParentGroup.Scene.EventManager.TriggerStopScript(m_part.LocalId, item.ItemID);
700 701
701 // At the moment, even stopped scripts are counted as active, which is probably wrong. 702 // At the moment, even stopped scripts are counted as active, which is probably wrong.
702// m_part.ParentGroup.AddActiveScriptCount(-1); 703// m_part.ParentGroup.AddActiveScriptCount(-1);
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7004d23..183d8d1 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -29,7 +29,9 @@ using System;
29using System.Xml; 29using System.Xml;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using System.Threading;
32using System.Timers; 33using System.Timers;
34using Timer = System.Timers.Timer;
33using OpenMetaverse; 35using OpenMetaverse;
34using log4net; 36using log4net;
35using Nini.Config; 37using Nini.Config;
@@ -73,21 +75,40 @@ namespace OpenSim.Region.Framework.Scenes
73 75
74 public class ScenePresence : EntityBase, IScenePresence 76 public class ScenePresence : EntityBase, IScenePresence
75 { 77 {
78 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
79
76// ~ScenePresence() 80// ~ScenePresence()
77// { 81// {
78// m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name); 82// m_log.DebugFormat("[SCENE PRESENCE]: Destructor called on {0}", Name);
79// } 83// }
80 84
81 private void TriggerScenePresenceUpdated() 85 public void TriggerScenePresenceUpdated()
82 { 86 {
83 if (m_scene != null) 87 if (m_scene != null)
84 m_scene.EventManager.TriggerScenePresenceUpdated(this); 88 m_scene.EventManager.TriggerScenePresenceUpdated(this);
85 } 89 }
86 90
87 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
88
89 public PresenceType PresenceType { get; private set; } 91 public PresenceType PresenceType { get; private set; }
90 92
93 private ScenePresenceStateMachine m_stateMachine;
94
95 /// <summary>
96 /// The current state of this presence. Governs only the existence lifecycle. See ScenePresenceStateMachine
97 /// for more details.
98 /// </summary>
99 public ScenePresenceState LifecycleState
100 {
101 get
102 {
103 return m_stateMachine.GetState();
104 }
105
106 set
107 {
108 m_stateMachine.SetState(value);
109 }
110 }
111
91// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); 112// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
92 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); 113 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
93 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); 114 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
@@ -142,6 +163,8 @@ namespace OpenSim.Region.Framework.Scenes
142 private Vector3 m_lastVelocity; 163 private Vector3 m_lastVelocity;
143 private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f); 164 private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f);
144 165
166 private bool m_followCamAuto = false;
167
145 168
146 private Vector3? m_forceToApply; 169 private Vector3? m_forceToApply;
147 private int m_userFlags; 170 private int m_userFlags;
@@ -200,7 +223,7 @@ namespace OpenSim.Region.Framework.Scenes
200 private float m_sitAvatarHeight = 2.0f; 223 private float m_sitAvatarHeight = 2.0f;
201 224
202 private Vector3 m_lastChildAgentUpdatePosition; 225 private Vector3 m_lastChildAgentUpdatePosition;
203 private Vector3 m_lastChildAgentUpdateCamPosition; 226// private Vector3 m_lastChildAgentUpdateCamPosition;
204 227
205 private const int LAND_VELOCITYMAG_MAX = 12; 228 private const int LAND_VELOCITYMAG_MAX = 12;
206 229
@@ -290,9 +313,23 @@ namespace OpenSim.Region.Framework.Scenes
290 /// </summary> 313 /// </summary>
291 private Vector3 posLastSignificantMove; 314 private Vector3 posLastSignificantMove;
292 315
293 // For teleports and crossings callbacks 316 #region For teleports and crossings callbacks
294 string m_callbackURI; 317
295 UUID m_originRegionID; 318 /// <summary>
319 /// In the V1 teleport protocol, the destination simulator sends ReleaseAgent to this address.
320 /// </summary>
321 private string m_callbackURI;
322
323 public UUID m_originRegionID;
324
325 /// <summary>
326 /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent
327 /// teleport is reusing the connection.
328 /// </summary>
329 /// <remarks>May be refactored or move somewhere else soon.</remarks>
330 public bool DoNotCloseAfterTeleport { get; set; }
331
332 #endregion
296 333
297 /// <value> 334 /// <value>
298 /// Script engines present in the scene 335 /// Script engines present in the scene
@@ -795,7 +832,7 @@ namespace OpenSim.Region.Framework.Scenes
795 832
796 public ScenePresence( 833 public ScenePresence(
797 IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type) 834 IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type)
798 { 835 {
799 AttachmentsSyncLock = new Object(); 836 AttachmentsSyncLock = new Object();
800 AllowMovement = true; 837 AllowMovement = true;
801 IsChildAgent = true; 838 IsChildAgent = true;
@@ -841,6 +878,8 @@ namespace OpenSim.Region.Framework.Scenes
841 SetDirectionVectors(); 878 SetDirectionVectors();
842 879
843 Appearance = appearance; 880 Appearance = appearance;
881
882 m_stateMachine = new ScenePresenceStateMachine(this);
844 } 883 }
845 884
846 private void RegionHeartbeatEnd(Scene scene) 885 private void RegionHeartbeatEnd(Scene scene)
@@ -874,6 +913,7 @@ namespace OpenSim.Region.Framework.Scenes
874 { 913 {
875 ControllingClient.OnCompleteMovementToRegion += CompleteMovement; 914 ControllingClient.OnCompleteMovementToRegion += CompleteMovement;
876 ControllingClient.OnAgentUpdate += HandleAgentUpdate; 915 ControllingClient.OnAgentUpdate += HandleAgentUpdate;
916 ControllingClient.OnAgentCameraUpdate += HandleAgentCamerasUpdate;
877 ControllingClient.OnAgentRequestSit += HandleAgentRequestSit; 917 ControllingClient.OnAgentRequestSit += HandleAgentRequestSit;
878 ControllingClient.OnAgentSit += HandleAgentSit; 918 ControllingClient.OnAgentSit += HandleAgentSit;
879 ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun; 919 ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
@@ -937,7 +977,7 @@ namespace OpenSim.Region.Framework.Scenes
937 /// </summary> 977 /// </summary>
938 public void MakeRootAgent(Vector3 pos, bool isFlying) 978 public void MakeRootAgent(Vector3 pos, bool isFlying)
939 { 979 {
940 m_log.DebugFormat( 980 m_log.InfoFormat(
941 "[SCENE]: Upgrading child to root agent for {0} in {1}", 981 "[SCENE]: Upgrading child to root agent for {0} in {1}",
942 Name, m_scene.RegionInfo.RegionName); 982 Name, m_scene.RegionInfo.RegionName);
943 983
@@ -977,6 +1017,11 @@ namespace OpenSim.Region.Framework.Scenes
977 1017
978 IsChildAgent = false; 1018 IsChildAgent = false;
979 1019
1020 // Must reset this here so that a teleport to a region next to an existing region does not keep the flag
1021 // set and prevent the close of the connection on a subsequent re-teleport.
1022 // Should not be needed if we are not trying to tell this region to close
1023// DoNotCloseAfterTeleport = false;
1024
980 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); 1025 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
981 if (gm != null) 1026 if (gm != null)
982 Grouptitle = gm.GetGroupTitle(m_uuid); 1027 Grouptitle = gm.GetGroupTitle(m_uuid);
@@ -1153,7 +1198,6 @@ namespace OpenSim.Region.Framework.Scenes
1153 1198
1154 m_scene.EventManager.TriggerOnMakeRootAgent(this); 1199 m_scene.EventManager.TriggerOnMakeRootAgent(this);
1155 1200
1156 m_scene.EventManager.OnRegionHeartbeatEnd += RegionHeartbeatEnd;
1157 } 1201 }
1158 1202
1159 public int GetStateSource() 1203 public int GetStateSource()
@@ -1306,7 +1350,26 @@ namespace OpenSim.Region.Framework.Scenes
1306 1350
1307 public void StopFlying() 1351 public void StopFlying()
1308 { 1352 {
1309 ControllingClient.StopFlying(this); 1353 Vector3 pos = AbsolutePosition;
1354 if (Appearance.AvatarHeight != 127.0f)
1355 pos += new Vector3(0f, 0f, (Appearance.AvatarHeight / 6f));
1356 else
1357 pos += new Vector3(0f, 0f, (1.56f / 6f));
1358
1359 AbsolutePosition = pos;
1360
1361 // attach a suitable collision plane regardless of the actual situation to force the LLClient to land.
1362 // Collision plane below the avatar's position a 6th of the avatar's height is suitable.
1363 // Mind you, that this method doesn't get called if the avatar's velocity magnitude is greater then a
1364 // certain amount.. because the LLClient wouldn't land in that situation anyway.
1365
1366 // why are we still testing for this really old height value default???
1367 if (Appearance.AvatarHeight != 127.0f)
1368 CollisionPlane = new Vector4(0, 0, 0, pos.Z - Appearance.AvatarHeight / 6f);
1369 else
1370 CollisionPlane = new Vector4(0, 0, 0, pos.Z - (1.56f / 6f));
1371
1372 ControllingClient.SendAgentTerseUpdate(this);
1310 } 1373 }
1311 1374
1312 /// <summary> 1375 /// <summary>
@@ -1480,6 +1543,26 @@ namespace OpenSim.Region.Framework.Scenes
1480 1543
1481 } 1544 }
1482 1545
1546 private bool WaitForUpdateAgent(IClientAPI client)
1547 {
1548 // Before UpdateAgent, m_originRegionID is UUID.Zero; after, it's non-Zero
1549 int count = 50;
1550 while (m_originRegionID.Equals(UUID.Zero) && count-- > 0)
1551 {
1552 m_log.DebugFormat("[SCENE PRESENCE]: Agent {0} waiting for update in {1}", client.Name, Scene.Name);
1553 Thread.Sleep(200);
1554 }
1555
1556 if (m_originRegionID.Equals(UUID.Zero))
1557 {
1558 // Movement into region will fail
1559 m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} never arrived in {1}", client.Name, Scene.Name);
1560 return false;
1561 }
1562
1563 return true;
1564 }
1565
1483 /// <summary> 1566 /// <summary>
1484 /// Complete Avatar's movement into the region. 1567 /// Complete Avatar's movement into the region.
1485 /// </summary> 1568 /// </summary>
@@ -1497,6 +1580,15 @@ namespace OpenSim.Region.Framework.Scenes
1497 "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", 1580 "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
1498 client.Name, Scene.RegionInfo.RegionName, AbsolutePosition); 1581 client.Name, Scene.RegionInfo.RegionName, AbsolutePosition);
1499 1582
1583 // Make sure it's not a login agent. We don't want to wait for updates during login
1584 if (PresenceType != PresenceType.Npc && (m_teleportFlags & TeleportFlags.ViaLogin) == 0)
1585 {
1586 // Let's wait until UpdateAgent (called by departing region) is done
1587 if (!WaitForUpdateAgent(client))
1588 // The sending region never sent the UpdateAgent data, we have to refuse
1589 return;
1590 }
1591
1500 Vector3 look = Velocity; 1592 Vector3 look = Velocity;
1501 1593
1502 // if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) 1594 // if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
@@ -1518,11 +1610,17 @@ namespace OpenSim.Region.Framework.Scenes
1518 1610
1519 bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); 1611 bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1520 MakeRootAgent(AbsolutePosition, flying); 1612 MakeRootAgent(AbsolutePosition, flying);
1613
1614 // Tell the client that we're totally ready
1521 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); 1615 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
1522 1616
1617 // Remember in HandleUseCircuitCode, we delayed this to here
1618 if (m_teleportFlags > 0)
1619 SendInitialDataToMe();
1620
1523// m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); 1621// m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
1524 1622
1525 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1623 if (!string.IsNullOrEmpty(m_callbackURI))
1526 { 1624 {
1527 // We cannot sleep here since this would hold up the inbound packet processing thread, as 1625 // We cannot sleep here since this would hold up the inbound packet processing thread, as
1528 // CompleteMovement() is executed synchronously. However, it might be better to delay the release 1626 // CompleteMovement() is executed synchronously. However, it might be better to delay the release
@@ -1550,7 +1648,6 @@ namespace OpenSim.Region.Framework.Scenes
1550 // Create child agents in neighbouring regions 1648 // Create child agents in neighbouring regions
1551 if (openChildAgents && !IsChildAgent) 1649 if (openChildAgents && !IsChildAgent)
1552 { 1650 {
1553
1554 IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); 1651 IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
1555 if (m_agentTransfer != null) 1652 if (m_agentTransfer != null)
1556 m_agentTransfer.EnableChildAgents(this); 1653 m_agentTransfer.EnableChildAgents(this);
@@ -1573,6 +1670,7 @@ namespace OpenSim.Region.Framework.Scenes
1573// m_log.DebugFormat( 1670// m_log.DebugFormat(
1574// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", 1671// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms",
1575// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); 1672// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds);
1673
1576 } 1674 }
1577 1675
1578 /// <summary> 1676 /// <summary>
@@ -1653,9 +1751,9 @@ namespace OpenSim.Region.Framework.Scenes
1653 /// </summary> 1751 /// </summary>
1654 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1752 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1655 { 1753 {
1656// m_log.DebugFormat( 1754 //m_log.DebugFormat(
1657// "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", 1755 // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}",
1658// Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags); 1756 // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
1659 1757
1660 if (IsChildAgent) 1758 if (IsChildAgent)
1661 { 1759 {
@@ -1663,10 +1761,6 @@ namespace OpenSim.Region.Framework.Scenes
1663 return; 1761 return;
1664 } 1762 }
1665 1763
1666 ++m_movementUpdateCount;
1667 if (m_movementUpdateCount < 1)
1668 m_movementUpdateCount = 1;
1669
1670 #region Sanity Checking 1764 #region Sanity Checking
1671 1765
1672 // This is irritating. Really. 1766 // This is irritating. Really.
@@ -1697,21 +1791,6 @@ namespace OpenSim.Region.Framework.Scenes
1697 1791
1698 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags; 1792 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1699 1793
1700 // Camera location in world. We'll need to raytrace
1701 // from this location from time to time.
1702 CameraPosition = agentData.CameraCenter;
1703 if (Vector3.Distance(m_lastCameraPosition, CameraPosition) >= Scene.RootReprioritizationDistance)
1704 {
1705 ReprioritizeUpdates();
1706 m_lastCameraPosition = CameraPosition;
1707 }
1708
1709 // Use these three vectors to figure out what the agent is looking at
1710 // Convert it to a Matrix and/or Quaternion
1711 CameraAtAxis = agentData.CameraAtAxis;
1712 CameraLeftAxis = agentData.CameraLeftAxis;
1713 CameraUpAxis = agentData.CameraUpAxis;
1714
1715 // The Agent's Draw distance setting 1794 // The Agent's Draw distance setting
1716 // When we get to the point of re-computing neighbors everytime this 1795 // When we get to the point of re-computing neighbors everytime this
1717 // changes, then start using the agent's drawdistance rather than the 1796 // changes, then start using the agent's drawdistance rather than the
@@ -1783,8 +1862,14 @@ namespace OpenSim.Region.Framework.Scenes
1783 // Here's where you get them. 1862 // Here's where you get them.
1784 m_AgentControlFlags = flags; 1863 m_AgentControlFlags = flags;
1785 m_headrotation = agentData.HeadRotation; 1864 m_headrotation = agentData.HeadRotation;
1865 byte oldState = State;
1786 State = agentData.State; 1866 State = agentData.State;
1787 1867
1868 // We need to send this back to the client in order to stop the edit beams
1869 if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None)
1870 ControllingClient.SendAgentTerseUpdate(this);
1871
1872
1788 PhysicsActor actor = PhysicsActor; 1873 PhysicsActor actor = PhysicsActor;
1789 if (actor == null) 1874 if (actor == null)
1790 { 1875 {
@@ -1996,10 +2081,78 @@ namespace OpenSim.Region.Framework.Scenes
1996 SendControlsToScripts(flagsForScripts); 2081 SendControlsToScripts(flagsForScripts);
1997 } 2082 }
1998 2083
2084 // We need to send this back to the client in order to see the edit beams
2085 if ((State & (uint)AgentState.Editing) != 0)
2086 ControllingClient.SendAgentTerseUpdate(this);
2087
1999 m_scene.EventManager.TriggerOnClientMovement(this); 2088 m_scene.EventManager.TriggerOnClientMovement(this);
2000 TriggerScenePresenceUpdated();
2001 } 2089 }
2002 2090
2091
2092 /// <summary>
2093 /// This is the event handler for client cameras. If a client is moving, or moving the camera, this event is triggering.
2094 /// </summary>
2095 private void HandleAgentCamerasUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
2096 {
2097 //m_log.DebugFormat(
2098 // "[SCENE PRESENCE]: In {0} received agent camera update from {1}, flags {2}",
2099 // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
2100
2101 if (IsChildAgent)
2102 {
2103 // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
2104 return;
2105 }
2106
2107 ++m_movementUpdateCount;
2108 if (m_movementUpdateCount < 1)
2109 m_movementUpdateCount = 1;
2110
2111// AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
2112
2113 // Camera location in world. We'll need to raytrace
2114 // from this location from time to time.
2115 CameraPosition = agentData.CameraCenter;
2116 if (Vector3.Distance(m_lastCameraPosition, CameraPosition) >= Scene.RootReprioritizationDistance)
2117 {
2118 ReprioritizeUpdates();
2119 m_lastCameraPosition = CameraPosition;
2120 }
2121
2122 // Use these three vectors to figure out what the agent is looking at
2123 // Convert it to a Matrix and/or Quaternion
2124 CameraAtAxis = agentData.CameraAtAxis;
2125 CameraLeftAxis = agentData.CameraLeftAxis;
2126 CameraUpAxis = agentData.CameraUpAxis;
2127
2128 // The Agent's Draw distance setting
2129 // When we get to the point of re-computing neighbors everytime this
2130 // changes, then start using the agent's drawdistance rather than the
2131 // region's draw distance.
2132 // DrawDistance = agentData.Far;
2133 DrawDistance = Scene.DefaultDrawDistance;
2134
2135 // Check if Client has camera in 'follow cam' or 'build' mode.
2136 Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
2137
2138 m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
2139 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
2140
2141
2142 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
2143 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
2144 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
2145 {
2146 if (m_followCamAuto)
2147 {
2148 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
2149 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
2150 }
2151 }
2152
2153 TriggerScenePresenceUpdated();
2154 }
2155
2003 /// <summary> 2156 /// <summary>
2004 /// Calculate an update to move the presence to the set target. 2157 /// Calculate an update to move the presence to the set target.
2005 /// </summary> 2158 /// </summary>
@@ -2309,6 +2462,7 @@ namespace OpenSim.Region.Framework.Scenes
2309 AddToPhysicalScene(false); 2462 AddToPhysicalScene(false);
2310 2463
2311 Animator.TrySetMovementAnimation("STAND"); 2464 Animator.TrySetMovementAnimation("STAND");
2465 TriggerScenePresenceUpdated();
2312 } 2466 }
2313 2467
2314 private SceneObjectPart FindNextAvailableSitTarget(UUID targetID) 2468 private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
@@ -2407,7 +2561,7 @@ namespace OpenSim.Region.Framework.Scenes
2407 ControllingClient.SendSitResponse( 2561 ControllingClient.SendSitResponse(
2408 part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook); 2562 part.UUID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
2409 2563
2410 m_requestedSitTargetUUID = targetID; 2564 m_requestedSitTargetUUID = part.UUID;
2411 2565
2412 HandleAgentSit(ControllingClient, UUID); 2566 HandleAgentSit(ControllingClient, UUID);
2413 2567
@@ -2435,7 +2589,7 @@ namespace OpenSim.Region.Framework.Scenes
2435 if (part != null) 2589 if (part != null)
2436 { 2590 {
2437 m_requestedSitTargetID = part.LocalId; 2591 m_requestedSitTargetID = part.LocalId;
2438 m_requestedSitTargetUUID = targetID; 2592 m_requestedSitTargetUUID = part.UUID;
2439 2593
2440 } 2594 }
2441 else 2595 else
@@ -2554,6 +2708,9 @@ namespace OpenSim.Region.Framework.Scenes
2554 2708
2555 public void HandleAgentSit(IClientAPI remoteClient, UUID agentID) 2709 public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
2556 { 2710 {
2711 if (IsChildAgent)
2712 return;
2713
2557 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID); 2714 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
2558 2715
2559 if (part != null) 2716 if (part != null)
@@ -2634,14 +2791,19 @@ namespace OpenSim.Region.Framework.Scenes
2634 } 2791 }
2635 Animator.TrySetMovementAnimation(sitAnimation); 2792 Animator.TrySetMovementAnimation(sitAnimation);
2636 SendAvatarDataToAllAgents(); 2793 SendAvatarDataToAllAgents();
2794 TriggerScenePresenceUpdated();
2637 } 2795 }
2638 } 2796 }
2639 2797
2640 public void HandleAgentSitOnGround() 2798 public void HandleAgentSitOnGround()
2641 { 2799 {
2800 if (IsChildAgent)
2801 return;
2802
2642// m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.. 2803// m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick..
2643 m_AngularVelocity = Vector3.Zero; 2804 m_AngularVelocity = Vector3.Zero;
2644 Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); 2805 Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
2806 TriggerScenePresenceUpdated();
2645 SitGround = true; 2807 SitGround = true;
2646 RemoveFromPhysicalScene(); 2808 RemoveFromPhysicalScene();
2647 } 2809 }
@@ -2658,11 +2820,13 @@ namespace OpenSim.Region.Framework.Scenes
2658 public void HandleStartAnim(IClientAPI remoteClient, UUID animID) 2820 public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
2659 { 2821 {
2660 Animator.AddAnimation(animID, UUID.Zero); 2822 Animator.AddAnimation(animID, UUID.Zero);
2823 TriggerScenePresenceUpdated();
2661 } 2824 }
2662 2825
2663 public void HandleStopAnim(IClientAPI remoteClient, UUID animID) 2826 public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
2664 { 2827 {
2665 Animator.RemoveAnimation(animID, false); 2828 Animator.RemoveAnimation(animID, false);
2829 TriggerScenePresenceUpdated();
2666 } 2830 }
2667 2831
2668 public void avnHandleChangeAnim(UUID animID, bool addRemove,bool sendPack) 2832 public void avnHandleChangeAnim(UUID animID, bool addRemove,bool sendPack)
@@ -2880,11 +3044,12 @@ namespace OpenSim.Region.Framework.Scenes
2880 SendOtherAgentsAppearanceToMe(); 3044 SendOtherAgentsAppearanceToMe();
2881 3045
2882 EntityBase[] entities = Scene.Entities.GetEntities(); 3046 EntityBase[] entities = Scene.Entities.GetEntities();
2883 foreach(EntityBase e in entities) 3047 foreach (EntityBase e in entities)
2884 { 3048 {
2885 if (e != null && e is SceneObjectGroup) 3049 if (e != null && e is SceneObjectGroup)
2886 ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); 3050 ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient);
2887 } 3051 }
3052
2888 }); 3053 });
2889 } 3054 }
2890 3055
@@ -3079,11 +3244,10 @@ namespace OpenSim.Region.Framework.Scenes
3079 } 3244 }
3080 3245
3081 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 3246 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
3082 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || 3247 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance)
3083 Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
3084 { 3248 {
3085 m_lastChildAgentUpdatePosition = AbsolutePosition; 3249 m_lastChildAgentUpdatePosition = AbsolutePosition;
3086 m_lastChildAgentUpdateCamPosition = CameraPosition; 3250// m_lastChildAgentUpdateCamPosition = CameraPosition;
3087 3251
3088 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 3252 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
3089 cadu.ActiveGroupID = UUID.Zero.Guid; 3253 cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -3110,7 +3274,7 @@ namespace OpenSim.Region.Framework.Scenes
3110 cadu.Velocity = Velocity; 3274 cadu.Velocity = Velocity;
3111 3275
3112 AgentPosition agentpos = new AgentPosition(); 3276 AgentPosition agentpos = new AgentPosition();
3113 agentpos.CopyFrom(cadu); 3277 agentpos.CopyFrom(cadu, ControllingClient.SessionId);
3114 3278
3115 // Let's get this out of the update loop 3279 // Let's get this out of the update loop
3116 Util.FireAndForget(delegate { m_scene.SendOutChildAgentUpdates(agentpos, this); }); 3280 Util.FireAndForget(delegate { m_scene.SendOutChildAgentUpdates(agentpos, this); });
@@ -3294,11 +3458,6 @@ namespace OpenSim.Region.Framework.Scenes
3294 } 3458 }
3295 } 3459 }
3296 3460
3297 public void RestoreInCurrentScene()
3298 {
3299 AddToPhysicalScene(false); // not exactly false
3300 }
3301
3302 public void Reset() 3461 public void Reset()
3303 { 3462 {
3304// m_log.DebugFormat("[SCENE PRESENCE]: Resetting {0} in {1}", Name, Scene.RegionInfo.RegionName); 3463// m_log.DebugFormat("[SCENE PRESENCE]: Resetting {0} in {1}", Name, Scene.RegionInfo.RegionName);
@@ -3348,10 +3507,12 @@ namespace OpenSim.Region.Framework.Scenes
3348 if (byebyeRegions.Count > 0) 3507 if (byebyeRegions.Count > 0)
3349 { 3508 {
3350 m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents"); 3509 m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents");
3351 Util.FireAndForget(delegate 3510
3352 { 3511 AgentCircuitData acd = Scene.AuthenticateHandler.GetAgentCircuitData(UUID);
3353 m_scene.SceneGridService.SendCloseChildAgentConnections(ControllingClient.AgentId, byebyeRegions); 3512 string auth = string.Empty;
3354 }); 3513 if (acd != null)
3514 auth = acd.SessionID.ToString();
3515 m_scene.SceneGridService.SendCloseChildAgentConnections(ControllingClient.AgentId, auth, byebyeRegions);
3355 } 3516 }
3356 3517
3357 foreach (ulong handle in byebyeRegions) 3518 foreach (ulong handle in byebyeRegions)
@@ -3452,6 +3613,7 @@ namespace OpenSim.Region.Framework.Scenes
3452 3613
3453 cAgent.AgentID = UUID; 3614 cAgent.AgentID = UUID;
3454 cAgent.RegionID = Scene.RegionInfo.RegionID; 3615 cAgent.RegionID = Scene.RegionInfo.RegionID;
3616 cAgent.SessionID = ControllingClient.SessionId;
3455 3617
3456 cAgent.Position = AbsolutePosition; 3618 cAgent.Position = AbsolutePosition;
3457 cAgent.Velocity = m_velocity; 3619 cAgent.Velocity = m_velocity;
@@ -3694,7 +3856,8 @@ namespace OpenSim.Region.Framework.Scenes
3694 3856
3695// if (m_updateCount > 0) 3857// if (m_updateCount > 0)
3696// { 3858// {
3697 Animator.UpdateMovementAnimations(); 3859 if (Animator.UpdateMovementAnimations())
3860 TriggerScenePresenceUpdated();
3698// m_updateCount--; 3861// m_updateCount--;
3699// } 3862// }
3700 3863
@@ -3858,6 +4021,7 @@ namespace OpenSim.Region.Framework.Scenes
3858// Animator.Close(); 4021// Animator.Close();
3859 Animator = null; 4022 Animator = null;
3860 4023
4024 LifecycleState = ScenePresenceState.Removed;
3861 } 4025 }
3862 4026
3863 public void AddAttachment(SceneObjectGroup gobj) 4027 public void AddAttachment(SceneObjectGroup gobj)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresenceStateMachine.cs b/OpenSim/Region/Framework/Scenes/ScenePresenceStateMachine.cs
new file mode 100644
index 0000000..cae7fe5
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/ScenePresenceStateMachine.cs
@@ -0,0 +1,113 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29
30namespace OpenSim.Region.Framework.Scenes
31{
32 /// <summary>
33 /// The possible states that a scene presence can be in. This is currently orthagonal to whether a scene presence
34 /// is root or child.
35 /// </summary>
36 /// <remarks>
37 /// This is a state machine.
38 ///
39 /// [Entry] => Running
40 /// Running => PreRemove, Removing
41 /// PreRemove => Running, Removing
42 /// Removing => Removed
43 ///
44 /// All other methods should only see the scene presence in running state - this is the normal operational state
45 /// Removed state occurs when the presence has been removed. This is the end state with no exit.
46 /// </remarks>
47 public enum ScenePresenceState
48 {
49 Running, // Normal operation state. The scene presence is available.
50 PreRemove, // The presence is due to be removed but can still be returning to running.
51 Removing, // The presence is in the process of being removed from the scene via Scene.RemoveClient.
52 Removed, // The presence has been removed from the scene and is effectively dead.
53 // There is no exit from this state.
54 }
55
56 internal class ScenePresenceStateMachine
57 {
58 private ScenePresence m_sp;
59 private ScenePresenceState m_state;
60
61 internal ScenePresenceStateMachine(ScenePresence sp)
62 {
63 m_sp = sp;
64 m_state = ScenePresenceState.Running;
65 }
66
67 internal ScenePresenceState GetState()
68 {
69 return m_state;
70 }
71
72 /// <summary>
73 /// Updates the state of an agent that is already in transit.
74 /// </summary>
75 /// <param name='id'></param>
76 /// <param name='newState'></param>
77 /// <returns></returns>
78 /// <exception cref='Exception'>Illegal transitions will throw an Exception</exception>
79 internal void SetState(ScenePresenceState newState)
80 {
81 bool transitionOkay = false;
82
83 lock (this)
84 {
85 if (newState == m_state)
86 return;
87 else if (newState == ScenePresenceState.Running && m_state == ScenePresenceState.PreRemove)
88 transitionOkay = true;
89 else if (newState == ScenePresenceState.PreRemove && m_state == ScenePresenceState.Running)
90 transitionOkay = true;
91 else if (newState == ScenePresenceState.Removing)
92 {
93 if (m_state == ScenePresenceState.Running || m_state == ScenePresenceState.PreRemove)
94 transitionOkay = true;
95 }
96 else if (newState == ScenePresenceState.Removed && m_state == ScenePresenceState.Removing)
97 transitionOkay = true;
98 }
99
100 if (!transitionOkay)
101 {
102 throw new Exception(
103 string.Format(
104 "Scene presence {0} is not allowed to move from state {1} to new state {2} in {3}",
105 m_sp.Name, m_state, newState, m_sp.Scene.Name));
106 }
107 else
108 {
109 m_state = newState;
110 }
111 }
112 }
113} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index ce4fb40..68918d3 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -1346,7 +1346,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1346 if (sop.MediaUrl != null) 1346 if (sop.MediaUrl != null)
1347 writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString()); 1347 writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString());
1348 1348
1349 if (sop.DynAttrs.Count > 0) 1349 if (sop.DynAttrs.CountNamespaces > 0)
1350 { 1350 {
1351 writer.WriteStartElement("DynAttrs"); 1351 writer.WriteStartElement("DynAttrs");
1352 sop.DynAttrs.WriteXml(writer); 1352 sop.DynAttrs.WriteXml(writer);
diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
index 5398ab9..bf32251 100644
--- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs
@@ -290,6 +290,9 @@ namespace OpenSim.Region.Framework.Scenes
290 290
291 private void statsHeartBeat(object sender, EventArgs e) 291 private void statsHeartBeat(object sender, EventArgs e)
292 { 292 {
293 if (!m_scene.Active)
294 return;
295
293 SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23]; 296 SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23];
294 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); 297 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
295 298
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
index 9557cd0..95b30d5 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectDeRezTests.cs
@@ -33,7 +33,9 @@ using NUnit.Framework;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Communications; 35using OpenSim.Framework.Communications;
36using OpenSim.Region.CoreModules.Framework.EntityTransfer;
36using OpenSim.Region.CoreModules.Framework.InventoryAccess; 37using OpenSim.Region.CoreModules.Framework.InventoryAccess;
38using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
37using OpenSim.Region.CoreModules.World.Permissions; 39using OpenSim.Region.CoreModules.World.Permissions;
38using OpenSim.Region.Framework.Scenes; 40using OpenSim.Region.Framework.Scenes;
39using OpenSim.Services.Interfaces; 41using OpenSim.Services.Interfaces;
@@ -52,6 +54,24 @@ namespace OpenSim.Region.Framework.Scenes.Tests
52 [TestFixture] 54 [TestFixture]
53 public class SceneObjectDeRezTests : OpenSimTestCase 55 public class SceneObjectDeRezTests : OpenSimTestCase
54 { 56 {
57 [TestFixtureSetUp]
58 public void FixtureInit()
59 {
60 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
61 // This facility was added after the original async delete tests were written, so it may be possible now
62 // to not bother explicitly disabling their async (since everything will be running sync).
63 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
64 }
65
66 [TestFixtureTearDown]
67 public void TearDown()
68 {
69 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
70 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
71 // tests really shouldn't).
72 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
73 }
74
55 /// <summary> 75 /// <summary>
56 /// Test deleting an object from a scene. 76 /// Test deleting an object from a scene.
57 /// </summary> 77 /// </summary>
@@ -59,7 +79,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests
59 public void TestDeRezSceneObject() 79 public void TestDeRezSceneObject()
60 { 80 {
61 TestHelpers.InMethod(); 81 TestHelpers.InMethod();
62// log4net.Config.XmlConfigurator.Configure();
63 82
64 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001"); 83 UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
65 84
@@ -73,32 +92,77 @@ namespace OpenSim.Region.Framework.Scenes.Tests
73 // Turn off the timer on the async sog deleter - we'll crank it by hand for this test. 92 // Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
74 AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter; 93 AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
75 sogd.Enabled = false; 94 sogd.Enabled = false;
76 95
77 SceneObjectPart part 96 SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, "so1", userId);
78 = new SceneObjectPart(userId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); 97 uint soLocalId = so.LocalId;
79 part.Name = "obj1";
80 scene.AddNewSceneObject(new SceneObjectGroup(part), false);
81 98
82 List<uint> localIds = new List<uint>(); 99 List<uint> localIds = new List<uint>();
83 localIds.Add(part.LocalId); 100 localIds.Add(so.LocalId);
84 scene.DeRezObjects(client, localIds, UUID.Zero, DeRezAction.Delete, UUID.Zero); 101 scene.DeRezObjects(client, localIds, UUID.Zero, DeRezAction.Delete, UUID.Zero);
85 102
86 // Check that object isn't deleted until we crank the sogd handle. 103 // Check that object isn't deleted until we crank the sogd handle.
87 SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId); 104 SceneObjectPart retrievedPart = scene.GetSceneObjectPart(so.LocalId);
88 Assert.That(retrievedPart, Is.Not.Null); 105 Assert.That(retrievedPart, Is.Not.Null);
89 Assert.That(retrievedPart.ParentGroup.IsDeleted, Is.False); 106 Assert.That(retrievedPart.ParentGroup.IsDeleted, Is.False);
90 107
91 sogd.InventoryDeQueueAndDelete(); 108 sogd.InventoryDeQueueAndDelete();
92 109
93 SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(part.LocalId); 110 SceneObjectPart retrievedPart2 = scene.GetSceneObjectPart(so.LocalId);
94 Assert.That(retrievedPart2, Is.Null); 111 Assert.That(retrievedPart2, Is.Null);
112 }
113
114 /// <summary>
115 /// Test that child and root agents correctly receive KillObject notifications.
116 /// </summary>
117 [Test]
118 public void TestDeRezSceneObjectToAgents()
119 {
120 TestHelpers.InMethod();
121// TestHelpers.EnableLogging();
122
123 SceneHelpers sh = new SceneHelpers();
124 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
125 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999);
126
127 // We need this so that the creation of the root client for userB in sceneB can trigger the creation of a child client in sceneA
128 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
129 EntityTransferModule etmB = new EntityTransferModule();
130 IConfigSource config = new IniConfigSource();
131 IConfig modulesConfig = config.AddConfig("Modules");
132 modulesConfig.Set("EntityTransferModule", etmB.Name);
133 modulesConfig.Set("SimulationServices", lscm.Name);
134 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
135 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
136
137 // We need this for derez
138 //SceneHelpers.SetupSceneModules(sceneA, new PermissionsModule());
139
140 UserAccount uaA = UserAccountHelpers.CreateUserWithInventory(sceneA, "Andy", "AAA", 0x1, "");
141 UserAccount uaB = UserAccountHelpers.CreateUserWithInventory(sceneA, "Brian", "BBB", 0x2, "");
142
143 TestClient clientA = (TestClient)SceneHelpers.AddScenePresence(sceneA, uaA).ControllingClient;
144
145 // This is the more long-winded route we have to take to get a child client created for userB in sceneA
146 // rather than just calling AddScenePresence() as for userA
147 AgentCircuitData acd = SceneHelpers.GenerateAgentData(uaB);
148 TestClient clientB = new TestClient(acd, sceneB);
149 List<TestClient> childClientsB = new List<TestClient>();
150 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(clientB, childClientsB);
151
152 SceneHelpers.AddScenePresence(sceneB, clientB, acd);
153
154 SceneObjectGroup so = SceneHelpers.AddSceneObject(sceneA);
155 uint soLocalId = so.LocalId;
156
157 sceneA.DeleteSceneObject(so, false);
95 } 158 }
96 159
97 /// <summary> 160 /// <summary>
98 /// Test deleting an object from a scene where the deleter is not the owner 161 /// Test deleting an object from a scene where the deleter is not the owner
99 /// </summary> 162 /// </summary>
100 /// 163 /// <remarks>
101 /// This test assumes that the deleter is not a god. 164 /// This test assumes that the deleter is not a god.
165 /// </remarks>
102 [Test] 166 [Test]
103 public void TestDeRezSceneObjectNotOwner() 167 public void TestDeRezSceneObjectNotOwner()
104 { 168 {
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
index bbfbbfc..bbe34d2 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
@@ -119,7 +119,20 @@ namespace OpenSim.Region.Framework.Scenes.Tests
119 119
120 UUID spUuid = TestHelpers.ParseTail(0x1); 120 UUID spUuid = TestHelpers.ParseTail(0x1);
121 121
122 // The etm is only invoked by this test to check whether an agent is still in transit if there is a dupe
123 EntityTransferModule etm = new EntityTransferModule();
124
125 IConfigSource config = new IniConfigSource();
126 IConfig modulesConfig = config.AddConfig("Modules");
127 modulesConfig.Set("EntityTransferModule", etm.Name);
128 IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
129
130 // In order to run a single threaded regression test we do not want the entity transfer module waiting
131 // for a callback from the destination scene before removing its avatar data.
132 entityTransferConfig.Set("wait_for_callback", false);
133
122 TestScene scene = new SceneHelpers().SetupScene(); 134 TestScene scene = new SceneHelpers().SetupScene();
135 SceneHelpers.SetupSceneModules(scene, config, etm);
123 SceneHelpers.AddScenePresence(scene, spUuid); 136 SceneHelpers.AddScenePresence(scene, spUuid);
124 SceneHelpers.AddScenePresence(scene, spUuid); 137 SceneHelpers.AddScenePresence(scene, spUuid);
125 138
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs
new file mode 100644
index 0000000..4ae7a8e
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs
@@ -0,0 +1,88 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using System.Threading;
33using System.Timers;
34using Timer = System.Timers.Timer;
35using Nini.Config;
36using NUnit.Framework;
37using OpenMetaverse;
38using OpenSim.Framework;
39using OpenSim.Framework.Communications;
40using OpenSim.Framework.Servers;
41using OpenSim.Framework.Servers.HttpServer;
42using OpenSim.Region.ClientStack.Linden;
43using OpenSim.Region.CoreModules.Framework;
44using OpenSim.Region.CoreModules.Framework.EntityTransfer;
45using OpenSim.Region.CoreModules.World.Serialiser;
46using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
47using OpenSim.Region.Framework.Scenes;
48using OpenSim.Region.Framework.Interfaces;
49using OpenSim.Tests.Common;
50using OpenSim.Tests.Common.Mock;
51using GridRegion = OpenSim.Services.Interfaces.GridRegion;
52
53namespace OpenSim.Region.Framework.Scenes.Tests
54{
55 [TestFixture]
56 public class ScenePresenceCapabilityTests : OpenSimTestCase
57 {
58 [Test]
59 public void TestChildAgentSingleRegionCapabilities()
60 {
61 TestHelpers.InMethod();
62// TestHelpers.EnableLogging();
63
64 UUID spUuid = TestHelpers.ParseTail(0x1);
65
66 // XXX: This is not great since the use of statics will mean that this has to be manually cleaned up for
67 // any subsequent test.
68 // XXX: May replace with a mock IHttpServer later.
69 BaseHttpServer httpServer = new BaseHttpServer(99999);
70 MainServer.AddHttpServer(httpServer);
71 MainServer.Instance = httpServer;
72
73 CapabilitiesModule capsMod = new CapabilitiesModule();
74 TestScene scene = new SceneHelpers().SetupScene();
75 SceneHelpers.SetupSceneModules(scene, capsMod);
76
77 ScenePresence sp = SceneHelpers.AddChildScenePresence(scene, spUuid);
78 //Assert.That(capsMod.GetCapsForUser(spUuid), Is.Not.Null);
79
80 // TODO: Need to add tests for other ICapabiltiesModule methods.
81
82 scene.IncomingCloseAgent(sp.UUID, false);
83 //Assert.That(capsMod.GetCapsForUser(spUuid), Is.Null);
84
85 // TODO: Need to add tests for other ICapabiltiesModule methods.
86 }
87 }
88}
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
index 8775949..12a778b 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCrossingTests.cs
@@ -95,11 +95,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
95 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); 95 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
96 96
97 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); 97 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
98 TestClient tc = new TestClient(acd, sceneA, sh.SceneManager); 98 TestClient tc = new TestClient(acd, sceneA);
99 List<TestClient> destinationTestClients = new List<TestClient>(); 99 List<TestClient> destinationTestClients = new List<TestClient>();
100 EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); 100 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
101 101
102 ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager); 102 ScenePresence originalSp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
103 originalSp.AbsolutePosition = new Vector3(128, 32, 10); 103 originalSp.AbsolutePosition = new Vector3(128, 32, 10);
104 104
105// originalSp.Flying = true; 105// originalSp.Flying = true;
@@ -112,6 +112,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
112 //moveArgs.BodyRotation = Quaternion.CreateFromEulers(Vector3.Zero); 112 //moveArgs.BodyRotation = Quaternion.CreateFromEulers(Vector3.Zero);
113 moveArgs.BodyRotation = Quaternion.CreateFromEulers(new Vector3(0, 0, (float)-(Math.PI / 2))); 113 moveArgs.BodyRotation = Quaternion.CreateFromEulers(new Vector3(0, 0, (float)-(Math.PI / 2)));
114 moveArgs.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS; 114 moveArgs.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
115 moveArgs.SessionID = acd.SessionID;
115 116
116 originalSp.HandleAgentUpdate(originalSp.ControllingClient, moveArgs); 117 originalSp.HandleAgentUpdate(originalSp.ControllingClient, moveArgs);
117 118
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index 8d94d29..fff542b 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.IO; 30using System.IO;
31using System.Net; 31using System.Net;
32using System.Text; 32using System.Text;
33using System.Threading;
33using Nini.Config; 34using Nini.Config;
34using NUnit.Framework; 35using NUnit.Framework;
35using OpenMetaverse; 36using OpenMetaverse;
@@ -107,7 +108,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
107 } 108 }
108 109
109 [Test] 110 [Test]
110 public void TestSameSimulatorIsolatedRegions() 111 public void TestSameSimulatorIsolatedRegionsV1()
111 { 112 {
112 TestHelpers.InMethod(); 113 TestHelpers.InMethod();
113// TestHelpers.EnableLogging(); 114// TestHelpers.EnableLogging();
@@ -136,14 +137,18 @@ namespace OpenSim.Region.Framework.Scenes.Tests
136 SceneHelpers.SetupSceneModules(sceneB, config, etmB); 137 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
137 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); 138 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
138 139
140 // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
141 lscm.ServiceVersion = "SIMULATION/0.1";
142
139 Vector3 teleportPosition = new Vector3(10, 11, 12); 143 Vector3 teleportPosition = new Vector3(10, 11, 12);
140 Vector3 teleportLookAt = new Vector3(20, 21, 22); 144 Vector3 teleportLookAt = new Vector3(20, 21, 22);
141 145
142 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); 146 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
143 sp.AbsolutePosition = new Vector3(30, 31, 32); 147 sp.AbsolutePosition = new Vector3(30, 31, 32);
144 148
145 List<TestClient> destinationTestClients = new List<TestClient>(); 149 List<TestClient> destinationTestClients = new List<TestClient>();
146 EntityTransferHelpers.SetUpInformClientOfNeighbour((TestClient)sp.ControllingClient, destinationTestClients); 150 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(
151 (TestClient)sp.ControllingClient, destinationTestClients);
147 152
148 sceneA.RequestTeleportLocation( 153 sceneA.RequestTeleportLocation(
149 sp.ControllingClient, 154 sp.ControllingClient,
@@ -176,6 +181,67 @@ namespace OpenSim.Region.Framework.Scenes.Tests
176// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt)); 181// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
177 } 182 }
178 183
184 [Test]
185 public void TestSameSimulatorIsolatedRegionsV2()
186 {
187 TestHelpers.InMethod();
188// TestHelpers.EnableLogging();
189
190 UUID userId = TestHelpers.ParseTail(0x1);
191
192 EntityTransferModule etmA = new EntityTransferModule();
193 EntityTransferModule etmB = new EntityTransferModule();
194 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
195
196 IConfigSource config = new IniConfigSource();
197 IConfig modulesConfig = config.AddConfig("Modules");
198 modulesConfig.Set("EntityTransferModule", etmA.Name);
199 modulesConfig.Set("SimulationServices", lscm.Name);
200
201 SceneHelpers sh = new SceneHelpers();
202 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
203 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000);
204
205 SceneHelpers.SetupSceneModules(sceneA, config, etmA);
206 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
207 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
208
209 Vector3 teleportPosition = new Vector3(10, 11, 12);
210 Vector3 teleportLookAt = new Vector3(20, 21, 22);
211
212 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
213 sp.AbsolutePosition = new Vector3(30, 31, 32);
214
215 List<TestClient> destinationTestClients = new List<TestClient>();
216 EntityTransferHelpers.SetupSendRegionTeleportTriggersDestinationClientCreateAndCompleteMovement(
217 (TestClient)sp.ControllingClient, destinationTestClients);
218
219 sceneA.RequestTeleportLocation(
220 sp.ControllingClient,
221 sceneB.RegionInfo.RegionHandle,
222 teleportPosition,
223 teleportLookAt,
224 (uint)TeleportFlags.ViaLocation);
225
226 Assert.That(sceneA.GetScenePresence(userId), Is.Null);
227
228 ScenePresence sceneBSp = sceneB.GetScenePresence(userId);
229 Assert.That(sceneBSp, Is.Not.Null);
230 Assert.That(sceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName));
231 Assert.That(sceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition));
232
233 Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0));
234 Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(0));
235 Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1));
236 Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0));
237
238 // TODO: Add assertions to check correct circuit details in both scenes.
239
240 // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
241 // position instead).
242// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
243 }
244
179 /// <summary> 245 /// <summary>
180 /// Test teleport procedures when the target simulator returns false when queried about access. 246 /// Test teleport procedures when the target simulator returns false when queried about access.
181 /// </summary> 247 /// </summary>
@@ -224,7 +290,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
224 Vector3 teleportPosition = new Vector3(10, 11, 12); 290 Vector3 teleportPosition = new Vector3(10, 11, 12);
225 Vector3 teleportLookAt = new Vector3(20, 21, 22); 291 Vector3 teleportLookAt = new Vector3(20, 21, 22);
226 292
227 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); 293 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
228 sp.AbsolutePosition = preTeleportPosition; 294 sp.AbsolutePosition = preTeleportPosition;
229 295
230 // Make sceneB return false on query access 296 // Make sceneB return false on query access
@@ -300,7 +366,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
300 Vector3 teleportPosition = new Vector3(10, 11, 12); 366 Vector3 teleportPosition = new Vector3(10, 11, 12);
301 Vector3 teleportLookAt = new Vector3(20, 21, 22); 367 Vector3 teleportLookAt = new Vector3(20, 21, 22);
302 368
303 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); 369 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
304 sp.AbsolutePosition = preTeleportPosition; 370 sp.AbsolutePosition = preTeleportPosition;
305 371
306 // Make sceneB refuse CreateAgent 372 // Make sceneB refuse CreateAgent
@@ -389,7 +455,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
389 Vector3 teleportPosition = new Vector3(10, 11, 12); 455 Vector3 teleportPosition = new Vector3(10, 11, 12);
390 Vector3 teleportLookAt = new Vector3(20, 21, 22); 456 Vector3 teleportLookAt = new Vector3(20, 21, 22);
391 457
392 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId, sh.SceneManager); 458 ScenePresence sp = SceneHelpers.AddScenePresence(sceneA, userId);
393 sp.AbsolutePosition = preTeleportPosition; 459 sp.AbsolutePosition = preTeleportPosition;
394 460
395 sceneA.RequestTeleportLocation( 461 sceneA.RequestTeleportLocation(
@@ -425,10 +491,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests
425 } 491 }
426 492
427 [Test] 493 [Test]
428 public void TestSameSimulatorNeighbouringRegions() 494 public void TestSameSimulatorNeighbouringRegionsV1()
429 { 495 {
430 TestHelpers.InMethod(); 496 TestHelpers.InMethod();
431 TestHelpers.EnableLogging(); 497// TestHelpers.EnableLogging();
432 498
433 UUID userId = TestHelpers.ParseTail(0x1); 499 UUID userId = TestHelpers.ParseTail(0x1);
434 500
@@ -454,15 +520,18 @@ namespace OpenSim.Region.Framework.Scenes.Tests
454 SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA); 520 SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA);
455 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB); 521 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
456 522
523 // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
524 lscm.ServiceVersion = "SIMULATION/0.1";
525
457 Vector3 teleportPosition = new Vector3(10, 11, 12); 526 Vector3 teleportPosition = new Vector3(10, 11, 12);
458 Vector3 teleportLookAt = new Vector3(20, 21, 22); 527 Vector3 teleportLookAt = new Vector3(20, 21, 22);
459 528
460 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId); 529 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
461 TestClient tc = new TestClient(acd, sceneA, sh.SceneManager); 530 TestClient tc = new TestClient(acd, sceneA);
462 List<TestClient> destinationTestClients = new List<TestClient>(); 531 List<TestClient> destinationTestClients = new List<TestClient>();
463 EntityTransferHelpers.SetUpInformClientOfNeighbour(tc, destinationTestClients); 532 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
464 533
465 ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd, sh.SceneManager); 534 ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
466 beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32); 535 beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32);
467 536
468 Assert.That(beforeSceneASp, Is.Not.Null); 537 Assert.That(beforeSceneASp, Is.Not.Null);
@@ -506,5 +575,89 @@ namespace OpenSim.Region.Framework.Scenes.Tests
506 575
507// TestHelpers.DisableLogging(); 576// TestHelpers.DisableLogging();
508 } 577 }
578
579 [Test]
580 public void TestSameSimulatorNeighbouringRegionsV2()
581 {
582 TestHelpers.InMethod();
583// TestHelpers.EnableLogging();
584
585 UUID userId = TestHelpers.ParseTail(0x1);
586
587 EntityTransferModule etmA = new EntityTransferModule();
588 EntityTransferModule etmB = new EntityTransferModule();
589 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
590
591 IConfigSource config = new IniConfigSource();
592 IConfig modulesConfig = config.AddConfig("Modules");
593 modulesConfig.Set("EntityTransferModule", etmA.Name);
594 modulesConfig.Set("SimulationServices", lscm.Name);
595
596 SceneHelpers sh = new SceneHelpers();
597 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
598 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000);
599
600 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
601 SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA);
602 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
603
604 Vector3 teleportPosition = new Vector3(10, 11, 12);
605 Vector3 teleportLookAt = new Vector3(20, 21, 22);
606
607 AgentCircuitData acd = SceneHelpers.GenerateAgentData(userId);
608 TestClient tc = new TestClient(acd, sceneA);
609 List<TestClient> destinationTestClients = new List<TestClient>();
610 EntityTransferHelpers.SetupInformClientOfNeighbourTriggersNeighbourClientCreate(tc, destinationTestClients);
611
612 ScenePresence beforeSceneASp = SceneHelpers.AddScenePresence(sceneA, tc, acd);
613 beforeSceneASp.AbsolutePosition = new Vector3(30, 31, 32);
614
615 Assert.That(beforeSceneASp, Is.Not.Null);
616 Assert.That(beforeSceneASp.IsChildAgent, Is.False);
617
618 ScenePresence beforeSceneBSp = sceneB.GetScenePresence(userId);
619 Assert.That(beforeSceneBSp, Is.Not.Null);
620 Assert.That(beforeSceneBSp.IsChildAgent, Is.True);
621
622 // Here, we need to make clientA's receipt of SendRegionTeleport trigger clientB's CompleteMovement(). This
623 // is to operate the teleport V2 mechanism where the EntityTransferModule will first request the client to
624 // CompleteMovement to the region and then call UpdateAgent to the destination region to confirm the receipt
625 // Both these operations will occur on different threads and will wait for each other.
626 // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1
627 // test protocol, where we are trying to avoid unpredictable async operations in regression tests.
628 tc.OnTestClientSendRegionTeleport
629 += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL)
630 => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null);
631
632 sceneA.RequestTeleportLocation(
633 beforeSceneASp.ControllingClient,
634 sceneB.RegionInfo.RegionHandle,
635 teleportPosition,
636 teleportLookAt,
637 (uint)TeleportFlags.ViaLocation);
638
639 ScenePresence afterSceneASp = sceneA.GetScenePresence(userId);
640 Assert.That(afterSceneASp, Is.Not.Null);
641 Assert.That(afterSceneASp.IsChildAgent, Is.True);
642
643 ScenePresence afterSceneBSp = sceneB.GetScenePresence(userId);
644 Assert.That(afterSceneBSp, Is.Not.Null);
645 Assert.That(afterSceneBSp.IsChildAgent, Is.False);
646 Assert.That(afterSceneBSp.Scene.RegionInfo.RegionName, Is.EqualTo(sceneB.RegionInfo.RegionName));
647 Assert.That(afterSceneBSp.AbsolutePosition, Is.EqualTo(teleportPosition));
648
649 Assert.That(sceneA.GetRootAgentCount(), Is.EqualTo(0));
650 Assert.That(sceneA.GetChildAgentCount(), Is.EqualTo(1));
651 Assert.That(sceneB.GetRootAgentCount(), Is.EqualTo(1));
652 Assert.That(sceneB.GetChildAgentCount(), Is.EqualTo(0));
653
654 // TODO: Add assertions to check correct circuit details in both scenes.
655
656 // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
657 // position instead).
658// Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
659
660// TestHelpers.DisableLogging();
661 }
509 } 662 }
510} 663}
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
index b09ae39..e60a025 100644
--- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
+++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
@@ -34,6 +34,7 @@ using System.Threading;
34using log4net; 34using log4net;
35using OpenMetaverse; 35using OpenMetaverse;
36using OpenMetaverse.Assets; 36using OpenMetaverse.Assets;
37using OpenMetaverse.StructuredData;
37using OpenSim.Framework; 38using OpenSim.Framework;
38using OpenSim.Region.Framework.Scenes.Serialization; 39using OpenSim.Region.Framework.Scenes.Serialization;
39using OpenSim.Services.Interfaces; 40using OpenSim.Services.Interfaces;
@@ -180,6 +181,14 @@ namespace OpenSim.Region.Framework.Scenes
180 if (!assetUuids.ContainsKey(tii.AssetID)) 181 if (!assetUuids.ContainsKey(tii.AssetID))
181 GatherAssetUuids(tii.AssetID, (AssetType)tii.Type, assetUuids); 182 GatherAssetUuids(tii.AssetID, (AssetType)tii.Type, assetUuids);
182 } 183 }
184
185 // FIXME: We need to make gathering modular but we cannot yet, since gatherers are not guaranteed
186 // to be called with scene objects that are in a scene (e.g. in the case of hg asset mapping and
187 // inventory transfer. There needs to be a way for a module to register a method without assuming a
188 // Scene.EventManager is present.
189// part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids);
190
191 GatherMaterialsUuids(part, assetUuids);
183 } 192 }
184 catch (Exception e) 193 catch (Exception e)
185 { 194 {
@@ -205,6 +214,73 @@ namespace OpenSim.Region.Framework.Scenes
205// } 214// }
206 215
207 /// <summary> 216 /// <summary>
217 /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps
218 /// </summary>
219 /// <param name="part"></param>
220 /// <param name="assetUuids"></param>
221 public void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, AssetType> assetUuids)
222 {
223 // scan thru the dynAttrs map of this part for any textures used as materials
224 OSD osdMaterials = null;
225
226 lock (part.DynAttrs)
227 {
228 if (part.DynAttrs.ContainsStore("OpenSim", "Materials"))
229 {
230 OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials");
231
232 if (materialsStore == null)
233 return;
234
235 materialsStore.TryGetValue("Materials", out osdMaterials);
236 }
237
238 if (osdMaterials != null)
239 {
240 //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd));
241
242 if (osdMaterials is OSDArray)
243 {
244 OSDArray matsArr = osdMaterials as OSDArray;
245 foreach (OSDMap matMap in matsArr)
246 {
247 try
248 {
249 if (matMap.ContainsKey("Material"))
250 {
251 OSDMap mat = matMap["Material"] as OSDMap;
252 if (mat.ContainsKey("NormMap"))
253 {
254 UUID normalMapId = mat["NormMap"].AsUUID();
255 if (normalMapId != UUID.Zero)
256 {
257 assetUuids[normalMapId] = AssetType.Texture;
258 //m_log.Info("[UUID Gatherer]: found normal map ID: " + normalMapId.ToString());
259 }
260 }
261 if (mat.ContainsKey("SpecMap"))
262 {
263 UUID specularMapId = mat["SpecMap"].AsUUID();
264 if (specularMapId != UUID.Zero)
265 {
266 assetUuids[specularMapId] = AssetType.Texture;
267 //m_log.Info("[UUID Gatherer]: found specular map ID: " + specularMapId.ToString());
268 }
269 }
270 }
271
272 }
273 catch (Exception e)
274 {
275 m_log.Warn("[UUID Gatherer]: exception getting materials: " + e.Message);
276 }
277 }
278 }
279 }
280 }
281 }
282
283 /// <summary>
208 /// Get an asset synchronously, potentially using an asynchronous callback. If the 284 /// Get an asset synchronously, potentially using an asynchronous callback. If the
209 /// asynchronous callback is used, we will wait for it to complete. 285 /// asynchronous callback is used, we will wait for it to complete.
210 /// </summary> 286 /// </summary>
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index dd72cfb..a96c8b4 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -660,6 +660,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
660 public event BakeTerrain OnBakeTerrain; 660 public event BakeTerrain OnBakeTerrain;
661 public event EstateChangeInfo OnEstateChangeInfo; 661 public event EstateChangeInfo OnEstateChangeInfo;
662 public event EstateManageTelehub OnEstateManageTelehub; 662 public event EstateManageTelehub OnEstateManageTelehub;
663 public event CachedTextureRequest OnCachedTextureRequest;
663 public event SetAppearance OnSetAppearance; 664 public event SetAppearance OnSetAppearance;
664 public event AvatarNowWearing OnAvatarNowWearing; 665 public event AvatarNowWearing OnAvatarNowWearing;
665 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv; 666 public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
@@ -687,6 +688,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
687 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 688 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
688 public event UpdateAgent OnPreAgentUpdate; 689 public event UpdateAgent OnPreAgentUpdate;
689 public event UpdateAgent OnAgentUpdate; 690 public event UpdateAgent OnAgentUpdate;
691 public event UpdateAgent OnAgentCameraUpdate;
690 public event AgentRequestSit OnAgentRequestSit; 692 public event AgentRequestSit OnAgentRequestSit;
691 public event AgentSit OnAgentSit; 693 public event AgentSit OnAgentSit;
692 public event AvatarPickerRequest OnAvatarPickerRequest; 694 public event AvatarPickerRequest OnAvatarPickerRequest;
@@ -943,13 +945,18 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
943 { 945 {
944 946
945 } 947 }
948
949 public void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures)
950 {
946 951
952 }
953
947 public void SendStartPingCheck(byte seq) 954 public void SendStartPingCheck(byte seq)
948 { 955 {
949 956
950 } 957 }
951 958
952 public void SendKillObject(ulong regionHandle, List<uint> localID) 959 public void SendKillObject(List<uint> localID)
953 { 960 {
954 961
955 } 962 }
@@ -1681,7 +1688,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
1681 { 1688 {
1682 } 1689 }
1683 1690
1684 public void StopFlying(ISceneEntity presence) 1691 public void SendAgentTerseUpdate(ISceneEntity presence)
1685 { 1692 {
1686 } 1693 }
1687 1694
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index 992f38e..1eb0a6b 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq;
30using System.Reflection; 31using System.Reflection;
31using System.Text; 32using System.Text;
32using log4net; 33using log4net;
@@ -51,7 +52,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
51 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")] 52 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")]
52 public class LindenUDPInfoModule : ISharedRegionModule 53 public class LindenUDPInfoModule : ISharedRegionModule
53 { 54 {
54// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 56
56 protected Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); 57 protected Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
57 58
@@ -130,6 +131,15 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
130 "Go on/off emergency monitoring mode", 131 "Go on/off emergency monitoring mode",
131 "Go on/off emergency monitoring mode", 132 "Go on/off emergency monitoring mode",
132 HandleEmergencyMonitoring); 133 HandleEmergencyMonitoring);
134
135 scene.AddCommand(
136 "Comms", this, "show client stats",
137 "show client stats [first_name last_name]",
138 "Show client request stats",
139 "Without the 'first_name last_name' option, all clients are shown."
140 + " With the 'first_name last_name' option only a specific client is shown.",
141 (mod, cmd) => MainConsole.Instance.Output(HandleClientStatsReport(cmd)));
142
133 } 143 }
134 144
135 public void RemoveRegion(Scene scene) 145 public void RemoveRegion(Scene scene)
@@ -587,6 +597,115 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
587 (throttleRates.Asset * 8) / 1000); 597 (throttleRates.Asset * 8) / 1000);
588 598
589 return report.ToString(); 599 return report.ToString();
590 } 600 }
601
602 /// <summary>
603 /// Show client stats data
604 /// </summary>
605 /// <param name="showParams"></param>
606 /// <returns></returns>
607 protected string HandleClientStatsReport(string[] showParams)
608 {
609 // NOTE: This writes to m_log on purpose. We want to store this information
610 // in case we need to analyze it later.
611 //
612 if (showParams.Length <= 4)
613 {
614 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", "Region", "Name", "Root", "Time", "Reqs/min", "AgentUpdates");
615 foreach (Scene scene in m_scenes.Values)
616 {
617 scene.ForEachClient(
618 delegate(IClientAPI client)
619 {
620 if (client is LLClientView)
621 {
622 LLClientView llClient = client as LLClientView;
623 ClientInfo cinfo = llClient.UDPClient.GetClientInfo();
624 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum();
625 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1);
626
627 string childAgentStatus;
628
629 if (llClient.SceneAgent != null)
630 childAgentStatus = llClient.SceneAgent.IsChildAgent ? "N" : "Y";
631 else
632 childAgentStatus = "Off!";
633
634 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}",
635 scene.RegionInfo.RegionName, llClient.Name,
636 childAgentStatus,
637 (DateTime.Now - cinfo.StartedTime).Minutes,
638 avg_reqs,
639 string.Format(
640 "{0} ({1:0.00}%)",
641 llClient.TotalAgentUpdates,
642 (float)cinfo.SyncRequests["AgentUpdate"] / llClient.TotalAgentUpdates * 100));
643 }
644 });
645 }
646 return string.Empty;
647 }
648
649 string fname = "", lname = "";
650
651 if (showParams.Length > 3)
652 fname = showParams[3];
653 if (showParams.Length > 4)
654 lname = showParams[4];
655
656 foreach (Scene scene in m_scenes.Values)
657 {
658 scene.ForEachClient(
659 delegate(IClientAPI client)
660 {
661 if (client is LLClientView)
662 {
663 LLClientView llClient = client as LLClientView;
664
665 if (llClient.Name == fname + " " + lname)
666 {
667
668 ClientInfo cinfo = llClient.GetClientInfo();
669 AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(llClient.CircuitCode);
670 if (aCircuit == null) // create a dummy one
671 aCircuit = new AgentCircuitData();
672
673 if (!llClient.SceneAgent.IsChildAgent)
674 m_log.InfoFormat("[INFO]: {0} # {1} # {2}", llClient.Name, aCircuit.Viewer, aCircuit.Id0);
675
676 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum();
677 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1);
678
679 m_log.InfoFormat("[INFO]:");
680 m_log.InfoFormat("[INFO]: {0} # {1} # Time: {2}min # Avg Reqs/min: {3}", scene.RegionInfo.RegionName,
681 (llClient.SceneAgent.IsChildAgent ? "Child" : "Root"), (DateTime.Now - cinfo.StartedTime).Minutes, avg_reqs);
682
683 Dictionary<string, int> sortedDict = (from entry in cinfo.AsyncRequests orderby entry.Value descending select entry)
684 .ToDictionary(pair => pair.Key, pair => pair.Value);
685 PrintRequests("TOP ASYNC", sortedDict, cinfo.AsyncRequests.Values.Sum());
686
687 sortedDict = (from entry in cinfo.SyncRequests orderby entry.Value descending select entry)
688 .ToDictionary(pair => pair.Key, pair => pair.Value);
689 PrintRequests("TOP SYNC", sortedDict, cinfo.SyncRequests.Values.Sum());
690
691 sortedDict = (from entry in cinfo.GenericRequests orderby entry.Value descending select entry)
692 .ToDictionary(pair => pair.Key, pair => pair.Value);
693 PrintRequests("TOP GENERIC", sortedDict, cinfo.GenericRequests.Values.Sum());
694 }
695 }
696 });
697 }
698 return string.Empty;
699 }
700
701 private void PrintRequests(string type, Dictionary<string, int> sortedDict, int sum)
702 {
703 m_log.InfoFormat("[INFO]:");
704 m_log.InfoFormat("[INFO]: {0,25}", type);
705 foreach (KeyValuePair<string, int> kvp in sortedDict.Take(12))
706 m_log.InfoFormat("[INFO]: {0,25} {1,-6}", kvp.Key, kvp.Value);
707 m_log.InfoFormat("[INFO]: {0,25}", "...");
708 m_log.InfoFormat("[INFO]: {0,25} {1,-6}", "Total", sum);
709 }
591 } 710 }
592} \ No newline at end of file 711} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs
index 018357a..c48e585 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs
@@ -375,11 +375,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
375 scene.GetRootAgentCount(), scene.RegionInfo.RegionName, 375 scene.GetRootAgentCount(), scene.RegionInfo.RegionName,
376 scene.RegionInfo.RegionID, 376 scene.RegionInfo.RegionID,
377 DateTime.UtcNow.ToString("s"))); 377 DateTime.UtcNow.ToString("s")));
378
378 scene.ForEachRootScenePresence(delegate(ScenePresence sp) 379 scene.ForEachRootScenePresence(delegate(ScenePresence sp)
379 { 380 {
380 list.Append(String.Format(" <avatar name=\"{0}\" uuid=\"{1}\" />\n", sp.Name, sp.UUID)); 381 list.Append(String.Format(" <avatar name=\"{0}\" uuid=\"{1}\" />\n", sp.Name, sp.UUID));
381 list.Append("</avatars>");
382 }); 382 });
383
384 list.Append("</avatars>");
383 string payload = list.ToString(); 385 string payload = list.ToString();
384 386
385 // post via REST to broker 387 // post via REST to broker
diff --git a/OpenSim/Region/OptionalModules/Avatar/SitStand/SitStandCommandsModule.cs b/OpenSim/Region/OptionalModules/Avatar/SitStand/SitStandCommandsModule.cs
new file mode 100644
index 0000000..5a6b284
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Avatar/SitStand/SitStandCommandsModule.cs
@@ -0,0 +1,220 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Reflection;
32using System.Text;
33using System.Text.RegularExpressions;
34using log4net;
35using Mono.Addins;
36using NDesk.Options;
37using Nini.Config;
38using OpenMetaverse;
39using OpenSim.Framework;
40using OpenSim.Framework.Console;
41using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Region.Framework.Scenes;
43
44namespace OpenSim.Region.OptionalModules.Avatar.SitStand
45{
46 /// <summary>
47 /// A module that just holds commands for changing avatar sitting and standing states.
48 /// </summary>
49 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AnimationsCommandModule")]
50 public class SitStandCommandModule : INonSharedRegionModule
51 {
52// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53
54 private Scene m_scene;
55
56 public string Name { get { return "SitStand Command Module"; } }
57
58 public Type ReplaceableInterface { get { return null; } }
59
60 public void Initialise(IConfigSource source)
61 {
62// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: INITIALIZED MODULE");
63 }
64
65 public void PostInitialise()
66 {
67// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: POST INITIALIZED MODULE");
68 }
69
70 public void Close()
71 {
72// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: CLOSED MODULE");
73 }
74
75 public void AddRegion(Scene scene)
76 {
77// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
78 }
79
80 public void RemoveRegion(Scene scene)
81 {
82// m_log.DebugFormat("[ATTACHMENTS COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
83 }
84
85 public void RegionLoaded(Scene scene)
86 {
87// m_log.DebugFormat("[ANIMATIONS COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
88
89 m_scene = scene;
90
91 scene.AddCommand(
92 "Users", this, "sit user name",
93 "sit user name [--regex] <first-name> <last-name>",
94 "Sit the named user on an unoccupied object with a sit target.",
95 "If there are no such objects then nothing happens.\n"
96 + "If --regex is specified then the names are treated as regular expressions.",
97 HandleSitUserNameCommand);
98
99 scene.AddCommand(
100 "Users", this, "stand user name",
101 "stand user name [--regex] <first-name> <last-name>",
102 "Stand the named user.",
103 "If --regex is specified then the names are treated as regular expressions.",
104 HandleStandUserNameCommand);
105 }
106
107 private void HandleSitUserNameCommand(string module, string[] cmd)
108 {
109 if (MainConsole.Instance.ConsoleScene != m_scene && MainConsole.Instance.ConsoleScene != null)
110 return;
111
112 if (cmd.Length < 5)
113 {
114 MainConsole.Instance.Output("Usage: sit user name [--regex] <first-name> <last-name>");
115 return;
116 }
117
118 List<ScenePresence> scenePresences = GetScenePresences(cmd);
119
120 foreach (ScenePresence sp in scenePresences)
121 {
122 if (sp.SitGround || sp.IsSatOnObject)
123 continue;
124
125 SceneObjectPart sitPart = null;
126 List<SceneObjectGroup> sceneObjects = m_scene.GetSceneObjectGroups();
127
128 foreach (SceneObjectGroup sceneObject in sceneObjects)
129 {
130 if (sceneObject.IsAttachment)
131 continue;
132
133 foreach (SceneObjectPart part in sceneObject.Parts)
134 {
135 if (part.IsSitTargetSet && part.SitTargetAvatar == UUID.Zero)
136 {
137 sitPart = part;
138 break;
139 }
140 }
141 }
142
143 if (sitPart != null)
144 {
145 MainConsole.Instance.OutputFormat(
146 "Sitting {0} on {1} {2} in {3}",
147 sp.Name, sitPart.ParentGroup.Name, sitPart.ParentGroup.UUID, m_scene.Name);
148
149 sp.HandleAgentRequestSit(sp.ControllingClient, sp.UUID, sitPart.UUID, Vector3.Zero);
150 sp.HandleAgentSit(sp.ControllingClient, sp.UUID);
151 }
152 else
153 {
154 MainConsole.Instance.OutputFormat(
155 "Could not find any unoccupied set seat on which to sit {0} in {1}. Aborting",
156 sp.Name, m_scene.Name);
157
158 break;
159 }
160 }
161 }
162
163 private void HandleStandUserNameCommand(string module, string[] cmd)
164 {
165 if (MainConsole.Instance.ConsoleScene != m_scene && MainConsole.Instance.ConsoleScene != null)
166 return;
167
168 if (cmd.Length < 5)
169 {
170 MainConsole.Instance.Output("Usage: stand user name [--regex] <first-name> <last-name>");
171 return;
172 }
173
174 List<ScenePresence> scenePresences = GetScenePresences(cmd);
175
176 foreach (ScenePresence sp in scenePresences)
177 {
178 if (sp.SitGround || sp.IsSatOnObject)
179 {
180 MainConsole.Instance.OutputFormat("Standing {0} in {1}", sp.Name, m_scene.Name);
181 sp.StandUp();
182 }
183 }
184 }
185
186 private List<ScenePresence> GetScenePresences(string[] cmdParams)
187 {
188 bool useRegex = false;
189 OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null );
190
191 List<string> mainParams = options.Parse(cmdParams);
192
193 string firstName = mainParams[3];
194 string lastName = mainParams[4];
195
196 List<ScenePresence> scenePresencesMatched = new List<ScenePresence>();
197
198 if (useRegex)
199 {
200 Regex nameRegex = new Regex(string.Format("{0} {1}", firstName, lastName));
201 List<ScenePresence> scenePresences = m_scene.GetScenePresences();
202
203 foreach (ScenePresence sp in scenePresences)
204 {
205 if (!sp.IsChildAgent && nameRegex.IsMatch(sp.Name))
206 scenePresencesMatched.Add(sp);
207 }
208 }
209 else
210 {
211 ScenePresence sp = m_scene.GetScenePresence(firstName, lastName);
212
213 if (sp != null && !sp.IsChildAgent)
214 scenePresencesMatched.Add(sp);
215 }
216
217 return scenePresencesMatched;
218 }
219 }
220} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index 0cec959..2b33084 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -326,15 +326,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
326 "ParcelVoiceInfoRequest", 326 "ParcelVoiceInfoRequest",
327 agentID.ToString())); 327 agentID.ToString()));
328 328
329 caps.RegisterHandler( 329 //caps.RegisterHandler(
330 "ChatSessionRequest", 330 // "ChatSessionRequest",
331 new RestStreamHandler( 331 // new RestStreamHandler(
332 "POST", 332 // "POST",
333 capsBase + m_chatSessionRequestPath, 333 // capsBase + m_chatSessionRequestPath,
334 (request, path, param, httpRequest, httpResponse) 334 // (request, path, param, httpRequest, httpResponse)
335 => ChatSessionRequest(scene, request, path, param, agentID, caps), 335 // => ChatSessionRequest(scene, request, path, param, agentID, caps),
336 "ChatSessionRequest", 336 // "ChatSessionRequest",
337 agentID.ToString())); 337 // agentID.ToString()));
338 } 338 }
339 339
340 /// <summary> 340 /// <summary>
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
index e756c70..349c0d0 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs
@@ -117,6 +117,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
117 117
118 private IConfig m_config; 118 private IConfig m_config;
119 119
120 private object m_Lock;
121
120 public void Initialise(IConfigSource config) 122 public void Initialise(IConfigSource config)
121 { 123 {
122 124
@@ -128,6 +130,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
128 if (!m_config.GetBoolean("enabled", false)) 130 if (!m_config.GetBoolean("enabled", false))
129 return; 131 return;
130 132
133 m_Lock = new object();
134
131 try 135 try
132 { 136 {
133 // retrieve configuration variables 137 // retrieve configuration variables
@@ -429,15 +433,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
429 "ParcelVoiceInfoRequest", 433 "ParcelVoiceInfoRequest",
430 agentID.ToString())); 434 agentID.ToString()));
431 435
432 caps.RegisterHandler( 436 //caps.RegisterHandler(
433 "ChatSessionRequest", 437 // "ChatSessionRequest",
434 new RestStreamHandler( 438 // new RestStreamHandler(
435 "POST", 439 // "POST",
436 capsBase + m_chatSessionRequestPath, 440 // capsBase + m_chatSessionRequestPath,
437 (request, path, param, httpRequest, httpResponse) 441 // (request, path, param, httpRequest, httpResponse)
438 => ChatSessionRequest(scene, request, path, param, agentID, caps), 442 // => ChatSessionRequest(scene, request, path, param, agentID, caps),
439 "ChatSessionRequest", 443 // "ChatSessionRequest",
440 agentID.ToString())); 444 // agentID.ToString()));
441 } 445 }
442 446
443 /// <summary> 447 /// <summary>
@@ -837,7 +841,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
837 requrl = String.Format("{0}&chan_roll_off={1}", requrl, m_vivoxChannelRollOff); 841 requrl = String.Format("{0}&chan_roll_off={1}", requrl, m_vivoxChannelRollOff);
838 requrl = String.Format("{0}&chan_dist_model={1}", requrl, m_vivoxChannelDistanceModel); 842 requrl = String.Format("{0}&chan_dist_model={1}", requrl, m_vivoxChannelDistanceModel);
839 requrl = String.Format("{0}&chan_max_range={1}", requrl, m_vivoxChannelMaximumRange); 843 requrl = String.Format("{0}&chan_max_range={1}", requrl, m_vivoxChannelMaximumRange);
840 requrl = String.Format("{0}&chan_ckamping_distance={1}", requrl, m_vivoxChannelClampingDistance); 844 requrl = String.Format("{0}&chan_clamping_distance={1}", requrl, m_vivoxChannelClampingDistance);
841 845
842 XmlElement resp = VivoxCall(requrl, true); 846 XmlElement resp = VivoxCall(requrl, true);
843 if (XmlFind(resp, "response.level0.body.chan_uri", out channelUri)) 847 if (XmlFind(resp, "response.level0.body.chan_uri", out channelUri))
@@ -1118,25 +1122,32 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
1118 1122
1119 doc = new XmlDocument(); 1123 doc = new XmlDocument();
1120 1124
1121 try 1125 // Let's serialize all calls to Vivox. Most of these are driven by
1126 // the clients (CAPs), when the user arrives at the region. We don't
1127 // want to issue many simultaneous http requests to Vivox, because mono
1128 // doesn't like that
1129 lock (m_Lock)
1122 { 1130 {
1123 // Otherwise prepare the request 1131 try
1124// m_log.DebugFormat("[VivoxVoice] Sending request <{0}>", requrl); 1132 {
1133 // Otherwise prepare the request
1134 //m_log.DebugFormat("[VivoxVoice] Sending request <{0}>", requrl);
1125 1135
1126 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requrl); 1136 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requrl);
1127 1137
1128 // We are sending just parameters, no content 1138 // We are sending just parameters, no content
1129 req.ContentLength = 0; 1139 req.ContentLength = 0;
1130 1140
1131 // Send request and retrieve the response 1141 // Send request and retrieve the response
1132 using (HttpWebResponse rsp = (HttpWebResponse)req.GetResponse()) 1142 using (HttpWebResponse rsp = (HttpWebResponse)req.GetResponse())
1133 using (Stream s = rsp.GetResponseStream()) 1143 using (Stream s = rsp.GetResponseStream())
1134 using (XmlTextReader rdr = new XmlTextReader(s)) 1144 using (XmlTextReader rdr = new XmlTextReader(s))
1135 doc.Load(rdr); 1145 doc.Load(rdr);
1136 } 1146 }
1137 catch (Exception e) 1147 catch (Exception e)
1138 { 1148 {
1139 m_log.ErrorFormat("[VivoxVoice] Error in admin call : {0}", e.Message); 1149 m_log.ErrorFormat("[VivoxVoice] Error in admin call : {0}", e.Message);
1150 }
1140 } 1151 }
1141 1152
1142 // If we're debugging server responses, dump the whole 1153 // If we're debugging server responses, dump the whole
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index d0a5989..8a734e1 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -250,7 +250,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
250 250
251 client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest; 251 client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest;
252 client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest; 252 client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest;
253 client.OnDirFindQuery += OnDirFindQuery;
254 client.OnRequestAvatarProperties += OnRequestAvatarProperties; 253 client.OnRequestAvatarProperties += OnRequestAvatarProperties;
255 254
256 // Used for Notices and Group Invites/Accept/Reject 255 // Used for Notices and Group Invites/Accept/Reject
@@ -303,21 +302,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
303 } 302 }
304 */ 303 */
305 304
306 void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart)
307 {
308 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
309 {
310 if (m_debugEnabled)
311 m_log.DebugFormat(
312 "[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})",
313 System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
314
315 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
316 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetRequestingAgentID(remoteClient), queryText).ToArray());
317 }
318
319 }
320
321 private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID) 305 private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID)
322 { 306 {
323 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 307 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
@@ -1178,6 +1162,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1178 } 1162 }
1179 } 1163 }
1180 1164
1165 public List<DirGroupsReplyData> FindGroups(IClientAPI remoteClient, string query)
1166 {
1167 return m_groupData.FindGroups(GetRequestingAgentID(remoteClient), query);
1168 }
1169
1170
1181 #endregion 1171 #endregion
1182 1172
1183 #region Client/Update Tools 1173 #region Client/Update Tools
@@ -1222,7 +1212,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1222 AgentDataMap.Add("AgentID", OSD.FromUUID(dataForAgentID)); 1212 AgentDataMap.Add("AgentID", OSD.FromUUID(dataForAgentID));
1223 AgentData.Add(AgentDataMap); 1213 AgentData.Add(AgentDataMap);
1224 1214
1225
1226 OSDArray GroupData = new OSDArray(data.Length); 1215 OSDArray GroupData = new OSDArray(data.Length);
1227 OSDArray NewGroupData = new OSDArray(data.Length); 1216 OSDArray NewGroupData = new OSDArray(data.Length);
1228 1217
diff --git a/OpenSim/Region/OptionalModules/Framework/Monitoring/ServerStats.cs b/OpenSim/Region/OptionalModules/Framework/Monitoring/ServerStats.cs
deleted file mode 100644
index 6e74ce0..0000000
--- a/OpenSim/Region/OptionalModules/Framework/Monitoring/ServerStats.cs
+++ /dev/null
@@ -1,339 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Diagnostics;
31using System.Linq;
32using System.Net.NetworkInformation;
33using System.Text;
34using System.Threading;
35
36using log4net;
37using Mono.Addins;
38using Nini.Config;
39
40using OpenSim.Framework;
41using OpenSim.Framework.Console;
42using OpenSim.Framework.Monitoring;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes;
45
46using OpenMetaverse.StructuredData;
47
48namespace OpenSim.Region.OptionalModules.Framework.Monitoring
49{
50[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ServerStatistics")]
51public class ServerStats : ISharedRegionModule
52{
53 private readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
54 private readonly string LogHeader = "[SERVER STATS]";
55
56 public bool Enabled = false;
57 private static Dictionary<string, Stat> RegisteredStats = new Dictionary<string, Stat>();
58
59 public readonly string CategoryServer = "server";
60
61 public readonly string ContainerProcessor = "processor";
62 public readonly string ContainerMemory = "memory";
63 public readonly string ContainerNetwork = "network";
64 public readonly string ContainerProcess = "process";
65
66 public string NetworkInterfaceTypes = "Ethernet";
67
68 readonly int performanceCounterSampleInterval = 500;
69 int lastperformanceCounterSampleTime = 0;
70
71 private class PerfCounterControl
72 {
73 public PerformanceCounter perfCounter;
74 public int lastFetch;
75 public string name;
76 public PerfCounterControl(PerformanceCounter pPc)
77 : this(pPc, String.Empty)
78 {
79 }
80 public PerfCounterControl(PerformanceCounter pPc, string pName)
81 {
82 perfCounter = pPc;
83 lastFetch = 0;
84 name = pName;
85 }
86 }
87
88 PerfCounterControl processorPercentPerfCounter = null;
89
90 #region ISharedRegionModule
91 // IRegionModuleBase.Name
92 public string Name { get { return "Server Stats"; } }
93 // IRegionModuleBase.ReplaceableInterface
94 public Type ReplaceableInterface { get { return null; } }
95 // IRegionModuleBase.Initialize
96 public void Initialise(IConfigSource source)
97 {
98 IConfig cfg = source.Configs["Monitoring"];
99
100 if (cfg != null)
101 Enabled = cfg.GetBoolean("ServerStatsEnabled", true);
102
103 if (Enabled)
104 {
105 NetworkInterfaceTypes = cfg.GetString("NetworkInterfaceTypes", "Ethernet");
106 }
107 }
108 // IRegionModuleBase.Close
109 public void Close()
110 {
111 if (RegisteredStats.Count > 0)
112 {
113 foreach (Stat stat in RegisteredStats.Values)
114 {
115 StatsManager.DeregisterStat(stat);
116 stat.Dispose();
117 }
118 RegisteredStats.Clear();
119 }
120 }
121 // IRegionModuleBase.AddRegion
122 public void AddRegion(Scene scene)
123 {
124 }
125 // IRegionModuleBase.RemoveRegion
126 public void RemoveRegion(Scene scene)
127 {
128 }
129 // IRegionModuleBase.RegionLoaded
130 public void RegionLoaded(Scene scene)
131 {
132 }
133 // ISharedRegionModule.PostInitialize
134 public void PostInitialise()
135 {
136 if (RegisteredStats.Count == 0)
137 {
138 RegisterServerStats();
139 }
140 }
141 #endregion ISharedRegionModule
142
143 private void MakeStat(string pName, string pDesc, string pUnit, string pContainer, Action<Stat> act)
144 {
145 string desc = pDesc;
146 if (desc == null)
147 desc = pName;
148 Stat stat = new Stat(pName, pName, desc, pUnit, CategoryServer, pContainer, StatType.Pull, act, StatVerbosity.Info);
149 StatsManager.RegisterStat(stat);
150 RegisteredStats.Add(pName, stat);
151 }
152
153 public void RegisterServerStats()
154 {
155 lastperformanceCounterSampleTime = Util.EnvironmentTickCount();
156 PerformanceCounter tempPC;
157 Stat tempStat;
158 string tempName;
159
160 try
161 {
162 tempName = "CPUPercent";
163 tempPC = new PerformanceCounter("Processor", "% Processor Time", "_Total");
164 processorPercentPerfCounter = new PerfCounterControl(tempPC);
165 // A long time bug in mono is that CPU percent is reported as CPU percent idle. Windows reports CPU percent busy.
166 tempStat = new Stat(tempName, tempName, "", "percent", CategoryServer, ContainerProcessor,
167 StatType.Pull, (s) => { GetNextValue(s, processorPercentPerfCounter, Util.IsWindows() ? 1 : -1); },
168 StatVerbosity.Info);
169 StatsManager.RegisterStat(tempStat);
170 RegisteredStats.Add(tempName, tempStat);
171
172 MakeStat("TotalProcessorTime", null, "sec", ContainerProcessor,
173 (s) => { s.Value = Process.GetCurrentProcess().TotalProcessorTime.TotalSeconds; });
174
175 MakeStat("UserProcessorTime", null, "sec", ContainerProcessor,
176 (s) => { s.Value = Process.GetCurrentProcess().UserProcessorTime.TotalSeconds; });
177
178 MakeStat("PrivilegedProcessorTime", null, "sec", ContainerProcessor,
179 (s) => { s.Value = Process.GetCurrentProcess().PrivilegedProcessorTime.TotalSeconds; });
180
181 MakeStat("Threads", null, "threads", ContainerProcessor,
182 (s) => { s.Value = Process.GetCurrentProcess().Threads.Count; });
183 }
184 catch (Exception e)
185 {
186 m_log.ErrorFormat("{0} Exception creating 'Process': {1}", LogHeader, e);
187 }
188
189 try
190 {
191 List<string> okInterfaceTypes = new List<string>(NetworkInterfaceTypes.Split(','));
192
193 IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces();
194 foreach (NetworkInterface nic in nics)
195 {
196 if (nic.OperationalStatus != OperationalStatus.Up)
197 continue;
198
199 string nicInterfaceType = nic.NetworkInterfaceType.ToString();
200 if (!okInterfaceTypes.Contains(nicInterfaceType))
201 {
202 m_log.DebugFormat("{0} Not including stats for network interface '{1}' of type '{2}'.",
203 LogHeader, nic.Name, nicInterfaceType);
204 m_log.DebugFormat("{0} To include, add to comma separated list in [Monitoring]NetworkInterfaceTypes={1}",
205 LogHeader, NetworkInterfaceTypes);
206 continue;
207 }
208
209 if (nic.Supports(NetworkInterfaceComponent.IPv4))
210 {
211 IPv4InterfaceStatistics nicStats = nic.GetIPv4Statistics();
212 if (nicStats != null)
213 {
214 MakeStat("BytesRcvd/" + nic.Name, nic.Name, "KB", ContainerNetwork,
215 (s) => { LookupNic(s, (ns) => { return ns.BytesReceived; }, 1024.0); });
216 MakeStat("BytesSent/" + nic.Name, nic.Name, "KB", ContainerNetwork,
217 (s) => { LookupNic(s, (ns) => { return ns.BytesSent; }, 1024.0); });
218 MakeStat("TotalBytes/" + nic.Name, nic.Name, "KB", ContainerNetwork,
219 (s) => { LookupNic(s, (ns) => { return ns.BytesSent + ns.BytesReceived; }, 1024.0); });
220 }
221 }
222 // TODO: add IPv6 (it may actually happen someday)
223 }
224 }
225 catch (Exception e)
226 {
227 m_log.ErrorFormat("{0} Exception creating 'Network Interface': {1}", LogHeader, e);
228 }
229
230 MakeStat("ProcessMemory", null, "MB", ContainerMemory,
231 (s) => { s.Value = Process.GetCurrentProcess().WorkingSet64 / 1024d / 1024d; });
232 MakeStat("ObjectMemory", null, "MB", ContainerMemory,
233 (s) => { s.Value = GC.GetTotalMemory(false) / 1024d / 1024d; });
234 MakeStat("LastMemoryChurn", null, "MB/sec", ContainerMemory,
235 (s) => { s.Value = Math.Round(MemoryWatchdog.LastMemoryChurn * 1000d / 1024d / 1024d, 3); });
236 MakeStat("AverageMemoryChurn", null, "MB/sec", ContainerMemory,
237 (s) => { s.Value = Math.Round(MemoryWatchdog.AverageMemoryChurn * 1000d / 1024d / 1024d, 3); });
238 }
239
240 // Notes on performance counters:
241 // "How To Read Performance Counters": http://blogs.msdn.com/b/bclteam/archive/2006/06/02/618156.aspx
242 // "How to get the CPU Usage in C#": http://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c
243 // "Mono Performance Counters": http://www.mono-project.com/Mono_Performance_Counters
244 private delegate double PerfCounterNextValue();
245 private void GetNextValue(Stat stat, PerfCounterControl perfControl)
246 {
247 GetNextValue(stat, perfControl, 1.0);
248 }
249 private void GetNextValue(Stat stat, PerfCounterControl perfControl, double factor)
250 {
251 if (Util.EnvironmentTickCountSubtract(perfControl.lastFetch) > performanceCounterSampleInterval)
252 {
253 if (perfControl != null && perfControl.perfCounter != null)
254 {
255 try
256 {
257 // Kludge for factor to run double duty. If -1, subtract the value from one
258 if (factor == -1)
259 stat.Value = 1 - perfControl.perfCounter.NextValue();
260 else
261 stat.Value = perfControl.perfCounter.NextValue() / factor;
262 }
263 catch (Exception e)
264 {
265 m_log.ErrorFormat("{0} Exception on NextValue fetching {1}: {2}", LogHeader, stat.Name, e);
266 }
267 perfControl.lastFetch = Util.EnvironmentTickCount();
268 }
269 }
270 }
271
272 // Lookup the nic that goes with this stat and set the value by using a fetch action.
273 // Not sure about closure with delegates inside delegates.
274 private delegate double GetIPv4StatValue(IPv4InterfaceStatistics interfaceStat);
275 private void LookupNic(Stat stat, GetIPv4StatValue getter, double factor)
276 {
277 // Get the one nic that has the name of this stat
278 IEnumerable<NetworkInterface> nics = NetworkInterface.GetAllNetworkInterfaces().Where(
279 (network) => network.Name == stat.Description);
280 try
281 {
282 foreach (NetworkInterface nic in nics)
283 {
284 IPv4InterfaceStatistics intrStats = nic.GetIPv4Statistics();
285 if (intrStats != null)
286 {
287 double newVal = Math.Round(getter(intrStats) / factor, 3);
288 stat.Value = newVal;
289 }
290 break;
291 }
292 }
293 catch
294 {
295 // There are times interfaces go away so we just won't update the stat for this
296 m_log.ErrorFormat("{0} Exception fetching stat on interface '{1}'", LogHeader, stat.Description);
297 }
298 }
299}
300
301public class ServerStatsAggregator : Stat
302{
303 public ServerStatsAggregator(
304 string shortName,
305 string name,
306 string description,
307 string unitName,
308 string category,
309 string container
310 )
311 : base(
312 shortName,
313 name,
314 description,
315 unitName,
316 category,
317 container,
318 StatType.Push,
319 MeasuresOfInterest.None,
320 null,
321 StatVerbosity.Info)
322 {
323 }
324 public override string ToConsoleString()
325 {
326 StringBuilder sb = new StringBuilder();
327
328 return sb.ToString();
329 }
330
331 public override OSDMap ToOSDMap()
332 {
333 OSDMap ret = new OSDMap();
334
335 return ret;
336 }
337}
338
339}
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs
new file mode 100644
index 0000000..d8f5563
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs
@@ -0,0 +1,657 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Reflection;
32using System.Security.Cryptography; // for computing md5 hash
33using log4net;
34using Mono.Addins;
35using Nini.Config;
36
37using OpenMetaverse;
38using OpenMetaverse.StructuredData;
39
40using OpenSim.Framework;
41using OpenSim.Framework.Servers;
42using OpenSim.Framework.Servers.HttpServer;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes;
45
46using Ionic.Zlib;
47
48// You will need to uncomment these lines if you are adding a region module to some other assembly which does not already
49// specify its assembly. Otherwise, the region modules in the assembly will not be picked up when OpenSimulator scans
50// the available DLLs
51//[assembly: Addin("MaterialsDemoModule", "1.0")]
52//[assembly: AddinDependency("OpenSim", "0.5")]
53
54namespace OpenSim.Region.OptionalModules.MaterialsDemoModule
55{
56 /// <summary>
57 ///
58 // # # ## ##### # # # # # ####
59 // # # # # # # ## # # ## # # #
60 // # # # # # # # # # # # # # #
61 // # ## # ###### ##### # # # # # # # # ###
62 // ## ## # # # # # ## # # ## # #
63 // # # # # # # # # # # # ####
64 //
65 // THIS MODULE IS FOR EXPERIMENTAL USE ONLY AND MAY CAUSE REGION OR ASSET CORRUPTION!
66 //
67 ////////////// WARNING //////////////////////////////////////////////////////////////////
68 /// This is an *Experimental* module for developing support for materials-capable viewers
69 /// This module should NOT be used in a production environment! It may cause data corruption and
70 /// viewer crashes. It should be only used to evaluate implementations of materials.
71 ///
72 /// Materials are persisted via SceneObjectPart.dynattrs. This is a relatively new feature
73 /// of OpenSimulator and is not field proven at the time this module was written. Persistence
74 /// may fail or become corrupt and this could cause viewer crashes due to erroneous materials
75 /// data being sent to viewers. Materials descriptions might survive IAR, OAR, or other means
76 /// of archiving however the texture resources used by these materials probably will not as they
77 /// may not be adequately referenced to ensure proper archiving.
78 ///
79 ///
80 ///
81 /// To enable this module, add this string at the bottom of OpenSim.ini:
82 /// [MaterialsDemoModule]
83 ///
84 /// </summary>
85 ///
86
87 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MaterialsDemoModule")]
88 public class MaterialsDemoModule : INonSharedRegionModule
89 {
90 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
91
92 public string Name { get { return "MaterialsDemoModule"; } }
93
94 public Type ReplaceableInterface { get { return null; } }
95
96 private Scene m_scene = null;
97 private bool m_enabled = false;
98
99 public Dictionary<UUID, OSDMap> m_knownMaterials = new Dictionary<UUID, OSDMap>();
100
101 public void Initialise(IConfigSource source)
102 {
103 m_enabled = (source.Configs["MaterialsDemoModule"] != null);
104 if (!m_enabled)
105 return;
106
107 m_log.DebugFormat("[MaterialsDemoModule]: INITIALIZED MODULE");
108 }
109
110 public void Close()
111 {
112 if (!m_enabled)
113 return;
114
115 m_log.DebugFormat("[MaterialsDemoModule]: CLOSED MODULE");
116 }
117
118 public void AddRegion(Scene scene)
119 {
120 if (!m_enabled)
121 return;
122
123 m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName);
124
125 m_scene = scene;
126 m_scene.EventManager.OnRegisterCaps += OnRegisterCaps;
127 m_scene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene;
128// m_scene.EventManager.OnGatherUuids += GatherMaterialsUuids;
129 }
130
131 void EventManager_OnObjectAddedToScene(SceneObjectGroup obj)
132 {
133 foreach (var part in obj.Parts)
134 if (part != null)
135 GetStoredMaterialsForPart(part);
136 }
137
138 void OnRegisterCaps(OpenMetaverse.UUID agentID, OpenSim.Framework.Capabilities.Caps caps)
139 {
140 string capsBase = "/CAPS/" + caps.CapsObjectPath;
141
142 IRequestHandler renderMaterialsPostHandler
143 = new RestStreamHandler("POST", capsBase + "/", RenderMaterialsPostCap, "RenderMaterials", null);
144 caps.RegisterHandler("RenderMaterials", renderMaterialsPostHandler);
145
146 // OpenSimulator CAPs infrastructure seems to be somewhat hostile towards any CAP that requires both GET
147 // and POST handlers, (at least at the time this was originally written), so we first set up a POST
148 // handler normally and then add a GET handler via MainServer
149
150 IRequestHandler renderMaterialsGetHandler
151 = new RestStreamHandler("GET", capsBase + "/", RenderMaterialsGetCap, "RenderMaterials", null);
152 MainServer.Instance.AddStreamHandler(renderMaterialsGetHandler);
153
154 // materials viewer seems to use either POST or PUT, so assign POST handler for PUT as well
155 IRequestHandler renderMaterialsPutHandler
156 = new RestStreamHandler("PUT", capsBase + "/", RenderMaterialsPostCap, "RenderMaterials", null);
157 MainServer.Instance.AddStreamHandler(renderMaterialsPutHandler);
158 }
159
160 public void RemoveRegion(Scene scene)
161 {
162 if (!m_enabled)
163 return;
164
165 m_scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
166 m_scene.EventManager.OnObjectAddedToScene -= EventManager_OnObjectAddedToScene;
167// m_scene.EventManager.OnGatherUuids -= GatherMaterialsUuids;
168
169 m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
170 }
171
172 public void RegionLoaded(Scene scene)
173 {
174 }
175
176 OSDMap GetMaterial(UUID id)
177 {
178 OSDMap map = null;
179 lock (m_knownMaterials)
180 {
181 if (m_knownMaterials.ContainsKey(id))
182 {
183 map = new OSDMap();
184 map["ID"] = OSD.FromBinary(id.GetBytes());
185 map["Material"] = m_knownMaterials[id];
186 }
187 }
188 return map;
189 }
190
191 void GetStoredMaterialsForPart(SceneObjectPart part)
192 {
193 OSD OSMaterials = null;
194 OSDArray matsArr = null;
195
196 if (part.DynAttrs == null)
197 {
198 m_log.Warn("[MaterialsDemoModule]: NULL DYNATTRS :( ");
199 }
200
201 lock (part.DynAttrs)
202 {
203 if (part.DynAttrs.ContainsStore("OpenSim", "Materials"))
204 {
205 OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials");
206
207 if (materialsStore == null)
208 return;
209
210 materialsStore.TryGetValue("Materials", out OSMaterials);
211 }
212
213 if (OSMaterials != null && OSMaterials is OSDArray)
214 matsArr = OSMaterials as OSDArray;
215 else
216 return;
217 }
218
219 m_log.Info("[MaterialsDemoModule]: OSMaterials: " + OSDParser.SerializeJsonString(OSMaterials));
220
221 if (matsArr == null)
222 {
223 m_log.Info("[MaterialsDemoModule]: matsArr is null :( ");
224 return;
225 }
226
227 foreach (OSD elemOsd in matsArr)
228 {
229 if (elemOsd != null && elemOsd is OSDMap)
230 {
231 OSDMap matMap = elemOsd as OSDMap;
232 if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material"))
233 {
234 try
235 {
236 lock (m_knownMaterials)
237 m_knownMaterials[matMap["ID"].AsUUID()] = (OSDMap)matMap["Material"];
238 }
239 catch (Exception e)
240 {
241 m_log.Warn("[MaterialsDemoModule]: exception decoding persisted material: " + e.ToString());
242 }
243 }
244 }
245 }
246 }
247
248 void StoreMaterialsForPart(SceneObjectPart part)
249 {
250 try
251 {
252 if (part == null || part.Shape == null)
253 return;
254
255 Dictionary<UUID, OSDMap> mats = new Dictionary<UUID, OSDMap>();
256
257 Primitive.TextureEntry te = part.Shape.Textures;
258
259 if (te.DefaultTexture != null)
260 {
261 lock (m_knownMaterials)
262 {
263 if (m_knownMaterials.ContainsKey(te.DefaultTexture.MaterialID))
264 mats[te.DefaultTexture.MaterialID] = m_knownMaterials[te.DefaultTexture.MaterialID];
265 }
266 }
267
268 if (te.FaceTextures != null)
269 {
270 foreach (var face in te.FaceTextures)
271 {
272 if (face != null)
273 {
274 lock (m_knownMaterials)
275 {
276 if (m_knownMaterials.ContainsKey(face.MaterialID))
277 mats[face.MaterialID] = m_knownMaterials[face.MaterialID];
278 }
279 }
280 }
281 }
282 if (mats.Count == 0)
283 return;
284
285 OSDArray matsArr = new OSDArray();
286 foreach (KeyValuePair<UUID, OSDMap> kvp in mats)
287 {
288 OSDMap matOsd = new OSDMap();
289 matOsd["ID"] = OSD.FromUUID(kvp.Key);
290 matOsd["Material"] = kvp.Value;
291 matsArr.Add(matOsd);
292 }
293
294 OSDMap OSMaterials = new OSDMap();
295 OSMaterials["Materials"] = matsArr;
296
297 lock (part.DynAttrs)
298 part.DynAttrs.SetStore("OpenSim", "Materials", OSMaterials);
299 }
300 catch (Exception e)
301 {
302 m_log.Warn("[MaterialsDemoModule]: exception in StoreMaterialsForPart(): " + e.ToString());
303 }
304 }
305
306 public string RenderMaterialsPostCap(string request, string path,
307 string param, IOSHttpRequest httpRequest,
308 IOSHttpResponse httpResponse)
309 {
310 m_log.Debug("[MaterialsDemoModule]: POST cap handler");
311
312 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
313 OSDMap resp = new OSDMap();
314
315 OSDMap materialsFromViewer = null;
316
317 OSDArray respArr = new OSDArray();
318
319 if (req.ContainsKey("Zipped"))
320 {
321 OSD osd = null;
322
323 byte[] inBytes = req["Zipped"].AsBinary();
324
325 try
326 {
327 osd = ZDecompressBytesToOsd(inBytes);
328
329 if (osd != null)
330 {
331 if (osd is OSDArray) // assume array of MaterialIDs designating requested material entries
332 {
333 foreach (OSD elem in (OSDArray)osd)
334 {
335
336 try
337 {
338 UUID id = new UUID(elem.AsBinary(), 0);
339
340 lock (m_knownMaterials)
341 {
342 if (m_knownMaterials.ContainsKey(id))
343 {
344 m_log.Info("[MaterialsDemoModule]: request for known material ID: " + id.ToString());
345 OSDMap matMap = new OSDMap();
346 matMap["ID"] = OSD.FromBinary(id.GetBytes());
347
348 matMap["Material"] = m_knownMaterials[id];
349 respArr.Add(matMap);
350 }
351 else
352 m_log.Info("[MaterialsDemoModule]: request for UNKNOWN material ID: " + id.ToString());
353 }
354 }
355 catch (Exception e)
356 {
357 // report something here?
358 continue;
359 }
360 }
361 }
362 else if (osd is OSDMap) // reqest to assign a material
363 {
364 materialsFromViewer = osd as OSDMap;
365
366 if (materialsFromViewer.ContainsKey("FullMaterialsPerFace"))
367 {
368 OSD matsOsd = materialsFromViewer["FullMaterialsPerFace"];
369 if (matsOsd is OSDArray)
370 {
371 OSDArray matsArr = matsOsd as OSDArray;
372
373 try
374 {
375 foreach (OSDMap matsMap in matsArr)
376 {
377 m_log.Debug("[MaterialsDemoModule]: processing matsMap: " + OSDParser.SerializeJsonString(matsMap));
378
379 uint matLocalID = 0;
380 try { matLocalID = matsMap["ID"].AsUInteger(); }
381 catch (Exception e) { m_log.Warn("[MaterialsDemoModule]: cannot decode \"ID\" from matsMap: " + e.Message); }
382 m_log.Debug("[MaterialsDemoModule]: matLocalId: " + matLocalID.ToString());
383
384
385 OSDMap mat = null;
386 try { mat = matsMap["Material"] as OSDMap; }
387 catch (Exception e) { m_log.Warn("[MaterialsDemoModule]: cannot decode \"Material\" from matsMap: " + e.Message); }
388 m_log.Debug("[MaterialsDemoModule]: mat: " + OSDParser.SerializeJsonString(mat));
389
390 UUID id = HashOsd(mat);
391 lock (m_knownMaterials)
392 m_knownMaterials[id] = mat;
393
394
395 var sop = m_scene.GetSceneObjectPart(matLocalID);
396 if (sop == null)
397 m_log.Debug("[MaterialsDemoModule]: null SOP for localId: " + matLocalID.ToString());
398 else
399 {
400 var te = new Primitive.TextureEntry(sop.Shape.TextureEntry, 0, sop.Shape.TextureEntry.Length);
401
402 if (te == null)
403 {
404 m_log.Debug("[MaterialsDemoModule]: null TextureEntry for localId: " + matLocalID.ToString());
405 }
406 else
407 {
408 int face = -1;
409
410 if (matsMap.ContainsKey("Face"))
411 {
412 face = matsMap["Face"].AsInteger();
413 if (te.FaceTextures == null) // && face == 0)
414 {
415 if (te.DefaultTexture == null)
416 m_log.Debug("[MaterialsDemoModule]: te.DefaultTexture is null");
417 else
418 te.DefaultTexture.MaterialID = id;
419 }
420 else
421 {
422 if (te.FaceTextures.Length >= face - 1)
423 {
424 if (te.FaceTextures[face] == null)
425 te.DefaultTexture.MaterialID = id;
426 else
427 te.FaceTextures[face].MaterialID = id;
428 }
429 }
430 }
431 else
432 {
433 if (te.DefaultTexture != null)
434 te.DefaultTexture.MaterialID = id;
435 }
436
437 m_log.Debug("[MaterialsDemoModule]: setting material ID for face " + face.ToString() + " to " + id.ToString());
438
439 //we cant use sop.UpdateTextureEntry(te); because it filters so do it manually
440
441 if (sop.ParentGroup != null)
442 {
443 sop.Shape.TextureEntry = te.GetBytes();
444 sop.TriggerScriptChangedEvent(Changed.TEXTURE);
445 sop.UpdateFlag = UpdateRequired.FULL;
446 sop.ParentGroup.HasGroupChanged = true;
447
448 sop.ScheduleFullUpdate();
449
450 StoreMaterialsForPart(sop);
451 }
452 }
453 }
454 }
455 }
456 catch (Exception e)
457 {
458 m_log.Warn("[MaterialsDemoModule]: exception processing received material: " + e.Message);
459 }
460 }
461 }
462 }
463 }
464
465 }
466 catch (Exception e)
467 {
468 m_log.Warn("[MaterialsDemoModule]: exception decoding zipped CAP payload: " + e.Message);
469 //return "";
470 }
471 m_log.Debug("[MaterialsDemoModule]: knownMaterials.Count: " + m_knownMaterials.Count.ToString());
472 }
473
474
475 resp["Zipped"] = ZCompressOSD(respArr, false);
476 string response = OSDParser.SerializeLLSDXmlString(resp);
477
478 //m_log.Debug("[MaterialsDemoModule]: cap request: " + request);
479 m_log.Debug("[MaterialsDemoModule]: cap request (zipped portion): " + ZippedOsdBytesToString(req["Zipped"].AsBinary()));
480 m_log.Debug("[MaterialsDemoModule]: cap response: " + response);
481 return response;
482 }
483
484
485 public string RenderMaterialsGetCap(string request, string path,
486 string param, IOSHttpRequest httpRequest,
487 IOSHttpResponse httpResponse)
488 {
489 m_log.Debug("[MaterialsDemoModule]: GET cap handler");
490
491 OSDMap resp = new OSDMap();
492 int matsCount = 0;
493 OSDArray allOsd = new OSDArray();
494
495 lock (m_knownMaterials)
496 {
497 foreach (KeyValuePair<UUID, OSDMap> kvp in m_knownMaterials)
498 {
499 OSDMap matMap = new OSDMap();
500
501 matMap["ID"] = OSD.FromBinary(kvp.Key.GetBytes());
502 matMap["Material"] = kvp.Value;
503 allOsd.Add(matMap);
504 matsCount++;
505 }
506 }
507
508 resp["Zipped"] = ZCompressOSD(allOsd, false);
509 m_log.Debug("[MaterialsDemoModule]: matsCount: " + matsCount.ToString());
510
511 return OSDParser.SerializeLLSDXmlString(resp);
512 }
513
514 static string ZippedOsdBytesToString(byte[] bytes)
515 {
516 try
517 {
518 return OSDParser.SerializeJsonString(ZDecompressBytesToOsd(bytes));
519 }
520 catch (Exception e)
521 {
522 return "ZippedOsdBytesToString caught an exception: " + e.ToString();
523 }
524 }
525
526 /// <summary>
527 /// computes a UUID by hashing a OSD object
528 /// </summary>
529 /// <param name="osd"></param>
530 /// <returns></returns>
531 private static UUID HashOsd(OSD osd)
532 {
533 using (var md5 = MD5.Create())
534 using (MemoryStream ms = new MemoryStream(OSDParser.SerializeLLSDBinary(osd, false)))
535 return new UUID(md5.ComputeHash(ms), 0);
536 }
537
538 public static OSD ZCompressOSD(OSD inOsd, bool useHeader)
539 {
540 OSD osd = null;
541
542 using (MemoryStream msSinkCompressed = new MemoryStream())
543 {
544 using (Ionic.Zlib.ZlibStream zOut = new Ionic.Zlib.ZlibStream(msSinkCompressed,
545 Ionic.Zlib.CompressionMode.Compress, CompressionLevel.BestCompression, true))
546 {
547 CopyStream(new MemoryStream(OSDParser.SerializeLLSDBinary(inOsd, useHeader)), zOut);
548 zOut.Close();
549 }
550
551 msSinkCompressed.Seek(0L, SeekOrigin.Begin);
552 osd = OSD.FromBinary( msSinkCompressed.ToArray());
553 }
554
555 return osd;
556 }
557
558
559 public static OSD ZDecompressBytesToOsd(byte[] input)
560 {
561 OSD osd = null;
562
563 using (MemoryStream msSinkUnCompressed = new MemoryStream())
564 {
565 using (Ionic.Zlib.ZlibStream zOut = new Ionic.Zlib.ZlibStream(msSinkUnCompressed, CompressionMode.Decompress, true))
566 {
567 CopyStream(new MemoryStream(input), zOut);
568 zOut.Close();
569 }
570 msSinkUnCompressed.Seek(0L, SeekOrigin.Begin);
571 osd = OSDParser.DeserializeLLSDBinary(msSinkUnCompressed.ToArray());
572 }
573
574 return osd;
575 }
576
577 static void CopyStream(System.IO.Stream input, System.IO.Stream output)
578 {
579 byte[] buffer = new byte[2048];
580 int len;
581 while ((len = input.Read(buffer, 0, 2048)) > 0)
582 {
583 output.Write(buffer, 0, len);
584 }
585
586 output.Flush();
587 }
588
589 // FIXME: This code is currently still in UuidGatherer since we cannot use Scene.EventManager as some
590 // calls to the gatherer are done for objects with no scene.
591// /// <summary>
592// /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps
593// /// </summary>
594// /// <param name="part"></param>
595// /// <param name="assetUuids"></param>
596// private void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, AssetType> assetUuids)
597// {
598// // scan thru the dynAttrs map of this part for any textures used as materials
599// OSD osdMaterials = null;
600//
601// lock (part.DynAttrs)
602// {
603// if (part.DynAttrs.ContainsStore("OpenSim", "Materials"))
604// {
605// OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials");
606// if (materialsStore == null)
607// return;
608//
609// materialsStore.TryGetValue("Materials", out osdMaterials);
610// }
611//
612// if (osdMaterials != null)
613// {
614// //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd));
615//
616// if (osdMaterials is OSDArray)
617// {
618// OSDArray matsArr = osdMaterials as OSDArray;
619// foreach (OSDMap matMap in matsArr)
620// {
621// try
622// {
623// if (matMap.ContainsKey("Material"))
624// {
625// OSDMap mat = matMap["Material"] as OSDMap;
626// if (mat.ContainsKey("NormMap"))
627// {
628// UUID normalMapId = mat["NormMap"].AsUUID();
629// if (normalMapId != UUID.Zero)
630// {
631// assetUuids[normalMapId] = AssetType.Texture;
632// //m_log.Info("[UUID Gatherer]: found normal map ID: " + normalMapId.ToString());
633// }
634// }
635// if (mat.ContainsKey("SpecMap"))
636// {
637// UUID specularMapId = mat["SpecMap"].AsUUID();
638// if (specularMapId != UUID.Zero)
639// {
640// assetUuids[specularMapId] = AssetType.Texture;
641// //m_log.Info("[UUID Gatherer]: found specular map ID: " + specularMapId.ToString());
642// }
643// }
644// }
645//
646// }
647// catch (Exception e)
648// {
649// m_log.Warn("[MaterialsDemoModule]: exception getting materials: " + e.Message);
650// }
651// }
652// }
653// }
654// }
655// }
656 }
657} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
index 6009dc5..d1d318c 100755
--- a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
@@ -31,10 +31,10 @@ using System.Reflection;
31using System.Text; 31using System.Text;
32 32
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Region.CoreModules;
34using OpenSim.Region.Framework; 35using OpenSim.Region.Framework;
35using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes; 37using OpenSim.Region.Framework.Scenes;
37using OpenSim.Region.CoreModules;
38 38
39using Mono.Addins; 39using Mono.Addins;
40using Nini.Config; 40using Nini.Config;
@@ -49,6 +49,20 @@ public class ExtendedPhysics : INonSharedRegionModule
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 private static string LogHeader = "[EXTENDED PHYSICS]"; 50 private static string LogHeader = "[EXTENDED PHYSICS]";
51 51
52 // =============================================================
53 // Since BulletSim is a plugin, this these values aren't defined easily in one place.
54 // This table must correspond to an identical table in BSScene.
55
56 // Per scene functions. See BSScene.
57
58 // Per avatar functions. See BSCharacter.
59
60 // Per prim functions. See BSPrim.
61 public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType";
62 public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
63
64 // =============================================================
65
52 private IConfig Configuration { get; set; } 66 private IConfig Configuration { get; set; }
53 private bool Enabled { get; set; } 67 private bool Enabled { get; set; }
54 private Scene BaseScene { get; set; } 68 private Scene BaseScene { get; set; }
@@ -119,6 +133,7 @@ public class ExtendedPhysics : INonSharedRegionModule
119 133
120 // Register as LSL functions all the [ScriptInvocation] marked methods. 134 // Register as LSL functions all the [ScriptInvocation] marked methods.
121 Comms.RegisterScriptInvocations(this); 135 Comms.RegisterScriptInvocations(this);
136 Comms.RegisterConstants(this);
122 137
123 // When an object is modified, we might need to update its extended physics parameters 138 // When an object is modified, we might need to update its extended physics parameters
124 BaseScene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene; 139 BaseScene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene;
@@ -132,7 +147,6 @@ public class ExtendedPhysics : INonSharedRegionModule
132 147
133 private void EventManager_OnObjectAddedToScene(SceneObjectGroup obj) 148 private void EventManager_OnObjectAddedToScene(SceneObjectGroup obj)
134 { 149 {
135 throw new NotImplementedException();
136 } 150 }
137 151
138 // Event generated when some property of a prim changes. 152 // Event generated when some property of a prim changes.
@@ -143,13 +157,6 @@ public class ExtendedPhysics : INonSharedRegionModule
143 [ScriptConstant] 157 [ScriptConstant]
144 public static int PHYS_CENTER_OF_MASS = 1 << 0; 158 public static int PHYS_CENTER_OF_MASS = 1 << 0;
145 159
146 [ScriptConstant]
147 public static int PHYS_LINKSET_TYPE_CONSTRAINT = 1;
148 [ScriptConstant]
149 public static int PHYS_LINKSET_TYPE_COMPOUND = 2;
150 [ScriptConstant]
151 public static int PHYS_LINKSET_TYPE_MANUAL = 3;
152
153 [ScriptInvocation] 160 [ScriptInvocation]
154 public string physGetEngineType(UUID hostID, UUID scriptID) 161 public string physGetEngineType(UUID hostID, UUID scriptID)
155 { 162 {
@@ -163,9 +170,95 @@ public class ExtendedPhysics : INonSharedRegionModule
163 return ret; 170 return ret;
164 } 171 }
165 172
173 [ScriptConstant]
174 public static int PHYS_LINKSET_TYPE_CONSTRAINT = 0;
175 [ScriptConstant]
176 public static int PHYS_LINKSET_TYPE_COMPOUND = 1;
177 [ScriptConstant]
178 public static int PHYS_LINKSET_TYPE_MANUAL = 2;
179
166 [ScriptInvocation] 180 [ScriptInvocation]
167 public void physSetLinksetType(UUID hostID, UUID scriptID, int linksetType) 181 public int physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
168 { 182 {
183 int ret = -1;
184
185 if (!Enabled) return ret;
186
187 // The part that is requesting the change.
188 SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID);
189
190 if (requestingPart != null)
191 {
192 // The change is always made to the root of a linkset.
193 SceneObjectGroup containingGroup = requestingPart.ParentGroup;
194 SceneObjectPart rootPart = containingGroup.RootPart;
195
196 if (rootPart != null)
197 {
198 Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
199 if (rootPhysActor != null)
200 {
201 ret = (int)rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType);
202 }
203 else
204 {
205 m_log.WarnFormat("{0} physSetLinksetType: root part does not have a physics actor. rootName={1}, hostID={2}",
206 LogHeader, rootPart.Name, hostID);
207 }
208 }
209 else
210 {
211 m_log.WarnFormat("{0} physSetLinksetType: root part does not exist. RequestingPartName={1}, hostID={2}",
212 LogHeader, requestingPart.Name, hostID);
213 }
214 }
215 else
216 {
217 m_log.WarnFormat("{0} physSetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID);
218 }
219 return ret;
220 }
221
222 [ScriptInvocation]
223 public int physGetLinksetType(UUID hostID, UUID scriptID)
224 {
225 int ret = -1;
226
227 if (!Enabled) return ret;
228
229 // The part that is requesting the change.
230 SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID);
231
232 if (requestingPart != null)
233 {
234 // The type is is always on the root of a linkset.
235 SceneObjectGroup containingGroup = requestingPart.ParentGroup;
236 SceneObjectPart rootPart = containingGroup.RootPart;
237
238 if (rootPart != null)
239 {
240 Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
241 if (rootPhysActor != null)
242 {
243 ret = (int)rootPhysActor.Extension(PhysFunctGetLinksetType);
244 }
245 else
246 {
247 m_log.WarnFormat("{0} physGetLinksetType: root part does not have a physics actor. rootName={1}, hostID={2}",
248 LogHeader, rootPart.Name, hostID);
249 }
250 }
251 else
252 {
253 m_log.WarnFormat("{0} physGetLinksetType: root part does not exist. RequestingPartName={1}, hostID={2}",
254 LogHeader, requestingPart.Name, hostID);
255 }
256 }
257 else
258 {
259 m_log.WarnFormat("{0} physGetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID);
260 }
261 return ret;
169 } 262 }
170} 263}
171} 264}
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs
index c68fe99..3b3b300 100644
--- a/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs
+++ b/OpenSim/Region/OptionalModules/ViewerSupport/DynamicMenuModule.cs
@@ -263,7 +263,7 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport
263 m_module = module; 263 m_module = module;
264 } 264 }
265 265
266 public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 266 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
267 { 267 {
268 StreamReader reader = new StreamReader(request); 268 StreamReader reader = new StreamReader(request);
269 string requestBody = reader.ReadToEnd(); 269 string requestBody = reader.ReadToEnd();
diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
index 5d10e93..bcb21d0 100644
--- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
+++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
@@ -696,7 +696,7 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
696 /// <param name="agentId"></param> 696 /// <param name="agentId"></param>
697 public void EconomyDataRequestHandler(IClientAPI user) 697 public void EconomyDataRequestHandler(IClientAPI user)
698 { 698 {
699 Scene s = LocateSceneClientIn(user.AgentId); 699 Scene s = (Scene)user.Scene;
700 700
701 user.SendEconomyData(EnergyEfficiency, s.RegionInfo.ObjectCapacity, ObjectCount, PriceEnergyUnit, PriceGroupCreate, 701 user.SendEconomyData(EnergyEfficiency, s.RegionInfo.ObjectCapacity, ObjectCount, PriceEnergyUnit, PriceGroupCreate,
702 PriceObjectClaim, PriceObjectRent, PriceObjectScaleFactor, PriceParcelClaim, PriceParcelClaimFactor, 702 PriceObjectClaim, PriceObjectRent, PriceObjectScaleFactor, PriceParcelClaim, PriceParcelClaimFactor,
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 4674489..f2355e2 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -259,6 +259,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
259 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 259 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
260 public event UpdateAgent OnPreAgentUpdate; 260 public event UpdateAgent OnPreAgentUpdate;
261 public event UpdateAgent OnAgentUpdate; 261 public event UpdateAgent OnAgentUpdate;
262 public event UpdateAgent OnAgentCameraUpdate;
262 public event AgentRequestSit OnAgentRequestSit; 263 public event AgentRequestSit OnAgentRequestSit;
263 public event AgentSit OnAgentSit; 264 public event AgentSit OnAgentSit;
264 public event AvatarPickerRequest OnAvatarPickerRequest; 265 public event AvatarPickerRequest OnAvatarPickerRequest;
@@ -393,6 +394,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
393 public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest; 394 public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
394 public event EstateChangeInfo OnEstateChangeInfo; 395 public event EstateChangeInfo OnEstateChangeInfo;
395 public event EstateManageTelehub OnEstateManageTelehub; 396 public event EstateManageTelehub OnEstateManageTelehub;
397 public event CachedTextureRequest OnCachedTextureRequest;
396 public event ScriptReset OnScriptReset; 398 public event ScriptReset OnScriptReset;
397 public event GetScriptRunning OnGetScriptRunning; 399 public event GetScriptRunning OnGetScriptRunning;
398 public event SetScriptRunning OnSetScriptRunning; 400 public event SetScriptRunning OnSetScriptRunning;
@@ -573,6 +575,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
573 { 575 {
574 } 576 }
575 577
578 public void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures)
579 {
580
581 }
582
576 public virtual void Kick(string message) 583 public virtual void Kick(string message)
577 { 584 {
578 } 585 }
@@ -590,7 +597,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
590 597
591 } 598 }
592 599
593 public virtual void SendKillObject(ulong regionHandle, List<uint> localID) 600 public virtual void SendKillObject(List<uint> localID)
594 { 601 {
595 } 602 }
596 603
@@ -1236,7 +1243,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
1236 { 1243 {
1237 } 1244 }
1238 1245
1239 public void StopFlying(ISceneEntity presence) 1246 public void SendAgentTerseUpdate(ISceneEntity presence)
1240 { 1247 {
1241 } 1248 }
1242 1249
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 8c9c006..78fe096 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -116,7 +116,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
116 return false; 116 return false;
117 117
118 // Delete existing npc attachments 118 // Delete existing npc attachments
119 scene.AttachmentsModule.DeleteAttachmentsFromScene(npc, false); 119 if(scene.AttachmentsModule != null)
120 scene.AttachmentsModule.DeleteAttachmentsFromScene(npc, false);
120 121
121 // XXX: We can't just use IAvatarFactoryModule.SetAppearance() yet 122 // XXX: We can't just use IAvatarFactoryModule.SetAppearance() yet
122 // since it doesn't transfer attachments 123 // since it doesn't transfer attachments
@@ -125,7 +126,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
125 npc.Appearance = npcAppearance; 126 npc.Appearance = npcAppearance;
126 127
127 // Rez needed npc attachments 128 // Rez needed npc attachments
128 scene.AttachmentsModule.RezAttachments(npc); 129 if (scene.AttachmentsModule != null)
130 scene.AttachmentsModule.RezAttachments(npc);
129 131
130 IAvatarFactoryModule module = 132 IAvatarFactoryModule module =
131 scene.RequestModuleInterface<IAvatarFactoryModule>(); 133 scene.RequestModuleInterface<IAvatarFactoryModule>();
@@ -375,7 +377,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC
375 m_log.DebugFormat("[NPC MODULE]: Found {0} {1} to remove", 377 m_log.DebugFormat("[NPC MODULE]: Found {0} {1} to remove",
376 agentID, av.Name); 378 agentID, av.Name);
377 */ 379 */
378 scene.RemoveClient(agentID, false); 380
381 scene.IncomingCloseAgent(agentID, false);
382// scene.RemoveClient(agentID, false);
379 m_avatars.Remove(agentID); 383 m_avatars.Remove(agentID);
380 384
381// m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name); 385// m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name);
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
index 34362af..20c178c 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
@@ -155,7 +155,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
155 public void TestCreateWithAttachments() 155 public void TestCreateWithAttachments()
156 { 156 {
157 TestHelpers.InMethod(); 157 TestHelpers.InMethod();
158// log4net.Config.XmlConfigurator.Configure(); 158// TestHelpers.EnableLogging();
159 159
160 UUID userId = TestHelpers.ParseTail(0x1); 160 UUID userId = TestHelpers.ParseTail(0x1);
161 UserAccountHelpers.CreateUserWithInventory(m_scene, userId); 161 UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs
index 550b5d4..8720cc7 100644
--- a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs
+++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs
@@ -55,7 +55,7 @@ namespace OpenSim.Region.OptionalModules.World.WorldView
55 m_WorldViewModule = fmodule; 55 m_WorldViewModule = fmodule;
56 } 56 }
57 57
58 public override byte[] Handle(string path, Stream requestData, 58 protected override byte[] ProcessRequest(string path, Stream requestData,
59 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 59 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
60 { 60 {
61 httpResponse.ContentType = "image/jpeg"; 61 httpResponse.ContentType = "image/jpeg";
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs
index 77ea3ed..12a0c17 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs
@@ -75,11 +75,11 @@ private sealed class BulletBodyUnman : BulletBody
75private sealed class BulletShapeUnman : BulletShape 75private sealed class BulletShapeUnman : BulletShape
76{ 76{
77 public IntPtr ptr; 77 public IntPtr ptr;
78 public BulletShapeUnman(IntPtr xx, BSPhysicsShapeType typ) 78 public BulletShapeUnman(IntPtr xx, BSPhysicsShapeType typ)
79 : base() 79 : base()
80 { 80 {
81 ptr = xx; 81 ptr = xx;
82 type = typ; 82 shapeType = typ;
83 } 83 }
84 public override bool HasPhysicalShape 84 public override bool HasPhysicalShape
85 { 85 {
@@ -91,7 +91,7 @@ private sealed class BulletShapeUnman : BulletShape
91 } 91 }
92 public override BulletShape Clone() 92 public override BulletShape Clone()
93 { 93 {
94 return new BulletShapeUnman(ptr, type); 94 return new BulletShapeUnman(ptr, shapeType);
95 } 95 }
96 public override bool ReferenceSame(BulletShape other) 96 public override bool ReferenceSame(BulletShape other)
97 { 97 {
@@ -251,23 +251,52 @@ public override BulletShape CreateMeshShape(BulletWorld world,
251 BSPhysicsShapeType.SHAPE_MESH); 251 BSPhysicsShapeType.SHAPE_MESH);
252} 252}
253 253
254public override BulletShape CreateGImpactShape(BulletWorld world,
255 int indicesCount, int[] indices,
256 int verticesCount, float[] vertices)
257{
258 BulletWorldUnman worldu = world as BulletWorldUnman;
259 return new BulletShapeUnman(
260 BSAPICPP.CreateGImpactShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
261 BSPhysicsShapeType.SHAPE_GIMPACT);
262}
263
254public override BulletShape CreateHullShape(BulletWorld world, int hullCount, float[] hulls) 264public override BulletShape CreateHullShape(BulletWorld world, int hullCount, float[] hulls)
255{ 265{
256 BulletWorldUnman worldu = world as BulletWorldUnman; 266 BulletWorldUnman worldu = world as BulletWorldUnman;
257 return new BulletShapeUnman( 267 return new BulletShapeUnman(
258 BSAPICPP.CreateHullShape2(worldu.ptr, hullCount, hulls), 268 BSAPICPP.CreateHullShape2(worldu.ptr, hullCount, hulls),
259 BSPhysicsShapeType.SHAPE_HULL); 269 BSPhysicsShapeType.SHAPE_HULL);
260} 270}
261 271
262public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape) 272public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
263{ 273{
264 BulletWorldUnman worldu = world as BulletWorldUnman; 274 BulletWorldUnman worldu = world as BulletWorldUnman;
265 BulletShapeUnman shapeu = meshShape as BulletShapeUnman; 275 BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
266 return new BulletShapeUnman( 276 return new BulletShapeUnman(
267 BSAPICPP.BuildHullShapeFromMesh2(worldu.ptr, shapeu.ptr), 277 BSAPICPP.BuildHullShapeFromMesh2(worldu.ptr, shapeu.ptr, parms),
268 BSPhysicsShapeType.SHAPE_HULL); 278 BSPhysicsShapeType.SHAPE_HULL);
269} 279}
270 280
281public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
282{
283 BulletWorldUnman worldu = world as BulletWorldUnman;
284 BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
285 return new BulletShapeUnman(
286 BSAPICPP.BuildConvexHullShapeFromMesh2(worldu.ptr, shapeu.ptr),
287 BSPhysicsShapeType.SHAPE_CONVEXHULL);
288}
289
290public override BulletShape CreateConvexHullShape(BulletWorld world,
291 int indicesCount, int[] indices,
292 int verticesCount, float[] vertices)
293{
294 BulletWorldUnman worldu = world as BulletWorldUnman;
295 return new BulletShapeUnman(
296 BSAPICPP.CreateConvexHullShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
297 BSPhysicsShapeType.SHAPE_CONVEXHULL);
298}
299
271public override BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData) 300public override BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData)
272{ 301{
273 BulletWorldUnman worldu = world as BulletWorldUnman; 302 BulletWorldUnman worldu = world as BulletWorldUnman;
@@ -356,7 +385,7 @@ public override BulletShape DuplicateCollisionShape(BulletWorld world, BulletSha
356{ 385{
357 BulletWorldUnman worldu = world as BulletWorldUnman; 386 BulletWorldUnman worldu = world as BulletWorldUnman;
358 BulletShapeUnman srcShapeu = srcShape as BulletShapeUnman; 387 BulletShapeUnman srcShapeu = srcShape as BulletShapeUnman;
359 return new BulletShapeUnman(BSAPICPP.DuplicateCollisionShape2(worldu.ptr, srcShapeu.ptr, id), srcShape.type); 388 return new BulletShapeUnman(BSAPICPP.DuplicateCollisionShape2(worldu.ptr, srcShapeu.ptr, id), srcShape.shapeType);
360} 389}
361 390
362public override bool DeleteCollisionShape(BulletWorld world, BulletShape shape) 391public override bool DeleteCollisionShape(BulletWorld world, BulletShape shape)
@@ -1407,11 +1436,24 @@ public static extern IntPtr CreateMeshShape2(IntPtr world,
1407 int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices ); 1436 int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
1408 1437
1409[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 1438[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1439public static extern IntPtr CreateGImpactShape2(IntPtr world,
1440 int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
1441 int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
1442
1443[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1410public static extern IntPtr CreateHullShape2(IntPtr world, 1444public static extern IntPtr CreateHullShape2(IntPtr world,
1411 int hullCount, [MarshalAs(UnmanagedType.LPArray)] float[] hulls); 1445 int hullCount, [MarshalAs(UnmanagedType.LPArray)] float[] hulls);
1412 1446
1413[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 1447[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1414public static extern IntPtr BuildHullShapeFromMesh2(IntPtr world, IntPtr meshShape); 1448public static extern IntPtr BuildHullShapeFromMesh2(IntPtr world, IntPtr meshShape, HACDParams parms);
1449
1450[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1451public static extern IntPtr BuildConvexHullShapeFromMesh2(IntPtr world, IntPtr meshShape);
1452
1453[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1454public static extern IntPtr CreateConvexHullShape2(IntPtr world,
1455 int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
1456 int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
1415 1457
1416[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 1458[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1417public static extern IntPtr BuildNativeShape2(IntPtr world, ShapeData shapeData); 1459public static extern IntPtr BuildNativeShape2(IntPtr world, ShapeData shapeData);
@@ -1476,7 +1518,7 @@ public static extern void DestroyObject2(IntPtr sim, IntPtr obj);
1476public static extern IntPtr CreateGroundPlaneShape2(uint id, float height, float collisionMargin); 1518public static extern IntPtr CreateGroundPlaneShape2(uint id, float height, float collisionMargin);
1477 1519
1478[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 1520[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
1479public static extern IntPtr CreateTerrainShape2(uint id, Vector3 size, float minHeight, float maxHeight, 1521public static extern IntPtr CreateTerrainShape2(uint id, Vector3 size, float minHeight, float maxHeight,
1480 [MarshalAs(UnmanagedType.LPArray)] float[] heightMap, 1522 [MarshalAs(UnmanagedType.LPArray)] float[] heightMap,
1481 float scaleFactor, float collisionMargin); 1523 float scaleFactor, float collisionMargin);
1482 1524
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
index 6fc10e9..2a820be 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
@@ -81,11 +81,11 @@ private sealed class BulletBodyXNA : BulletBody
81private sealed class BulletShapeXNA : BulletShape 81private sealed class BulletShapeXNA : BulletShape
82{ 82{
83 public CollisionShape shape; 83 public CollisionShape shape;
84 public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ) 84 public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ)
85 : base() 85 : base()
86 { 86 {
87 shape = xx; 87 shape = xx;
88 type = typ; 88 shapeType = typ;
89 } 89 }
90 public override bool HasPhysicalShape 90 public override bool HasPhysicalShape
91 { 91 {
@@ -97,7 +97,7 @@ private sealed class BulletShapeXNA : BulletShape
97 } 97 }
98 public override BulletShape Clone() 98 public override BulletShape Clone()
99 { 99 {
100 return new BulletShapeXNA(shape, type); 100 return new BulletShapeXNA(shape, shapeType);
101 } 101 }
102 public override bool ReferenceSame(BulletShape other) 102 public override bool ReferenceSame(BulletShape other)
103 { 103 {
@@ -137,8 +137,8 @@ private sealed class BulletConstraintXNA : BulletConstraint
137 internal int LastEntityProperty = 0; 137 internal int LastEntityProperty = 0;
138 138
139 internal EntityProperties[] UpdatedObjects; 139 internal EntityProperties[] UpdatedObjects;
140 internal Dictionary<uint, GhostObject> specialCollisionObjects; 140 internal Dictionary<uint, GhostObject> specialCollisionObjects;
141 141
142 private static int m_collisionsThisFrame; 142 private static int m_collisionsThisFrame;
143 private BSScene PhysicsScene { get; set; } 143 private BSScene PhysicsScene { get; set; }
144 144
@@ -151,7 +151,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
151 } 151 }
152 152
153 /// <summary> 153 /// <summary>
154 /// 154 ///
155 /// </summary> 155 /// </summary>
156 /// <param name="p"></param> 156 /// <param name="p"></param>
157 /// <param name="p_2"></param> 157 /// <param name="p_2"></param>
@@ -174,7 +174,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
174 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; 174 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
175 TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain; 175 TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
176 world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects); 176 world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects);
177 177
178 return true; 178 return true;
179 179
180 } 180 }
@@ -300,7 +300,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
300 public override bool GetForceUpdateAllAabbs(BulletWorld pWorld) { 300 public override bool GetForceUpdateAllAabbs(BulletWorld pWorld) {
301 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; 301 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
302 return world.GetForceUpdateAllAabbs(); 302 return world.GetForceUpdateAllAabbs();
303 303
304 } 304 }
305 public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce) 305 public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce)
306 { 306 {
@@ -404,7 +404,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
404 IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion); 404 IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion);
405 mat._origin = vposition; 405 mat._origin = vposition;
406 collisionObject.SetWorldTransform(mat); 406 collisionObject.SetWorldTransform(mat);
407 407
408 } 408 }
409 409
410 public override Vector3 GetPosition(BulletBody pCollisionObject) 410 public override Vector3 GetPosition(BulletBody pCollisionObject)
@@ -457,7 +457,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
457 { 457 {
458 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 458 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
459 collisionObject.Activate(pforceactivation); 459 collisionObject.Activate(pforceactivation);
460 460
461 } 461 }
462 462
463 public override Quaternion GetOrientation(BulletBody pCollisionObject) 463 public override Quaternion GetOrientation(BulletBody pCollisionObject)
@@ -486,7 +486,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
486 { 486 {
487 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 487 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
488 return collisionObject.GetCcdSweptSphereRadius(); 488 return collisionObject.GetCcdSweptSphereRadius();
489 489
490 } 490 }
491 491
492 public override IntPtr GetUserPointer(BulletBody pCollisionObject) 492 public override IntPtr GetUserPointer(BulletBody pCollisionObject)
@@ -559,8 +559,8 @@ private sealed class BulletConstraintXNA : BulletConstraint
559 } 559 }
560 560
561 561
562 public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, 562 public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
563 Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, 563 Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
564 bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) 564 bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
565 565
566 { 566 {
@@ -604,7 +604,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
604 } 604 }
605 605
606 /// <summary> 606 /// <summary>
607 /// 607 ///
608 /// </summary> 608 /// </summary>
609 /// <param name="pWorld"></param> 609 /// <param name="pWorld"></param>
610 /// <param name="pBody1"></param> 610 /// <param name="pBody1"></param>
@@ -824,7 +824,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
824 { 824 {
825 RigidBody body = (pBody as BulletBodyXNA).rigidBody; 825 RigidBody body = (pBody as BulletBodyXNA).rigidBody;
826 float angularDamping = body.GetAngularDamping(); 826 float angularDamping = body.GetAngularDamping();
827 body.SetDamping(lin_damping, angularDamping); 827 body.SetDamping(lin_damping, angularDamping);
828 } 828 }
829 829
830 public override float GetLinearDamping(BulletBody pBody) 830 public override float GetLinearDamping(BulletBody pBody)
@@ -907,7 +907,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
907 RigidBody bo = co as RigidBody; 907 RigidBody bo = co as RigidBody;
908 if (bo == null) 908 if (bo == null)
909 { 909 {
910 910
911 if (world.IsInWorld(co)) 911 if (world.IsInWorld(co))
912 { 912 {
913 world.RemoveCollisionObject(co); 913 world.RemoveCollisionObject(co);
@@ -915,7 +915,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
915 } 915 }
916 else 916 else
917 { 917 {
918 918
919 if (world.IsInWorld(bo)) 919 if (world.IsInWorld(bo))
920 { 920 {
921 world.RemoveRigidBody(bo); 921 world.RemoveRigidBody(bo);
@@ -947,7 +947,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
947 947
948 // TODO: Turn this from a reference copy to a Value Copy. 948 // TODO: Turn this from a reference copy to a Value Copy.
949 BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType())); 949 BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType()));
950 950
951 return shape2; 951 return shape2;
952 } 952 }
953 953
@@ -957,7 +957,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
957 return false; 957 return false;
958 } 958 }
959 //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation); 959 //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation);
960 960
961 public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) 961 public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
962 { 962 {
963 CollisionWorld world = (pWorld as BulletWorldXNA).world; 963 CollisionWorld world = (pWorld as BulletWorldXNA).world;
@@ -993,11 +993,11 @@ private sealed class BulletConstraintXNA : BulletConstraint
993 m_startWorldTransform = IndexedMatrix.Identity; 993 m_startWorldTransform = IndexedMatrix.Identity;
994 */ 994 */
995 body.SetUserPointer(pLocalID); 995 body.SetUserPointer(pLocalID);
996 996
997 return new BulletBodyXNA(pLocalID, body); 997 return new BulletBodyXNA(pLocalID, body);
998 } 998 }
999 999
1000 1000
1001 public override BulletBody CreateBodyWithDefaultMotionState( BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) 1001 public override BulletBody CreateBodyWithDefaultMotionState( BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
1002 { 1002 {
1003 1003
@@ -1025,7 +1025,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1025 public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain) 1025 public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain)
1026 { 1026 {
1027 1027
1028 /* TODO */ 1028 /* TODO */
1029 return Vector3.Zero; 1029 return Vector3.Zero;
1030 } 1030 }
1031 public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; } 1031 public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; }
@@ -1035,7 +1035,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1035 { 1035 {
1036 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 1036 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
1037 return collisionObject.IsStaticObject(); 1037 return collisionObject.IsStaticObject();
1038 1038
1039 } 1039 }
1040 public override bool IsKinematicObject(BulletBody pCollisionObject) 1040 public override bool IsKinematicObject(BulletBody pCollisionObject)
1041 { 1041 {
@@ -1098,10 +1098,10 @@ private sealed class BulletConstraintXNA : BulletConstraint
1098 return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); 1098 return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null));
1099 } 1099 }
1100 1100
1101 private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent, 1101 private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent,
1102 ConfigurationParameters[] o, 1102 ConfigurationParameters[] o,
1103 int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray, 1103 int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray,
1104 int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray, 1104 int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray,
1105 object mDebugLogCallbackHandle) 1105 object mDebugLogCallbackHandle)
1106 { 1106 {
1107 CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData(); 1107 CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData();
@@ -1138,9 +1138,9 @@ private sealed class BulletConstraintXNA : BulletConstraint
1138 p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth; 1138 p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth;
1139 p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight; 1139 p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight;
1140 p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold; 1140 p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold;
1141 1141
1142 p.vehicleAngularDamping = BSParam.VehicleAngularDamping; 1142 p.vehicleAngularDamping = BSParam.VehicleAngularDamping;
1143 1143
1144 p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize; 1144 p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize;
1145 p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize; 1145 p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize;
1146 p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation; 1146 p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation;
@@ -1160,7 +1160,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1160 p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations; 1160 p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations;
1161 p.physicsLoggingFrames = o[0].physicsLoggingFrames; 1161 p.physicsLoggingFrames = o[0].physicsLoggingFrames;
1162 DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo(); 1162 DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo();
1163 1163
1164 DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration(); 1164 DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration();
1165 CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci); 1165 CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci);
1166 1166
@@ -1221,6 +1221,50 @@ private sealed class BulletConstraintXNA : BulletConstraint
1221 //BSParam.TerrainImplementation = 0; 1221 //BSParam.TerrainImplementation = 0;
1222 world.SetGravity(new IndexedVector3(0,0,p.gravity)); 1222 world.SetGravity(new IndexedVector3(0,0,p.gravity));
1223 1223
1224 // Turn off Pooling since globals and pooling are bad for threading.
1225 BulletGlobals.VoronoiSimplexSolverPool.SetPoolingEnabled(false);
1226 BulletGlobals.SubSimplexConvexCastPool.SetPoolingEnabled(false);
1227 BulletGlobals.ManifoldPointPool.SetPoolingEnabled(false);
1228 BulletGlobals.CastResultPool.SetPoolingEnabled(false);
1229 BulletGlobals.SphereShapePool.SetPoolingEnabled(false);
1230 BulletGlobals.DbvtNodePool.SetPoolingEnabled(false);
1231 BulletGlobals.SingleRayCallbackPool.SetPoolingEnabled(false);
1232 BulletGlobals.SubSimplexClosestResultPool.SetPoolingEnabled(false);
1233 BulletGlobals.GjkPairDetectorPool.SetPoolingEnabled(false);
1234 BulletGlobals.DbvtTreeColliderPool.SetPoolingEnabled(false);
1235 BulletGlobals.SingleSweepCallbackPool.SetPoolingEnabled(false);
1236 BulletGlobals.BroadphaseRayTesterPool.SetPoolingEnabled(false);
1237 BulletGlobals.ClosestNotMeConvexResultCallbackPool.SetPoolingEnabled(false);
1238 BulletGlobals.GjkEpaPenetrationDepthSolverPool.SetPoolingEnabled(false);
1239 BulletGlobals.ContinuousConvexCollisionPool.SetPoolingEnabled(false);
1240 BulletGlobals.DbvtStackDataBlockPool.SetPoolingEnabled(false);
1241
1242 BulletGlobals.BoxBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
1243 BulletGlobals.CompoundCollisionAlgorithmPool.SetPoolingEnabled(false);
1244 BulletGlobals.ConvexConcaveCollisionAlgorithmPool.SetPoolingEnabled(false);
1245 BulletGlobals.ConvexConvexAlgorithmPool.SetPoolingEnabled(false);
1246 BulletGlobals.ConvexPlaneAlgorithmPool.SetPoolingEnabled(false);
1247 BulletGlobals.SphereBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
1248 BulletGlobals.SphereSphereCollisionAlgorithmPool.SetPoolingEnabled(false);
1249 BulletGlobals.SphereTriangleCollisionAlgorithmPool.SetPoolingEnabled(false);
1250 BulletGlobals.GImpactCollisionAlgorithmPool.SetPoolingEnabled(false);
1251 BulletGlobals.GjkEpaSolver2MinkowskiDiffPool.SetPoolingEnabled(false);
1252 BulletGlobals.PersistentManifoldPool.SetPoolingEnabled(false);
1253 BulletGlobals.ManifoldResultPool.SetPoolingEnabled(false);
1254 BulletGlobals.GJKPool.SetPoolingEnabled(false);
1255 BulletGlobals.GIM_ShapeRetrieverPool.SetPoolingEnabled(false);
1256 BulletGlobals.TriangleShapePool.SetPoolingEnabled(false);
1257 BulletGlobals.SphereTriangleDetectorPool.SetPoolingEnabled(false);
1258 BulletGlobals.CompoundLeafCallbackPool.SetPoolingEnabled(false);
1259 BulletGlobals.GjkConvexCastPool.SetPoolingEnabled(false);
1260 BulletGlobals.LocalTriangleSphereCastCallbackPool.SetPoolingEnabled(false);
1261 BulletGlobals.BridgeTriangleRaycastCallbackPool.SetPoolingEnabled(false);
1262 BulletGlobals.BridgeTriangleConcaveRaycastCallbackPool.SetPoolingEnabled(false);
1263 BulletGlobals.BridgeTriangleConvexcastCallbackPool.SetPoolingEnabled(false);
1264 BulletGlobals.MyNodeOverlapCallbackPool.SetPoolingEnabled(false);
1265 BulletGlobals.ClosestRayResultCallbackPool.SetPoolingEnabled(false);
1266 BulletGlobals.DebugDrawcallbackPool.SetPoolingEnabled(false);
1267
1224 return world; 1268 return world;
1225 } 1269 }
1226 //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL 1270 //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL
@@ -1263,7 +1307,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1263 } 1307 }
1264 } 1308 }
1265 return ret; 1309 return ret;
1266 1310
1267 } 1311 }
1268 1312
1269 public override float GetAngularMotionDisc(BulletShape pShape) 1313 public override float GetAngularMotionDisc(BulletShape pShape)
@@ -1353,10 +1397,10 @@ private sealed class BulletConstraintXNA : BulletConstraint
1353 CollisionShape shape = (pShape as BulletShapeXNA).shape; 1397 CollisionShape shape = (pShape as BulletShapeXNA).shape;
1354 gObj.SetCollisionShape(shape); 1398 gObj.SetCollisionShape(shape);
1355 gObj.SetUserPointer(pLocalID); 1399 gObj.SetUserPointer(pLocalID);
1356 1400
1357 if (specialCollisionObjects.ContainsKey(pLocalID)) 1401 if (specialCollisionObjects.ContainsKey(pLocalID))
1358 specialCollisionObjects[pLocalID] = gObj; 1402 specialCollisionObjects[pLocalID] = gObj;
1359 else 1403 else
1360 specialCollisionObjects.Add(pLocalID, gObj); 1404 specialCollisionObjects.Add(pLocalID, gObj);
1361 1405
1362 // TODO: Add to Special CollisionObjects! 1406 // TODO: Add to Special CollisionObjects!
@@ -1447,8 +1491,8 @@ private sealed class BulletConstraintXNA : BulletConstraint
1447 return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType())); 1491 return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType()));
1448 } 1492 }
1449 1493
1450 public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { 1494 public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) {
1451 1495
1452 if (cShape == null) 1496 if (cShape == null)
1453 return null; 1497 return null;
1454 CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; 1498 CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape;
@@ -1456,7 +1500,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1456 BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); 1500 BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
1457 1501
1458 1502
1459 return retShape; 1503 return retShape;
1460 } 1504 }
1461 1505
1462 public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) 1506 public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin)
@@ -1475,7 +1519,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1475 ret = BSPhysicsShapeType.SHAPE_UNKNOWN; 1519 ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
1476 break; 1520 break;
1477 case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE: 1521 case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE:
1478 ret = BSPhysicsShapeType.SHAPE_MESH; 1522 ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
1479 break; 1523 break;
1480 case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE: 1524 case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE:
1481 ret = BSPhysicsShapeType.SHAPE_HULL; 1525 ret = BSPhysicsShapeType.SHAPE_HULL;
@@ -1503,7 +1547,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1503 ret = BSPhysicsShapeType.SHAPE_CONE; 1547 ret = BSPhysicsShapeType.SHAPE_CONE;
1504 break; 1548 break;
1505 case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE: 1549 case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE:
1506 ret = BSPhysicsShapeType.SHAPE_UNKNOWN; 1550 ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
1507 break; 1551 break;
1508 case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE: 1552 case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE:
1509 ret = BSPhysicsShapeType.SHAPE_CYLINDER; 1553 ret = BSPhysicsShapeType.SHAPE_CYLINDER;
@@ -1547,7 +1591,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1547 break; 1591 break;
1548 ///Used for GIMPACT Trimesh integration 1592 ///Used for GIMPACT Trimesh integration
1549 case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE: 1593 case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE:
1550 ret = BSPhysicsShapeType.SHAPE_MESH; 1594 ret = BSPhysicsShapeType.SHAPE_GIMPACT;
1551 break; 1595 break;
1552 ///Multimaterial mesh 1596 ///Multimaterial mesh
1553 case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE: 1597 case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE:
@@ -1598,8 +1642,8 @@ private sealed class BulletConstraintXNA : BulletConstraint
1598 return new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE); 1642 return new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE);
1599 } 1643 }
1600 1644
1601 public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, 1645 public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
1602 Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, 1646 Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
1603 bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) 1647 bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
1604 1648
1605 { 1649 {
@@ -1745,7 +1789,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1745 { 1789 {
1746 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; 1790 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
1747 CompoundShape compoundshape = new CompoundShape(false); 1791 CompoundShape compoundshape = new CompoundShape(false);
1748 1792
1749 compoundshape.SetMargin(world.WorldSettings.Params.collisionMargin); 1793 compoundshape.SetMargin(world.WorldSettings.Params.collisionMargin);
1750 int ii = 1; 1794 int ii = 1;
1751 1795
@@ -1761,7 +1805,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1761 int ender = ((ii + 4) + (vertexCount*3)); 1805 int ender = ((ii + 4) + (vertexCount*3));
1762 for (int iii = ii + 4; iii < ender; iii+=3) 1806 for (int iii = ii + 4; iii < ender; iii+=3)
1763 { 1807 {
1764 1808
1765 virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2])); 1809 virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2]));
1766 } 1810 }
1767 ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount); 1811 ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount);
@@ -1769,26 +1813,35 @@ private sealed class BulletConstraintXNA : BulletConstraint
1769 compoundshape.AddChildShape(ref childTrans, convexShape); 1813 compoundshape.AddChildShape(ref childTrans, convexShape);
1770 ii += (vertexCount*3 + 4); 1814 ii += (vertexCount*3 + 4);
1771 } 1815 }
1772 1816
1773 return new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL); 1817 return new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL);
1774 } 1818 }
1775 1819
1776 public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape) 1820 public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
1777 { 1821 {
1778 /* TODO */ return null; 1822 /* TODO */ return null;
1823 }
1779 1824
1825 public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
1826 {
1827 /* TODO */ return null;
1828 }
1829
1830 public override BulletShape CreateConvexHullShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
1831 {
1832 /* TODO */ return null;
1780 } 1833 }
1781 1834
1782 public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) 1835 public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
1783 { 1836 {
1784 //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount); 1837 //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount);
1785 1838
1786 for (int iter = 0; iter < pVerticesCount; iter++) 1839 for (int iter = 0; iter < pVerticesCount; iter++)
1787 { 1840 {
1788 if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0; 1841 if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0;
1789 if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0; 1842 if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0;
1790 } 1843 }
1791 1844
1792 ObjectArray<int> indicesarr = new ObjectArray<int>(indices); 1845 ObjectArray<int> indicesarr = new ObjectArray<int>(indices);
1793 ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats); 1846 ObjectArray<float> vertices = new ObjectArray<float>(verticesAsFloats);
1794 DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount); 1847 DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount);
@@ -1802,7 +1855,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1802 mesh.m_vertexStride = 3; 1855 mesh.m_vertexStride = 3;
1803 mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; 1856 mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT;
1804 mesh.m_triangleIndexStride = 3; 1857 mesh.m_triangleIndexStride = 3;
1805 1858
1806 TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); 1859 TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray();
1807 tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); 1860 tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER);
1808 BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true); 1861 BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true);
@@ -1811,9 +1864,14 @@ private sealed class BulletConstraintXNA : BulletConstraint
1811 return new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH); 1864 return new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH);
1812 1865
1813 } 1866 }
1867 public override BulletShape CreateGImpactShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
1868 {
1869 // TODO:
1870 return null;
1871 }
1814 public static void DumpRaw(ObjectArray<int>indices, ObjectArray<float> vertices, int pIndicesCount,int pVerticesCount ) 1872 public static void DumpRaw(ObjectArray<int>indices, ObjectArray<float> vertices, int pIndicesCount,int pVerticesCount )
1815 { 1873 {
1816 1874
1817 String fileName = "objTest3.raw"; 1875 String fileName = "objTest3.raw";
1818 String completePath = System.IO.Path.Combine(Util.configDir(), fileName); 1876 String completePath = System.IO.Path.Combine(Util.configDir(), fileName);
1819 StreamWriter sw = new StreamWriter(completePath); 1877 StreamWriter sw = new StreamWriter(completePath);
@@ -1839,7 +1897,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1839 string s = vertices[indices[i * 3]].ToString("0.0000"); 1897 string s = vertices[indices[i * 3]].ToString("0.0000");
1840 s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); 1898 s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000");
1841 s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); 1899 s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000");
1842 1900
1843 sw.Write(s + "\n"); 1901 sw.Write(s + "\n");
1844 } 1902 }
1845 1903
@@ -1861,7 +1919,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1861 mesh.m_vertexStride = 3; 1919 mesh.m_vertexStride = 3;
1862 mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; 1920 mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT;
1863 mesh.m_triangleIndexStride = 3; 1921 mesh.m_triangleIndexStride = 3;
1864 1922
1865 TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); 1923 TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray();
1866 tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); 1924 tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER);
1867 1925
@@ -1892,7 +1950,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1892 sw.Close(); 1950 sw.Close();
1893 } 1951 }
1894 1952
1895 public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap, 1953 public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
1896 float scaleFactor, float collisionMargin) 1954 float scaleFactor, float collisionMargin)
1897 { 1955 {
1898 const int upAxis = 2; 1956 const int upAxis = 2;
@@ -1900,7 +1958,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1900 heightMap, scaleFactor, 1958 heightMap, scaleFactor,
1901 minHeight, maxHeight, upAxis, 1959 minHeight, maxHeight, upAxis,
1902 false); 1960 false);
1903 terrainShape.SetMargin(collisionMargin + 0.5f); 1961 terrainShape.SetMargin(collisionMargin);
1904 terrainShape.SetUseDiamondSubdivision(true); 1962 terrainShape.SetUseDiamondSubdivision(true);
1905 terrainShape.SetUserPointer(id); 1963 terrainShape.SetUserPointer(id);
1906 return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN); 1964 return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN);
@@ -1934,14 +1992,14 @@ private sealed class BulletConstraintXNA : BulletConstraint
1934 /* TODO */ 1992 /* TODO */
1935 updatedEntityCount = 0; 1993 updatedEntityCount = 0;
1936 collidersCount = 0; 1994 collidersCount = 0;
1937 1995
1938 1996
1939 int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray); 1997 int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray);
1940 1998
1941 return ret; 1999 return ret;
1942 } 2000 }
1943 2001
1944 private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep, 2002 private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep,
1945 out int updatedEntityCount, out EntityProperties[] updatedEntities, 2003 out int updatedEntityCount, out EntityProperties[] updatedEntities,
1946 out int collidersCount, out CollisionDesc[] colliders) 2004 out int collidersCount, out CollisionDesc[] colliders)
1947 { 2005 {
@@ -1950,24 +2008,24 @@ private sealed class BulletConstraintXNA : BulletConstraint
1950 return epic; 2008 return epic;
1951 } 2009 }
1952 2010
1953 private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount, 2011 private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount,
1954 out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates) 2012 out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates)
1955 { 2013 {
1956 int numSimSteps = 0; 2014 int numSimSteps = 0;
1957 Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length); 2015 Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length);
1958 Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length); 2016 Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length);
1959 LastEntityProperty=0; 2017 LastEntityProperty=0;
1960 2018
1961 2019
1962 2020
1963 2021
1964 2022
1965 2023
1966 LastCollisionDesc=0; 2024 LastCollisionDesc=0;
1967 2025
1968 updatedEntityCount = 0; 2026 updatedEntityCount = 0;
1969 collidersCount = 0; 2027 collidersCount = 0;
1970 2028
1971 2029
1972 if (pWorld is BulletWorldXNA) 2030 if (pWorld is BulletWorldXNA)
1973 { 2031 {
@@ -2024,7 +2082,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2024 2082
2025 collidersCount = LastCollisionDesc; 2083 collidersCount = LastCollisionDesc;
2026 colliders = UpdatedCollisions; 2084 colliders = UpdatedCollisions;
2027 2085
2028 2086
2029 } 2087 }
2030 else 2088 else
@@ -2032,15 +2090,15 @@ private sealed class BulletConstraintXNA : BulletConstraint
2032 //if (updatedEntities is null) 2090 //if (updatedEntities is null)
2033 //updatedEntities = new List<BulletXNA.EntityProperties>(); 2091 //updatedEntities = new List<BulletXNA.EntityProperties>();
2034 //updatedEntityCount = 0; 2092 //updatedEntityCount = 0;
2035 2093
2036 2094
2037 //collidersCount = 0; 2095 //collidersCount = 0;
2038 2096
2039 updatedEntities = new EntityProperties[0]; 2097 updatedEntities = new EntityProperties[0];
2040 2098
2041 2099
2042 colliders = new CollisionDesc[0]; 2100 colliders = new CollisionDesc[0];
2043 2101
2044 } 2102 }
2045 return numSimSteps; 2103 return numSimSteps;
2046 } 2104 }
@@ -2048,7 +2106,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2048 { 2106 {
2049 IOverlappingPairCache cache = obj.GetOverlappingPairCache(); 2107 IOverlappingPairCache cache = obj.GetOverlappingPairCache();
2050 ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray(); 2108 ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray();
2051 2109
2052 DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world; 2110 DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world;
2053 PersistentManifoldArray manifoldArray = new PersistentManifoldArray(); 2111 PersistentManifoldArray manifoldArray = new PersistentManifoldArray();
2054 BroadphasePair collisionPair; 2112 BroadphasePair collisionPair;
@@ -2060,7 +2118,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2060 ManifoldPoint pt; 2118 ManifoldPoint pt;
2061 2119
2062 int numPairs = pairs.Count; 2120 int numPairs = pairs.Count;
2063 2121
2064 for (int i = 0; i < numPairs; i++) 2122 for (int i = 0; i < numPairs; i++)
2065 { 2123 {
2066 manifoldArray.Clear(); 2124 manifoldArray.Clear();
@@ -2069,7 +2127,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2069 collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1); 2127 collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1);
2070 if (collisionPair == null) 2128 if (collisionPair == null)
2071 continue; 2129 continue;
2072 2130
2073 collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray); 2131 collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray);
2074 for (int j = 0; j < manifoldArray.Count; j++) 2132 for (int j = 0; j < manifoldArray.Count; j++)
2075 { 2133 {
@@ -2092,7 +2150,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2092 } 2150 }
2093 private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) 2151 private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration)
2094 { 2152 {
2095 2153
2096 IndexedVector3 contactNormal = norm; 2154 IndexedVector3 contactNormal = norm;
2097 if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 && 2155 if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 &&
2098 (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0) 2156 (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0)
@@ -2162,11 +2220,11 @@ private sealed class BulletConstraintXNA : BulletConstraint
2162 if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody) 2220 if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody)
2163 { 2221 {
2164 CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body; 2222 CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body;
2165 2223
2166 IndexedVector3 rOrigin = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z); 2224 IndexedVector3 rOrigin = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z);
2167 IndexedVector3 rEnd = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z - pRayHeight); 2225 IndexedVector3 rEnd = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z - pRayHeight);
2168 using ( 2226 using (
2169 ClosestNotMeRayResultCallback rayCallback = 2227 ClosestNotMeRayResultCallback rayCallback =
2170 new ClosestNotMeRayResultCallback(rOrigin, rEnd, AvoidBody) 2228 new ClosestNotMeRayResultCallback(rOrigin, rEnd, AvoidBody)
2171 ) 2229 )
2172 { 2230 {
@@ -2182,9 +2240,9 @@ private sealed class BulletConstraintXNA : BulletConstraint
2182 return false; 2240 return false;
2183 } 2241 }
2184} 2242}
2185
2186 2243
2187 2244
2245
2188 2246
2189 public class SimMotionState : DefaultMotionState 2247 public class SimMotionState : DefaultMotionState
2190 { 2248 {
@@ -2277,12 +2335,12 @@ private sealed class BulletConstraintXNA : BulletConstraint
2277 m_lastProperties = m_properties; 2335 m_lastProperties = m_properties;
2278 if (m_world.LastEntityProperty < m_world.UpdatedObjects.Length) 2336 if (m_world.LastEntityProperty < m_world.UpdatedObjects.Length)
2279 m_world.UpdatedObjects[m_world.LastEntityProperty++]=(m_properties); 2337 m_world.UpdatedObjects[m_world.LastEntityProperty++]=(m_properties);
2280 2338
2281 //(*m_updatesThisFrame)[m_properties.ID] = &m_properties; 2339 //(*m_updatesThisFrame)[m_properties.ID] = &m_properties;
2282 } 2340 }
2283 2341
2284 2342
2285 2343
2286 2344
2287 } 2345 }
2288 public override void SetRigidBody(RigidBody body) 2346 public override void SetRigidBody(RigidBody body)
@@ -2305,7 +2363,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
2305 (((v1.Z - nEpsilon) < v2.Z) && (v2.Z < (v1.Z + nEpsilon))) && 2363 (((v1.Z - nEpsilon) < v2.Z) && (v2.Z < (v1.Z + nEpsilon))) &&
2306 (((v1.W - nEpsilon) < v2.W) && (v2.W < (v1.W + nEpsilon))); 2364 (((v1.W - nEpsilon) < v2.W) && (v2.W < (v1.W + nEpsilon)));
2307 } 2365 }
2308 2366
2309 } 2367 }
2310} 2368}
2311 2369
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
new file mode 100755
index 0000000..68bc1b9
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
@@ -0,0 +1,409 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenSim.Region.Physics.Manager;
34
35using OMV = OpenMetaverse;
36
37namespace OpenSim.Region.Physics.BulletSPlugin
38{
39public class BSActorAvatarMove : BSActor
40{
41 BSVMotor m_velocityMotor;
42
43 // Set to true if we think we're going up stairs.
44 // This state is remembered because collisions will turn on and off as we go up stairs.
45 int m_walkingUpStairs;
46 // The amount the step up is applying. Used to smooth stair walking.
47 float m_lastStepUp;
48
49 // Jumping happens over several frames. If use applies up force while colliding, start the
50 // jump and allow the jump to continue for this number of frames.
51 int m_jumpFrames = 0;
52 float m_jumpVelocity = 0f;
53
54 public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
55 : base(physicsScene, pObj, actorName)
56 {
57 m_velocityMotor = null;
58 m_walkingUpStairs = 0;
59 m_physicsScene.DetailLog("{0},BSActorAvatarMove,constructor", m_controllingPrim.LocalID);
60 }
61
62 // BSActor.isActive
63 public override bool isActive
64 {
65 get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
66 }
67
68 // Release any connections and resources used by the actor.
69 // BSActor.Dispose()
70 public override void Dispose()
71 {
72 base.SetEnabled(false);
73 // Now that turned off, remove any state we have in the scene.
74 Refresh();
75 }
76
77 // Called when physical parameters (properties set in Bullet) need to be re-applied.
78 // Called at taint-time.
79 // BSActor.Refresh()
80 public override void Refresh()
81 {
82 m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh", m_controllingPrim.LocalID);
83
84 // If the object is physically active, add the hoverer prestep action
85 if (isActive)
86 {
87 ActivateAvatarMove();
88 }
89 else
90 {
91 DeactivateAvatarMove();
92 }
93 }
94
95 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
96 // Register a prestep action to restore physical requirements before the next simulation step.
97 // Called at taint-time.
98 // BSActor.RemoveDependencies()
99 public override void RemoveDependencies()
100 {
101 // Nothing to do for the hoverer since it is all software at pre-step action time.
102 }
103
104 // Usually called when target velocity changes to set the current velocity and the target
105 // into the movement motor.
106 public void SetVelocityAndTarget(OMV.Vector3 vel, OMV.Vector3 targ, bool inTaintTime)
107 {
108 m_physicsScene.TaintedObject(inTaintTime, "BSActorAvatarMove.setVelocityAndTarget", delegate()
109 {
110 if (m_velocityMotor != null)
111 {
112 m_velocityMotor.Reset();
113 m_velocityMotor.SetTarget(targ);
114 m_velocityMotor.SetCurrent(vel);
115 m_velocityMotor.Enabled = true;
116 }
117 });
118 }
119
120 // If a hover motor has not been created, create one and start the hovering.
121 private void ActivateAvatarMove()
122 {
123 if (m_velocityMotor == null)
124 {
125 // Infinite decay and timescale values so motor only changes current to target values.
126 m_velocityMotor = new BSVMotor("BSCharacter.Velocity",
127 0.2f, // time scale
128 BSMotor.Infinite, // decay time scale
129 1f // efficiency
130 );
131 // _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
132 SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */);
133
134 m_physicsScene.BeforeStep += Mover;
135 m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
136
137 m_walkingUpStairs = 0;
138 }
139 }
140
141 private void DeactivateAvatarMove()
142 {
143 if (m_velocityMotor != null)
144 {
145 m_controllingPrim.OnPreUpdateProperty -= Process_OnPreUpdateProperty;
146 m_physicsScene.BeforeStep -= Mover;
147 m_velocityMotor = null;
148 }
149 }
150
151 // Called just before the simulation step. Update the vertical position for hoverness.
152 private void Mover(float timeStep)
153 {
154 // Don't do movement while the object is selected.
155 if (!isActive)
156 return;
157
158 // TODO: Decide if the step parameters should be changed depending on the avatar's
159 // state (flying, colliding, ...). There is code in ODE to do this.
160
161 // COMMENTARY: when the user is making the avatar walk, except for falling, the velocity
162 // specified for the avatar is the one that should be used. For falling, if the avatar
163 // is not flying and is not colliding then it is presumed to be falling and the Z
164 // component is not fooled with (thus allowing gravity to do its thing).
165 // When the avatar is standing, though, the user has specified a velocity of zero and
166 // the avatar should be standing. But if the avatar is pushed by something in the world
167 // (raising elevator platform, moving vehicle, ...) the avatar should be allowed to
168 // move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
169 // errors can creap in and the avatar will slowly float off in some direction.
170 // So, the problem is that, when an avatar is standing, we cannot tell creaping error
171 // from real pushing.
172 // The code below uses whether the collider is static or moving to decide whether to zero motion.
173
174 m_velocityMotor.Step(timeStep);
175 m_controllingPrim.IsStationary = false;
176
177 // If we're not supposed to be moving, make sure things are zero.
178 if (m_velocityMotor.ErrorIsZero() && m_velocityMotor.TargetValue == OMV.Vector3.Zero)
179 {
180 // The avatar shouldn't be moving
181 m_velocityMotor.Zero();
182
183 if (m_controllingPrim.IsColliding)
184 {
185 // If we are colliding with a stationary object, presume we're standing and don't move around
186 if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
187 {
188 m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
189 m_controllingPrim.IsStationary = true;
190 m_controllingPrim.ZeroMotion(true /* inTaintTime */);
191 }
192
193 // Standing has more friction on the ground
194 if (m_controllingPrim.Friction != BSParam.AvatarStandingFriction)
195 {
196 m_controllingPrim.Friction = BSParam.AvatarStandingFriction;
197 m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
198 }
199 }
200 else
201 {
202 if (m_controllingPrim.Flying)
203 {
204 // Flying and not colliding and velocity nearly zero.
205 m_controllingPrim.ZeroMotion(true /* inTaintTime */);
206 }
207 }
208
209 m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1},colliding={2}",
210 m_controllingPrim.LocalID, m_velocityMotor.TargetValue, m_controllingPrim.IsColliding);
211 }
212 else
213 {
214 // Supposed to be moving.
215 OMV.Vector3 stepVelocity = m_velocityMotor.CurrentValue;
216
217 if (m_controllingPrim.Friction != BSParam.AvatarFriction)
218 {
219 // Probably starting to walk. Set friction to moving friction.
220 m_controllingPrim.Friction = BSParam.AvatarFriction;
221 m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
222 }
223
224 if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding)
225 {
226 stepVelocity.Z = m_controllingPrim.RawVelocity.Z;
227 }
228
229
230 // Colliding and not flying with an upward force. The avatar must be trying to jump.
231 if (!m_controllingPrim.Flying && m_controllingPrim.IsColliding && stepVelocity.Z > 0)
232 {
233 // We allow the upward force to happen for this many frames.
234 m_jumpFrames = BSParam.AvatarJumpFrames;
235 m_jumpVelocity = stepVelocity.Z;
236 }
237
238 // The case where the avatar is not colliding and is not flying is special.
239 // The avatar is either falling or jumping and the user can be applying force to the avatar
240 // (force in some direction or force up or down).
241 // If the avatar has negative Z velocity and is not colliding, presume we're falling and keep the velocity.
242 // If the user is trying to apply upward force but we're not colliding, assume the avatar
243 // is trying to jump and don't apply the upward force if not touching the ground any more.
244 if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding)
245 {
246 // If upward velocity is being applied, this must be a jump and only allow that to go on so long
247 if (m_jumpFrames > 0)
248 {
249 // Since not touching the ground, only apply upward force for so long.
250 m_jumpFrames--;
251 stepVelocity.Z = m_jumpVelocity;
252 }
253 else
254 {
255 // Since we're not affected by anything, whatever vertical motion the avatar has, continue that.
256 stepVelocity.Z = m_controllingPrim.RawVelocity.Z;
257 }
258 // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
259 }
260
261 // 'stepVelocity' is now the speed we'd like the avatar to move in. Turn that into an instantanous force.
262 OMV.Vector3 moveForce = (stepVelocity - m_controllingPrim.RawVelocity) * m_controllingPrim.Mass;
263
264 // Add special movement force to allow avatars to walk up stepped surfaces.
265 moveForce += WalkUpStairs();
266
267 m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,move,stepVel={1},vel={2},mass={3},moveForce={4}",
268 m_controllingPrim.LocalID, stepVelocity, m_controllingPrim.RawVelocity, m_controllingPrim.Mass, moveForce);
269 m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, moveForce);
270 }
271 }
272
273 // Called just as the property update is received from the physics engine.
274 // Do any mode necessary for avatar movement.
275 private void Process_OnPreUpdateProperty(ref EntityProperties entprop)
276 {
277 // Don't change position if standing on a stationary object.
278 if (m_controllingPrim.IsStationary)
279 {
280 entprop.Position = m_controllingPrim.RawPosition;
281 m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation);
282 }
283
284 }
285
286 // Decide if the character is colliding with a low object and compute a force to pop the
287 // avatar up so it can walk up and over the low objects.
288 private OMV.Vector3 WalkUpStairs()
289 {
290 OMV.Vector3 ret = OMV.Vector3.Zero;
291
292 m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4},avHeight={5}",
293 m_controllingPrim.LocalID, m_controllingPrim.IsColliding, m_controllingPrim.Flying,
294 m_controllingPrim.TargetVelocitySpeed, m_controllingPrim.CollisionsLastTick.Count, m_controllingPrim.Size.Z);
295
296 // Check for stairs climbing if colliding, not flying and moving forward
297 if ( m_controllingPrim.IsColliding
298 && !m_controllingPrim.Flying
299 && m_controllingPrim.TargetVelocitySpeed > 0.1f )
300 {
301 // The range near the character's feet where we will consider stairs
302 // float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) + 0.05f;
303 // Note: there is a problem with the computation of the capsule height. Thus RawPosition is off
304 // from the height. Revisit size and this computation when height is scaled properly.
305 float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) - 0.05f;
306 float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight;
307
308 // Look for a collision point that is near the character's feet and is oriented the same as the charactor is.
309 // Find the highest 'good' collision.
310 OMV.Vector3 highestTouchPosition = OMV.Vector3.Zero;
311 foreach (KeyValuePair<uint, ContactPoint> kvp in m_controllingPrim.CollisionsLastTick.m_objCollisionList)
312 {
313 // Don't care about collisions with the terrain
314 if (kvp.Key > m_physicsScene.TerrainManager.HighestTerrainID)
315 {
316 BSPhysObject collisionObject;
317 if (m_physicsScene.PhysObjects.TryGetValue(kvp.Key, out collisionObject))
318 {
319 if (!collisionObject.IsVolumeDetect)
320 {
321 OMV.Vector3 touchPosition = kvp.Value.Position;
322 m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
323 m_controllingPrim.LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
324 if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
325 {
326 // This contact is within the 'near the feet' range.
327 // The normal should be our contact point to the object so it is pointing away
328 // thus the difference between our facing orientation and the normal should be small.
329 OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
330 OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
331 float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
332 if (diff < BSParam.AvatarStepApproachFactor)
333 {
334 if (highestTouchPosition.Z < touchPosition.Z)
335 highestTouchPosition = touchPosition;
336 }
337 }
338 }
339 }
340 }
341 }
342 m_walkingUpStairs = 0;
343 // If there is a good step sensing, move the avatar over the step.
344 if (highestTouchPosition != OMV.Vector3.Zero)
345 {
346 // Remember that we are going up stairs. This is needed because collisions
347 // will stop when we move up so this smoothes out that effect.
348 m_walkingUpStairs = BSParam.AvatarStepSmoothingSteps;
349
350 m_lastStepUp = highestTouchPosition.Z - nearFeetHeightMin;
351 ret = ComputeStairCorrection(m_lastStepUp);
352 m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,touchPos={1},nearFeetMin={2},ret={3}",
353 m_controllingPrim.LocalID, highestTouchPosition, nearFeetHeightMin, ret);
354 }
355 }
356 else
357 {
358 // If we used to be going up stairs but are not now, smooth the case where collision goes away while
359 // we are bouncing up the stairs.
360 if (m_walkingUpStairs > 0)
361 {
362 m_walkingUpStairs--;
363 ret = ComputeStairCorrection(m_lastStepUp);
364 }
365 }
366
367 return ret;
368 }
369
370 private OMV.Vector3 ComputeStairCorrection(float stepUp)
371 {
372 OMV.Vector3 ret = OMV.Vector3.Zero;
373 OMV.Vector3 displacement = OMV.Vector3.Zero;
374
375 if (stepUp > 0f)
376 {
377 // Found the stairs contact point. Push up a little to raise the character.
378 if (BSParam.AvatarStepForceFactor > 0f)
379 {
380 float upForce = stepUp * m_controllingPrim.Mass * BSParam.AvatarStepForceFactor;
381 ret = new OMV.Vector3(0f, 0f, upForce);
382 }
383
384 // Also move the avatar up for the new height
385 if (BSParam.AvatarStepUpCorrectionFactor > 0f)
386 {
387 // Move the avatar up related to the height of the collision
388 displacement = new OMV.Vector3(0f, 0f, stepUp * BSParam.AvatarStepUpCorrectionFactor);
389 m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
390 }
391 else
392 {
393 if (BSParam.AvatarStepUpCorrectionFactor < 0f)
394 {
395 // Move the avatar up about the specified step height
396 displacement = new OMV.Vector3(0f, 0f, BSParam.AvatarStepHeight);
397 m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
398 }
399 }
400 m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs.ComputeStairCorrection,disp={1},force={2}",
401 m_controllingPrim.LocalID, displacement, ret);
402
403 }
404 return ret;
405 }
406}
407}
408
409
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs
new file mode 100755
index 0000000..8a79809
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs
@@ -0,0 +1,173 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenSim.Region.Physics.Manager;
34
35using OMV = OpenMetaverse;
36
37namespace OpenSim.Region.Physics.BulletSPlugin
38{
39public class BSActorHover : BSActor
40{
41 private BSFMotor m_hoverMotor;
42
43 public BSActorHover(BSScene physicsScene, BSPhysObject pObj, string actorName)
44 : base(physicsScene, pObj, actorName)
45 {
46 m_hoverMotor = null;
47 m_physicsScene.DetailLog("{0},BSActorHover,constructor", m_controllingPrim.LocalID);
48 }
49
50 // BSActor.isActive
51 public override bool isActive
52 {
53 get { return Enabled; }
54 }
55
56 // Release any connections and resources used by the actor.
57 // BSActor.Dispose()
58 public override void Dispose()
59 {
60 Enabled = false;
61 }
62
63 // Called when physical parameters (properties set in Bullet) need to be re-applied.
64 // Called at taint-time.
65 // BSActor.Refresh()
66 public override void Refresh()
67 {
68 m_physicsScene.DetailLog("{0},BSActorHover,refresh", m_controllingPrim.LocalID);
69
70 // If not active any more, turn me off
71 if (!m_controllingPrim.HoverActive)
72 {
73 SetEnabled(false);
74 }
75
76 // If the object is physically active, add the hoverer prestep action
77 if (isActive)
78 {
79 ActivateHover();
80 }
81 else
82 {
83 DeactivateHover();
84 }
85 }
86
87 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
88 // Register a prestep action to restore physical requirements before the next simulation step.
89 // Called at taint-time.
90 // BSActor.RemoveDependencies()
91 public override void RemoveDependencies()
92 {
93 // Nothing to do for the hoverer since it is all software at pre-step action time.
94 }
95
96 // If a hover motor has not been created, create one and start the hovering.
97 private void ActivateHover()
98 {
99 if (m_hoverMotor == null)
100 {
101 // Turning the target on
102 m_hoverMotor = new BSFMotor("BSActorHover",
103 m_controllingPrim.HoverTau, // timeScale
104 BSMotor.Infinite, // decay time scale
105 1f // efficiency
106 );
107 m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
108 m_hoverMotor.SetCurrent(m_controllingPrim.RawPosition.Z);
109 m_hoverMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
110
111 m_physicsScene.BeforeStep += Hoverer;
112 }
113 }
114
115 private void DeactivateHover()
116 {
117 if (m_hoverMotor != null)
118 {
119 m_physicsScene.BeforeStep -= Hoverer;
120 m_hoverMotor = null;
121 }
122 }
123
124 // Called just before the simulation step. Update the vertical position for hoverness.
125 private void Hoverer(float timeStep)
126 {
127 // Don't do hovering while the object is selected.
128 if (!isActive)
129 return;
130
131 m_hoverMotor.SetCurrent(m_controllingPrim.RawPosition.Z);
132 m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
133 float targetHeight = m_hoverMotor.Step(timeStep);
134
135 // 'targetHeight' is where we'd like the Z of the prim to be at this moment.
136 // Compute the amount of force to push us there.
137 float moveForce = (targetHeight - m_controllingPrim.RawPosition.Z) * m_controllingPrim.RawMass;
138 // Undo anything the object thinks it's doing at the moment
139 moveForce = -m_controllingPrim.RawVelocity.Z * m_controllingPrim.Mass;
140
141 m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, new OMV.Vector3(0f, 0f, moveForce));
142 m_physicsScene.DetailLog("{0},BSPrim.Hover,move,targHt={1},moveForce={2},mass={3}",
143 m_controllingPrim.LocalID, targetHeight, moveForce, m_controllingPrim.RawMass);
144 }
145
146 // Based on current position, determine what we should be hovering at now.
147 // Must recompute often. What if we walked offa cliff>
148 private float ComputeCurrentHoverHeight()
149 {
150 float ret = m_controllingPrim.HoverHeight;
151 float groundHeight = m_physicsScene.TerrainManager.GetTerrainHeightAtXYZ(m_controllingPrim.RawPosition);
152
153 switch (m_controllingPrim.HoverType)
154 {
155 case PIDHoverType.Ground:
156 ret = groundHeight + m_controllingPrim.HoverHeight;
157 break;
158 case PIDHoverType.GroundAndWater:
159 float waterHeight = m_physicsScene.TerrainManager.GetWaterLevelAtXYZ(m_controllingPrim.RawPosition);
160 if (groundHeight > waterHeight)
161 {
162 ret = groundHeight + m_controllingPrim.HoverHeight;
163 }
164 else
165 {
166 ret = waterHeight + m_controllingPrim.HoverHeight;
167 }
168 break;
169 }
170 return ret;
171 }
172}
173}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs
new file mode 100755
index 0000000..8b0fdeb
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs
@@ -0,0 +1,187 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OMV = OpenMetaverse;
34
35namespace OpenSim.Region.Physics.BulletSPlugin
36{
37public class BSActorLockAxis : BSActor
38{
39 BSConstraint LockAxisConstraint = null;
40
41 public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName)
42 : base(physicsScene, pObj, actorName)
43 {
44 m_physicsScene.DetailLog("{0},BSActorLockAxis,constructor", m_controllingPrim.LocalID);
45 LockAxisConstraint = null;
46 }
47
48 // BSActor.isActive
49 public override bool isActive
50 {
51 get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
52 }
53
54 // Release any connections and resources used by the actor.
55 // BSActor.Dispose()
56 public override void Dispose()
57 {
58 RemoveAxisLockConstraint();
59 }
60
61 // Called when physical parameters (properties set in Bullet) need to be re-applied.
62 // Called at taint-time.
63 // BSActor.Refresh()
64 public override void Refresh()
65 {
66 m_physicsScene.DetailLog("{0},BSActorLockAxis,refresh,lockedAxis={1},enabled={2},pActive={3}",
67 m_controllingPrim.LocalID, m_controllingPrim.LockedAngularAxis, Enabled, m_controllingPrim.IsPhysicallyActive);
68 // If all the axis are free, we don't need to exist
69 if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree)
70 {
71 Enabled = false;
72 }
73
74 // If the object is physically active, add the axis locking constraint
75 if (isActive)
76 {
77 AddAxisLockConstraint();
78 }
79 else
80 {
81 RemoveAxisLockConstraint();
82 }
83 }
84
85 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
86 // Register a prestep action to restore physical requirements before the next simulation step.
87 // Called at taint-time.
88 // BSActor.RemoveDependencies()
89 public override void RemoveDependencies()
90 {
91 if (LockAxisConstraint != null)
92 {
93 // If a constraint is set up, remove it from the physical scene
94 RemoveAxisLockConstraint();
95 // Schedule a call before the next simulation step to restore the constraint.
96 m_physicsScene.PostTaintObject("BSActorLockAxis:" + ActorName, m_controllingPrim.LocalID, delegate()
97 {
98 Refresh();
99 });
100 }
101 }
102
103 private void AddAxisLockConstraint()
104 {
105 if (LockAxisConstraint == null)
106 {
107 // Lock that axis by creating a 6DOF constraint that has one end in the world and
108 // the other in the object.
109 // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817
110 // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380
111
112 // Remove any existing axis constraint (just to be sure)
113 RemoveAxisLockConstraint();
114
115 BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(m_physicsScene.World, m_controllingPrim.PhysBody,
116 OMV.Vector3.Zero, OMV.Quaternion.Identity,
117 false /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
118 LockAxisConstraint = axisConstrainer;
119 m_physicsScene.Constraints.AddConstraint(LockAxisConstraint);
120
121 // The constraint is tied to the world and oriented to the prim.
122
123 // Free to move linearly in the region
124 OMV.Vector3 linearLow = OMV.Vector3.Zero;
125 OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize;
126 if (m_controllingPrim.LockedLinearAxis.X != BSPhysObject.FreeAxis)
127 {
128 linearLow.X = m_controllingPrim.RawPosition.X;
129 linearHigh.X = m_controllingPrim.RawPosition.X;
130 }
131 if (m_controllingPrim.LockedLinearAxis.Y != BSPhysObject.FreeAxis)
132 {
133 linearLow.Y = m_controllingPrim.RawPosition.Y;
134 linearHigh.Y = m_controllingPrim.RawPosition.Y;
135 }
136 if (m_controllingPrim.LockedLinearAxis.Z != BSPhysObject.FreeAxis)
137 {
138 linearLow.Z = m_controllingPrim.RawPosition.Z;
139 linearHigh.Z = m_controllingPrim.RawPosition.Z;
140 }
141 axisConstrainer.SetLinearLimits(linearLow, linearHigh);
142
143 // Angular with some axis locked
144 float fPI = (float)Math.PI;
145 OMV.Vector3 angularLow = new OMV.Vector3(-fPI, -fPI, -fPI);
146 OMV.Vector3 angularHigh = new OMV.Vector3(fPI, fPI, fPI);
147 if (m_controllingPrim.LockedAngularAxis.X != BSPhysObject.FreeAxis)
148 {
149 angularLow.X = 0f;
150 angularHigh.X = 0f;
151 }
152 if (m_controllingPrim.LockedAngularAxis.Y != BSPhysObject.FreeAxis)
153 {
154 angularLow.Y = 0f;
155 angularHigh.Y = 0f;
156 }
157 if (m_controllingPrim.LockedAngularAxis.Z != BSPhysObject.FreeAxis)
158 {
159 angularLow.Z = 0f;
160 angularHigh.Z = 0f;
161 }
162 if (!axisConstrainer.SetAngularLimits(angularLow, angularHigh))
163 {
164 m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetAngularLimits", m_controllingPrim.LocalID);
165 }
166
167 m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,create,linLow={1},linHi={2},angLow={3},angHi={4}",
168 m_controllingPrim.LocalID, linearLow, linearHigh, angularLow, angularHigh);
169
170 // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo.
171 axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f);
172
173 axisConstrainer.RecomputeConstraintVariables(m_controllingPrim.RawMass);
174 }
175 }
176
177 private void RemoveAxisLockConstraint()
178 {
179 if (LockAxisConstraint != null)
180 {
181 m_physicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint);
182 LockAxisConstraint = null;
183 m_physicsScene.DetailLog("{0},BSActorLockAxis.RemoveAxisLockConstraint,destroyingConstraint", m_controllingPrim.LocalID);
184 }
185 }
186}
187}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs
new file mode 100755
index 0000000..bdf4bc0
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs
@@ -0,0 +1,219 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenSim.Region.Physics.Manager;
34
35using OMV = OpenMetaverse;
36
37namespace OpenSim.Region.Physics.BulletSPlugin
38{
39public class BSActorMoveToTarget : BSActor
40{
41 private BSVMotor m_targetMotor;
42
43 public BSActorMoveToTarget(BSScene physicsScene, BSPhysObject pObj, string actorName)
44 : base(physicsScene, pObj, actorName)
45 {
46 m_targetMotor = null;
47 m_physicsScene.DetailLog("{0},BSActorMoveToTarget,constructor", m_controllingPrim.LocalID);
48 }
49
50 // BSActor.isActive
51 public override bool isActive
52 {
53 // MoveToTarget only works on physical prims
54 get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
55 }
56
57 // Release any connections and resources used by the actor.
58 // BSActor.Dispose()
59 public override void Dispose()
60 {
61 Enabled = false;
62 }
63
64 // Called when physical parameters (properties set in Bullet) need to be re-applied.
65 // Called at taint-time.
66 // BSActor.Refresh()
67 public override void Refresh()
68 {
69 m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh,enabled={1},active={2},target={3},tau={4}",
70 m_controllingPrim.LocalID, Enabled, m_controllingPrim.MoveToTargetActive,
71 m_controllingPrim.MoveToTargetTarget, m_controllingPrim.MoveToTargetTau );
72
73 // If not active any more...
74 if (!m_controllingPrim.MoveToTargetActive)
75 {
76 Enabled = false;
77 }
78
79 if (isActive)
80 {
81 ActivateMoveToTarget();
82 }
83 else
84 {
85 DeactivateMoveToTarget();
86 }
87 }
88
89 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
90 // Register a prestep action to restore physical requirements before the next simulation step.
91 // Called at taint-time.
92 // BSActor.RemoveDependencies()
93 public override void RemoveDependencies()
94 {
95 // Nothing to do for the moveToTarget since it is all software at pre-step action time.
96 }
97
98 // If a hover motor has not been created, create one and start the hovering.
99 private void ActivateMoveToTarget()
100 {
101 if (m_targetMotor == null)
102 {
103 // We're taking over after this.
104 m_controllingPrim.ZeroMotion(true);
105
106 /* Someday use the PID controller
107 m_targetMotor = new BSPIDVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString());
108 m_targetMotor.TimeScale = m_controllingPrim.MoveToTargetTau;
109 m_targetMotor.Efficiency = 1f;
110 */
111 m_targetMotor = new BSVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString(),
112 m_controllingPrim.MoveToTargetTau, // timeScale
113 BSMotor.Infinite, // decay time scale
114 1f // efficiency
115 );
116 m_targetMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
117 m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
118 m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
119
120 // m_physicsScene.BeforeStep += Mover;
121 m_physicsScene.BeforeStep += Mover2;
122 }
123 else
124 {
125 // If already allocated, make sure the target and other paramters are current
126 m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
127 m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
128 }
129 }
130
131 private void DeactivateMoveToTarget()
132 {
133 if (m_targetMotor != null)
134 {
135 // m_physicsScene.BeforeStep -= Mover;
136 m_physicsScene.BeforeStep -= Mover2;
137 m_targetMotor = null;
138 }
139 }
140
141 // Origional mover that set the objects position to move to the target.
142 // The problem was that gravity would keep trying to push the object down so
143 // the overall downward velocity would increase to infinity.
144 // Called just before the simulation step.
145 private void Mover(float timeStep)
146 {
147 // Don't do hovering while the object is selected.
148 if (!isActive)
149 return;
150
151 OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
152
153 // 'movePosition' is where we'd like the prim to be at this moment.
154 OMV.Vector3 movePosition = m_controllingPrim.RawPosition + m_targetMotor.Step(timeStep);
155
156 // If we are very close to our target, turn off the movement motor.
157 if (m_targetMotor.ErrorIsZero())
158 {
159 m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,zeroMovement,movePos={1},pos={2},mass={3}",
160 m_controllingPrim.LocalID, movePosition, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
161 m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
162 m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
163 // Setting the position does not cause the physics engine to generate a property update. Force it.
164 m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
165 }
166 else
167 {
168 m_controllingPrim.ForcePosition = movePosition;
169 // Setting the position does not cause the physics engine to generate a property update. Force it.
170 m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
171 }
172 m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,move,fromPos={1},movePos={2}",
173 m_controllingPrim.LocalID, origPosition, movePosition);
174 }
175
176 // Version of mover that applies forces to move the physical object to the target.
177 // Also overcomes gravity so the object doesn't just drop to the ground.
178 // Called just before the simulation step.
179 private void Mover2(float timeStep)
180 {
181 // Don't do hovering while the object is selected.
182 if (!isActive)
183 return;
184
185 OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
186 OMV.Vector3 addedForce = OMV.Vector3.Zero;
187
188 // CorrectionVector is the movement vector required this step
189 OMV.Vector3 correctionVector = m_targetMotor.Step(timeStep, m_controllingPrim.RawPosition);
190
191 // If we are very close to our target, turn off the movement motor.
192 if (m_targetMotor.ErrorIsZero())
193 {
194 m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,zeroMovement,pos={1},mass={2}",
195 m_controllingPrim.LocalID, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
196 m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
197 m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
198 // Setting the position does not cause the physics engine to generate a property update. Force it.
199 m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
200 }
201 else
202 {
203 // First force to move us there -- the motor return a timestep scaled value.
204 addedForce = correctionVector / timeStep;
205 // Remove the existing velocity (only the moveToTarget force counts)
206 addedForce -= m_controllingPrim.RawVelocity;
207 // Overcome gravity.
208 addedForce -= m_controllingPrim.Gravity;
209
210 // Add enough force to overcome the mass of the object
211 addedForce *= m_controllingPrim.Mass;
212
213 m_controllingPrim.AddForce(addedForce, false /* pushForce */, true /* inTaintTime */);
214 }
215 m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}",
216 m_controllingPrim.LocalID, origPosition, addedForce);
217 }
218}
219}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs
new file mode 100755
index 0000000..96fa0b6
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs
@@ -0,0 +1,137 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenSim.Region.Physics.Manager;
34
35using OMV = OpenMetaverse;
36
37namespace OpenSim.Region.Physics.BulletSPlugin
38{
39public class BSActorSetForce : BSActor
40{
41 BSFMotor m_forceMotor;
42
43 public BSActorSetForce(BSScene physicsScene, BSPhysObject pObj, string actorName)
44 : base(physicsScene, pObj, actorName)
45 {
46 m_forceMotor = null;
47 m_physicsScene.DetailLog("{0},BSActorSetForce,constructor", m_controllingPrim.LocalID);
48 }
49
50 // BSActor.isActive
51 public override bool isActive
52 {
53 get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
54 }
55
56 // Release any connections and resources used by the actor.
57 // BSActor.Dispose()
58 public override void Dispose()
59 {
60 Enabled = false;
61 }
62
63 // Called when physical parameters (properties set in Bullet) need to be re-applied.
64 // Called at taint-time.
65 // BSActor.Refresh()
66 public override void Refresh()
67 {
68 m_physicsScene.DetailLog("{0},BSActorSetForce,refresh", m_controllingPrim.LocalID);
69
70 // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
71 if (m_controllingPrim.RawForce == OMV.Vector3.Zero)
72 {
73 m_physicsScene.DetailLog("{0},BSActorSetForce,refresh,notSetForce,removing={1}", m_controllingPrim.LocalID, ActorName);
74 Enabled = false;
75 return;
76 }
77
78 // If the object is physically active, add the hoverer prestep action
79 if (isActive)
80 {
81 ActivateSetForce();
82 }
83 else
84 {
85 DeactivateSetForce();
86 }
87 }
88
89 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
90 // Register a prestep action to restore physical requirements before the next simulation step.
91 // Called at taint-time.
92 // BSActor.RemoveDependencies()
93 public override void RemoveDependencies()
94 {
95 // Nothing to do for the hoverer since it is all software at pre-step action time.
96 }
97
98 // If a hover motor has not been created, create one and start the hovering.
99 private void ActivateSetForce()
100 {
101 if (m_forceMotor == null)
102 {
103 // A fake motor that might be used someday
104 m_forceMotor = new BSFMotor("setForce", 1f, 1f, 1f);
105
106 m_physicsScene.BeforeStep += Mover;
107 }
108 }
109
110 private void DeactivateSetForce()
111 {
112 if (m_forceMotor != null)
113 {
114 m_physicsScene.BeforeStep -= Mover;
115 m_forceMotor = null;
116 }
117 }
118
119 // Called just before the simulation step. Update the vertical position for hoverness.
120 private void Mover(float timeStep)
121 {
122 // Don't do force while the object is selected.
123 if (!isActive)
124 return;
125
126 m_physicsScene.DetailLog("{0},BSActorSetForce,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawForce);
127 if (m_controllingPrim.PhysBody.HasPhysicalBody)
128 {
129 m_physicsScene.PE.ApplyCentralForce(m_controllingPrim.PhysBody, m_controllingPrim.RawForce);
130 m_controllingPrim.ActivateIfPhysical(false);
131 }
132
133 // TODO:
134 }
135}
136}
137
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs
new file mode 100755
index 0000000..65098e1
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs
@@ -0,0 +1,138 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Linq;
31using System.Text;
32
33using OpenSim.Region.Physics.Manager;
34
35using OMV = OpenMetaverse;
36
37namespace OpenSim.Region.Physics.BulletSPlugin
38{
39public class BSActorSetTorque : BSActor
40{
41 BSFMotor m_torqueMotor;
42
43 public BSActorSetTorque(BSScene physicsScene, BSPhysObject pObj, string actorName)
44 : base(physicsScene, pObj, actorName)
45 {
46 m_torqueMotor = null;
47 m_physicsScene.DetailLog("{0},BSActorSetTorque,constructor", m_controllingPrim.LocalID);
48 }
49
50 // BSActor.isActive
51 public override bool isActive
52 {
53 get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
54 }
55
56 // Release any connections and resources used by the actor.
57 // BSActor.Dispose()
58 public override void Dispose()
59 {
60 Enabled = false;
61 }
62
63 // Called when physical parameters (properties set in Bullet) need to be re-applied.
64 // Called at taint-time.
65 // BSActor.Refresh()
66 public override void Refresh()
67 {
68 m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,torque={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
69
70 // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
71 if (m_controllingPrim.RawTorque == OMV.Vector3.Zero)
72 {
73 m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,notSetTorque,disabling={1}", m_controllingPrim.LocalID, ActorName);
74 Enabled = false;
75 return;
76 }
77
78 // If the object is physically active, add the hoverer prestep action
79 if (isActive)
80 {
81 ActivateSetTorque();
82 }
83 else
84 {
85 DeactivateSetTorque();
86 }
87 }
88
89 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
90 // Register a prestep action to restore physical requirements before the next simulation step.
91 // Called at taint-time.
92 // BSActor.RemoveDependencies()
93 public override void RemoveDependencies()
94 {
95 // Nothing to do for the hoverer since it is all software at pre-step action time.
96 }
97
98 // If a hover motor has not been created, create one and start the hovering.
99 private void ActivateSetTorque()
100 {
101 if (m_torqueMotor == null)
102 {
103 // A fake motor that might be used someday
104 m_torqueMotor = new BSFMotor("setTorque", 1f, 1f, 1f);
105
106 m_physicsScene.BeforeStep += Mover;
107 }
108 }
109
110 private void DeactivateSetTorque()
111 {
112 if (m_torqueMotor != null)
113 {
114 m_physicsScene.BeforeStep -= Mover;
115 m_torqueMotor = null;
116 }
117 }
118
119 // Called just before the simulation step. Update the vertical position for hoverness.
120 private void Mover(float timeStep)
121 {
122 // Don't do force while the object is selected.
123 if (!isActive)
124 return;
125
126 m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
127 if (m_controllingPrim.PhysBody.HasPhysicalBody)
128 {
129 m_controllingPrim.AddAngularForce(m_controllingPrim.RawTorque, false, true);
130 m_controllingPrim.ActivateIfPhysical(false);
131 }
132
133 // TODO:
134 }
135}
136}
137
138
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs
new file mode 100755
index 0000000..e0ccc50
--- /dev/null
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs
@@ -0,0 +1,156 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Collections.Generic;
29using System.Text;
30
31namespace OpenSim.Region.Physics.BulletSPlugin
32{
33public class BSActorCollection
34{
35 private BSScene m_physicsScene { get; set; }
36 private Dictionary<string, BSActor> m_actors;
37
38 public BSActorCollection(BSScene physicsScene)
39 {
40 m_physicsScene = physicsScene;
41 m_actors = new Dictionary<string, BSActor>();
42 }
43 public void Add(string name, BSActor actor)
44 {
45 lock (m_actors)
46 {
47 if (!m_actors.ContainsKey(name))
48 {
49 m_actors[name] = actor;
50 }
51 }
52 }
53 public bool RemoveAndRelease(string name)
54 {
55 bool ret = false;
56 lock (m_actors)
57 {
58 if (m_actors.ContainsKey(name))
59 {
60 BSActor beingRemoved = m_actors[name];
61 m_actors.Remove(name);
62 beingRemoved.Dispose();
63 ret = true;
64 }
65 }
66 return ret;
67 }
68 public void Clear()
69 {
70 lock (m_actors)
71 {
72 ForEachActor(a => a.Dispose());
73 m_actors.Clear();
74 }
75 }
76 public void Dispose()
77 {
78 Clear();
79 }
80 public bool HasActor(string name)
81 {
82 return m_actors.ContainsKey(name);
83 }
84 public bool TryGetActor(string actorName, out BSActor theActor)
85 {
86 return m_actors.TryGetValue(actorName, out theActor);
87 }
88 public void ForEachActor(Action<BSActor> act)
89 {
90 lock (m_actors)
91 {
92 foreach (KeyValuePair<string, BSActor> kvp in m_actors)
93 act(kvp.Value);
94 }
95 }
96
97 public void Enable(bool enabl)
98 {
99 ForEachActor(a => a.SetEnabled(enabl));
100 }
101 public void Refresh()
102 {
103 ForEachActor(a => a.Refresh());
104 }
105 public void RemoveDependencies()
106 {
107 ForEachActor(a => a.RemoveDependencies());
108 }
109}
110
111// =============================================================================
112/// <summary>
113/// Each physical object can have 'actors' who are pushing the object around.
114/// This can be used for hover, locking axis, making vehicles, etc.
115/// Each physical object can have multiple actors acting on it.
116///
117/// An actor usually registers itself with physics scene events (pre-step action)
118/// and modifies the parameters on the host physical object.
119/// </summary>
120public abstract class BSActor
121{
122 protected BSScene m_physicsScene { get; private set; }
123 protected BSPhysObject m_controllingPrim { get; private set; }
124 public virtual bool Enabled { get; set; }
125 public string ActorName { get; private set; }
126
127 public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName)
128 {
129 m_physicsScene = physicsScene;
130 m_controllingPrim = pObj;
131 ActorName = actorName;
132 Enabled = true;
133 }
134
135 // Return 'true' if activily updating the prim
136 public virtual bool isActive
137 {
138 get { return Enabled; }
139 }
140
141 // Turn the actor on an off. Only used by ActorCollection to set all enabled/disabled.
142 // Anyone else should assign true/false to 'Enabled'.
143 public void SetEnabled(bool setEnabled)
144 {
145 Enabled = setEnabled;
146 }
147 // Release any connections and resources used by the actor.
148 public abstract void Dispose();
149 // Called when physical parameters (properties set in Bullet) need to be re-applied.
150 public abstract void Refresh();
151 // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
152 // Register a prestep action to restore physical requirements before the next simulation step.
153 public abstract void RemoveDependencies();
154
155}
156}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs b/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs
index 5765b0d..6cdc112 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs
@@ -70,6 +70,8 @@ public enum BSPhysicsShapeType
70 SHAPE_COMPOUND = 22, 70 SHAPE_COMPOUND = 22,
71 SHAPE_HEIGHTMAP = 23, 71 SHAPE_HEIGHTMAP = 23,
72 SHAPE_AVATAR = 24, 72 SHAPE_AVATAR = 24,
73 SHAPE_CONVEXHULL= 25,
74 SHAPE_GIMPACT = 26,
73}; 75};
74 76
75// The native shapes have predefined shape hash keys 77// The native shapes have predefined shape hash keys
@@ -191,6 +193,21 @@ public struct ConfigurationParameters
191 public const float numericFalse = 0f; 193 public const float numericFalse = 0f;
192} 194}
193 195
196// Parameters passed for the conversion of a mesh to a hull using Bullet's HACD library.
197[StructLayout(LayoutKind.Sequential)]
198public struct HACDParams
199{
200 // usual default values
201 public float maxVerticesPerHull; // 100
202 public float minClusters; // 2
203 public float compacityWeight; // 0.1
204 public float volumeWeight; // 0.0
205 public float concavity; // 100
206 public float addExtraDistPoints; // false
207 public float addNeighboursDistPoints; // false
208 public float addFacesPoints; // false
209 public float shouldAdjustCollisionMargin; // false
210}
194 211
195// The states a bullet collision object can have 212// The states a bullet collision object can have
196public enum ActivationState : uint 213public enum ActivationState : uint
@@ -282,7 +299,7 @@ public abstract class BSAPITemplate
282{ 299{
283// Returns the name of the underlying Bullet engine 300// Returns the name of the underlying Bullet engine
284public abstract string BulletEngineName { get; } 301public abstract string BulletEngineName { get; }
285public abstract string BulletEngineVersion { get; protected set;} 302public abstract string BulletEngineVersion { get; protected set;}
286 303
287// Initialization and simulation 304// Initialization and simulation
288public abstract BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms, 305public abstract BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
@@ -305,10 +322,20 @@ public abstract BulletShape CreateMeshShape(BulletWorld world,
305 int indicesCount, int[] indices, 322 int indicesCount, int[] indices,
306 int verticesCount, float[] vertices ); 323 int verticesCount, float[] vertices );
307 324
325public abstract BulletShape CreateGImpactShape(BulletWorld world,
326 int indicesCount, int[] indices,
327 int verticesCount, float[] vertices );
328
308public abstract BulletShape CreateHullShape(BulletWorld world, 329public abstract BulletShape CreateHullShape(BulletWorld world,
309 int hullCount, float[] hulls); 330 int hullCount, float[] hulls);
310 331
311public abstract BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape); 332public abstract BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms);
333
334public abstract BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape);
335
336public abstract BulletShape CreateConvexHullShape(BulletWorld world,
337 int indicesCount, int[] indices,
338 int verticesCount, float[] vertices );
312 339
313public abstract BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData); 340public abstract BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData);
314 341
@@ -351,7 +378,7 @@ public abstract void DestroyObject(BulletWorld sim, BulletBody obj);
351// ===================================================================================== 378// =====================================================================================
352public abstract BulletShape CreateGroundPlaneShape(UInt32 id, float height, float collisionMargin); 379public abstract BulletShape CreateGroundPlaneShape(UInt32 id, float height, float collisionMargin);
353 380
354public abstract BulletShape CreateTerrainShape(UInt32 id, Vector3 size, float minHeight, float maxHeight, float[] heightMap, 381public abstract BulletShape CreateTerrainShape(UInt32 id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
355 float scaleFactor, float collisionMargin); 382 float scaleFactor, float collisionMargin);
356 383
357// ===================================================================================== 384// =====================================================================================
@@ -366,7 +393,7 @@ public abstract BulletConstraint Create6DofConstraintToPoint(BulletWorld world,
366 bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies); 393 bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
367 394
368public abstract BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1, 395public abstract BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1,
369 Vector3 frameInBloc, Quaternion frameInBrot, 396 Vector3 frameInBloc, Quaternion frameInBrot,
370 bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies); 397 bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies);
371 398
372public abstract BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2, 399public abstract BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 90c2d9c..291dfcd 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -43,15 +43,10 @@ public sealed class BSCharacter : BSPhysObject
43 private OMV.Vector3 _size; 43 private OMV.Vector3 _size;
44 private bool _grabbed; 44 private bool _grabbed;
45 private bool _selected; 45 private bool _selected;
46 private OMV.Vector3 _position;
47 private float _mass; 46 private float _mass;
48 private float _avatarVolume; 47 private float _avatarVolume;
49 private OMV.Vector3 _force;
50 private OMV.Vector3 _velocity;
51 private OMV.Vector3 _torque;
52 private float _collisionScore; 48 private float _collisionScore;
53 private OMV.Vector3 _acceleration; 49 private OMV.Vector3 _acceleration;
54 private OMV.Quaternion _orientation;
55 private int _physicsActorType; 50 private int _physicsActorType;
56 private bool _isPhysical; 51 private bool _isPhysical;
57 private bool _flying; 52 private bool _flying;
@@ -62,28 +57,25 @@ public sealed class BSCharacter : BSPhysObject
62 private bool _kinematic; 57 private bool _kinematic;
63 private float _buoyancy; 58 private float _buoyancy;
64 59
65 private BSVMotor _velocityMotor; 60 private BSActorAvatarMove m_moveActor;
61 private const string AvatarMoveActorName = "BSCharacter.AvatarMove";
66 62
67 private OMV.Vector3 _PIDTarget; 63 private OMV.Vector3 _PIDTarget;
68 private bool _usePID; 64 private bool _usePID;
69 private float _PIDTau; 65 private float _PIDTau;
70 private bool _useHoverPID;
71 private float _PIDHoverHeight;
72 private PIDHoverType _PIDHoverType;
73 private float _PIDHoverTao;
74 66
75 public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) 67 public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying)
76 : base(parent_scene, localID, avName, "BSCharacter") 68 : base(parent_scene, localID, avName, "BSCharacter")
77 { 69 {
78 _physicsActorType = (int)ActorTypes.Agent; 70 _physicsActorType = (int)ActorTypes.Agent;
79 _position = pos; 71 RawPosition = pos;
80 72
81 _flying = isFlying; 73 _flying = isFlying;
82 _orientation = OMV.Quaternion.Identity; 74 RawOrientation = OMV.Quaternion.Identity;
83 _velocity = OMV.Vector3.Zero; 75 RawVelocity = OMV.Vector3.Zero;
84 _buoyancy = ComputeBuoyancyFromFlying(isFlying); 76 _buoyancy = ComputeBuoyancyFromFlying(isFlying);
85 Friction = BSParam.AvatarStandingFriction; 77 Friction = BSParam.AvatarStandingFriction;
86 Density = BSParam.AvatarDensity / BSParam.DensityScaleFactor; 78 Density = BSParam.AvatarDensity;
87 79
88 // Old versions of ScenePresence passed only the height. If width and/or depth are zero, 80 // Old versions of ScenePresence passed only the height. If width and/or depth are zero,
89 // replace with the default values. 81 // replace with the default values.
@@ -97,19 +89,26 @@ public sealed class BSCharacter : BSPhysObject
97 // set _avatarVolume and _mass based on capsule size, _density and Scale 89 // set _avatarVolume and _mass based on capsule size, _density and Scale
98 ComputeAvatarVolumeAndMass(); 90 ComputeAvatarVolumeAndMass();
99 91
100 SetupMovementMotor(); 92 DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5},pos={6}",
101 93 LocalID, _size, Scale, Density, _avatarVolume, RawMass, pos);
102 DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5}",
103 LocalID, _size, Scale, Density, _avatarVolume, RawMass);
104 94
105 // do actual creation in taint time 95 // do actual creation in taint time
106 PhysicsScene.TaintedObject("BSCharacter.create", delegate() 96 PhysScene.TaintedObject("BSCharacter.create", delegate()
107 { 97 {
108 DetailLog("{0},BSCharacter.create,taint", LocalID); 98 DetailLog("{0},BSCharacter.create,taint", LocalID);
109 // New body and shape into PhysBody and PhysShape 99 // New body and shape into PhysBody and PhysShape
110 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this); 100 PhysScene.Shapes.GetBodyAndShape(true, PhysScene.World, this);
101
102 // The avatar's movement is controlled by this motor that speeds up and slows down
103 // the avatar seeking to reach the motor's target speed.
104 // This motor runs as a prestep action for the avatar so it will keep the avatar
105 // standing as well as moving. Destruction of the avatar will destroy the pre-step action.
106 m_moveActor = new BSActorAvatarMove(PhysScene, this, AvatarMoveActorName);
107 PhysicalActors.Add(AvatarMoveActorName, m_moveActor);
111 108
112 SetPhysicalProperties(); 109 SetPhysicalProperties();
110
111 IsInitialized = true;
113 }); 112 });
114 return; 113 return;
115 } 114 }
@@ -117,217 +116,68 @@ public sealed class BSCharacter : BSPhysObject
117 // called when this character is being destroyed and the resources should be released 116 // called when this character is being destroyed and the resources should be released
118 public override void Destroy() 117 public override void Destroy()
119 { 118 {
119 IsInitialized = false;
120
120 base.Destroy(); 121 base.Destroy();
121 122
122 DetailLog("{0},BSCharacter.Destroy", LocalID); 123 DetailLog("{0},BSCharacter.Destroy", LocalID);
123 PhysicsScene.TaintedObject("BSCharacter.destroy", delegate() 124 PhysScene.TaintedObject("BSCharacter.destroy", delegate()
124 { 125 {
125 PhysicsScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */); 126 PhysScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */);
126 PhysBody.Clear(); 127 PhysBody.Clear();
127 PhysicsScene.Shapes.DereferenceShape(PhysShape, null /* bodyCallback */); 128 PhysShape.Dereference(PhysScene);
128 PhysShape.Clear(); 129 PhysShape = new BSShapeNull();
129 }); 130 });
130 } 131 }
131 132
132 private void SetPhysicalProperties() 133 private void SetPhysicalProperties()
133 { 134 {
134 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, PhysBody); 135 PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
135 136
136 ZeroMotion(true); 137 ZeroMotion(true);
137 ForcePosition = _position; 138 ForcePosition = RawPosition;
138 139
139 // Set the velocity 140 // Set the velocity
140 _velocityMotor.Reset(); 141 if (m_moveActor != null)
141 _velocityMotor.SetTarget(_velocity); 142 m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false);
142 _velocityMotor.SetCurrent(_velocity); 143
143 ForceVelocity = _velocity; 144 ForceVelocity = RawVelocity;
144 145
145 // This will enable or disable the flying buoyancy of the avatar. 146 // This will enable or disable the flying buoyancy of the avatar.
146 // Needs to be reset especially when an avatar is recreated after crossing a region boundry. 147 // Needs to be reset especially when an avatar is recreated after crossing a region boundry.
147 Flying = _flying; 148 Flying = _flying;
148 149
149 PhysicsScene.PE.SetRestitution(PhysBody, BSParam.AvatarRestitution); 150 PhysScene.PE.SetRestitution(PhysBody, BSParam.AvatarRestitution);
150 PhysicsScene.PE.SetMargin(PhysShape, PhysicsScene.Params.collisionMargin); 151 PhysScene.PE.SetMargin(PhysShape.physShapeInfo, PhysScene.Params.collisionMargin);
151 PhysicsScene.PE.SetLocalScaling(PhysShape, Scale); 152 PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
152 PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold); 153 PhysScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
153 if (BSParam.CcdMotionThreshold > 0f) 154 if (BSParam.CcdMotionThreshold > 0f)
154 { 155 {
155 PhysicsScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold); 156 PhysScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
156 PhysicsScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius); 157 PhysScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
157 } 158 }
158 159
159 UpdatePhysicalMassProperties(RawMass, false); 160 UpdatePhysicalMassProperties(RawMass, false);
160 161
161 // Make so capsule does not fall over 162 // Make so capsule does not fall over
162 PhysicsScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero); 163 PhysScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero);
164
165 // The avatar mover sets some parameters.
166 PhysicalActors.Refresh();
163 167
164 PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT); 168 PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT);
165 169
166 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, PhysBody); 170 PhysScene.PE.AddObjectToWorld(PhysScene.World, PhysBody);
167 171
168 // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG); 172 // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG);
169 PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_DEACTIVATION); 173 PhysScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_DEACTIVATION);
170 PhysicsScene.PE.UpdateSingleAabb(PhysicsScene.World, PhysBody); 174 PhysScene.PE.UpdateSingleAabb(PhysScene.World, PhysBody);
171 175
172 // Do this after the object has been added to the world 176 // Do this after the object has been added to the world
173 PhysBody.collisionType = CollisionType.Avatar; 177 PhysBody.collisionType = CollisionType.Avatar;
174 PhysBody.ApplyCollisionMask(PhysicsScene); 178 PhysBody.ApplyCollisionMask(PhysScene);
175 }
176
177 // The avatar's movement is controlled by this motor that speeds up and slows down
178 // the avatar seeking to reach the motor's target speed.
179 // This motor runs as a prestep action for the avatar so it will keep the avatar
180 // standing as well as moving. Destruction of the avatar will destroy the pre-step action.
181 private void SetupMovementMotor()
182 {
183 // Infinite decay and timescale values so motor only changes current to target values.
184 _velocityMotor = new BSVMotor("BSCharacter.Velocity",
185 0.2f, // time scale
186 BSMotor.Infinite, // decay time scale
187 BSMotor.InfiniteVector, // friction timescale
188 1f // efficiency
189 );
190 // _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
191
192 RegisterPreStepAction("BSCharactor.Movement", LocalID, delegate(float timeStep)
193 {
194 // TODO: Decide if the step parameters should be changed depending on the avatar's
195 // state (flying, colliding, ...). There is code in ODE to do this.
196
197 // COMMENTARY: when the user is making the avatar walk, except for falling, the velocity
198 // specified for the avatar is the one that should be used. For falling, if the avatar
199 // is not flying and is not colliding then it is presumed to be falling and the Z
200 // component is not fooled with (thus allowing gravity to do its thing).
201 // When the avatar is standing, though, the user has specified a velocity of zero and
202 // the avatar should be standing. But if the avatar is pushed by something in the world
203 // (raising elevator platform, moving vehicle, ...) the avatar should be allowed to
204 // move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
205 // errors can creap in and the avatar will slowly float off in some direction.
206 // So, the problem is that, when an avatar is standing, we cannot tell creaping error
207 // from real pushing.
208 // The code below uses whether the collider is static or moving to decide whether to zero motion.
209
210 _velocityMotor.Step(timeStep);
211
212 // If we're not supposed to be moving, make sure things are zero.
213 if (_velocityMotor.ErrorIsZero() && _velocityMotor.TargetValue == OMV.Vector3.Zero)
214 {
215 // The avatar shouldn't be moving
216 _velocityMotor.Zero();
217
218 if (IsColliding)
219 {
220 // If we are colliding with a stationary object, presume we're standing and don't move around
221 if (!ColliderIsMoving)
222 {
223 DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", LocalID);
224 ZeroMotion(true /* inTaintTime */);
225 }
226
227 // Standing has more friction on the ground
228 if (Friction != BSParam.AvatarStandingFriction)
229 {
230 Friction = BSParam.AvatarStandingFriction;
231 PhysicsScene.PE.SetFriction(PhysBody, Friction);
232 }
233 }
234 else
235 {
236 if (Flying)
237 {
238 // Flying and not collising and velocity nearly zero.
239 ZeroMotion(true /* inTaintTime */);
240 }
241 }
242
243 DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1},colliding={2}", LocalID, _velocityMotor.TargetValue, IsColliding);
244 }
245 else
246 {
247 // Supposed to be moving.
248 OMV.Vector3 stepVelocity = _velocityMotor.CurrentValue;
249
250 if (Friction != BSParam.AvatarFriction)
251 {
252 // Probably starting up walking. Set friction to moving friction.
253 Friction = BSParam.AvatarFriction;
254 PhysicsScene.PE.SetFriction(PhysBody, Friction);
255 }
256
257 // If falling, we keep the world's downward vector no matter what the other axis specify.
258 // The check for _velocity.Z < 0 makes jumping work (temporary upward force).
259 if (!Flying && !IsColliding)
260 {
261 if (_velocity.Z < 0)
262 stepVelocity.Z = _velocity.Z;
263 // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
264 }
265
266 // 'stepVelocity' is now the speed we'd like the avatar to move in. Turn that into an instantanous force.
267 OMV.Vector3 moveForce = (stepVelocity - _velocity) * Mass;
268
269 // Should we check for move force being small and forcing velocity to zero?
270
271 // Add special movement force to allow avatars to walk up stepped surfaces.
272 moveForce += WalkUpStairs();
273
274 DetailLog("{0},BSCharacter.MoveMotor,move,stepVel={1},vel={2},mass={3},moveForce={4}", LocalID, stepVelocity, _velocity, Mass, moveForce);
275 PhysicsScene.PE.ApplyCentralImpulse(PhysBody, moveForce);
276 }
277 });
278 } 179 }
279 180
280 // Decide if the character is colliding with a low object and compute a force to pop the
281 // avatar up so it can walk up and over the low objects.
282 private OMV.Vector3 WalkUpStairs()
283 {
284 OMV.Vector3 ret = OMV.Vector3.Zero;
285
286 // This test is done if moving forward, not flying and is colliding with something.
287 // DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4}",
288 // LocalID, IsColliding, Flying, TargetSpeed, CollisionsLastTick.Count);
289 if (IsColliding && !Flying && TargetVelocitySpeed > 0.1f /* && ForwardSpeed < 0.1f */)
290 {
291 // The range near the character's feet where we will consider stairs
292 float nearFeetHeightMin = RawPosition.Z - (Size.Z / 2f) + 0.05f;
293 float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight;
294
295 // Look for a collision point that is near the character's feet and is oriented the same as the charactor is
296 foreach (KeyValuePair<uint, ContactPoint> kvp in CollisionsLastTick.m_objCollisionList)
297 {
298 // Don't care about collisions with the terrain
299 if (kvp.Key > PhysicsScene.TerrainManager.HighestTerrainID)
300 {
301 OMV.Vector3 touchPosition = kvp.Value.Position;
302 // DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
303 // LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
304 if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
305 {
306 // This contact is within the 'near the feet' range.
307 // The normal should be our contact point to the object so it is pointing away
308 // thus the difference between our facing orientation and the normal should be small.
309 OMV.Vector3 directionFacing = OMV.Vector3.UnitX * RawOrientation;
310 OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
311 float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
312 if (diff < BSParam.AvatarStepApproachFactor)
313 {
314 // Found the stairs contact point. Push up a little to raise the character.
315 float upForce = (touchPosition.Z - nearFeetHeightMin) * Mass * BSParam.AvatarStepForceFactor;
316 ret = new OMV.Vector3(0f, 0f, upForce);
317
318 // Also move the avatar up for the new height
319 OMV.Vector3 displacement = new OMV.Vector3(0f, 0f, BSParam.AvatarStepHeight / 2f);
320 ForcePosition = RawPosition + displacement;
321 }
322 DetailLog("{0},BSCharacter.WalkUpStairs,touchPos={1},nearFeetMin={2},faceDir={3},norm={4},diff={5},ret={6}",
323 LocalID, touchPosition, nearFeetHeightMin, directionFacing, touchNormal, diff, ret);
324 }
325 }
326 }
327 }
328
329 return ret;
330 }
331 181
332 public override void RequestPhysicsterseUpdate() 182 public override void RequestPhysicsterseUpdate()
333 { 183 {
@@ -344,6 +194,10 @@ public sealed class BSCharacter : BSPhysObject
344 } 194 }
345 195
346 set { 196 set {
197 // This is how much the avatar size is changing. Positive means getting bigger.
198 // The avatar altitude must be adjusted for this change.
199 float heightChange = value.Z - _size.Z;
200
347 _size = value; 201 _size = value;
348 // Old versions of ScenePresence passed only the height. If width and/or depth are zero, 202 // Old versions of ScenePresence passed only the height. If width and/or depth are zero,
349 // replace with the default values. 203 // replace with the default values.
@@ -355,14 +209,18 @@ public sealed class BSCharacter : BSPhysObject
355 DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}", 209 DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}",
356 LocalID, _size, Scale, Density, _avatarVolume, RawMass); 210 LocalID, _size, Scale, Density, _avatarVolume, RawMass);
357 211
358 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() 212 PhysScene.TaintedObject("BSCharacter.setSize", delegate()
359 { 213 {
360 if (PhysBody.HasPhysicalBody && PhysShape.HasPhysicalShape) 214 if (PhysBody.HasPhysicalBody && PhysShape.physShapeInfo.HasPhysicalShape)
361 { 215 {
362 PhysicsScene.PE.SetLocalScaling(PhysShape, Scale); 216 PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
363 UpdatePhysicalMassProperties(RawMass, true); 217 UpdatePhysicalMassProperties(RawMass, true);
218
219 // Adjust the avatar's position to account for the increase/decrease in size
220 ForcePosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, RawPosition.Z + heightChange / 2f);
221
364 // Make sure this change appears as a property update event 222 // Make sure this change appears as a property update event
365 PhysicsScene.PE.PushUpdate(PhysBody); 223 PhysScene.PE.PushUpdate(PhysBody);
366 } 224 }
367 }); 225 });
368 226
@@ -373,11 +231,6 @@ public sealed class BSCharacter : BSPhysObject
373 { 231 {
374 set { BaseShape = value; } 232 set { BaseShape = value; }
375 } 233 }
376 // I want the physics engine to make an avatar capsule
377 public override BSPhysicsShapeType PreferredPhysicalShape
378 {
379 get {return BSPhysicsShapeType.SHAPE_CAPSULE; }
380 }
381 234
382 public override bool Grabbed { 235 public override bool Grabbed {
383 set { _grabbed = value; } 236 set { _grabbed = value; }
@@ -399,29 +252,29 @@ public sealed class BSCharacter : BSPhysObject
399 // Called at taint time! 252 // Called at taint time!
400 public override void ZeroMotion(bool inTaintTime) 253 public override void ZeroMotion(bool inTaintTime)
401 { 254 {
402 _velocity = OMV.Vector3.Zero; 255 RawVelocity = OMV.Vector3.Zero;
403 _acceleration = OMV.Vector3.Zero; 256 _acceleration = OMV.Vector3.Zero;
404 _rotationalVelocity = OMV.Vector3.Zero; 257 _rotationalVelocity = OMV.Vector3.Zero;
405 258
406 // Zero some other properties directly into the physics engine 259 // Zero some other properties directly into the physics engine
407 PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() 260 PhysScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate()
408 { 261 {
409 if (PhysBody.HasPhysicalBody) 262 if (PhysBody.HasPhysicalBody)
410 PhysicsScene.PE.ClearAllForces(PhysBody); 263 PhysScene.PE.ClearAllForces(PhysBody);
411 }); 264 });
412 } 265 }
413 public override void ZeroAngularMotion(bool inTaintTime) 266 public override void ZeroAngularMotion(bool inTaintTime)
414 { 267 {
415 _rotationalVelocity = OMV.Vector3.Zero; 268 _rotationalVelocity = OMV.Vector3.Zero;
416 269
417 PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() 270 PhysScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate()
418 { 271 {
419 if (PhysBody.HasPhysicalBody) 272 if (PhysBody.HasPhysicalBody)
420 { 273 {
421 PhysicsScene.PE.SetInterpolationAngularVelocity(PhysBody, OMV.Vector3.Zero); 274 PhysScene.PE.SetInterpolationAngularVelocity(PhysBody, OMV.Vector3.Zero);
422 PhysicsScene.PE.SetAngularVelocity(PhysBody, OMV.Vector3.Zero); 275 PhysScene.PE.SetAngularVelocity(PhysBody, OMV.Vector3.Zero);
423 // The next also get rid of applied linear force but the linear velocity is untouched. 276 // The next also get rid of applied linear force but the linear velocity is untouched.
424 PhysicsScene.PE.ClearForces(PhysBody); 277 PhysScene.PE.ClearForces(PhysBody);
425 } 278 }
426 }); 279 });
427 } 280 }
@@ -429,38 +282,33 @@ public sealed class BSCharacter : BSPhysObject
429 282
430 public override void LockAngularMotion(OMV.Vector3 axis) { return; } 283 public override void LockAngularMotion(OMV.Vector3 axis) { return; }
431 284
432 public override OMV.Vector3 RawPosition
433 {
434 get { return _position; }
435 set { _position = value; }
436 }
437 public override OMV.Vector3 Position { 285 public override OMV.Vector3 Position {
438 get { 286 get {
439 // Don't refetch the position because this function is called a zillion times 287 // Don't refetch the position because this function is called a zillion times
440 // _position = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID); 288 // RawPosition = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID);
441 return _position; 289 return RawPosition;
442 } 290 }
443 set { 291 set {
444 _position = value; 292 RawPosition = value;
445 293
446 PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() 294 PhysScene.TaintedObject("BSCharacter.setPosition", delegate()
447 { 295 {
448 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 296 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
449 PositionSanityCheck(); 297 PositionSanityCheck();
450 ForcePosition = _position; 298 ForcePosition = RawPosition;
451 }); 299 });
452 } 300 }
453 } 301 }
454 public override OMV.Vector3 ForcePosition { 302 public override OMV.Vector3 ForcePosition {
455 get { 303 get {
456 _position = PhysicsScene.PE.GetPosition(PhysBody); 304 RawPosition = PhysScene.PE.GetPosition(PhysBody);
457 return _position; 305 return RawPosition;
458 } 306 }
459 set { 307 set {
460 _position = value; 308 RawPosition = value;
461 if (PhysBody.HasPhysicalBody) 309 if (PhysBody.HasPhysicalBody)
462 { 310 {
463 PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); 311 PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
464 } 312 }
465 } 313 }
466 } 314 }
@@ -474,30 +322,30 @@ public sealed class BSCharacter : BSPhysObject
474 bool ret = false; 322 bool ret = false;
475 323
476 // TODO: check for out of bounds 324 // TODO: check for out of bounds
477 if (!PhysicsScene.TerrainManager.IsWithinKnownTerrain(RawPosition)) 325 if (!PhysScene.TerrainManager.IsWithinKnownTerrain(RawPosition))
478 { 326 {
479 // The character is out of the known/simulated area. 327 // The character is out of the known/simulated area.
480 // Force the avatar position to be within known. ScenePresence will use the position 328 // Force the avatar position to be within known. ScenePresence will use the position
481 // plus the velocity to decide if the avatar is moving out of the region. 329 // plus the velocity to decide if the avatar is moving out of the region.
482 RawPosition = PhysicsScene.TerrainManager.ClampPositionIntoKnownTerrain(RawPosition); 330 RawPosition = PhysScene.TerrainManager.ClampPositionIntoKnownTerrain(RawPosition);
483 DetailLog("{0},BSCharacter.PositionSanityCheck,notWithinKnownTerrain,clampedPos={1}", LocalID, RawPosition); 331 DetailLog("{0},BSCharacter.PositionSanityCheck,notWithinKnownTerrain,clampedPos={1}", LocalID, RawPosition);
484 return true; 332 return true;
485 } 333 }
486 334
487 // If below the ground, move the avatar up 335 // If below the ground, move the avatar up
488 float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition); 336 float terrainHeight = PhysScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
489 if (Position.Z < terrainHeight) 337 if (Position.Z < terrainHeight)
490 { 338 {
491 DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, _position, terrainHeight); 339 DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, RawPosition, terrainHeight);
492 _position.Z = terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters; 340 RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters);
493 ret = true; 341 ret = true;
494 } 342 }
495 if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0) 343 if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
496 { 344 {
497 float waterHeight = PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(_position); 345 float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
498 if (Position.Z < waterHeight) 346 if (Position.Z < waterHeight)
499 { 347 {
500 _position.Z = waterHeight; 348 RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, waterHeight);
501 ret = true; 349 ret = true;
502 } 350 }
503 } 351 }
@@ -515,10 +363,10 @@ public sealed class BSCharacter : BSPhysObject
515 { 363 {
516 // The new position value must be pushed into the physics engine but we can't 364 // The new position value must be pushed into the physics engine but we can't
517 // just assign to "Position" because of potential call loops. 365 // just assign to "Position" because of potential call loops.
518 PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate() 366 PhysScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
519 { 367 {
520 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 368 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
521 ForcePosition = _position; 369 ForcePosition = RawPosition;
522 }); 370 });
523 ret = true; 371 ret = true;
524 } 372 }
@@ -528,25 +376,25 @@ public sealed class BSCharacter : BSPhysObject
528 public override float Mass { get { return _mass; } } 376 public override float Mass { get { return _mass; } }
529 377
530 // used when we only want this prim's mass and not the linkset thing 378 // used when we only want this prim's mass and not the linkset thing
531 public override float RawMass { 379 public override float RawMass {
532 get {return _mass; } 380 get {return _mass; }
533 } 381 }
534 public override void UpdatePhysicalMassProperties(float physMass, bool inWorld) 382 public override void UpdatePhysicalMassProperties(float physMass, bool inWorld)
535 { 383 {
536 OMV.Vector3 localInertia = PhysicsScene.PE.CalculateLocalInertia(PhysShape, physMass); 384 OMV.Vector3 localInertia = PhysScene.PE.CalculateLocalInertia(PhysShape.physShapeInfo, physMass);
537 PhysicsScene.PE.SetMassProps(PhysBody, physMass, localInertia); 385 PhysScene.PE.SetMassProps(PhysBody, physMass, localInertia);
538 } 386 }
539 387
540 public override OMV.Vector3 Force { 388 public override OMV.Vector3 Force {
541 get { return _force; } 389 get { return RawForce; }
542 set { 390 set {
543 _force = value; 391 RawForce = value;
544 // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); 392 // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force);
545 PhysicsScene.TaintedObject("BSCharacter.SetForce", delegate() 393 PhysScene.TaintedObject("BSCharacter.SetForce", delegate()
546 { 394 {
547 DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force); 395 DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, RawForce);
548 if (PhysBody.HasPhysicalBody) 396 if (PhysBody.HasPhysicalBody)
549 PhysicsScene.PE.SetObjectForce(PhysBody, _force); 397 PhysScene.PE.SetObjectForce(PhysBody, RawForce);
550 }); 398 });
551 } 399 }
552 } 400 }
@@ -560,6 +408,7 @@ public sealed class BSCharacter : BSPhysObject
560 408
561 // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more 409 // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
562 public override void SetVolumeDetect(int param) { return; } 410 public override void SetVolumeDetect(int param) { return; }
411 public override bool IsVolumeDetect { get { return false; } }
563 412
564 public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } } 413 public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
565 public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } } 414 public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
@@ -569,61 +418,49 @@ public sealed class BSCharacter : BSPhysObject
569 { 418 {
570 get 419 get
571 { 420 {
572 return m_targetVelocity; 421 return base.m_targetVelocity;
573 } 422 }
574 set 423 set
575 { 424 {
576 DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value); 425 DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value);
577 m_targetVelocity = value; 426 m_targetVelocity = value;
578 OMV.Vector3 targetVel = value; 427 OMV.Vector3 targetVel = value;
579 if (_setAlwaysRun) 428 if (_setAlwaysRun && !_flying)
580 targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f); 429 targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f);
581 430
582 PhysicsScene.TaintedObject("BSCharacter.setTargetVelocity", delegate() 431 if (m_moveActor != null)
583 { 432 m_moveActor.SetVelocityAndTarget(RawVelocity, targetVel, false /* inTaintTime */);
584 _velocityMotor.Reset();
585 _velocityMotor.SetTarget(targetVel);
586 _velocityMotor.SetCurrent(_velocity);
587 _velocityMotor.Enabled = true;
588 });
589 } 433 }
590 } 434 }
591 public override OMV.Vector3 RawVelocity
592 {
593 get { return _velocity; }
594 set { _velocity = value; }
595 }
596 // Directly setting velocity means this is what the user really wants now. 435 // Directly setting velocity means this is what the user really wants now.
597 public override OMV.Vector3 Velocity { 436 public override OMV.Vector3 Velocity {
598 get { return _velocity; } 437 get { return RawVelocity; }
599 set { 438 set {
600 _velocity = value; 439 RawVelocity = value;
601 // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); 440 // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, RawVelocity);
602 PhysicsScene.TaintedObject("BSCharacter.setVelocity", delegate() 441 PhysScene.TaintedObject("BSCharacter.setVelocity", delegate()
603 { 442 {
604 _velocityMotor.Reset(); 443 if (m_moveActor != null)
605 _velocityMotor.SetCurrent(_velocity); 444 m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, true /* inTaintTime */);
606 _velocityMotor.SetTarget(_velocity);
607 _velocityMotor.Enabled = false;
608 445
609 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); 446 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, RawVelocity);
610 ForceVelocity = _velocity; 447 ForceVelocity = RawVelocity;
611 }); 448 });
612 } 449 }
613 } 450 }
614 public override OMV.Vector3 ForceVelocity { 451 public override OMV.Vector3 ForceVelocity {
615 get { return _velocity; } 452 get { return RawVelocity; }
616 set { 453 set {
617 PhysicsScene.AssertInTaintTime("BSCharacter.ForceVelocity"); 454 PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity");
618 455
619 _velocity = value; 456 RawVelocity = value;
620 PhysicsScene.PE.SetLinearVelocity(PhysBody, _velocity); 457 PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
621 PhysicsScene.PE.Activate(PhysBody, true); 458 PhysScene.PE.Activate(PhysBody, true);
622 } 459 }
623 } 460 }
624 public override OMV.Vector3 Torque { 461 public override OMV.Vector3 Torque {
625 get { return _torque; } 462 get { return RawTorque; }
626 set { _torque = value; 463 set { RawTorque = value;
627 } 464 }
628 } 465 }
629 public override float CollisionScore { 466 public override float CollisionScore {
@@ -635,22 +472,27 @@ public sealed class BSCharacter : BSPhysObject
635 get { return _acceleration; } 472 get { return _acceleration; }
636 set { _acceleration = value; } 473 set { _acceleration = value; }
637 } 474 }
638 public override OMV.Quaternion RawOrientation
639 {
640 get { return _orientation; }
641 set { _orientation = value; }
642 }
643 public override OMV.Quaternion Orientation { 475 public override OMV.Quaternion Orientation {
644 get { return _orientation; } 476 get { return RawOrientation; }
645 set { 477 set {
646 // Orientation is set zillions of times when an avatar is walking. It's like 478 // Orientation is set zillions of times when an avatar is walking. It's like
647 // the viewer doesn't trust us. 479 // the viewer doesn't trust us.
648 if (_orientation != value) 480 if (RawOrientation != value)
649 { 481 {
650 _orientation = value; 482 RawOrientation = value;
651 PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate() 483 PhysScene.TaintedObject("BSCharacter.setOrientation", delegate()
652 { 484 {
653 ForceOrientation = _orientation; 485 // Bullet assumes we know what we are doing when forcing orientation
486 // so it lets us go against all the rules and just compensates for them later.
487 // This forces rotation to be only around the Z axis and doesn't change any of the other axis.
488 // This keeps us from flipping the capsule over which the veiwer does not understand.
489 float oRoll, oPitch, oYaw;
490 RawOrientation.GetEulerAngles(out oRoll, out oPitch, out oYaw);
491 OMV.Quaternion trimmedOrientation = OMV.Quaternion.CreateFromEulers(0f, 0f, oYaw);
492 // DetailLog("{0},BSCharacter.setOrientation,taint,val={1},valDir={2},conv={3},convDir={4}",
493 // LocalID, RawOrientation, OMV.Vector3.UnitX * RawOrientation,
494 // trimmedOrientation, OMV.Vector3.UnitX * trimmedOrientation);
495 ForceOrientation = trimmedOrientation;
654 }); 496 });
655 } 497 }
656 } 498 }
@@ -660,16 +502,16 @@ public sealed class BSCharacter : BSPhysObject
660 { 502 {
661 get 503 get
662 { 504 {
663 _orientation = PhysicsScene.PE.GetOrientation(PhysBody); 505 RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
664 return _orientation; 506 return RawOrientation;
665 } 507 }
666 set 508 set
667 { 509 {
668 _orientation = value; 510 RawOrientation = value;
669 if (PhysBody.HasPhysicalBody) 511 if (PhysBody.HasPhysicalBody)
670 { 512 {
671 // _position = PhysicsScene.PE.GetPosition(BSBody); 513 // RawPosition = PhysicsScene.PE.GetPosition(BSBody);
672 PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); 514 PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
673 } 515 }
674 } 516 }
675 } 517 }
@@ -718,14 +560,14 @@ public sealed class BSCharacter : BSPhysObject
718 public override bool FloatOnWater { 560 public override bool FloatOnWater {
719 set { 561 set {
720 _floatOnWater = value; 562 _floatOnWater = value;
721 PhysicsScene.TaintedObject("BSCharacter.setFloatOnWater", delegate() 563 PhysScene.TaintedObject("BSCharacter.setFloatOnWater", delegate()
722 { 564 {
723 if (PhysBody.HasPhysicalBody) 565 if (PhysBody.HasPhysicalBody)
724 { 566 {
725 if (_floatOnWater) 567 if (_floatOnWater)
726 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER); 568 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
727 else 569 else
728 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER); 570 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
729 } 571 }
730 }); 572 });
731 } 573 }
@@ -746,7 +588,7 @@ public sealed class BSCharacter : BSPhysObject
746 public override float Buoyancy { 588 public override float Buoyancy {
747 get { return _buoyancy; } 589 get { return _buoyancy; }
748 set { _buoyancy = value; 590 set { _buoyancy = value;
749 PhysicsScene.TaintedObject("BSCharacter.setBuoyancy", delegate() 591 PhysScene.TaintedObject("BSCharacter.setBuoyancy", delegate()
750 { 592 {
751 DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 593 DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
752 ForceBuoyancy = _buoyancy; 594 ForceBuoyancy = _buoyancy;
@@ -755,8 +597,8 @@ public sealed class BSCharacter : BSPhysObject
755 } 597 }
756 public override float ForceBuoyancy { 598 public override float ForceBuoyancy {
757 get { return _buoyancy; } 599 get { return _buoyancy; }
758 set { 600 set {
759 PhysicsScene.AssertInTaintTime("BSCharacter.ForceBuoyancy"); 601 PhysScene.AssertInTaintTime("BSCharacter.ForceBuoyancy");
760 602
761 _buoyancy = value; 603 _buoyancy = value;
762 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 604 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
@@ -764,7 +606,7 @@ public sealed class BSCharacter : BSPhysObject
764 float grav = BSParam.Gravity * (1f - _buoyancy); 606 float grav = BSParam.Gravity * (1f - _buoyancy);
765 Gravity = new OMV.Vector3(0f, 0f, grav); 607 Gravity = new OMV.Vector3(0f, 0f, grav);
766 if (PhysBody.HasPhysicalBody) 608 if (PhysBody.HasPhysicalBody)
767 PhysicsScene.PE.SetGravity(PhysBody, Gravity); 609 PhysScene.PE.SetGravity(PhysBody, Gravity);
768 } 610 }
769 } 611 }
770 612
@@ -779,46 +621,25 @@ public sealed class BSCharacter : BSPhysObject
779 set { _PIDTau = value; } 621 set { _PIDTau = value; }
780 } 622 }
781 623
782 // Used for llSetHoverHeight and maybe vehicle height
783 // Hover Height will override MoveTo target's Z
784 public override bool PIDHoverActive {
785 set { _useHoverPID = value; }
786 }
787 public override float PIDHoverHeight {
788 set { _PIDHoverHeight = value; }
789 }
790 public override PIDHoverType PIDHoverType {
791 set { _PIDHoverType = value; }
792 }
793 public override float PIDHoverTau {
794 set { _PIDHoverTao = value; }
795 }
796
797 // For RotLookAt
798 public override OMV.Quaternion APIDTarget { set { return; } }
799 public override bool APIDActive { set { return; } }
800 public override float APIDStrength { set { return; } }
801 public override float APIDDamping { set { return; } }
802
803 public override void AddForce(OMV.Vector3 force, bool pushforce) 624 public override void AddForce(OMV.Vector3 force, bool pushforce)
804 { 625 {
805 // Since this force is being applied in only one step, make this a force per second. 626 // Since this force is being applied in only one step, make this a force per second.
806 OMV.Vector3 addForce = force / PhysicsScene.LastTimeStep; 627 OMV.Vector3 addForce = force / PhysScene.LastTimeStep;
807 AddForce(addForce, pushforce, false); 628 AddForce(addForce, pushforce, false);
808 } 629 }
809 private void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { 630 public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
810 if (force.IsFinite()) 631 if (force.IsFinite())
811 { 632 {
812 OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); 633 OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
813 // DetailLog("{0},BSCharacter.addForce,call,force={1}", LocalID, addForce); 634 // DetailLog("{0},BSCharacter.addForce,call,force={1}", LocalID, addForce);
814 635
815 PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.AddForce", delegate() 636 PhysScene.TaintedObject(inTaintTime, "BSCharacter.AddForce", delegate()
816 { 637 {
817 // Bullet adds this central force to the total force for this tick 638 // Bullet adds this central force to the total force for this tick
818 // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce); 639 // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce);
819 if (PhysBody.HasPhysicalBody) 640 if (PhysBody.HasPhysicalBody)
820 { 641 {
821 PhysicsScene.PE.ApplyCentralForce(PhysBody, addForce); 642 PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
822 } 643 }
823 }); 644 });
824 } 645 }
@@ -829,7 +650,7 @@ public sealed class BSCharacter : BSPhysObject
829 } 650 }
830 } 651 }
831 652
832 public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { 653 public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
833 } 654 }
834 public override void SetMomentum(OMV.Vector3 momentum) { 655 public override void SetMomentum(OMV.Vector3 momentum) {
835 } 656 }
@@ -837,14 +658,14 @@ public sealed class BSCharacter : BSPhysObject
837 private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size) 658 private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size)
838 { 659 {
839 OMV.Vector3 newScale; 660 OMV.Vector3 newScale;
840 661
841 // Bullet's capsule total height is the "passed height + radius * 2"; 662 // Bullet's capsule total height is the "passed height + radius * 2";
842 // The base capsule is 1 diameter and 2 height (passed radius=0.5, passed height = 1) 663 // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1)
843 // The number we pass in for 'scaling' is the multiplier to get that base 664 // The number we pass in for 'scaling' is the multiplier to get that base
844 // shape to be the size desired. 665 // shape to be the size desired.
845 // So, when creating the scale for the avatar height, we take the passed height 666 // So, when creating the scale for the avatar height, we take the passed height
846 // (size.Z) and remove the caps. 667 // (size.Z) and remove the caps.
847 // Another oddity of the Bullet capsule implementation is that it presumes the Y 668 // An oddity of the Bullet capsule implementation is that it presumes the Y
848 // dimension is the radius of the capsule. Even though some of the code allows 669 // dimension is the radius of the capsule. Even though some of the code allows
849 // for a asymmetrical capsule, other parts of the code presume it is cylindrical. 670 // for a asymmetrical capsule, other parts of the code presume it is cylindrical.
850 671
@@ -852,8 +673,27 @@ public sealed class BSCharacter : BSPhysObject
852 newScale.X = size.X / 2f; 673 newScale.X = size.X / 2f;
853 newScale.Y = size.Y / 2f; 674 newScale.Y = size.Y / 2f;
854 675
676 float heightAdjust = BSParam.AvatarHeightMidFudge;
677 if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f)
678 {
679 // An avatar is between 1.61 and 2.12 meters. Midpoint is 1.87m.
680 // The "times 4" relies on the fact that the difference from the midpoint to the extremes is exactly 0.25
681 float midHeightOffset = size.Z - 1.87f;
682 if (midHeightOffset < 0f)
683 {
684 // Small avatar. Add the adjustment based on the distance from midheight
685 heightAdjust += -1f * midHeightOffset * 4f * BSParam.AvatarHeightLowFudge;
686 }
687 else
688 {
689 // Large avatar. Add the adjustment based on the distance from midheight
690 heightAdjust += midHeightOffset * 4f * BSParam.AvatarHeightHighFudge;
691 }
692 }
855 // The total scale height is the central cylindar plus the caps on the two ends. 693 // The total scale height is the central cylindar plus the caps on the two ends.
856 newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2)) / 2f; 694 newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2) + heightAdjust) / 2f;
695 // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale);
696
857 // If smaller than the endcaps, just fake like we're almost that small 697 // If smaller than the endcaps, just fake like we're almost that small
858 if (newScale.Z < 0) 698 if (newScale.Z < 0)
859 newScale.Z = 0.1f; 699 newScale.Z = 0.1f;
@@ -882,15 +722,18 @@ public sealed class BSCharacter : BSPhysObject
882 // the world that things have changed. 722 // the world that things have changed.
883 public override void UpdateProperties(EntityProperties entprop) 723 public override void UpdateProperties(EntityProperties entprop)
884 { 724 {
885 _position = entprop.Position; 725 // Let anyone (like the actors) modify the updated properties before they are pushed into the object and the simulator.
886 _orientation = entprop.Rotation; 726 TriggerPreUpdatePropertyAction(ref entprop);
727
728 RawPosition = entprop.Position;
729 RawOrientation = entprop.Rotation;
887 730
888 // Smooth velocity. OpenSimulator is VERY sensitive to changes in velocity of the avatar 731 // Smooth velocity. OpenSimulator is VERY sensitive to changes in velocity of the avatar
889 // and will send agent updates to the clients if velocity changes by more than 732 // and will send agent updates to the clients if velocity changes by more than
890 // 0.001m/s. Bullet introduces a lot of jitter in the velocity which causes many 733 // 0.001m/s. Bullet introduces a lot of jitter in the velocity which causes many
891 // extra updates. 734 // extra updates.
892 if (!entprop.Velocity.ApproxEquals(_velocity, 0.1f)) 735 if (!entprop.Velocity.ApproxEquals(RawVelocity, 0.1f))
893 _velocity = entprop.Velocity; 736 RawVelocity = entprop.Velocity;
894 737
895 _acceleration = entprop.Acceleration; 738 _acceleration = entprop.Acceleration;
896 _rotationalVelocity = entprop.RotationalVelocity; 739 _rotationalVelocity = entprop.RotationalVelocity;
@@ -898,8 +741,8 @@ public sealed class BSCharacter : BSPhysObject
898 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. 741 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
899 if (PositionSanityCheck(true)) 742 if (PositionSanityCheck(true))
900 { 743 {
901 DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, _position); 744 DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, RawPosition);
902 entprop.Position = _position; 745 entprop.Position = RawPosition;
903 } 746 }
904 747
905 // remember the current and last set values 748 // remember the current and last set values
@@ -910,10 +753,10 @@ public sealed class BSCharacter : BSPhysObject
910 // Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); 753 // Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
911 754
912 // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop. 755 // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop.
913 // base.RequestPhysicsterseUpdate(); 756 // PhysScene.PostUpdate(this);
914 757
915 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}", 758 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
916 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity); 759 LocalID, RawPosition, RawOrientation, RawVelocity, _acceleration, _rotationalVelocity);
917 } 760 }
918} 761}
919} 762}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs
index b813974..42b5c49 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs
@@ -85,7 +85,9 @@ public abstract class BSConstraint : IDisposable
85 { 85 {
86 bool ret = false; 86 bool ret = false;
87 if (m_enabled) 87 if (m_enabled)
88 {
88 ret = PhysicsScene.PE.SetAngularLimits(m_constraint, low, high); 89 ret = PhysicsScene.PE.SetAngularLimits(m_constraint, low, high);
90 }
89 return ret; 91 return ret;
90 } 92 }
91 93
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs
index 476a0e5..d0949f5 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs
@@ -97,14 +97,14 @@ public sealed class BSConstraint6Dof : BSConstraint
97 97
98 // A 6 Dof constraint that is fixed in the world and constrained to a on-the-fly created static object 98 // A 6 Dof constraint that is fixed in the world and constrained to a on-the-fly created static object
99 public BSConstraint6Dof(BulletWorld world, BulletBody obj1, Vector3 frameInBloc, Quaternion frameInBrot, 99 public BSConstraint6Dof(BulletWorld world, BulletBody obj1, Vector3 frameInBloc, Quaternion frameInBrot,
100 bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) 100 bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies)
101 : base(world) 101 : base(world)
102 { 102 {
103 m_body1 = obj1; 103 m_body1 = obj1;
104 m_body2 = obj1; // Look out for confusion down the road 104 m_body2 = obj1; // Look out for confusion down the road
105 m_constraint = PhysicsScene.PE.Create6DofConstraintFixed(m_world, m_body1, 105 m_constraint = PhysicsScene.PE.Create6DofConstraintFixed(m_world, m_body1,
106 frameInBloc, frameInBrot, 106 frameInBloc, frameInBrot,
107 useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies); 107 useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
108 m_enabled = true; 108 m_enabled = true;
109 world.physicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}", 109 world.physicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
110 BSScene.DetailLogZero, world.worldID, obj1.ID, obj1.AddrString); 110 BSScene.DetailLogZero, world.worldID, obj1.ID, obj1.AddrString);
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs
index 7714a03..ed89f63 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs
@@ -45,7 +45,7 @@ public sealed class BSConstraintHinge : BSConstraint
45 m_body1 = obj1; 45 m_body1 = obj1;
46 m_body2 = obj2; 46 m_body2 = obj2;
47 m_constraint = PhysicsScene.PE.CreateHingeConstraint(world, obj1, obj2, 47 m_constraint = PhysicsScene.PE.CreateHingeConstraint(world, obj1, obj2,
48 pivotInA, pivotInB, axisInA, axisInB, 48 pivotInA, pivotInB, axisInA, axisInB,
49 useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies); 49 useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
50 m_enabled = true; 50 m_enabled = true;
51 } 51 }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 65df741..f0d17d3 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -40,13 +40,14 @@ using OpenSim.Region.Physics.Manager;
40 40
41namespace OpenSim.Region.Physics.BulletSPlugin 41namespace OpenSim.Region.Physics.BulletSPlugin
42{ 42{
43 public sealed class BSDynamics 43 public sealed class BSDynamics : BSActor
44 { 44 {
45 private static string LogHeader = "[BULLETSIM VEHICLE]"; 45 private static string LogHeader = "[BULLETSIM VEHICLE]";
46 46
47 private BSScene PhysicsScene { get; set; }
48 // the prim this dynamic controller belongs to 47 // the prim this dynamic controller belongs to
49 private BSPrim Prim { get; set; } 48 private BSPrimLinkable ControllingPrim { get; set; }
49
50 private bool m_haveRegisteredForSceneEvents;
50 51
51 // mass of the vehicle fetched each time we're calles 52 // mass of the vehicle fetched each time we're calles
52 private float m_vehicleMass; 53 private float m_vehicleMass;
@@ -124,38 +125,24 @@ namespace OpenSim.Region.Physics.BulletSPlugin
124 static readonly float PIOverFour = ((float)Math.PI) / 4f; 125 static readonly float PIOverFour = ((float)Math.PI) / 4f;
125 static readonly float PIOverTwo = ((float)Math.PI) / 2f; 126 static readonly float PIOverTwo = ((float)Math.PI) / 2f;
126 127
127 // For debugging, flags to turn on and off individual corrections. 128 public BSDynamics(BSScene myScene, BSPrim myPrim, string actorName)
128 public bool enableAngularVerticalAttraction; 129 : base(myScene, myPrim, actorName)
129 public bool enableAngularDeflection;
130 public bool enableAngularBanking;
131
132 public BSDynamics(BSScene myScene, BSPrim myPrim)
133 { 130 {
134 PhysicsScene = myScene;
135 Prim = myPrim;
136 Type = Vehicle.TYPE_NONE; 131 Type = Vehicle.TYPE_NONE;
137 SetupVehicleDebugging(); 132 m_haveRegisteredForSceneEvents = false;
138 }
139 133
140 // Stopgap debugging enablement. Allows source level debugging but still checking 134 ControllingPrim = myPrim as BSPrimLinkable;
141 // in changes by making enablement of debugging flags from INI file. 135 if (ControllingPrim == null)
142 public void SetupVehicleDebugging()
143 {
144 enableAngularVerticalAttraction = true;
145 enableAngularDeflection = false;
146 enableAngularBanking = true;
147 if (BSParam.VehicleDebuggingEnabled)
148 { 136 {
149 enableAngularVerticalAttraction = true; 137 // THIS CANNOT HAPPEN!!
150 enableAngularDeflection = false;
151 enableAngularBanking = false;
152 } 138 }
139 VDetailLog("{0},Creation", ControllingPrim.LocalID);
153 } 140 }
154 141
155 // Return 'true' if this vehicle is doing vehicle things 142 // Return 'true' if this vehicle is doing vehicle things
156 public bool IsActive 143 public bool IsActive
157 { 144 {
158 get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); } 145 get { return (Type != Vehicle.TYPE_NONE && ControllingPrim.IsPhysicallyActive); }
159 } 146 }
160 147
161 // Return 'true' if this a vehicle that should be sitting on the ground 148 // Return 'true' if this a vehicle that should be sitting on the ground
@@ -167,11 +154,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
167 #region Vehicle parameter setting 154 #region Vehicle parameter setting
168 public void ProcessFloatVehicleParam(Vehicle pParam, float pValue) 155 public void ProcessFloatVehicleParam(Vehicle pParam, float pValue)
169 { 156 {
170 VDetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); 157 VDetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", ControllingPrim.LocalID, pParam, pValue);
171 switch (pParam) 158 switch (pParam)
172 { 159 {
173 case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY: 160 case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY:
174 m_angularDeflectionEfficiency = Math.Max(pValue, 0.01f); 161 m_angularDeflectionEfficiency = ClampInRange(0f, pValue, 1f);
175 break; 162 break;
176 case Vehicle.ANGULAR_DEFLECTION_TIMESCALE: 163 case Vehicle.ANGULAR_DEFLECTION_TIMESCALE:
177 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f); 164 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f);
@@ -195,7 +182,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
195 break; 182 break;
196 case Vehicle.BUOYANCY: 183 case Vehicle.BUOYANCY:
197 m_VehicleBuoyancy = ClampInRange(-1f, pValue, 1f); 184 m_VehicleBuoyancy = ClampInRange(-1f, pValue, 1f);
198 m_VehicleGravity = Prim.ComputeGravity(m_VehicleBuoyancy); 185 m_VehicleGravity = ControllingPrim.ComputeGravity(m_VehicleBuoyancy);
199 break; 186 break;
200 case Vehicle.HOVER_EFFICIENCY: 187 case Vehicle.HOVER_EFFICIENCY:
201 m_VhoverEfficiency = ClampInRange(0f, pValue, 1f); 188 m_VhoverEfficiency = ClampInRange(0f, pValue, 1f);
@@ -207,7 +194,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
207 m_VhoverTimescale = Math.Max(pValue, 0.01f); 194 m_VhoverTimescale = Math.Max(pValue, 0.01f);
208 break; 195 break;
209 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: 196 case Vehicle.LINEAR_DEFLECTION_EFFICIENCY:
210 m_linearDeflectionEfficiency = Math.Max(pValue, 0.01f); 197 m_linearDeflectionEfficiency = ClampInRange(0f, pValue, 1f);
211 break; 198 break;
212 case Vehicle.LINEAR_DEFLECTION_TIMESCALE: 199 case Vehicle.LINEAR_DEFLECTION_TIMESCALE:
213 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); 200 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f);
@@ -233,7 +220,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
233 // set all of the components to the same value 220 // set all of the components to the same value
234 case Vehicle.ANGULAR_FRICTION_TIMESCALE: 221 case Vehicle.ANGULAR_FRICTION_TIMESCALE:
235 m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue); 222 m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue);
236 m_angularMotor.FrictionTimescale = m_angularFrictionTimescale;
237 break; 223 break;
238 case Vehicle.ANGULAR_MOTOR_DIRECTION: 224 case Vehicle.ANGULAR_MOTOR_DIRECTION:
239 m_angularMotorDirection = new Vector3(pValue, pValue, pValue); 225 m_angularMotorDirection = new Vector3(pValue, pValue, pValue);
@@ -242,7 +228,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
242 break; 228 break;
243 case Vehicle.LINEAR_FRICTION_TIMESCALE: 229 case Vehicle.LINEAR_FRICTION_TIMESCALE:
244 m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); 230 m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue);
245 m_linearMotor.FrictionTimescale = m_linearFrictionTimescale;
246 break; 231 break;
247 case Vehicle.LINEAR_MOTOR_DIRECTION: 232 case Vehicle.LINEAR_MOTOR_DIRECTION:
248 m_linearMotorDirection = new Vector3(pValue, pValue, pValue); 233 m_linearMotorDirection = new Vector3(pValue, pValue, pValue);
@@ -258,12 +243,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
258 243
259 internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue) 244 internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue)
260 { 245 {
261 VDetailLog("{0},ProcessVectorVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); 246 VDetailLog("{0},ProcessVectorVehicleParam,param={1},val={2}", ControllingPrim.LocalID, pParam, pValue);
262 switch (pParam) 247 switch (pParam)
263 { 248 {
264 case Vehicle.ANGULAR_FRICTION_TIMESCALE: 249 case Vehicle.ANGULAR_FRICTION_TIMESCALE:
265 m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); 250 m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
266 m_angularMotor.FrictionTimescale = m_angularFrictionTimescale;
267 break; 251 break;
268 case Vehicle.ANGULAR_MOTOR_DIRECTION: 252 case Vehicle.ANGULAR_MOTOR_DIRECTION:
269 // Limit requested angular speed to 2 rps= 4 pi rads/sec 253 // Limit requested angular speed to 2 rps= 4 pi rads/sec
@@ -276,7 +260,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
276 break; 260 break;
277 case Vehicle.LINEAR_FRICTION_TIMESCALE: 261 case Vehicle.LINEAR_FRICTION_TIMESCALE:
278 m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); 262 m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
279 m_linearMotor.FrictionTimescale = m_linearFrictionTimescale;
280 break; 263 break;
281 case Vehicle.LINEAR_MOTOR_DIRECTION: 264 case Vehicle.LINEAR_MOTOR_DIRECTION:
282 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); 265 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z);
@@ -294,7 +277,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
294 277
295 internal void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue) 278 internal void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue)
296 { 279 {
297 VDetailLog("{0},ProcessRotationalVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); 280 VDetailLog("{0},ProcessRotationalVehicleParam,param={1},val={2}", ControllingPrim.LocalID, pParam, pValue);
298 switch (pParam) 281 switch (pParam)
299 { 282 {
300 case Vehicle.REFERENCE_FRAME: 283 case Vehicle.REFERENCE_FRAME:
@@ -308,7 +291,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
308 291
309 internal void ProcessVehicleFlags(int pParam, bool remove) 292 internal void ProcessVehicleFlags(int pParam, bool remove)
310 { 293 {
311 VDetailLog("{0},ProcessVehicleFlags,param={1},remove={2}", Prim.LocalID, pParam, remove); 294 VDetailLog("{0},ProcessVehicleFlags,param={1},remove={2}", ControllingPrim.LocalID, pParam, remove);
312 VehicleFlag parm = (VehicleFlag)pParam; 295 VehicleFlag parm = (VehicleFlag)pParam;
313 if (pParam == -1) 296 if (pParam == -1)
314 m_flags = (VehicleFlag)0; 297 m_flags = (VehicleFlag)0;
@@ -323,7 +306,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
323 306
324 public void ProcessTypeChange(Vehicle pType) 307 public void ProcessTypeChange(Vehicle pType)
325 { 308 {
326 VDetailLog("{0},ProcessTypeChange,type={1}", Prim.LocalID, pType); 309 VDetailLog("{0},ProcessTypeChange,type={1}", ControllingPrim.LocalID, pType);
327 // Set Defaults For Type 310 // Set Defaults For Type
328 Type = pType; 311 Type = pType;
329 switch (pType) 312 switch (pType)
@@ -557,34 +540,40 @@ namespace OpenSim.Region.Physics.BulletSPlugin
557 break; 540 break;
558 } 541 }
559 542
560 // Update any physical parameters based on this type. 543 m_linearMotor = new BSVMotor("LinearMotor", m_linearMotorTimescale, m_linearMotorDecayTimescale, 1f);
561 Refresh(); 544 // m_linearMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
562 545
563 m_linearMotor = new BSVMotor("LinearMotor", m_linearMotorTimescale, 546 m_angularMotor = new BSVMotor("AngularMotor", m_angularMotorTimescale, m_angularMotorDecayTimescale, 1f);
564 m_linearMotorDecayTimescale, m_linearFrictionTimescale, 547 // m_angularMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
565 1f);
566 m_linearMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
567
568 m_angularMotor = new BSVMotor("AngularMotor", m_angularMotorTimescale,
569 m_angularMotorDecayTimescale, m_angularFrictionTimescale,
570 1f);
571 m_angularMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
572 548
573 /* Not implemented 549 /* Not implemented
574 m_verticalAttractionMotor = new BSVMotor("VerticalAttraction", m_verticalAttractionTimescale, 550 m_verticalAttractionMotor = new BSVMotor("VerticalAttraction", m_verticalAttractionTimescale,
575 BSMotor.Infinite, BSMotor.InfiniteVector, 551 BSMotor.Infinite, BSMotor.InfiniteVector,
576 m_verticalAttractionEfficiency); 552 m_verticalAttractionEfficiency);
577 // Z goes away and we keep X and Y 553 // Z goes away and we keep X and Y
578 m_verticalAttractionMotor.FrictionTimescale = new Vector3(BSMotor.Infinite, BSMotor.Infinite, 0.1f);
579 m_verticalAttractionMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) 554 m_verticalAttractionMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
580 */ 555 */
556
557 if (this.Type == Vehicle.TYPE_NONE)
558 {
559 UnregisterForSceneEvents();
560 }
561 else
562 {
563 RegisterForSceneEvents();
564 }
565
566 // Update any physical parameters based on this type.
567 Refresh();
581 } 568 }
582 #endregion // Vehicle parameter setting 569 #endregion // Vehicle parameter setting
583 570
584 public void Refresh() 571 // BSActor.Refresh()
572 public override void Refresh()
585 { 573 {
586 // If asking for a refresh, reset the physical parameters before the next simulation step. 574 // If asking for a refresh, reset the physical parameters before the next simulation step.
587 PhysicsScene.PostTaintObject("BSDynamics.Refresh", Prim.LocalID, delegate() 575 // Called whether active or not since the active state may be updated before the next step.
576 m_physicsScene.PostTaintObject("BSDynamics.Refresh", ControllingPrim.LocalID, delegate()
588 { 577 {
589 SetPhysicalParameters(); 578 SetPhysicalParameters();
590 }); 579 });
@@ -597,49 +586,98 @@ namespace OpenSim.Region.Physics.BulletSPlugin
597 if (IsActive) 586 if (IsActive)
598 { 587 {
599 // Remember the mass so we don't have to fetch it every step 588 // Remember the mass so we don't have to fetch it every step
600 m_vehicleMass = Prim.TotalMass; 589 m_vehicleMass = ControllingPrim.TotalMass;
601 590
602 // Friction affects are handled by this vehicle code 591 // Friction affects are handled by this vehicle code
603 PhysicsScene.PE.SetFriction(Prim.PhysBody, BSParam.VehicleFriction); 592 // m_physicsScene.PE.SetFriction(ControllingPrim.PhysBody, BSParam.VehicleFriction);
604 PhysicsScene.PE.SetRestitution(Prim.PhysBody, BSParam.VehicleRestitution); 593 // m_physicsScene.PE.SetRestitution(ControllingPrim.PhysBody, BSParam.VehicleRestitution);
594 ControllingPrim.Linkset.SetPhysicalFriction(BSParam.VehicleFriction);
595 ControllingPrim.Linkset.SetPhysicalRestitution(BSParam.VehicleRestitution);
605 596
606 // Moderate angular movement introduced by Bullet. 597 // Moderate angular movement introduced by Bullet.
607 // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle. 598 // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle.
608 // Maybe compute linear and angular factor and damping from params. 599 // Maybe compute linear and angular factor and damping from params.
609 PhysicsScene.PE.SetAngularDamping(Prim.PhysBody, BSParam.VehicleAngularDamping); 600 m_physicsScene.PE.SetAngularDamping(ControllingPrim.PhysBody, BSParam.VehicleAngularDamping);
610 PhysicsScene.PE.SetLinearFactor(Prim.PhysBody, BSParam.VehicleLinearFactor); 601 m_physicsScene.PE.SetLinearFactor(ControllingPrim.PhysBody, BSParam.VehicleLinearFactor);
611 PhysicsScene.PE.SetAngularFactorV(Prim.PhysBody, BSParam.VehicleAngularFactor); 602 m_physicsScene.PE.SetAngularFactorV(ControllingPrim.PhysBody, BSParam.VehicleAngularFactor);
612 603
613 // Vehicles report collision events so we know when it's on the ground 604 // Vehicles report collision events so we know when it's on the ground
614 PhysicsScene.PE.AddToCollisionFlags(Prim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS); 605 // m_physicsScene.PE.AddToCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS);
606 ControllingPrim.Linkset.AddToPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS);
615 607
616 Prim.Inertia = PhysicsScene.PE.CalculateLocalInertia(Prim.PhysShape, m_vehicleMass); 608 // Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(ControllingPrim.PhysShape.physShapeInfo, m_vehicleMass);
617 PhysicsScene.PE.SetMassProps(Prim.PhysBody, m_vehicleMass, Prim.Inertia); 609 // ControllingPrim.Inertia = inertia * BSParam.VehicleInertiaFactor;
618 PhysicsScene.PE.UpdateInertiaTensor(Prim.PhysBody); 610 // m_physicsScene.PE.SetMassProps(ControllingPrim.PhysBody, m_vehicleMass, ControllingPrim.Inertia);
611 // m_physicsScene.PE.UpdateInertiaTensor(ControllingPrim.PhysBody);
612 ControllingPrim.Linkset.ComputeAndSetLocalInertia(BSParam.VehicleInertiaFactor, m_vehicleMass);
619 613
620 // Set the gravity for the vehicle depending on the buoyancy 614 // Set the gravity for the vehicle depending on the buoyancy
621 // TODO: what should be done if prim and vehicle buoyancy differ? 615 // TODO: what should be done if prim and vehicle buoyancy differ?
622 m_VehicleGravity = Prim.ComputeGravity(m_VehicleBuoyancy); 616 m_VehicleGravity = ControllingPrim.ComputeGravity(m_VehicleBuoyancy);
623 // The actual vehicle gravity is set to zero in Bullet so we can do all the application of same. 617 // The actual vehicle gravity is set to zero in Bullet so we can do all the application of same.
624 PhysicsScene.PE.SetGravity(Prim.PhysBody, Vector3.Zero); 618 // m_physicsScene.PE.SetGravity(ControllingPrim.PhysBody, Vector3.Zero);
619 ControllingPrim.Linkset.SetPhysicalGravity(Vector3.Zero);
625 620
626 VDetailLog("{0},BSDynamics.SetPhysicalParameters,mass={1},inert={2},vehGrav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}", 621 VDetailLog("{0},BSDynamics.SetPhysicalParameters,mass={1},inert={2},vehGrav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}",
627 Prim.LocalID, m_vehicleMass, Prim.Inertia, m_VehicleGravity, 622 ControllingPrim.LocalID, m_vehicleMass, ControllingPrim.Inertia, m_VehicleGravity,
628 BSParam.VehicleAngularDamping, BSParam.VehicleFriction, BSParam.VehicleRestitution, 623 BSParam.VehicleAngularDamping, BSParam.VehicleFriction, BSParam.VehicleRestitution,
629 BSParam.VehicleLinearFactor, BSParam.VehicleAngularFactor 624 BSParam.VehicleLinearFactor, BSParam.VehicleAngularFactor
630 ); 625 );
631 } 626 }
632 else 627 else
633 { 628 {
634 if (Prim.PhysBody.HasPhysicalBody) 629 if (ControllingPrim.PhysBody.HasPhysicalBody)
635 PhysicsScene.PE.RemoveFromCollisionFlags(Prim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS); 630 m_physicsScene.PE.RemoveFromCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS);
631 // ControllingPrim.Linkset.RemoveFromPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS);
636 } 632 }
637 } 633 }
638 634
639 public bool RemoveBodyDependencies(BSPhysObject prim) 635 // BSActor.RemoveBodyDependencies
636 public override void RemoveDependencies()
640 { 637 {
641 Refresh(); 638 Refresh();
642 return IsActive; 639 }
640
641 // BSActor.Release()
642 public override void Dispose()
643 {
644 VDetailLog("{0},Dispose", ControllingPrim.LocalID);
645 UnregisterForSceneEvents();
646 Type = Vehicle.TYPE_NONE;
647 Enabled = false;
648 return;
649 }
650
651 private void RegisterForSceneEvents()
652 {
653 if (!m_haveRegisteredForSceneEvents)
654 {
655 m_physicsScene.BeforeStep += this.Step;
656 m_physicsScene.AfterStep += this.PostStep;
657 ControllingPrim.OnPreUpdateProperty += this.PreUpdateProperty;
658 m_haveRegisteredForSceneEvents = true;
659 }
660 }
661
662 private void UnregisterForSceneEvents()
663 {
664 if (m_haveRegisteredForSceneEvents)
665 {
666 m_physicsScene.BeforeStep -= this.Step;
667 m_physicsScene.AfterStep -= this.PostStep;
668 ControllingPrim.OnPreUpdateProperty -= this.PreUpdateProperty;
669 m_haveRegisteredForSceneEvents = false;
670 }
671 }
672
673 private void PreUpdateProperty(ref EntityProperties entprop)
674 {
675 // A temporary kludge to suppress the rotational effects introduced on vehicles by Bullet
676 // TODO: handle physics introduced by Bullet with computed vehicle physics.
677 if (IsActive)
678 {
679 entprop.RotationalVelocity = Vector3.Zero;
680 }
643 } 681 }
644 682
645 #region Known vehicle value functions 683 #region Known vehicle value functions
@@ -661,7 +699,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
661 private Vector3 m_knownRotationalVelocity; 699 private Vector3 m_knownRotationalVelocity;
662 private Vector3 m_knownRotationalForce; 700 private Vector3 m_knownRotationalForce;
663 private Vector3 m_knownRotationalImpulse; 701 private Vector3 m_knownRotationalImpulse;
664 private Vector3 m_knownForwardVelocity; // vehicle relative forward speed
665 702
666 private const int m_knownChangedPosition = 1 << 0; 703 private const int m_knownChangedPosition = 1 << 0;
667 private const int m_knownChangedVelocity = 1 << 1; 704 private const int m_knownChangedVelocity = 1 << 1;
@@ -673,7 +710,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
673 private const int m_knownChangedRotationalImpulse = 1 << 7; 710 private const int m_knownChangedRotationalImpulse = 1 << 7;
674 private const int m_knownChangedTerrainHeight = 1 << 8; 711 private const int m_knownChangedTerrainHeight = 1 << 8;
675 private const int m_knownChangedWaterLevel = 1 << 9; 712 private const int m_knownChangedWaterLevel = 1 << 9;
676 private const int m_knownChangedForwardVelocity = 1 <<10;
677 713
678 public void ForgetKnownVehicleProperties() 714 public void ForgetKnownVehicleProperties()
679 { 715 {
@@ -686,14 +722,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
686 if (m_knownChanged != 0) 722 if (m_knownChanged != 0)
687 { 723 {
688 if ((m_knownChanged & m_knownChangedPosition) != 0) 724 if ((m_knownChanged & m_knownChangedPosition) != 0)
689 Prim.ForcePosition = m_knownPosition; 725 ControllingPrim.ForcePosition = m_knownPosition;
690 726
691 if ((m_knownChanged & m_knownChangedOrientation) != 0) 727 if ((m_knownChanged & m_knownChangedOrientation) != 0)
692 Prim.ForceOrientation = m_knownOrientation; 728 ControllingPrim.ForceOrientation = m_knownOrientation;
693 729
694 if ((m_knownChanged & m_knownChangedVelocity) != 0) 730 if ((m_knownChanged & m_knownChangedVelocity) != 0)
695 { 731 {
696 Prim.ForceVelocity = m_knownVelocity; 732 ControllingPrim.ForceVelocity = m_knownVelocity;
697 // Fake out Bullet by making it think the velocity is the same as last time. 733 // Fake out Bullet by making it think the velocity is the same as last time.
698 // Bullet does a bunch of smoothing for changing parameters. 734 // Bullet does a bunch of smoothing for changing parameters.
699 // Since the vehicle is demanding this setting, we override Bullet's smoothing 735 // Since the vehicle is demanding this setting, we override Bullet's smoothing
@@ -702,41 +738,41 @@ namespace OpenSim.Region.Physics.BulletSPlugin
702 } 738 }
703 739
704 if ((m_knownChanged & m_knownChangedForce) != 0) 740 if ((m_knownChanged & m_knownChangedForce) != 0)
705 Prim.AddForce((Vector3)m_knownForce, false /*pushForce*/, true /*inTaintTime*/); 741 ControllingPrim.AddForce((Vector3)m_knownForce, false /*pushForce*/, true /*inTaintTime*/);
706 742
707 if ((m_knownChanged & m_knownChangedForceImpulse) != 0) 743 if ((m_knownChanged & m_knownChangedForceImpulse) != 0)
708 Prim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/); 744 ControllingPrim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/);
709 745
710 if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) 746 if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0)
711 { 747 {
712 Prim.ForceRotationalVelocity = m_knownRotationalVelocity; 748 ControllingPrim.ForceRotationalVelocity = m_knownRotationalVelocity;
713 // PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity); 749 // PhysicsScene.PE.SetInterpolationAngularVelocity(Prim.PhysBody, m_knownRotationalVelocity);
714 } 750 }
715 751
716 if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0) 752 if ((m_knownChanged & m_knownChangedRotationalImpulse) != 0)
717 Prim.ApplyTorqueImpulse((Vector3)m_knownRotationalImpulse, true /*inTaintTime*/); 753 ControllingPrim.ApplyTorqueImpulse((Vector3)m_knownRotationalImpulse, true /*inTaintTime*/);
718 754
719 if ((m_knownChanged & m_knownChangedRotationalForce) != 0) 755 if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
720 { 756 {
721 Prim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/); 757 ControllingPrim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/);
722 } 758 }
723 759
724 // If we set one of the values (ie, the physics engine didn't do it) we must force 760 // If we set one of the values (ie, the physics engine didn't do it) we must force
725 // an UpdateProperties event to send the changes up to the simulator. 761 // an UpdateProperties event to send the changes up to the simulator.
726 PhysicsScene.PE.PushUpdate(Prim.PhysBody); 762 m_physicsScene.PE.PushUpdate(ControllingPrim.PhysBody);
727 } 763 }
728 m_knownChanged = 0; 764 m_knownChanged = 0;
729 } 765 }
730 766
731 // Since the computation of terrain height can be a little involved, this routine 767 // Since the computation of terrain height can be a little involved, this routine
732 // is used to fetch the height only once for each vehicle simulation step. 768 // is used to fetch the height only once for each vehicle simulation step.
733 Vector3 lastRememberedHeightPos; 769 Vector3 lastRememberedHeightPos = new Vector3(-1, -1, -1);
734 private float GetTerrainHeight(Vector3 pos) 770 private float GetTerrainHeight(Vector3 pos)
735 { 771 {
736 if ((m_knownHas & m_knownChangedTerrainHeight) == 0 || pos != lastRememberedHeightPos) 772 if ((m_knownHas & m_knownChangedTerrainHeight) == 0 || pos != lastRememberedHeightPos)
737 { 773 {
738 lastRememberedHeightPos = pos; 774 lastRememberedHeightPos = pos;
739 m_knownTerrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos); 775 m_knownTerrainHeight = ControllingPrim.PhysScene.TerrainManager.GetTerrainHeightAtXYZ(pos);
740 m_knownHas |= m_knownChangedTerrainHeight; 776 m_knownHas |= m_knownChangedTerrainHeight;
741 } 777 }
742 return m_knownTerrainHeight; 778 return m_knownTerrainHeight;
@@ -744,14 +780,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin
744 780
745 // Since the computation of water level can be a little involved, this routine 781 // Since the computation of water level can be a little involved, this routine
746 // is used ot fetch the level only once for each vehicle simulation step. 782 // is used ot fetch the level only once for each vehicle simulation step.
783 Vector3 lastRememberedWaterHeightPos = new Vector3(-1, -1, -1);
747 private float GetWaterLevel(Vector3 pos) 784 private float GetWaterLevel(Vector3 pos)
748 { 785 {
749 if ((m_knownHas & m_knownChangedWaterLevel) == 0) 786 if ((m_knownHas & m_knownChangedWaterLevel) == 0 || pos != lastRememberedWaterHeightPos)
750 { 787 {
751 m_knownWaterLevel = Prim.PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(pos); 788 lastRememberedWaterHeightPos = pos;
789 m_knownWaterLevel = ControllingPrim.PhysScene.TerrainManager.GetWaterLevelAtXYZ(pos);
752 m_knownHas |= m_knownChangedWaterLevel; 790 m_knownHas |= m_knownChangedWaterLevel;
753 } 791 }
754 return (float)m_knownWaterLevel; 792 return m_knownWaterLevel;
755 } 793 }
756 794
757 private Vector3 VehiclePosition 795 private Vector3 VehiclePosition
@@ -760,7 +798,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
760 { 798 {
761 if ((m_knownHas & m_knownChangedPosition) == 0) 799 if ((m_knownHas & m_knownChangedPosition) == 0)
762 { 800 {
763 m_knownPosition = Prim.ForcePosition; 801 m_knownPosition = ControllingPrim.ForcePosition;
764 m_knownHas |= m_knownChangedPosition; 802 m_knownHas |= m_knownChangedPosition;
765 } 803 }
766 return m_knownPosition; 804 return m_knownPosition;
@@ -779,7 +817,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
779 { 817 {
780 if ((m_knownHas & m_knownChangedOrientation) == 0) 818 if ((m_knownHas & m_knownChangedOrientation) == 0)
781 { 819 {
782 m_knownOrientation = Prim.ForceOrientation; 820 m_knownOrientation = ControllingPrim.ForceOrientation;
783 m_knownHas |= m_knownChangedOrientation; 821 m_knownHas |= m_knownChangedOrientation;
784 } 822 }
785 return m_knownOrientation; 823 return m_knownOrientation;
@@ -798,7 +836,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
798 { 836 {
799 if ((m_knownHas & m_knownChangedVelocity) == 0) 837 if ((m_knownHas & m_knownChangedVelocity) == 0)
800 { 838 {
801 m_knownVelocity = Prim.ForceVelocity; 839 m_knownVelocity = ControllingPrim.ForceVelocity;
802 m_knownHas |= m_knownChangedVelocity; 840 m_knownHas |= m_knownChangedVelocity;
803 } 841 }
804 return m_knownVelocity; 842 return m_knownVelocity;
@@ -839,7 +877,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
839 { 877 {
840 if ((m_knownHas & m_knownChangedRotationalVelocity) == 0) 878 if ((m_knownHas & m_knownChangedRotationalVelocity) == 0)
841 { 879 {
842 m_knownRotationalVelocity = Prim.ForceRotationalVelocity; 880 m_knownRotationalVelocity = ControllingPrim.ForceRotationalVelocity;
843 m_knownHas |= m_knownChangedRotationalVelocity; 881 m_knownHas |= m_knownChangedRotationalVelocity;
844 } 882 }
845 return (Vector3)m_knownRotationalVelocity; 883 return (Vector3)m_knownRotationalVelocity;
@@ -877,14 +915,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin
877 { 915 {
878 get 916 get
879 { 917 {
880 if ((m_knownHas & m_knownChangedForwardVelocity) == 0) 918 return VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
881 {
882 m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
883 m_knownHas |= m_knownChangedForwardVelocity;
884 }
885 return m_knownForwardVelocity;
886 } 919 }
887 } 920 }
921
888 private float VehicleForwardSpeed 922 private float VehicleForwardSpeed
889 { 923 {
890 get 924 get
@@ -914,11 +948,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
914 // for the physics engine to note the changes so an UpdateProperties event will happen. 948 // for the physics engine to note the changes so an UpdateProperties event will happen.
915 PushKnownChanged(); 949 PushKnownChanged();
916 950
917 if (PhysicsScene.VehiclePhysicalLoggingEnabled) 951 if (m_physicsScene.VehiclePhysicalLoggingEnabled)
918 PhysicsScene.PE.DumpRigidBody(PhysicsScene.World, Prim.PhysBody); 952 m_physicsScene.PE.DumpRigidBody(m_physicsScene.World, ControllingPrim.PhysBody);
919 953
920 VDetailLog("{0},BSDynamics.Step,done,pos={1}, force={2},velocity={3},angvel={4}", 954 VDetailLog("{0},BSDynamics.Step,done,pos={1}, force={2},velocity={3},angvel={4}",
921 Prim.LocalID, VehiclePosition, m_knownForce, VehicleVelocity, VehicleRotationalVelocity); 955 ControllingPrim.LocalID, VehiclePosition, m_knownForce, VehicleVelocity, VehicleRotationalVelocity);
922 } 956 }
923 957
924 // Called after the simulation step 958 // Called after the simulation step
@@ -926,8 +960,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
926 { 960 {
927 if (!IsActive) return; 961 if (!IsActive) return;
928 962
929 if (PhysicsScene.VehiclePhysicalLoggingEnabled) 963 if (m_physicsScene.VehiclePhysicalLoggingEnabled)
930 PhysicsScene.PE.DumpRigidBody(PhysicsScene.World, Prim.PhysBody); 964 m_physicsScene.PE.DumpRigidBody(m_physicsScene.World, ControllingPrim.PhysBody);
931 } 965 }
932 966
933 // Apply the effect of the linear motor and other linear motions (like hover and float). 967 // Apply the effect of the linear motor and other linear motions (like hover and float).
@@ -935,6 +969,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
935 { 969 {
936 ComputeLinearVelocity(pTimestep); 970 ComputeLinearVelocity(pTimestep);
937 971
972 ComputeLinearDeflection(pTimestep);
973
938 ComputeLinearTerrainHeightCorrection(pTimestep); 974 ComputeLinearTerrainHeightCorrection(pTimestep);
939 975
940 ComputeLinearHover(pTimestep); 976 ComputeLinearHover(pTimestep);
@@ -950,11 +986,17 @@ namespace OpenSim.Region.Physics.BulletSPlugin
950 { 986 {
951 Vector3 vel = VehicleVelocity; 987 Vector3 vel = VehicleVelocity;
952 if ((m_flags & (VehicleFlag.NO_X)) != 0) 988 if ((m_flags & (VehicleFlag.NO_X)) != 0)
989 {
953 vel.X = 0; 990 vel.X = 0;
991 }
954 if ((m_flags & (VehicleFlag.NO_Y)) != 0) 992 if ((m_flags & (VehicleFlag.NO_Y)) != 0)
993 {
955 vel.Y = 0; 994 vel.Y = 0;
995 }
956 if ((m_flags & (VehicleFlag.NO_Z)) != 0) 996 if ((m_flags & (VehicleFlag.NO_Z)) != 0)
997 {
957 vel.Z = 0; 998 vel.Z = 0;
999 }
958 VehicleVelocity = vel; 1000 VehicleVelocity = vel;
959 } 1001 }
960 1002
@@ -966,13 +1008,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
966 Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG 1008 Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG
967 VehicleVelocity /= VehicleVelocity.Length(); 1009 VehicleVelocity /= VehicleVelocity.Length();
968 VehicleVelocity *= BSParam.VehicleMaxLinearVelocity; 1010 VehicleVelocity *= BSParam.VehicleMaxLinearVelocity;
969 VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}", 1011 VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}",
970 Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySquared, VehicleVelocity); 1012 ControllingPrim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySquared, VehicleVelocity);
971 } 1013 }
972 else if (newVelocityLengthSq < 0.001f) 1014 else if (newVelocityLengthSq < 0.001f)
973 VehicleVelocity = Vector3.Zero; 1015 VehicleVelocity = Vector3.Zero;
974 1016
975 VDetailLog("{0}, MoveLinear,done,isColl={1},newVel={2}", Prim.LocalID, Prim.IsColliding, VehicleVelocity ); 1017 VDetailLog("{0}, MoveLinear,done,isColl={1},newVel={2}", ControllingPrim.LocalID, ControllingPrim.HasSomeCollision, VehicleVelocity );
976 1018
977 } // end MoveLinear() 1019 } // end MoveLinear()
978 1020
@@ -980,9 +1022,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
980 { 1022 {
981 // Step the motor from the current value. Get the correction needed this step. 1023 // Step the motor from the current value. Get the correction needed this step.
982 Vector3 origVelW = VehicleVelocity; // DEBUG 1024 Vector3 origVelW = VehicleVelocity; // DEBUG
983 Vector3 currentVelV = VehicleVelocity * Quaternion.Inverse(VehicleOrientation); 1025 Vector3 currentVelV = VehicleForwardVelocity;
984 Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV); 1026 Vector3 linearMotorCorrectionV = m_linearMotor.Step(pTimestep, currentVelV);
985 1027
1028 // Friction reduces vehicle motion based on absolute speed. Slow vehicle down by friction.
1029 Vector3 frictionFactorV = ComputeFrictionFactor(m_linearFrictionTimescale, pTimestep);
1030 linearMotorCorrectionV -= (currentVelV * frictionFactorV);
1031
986 // Motor is vehicle coordinates. Rotate it to world coordinates 1032 // Motor is vehicle coordinates. Rotate it to world coordinates
987 Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation; 1033 Vector3 linearMotorVelocityW = linearMotorCorrectionV * VehicleOrientation;
988 1034
@@ -996,8 +1042,49 @@ namespace OpenSim.Region.Physics.BulletSPlugin
996 // Add this correction to the velocity to make it faster/slower. 1042 // Add this correction to the velocity to make it faster/slower.
997 VehicleVelocity += linearMotorVelocityW; 1043 VehicleVelocity += linearMotorVelocityW;
998 1044
999 VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},correctV={3},correctW={4},newVelW={5}", 1045 VDetailLog("{0}, MoveLinear,velocity,origVelW={1},velV={2},tgt={3},correctV={4},correctW={5},newVelW={6},fricFact={7}",
1000 Prim.LocalID, origVelW, currentVelV, linearMotorCorrectionV, linearMotorVelocityW, VehicleVelocity); 1046 ControllingPrim.LocalID, origVelW, currentVelV, m_linearMotor.TargetValue, linearMotorCorrectionV,
1047 linearMotorVelocityW, VehicleVelocity, frictionFactorV);
1048 }
1049
1050 //Given a Deflection Effiency and a Velocity, Returns a Velocity that is Partially Deflected onto the X Axis
1051 //Clamped so that a DeflectionTimescale of less then 1 does not increase force over original velocity
1052 private void ComputeLinearDeflection(float pTimestep)
1053 {
1054 Vector3 linearDeflectionV = Vector3.Zero;
1055 Vector3 velocityV = VehicleForwardVelocity;
1056
1057 if (BSParam.VehicleEnableLinearDeflection)
1058 {
1059 // Velocity in Y and Z dimensions is movement to the side or turning.
1060 // Compute deflection factor from the to the side and rotational velocity
1061 linearDeflectionV.Y = SortedClampInRange(0, (velocityV.Y * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Y);
1062 linearDeflectionV.Z = SortedClampInRange(0, (velocityV.Z * m_linearDeflectionEfficiency) / m_linearDeflectionTimescale, velocityV.Z);
1063
1064 // Velocity to the side and around is corrected and moved into the forward direction
1065 linearDeflectionV.X += Math.Abs(linearDeflectionV.Y);
1066 linearDeflectionV.X += Math.Abs(linearDeflectionV.Z);
1067
1068 // Scale the deflection to the fractional simulation time
1069 linearDeflectionV *= pTimestep;
1070
1071 // Subtract the sideways and rotational velocity deflection factors while adding the correction forward
1072 linearDeflectionV *= new Vector3(1, -1, -1);
1073
1074 // Correction is vehicle relative. Convert to world coordinates.
1075 Vector3 linearDeflectionW = linearDeflectionV * VehicleOrientation;
1076
1077 // Optionally, if not colliding, don't effect world downward velocity. Let falling things fall.
1078 if (BSParam.VehicleLinearDeflectionNotCollidingNoZ && !m_controllingPrim.HasSomeCollision)
1079 {
1080 linearDeflectionW.Z = 0f;
1081 }
1082
1083 VehicleVelocity += linearDeflectionW;
1084
1085 VDetailLog("{0}, MoveLinear,LinearDeflection,linDefEff={1},linDefTS={2},linDeflectionV={3}",
1086 ControllingPrim.LocalID, m_linearDeflectionEfficiency, m_linearDeflectionTimescale, linearDeflectionV);
1087 }
1001 } 1088 }
1002 1089
1003 public void ComputeLinearTerrainHeightCorrection(float pTimestep) 1090 public void ComputeLinearTerrainHeightCorrection(float pTimestep)
@@ -1011,7 +1098,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1011 newPosition.Z = GetTerrainHeight(VehiclePosition) + 1f; 1098 newPosition.Z = GetTerrainHeight(VehiclePosition) + 1f;
1012 VehiclePosition = newPosition; 1099 VehiclePosition = newPosition;
1013 VDetailLog("{0}, MoveLinear,terrainHeight,terrainHeight={1},pos={2}", 1100 VDetailLog("{0}, MoveLinear,terrainHeight,terrainHeight={1},pos={2}",
1014 Prim.LocalID, GetTerrainHeight(VehiclePosition), VehiclePosition); 1101 ControllingPrim.LocalID, GetTerrainHeight(VehiclePosition), VehiclePosition);
1015 } 1102 }
1016 } 1103 }
1017 1104
@@ -1034,14 +1121,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1034 { 1121 {
1035 m_VhoverTargetHeight = m_VhoverHeight; 1122 m_VhoverTargetHeight = m_VhoverHeight;
1036 } 1123 }
1037
1038 if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0) 1124 if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0)
1039 { 1125 {
1040 // If body is already heigher, use its height as target height 1126 // If body is already heigher, use its height as target height
1041 if (VehiclePosition.Z > m_VhoverTargetHeight) 1127 if (VehiclePosition.Z > m_VhoverTargetHeight)
1042 m_VhoverTargetHeight = VehiclePosition.Z; 1128 m_VhoverTargetHeight = VehiclePosition.Z;
1043 } 1129 }
1044 1130
1045 if ((m_flags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0) 1131 if ((m_flags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0)
1046 { 1132 {
1047 if (Math.Abs(VehiclePosition.Z - m_VhoverTargetHeight) > 0.2f) 1133 if (Math.Abs(VehiclePosition.Z - m_VhoverTargetHeight) > 0.2f)
@@ -1050,7 +1136,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1050 pos.Z = m_VhoverTargetHeight; 1136 pos.Z = m_VhoverTargetHeight;
1051 VehiclePosition = pos; 1137 VehiclePosition = pos;
1052 1138
1053 VDetailLog("{0}, MoveLinear,hover,pos={1},lockHoverHeight", Prim.LocalID, pos); 1139 VDetailLog("{0}, MoveLinear,hover,pos={1},lockHoverHeight", ControllingPrim.LocalID, pos);
1054 } 1140 }
1055 } 1141 }
1056 else 1142 else
@@ -1079,11 +1165,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1079 */ 1165 */
1080 1166
1081 VDetailLog("{0}, MoveLinear,hover,pos={1},eff={2},hoverTS={3},height={4},target={5},err={6},corr={7}", 1167 VDetailLog("{0}, MoveLinear,hover,pos={1},eff={2},hoverTS={3},height={4},target={5},err={6},corr={7}",
1082 Prim.LocalID, VehiclePosition, m_VhoverEfficiency, 1168 ControllingPrim.LocalID, VehiclePosition, m_VhoverEfficiency,
1083 m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight, 1169 m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight,
1084 verticalError, verticalCorrection); 1170 verticalError, verticalCorrection);
1085 } 1171 }
1086
1087 } 1172 }
1088 } 1173 }
1089 1174
@@ -1124,7 +1209,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1124 { 1209 {
1125 VehiclePosition = pos; 1210 VehiclePosition = pos;
1126 VDetailLog("{0}, MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}", 1211 VDetailLog("{0}, MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}",
1127 Prim.LocalID, m_BlockingEndPoint, posChange, pos); 1212 ControllingPrim.LocalID, m_BlockingEndPoint, posChange, pos);
1128 } 1213 }
1129 } 1214 }
1130 return changed; 1215 return changed;
@@ -1135,7 +1220,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1135 // used with conjunction with banking: the strength of the banking will decay when the 1220 // used with conjunction with banking: the strength of the banking will decay when the
1136 // vehicle no longer experiences collisions. The decay timescale is the same as 1221 // vehicle no longer experiences collisions. The decay timescale is the same as
1137 // VEHICLE_BANKING_TIMESCALE. This is to help prevent ground vehicles from steering 1222 // VEHICLE_BANKING_TIMESCALE. This is to help prevent ground vehicles from steering
1138 // when they are in mid jump. 1223 // when they are in mid jump.
1139 // TODO: this code is wrong. Also, what should it do for boats (height from water)? 1224 // TODO: this code is wrong. Also, what should it do for boats (height from water)?
1140 // This is just using the ground and a general collision check. Should really be using 1225 // This is just using the ground and a general collision check. Should really be using
1141 // a downward raycast to find what is below. 1226 // a downward raycast to find what is below.
@@ -1148,7 +1233,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1148 float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition); 1233 float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition);
1149 distanceAboveGround = VehiclePosition.Z - targetHeight; 1234 distanceAboveGround = VehiclePosition.Z - targetHeight;
1150 // Not colliding if the vehicle is off the ground 1235 // Not colliding if the vehicle is off the ground
1151 if (!Prim.IsColliding) 1236 if (!Prim.HasSomeCollision)
1152 { 1237 {
1153 // downForce = new Vector3(0, 0, -distanceAboveGround / m_bankingTimescale); 1238 // downForce = new Vector3(0, 0, -distanceAboveGround / m_bankingTimescale);
1154 VehicleVelocity += new Vector3(0, 0, -distanceAboveGround); 1239 VehicleVelocity += new Vector3(0, 0, -distanceAboveGround);
@@ -1159,12 +1244,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1159 // be computed with a motor. 1244 // be computed with a motor.
1160 // TODO: add interaction with banking. 1245 // TODO: add interaction with banking.
1161 VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}", 1246 VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}",
1162 Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret); 1247 Prim.LocalID, distanceAboveGround, Prim.HasSomeCollision, ret);
1163 */ 1248 */
1164 1249
1165 // Another approach is to measure if we're going up. If going up and not colliding, 1250 // Another approach is to measure if we're going up. If going up and not colliding,
1166 // the vehicle is in the air. Fix that by pushing down. 1251 // the vehicle is in the air. Fix that by pushing down.
1167 if (!Prim.IsColliding && VehicleVelocity.Z > 0.1) 1252 if (!ControllingPrim.HasSomeCollision && VehicleVelocity.Z > 0.1)
1168 { 1253 {
1169 // Get rid of any of the velocity vector that is pushing us up. 1254 // Get rid of any of the velocity vector that is pushing us up.
1170 float upVelocity = VehicleVelocity.Z; 1255 float upVelocity = VehicleVelocity.Z;
@@ -1186,7 +1271,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1186 } 1271 }
1187 */ 1272 */
1188 VDetailLog("{0}, MoveLinear,limitMotorUp,collide={1},upVel={2},newVel={3}", 1273 VDetailLog("{0}, MoveLinear,limitMotorUp,collide={1},upVel={2},newVel={3}",
1189 Prim.LocalID, Prim.IsColliding, upVelocity, VehicleVelocity); 1274 ControllingPrim.LocalID, ControllingPrim.HasSomeCollision, upVelocity, VehicleVelocity);
1190 } 1275 }
1191 } 1276 }
1192 } 1277 }
@@ -1196,14 +1281,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1196 Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass; 1281 Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass;
1197 1282
1198 // Hack to reduce downward force if the vehicle is probably sitting on the ground 1283 // Hack to reduce downward force if the vehicle is probably sitting on the ground
1199 if (Prim.IsColliding && IsGroundVehicle) 1284 if (ControllingPrim.HasSomeCollision && IsGroundVehicle)
1200 appliedGravity *= BSParam.VehicleGroundGravityFudge; 1285 appliedGravity *= BSParam.VehicleGroundGravityFudge;
1201 1286
1202 VehicleAddForce(appliedGravity); 1287 VehicleAddForce(appliedGravity);
1203 1288
1204 VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},collid={2},fudge={3},mass={4},appliedForce={3}", 1289 VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},collid={2},fudge={3},mass={4},appliedForce={5}",
1205 Prim.LocalID, m_VehicleGravity, 1290 ControllingPrim.LocalID, m_VehicleGravity,
1206 Prim.IsColliding, BSParam.VehicleGroundGravityFudge, m_vehicleMass, appliedGravity); 1291 ControllingPrim.HasSomeCollision, BSParam.VehicleGroundGravityFudge, m_vehicleMass, appliedGravity);
1207 } 1292 }
1208 1293
1209 // ======================================================================= 1294 // =======================================================================
@@ -1227,11 +1312,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1227 { 1312 {
1228 // The vehicle is not adding anything angular wise. 1313 // The vehicle is not adding anything angular wise.
1229 VehicleRotationalVelocity = Vector3.Zero; 1314 VehicleRotationalVelocity = Vector3.Zero;
1230 VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID); 1315 VDetailLog("{0}, MoveAngular,done,zero", ControllingPrim.LocalID);
1231 } 1316 }
1232 else 1317 else
1233 { 1318 {
1234 VDetailLog("{0}, MoveAngular,done,nonZero,angVel={1}", Prim.LocalID, VehicleRotationalVelocity); 1319 VDetailLog("{0}, MoveAngular,done,nonZero,angVel={1}", ControllingPrim.LocalID, VehicleRotationalVelocity);
1235 } 1320 }
1236 1321
1237 // ================================================================== 1322 // ==================================================================
@@ -1262,7 +1347,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1262 torqueFromOffset.Z = 0; 1347 torqueFromOffset.Z = 0;
1263 1348
1264 VehicleAddAngularForce(torqueFromOffset * m_vehicleMass); 1349 VehicleAddAngularForce(torqueFromOffset * m_vehicleMass);
1265 VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", Prim.LocalID, torqueFromOffset); 1350 VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", ControllingPrim.LocalID, torqueFromOffset);
1266 } 1351 }
1267 1352
1268 } 1353 }
@@ -1270,6 +1355,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1270 private void ComputeAngularTurning(float pTimestep) 1355 private void ComputeAngularTurning(float pTimestep)
1271 { 1356 {
1272 // The user wants this many radians per second angular change? 1357 // The user wants this many radians per second angular change?
1358 Vector3 origVehicleRotationalVelocity = VehicleRotationalVelocity; // DEBUG DEBUG
1273 Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation); 1359 Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
1274 Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV); 1360 Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV);
1275 1361
@@ -1277,18 +1363,25 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1277 // From http://wiki.secondlife.com/wiki/LlSetVehicleFlags : 1363 // From http://wiki.secondlife.com/wiki/LlSetVehicleFlags :
1278 // This flag prevents linear deflection parallel to world z-axis. This is useful 1364 // This flag prevents linear deflection parallel to world z-axis. This is useful
1279 // for preventing ground vehicles with large linear deflection, like bumper cars, 1365 // for preventing ground vehicles with large linear deflection, like bumper cars,
1280 // from climbing their linear deflection into the sky. 1366 // from climbing their linear deflection into the sky.
1281 // That is, NO_DEFLECTION_UP says angular motion should not add any pitch or roll movement 1367 // That is, NO_DEFLECTION_UP says angular motion should not add any pitch or roll movement
1282 // TODO: This is here because this is where ODE put it but documentation says it 1368 // TODO: This is here because this is where ODE put it but documentation says it
1283 // is a linear effect. Where should this check go? 1369 // is a linear effect. Where should this check go?
1284 //if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) 1370 //if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
1285 // { 1371 // {
1286 // angularMotorContributionV.X = 0f; 1372 // angularMotorContributionV.X = 0f;
1287 // angularMotorContributionV.Y = 0f; 1373 // angularMotorContributionV.Y = 0f;
1288 // } 1374 // }
1289 1375
1290 VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation; 1376 // Reduce any velocity by friction.
1291 VDetailLog("{0}, MoveAngular,angularTurning,angularMotorContrib={1}", Prim.LocalID, angularMotorContributionV); 1377 Vector3 frictionFactorW = ComputeFrictionFactor(m_angularFrictionTimescale, pTimestep);
1378 angularMotorContributionV -= (currentAngularV * frictionFactorW);
1379
1380 Vector3 angularMotorContributionW = angularMotorContributionV * VehicleOrientation;
1381 VehicleRotationalVelocity += angularMotorContributionW;
1382
1383 VDetailLog("{0}, MoveAngular,angularTurning,curAngVelV={1},origVehRotVel={2},vehRotVel={3},frictFact={4}, angContribV={5},angContribW={6}",
1384 ControllingPrim.LocalID, currentAngularV, origVehicleRotationalVelocity, VehicleRotationalVelocity, frictionFactorW, angularMotorContributionV, angularMotorContributionW);
1292 } 1385 }
1293 1386
1294 // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: 1387 // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial:
@@ -1303,86 +1396,136 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1303 { 1396 {
1304 1397
1305 // If vertical attaction timescale is reasonable 1398 // If vertical attaction timescale is reasonable
1306 if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff) 1399 if (BSParam.VehicleEnableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
1307 { 1400 {
1308 // Possible solution derived from a discussion at: 1401 Vector3 vehicleUpAxis = Vector3.UnitZ * VehicleOrientation;
1309 // http://stackoverflow.com/questions/14939657/computing-vector-from-quaternion-works-computing-quaternion-from-vector-does-no 1402 switch (BSParam.VehicleAngularVerticalAttractionAlgorithm)
1310
1311 // Create a rotation that is only the vehicle's rotation around Z
1312 Vector3 currentEuler = Vector3.Zero;
1313 VehicleOrientation.GetEulerAngles(out currentEuler.X, out currentEuler.Y, out currentEuler.Z);
1314 Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEuler.Z);
1315
1316 // Create the axis that is perpendicular to the up vector and the rotated up vector.
1317 Vector3 differenceAxis = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation);
1318 // Compute the angle between those to vectors.
1319 double differenceAngle = Math.Acos((double)Vector3.Dot(Vector3.UnitZ, Vector3.Normalize(Vector3.UnitZ * VehicleOrientation)));
1320 // 'differenceAngle' is the angle to rotate and 'differenceAxis' is the plane to rotate in to get the vehicle vertical
1321
1322 // Reduce the change by the time period it is to change in. Timestep is handled when velocity is applied.
1323 // TODO: add 'efficiency'.
1324 differenceAngle /= m_verticalAttractionTimescale;
1325
1326 // Create the quaterian representing the correction angle
1327 Quaternion correctionRotation = Quaternion.CreateFromAxisAngle(differenceAxis, (float)differenceAngle);
1328
1329 // Turn that quaternion into Euler values to make it into velocities to apply.
1330 Vector3 vertContributionV = Vector3.Zero;
1331 correctionRotation.GetEulerAngles(out vertContributionV.X, out vertContributionV.Y, out vertContributionV.Z);
1332 vertContributionV *= -1f;
1333
1334 VehicleRotationalVelocity += vertContributionV;
1335
1336 VDetailLog("{0}, MoveAngular,verticalAttraction,diffAxis={1},diffAng={2},corrRot={3},contrib={4}",
1337 Prim.LocalID,
1338 differenceAxis,
1339 differenceAngle,
1340 correctionRotation,
1341 vertContributionV);
1342
1343 // ===================================================================
1344 /*
1345 Vector3 vertContributionV = Vector3.Zero;
1346 Vector3 origRotVelW = VehicleRotationalVelocity; // DEBUG DEBUG
1347
1348 // Take a vector pointing up and convert it from world to vehicle relative coords.
1349 Vector3 verticalError = Vector3.Normalize(Vector3.UnitZ * VehicleOrientation);
1350
1351 // If vertical attraction correction is needed, the vector that was pointing up (UnitZ)
1352 // is now:
1353 // leaning to one side: rotated around the X axis with the Y value going
1354 // from zero (nearly straight up) to one (completely to the side)) or
1355 // leaning front-to-back: rotated around the Y axis with the value of X being between
1356 // zero and one.
1357 // The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees.
1358
1359 // Y error means needed rotation around X axis and visa versa.
1360 // Since the error goes from zero to one, the asin is the corresponding angle.
1361 vertContributionV.X = (float)Math.Asin(verticalError.Y);
1362 // (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
1363 vertContributionV.Y = -(float)Math.Asin(verticalError.X);
1364
1365 // If verticalError.Z is negative, the vehicle is upside down. Add additional push.
1366 if (verticalError.Z < 0f)
1367 { 1403 {
1368 vertContributionV.X += Math.Sign(vertContributionV.X) * PIOverFour; 1404 case 0:
1369 // vertContribution.Y -= PIOverFour; 1405 {
1406 //Another formula to try got from :
1407 //http://answers.unity3d.com/questions/10425/how-to-stabilize-angular-motion-alignment-of-hover.html
1408
1409 // Flipping what was originally a timescale into a speed variable and then multiplying it by 2
1410 // since only computing half the distance between the angles.
1411 float verticalAttractionSpeed = (1 / m_verticalAttractionTimescale) * 2.0f;
1412
1413 // Make a prediction of where the up axis will be when this is applied rather then where it is now as
1414 // this makes for a smoother adjustment and less fighting between the various forces.
1415 Vector3 predictedUp = vehicleUpAxis * Quaternion.CreateFromAxisAngle(VehicleRotationalVelocity, 0f);
1416
1417 // This is only half the distance to the target so it will take 2 seconds to complete the turn.
1418 Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.UnitZ);
1419
1420 // Scale vector by our timescale since it is an acceleration it is r/s^2 or radians a timescale squared
1421 Vector3 vertContributionV = torqueVector * verticalAttractionSpeed * verticalAttractionSpeed;
1422
1423 VehicleRotationalVelocity += vertContributionV;
1424
1425 VDetailLog("{0}, MoveAngular,verticalAttraction,vertAttrSpeed={1},upAxis={2},PredictedUp={3},torqueVector={4},contrib={5}",
1426 ControllingPrim.LocalID,
1427 verticalAttractionSpeed,
1428 vehicleUpAxis,
1429 predictedUp,
1430 torqueVector,
1431 vertContributionV);
1432 break;
1433 }
1434 case 1:
1435 {
1436 // Possible solution derived from a discussion at:
1437 // http://stackoverflow.com/questions/14939657/computing-vector-from-quaternion-works-computing-quaternion-from-vector-does-no
1438
1439 // Create a rotation that is only the vehicle's rotation around Z
1440 Vector3 currentEulerW = Vector3.Zero;
1441 VehicleOrientation.GetEulerAngles(out currentEulerW.X, out currentEulerW.Y, out currentEulerW.Z);
1442 Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEulerW.Z);
1443
1444 // Create the axis that is perpendicular to the up vector and the rotated up vector.
1445 Vector3 differenceAxisW = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation);
1446 // Compute the angle between those to vectors.
1447 double differenceAngle = Math.Acos((double)Vector3.Dot(Vector3.UnitZ, Vector3.Normalize(Vector3.UnitZ * VehicleOrientation)));
1448 // 'differenceAngle' is the angle to rotate and 'differenceAxis' is the plane to rotate in to get the vehicle vertical
1449
1450 // Reduce the change by the time period it is to change in. Timestep is handled when velocity is applied.
1451 // TODO: add 'efficiency'.
1452 // differenceAngle /= m_verticalAttractionTimescale;
1453
1454 // Create the quaterian representing the correction angle
1455 Quaternion correctionRotationW = Quaternion.CreateFromAxisAngle(differenceAxisW, (float)differenceAngle);
1456
1457 // Turn that quaternion into Euler values to make it into velocities to apply.
1458 Vector3 vertContributionW = Vector3.Zero;
1459 correctionRotationW.GetEulerAngles(out vertContributionW.X, out vertContributionW.Y, out vertContributionW.Z);
1460 vertContributionW *= -1f;
1461 vertContributionW /= m_verticalAttractionTimescale;
1462
1463 VehicleRotationalVelocity += vertContributionW;
1464
1465 VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},diffAxis={2},diffAng={3},corrRot={4},contrib={5}",
1466 ControllingPrim.LocalID,
1467 vehicleUpAxis,
1468 differenceAxisW,
1469 differenceAngle,
1470 correctionRotationW,
1471 vertContributionW);
1472 break;
1473 }
1474 case 2:
1475 {
1476 Vector3 vertContributionV = Vector3.Zero;
1477 Vector3 origRotVelW = VehicleRotationalVelocity; // DEBUG DEBUG
1478
1479 // Take a vector pointing up and convert it from world to vehicle relative coords.
1480 Vector3 verticalError = Vector3.Normalize(Vector3.UnitZ * VehicleOrientation);
1481
1482 // If vertical attraction correction is needed, the vector that was pointing up (UnitZ)
1483 // is now:
1484 // leaning to one side: rotated around the X axis with the Y value going
1485 // from zero (nearly straight up) to one (completely to the side)) or
1486 // leaning front-to-back: rotated around the Y axis with the value of X being between
1487 // zero and one.
1488 // The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees.
1489
1490 // Y error means needed rotation around X axis and visa versa.
1491 // Since the error goes from zero to one, the asin is the corresponding angle.
1492 vertContributionV.X = (float)Math.Asin(verticalError.Y);
1493 // (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
1494 vertContributionV.Y = -(float)Math.Asin(verticalError.X);
1495
1496 // If verticalError.Z is negative, the vehicle is upside down. Add additional push.
1497 if (verticalError.Z < 0f)
1498 {
1499 vertContributionV.X += Math.Sign(vertContributionV.X) * PIOverFour;
1500 // vertContribution.Y -= PIOverFour;
1501 }
1502
1503 // 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
1504 // Correction happens over a number of seconds.
1505 Vector3 unscaledContribVerticalErrorV = vertContributionV; // DEBUG DEBUG
1506
1507 // The correction happens over the user's time period
1508 vertContributionV /= m_verticalAttractionTimescale;
1509
1510 // Rotate the vehicle rotation to the world coordinates.
1511 VehicleRotationalVelocity += (vertContributionV * VehicleOrientation);
1512
1513 VDetailLog("{0}, MoveAngular,verticalAttraction,,upAxis={1},origRotVW={2},vertError={3},unscaledV={4},eff={5},ts={6},vertContribV={7}",
1514 ControllingPrim.LocalID,
1515 vehicleUpAxis,
1516 origRotVelW,
1517 verticalError,
1518 unscaledContribVerticalErrorV,
1519 m_verticalAttractionEfficiency,
1520 m_verticalAttractionTimescale,
1521 vertContributionV);
1522 break;
1523 }
1524 default:
1525 {
1526 break;
1527 }
1370 } 1528 }
1371
1372 // 'vertContrbution' is now the necessary angular correction to correct tilt in one second.
1373 // Correction happens over a number of seconds.
1374 Vector3 unscaledContribVerticalErrorV = vertContributionV; // DEBUG DEBUG
1375
1376 // The correction happens over the user's time period
1377 vertContributionV /= m_verticalAttractionTimescale;
1378
1379 // Rotate the vehicle rotation to the world coordinates.
1380 VehicleRotationalVelocity += (vertContributionV * VehicleOrientation);
1381
1382 VDetailLog("{0}, MoveAngular,verticalAttraction,,origRotVW={1},vertError={2},unscaledV={3},eff={4},ts={5},vertContribV={6}",
1383 Prim.LocalID, origRotVelW, verticalError, unscaledContribVerticalErrorV,
1384 m_verticalAttractionEfficiency, m_verticalAttractionTimescale, vertContributionV);
1385 */
1386 } 1529 }
1387 } 1530 }
1388 1531
@@ -1392,13 +1535,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1392 // in that direction. 1535 // in that direction.
1393 // TODO: implement reference frame. 1536 // TODO: implement reference frame.
1394 public void ComputeAngularDeflection() 1537 public void ComputeAngularDeflection()
1395 { 1538 {
1396 // Since angularMotorUp and angularDeflection are computed independently, they will calculate
1397 // approximately the same X or Y correction. When added together (when contributions are combined)
1398 // this creates an over-correction and then wabbling as the target is overshot.
1399 // TODO: rethink how the different correction computations inter-relate.
1400 1539
1401 if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2) 1540 if (BSParam.VehicleEnableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
1402 { 1541 {
1403 Vector3 deflectContributionV = Vector3.Zero; 1542 Vector3 deflectContributionV = Vector3.Zero;
1404 1543
@@ -1411,10 +1550,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1411 1550
1412 // The direction the vehicle is pointing 1551 // The direction the vehicle is pointing
1413 Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; 1552 Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation;
1414 pointingDirection.Normalize(); 1553 //Predict where the Vehicle will be pointing after AngularVelocity change is applied. This will keep
1554 // from overshooting and allow this correction to merge with the Vertical Attraction peacefully.
1555 Vector3 predictedPointingDirection = pointingDirection * Quaternion.CreateFromAxisAngle(VehicleRotationalVelocity, 0f);
1556 predictedPointingDirection.Normalize();
1415 1557
1416 // The difference between what is and what should be. 1558 // The difference between what is and what should be.
1417 Vector3 deflectionError = movingDirection - pointingDirection; 1559 // Vector3 deflectionError = movingDirection - predictedPointingDirection;
1560 Vector3 deflectionError = Vector3.Cross(movingDirection, predictedPointingDirection);
1418 1561
1419 // Don't try to correct very large errors (not our job) 1562 // Don't try to correct very large errors (not our job)
1420 // if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X); 1563 // if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X);
@@ -1427,15 +1570,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1427 // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError); 1570 // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
1428 1571
1429 // Scale the correction by recovery timescale and efficiency 1572 // Scale the correction by recovery timescale and efficiency
1430 deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency; 1573 // Not modeling a spring so clamp the scale to no more then the arc
1431 deflectContributionV /= m_angularDeflectionTimescale; 1574 deflectContributionV = (-deflectionError) * ClampInRange(0, m_angularDeflectionEfficiency/m_angularDeflectionTimescale,1f);
1432 1575 //deflectContributionV /= m_angularDeflectionTimescale;
1433 VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
1434 1576
1577 // VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
1578 VehicleRotationalVelocity += deflectContributionV;
1435 VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}", 1579 VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
1436 Prim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV); 1580 ControllingPrim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV);
1437 VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}", 1581 VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3},PredictedPointingDir={4}",
1438 Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale); 1582 ControllingPrim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale, predictedPointingDirection);
1439 } 1583 }
1440 } 1584 }
1441 1585
@@ -1447,13 +1591,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1447 // produce a angular velocity around the yaw-axis, causing the vehicle to turn. The magnitude 1591 // produce a angular velocity around the yaw-axis, causing the vehicle to turn. The magnitude
1448 // of the yaw effect will be proportional to the 1592 // of the yaw effect will be proportional to the
1449 // VEHICLE_BANKING_EFFICIENCY, the angle of the roll rotation, and sometimes the vehicle's 1593 // VEHICLE_BANKING_EFFICIENCY, the angle of the roll rotation, and sometimes the vehicle's
1450 // velocity along its preferred axis of motion. 1594 // velocity along its preferred axis of motion.
1451 // The VEHICLE_BANKING_EFFICIENCY can vary between -1 and +1. When it is positive then any 1595 // The VEHICLE_BANKING_EFFICIENCY can vary between -1 and +1. When it is positive then any
1452 // positive rotation (by the right-hand rule) about the roll-axis will effect a 1596 // positive rotation (by the right-hand rule) about the roll-axis will effect a
1453 // (negative) torque around the yaw-axis, making it turn to the right--that is the 1597 // (negative) torque around the yaw-axis, making it turn to the right--that is the
1454 // vehicle will lean into the turn, which is how real airplanes and motorcycle's work. 1598 // vehicle will lean into the turn, which is how real airplanes and motorcycle's work.
1455 // Negating the banking coefficient will make it so that the vehicle leans to the 1599 // Negating the banking coefficient will make it so that the vehicle leans to the
1456 // outside of the turn (not very "physical" but might allow interesting vehicles so why not?). 1600 // outside of the turn (not very "physical" but might allow interesting vehicles so why not?).
1457 // The VEHICLE_BANKING_MIX is a fake (i.e. non-physical) parameter that is useful for making 1601 // The VEHICLE_BANKING_MIX is a fake (i.e. non-physical) parameter that is useful for making
1458 // banking vehicles do what you want rather than what the laws of physics allow. 1602 // banking vehicles do what you want rather than what the laws of physics allow.
1459 // For example, consider a real motorcycle...it must be moving forward in order for 1603 // For example, consider a real motorcycle...it must be moving forward in order for
@@ -1465,14 +1609,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1465 // totally static (0.0) and totally dynamic (1.0). By "static" we mean that the 1609 // totally static (0.0) and totally dynamic (1.0). By "static" we mean that the
1466 // banking effect depends only on the vehicle's rotation about its roll-axis compared 1610 // banking effect depends only on the vehicle's rotation about its roll-axis compared
1467 // to "dynamic" where the banking is also proportional to its velocity along its 1611 // to "dynamic" where the banking is also proportional to its velocity along its
1468 // roll-axis. Finding the best value of the "mixture" will probably require trial and error. 1612 // roll-axis. Finding the best value of the "mixture" will probably require trial and error.
1469 // The time it takes for the banking behavior to defeat a preexisting angular velocity about the 1613 // The time it takes for the banking behavior to defeat a preexisting angular velocity about the
1470 // world z-axis is determined by the VEHICLE_BANKING_TIMESCALE. So if you want the vehicle to 1614 // world z-axis is determined by the VEHICLE_BANKING_TIMESCALE. So if you want the vehicle to
1471 // bank quickly then give it a banking timescale of about a second or less, otherwise you can 1615 // bank quickly then give it a banking timescale of about a second or less, otherwise you can
1472 // make a sluggish vehicle by giving it a timescale of several seconds. 1616 // make a sluggish vehicle by giving it a timescale of several seconds.
1473 public void ComputeAngularBanking() 1617 public void ComputeAngularBanking()
1474 { 1618 {
1475 if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) 1619 if (BSParam.VehicleEnableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff)
1476 { 1620 {
1477 Vector3 bankingContributionV = Vector3.Zero; 1621 Vector3 bankingContributionV = Vector3.Zero;
1478 1622
@@ -1498,10 +1642,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1498 1642
1499 //VehicleRotationalVelocity += bankingContributionV * VehicleOrientation; 1643 //VehicleRotationalVelocity += bankingContributionV * VehicleOrientation;
1500 VehicleRotationalVelocity += bankingContributionV; 1644 VehicleRotationalVelocity += bankingContributionV;
1501 1645
1502 1646
1503 VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}", 1647 VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},rollComp={3},yAng={4},mYAng={5},ret={6}",
1504 Prim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContributionV); 1648 ControllingPrim.LocalID, rollComponents, VehicleForwardSpeed, rollComponents, yawAngle, mixedYawAngle, bankingContributionV);
1505 } 1649 }
1506 } 1650 }
1507 1651
@@ -1540,8 +1684,37 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1540 if (rotq != m_rot) 1684 if (rotq != m_rot)
1541 { 1685 {
1542 VehicleOrientation = m_rot; 1686 VehicleOrientation = m_rot;
1543 VDetailLog("{0}, LimitRotation,done,orig={1},new={2}", Prim.LocalID, rotq, m_rot); 1687 VDetailLog("{0}, LimitRotation,done,orig={1},new={2}", ControllingPrim.LocalID, rotq, m_rot);
1688 }
1689
1690 }
1691
1692 // Given a friction vector (reduction in seconds) and a timestep, return the factor to reduce
1693 // some value by to apply this friction.
1694 private Vector3 ComputeFrictionFactor(Vector3 friction, float pTimestep)
1695 {
1696 Vector3 frictionFactor = Vector3.Zero;
1697 if (friction != BSMotor.InfiniteVector)
1698 {
1699 // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep;
1700 // Individual friction components can be 'infinite' so compute each separately.
1701 frictionFactor.X = (friction.X == BSMotor.Infinite) ? 0f : (1f / friction.X);
1702 frictionFactor.Y = (friction.Y == BSMotor.Infinite) ? 0f : (1f / friction.Y);
1703 frictionFactor.Z = (friction.Z == BSMotor.Infinite) ? 0f : (1f / friction.Z);
1704 frictionFactor *= pTimestep;
1705 }
1706 return frictionFactor;
1707 }
1708
1709 private float SortedClampInRange(float clampa, float val, float clampb)
1710 {
1711 if (clampa > clampb)
1712 {
1713 float temp = clampa;
1714 clampa = clampb;
1715 clampb = temp;
1544 } 1716 }
1717 return ClampInRange(clampa, val, clampb);
1545 1718
1546 } 1719 }
1547 1720
@@ -1554,8 +1727,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1554 // Invoke the detailed logger and output something if it's enabled. 1727 // Invoke the detailed logger and output something if it's enabled.
1555 private void VDetailLog(string msg, params Object[] args) 1728 private void VDetailLog(string msg, params Object[] args)
1556 { 1729 {
1557 if (Prim.PhysicsScene.VehicleLoggingEnabled) 1730 if (ControllingPrim.PhysScene.VehicleLoggingEnabled)
1558 Prim.PhysicsScene.DetailLog(msg, args); 1731 ControllingPrim.PhysScene.DetailLog(msg, args);
1559 } 1732 }
1560 } 1733 }
1561} 1734}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 4ece1eb..3afd52e 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -33,14 +33,6 @@ using OMV = OpenMetaverse;
33namespace OpenSim.Region.Physics.BulletSPlugin 33namespace OpenSim.Region.Physics.BulletSPlugin
34{ 34{
35 35
36// A BSPrim can get individual information about its linkedness attached
37// to it through an instance of a subclass of LinksetInfo.
38// Each type of linkset will define the information needed for its type.
39public abstract class BSLinksetInfo
40{
41 public virtual void Clear() { }
42}
43
44public abstract class BSLinkset 36public abstract class BSLinkset
45{ 37{
46 // private static string LogHeader = "[BULLETSIM LINKSET]"; 38 // private static string LogHeader = "[BULLETSIM LINKSET]";
@@ -56,15 +48,15 @@ public abstract class BSLinkset
56 { 48 {
57 BSLinkset ret = null; 49 BSLinkset ret = null;
58 50
59 switch ((int)BSParam.LinksetImplementation) 51 switch (parent.LinksetType)
60 { 52 {
61 case (int)LinksetImplementation.Constraint: 53 case LinksetImplementation.Constraint:
62 ret = new BSLinksetConstraints(physScene, parent); 54 ret = new BSLinksetConstraints(physScene, parent);
63 break; 55 break;
64 case (int)LinksetImplementation.Compound: 56 case LinksetImplementation.Compound:
65 ret = new BSLinksetCompound(physScene, parent); 57 ret = new BSLinksetCompound(physScene, parent);
66 break; 58 break;
67 case (int)LinksetImplementation.Manual: 59 case LinksetImplementation.Manual:
68 // ret = new BSLinksetManual(physScene, parent); 60 // ret = new BSLinksetManual(physScene, parent);
69 break; 61 break;
70 default: 62 default:
@@ -78,28 +70,33 @@ public abstract class BSLinkset
78 return ret; 70 return ret;
79 } 71 }
80 72
73 public class BSLinkInfo
74 {
75 public BSPrimLinkable member;
76 public BSLinkInfo(BSPrimLinkable pMember)
77 {
78 member = pMember;
79 }
80 }
81
82 public LinksetImplementation LinksetImpl { get; protected set; }
83
81 public BSPrimLinkable LinksetRoot { get; protected set; } 84 public BSPrimLinkable LinksetRoot { get; protected set; }
82 85
83 public BSScene PhysicsScene { get; private set; } 86 protected BSScene m_physicsScene { get; private set; }
84 87
85 static int m_nextLinksetID = 1; 88 static int m_nextLinksetID = 1;
86 public int LinksetID { get; private set; } 89 public int LinksetID { get; private set; }
87 90
88 // The children under the root in this linkset. 91 // The children under the root in this linkset.
89 protected HashSet<BSPrimLinkable> m_children; 92 // protected HashSet<BSPrimLinkable> m_children;
93 protected Dictionary<BSPrimLinkable, BSLinkInfo> m_children;
90 94
91 // We lock the diddling of linkset classes to prevent any badness. 95 // We lock the diddling of linkset classes to prevent any badness.
92 // This locks the modification of the instances of this class. Changes 96 // This locks the modification of the instances of this class. Changes
93 // to the physical representation is done via the tainting mechenism. 97 // to the physical representation is done via the tainting mechenism.
94 protected object m_linksetActivityLock = new Object(); 98 protected object m_linksetActivityLock = new Object();
95 99
96 // Some linksets have a preferred physical shape.
97 // Returns SHAPE_UNKNOWN if there is no preference. Causes the correct shape to be selected.
98 public virtual BSPhysicsShapeType PreferredPhysicalShape(BSPrimLinkable requestor)
99 {
100 return BSPhysicsShapeType.SHAPE_UNKNOWN;
101 }
102
103 // We keep the prim's mass in the linkset structure since it could be dependent on other prims 100 // We keep the prim's mass in the linkset structure since it could be dependent on other prims
104 public float LinksetMass { get; protected set; } 101 public float LinksetMass { get; protected set; }
105 102
@@ -122,9 +119,9 @@ public abstract class BSLinkset
122 // We create LOTS of linksets. 119 // We create LOTS of linksets.
123 if (m_nextLinksetID <= 0) 120 if (m_nextLinksetID <= 0)
124 m_nextLinksetID = 1; 121 m_nextLinksetID = 1;
125 PhysicsScene = scene; 122 m_physicsScene = scene;
126 LinksetRoot = parent; 123 LinksetRoot = parent;
127 m_children = new HashSet<BSPrimLinkable>(); 124 m_children = new Dictionary<BSPrimLinkable, BSLinkInfo>();
128 LinksetMass = parent.RawMass; 125 LinksetMass = parent.RawMass;
129 Rebuilding = false; 126 Rebuilding = false;
130 127
@@ -165,7 +162,7 @@ public abstract class BSLinkset
165 } 162 }
166 163
167 // The child is down to a linkset of just itself 164 // The child is down to a linkset of just itself
168 return BSLinkset.Factory(PhysicsScene, child); 165 return BSLinkset.Factory(m_physicsScene, child);
169 } 166 }
170 167
171 // Return 'true' if the passed object is the root object of this linkset 168 // Return 'true' if the passed object is the root object of this linkset
@@ -185,17 +182,7 @@ public abstract class BSLinkset
185 bool ret = false; 182 bool ret = false;
186 lock (m_linksetActivityLock) 183 lock (m_linksetActivityLock)
187 { 184 {
188 ret = m_children.Contains(child); 185 ret = m_children.ContainsKey(child);
189 /* Safer version but the above should work
190 foreach (BSPrimLinkable bp in m_children)
191 {
192 if (child.LocalID == bp.LocalID)
193 {
194 ret = true;
195 break;
196 }
197 }
198 */
199 } 186 }
200 return ret; 187 return ret;
201 } 188 }
@@ -209,7 +196,24 @@ public abstract class BSLinkset
209 lock (m_linksetActivityLock) 196 lock (m_linksetActivityLock)
210 { 197 {
211 action(LinksetRoot); 198 action(LinksetRoot);
212 foreach (BSPrimLinkable po in m_children) 199 foreach (BSPrimLinkable po in m_children.Keys)
200 {
201 if (action(po))
202 break;
203 }
204 }
205 return ret;
206 }
207
208 // Perform an action on each member of the linkset including root prim.
209 // Depends on the action on whether this should be done at taint time.
210 public delegate bool ForEachLinkInfoAction(BSLinkInfo obj);
211 public virtual bool ForEachLinkInfo(ForEachLinkInfoAction action)
212 {
213 bool ret = false;
214 lock (m_linksetActivityLock)
215 {
216 foreach (BSLinkInfo po in m_children.Values)
213 { 217 {
214 if (action(po)) 218 if (action(po))
215 break; 219 break;
@@ -218,10 +222,37 @@ public abstract class BSLinkset
218 return ret; 222 return ret;
219 } 223 }
220 224
225 // Called after a simulation step to post a collision with this object.
226 // Return 'true' if linkset processed the collision. 'false' says the linkset didn't have
227 // anything to add for the collision and it should be passed through normal processing.
228 // Default processing for a linkset.
229 public virtual bool HandleCollide(uint collidingWith, BSPhysObject collidee,
230 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
231 {
232 bool ret = false;
233
234 // prims in the same linkset cannot collide with each other
235 BSPrimLinkable convCollidee = collidee as BSPrimLinkable;
236 if (convCollidee != null && (LinksetID == convCollidee.Linkset.LinksetID))
237 {
238 // By returning 'true', we tell the caller the collision has been 'handled' so it won't
239 // do anything about this collision and thus, effectivily, ignoring the collision.
240 ret = true;
241 }
242 else
243 {
244 // Not a collision between members of the linkset. Must be a real collision.
245 // So the linkset root can know if there is a collision anywhere in the linkset.
246 LinksetRoot.SomeCollisionSimulationStep = m_physicsScene.SimulationStep;
247 }
248
249 return ret;
250 }
251
221 // I am the root of a linkset and a new child is being added 252 // I am the root of a linkset and a new child is being added
222 // Called while LinkActivity is locked. 253 // Called while LinkActivity is locked.
223 protected abstract void AddChildToLinkset(BSPrimLinkable child); 254 protected abstract void AddChildToLinkset(BSPrimLinkable child);
224 255
225 // I am the root of a linkset and one of my children is being removed. 256 // I am the root of a linkset and one of my children is being removed.
226 // Safe to call even if the child is not really in my linkset. 257 // Safe to call even if the child is not really in my linkset.
227 protected abstract void RemoveChildFromLinkset(BSPrimLinkable child); 258 protected abstract void RemoveChildFromLinkset(BSPrimLinkable child);
@@ -263,8 +294,87 @@ public abstract class BSLinkset
263 // This is called when the root body is changing. 294 // This is called when the root body is changing.
264 // Returns 'true' of something was actually removed and would need restoring 295 // Returns 'true' of something was actually removed and would need restoring
265 // Called at taint-time!! 296 // Called at taint-time!!
266 public abstract bool RemoveBodyDependencies(BSPrimLinkable child); 297 public abstract bool RemoveDependencies(BSPrimLinkable child);
298
299 // ================================================================
300 // Some physical setting happen to all members of the linkset
301 public virtual void SetPhysicalFriction(float friction)
302 {
303 ForEachMember((member) =>
304 {
305 if (member.PhysBody.HasPhysicalBody)
306 m_physicsScene.PE.SetFriction(member.PhysBody, friction);
307 return false; // 'false' says to continue looping
308 }
309 );
310 }
311 public virtual void SetPhysicalRestitution(float restitution)
312 {
313 ForEachMember((member) =>
314 {
315 if (member.PhysBody.HasPhysicalBody)
316 m_physicsScene.PE.SetRestitution(member.PhysBody, restitution);
317 return false; // 'false' says to continue looping
318 }
319 );
320 }
321 public virtual void SetPhysicalGravity(OMV.Vector3 gravity)
322 {
323 ForEachMember((member) =>
324 {
325 if (member.PhysBody.HasPhysicalBody)
326 m_physicsScene.PE.SetGravity(member.PhysBody, gravity);
327 return false; // 'false' says to continue looping
328 }
329 );
330 }
331 public virtual void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
332 {
333 ForEachMember((member) =>
334 {
335 if (member.PhysBody.HasPhysicalBody)
336 {
337 OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, linksetMass);
338 member.Inertia = inertia * inertiaFactor;
339 m_physicsScene.PE.SetMassProps(member.PhysBody, linksetMass, member.Inertia);
340 m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
341 DetailLog("{0},BSLinkset.ComputeAndSetLocalInertia,m.mass={1}, inertia={2}", member.LocalID, linksetMass, member.Inertia);
267 342
343 }
344 return false; // 'false' says to continue looping
345 }
346 );
347 }
348 public virtual void SetPhysicalCollisionFlags(CollisionFlags collFlags)
349 {
350 ForEachMember((member) =>
351 {
352 if (member.PhysBody.HasPhysicalBody)
353 m_physicsScene.PE.SetCollisionFlags(member.PhysBody, collFlags);
354 return false; // 'false' says to continue looping
355 }
356 );
357 }
358 public virtual void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
359 {
360 ForEachMember((member) =>
361 {
362 if (member.PhysBody.HasPhysicalBody)
363 m_physicsScene.PE.AddToCollisionFlags(member.PhysBody, collFlags);
364 return false; // 'false' says to continue looping
365 }
366 );
367 }
368 public virtual void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
369 {
370 ForEachMember((member) =>
371 {
372 if (member.PhysBody.HasPhysicalBody)
373 m_physicsScene.PE.RemoveFromCollisionFlags(member.PhysBody, collFlags);
374 return false; // 'false' says to continue looping
375 }
376 );
377 }
268 // ================================================================ 378 // ================================================================
269 protected virtual float ComputeLinksetMass() 379 protected virtual float ComputeLinksetMass()
270 { 380 {
@@ -273,7 +383,7 @@ public abstract class BSLinkset
273 { 383 {
274 lock (m_linksetActivityLock) 384 lock (m_linksetActivityLock)
275 { 385 {
276 foreach (BSPrimLinkable bp in m_children) 386 foreach (BSPrimLinkable bp in m_children.Keys)
277 { 387 {
278 mass += bp.RawMass; 388 mass += bp.RawMass;
279 } 389 }
@@ -291,7 +401,7 @@ public abstract class BSLinkset
291 com = LinksetRoot.Position * LinksetRoot.RawMass; 401 com = LinksetRoot.Position * LinksetRoot.RawMass;
292 float totalMass = LinksetRoot.RawMass; 402 float totalMass = LinksetRoot.RawMass;
293 403
294 foreach (BSPrimLinkable bp in m_children) 404 foreach (BSPrimLinkable bp in m_children.Keys)
295 { 405 {
296 com += bp.Position * bp.RawMass; 406 com += bp.Position * bp.RawMass;
297 totalMass += bp.RawMass; 407 totalMass += bp.RawMass;
@@ -310,7 +420,7 @@ public abstract class BSLinkset
310 { 420 {
311 com = LinksetRoot.Position; 421 com = LinksetRoot.Position;
312 422
313 foreach (BSPrimLinkable bp in m_children) 423 foreach (BSPrimLinkable bp in m_children.Keys)
314 { 424 {
315 com += bp.Position; 425 com += bp.Position;
316 } 426 }
@@ -323,9 +433,8 @@ public abstract class BSLinkset
323 // Invoke the detailed logger and output something if it's enabled. 433 // Invoke the detailed logger and output something if it's enabled.
324 protected void DetailLog(string msg, params Object[] args) 434 protected void DetailLog(string msg, params Object[] args)
325 { 435 {
326 if (PhysicsScene.PhysicsLogging.Enabled) 436 if (m_physicsScene.PhysicsLogging.Enabled)
327 PhysicsScene.DetailLog(msg, args); 437 m_physicsScene.DetailLog(msg, args);
328 } 438 }
329
330} 439}
331} 440}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index e05562a..085d195 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -35,81 +35,56 @@ using OMV = OpenMetaverse;
35namespace OpenSim.Region.Physics.BulletSPlugin 35namespace OpenSim.Region.Physics.BulletSPlugin
36{ 36{
37 37
38// When a child is linked, the relationship position of the child to the parent 38public sealed class BSLinksetCompound : BSLinkset
39// is remembered so the child's world position can be recomputed when it is
40// removed from the linkset.
41sealed class BSLinksetCompoundInfo : BSLinksetInfo
42{ 39{
43 public int Index; 40 private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]";
44 public OMV.Vector3 OffsetFromRoot; 41
45 public OMV.Vector3 OffsetFromCenterOfMass; 42 public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
46 public OMV.Quaternion OffsetRot; 43 : base(scene, parent)
47 public BSLinksetCompoundInfo(int indx, OMV.Vector3 p, OMV.Quaternion r)
48 { 44 {
49 Index = indx; 45 LinksetImpl = LinksetImplementation.Compound;
50 OffsetFromRoot = p;
51 OffsetFromCenterOfMass = p;
52 OffsetRot = r;
53 } 46 }
54 // 'centerDisplacement' is the distance from the root the the center-of-mass (Bullet 'zero' of the shape) 47
55 public BSLinksetCompoundInfo(int indx, BSPrimLinkable root, BSPrimLinkable child, OMV.Vector3 centerDisplacement) 48 // ================================================================
49 // Changing the physical property of the linkset only needs to change the root
50 public override void SetPhysicalFriction(float friction)
56 { 51 {
57 // Each child position and rotation is given relative to the center-of-mass. 52 if (LinksetRoot.PhysBody.HasPhysicalBody)
58 OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(root.RawOrientation); 53 m_physicsScene.PE.SetFriction(LinksetRoot.PhysBody, friction);
59 OMV.Vector3 displacementFromRoot = (child.RawPosition - root.RawPosition) * invRootOrientation;
60 OMV.Vector3 displacementFromCOM = displacementFromRoot - centerDisplacement;
61 OMV.Quaternion displacementRot = child.RawOrientation * invRootOrientation;
62
63 // Save relative position for recomputing child's world position after moving linkset.
64 Index = indx;
65 OffsetFromRoot = displacementFromRoot;
66 OffsetFromCenterOfMass = displacementFromCOM;
67 OffsetRot = displacementRot;
68 } 54 }
69 public override void Clear() 55 public override void SetPhysicalRestitution(float restitution)
70 { 56 {
71 Index = 0; 57 if (LinksetRoot.PhysBody.HasPhysicalBody)
72 OffsetFromRoot = OMV.Vector3.Zero; 58 m_physicsScene.PE.SetRestitution(LinksetRoot.PhysBody, restitution);
73 OffsetFromCenterOfMass = OMV.Vector3.Zero;
74 OffsetRot = OMV.Quaternion.Identity;
75 } 59 }
76 public override string ToString() 60 public override void SetPhysicalGravity(OMV.Vector3 gravity)
77 { 61 {
78 StringBuilder buff = new StringBuilder(); 62 if (LinksetRoot.PhysBody.HasPhysicalBody)
79 buff.Append("<i="); 63 m_physicsScene.PE.SetGravity(LinksetRoot.PhysBody, gravity);
80 buff.Append(Index.ToString());
81 buff.Append(",p=");
82 buff.Append(OffsetFromRoot.ToString());
83 buff.Append(",m=");
84 buff.Append(OffsetFromCenterOfMass.ToString());
85 buff.Append(",r=");
86 buff.Append(OffsetRot.ToString());
87 buff.Append(">");
88 return buff.ToString();
89 } 64 }
90}; 65 public override void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
91
92public sealed class BSLinksetCompound : BSLinkset
93{
94 private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]";
95
96 public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
97 : base(scene, parent)
98 { 66 {
67 OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, linksetMass);
68 LinksetRoot.Inertia = inertia * inertiaFactor;
69 m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, linksetMass, LinksetRoot.Inertia);
70 m_physicsScene.PE.UpdateInertiaTensor(LinksetRoot.PhysBody);
99 } 71 }
100 72 public override void SetPhysicalCollisionFlags(CollisionFlags collFlags)
101 // For compound implimented linksets, if there are children, use compound shape for the root. 73 {
102 public override BSPhysicsShapeType PreferredPhysicalShape(BSPrimLinkable requestor) 74 if (LinksetRoot.PhysBody.HasPhysicalBody)
103 { 75 m_physicsScene.PE.SetCollisionFlags(LinksetRoot.PhysBody, collFlags);
104 // Returning 'unknown' means we don't have a preference. 76 }
105 BSPhysicsShapeType ret = BSPhysicsShapeType.SHAPE_UNKNOWN; 77 public override void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
106 if (IsRoot(requestor) && HasAnyChildren) 78 {
107 { 79 if (LinksetRoot.PhysBody.HasPhysicalBody)
108 ret = BSPhysicsShapeType.SHAPE_COMPOUND; 80 m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, collFlags);
109 } 81 }
110 // DetailLog("{0},BSLinksetCompound.PreferredPhysicalShape,call,shape={1}", LinksetRoot.LocalID, ret); 82 public override void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
111 return ret; 83 {
84 if (LinksetRoot.PhysBody.HasPhysicalBody)
85 m_physicsScene.PE.RemoveFromCollisionFlags(LinksetRoot.PhysBody, collFlags);
112 } 86 }
87 // ================================================================
113 88
114 // When physical properties are changed the linkset needs to recalculate 89 // When physical properties are changed the linkset needs to recalculate
115 // its internal properties. 90 // its internal properties.
@@ -124,14 +99,15 @@ public sealed class BSLinksetCompound : BSLinkset
124 // Schedule a refresh to happen after all the other taint processing. 99 // Schedule a refresh to happen after all the other taint processing.
125 private void ScheduleRebuild(BSPrimLinkable requestor) 100 private void ScheduleRebuild(BSPrimLinkable requestor)
126 { 101 {
127 DetailLog("{0},BSLinksetCompound.ScheduleRebuild,,rebuilding={1},hasChildren={2},actuallyScheduling={3}", 102 DetailLog("{0},BSLinksetCompound.ScheduleRebuild,,rebuilding={1},hasChildren={2},actuallyScheduling={3}",
128 requestor.LocalID, Rebuilding, HasAnyChildren, (!Rebuilding && HasAnyChildren)); 103 requestor.LocalID, Rebuilding, HasAnyChildren, (!Rebuilding && HasAnyChildren));
104
129 // When rebuilding, it is possible to set properties that would normally require a rebuild. 105 // When rebuilding, it is possible to set properties that would normally require a rebuild.
130 // If already rebuilding, don't request another rebuild. 106 // If already rebuilding, don't request another rebuild.
131 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding. 107 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
132 if (!Rebuilding && HasAnyChildren) 108 if (!Rebuilding && HasAnyChildren)
133 { 109 {
134 PhysicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate() 110 m_physicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate()
135 { 111 {
136 if (HasAnyChildren) 112 if (HasAnyChildren)
137 RecomputeLinksetCompound(); 113 RecomputeLinksetCompound();
@@ -153,46 +129,23 @@ public sealed class BSLinksetCompound : BSLinkset
153 // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly. 129 // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
154 ScheduleRebuild(LinksetRoot); 130 ScheduleRebuild(LinksetRoot);
155 } 131 }
156 else
157 {
158 // The origional prims are removed from the world as the shape of the root compound
159 // shape takes over.
160 PhysicsScene.PE.AddToCollisionFlags(child.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
161 PhysicsScene.PE.ForceActivationState(child.PhysBody, ActivationState.DISABLE_SIMULATION);
162 // We don't want collisions from the old linkset children.
163 PhysicsScene.PE.RemoveFromCollisionFlags(child.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
164
165 child.PhysBody.collisionType = CollisionType.LinksetChild;
166
167 ret = true;
168 }
169 return ret; 132 return ret;
170 } 133 }
171 134
172 // The object is going static (non-physical). Do any setup necessary for a static linkset. 135 // The object is going static (non-physical). We do not do anything for static linksets.
173 // Return 'true' if any properties updated on the passed object. 136 // Return 'true' if any properties updated on the passed object.
174 // This doesn't normally happen -- OpenSim removes the objects from the physical
175 // world if it is a static linkset.
176 // Called at taint-time! 137 // Called at taint-time!
177 public override bool MakeStatic(BSPrimLinkable child) 138 public override bool MakeStatic(BSPrimLinkable child)
178 { 139 {
179 bool ret = false; 140 bool ret = false;
141
180 DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child)); 142 DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
143 child.ClearDisplacement();
181 if (IsRoot(child)) 144 if (IsRoot(child))
182 { 145 {
146 // Schedule a rebuild to verify that the root shape is set to the real shape.
183 ScheduleRebuild(LinksetRoot); 147 ScheduleRebuild(LinksetRoot);
184 } 148 }
185 else
186 {
187 // The non-physical children can come back to life.
188 PhysicsScene.PE.RemoveFromCollisionFlags(child.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
189
190 child.PhysBody.collisionType = CollisionType.LinksetChild;
191
192 // Don't force activation so setting of DISABLE_SIMULATION can stay if used.
193 PhysicsScene.PE.Activate(child.PhysBody, false);
194 ret = true;
195 }
196 return ret; 149 return ret;
197 } 150 }
198 151
@@ -200,13 +153,20 @@ public sealed class BSLinksetCompound : BSLinkset
200 // Called at taint-time. 153 // Called at taint-time.
201 public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated) 154 public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated)
202 { 155 {
156 if (!LinksetRoot.IsPhysicallyActive)
157 {
158 // No reason to do this physical stuff for static linksets.
159 DetailLog("{0},BSLinksetCompound.UpdateProperties,notPhysical", LinksetRoot.LocalID);
160 return;
161 }
162
203 // The user moving a child around requires the rebuilding of the linkset compound shape 163 // The user moving a child around requires the rebuilding of the linkset compound shape
204 // One problem is this happens when a border is crossed -- the simulator implementation 164 // One problem is this happens when a border is crossed -- the simulator implementation
205 // stores the position into the group which causes the move of the object 165 // stores the position into the group which causes the move of the object
206 // but it also means all the child positions get updated. 166 // but it also means all the child positions get updated.
207 // What would cause an unnecessary rebuild so we make sure the linkset is in a 167 // What would cause an unnecessary rebuild so we make sure the linkset is in a
208 // region before bothering to do a rebuild. 168 // region before bothering to do a rebuild.
209 if (!IsRoot(updated) && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) 169 if (!IsRoot(updated) && m_physicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition))
210 { 170 {
211 // If a child of the linkset is updating only the position or rotation, that can be done 171 // If a child of the linkset is updating only the position or rotation, that can be done
212 // without rebuilding the linkset. 172 // without rebuilding the linkset.
@@ -218,22 +178,22 @@ public sealed class BSLinksetCompound : BSLinkset
218 // and that is caused by us updating the object. 178 // and that is caused by us updating the object.
219 if ((whichUpdated & ~(UpdatedProperties.Position | UpdatedProperties.Orientation)) == 0) 179 if ((whichUpdated & ~(UpdatedProperties.Position | UpdatedProperties.Orientation)) == 0)
220 { 180 {
221 // Find the physical instance of the child 181 // Find the physical instance of the child
222 if (LinksetRoot.PhysShape.HasPhysicalShape && PhysicsScene.PE.IsCompound(LinksetRoot.PhysShape)) 182 if (LinksetRoot.PhysShape.HasPhysicalShape && m_physicsScene.PE.IsCompound(LinksetRoot.PhysShape.physShapeInfo))
223 { 183 {
224 // It is possible that the linkset is still under construction and the child is not yet 184 // It is possible that the linkset is still under construction and the child is not yet
225 // inserted into the compound shape. A rebuild of the linkset in a pre-step action will 185 // inserted into the compound shape. A rebuild of the linkset in a pre-step action will
226 // build the whole thing with the new position or rotation. 186 // build the whole thing with the new position or rotation.
227 // The index must be checked because Bullet references the child array but does no validity 187 // The index must be checked because Bullet references the child array but does no validity
228 // checking of the child index passed. 188 // checking of the child index passed.
229 int numLinksetChildren = PhysicsScene.PE.GetNumberOfCompoundChildren(LinksetRoot.PhysShape); 189 int numLinksetChildren = m_physicsScene.PE.GetNumberOfCompoundChildren(LinksetRoot.PhysShape.physShapeInfo);
230 if (updated.LinksetChildIndex < numLinksetChildren) 190 if (updated.LinksetChildIndex < numLinksetChildren)
231 { 191 {
232 BulletShape linksetChildShape = PhysicsScene.PE.GetChildShapeFromCompoundShapeIndex(LinksetRoot.PhysShape, updated.LinksetChildIndex); 192 BulletShape linksetChildShape = m_physicsScene.PE.GetChildShapeFromCompoundShapeIndex(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex);
233 if (linksetChildShape.HasPhysicalShape) 193 if (linksetChildShape.HasPhysicalShape)
234 { 194 {
235 // Found the child shape within the compound shape 195 // Found the child shape within the compound shape
236 PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, updated.LinksetChildIndex, 196 m_physicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex,
237 updated.RawPosition - LinksetRoot.RawPosition, 197 updated.RawPosition - LinksetRoot.RawPosition,
238 updated.RawOrientation * OMV.Quaternion.Inverse(LinksetRoot.RawOrientation), 198 updated.RawOrientation * OMV.Quaternion.Inverse(LinksetRoot.RawOrientation),
239 true /* shouldRecalculateLocalAabb */); 199 true /* shouldRecalculateLocalAabb */);
@@ -267,7 +227,6 @@ public sealed class BSLinksetCompound : BSLinkset
267 // there will already be a rebuild scheduled. 227 // there will already be a rebuild scheduled.
268 DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild.schedulingRebuild,whichUpdated={1}", 228 DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild.schedulingRebuild,whichUpdated={1}",
269 updated.LocalID, whichUpdated); 229 updated.LocalID, whichUpdated);
270 updated.LinksetInfo = null; // setting to 'null' causes relative position to be recomputed.
271 ScheduleRebuild(updated); 230 ScheduleRebuild(updated);
272 } 231 }
273 } 232 }
@@ -275,75 +234,22 @@ public sealed class BSLinksetCompound : BSLinkset
275 } 234 }
276 235
277 // Routine called when rebuilding the body of some member of the linkset. 236 // Routine called when rebuilding the body of some member of the linkset.
278 // Since we don't keep in world relationships, do nothing unless it's a child changing. 237 // If one of the bodies is being changed, the linkset needs rebuilding.
238 // For instance, a linkset is built and then a mesh asset is read in and the mesh is recreated.
279 // Returns 'true' of something was actually removed and would need restoring 239 // Returns 'true' of something was actually removed and would need restoring
280 // Called at taint-time!! 240 // Called at taint-time!!
281 public override bool RemoveBodyDependencies(BSPrimLinkable child) 241 public override bool RemoveDependencies(BSPrimLinkable child)
282 { 242 {
283 bool ret = false; 243 bool ret = false;
284 244
285 DetailLog("{0},BSLinksetCompound.RemoveBodyDependencies,refreshIfChild,rID={1},rBody={2},isRoot={3}", 245 DetailLog("{0},BSLinksetCompound.RemoveBodyDependencies,refreshIfChild,rID={1},rBody={2},isRoot={3}",
286 child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody, IsRoot(child)); 246 child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody, IsRoot(child));
287 247
288 if (!IsRoot(child)) 248 ScheduleRebuild(child);
289 {
290 // Because it is a convenient time, recompute child world position and rotation based on
291 // its position in the linkset.
292 RecomputeChildWorldPosition(child, true /* inTaintTime */);
293 child.LinksetInfo = null;
294 }
295
296 // Cannot schedule a refresh/rebuild here because this routine is called when
297 // the linkset is being rebuilt.
298 // InternalRefresh(LinksetRoot);
299 249
300 return ret; 250 return ret;
301 } 251 }
302 252
303 // When the linkset is built, the child shape is added to the compound shape relative to the
304 // root shape. The linkset then moves around but this does not move the actual child
305 // prim. The child prim's location must be recomputed based on the location of the root shape.
306 private void RecomputeChildWorldPosition(BSPrimLinkable child, bool inTaintTime)
307 {
308 // For the moment (20130201), disable this computation (converting the child physical addr back to
309 // a region address) until we have a good handle on center-of-mass offsets and what the physics
310 // engine moving a child actually means.
311 // The simulator keeps track of where children should be as the linkset moves. Setting
312 // the pos/rot here does not effect that knowledge as there is no good way for the
313 // physics engine to send the simulator an update for a child.
314
315 /*
316 BSLinksetCompoundInfo lci = child.LinksetInfo as BSLinksetCompoundInfo;
317 if (lci != null)
318 {
319 if (inTaintTime)
320 {
321 OMV.Vector3 oldPos = child.RawPosition;
322 child.ForcePosition = LinksetRoot.RawPosition + lci.OffsetFromRoot;
323 child.ForceOrientation = LinksetRoot.RawOrientation * lci.OffsetRot;
324 DetailLog("{0},BSLinksetCompound.RecomputeChildWorldPosition,oldPos={1},lci={2},newPos={3}",
325 child.LocalID, oldPos, lci, child.RawPosition);
326 }
327 else
328 {
329 // TaintedObject is not used here so the raw position is set now and not at taint-time.
330 child.Position = LinksetRoot.RawPosition + lci.OffsetFromRoot;
331 child.Orientation = LinksetRoot.RawOrientation * lci.OffsetRot;
332 }
333 }
334 else
335 {
336 // This happens when children have been added to the linkset but the linkset
337 // has not been constructed yet. So like, at taint time, adding children to a linkset
338 // and then changing properties of the children (makePhysical, for instance)
339 // but the post-print action of actually rebuilding the linkset has not yet happened.
340 // PhysicsScene.Logger.WarnFormat("{0} Restoring linkset child position failed because of no relative position computed. ID={1}",
341 // LogHeader, child.LocalID);
342 DetailLog("{0},BSLinksetCompound.recomputeChildWorldPosition,noRelativePositonInfo", child.LocalID);
343 }
344 */
345 }
346
347 // ================================================================ 253 // ================================================================
348 254
349 // Add a new child to the linkset. 255 // Add a new child to the linkset.
@@ -352,7 +258,7 @@ public sealed class BSLinksetCompound : BSLinkset
352 { 258 {
353 if (!HasChild(child)) 259 if (!HasChild(child))
354 { 260 {
355 m_children.Add(child); 261 m_children.Add(child, new BSLinkInfo(child));
356 262
357 DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); 263 DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
358 264
@@ -376,8 +282,6 @@ public sealed class BSLinksetCompound : BSLinkset
376 child.LocalID, child.PhysBody.AddrString); 282 child.LocalID, child.PhysBody.AddrString);
377 283
378 // Cause the child's body to be rebuilt and thus restored to normal operation 284 // Cause the child's body to be rebuilt and thus restored to normal operation
379 RecomputeChildWorldPosition(child, false);
380 child.LinksetInfo = null;
381 child.ForceBodyShapeRebuild(false); 285 child.ForceBodyShapeRebuild(false);
382 286
383 if (!HasAnyChildren) 287 if (!HasAnyChildren)
@@ -399,108 +303,118 @@ public sealed class BSLinksetCompound : BSLinkset
399 // Constraint linksets are rebuilt every time. 303 // Constraint linksets are rebuilt every time.
400 // Note that this works for rebuilding just the root after a linkset is taken apart. 304 // Note that this works for rebuilding just the root after a linkset is taken apart.
401 // Called at taint time!! 305 // Called at taint time!!
402 private bool disableCOM = true; // DEBUG DEBUG: disable until we get this debugged 306 private bool UseBulletSimRootOffsetHack = false; // Attempt to have Bullet track the coords of root compound shape
403 private void RecomputeLinksetCompound() 307 private void RecomputeLinksetCompound()
404 { 308 {
405 try 309 try
406 { 310 {
407 // Suppress rebuilding while rebuilding. (We know rebuilding is on only one thread.)
408 Rebuilding = true; 311 Rebuilding = true;
409 312
410 // Cause the root shape to be rebuilt as a compound object with just the root in it 313 // No matter what is being done, force the root prim's PhysBody and PhysShape to get set
411 LinksetRoot.ForceBodyShapeRebuild(true /* inTaintTime */); 314 // to what they should be as if the root was not in a linkset.
315 // Not that bad since we only get into this routine if there are children in the linkset and
316 // something has been updated/changed.
317 // Have to do the rebuild before checking for physical because this might be a linkset
318 // being destructed and going non-physical.
319 LinksetRoot.ForceBodyShapeRebuild(true);
412 320
413 // The center of mass for the linkset is the geometric center of the group. 321 // There is no reason to build all this physical stuff for a non-physical linkset.
414 // Compute a displacement for each component so it is relative to the center-of-mass. 322 if (!LinksetRoot.IsPhysicallyActive)
415 // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
416 OMV.Vector3 centerOfMassW = LinksetRoot.RawPosition;
417 if (!disableCOM) // DEBUG DEBUG
418 { 323 {
419 // Compute a center-of-mass in world coordinates. 324 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysical", LinksetRoot.LocalID);
420 centerOfMassW = ComputeLinksetCenterOfMass(); 325 return; // Note the 'finally' clause at the botton which will get executed.
421 } 326 }
422 327
423 OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation); 328 // Get a new compound shape to build the linkset shape in.
329 BSShape linksetShape = BSShapeCompound.GetReference(m_physicsScene);
424 330
425 // 'centerDisplacement' is the value to subtract from children to give physical offset position 331 // Compute a displacement for each component so it is relative to the center-of-mass.
426 OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation; 332 // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
427 LinksetRoot.SetEffectiveCenterOfMassW(centerDisplacement); 333 OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
428
429 // This causes the physical position of the root prim to be offset to accomodate for the displacements
430 LinksetRoot.ForcePosition = LinksetRoot.RawPosition;
431 334
432 // Update the local transform for the root child shape so it is offset from the <0,0,0> which is COM 335 OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation));
433 PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, 0 /* childIndex */, 336 OMV.Vector3 origRootPosition = LinksetRoot.RawPosition;
434 -centerDisplacement,
435 OMV.Quaternion.Identity, // LinksetRoot.RawOrientation,
436 false /* shouldRecalculateLocalAabb (is done later after linkset built) */);
437 337
438 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,com={1},rootPos={2},centerDisp={3}", 338 // 'centerDisplacementV' is the vehicle relative distance from the simulator root position to the center-of-mass
439 LinksetRoot.LocalID, centerOfMassW, LinksetRoot.RawPosition, centerDisplacement); 339 OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
340 if (UseBulletSimRootOffsetHack || !BSParam.LinksetOffsetCenterOfMass)
341 {
342 // Zero everything if center-of-mass displacement is not being done.
343 centerDisplacementV = OMV.Vector3.Zero;
344 LinksetRoot.ClearDisplacement();
345 }
346 else
347 {
348 // The actual center-of-mass could have been set by the user.
349 centerDisplacementV = LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV);
350 }
440 351
441 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,start,rBody={1},rShape={2},numChildren={3}", 352 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
442 LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetRoot.PhysShape, NumberOfChildren); 353 LinksetRoot.LocalID, origRootPosition, centerOfMassW, centerDisplacementV);
443 354
444 // Add a shape for each of the other children in the linkset 355 // Add the shapes of all the components of the linkset
445 int memberIndex = 1; 356 int memberIndex = 1;
446 ForEachMember(delegate(BSPrimLinkable cPrim) 357 ForEachMember((cPrim) =>
447 { 358 {
448 if (IsRoot(cPrim)) 359 if (IsRoot(cPrim))
449 { 360 {
361 // Root shape is always index zero.
450 cPrim.LinksetChildIndex = 0; 362 cPrim.LinksetChildIndex = 0;
451 } 363 }
452 else 364 else
453 { 365 {
454 cPrim.LinksetChildIndex = memberIndex; 366 cPrim.LinksetChildIndex = memberIndex;
367 memberIndex++;
368 }
455 369
456 if (cPrim.PhysShape.isNativeShape) 370 // Get a reference to the shape of the child for adding of that shape to the linkset compound shape
457 { 371 BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim);
458 // A native shape is turned into a hull collision shape because native
459 // shapes are not shared so we have to hullify it so it will be tracked
460 // and freed at the correct time. This also solves the scaling problem
461 // (native shapes scale but hull/meshes are assumed to not be).
462 // TODO: decide of the native shape can just be used in the compound shape.
463 // Use call to CreateGeomNonSpecial().
464 BulletShape saveShape = cPrim.PhysShape;
465 cPrim.PhysShape.Clear(); // Don't let the create free the child's shape
466 PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null);
467 BulletShape newShape = cPrim.PhysShape;
468 cPrim.PhysShape = saveShape;
469
470 OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
471 OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
472 PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, newShape, offsetPos, offsetRot);
473 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addNative,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}",
474 LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, newShape, offsetPos, offsetRot);
475 }
476 else
477 {
478 // For the shared shapes (meshes and hulls), just use the shape in the child.
479 // The reference count added here will be decremented when the compound shape
480 // is destroyed in BSShapeCollection (the child shapes are looped over and dereferenced).
481 if (PhysicsScene.Shapes.ReferenceShape(cPrim.PhysShape))
482 {
483 PhysicsScene.Logger.ErrorFormat("{0} Rebuilt sharable shape when building linkset! Region={1}, primID={2}, shape={3}",
484 LogHeader, PhysicsScene.RegionName, cPrim.LocalID, cPrim.PhysShape);
485 }
486 OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
487 OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
488 PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot);
489 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addNonNative,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}",
490 LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot);
491 372
492 } 373 // Offset the child shape from the center-of-mass and rotate it to vehicle relative.
493 memberIndex++; 374 OMV.Vector3 offsetPos = (cPrim.RawPosition - origRootPosition) * invRootOrientation - centerDisplacementV;
375 OMV.Quaternion offsetRot = OMV.Quaternion.Normalize(cPrim.RawOrientation) * invRootOrientation;
376
377 // Add the child shape to the compound shape being built
378 m_physicsScene.PE.AddChildShapeToCompoundShape(linksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
379 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},cShape={2},offPos={3},offRot={4}",
380 LinksetRoot.LocalID, cPrim.LinksetChildIndex, childShape, offsetPos, offsetRot);
381
382 // Since we are borrowing the shape of the child, disable the origional child body
383 if (!IsRoot(cPrim))
384 {
385 m_physicsScene.PE.AddToCollisionFlags(cPrim.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
386 m_physicsScene.PE.ForceActivationState(cPrim.PhysBody, ActivationState.DISABLE_SIMULATION);
387 // We don't want collisions from the old linkset children.
388 m_physicsScene.PE.RemoveFromCollisionFlags(cPrim.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
389 cPrim.PhysBody.collisionType = CollisionType.LinksetChild;
494 } 390 }
391
495 return false; // 'false' says to move onto the next child in the list 392 return false; // 'false' says to move onto the next child in the list
496 }); 393 });
497 394
395 // Replace the root shape with the built compound shape.
396 // Object removed and added to world to get collision cache rebuilt for new shape.
397 LinksetRoot.PhysShape.Dereference(m_physicsScene);
398 LinksetRoot.PhysShape = linksetShape;
399 m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody);
400 m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, linksetShape.physShapeInfo);
401 m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody);
402 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addBody,body={1},shape={2}",
403 LinksetRoot.LocalID, LinksetRoot.PhysBody, linksetShape);
404
498 // With all of the linkset packed into the root prim, it has the mass of everyone. 405 // With all of the linkset packed into the root prim, it has the mass of everyone.
499 LinksetMass = ComputeLinksetMass(); 406 LinksetMass = ComputeLinksetMass();
500 LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true); 407 LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true);
501 408
502 // Enable the physical position updator to return the position and rotation of the root shape 409 if (UseBulletSimRootOffsetHack)
503 PhysicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE); 410 {
411 // Enable the physical position updator to return the position and rotation of the root shape.
412 // This enables a feature in the C++ code to return the world coordinates of the first shape in the
413 // compound shape. This aleviates the need to offset the returned physical position by the
414 // center-of-mass offset.
415 // TODO: either debug this feature or remove it.
416 m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE);
417 }
504 } 418 }
505 finally 419 finally
506 { 420 {
@@ -508,7 +422,7 @@ public sealed class BSLinksetCompound : BSLinkset
508 } 422 }
509 423
510 // See that the Aabb surrounds the new shape 424 // See that the Aabb surrounds the new shape
511 PhysicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetRoot.PhysShape); 425 m_physicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetRoot.PhysShape.physShapeInfo);
512 } 426 }
513} 427}
514} \ No newline at end of file 428} \ No newline at end of file
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index 6d252ca..4bac222 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -36,8 +36,78 @@ public sealed class BSLinksetConstraints : BSLinkset
36{ 36{
37 // private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]"; 37 // private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]";
38 38
39 public class BSLinkInfoConstraint : BSLinkInfo
40 {
41 public ConstraintType constraintType;
42 public BSConstraint constraint;
43 public OMV.Vector3 linearLimitLow;
44 public OMV.Vector3 linearLimitHigh;
45 public OMV.Vector3 angularLimitLow;
46 public OMV.Vector3 angularLimitHigh;
47 public bool useFrameOffset;
48 public bool enableTransMotor;
49 public float transMotorMaxVel;
50 public float transMotorMaxForce;
51 public float cfm;
52 public float erp;
53 public float solverIterations;
54
55 public BSLinkInfoConstraint(BSPrimLinkable pMember)
56 : base(pMember)
57 {
58 constraint = null;
59 ResetToFixedConstraint();
60 }
61
62 // Set all the parameters for this constraint to a fixed, non-movable constraint.
63 public void ResetToFixedConstraint()
64 {
65 constraintType = ConstraintType.D6_CONSTRAINT_TYPE;
66 linearLimitLow = OMV.Vector3.Zero;
67 linearLimitHigh = OMV.Vector3.Zero;
68 angularLimitLow = OMV.Vector3.Zero;
69 angularLimitHigh = OMV.Vector3.Zero;
70 useFrameOffset = BSParam.LinkConstraintUseFrameOffset;
71 enableTransMotor = BSParam.LinkConstraintEnableTransMotor;
72 transMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
73 transMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
74 cfm = BSParam.LinkConstraintCFM;
75 erp = BSParam.LinkConstraintERP;
76 solverIterations = BSParam.LinkConstraintSolverIterations;
77 }
78
79 // Given a constraint, apply the current constraint parameters to same.
80 public void SetConstraintParameters(BSConstraint constrain)
81 {
82 switch (constraintType)
83 {
84 case ConstraintType.D6_CONSTRAINT_TYPE:
85 BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof;
86 if (constrain6dof != null)
87 {
88 // zero linear and angular limits makes the objects unable to move in relation to each other
89 constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh);
90 constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh);
91
92 // tweek the constraint to increase stability
93 constrain6dof.UseFrameOffset(useFrameOffset);
94 constrain6dof.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
95 constrain6dof.SetCFMAndERP(cfm, erp);
96 if (solverIterations != 0f)
97 {
98 constrain6dof.SetSolverIterations(solverIterations);
99 }
100 }
101 break;
102 default:
103 break;
104 }
105 }
106 }
107
39 public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent) 108 public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent)
40 { 109 {
110 LinksetImpl = LinksetImplementation.Constraint;
41 } 111 }
42 112
43 // When physical properties are changed the linkset needs to recalculate 113 // When physical properties are changed the linkset needs to recalculate
@@ -48,12 +118,22 @@ public sealed class BSLinksetConstraints : BSLinkset
48 { 118 {
49 base.Refresh(requestor); 119 base.Refresh(requestor);
50 120
51 if (HasAnyChildren && IsRoot(requestor)) 121 }
122
123 private void ScheduleRebuild(BSPrimLinkable requestor)
124 {
125 DetailLog("{0},BSLinksetConstraint.ScheduleRebuild,,rebuilding={1},hasChildren={2},actuallyScheduling={3}",
126 requestor.LocalID, Rebuilding, HasAnyChildren, (!Rebuilding && HasAnyChildren));
127
128 // When rebuilding, it is possible to set properties that would normally require a rebuild.
129 // If already rebuilding, don't request another rebuild.
130 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
131 if (!Rebuilding && HasAnyChildren)
52 { 132 {
53 // Queue to happen after all the other taint processing 133 // Queue to happen after all the other taint processing
54 PhysicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate() 134 m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
55 { 135 {
56 if (HasAnyChildren && IsRoot(requestor)) 136 if (HasAnyChildren)
57 RecomputeLinksetConstraints(); 137 RecomputeLinksetConstraints();
58 }); 138 });
59 } 139 }
@@ -67,8 +147,14 @@ public sealed class BSLinksetConstraints : BSLinkset
67 // Called at taint-time! 147 // Called at taint-time!
68 public override bool MakeDynamic(BSPrimLinkable child) 148 public override bool MakeDynamic(BSPrimLinkable child)
69 { 149 {
70 // What is done for each object in BSPrim is what we want. 150 bool ret = false;
71 return false; 151 DetailLog("{0},BSLinksetConstraints.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
152 if (IsRoot(child))
153 {
154 // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
155 ScheduleRebuild(LinksetRoot);
156 }
157 return ret;
72 } 158 }
73 159
74 // The object is going static (non-physical). Do any setup necessary for a static linkset. 160 // The object is going static (non-physical). Do any setup necessary for a static linkset.
@@ -78,8 +164,16 @@ public sealed class BSLinksetConstraints : BSLinkset
78 // Called at taint-time! 164 // Called at taint-time!
79 public override bool MakeStatic(BSPrimLinkable child) 165 public override bool MakeStatic(BSPrimLinkable child)
80 { 166 {
81 // What is done for each object in BSPrim is what we want. 167 bool ret = false;
82 return false; 168
169 DetailLog("{0},BSLinksetConstraint.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
170 child.ClearDisplacement();
171 if (IsRoot(child))
172 {
173 // Schedule a rebuild to verify that the root shape is set to the real shape.
174 ScheduleRebuild(LinksetRoot);
175 }
176 return ret;
83 } 177 }
84 178
85 // Called at taint-time!! 179 // Called at taint-time!!
@@ -93,11 +187,11 @@ public sealed class BSLinksetConstraints : BSLinkset
93 // up to rebuild the constraints before the next simulation step. 187 // up to rebuild the constraints before the next simulation step.
94 // Returns 'true' of something was actually removed and would need restoring 188 // Returns 'true' of something was actually removed and would need restoring
95 // Called at taint-time!! 189 // Called at taint-time!!
96 public override bool RemoveBodyDependencies(BSPrimLinkable child) 190 public override bool RemoveDependencies(BSPrimLinkable child)
97 { 191 {
98 bool ret = false; 192 bool ret = false;
99 193
100 DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}", 194 DetailLog("{0},BSLinksetConstraint.RemoveDependencies,removeChildrenForRoot,rID={1},rBody={2}",
101 child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString); 195 child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString);
102 196
103 lock (m_linksetActivityLock) 197 lock (m_linksetActivityLock)
@@ -105,7 +199,7 @@ public sealed class BSLinksetConstraints : BSLinkset
105 // Just undo all the constraints for this linkset. Rebuild at the end of the step. 199 // Just undo all the constraints for this linkset. Rebuild at the end of the step.
106 ret = PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot); 200 ret = PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
107 // Cause the constraints, et al to be rebuilt before the next simulation step. 201 // Cause the constraints, et al to be rebuilt before the next simulation step.
108 Refresh(LinksetRoot); 202 ScheduleRebuild(LinksetRoot);
109 } 203 }
110 return ret; 204 return ret;
111 } 205 }
@@ -118,12 +212,12 @@ public sealed class BSLinksetConstraints : BSLinkset
118 { 212 {
119 if (!HasChild(child)) 213 if (!HasChild(child))
120 { 214 {
121 m_children.Add(child); 215 m_children.Add(child, new BSLinkInfoConstraint(child));
122 216
123 DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); 217 DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
124 218
125 // Cause constraints and assorted properties to be recomputed before the next simulation step. 219 // Cause constraints and assorted properties to be recomputed before the next simulation step.
126 Refresh(LinksetRoot); 220 ScheduleRebuild(LinksetRoot);
127 } 221 }
128 return; 222 return;
129 } 223 }
@@ -142,12 +236,12 @@ public sealed class BSLinksetConstraints : BSLinkset
142 rootx.LocalID, rootx.PhysBody.AddrString, 236 rootx.LocalID, rootx.PhysBody.AddrString,
143 childx.LocalID, childx.PhysBody.AddrString); 237 childx.LocalID, childx.PhysBody.AddrString);
144 238
145 PhysicsScene.TaintedObject("BSLinksetConstraints.RemoveChildFromLinkset", delegate() 239 m_physicsScene.TaintedObject("BSLinksetConstraints.RemoveChildFromLinkset", delegate()
146 { 240 {
147 PhysicallyUnlinkAChildFromRoot(rootx, childx); 241 PhysicallyUnlinkAChildFromRoot(rootx, childx);
148 }); 242 });
149 // See that the linkset parameters are recomputed at the end of the taint time. 243 // See that the linkset parameters are recomputed at the end of the taint time.
150 Refresh(LinksetRoot); 244 ScheduleRebuild(LinksetRoot);
151 } 245 }
152 else 246 else
153 { 247 {
@@ -165,73 +259,75 @@ public sealed class BSLinksetConstraints : BSLinkset
165 Refresh(rootPrim); 259 Refresh(rootPrim);
166 } 260 }
167 261
168 private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSPrimLinkable childPrim) 262 // Create a static constraint between the two passed objects
263 private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li)
169 { 264 {
265 BSLinkInfoConstraint liConstraint = li as BSLinkInfoConstraint;
266 if (liConstraint == null)
267 return null;
268
170 // Zero motion for children so they don't interpolate 269 // Zero motion for children so they don't interpolate
171 childPrim.ZeroMotion(true); 270 li.member.ZeroMotion(true);
172 271
173 // Relative position normalized to the root prim 272 BSConstraint constrain = null;
174 // Essentually a vector pointing from center of rootPrim to center of childPrim 273
175 OMV.Vector3 childRelativePosition = childPrim.Position - rootPrim.Position; 274 switch (liConstraint.constraintType)
176
177 // real world coordinate of midpoint between the two objects
178 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
179
180 DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
181 rootPrim.LocalID,
182 rootPrim.LocalID, rootPrim.PhysBody.AddrString,
183 childPrim.LocalID, childPrim.PhysBody.AddrString,
184 rootPrim.Position, childPrim.Position, midPoint);
185
186 // create a constraint that allows no freedom of movement between the two objects
187 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
188
189 BSConstraint6Dof constrain = new BSConstraint6Dof(
190 PhysicsScene.World, rootPrim.PhysBody, childPrim.PhysBody, midPoint, true, true );
191 // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true );
192
193 /* NOTE: below is an attempt to build constraint with full frame computation, etc.
194 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
195 * of the objects.
196 * Code left for future programmers.
197 // ==================================================================================
198 // relative position normalized to the root prim
199 OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation);
200 OMV.Vector3 childRelativePosition = (childPrim.Position - rootPrim.Position) * invThisOrientation;
201
202 // relative rotation of the child to the parent
203 OMV.Quaternion childRelativeRotation = invThisOrientation * childPrim.Orientation;
204 OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
205
206 DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
207 BS6DofConstraint constrain = new BS6DofConstraint(
208 PhysicsScene.World, rootPrim.Body, childPrim.Body,
209 OMV.Vector3.Zero,
210 OMV.Quaternion.Inverse(rootPrim.Orientation),
211 OMV.Vector3.Zero,
212 OMV.Quaternion.Inverse(childPrim.Orientation),
213 true,
214 true
215 );
216 // ==================================================================================
217 */
218
219 PhysicsScene.Constraints.AddConstraint(constrain);
220
221 // zero linear and angular limits makes the objects unable to move in relation to each other
222 constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
223 constrain.SetAngularLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
224
225 // tweek the constraint to increase stability
226 constrain.UseFrameOffset(BSParam.LinkConstraintUseFrameOffset);
227 constrain.TranslationalLimitMotor(BSParam.LinkConstraintEnableTransMotor,
228 BSParam.LinkConstraintTransMotorMaxVel,
229 BSParam.LinkConstraintTransMotorMaxForce);
230 constrain.SetCFMAndERP(BSParam.LinkConstraintCFM, BSParam.LinkConstraintERP);
231 if (BSParam.LinkConstraintSolverIterations != 0f)
232 { 275 {
233 constrain.SetSolverIterations(BSParam.LinkConstraintSolverIterations); 276 case ConstraintType.D6_CONSTRAINT_TYPE:
277 // Relative position normalized to the root prim
278 // Essentually a vector pointing from center of rootPrim to center of li.member
279 OMV.Vector3 childRelativePosition = liConstraint.member.Position - rootPrim.Position;
280
281 // real world coordinate of midpoint between the two objects
282 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
283
284 DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
285 rootPrim.LocalID,
286 rootPrim.LocalID, rootPrim.PhysBody.AddrString,
287 liConstraint.member.LocalID, liConstraint.member.PhysBody.AddrString,
288 rootPrim.Position, liConstraint.member.Position, midPoint);
289
290 // create a constraint that allows no freedom of movement between the two objects
291 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
292
293 constrain = new BSConstraint6Dof(
294 m_physicsScene.World, rootPrim.PhysBody, liConstraint.member.PhysBody, midPoint, true, true );
295
296 /* NOTE: below is an attempt to build constraint with full frame computation, etc.
297 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
298 * of the objects.
299 * Code left for future programmers.
300 // ==================================================================================
301 // relative position normalized to the root prim
302 OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation);
303 OMV.Vector3 childRelativePosition = (liConstraint.member.Position - rootPrim.Position) * invThisOrientation;
304
305 // relative rotation of the child to the parent
306 OMV.Quaternion childRelativeRotation = invThisOrientation * liConstraint.member.Orientation;
307 OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
308
309 DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, liConstraint.member.LocalID);
310 constrain = new BS6DofConstraint(
311 PhysicsScene.World, rootPrim.Body, liConstraint.member.Body,
312 OMV.Vector3.Zero,
313 OMV.Quaternion.Inverse(rootPrim.Orientation),
314 OMV.Vector3.Zero,
315 OMV.Quaternion.Inverse(liConstraint.member.Orientation),
316 true,
317 true
318 );
319 // ==================================================================================
320 */
321
322 break;
323 default:
324 break;
234 } 325 }
326
327 liConstraint.SetConstraintParameters(constrain);
328
329 m_physicsScene.Constraints.AddConstraint(constrain);
330
235 return constrain; 331 return constrain;
236 } 332 }
237 333
@@ -248,10 +344,10 @@ public sealed class BSLinksetConstraints : BSLinkset
248 childPrim.LocalID, childPrim.PhysBody.AddrString); 344 childPrim.LocalID, childPrim.PhysBody.AddrString);
249 345
250 // Find the constraint for this link and get rid of it from the overall collection and from my list 346 // Find the constraint for this link and get rid of it from the overall collection and from my list
251 if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody)) 347 if (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
252 { 348 {
253 // Make the child refresh its location 349 // Make the child refresh its location
254 PhysicsScene.PE.PushUpdate(childPrim.PhysBody); 350 m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
255 ret = true; 351 ret = true;
256 } 352 }
257 353
@@ -265,7 +361,7 @@ public sealed class BSLinksetConstraints : BSLinkset
265 { 361 {
266 DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); 362 DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
267 363
268 return PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody); 364 return m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody);
269 } 365 }
270 366
271 // Call each of the constraints that make up this linkset and recompute the 367 // Call each of the constraints that make up this linkset and recompute the
@@ -281,24 +377,40 @@ public sealed class BSLinksetConstraints : BSLinkset
281 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}", 377 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}",
282 LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString, linksetMass); 378 LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString, linksetMass);
283 379
284 foreach (BSPrimLinkable child in m_children) 380 try
285 { 381 {
286 // A child in the linkset physically shows the mass of the whole linkset. 382 Rebuilding = true;
287 // This allows Bullet to apply enough force on the child to move the whole linkset.
288 // (Also do the mass stuff before recomputing the constraint so mass is not zero.)
289 child.UpdatePhysicalMassProperties(linksetMass, true);
290 383
291 BSConstraint constrain; 384 // There is no reason to build all this physical stuff for a non-physical linkset.
292 if (!PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, child.PhysBody, out constrain)) 385 if (!LinksetRoot.IsPhysicallyActive)
293 { 386 {
294 // If constraint doesn't exist yet, create it. 387 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetCompound,notPhysical", LinksetRoot.LocalID);
295 constrain = BuildConstraint(LinksetRoot, child); 388 return; // Note the 'finally' clause at the botton which will get executed.
296 } 389 }
297 constrain.RecomputeConstraintVariables(linksetMass);
298 390
299 // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG 391 ForEachLinkInfo((li) =>
300 } 392 {
393 // A child in the linkset physically shows the mass of the whole linkset.
394 // This allows Bullet to apply enough force on the child to move the whole linkset.
395 // (Also do the mass stuff before recomputing the constraint so mass is not zero.)
396 li.member.UpdatePhysicalMassProperties(linksetMass, true);
397
398 BSConstraint constrain;
399 if (!m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, li.member.PhysBody, out constrain))
400 {
401 // If constraint doesn't exist yet, create it.
402 constrain = BuildConstraint(LinksetRoot, li);
403 }
404 constrain.RecomputeConstraintVariables(linksetMass);
301 405
406 // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG
407 return false; // 'false' says to keep processing other members
408 });
409 }
410 finally
411 {
412 Rebuilding = false;
413 }
302 } 414 }
303} 415}
304} 416}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
index 9501e2d..7693195 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs
@@ -65,13 +65,11 @@ public abstract class BSMotor
65} 65}
66 66
67// Motor which moves CurrentValue to TargetValue over TimeScale seconds. 67// Motor which moves CurrentValue to TargetValue over TimeScale seconds.
68// The TargetValue decays in TargetValueDecayTimeScale and 68// The TargetValue decays in TargetValueDecayTimeScale.
69// the CurrentValue will be held back by FrictionTimeScale.
70// This motor will "zero itself" over time in that the targetValue will 69// This motor will "zero itself" over time in that the targetValue will
71// decay to zero and the currentValue will follow it to that zero. 70// decay to zero and the currentValue will follow it to that zero.
72// The overall effect is for the returned correction value to go from large 71// The overall effect is for the returned correction value to go from large
73// values (the total difference between current and target minus friction) 72// values to small and eventually zero values.
74// to small and eventually zero values.
75// TimeScale and TargetDelayTimeScale may be 'infinite' which means no decay. 73// TimeScale and TargetDelayTimeScale may be 'infinite' which means no decay.
76 74
77// For instance, if something is moving at speed X and the desired speed is Y, 75// For instance, if something is moving at speed X and the desired speed is Y,
@@ -88,7 +86,6 @@ public class BSVMotor : BSMotor
88 86
89 public virtual float TimeScale { get; set; } 87 public virtual float TimeScale { get; set; }
90 public virtual float TargetValueDecayTimeScale { get; set; } 88 public virtual float TargetValueDecayTimeScale { get; set; }
91 public virtual Vector3 FrictionTimescale { get; set; }
92 public virtual float Efficiency { get; set; } 89 public virtual float Efficiency { get; set; }
93 90
94 public virtual float ErrorZeroThreshold { get; set; } 91 public virtual float ErrorZeroThreshold { get; set; }
@@ -102,7 +99,7 @@ public class BSVMotor : BSMotor
102 return ErrorIsZero(LastError); 99 return ErrorIsZero(LastError);
103 } 100 }
104 public virtual bool ErrorIsZero(Vector3 err) 101 public virtual bool ErrorIsZero(Vector3 err)
105 { 102 {
106 return (err == Vector3.Zero || err.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)); 103 return (err == Vector3.Zero || err.ApproxEquals(Vector3.Zero, ErrorZeroThreshold));
107 } 104 }
108 105
@@ -111,16 +108,14 @@ public class BSVMotor : BSMotor
111 { 108 {
112 TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite; 109 TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
113 Efficiency = 1f; 110 Efficiency = 1f;
114 FrictionTimescale = BSMotor.InfiniteVector;
115 CurrentValue = TargetValue = Vector3.Zero; 111 CurrentValue = TargetValue = Vector3.Zero;
116 ErrorZeroThreshold = 0.001f; 112 ErrorZeroThreshold = 0.001f;
117 } 113 }
118 public BSVMotor(string useName, float timeScale, float decayTimeScale, Vector3 frictionTimeScale, float efficiency) 114 public BSVMotor(string useName, float timeScale, float decayTimeScale, float efficiency)
119 : this(useName) 115 : this(useName)
120 { 116 {
121 TimeScale = timeScale; 117 TimeScale = timeScale;
122 TargetValueDecayTimeScale = decayTimeScale; 118 TargetValueDecayTimeScale = decayTimeScale;
123 FrictionTimescale = frictionTimeScale;
124 Efficiency = efficiency; 119 Efficiency = efficiency;
125 CurrentValue = TargetValue = Vector3.Zero; 120 CurrentValue = TargetValue = Vector3.Zero;
126 } 121 }
@@ -149,7 +144,6 @@ public class BSVMotor : BSMotor
149 144
150 Vector3 correction = Vector3.Zero; 145 Vector3 correction = Vector3.Zero;
151 Vector3 error = TargetValue - CurrentValue; 146 Vector3 error = TargetValue - CurrentValue;
152 LastError = error;
153 if (!ErrorIsZero(error)) 147 if (!ErrorIsZero(error))
154 { 148 {
155 correction = StepError(timeStep, error); 149 correction = StepError(timeStep, error);
@@ -165,26 +159,11 @@ public class BSVMotor : BSMotor
165 TargetValue *= (1f - decayFactor); 159 TargetValue *= (1f - decayFactor);
166 } 160 }
167 161
168 // The amount we can correct the error is reduced by the friction
169 Vector3 frictionFactor = Vector3.Zero;
170 if (FrictionTimescale != BSMotor.InfiniteVector)
171 {
172 // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep;
173 // Individual friction components can be 'infinite' so compute each separately.
174 frictionFactor.X = (FrictionTimescale.X == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.X);
175 frictionFactor.Y = (FrictionTimescale.Y == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.Y);
176 frictionFactor.Z = (FrictionTimescale.Z == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.Z);
177 frictionFactor *= timeStep;
178 CurrentValue *= (Vector3.One - frictionFactor);
179 }
180
181 MDetailLog("{0}, BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}", 162 MDetailLog("{0}, BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}",
182 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, 163 BSScene.DetailLogZero, UseName, origCurrVal, origTarget,
183 timeStep, error, correction); 164 timeStep, error, correction);
184 MDetailLog("{0}, BSVMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},frictTS={4},frictFact={5},tgt={6},curr={7}", 165 MDetailLog("{0}, BSVMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},tgt={4},curr={5}",
185 BSScene.DetailLogZero, UseName, 166 BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
186 TargetValueDecayTimeScale, decayFactor, FrictionTimescale, frictionFactor,
187 TargetValue, CurrentValue);
188 } 167 }
189 else 168 else
190 { 169 {
@@ -199,6 +178,7 @@ public class BSVMotor : BSMotor
199 MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}", 178 MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}",
200 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue); 179 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue);
201 } 180 }
181 LastError = error;
202 182
203 return correction; 183 return correction;
204 } 184 }
@@ -208,6 +188,8 @@ public class BSVMotor : BSMotor
208 CurrentValue = current; 188 CurrentValue = current;
209 return Step(timeStep); 189 return Step(timeStep);
210 } 190 }
191 // Given and error, computer a correction for this step.
192 // Simple scaling of the error by the timestep.
211 public virtual Vector3 StepError(float timeStep, Vector3 error) 193 public virtual Vector3 StepError(float timeStep, Vector3 error)
212 { 194 {
213 if (!Enabled) return Vector3.Zero; 195 if (!Enabled) return Vector3.Zero;
@@ -235,27 +217,27 @@ public class BSVMotor : BSMotor
235 // maximum number of outputs to generate. 217 // maximum number of outputs to generate.
236 int maxOutput = 50; 218 int maxOutput = 50;
237 MDetailLog("{0},BSVMotor.Test,{1},===================================== BEGIN Test Output", BSScene.DetailLogZero, UseName); 219 MDetailLog("{0},BSVMotor.Test,{1},===================================== BEGIN Test Output", BSScene.DetailLogZero, UseName);
238 MDetailLog("{0},BSVMotor.Test,{1},timeScale={2},targDlyTS={3},frictTS={4},eff={5},curr={6},tgt={7}", 220 MDetailLog("{0},BSVMotor.Test,{1},timeScale={2},targDlyTS={3},eff={4},curr={5},tgt={6}",
239 BSScene.DetailLogZero, UseName, 221 BSScene.DetailLogZero, UseName,
240 TimeScale, TargetValueDecayTimeScale, FrictionTimescale, Efficiency, 222 TimeScale, TargetValueDecayTimeScale, Efficiency,
241 CurrentValue, TargetValue); 223 CurrentValue, TargetValue);
242 224
243 LastError = BSMotor.InfiniteVector; 225 LastError = BSMotor.InfiniteVector;
244 while (maxOutput-- > 0 && !LastError.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) 226 while (maxOutput-- > 0 && !ErrorIsZero())
245 { 227 {
246 Vector3 lastStep = Step(timeStep); 228 Vector3 lastStep = Step(timeStep);
247 MDetailLog("{0},BSVMotor.Test,{1},cur={2},tgt={3},lastError={4},lastStep={5}", 229 MDetailLog("{0},BSVMotor.Test,{1},cur={2},tgt={3},lastError={4},lastStep={5}",
248 BSScene.DetailLogZero, UseName, CurrentValue, TargetValue, LastError, lastStep); 230 BSScene.DetailLogZero, UseName, CurrentValue, TargetValue, LastError, lastStep);
249 } 231 }
250 MDetailLog("{0},BSVMotor.Test,{1},===================================== END Test Output", BSScene.DetailLogZero, UseName); 232 MDetailLog("{0},BSVMotor.Test,{1},===================================== END Test Output", BSScene.DetailLogZero, UseName);
251 233
252 234
253 } 235 }
254 236
255 public override string ToString() 237 public override string ToString()
256 { 238 {
257 return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4},frictTS={5}>", 239 return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4}>",
258 UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale, FrictionTimescale); 240 UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
259 } 241 }
260} 242}
261 243
@@ -265,7 +247,6 @@ public class BSFMotor : BSMotor
265{ 247{
266 public virtual float TimeScale { get; set; } 248 public virtual float TimeScale { get; set; }
267 public virtual float TargetValueDecayTimeScale { get; set; } 249 public virtual float TargetValueDecayTimeScale { get; set; }
268 public virtual float FrictionTimescale { get; set; }
269 public virtual float Efficiency { get; set; } 250 public virtual float Efficiency { get; set; }
270 251
271 public virtual float ErrorZeroThreshold { get; set; } 252 public virtual float ErrorZeroThreshold { get; set; }
@@ -279,16 +260,15 @@ public class BSFMotor : BSMotor
279 return ErrorIsZero(LastError); 260 return ErrorIsZero(LastError);
280 } 261 }
281 public virtual bool ErrorIsZero(float err) 262 public virtual bool ErrorIsZero(float err)
282 { 263 {
283 return (err >= -ErrorZeroThreshold && err <= ErrorZeroThreshold); 264 return (err >= -ErrorZeroThreshold && err <= ErrorZeroThreshold);
284 } 265 }
285 266
286 public BSFMotor(string useName, float timeScale, float decayTimescale, float friction, float efficiency) 267 public BSFMotor(string useName, float timeScale, float decayTimescale, float efficiency)
287 : base(useName) 268 : base(useName)
288 { 269 {
289 TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite; 270 TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
290 Efficiency = 1f; 271 Efficiency = 1f;
291 FrictionTimescale = BSMotor.Infinite;
292 CurrentValue = TargetValue = 0f; 272 CurrentValue = TargetValue = 0f;
293 ErrorZeroThreshold = 0.01f; 273 ErrorZeroThreshold = 0.01f;
294 } 274 }
@@ -315,7 +295,6 @@ public class BSFMotor : BSMotor
315 295
316 float correction = 0f; 296 float correction = 0f;
317 float error = TargetValue - CurrentValue; 297 float error = TargetValue - CurrentValue;
318 LastError = error;
319 if (!ErrorIsZero(error)) 298 if (!ErrorIsZero(error))
320 { 299 {
321 correction = StepError(timeStep, error); 300 correction = StepError(timeStep, error);
@@ -331,24 +310,11 @@ public class BSFMotor : BSMotor
331 TargetValue *= (1f - decayFactor); 310 TargetValue *= (1f - decayFactor);
332 } 311 }
333 312
334 // The amount we can correct the error is reduced by the friction
335 float frictionFactor = 0f;
336 if (FrictionTimescale != BSMotor.Infinite)
337 {
338 // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep;
339 // Individual friction components can be 'infinite' so compute each separately.
340 frictionFactor = 1f / FrictionTimescale;
341 frictionFactor *= timeStep;
342 CurrentValue *= (1f - frictionFactor);
343 }
344
345 MDetailLog("{0}, BSFMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}", 313 MDetailLog("{0}, BSFMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}",
346 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, 314 BSScene.DetailLogZero, UseName, origCurrVal, origTarget,
347 timeStep, error, correction); 315 timeStep, error, correction);
348 MDetailLog("{0}, BSFMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},frictTS={4},frictFact={5},tgt={6},curr={7}", 316 MDetailLog("{0}, BSFMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},tgt={4},curr={5}",
349 BSScene.DetailLogZero, UseName, 317 BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
350 TargetValueDecayTimeScale, decayFactor, FrictionTimescale, frictionFactor,
351 TargetValue, CurrentValue);
352 } 318 }
353 else 319 else
354 { 320 {
@@ -363,6 +329,7 @@ public class BSFMotor : BSMotor
363 MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", 329 MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}",
364 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); 330 BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue);
365 } 331 }
332 LastError = error;
366 333
367 return CurrentValue; 334 return CurrentValue;
368 } 335 }
@@ -390,15 +357,15 @@ public class BSFMotor : BSMotor
390 357
391 public override string ToString() 358 public override string ToString()
392 { 359 {
393 return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4},frictTS={5}>", 360 return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4}>",
394 UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale, FrictionTimescale); 361 UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
395 } 362 }
396 363
397} 364}
398 365
399// ============================================================================ 366// ============================================================================
400// ============================================================================ 367// ============================================================================
401// Proportional, Integral, Derivitive Motor 368// Proportional, Integral, Derivitive ("PID") Motor
402// Good description at http://www.answers.com/topic/pid-controller . Includes processes for choosing p, i and d factors. 369// Good description at http://www.answers.com/topic/pid-controller . Includes processes for choosing p, i and d factors.
403public class BSPIDVMotor : BSVMotor 370public class BSPIDVMotor : BSVMotor
404{ 371{
@@ -410,7 +377,6 @@ public class BSPIDVMotor : BSVMotor
410 // The factors are vectors for the three dimensions. This is the proportional of each 377 // The factors are vectors for the three dimensions. This is the proportional of each
411 // that is applied. This could be multiplied through the actual factors but it 378 // that is applied. This could be multiplied through the actual factors but it
412 // is sometimes easier to manipulate the factors and their mix separately. 379 // is sometimes easier to manipulate the factors and their mix separately.
413 // to
414 public Vector3 FactorMix; 380 public Vector3 FactorMix;
415 381
416 // Arbritrary factor range. 382 // Arbritrary factor range.
@@ -448,14 +414,14 @@ public class BSPIDVMotor : BSVMotor
448 // If efficiency is high (1f), use a factor value that moves the error value to zero with little overshoot. 414 // If efficiency is high (1f), use a factor value that moves the error value to zero with little overshoot.
449 // If efficiency is low (0f), use a factor value that overcorrects. 415 // If efficiency is low (0f), use a factor value that overcorrects.
450 // TODO: might want to vary contribution of different factor depending on efficiency. 416 // TODO: might want to vary contribution of different factor depending on efficiency.
451 float factor = ((1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow) / 3f; 417 // float factor = ((1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow) / 3f;
452 // float factor = (1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow; 418 float factor = (1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow;
453 419
454 proportionFactor = new Vector3(factor, factor, factor); 420 proportionFactor = new Vector3(factor, factor, factor);
455 integralFactor = new Vector3(factor, factor, factor); 421 integralFactor = new Vector3(factor, factor, factor);
456 derivFactor = new Vector3(factor, factor, factor); 422 derivFactor = new Vector3(factor, factor, factor);
457 423
458 MDetailLog("{0},BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor); 424 MDetailLog("{0}, BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor);
459 } 425 }
460 } 426 }
461 427
@@ -469,16 +435,15 @@ public class BSPIDVMotor : BSVMotor
469 435
470 // A simple derivitive is the rate of change from the last error. 436 // A simple derivitive is the rate of change from the last error.
471 Vector3 derivitive = (error - LastError) * timeStep; 437 Vector3 derivitive = (error - LastError) * timeStep;
472 LastError = error;
473 438
474 // Correction = (proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError) 439 // Correction = (proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
475 Vector3 ret = error * timeStep * proportionFactor * FactorMix.X 440 Vector3 ret = error / TimeScale * timeStep * proportionFactor * FactorMix.X
476 + RunningIntegration * integralFactor * FactorMix.Y 441 + RunningIntegration / TimeScale * integralFactor * FactorMix.Y
477 + derivitive * derivFactor * FactorMix.Z 442 + derivitive / TimeScale * derivFactor * FactorMix.Z
478 ; 443 ;
479 444
480 MDetailLog("{0},BSPIDVMotor.step,ts={1},err={2},runnInt={3},deriv={4},ret={5}", 445 MDetailLog("{0}, BSPIDVMotor.step,ts={1},err={2},lerr={3},runnInt={4},deriv={5},ret={6}",
481 BSScene.DetailLogZero, timeStep, error, RunningIntegration, derivitive, ret); 446 BSScene.DetailLogZero, timeStep, error, LastError, RunningIntegration, derivitive, ret);
482 447
483 return ret; 448 return ret;
484 } 449 }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index 385ed9e..fcb892a 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27using System; 27using System;
28using System.Collections.Generic; 28using System.Collections.Generic;
29using System.Reflection;
29using System.Text; 30using System.Text;
30 31
31using OpenSim.Region.Physics.Manager; 32using OpenSim.Region.Physics.Manager;
@@ -37,7 +38,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
37{ 38{
38public static class BSParam 39public static class BSParam
39{ 40{
40 private static string LogHeader = "[BULLETSIM PARAMETERS]"; 41 private static string LogHeader = "[BULLETSIM PARAMETERS]";
41 42
42 // Tuning notes: 43 // Tuning notes:
43 // From: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6575 44 // From: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6575
@@ -51,7 +52,10 @@ public static class BSParam
51 // This is separate/independent from the collision margin. The collision margin increases the object a bit 52 // This is separate/independent from the collision margin. The collision margin increases the object a bit
52 // to improve collision detection performance and accuracy. 53 // to improve collision detection performance and accuracy.
53 // =================== 54 // ===================
54 // From: 55 // From:
56
57 public static bool UseSeparatePhysicsThread { get; private set; }
58 public static float PhysicsTimeStep { get; private set; }
55 59
56 // Level of Detail values kept as float because that's what the Meshmerizer wants 60 // Level of Detail values kept as float because that's what the Meshmerizer wants
57 public static float MeshLOD { get; private set; } 61 public static float MeshLOD { get; private set; }
@@ -86,8 +90,12 @@ public static class BSParam
86 public static bool ShouldForceSimplePrimMeshing { get; private set; } // if a cube or sphere, let Bullet do internal shapes 90 public static bool ShouldForceSimplePrimMeshing { get; private set; } // if a cube or sphere, let Bullet do internal shapes
87 public static bool ShouldUseHullsForPhysicalObjects { get; private set; } // 'true' if should create hulls for physical objects 91 public static bool ShouldUseHullsForPhysicalObjects { get; private set; } // 'true' if should create hulls for physical objects
88 public static bool ShouldRemoveZeroWidthTriangles { get; private set; } 92 public static bool ShouldRemoveZeroWidthTriangles { get; private set; }
93 public static bool ShouldUseBulletHACD { get; set; }
94 public static bool ShouldUseSingleConvexHullForPrims { get; set; }
95 public static bool ShouldUseGImpactShapeForPrims { get; set; }
96 public static bool ShouldUseAssetHulls { get; set; }
89 97
90 public static float TerrainImplementation { get; private set; } 98 public static float TerrainImplementation { get; set; }
91 public static int TerrainMeshMagnification { get; private set; } 99 public static int TerrainMeshMagnification { get; private set; }
92 public static float TerrainFriction { get; private set; } 100 public static float TerrainFriction { get; private set; }
93 public static float TerrainHitFraction { get; private set; } 101 public static float TerrainHitFraction { get; private set; }
@@ -122,11 +130,17 @@ public static class BSParam
122 public static float AvatarCapsuleWidth { get; private set; } 130 public static float AvatarCapsuleWidth { get; private set; }
123 public static float AvatarCapsuleDepth { get; private set; } 131 public static float AvatarCapsuleDepth { get; private set; }
124 public static float AvatarCapsuleHeight { get; private set; } 132 public static float AvatarCapsuleHeight { get; private set; }
133 public static float AvatarHeightLowFudge { get; private set; }
134 public static float AvatarHeightMidFudge { get; private set; }
135 public static float AvatarHeightHighFudge { get; private set; }
125 public static float AvatarContactProcessingThreshold { get; private set; } 136 public static float AvatarContactProcessingThreshold { get; private set; }
137 public static int AvatarJumpFrames { get; private set; }
126 public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } 138 public static float AvatarBelowGroundUpCorrectionMeters { get; private set; }
127 public static float AvatarStepHeight { get; private set; } 139 public static float AvatarStepHeight { get; private set; }
128 public static float AvatarStepApproachFactor { get; private set; } 140 public static float AvatarStepApproachFactor { get; private set; }
129 public static float AvatarStepForceFactor { get; private set; } 141 public static float AvatarStepForceFactor { get; private set; }
142 public static float AvatarStepUpCorrectionFactor { get; private set; }
143 public static int AvatarStepSmoothingSteps { get; private set; }
130 144
131 // Vehicle parameters 145 // Vehicle parameters
132 public static float VehicleMaxLinearVelocity { get; private set; } 146 public static float VehicleMaxLinearVelocity { get; private set; }
@@ -138,9 +152,15 @@ public static class BSParam
138 public static float VehicleRestitution { get; private set; } 152 public static float VehicleRestitution { get; private set; }
139 public static Vector3 VehicleLinearFactor { get; private set; } 153 public static Vector3 VehicleLinearFactor { get; private set; }
140 public static Vector3 VehicleAngularFactor { get; private set; } 154 public static Vector3 VehicleAngularFactor { get; private set; }
155 public static Vector3 VehicleInertiaFactor { get; private set; }
141 public static float VehicleGroundGravityFudge { get; private set; } 156 public static float VehicleGroundGravityFudge { get; private set; }
142 public static float VehicleAngularBankingTimescaleFudge { get; private set; } 157 public static float VehicleAngularBankingTimescaleFudge { get; private set; }
143 public static bool VehicleDebuggingEnabled { get; private set; } 158 public static bool VehicleEnableLinearDeflection { get; private set; }
159 public static bool VehicleLinearDeflectionNotCollidingNoZ { get; private set; }
160 public static bool VehicleEnableAngularVerticalAttraction { get; private set; }
161 public static int VehicleAngularVerticalAttractionAlgorithm { get; private set; }
162 public static bool VehicleEnableAngularDeflection { get; private set; }
163 public static bool VehicleEnableAngularBanking { get; private set; }
144 164
145 // Convex Hulls 165 // Convex Hulls
146 public static int CSHullMaxDepthSplit { get; private set; } 166 public static int CSHullMaxDepthSplit { get; private set; }
@@ -149,9 +169,19 @@ public static class BSParam
149 public static float CSHullVolumeConservationThresholdPercent { get; private set; } 169 public static float CSHullVolumeConservationThresholdPercent { get; private set; }
150 public static int CSHullMaxVertices { get; private set; } 170 public static int CSHullMaxVertices { get; private set; }
151 public static float CSHullMaxSkinWidth { get; private set; } 171 public static float CSHullMaxSkinWidth { get; private set; }
172 public static float BHullMaxVerticesPerHull { get; private set; } // 100
173 public static float BHullMinClusters { get; private set; } // 2
174 public static float BHullCompacityWeight { get; private set; } // 0.1
175 public static float BHullVolumeWeight { get; private set; } // 0.0
176 public static float BHullConcavity { get; private set; } // 100
177 public static bool BHullAddExtraDistPoints { get; private set; } // false
178 public static bool BHullAddNeighboursDistPoints { get; private set; } // false
179 public static bool BHullAddFacesPoints { get; private set; } // false
180 public static bool BHullShouldAdjustCollisionMargin { get; private set; } // false
152 181
153 // Linkset implementation parameters 182 // Linkset implementation parameters
154 public static float LinksetImplementation { get; private set; } 183 public static float LinksetImplementation { get; private set; }
184 public static bool LinksetOffsetCenterOfMass { get; private set; }
155 public static bool LinkConstraintUseFrameOffset { get; private set; } 185 public static bool LinkConstraintUseFrameOffset { get; private set; }
156 public static bool LinkConstraintEnableTransMotor { get; private set; } 186 public static bool LinkConstraintEnableTransMotor { get; private set; }
157 public static float LinkConstraintTransMotorMaxVel { get; private set; } 187 public static float LinkConstraintTransMotorMaxVel { get; private set; }
@@ -223,16 +253,41 @@ public static class BSParam
223 getter = pGetter; 253 getter = pGetter;
224 objectSet = pObjSetter; 254 objectSet = pObjSetter;
225 } 255 }
226 /* Wish I could simplify using this definition but CLR doesn't store references so closure around delegates of references won't work 256 // Simple parameter variable where property name is the same as the INI file name
227 public ParameterDefn(string pName, string pDesc, T pDefault, ref T loc) 257 // and the value is only a simple get and set.
258 public ParameterDefn(string pName, string pDesc, T pDefault)
228 : base(pName, pDesc) 259 : base(pName, pDesc)
229 { 260 {
230 defaultValue = pDefault; 261 defaultValue = pDefault;
231 setter = (s, v) => { loc = v; }; 262 setter = (s, v) => { SetValueByName(s, name, v); };
232 getter = (s) => { return loc; }; 263 getter = (s) => { return GetValueByName(s, name); };
233 objectSet = null; 264 objectSet = null;
234 } 265 }
235 */ 266 // Use reflection to find the property named 'pName' in BSParam and assign 'val' to same.
267 private void SetValueByName(BSScene s, string pName, T val)
268 {
269 PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
270 if (prop == null)
271 {
272 // This should only be output when someone adds a new INI parameter and misspells the name.
273 s.Logger.ErrorFormat("{0} SetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameters name.", LogHeader, pName);
274 }
275 else
276 {
277 prop.SetValue(null, val, null);
278 }
279 }
280 // Use reflection to find the property named 'pName' in BSParam and return the value in same.
281 private T GetValueByName(BSScene s, string pName)
282 {
283 PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
284 if (prop == null)
285 {
286 // This should only be output when someone adds a new INI parameter and misspells the name.
287 s.Logger.ErrorFormat("{0} GetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameter name.", LogHeader, pName);
288 }
289 return (T)prop.GetValue(null, null);
290 }
236 public override void AssignDefault(BSScene s) 291 public override void AssignDefault(BSScene s)
237 { 292 {
238 setter(s, defaultValue); 293 setter(s, defaultValue);
@@ -309,6 +364,11 @@ public static class BSParam
309 // v = value (appropriate type) 364 // v = value (appropriate type)
310 private static ParameterDefnBase[] ParameterDefinitions = 365 private static ParameterDefnBase[] ParameterDefinitions =
311 { 366 {
367 new ParameterDefn<bool>("UseSeparatePhysicsThread", "If 'true', the physics engine runs independent from the simulator heartbeat",
368 false ),
369 new ParameterDefn<float>("PhysicsTimeStep", "If separate thread, seconds to simulate each interval",
370 0.089f ),
371
312 new ParameterDefn<bool>("MeshSculptedPrim", "Whether to create meshes for sculpties", 372 new ParameterDefn<bool>("MeshSculptedPrim", "Whether to create meshes for sculpties",
313 true, 373 true,
314 (s) => { return ShouldMeshSculptedPrim; }, 374 (s) => { return ShouldMeshSculptedPrim; },
@@ -322,18 +382,20 @@ public static class BSParam
322 (s) => { return ShouldUseHullsForPhysicalObjects; }, 382 (s) => { return ShouldUseHullsForPhysicalObjects; },
323 (s,v) => { ShouldUseHullsForPhysicalObjects = v; } ), 383 (s,v) => { ShouldUseHullsForPhysicalObjects = v; } ),
324 new ParameterDefn<bool>("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes", 384 new ParameterDefn<bool>("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes",
325 true, 385 true ),
326 (s) => { return ShouldRemoveZeroWidthTriangles; }, 386 new ParameterDefn<bool>("ShouldUseBulletHACD", "If true, use the Bullet version of HACD",
327 (s,v) => { ShouldRemoveZeroWidthTriangles = v; } ), 387 false ),
388 new ParameterDefn<bool>("ShouldUseSingleConvexHullForPrims", "If true, use a single convex hull shape for physical prims",
389 true ),
390 new ParameterDefn<bool>("ShouldUseGImpactShapeForPrims", "If true, use a GImpact shape for prims with cuts and twists",
391 false ),
392 new ParameterDefn<bool>("ShouldUseAssetHulls", "If true, use hull if specified in the mesh asset info",
393 true ),
328 394
329 new ParameterDefn<int>("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions", 395 new ParameterDefn<int>("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions",
330 5, 396 5 ),
331 (s) => { return CrossingFailuresBeforeOutOfBounds; },
332 (s,v) => { CrossingFailuresBeforeOutOfBounds = v; } ),
333 new ParameterDefn<float>("UpdateVelocityChangeThreshold", "Change in updated velocity required before reporting change to simulator", 397 new ParameterDefn<float>("UpdateVelocityChangeThreshold", "Change in updated velocity required before reporting change to simulator",
334 0.1f, 398 0.1f ),
335 (s) => { return UpdateVelocityChangeThreshold; },
336 (s,v) => { UpdateVelocityChangeThreshold = v; } ),
337 399
338 new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", 400 new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
339 32f, 401 32f,
@@ -399,26 +461,22 @@ public static class BSParam
399 (s) => { return MaxAddForceMagnitude; }, 461 (s) => { return MaxAddForceMagnitude; },
400 (s,v) => { MaxAddForceMagnitude = v; MaxAddForceMagnitudeSquared = v * v; } ), 462 (s,v) => { MaxAddForceMagnitude = v; MaxAddForceMagnitudeSquared = v * v; } ),
401 // Density is passed around as 100kg/m3. This scales that to 1kg/m3. 463 // Density is passed around as 100kg/m3. This scales that to 1kg/m3.
464 // Reduce by power of 100 because Bullet doesn't seem to handle objects with large mass very well
402 new ParameterDefn<float>("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)", 465 new ParameterDefn<float>("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)",
403 0.01f, 466 0.01f ),
404 (s) => { return DensityScaleFactor; },
405 (s,v) => { DensityScaleFactor = v; } ),
406 467
407 new ParameterDefn<float>("PID_D", "Derivitive factor for motion smoothing", 468 new ParameterDefn<float>("PID_D", "Derivitive factor for motion smoothing",
408 2200f, 469 2200f ),
409 (s) => { return (float)PID_D; },
410 (s,v) => { PID_D = v; } ),
411 new ParameterDefn<float>("PID_P", "Parameteric factor for motion smoothing", 470 new ParameterDefn<float>("PID_P", "Parameteric factor for motion smoothing",
412 900f, 471 900f ),
413 (s) => { return (float)PID_P; },
414 (s,v) => { PID_P = v; } ),
415 472
416 new ParameterDefn<float>("DefaultFriction", "Friction factor used on new objects", 473 new ParameterDefn<float>("DefaultFriction", "Friction factor used on new objects",
417 0.2f, 474 0.2f,
418 (s) => { return DefaultFriction; }, 475 (s) => { return DefaultFriction; },
419 (s,v) => { DefaultFriction = v; s.UnmanagedParams[0].defaultFriction = v; } ), 476 (s,v) => { DefaultFriction = v; s.UnmanagedParams[0].defaultFriction = v; } ),
477 // For historical reasons, the viewer and simulator multiply the density by 100
420 new ParameterDefn<float>("DefaultDensity", "Density for new objects" , 478 new ParameterDefn<float>("DefaultDensity", "Density for new objects" ,
421 10.000006836f, // Aluminum g/cm3 479 1000.0006836f, // Aluminum g/cm3 * 100
422 (s) => { return DefaultDensity; }, 480 (s) => { return DefaultDensity; },
423 (s,v) => { DefaultDensity = v; s.UnmanagedParams[0].defaultDensity = v; } ), 481 (s,v) => { DefaultDensity = v; s.UnmanagedParams[0].defaultDensity = v; } ),
424 new ParameterDefn<float>("DefaultRestitution", "Bouncyness of an object" , 482 new ParameterDefn<float>("DefaultRestitution", "Bouncyness of an object" ,
@@ -478,86 +536,59 @@ public static class BSParam
478 (s,o) => { s.PE.SetContactProcessingThreshold(o.PhysBody, ContactProcessingThreshold); } ), 536 (s,o) => { s.PE.SetContactProcessingThreshold(o.PhysBody, ContactProcessingThreshold); } ),
479 537
480 new ParameterDefn<float>("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)", 538 new ParameterDefn<float>("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)",
481 (float)BSTerrainPhys.TerrainImplementation.Mesh, 539 (float)BSTerrainPhys.TerrainImplementation.Mesh ),
482 (s) => { return TerrainImplementation; },
483 (s,v) => { TerrainImplementation = v; } ),
484 new ParameterDefn<int>("TerrainMeshMagnification", "Number of times the 256x256 heightmap is multiplied to create the terrain mesh" , 540 new ParameterDefn<int>("TerrainMeshMagnification", "Number of times the 256x256 heightmap is multiplied to create the terrain mesh" ,
485 2, 541 2 ),
486 (s) => { return TerrainMeshMagnification; },
487 (s,v) => { TerrainMeshMagnification = v; } ),
488 new ParameterDefn<float>("TerrainFriction", "Factor to reduce movement against terrain surface" , 542 new ParameterDefn<float>("TerrainFriction", "Factor to reduce movement against terrain surface" ,
489 0.3f, 543 0.3f ),
490 (s) => { return TerrainFriction; },
491 (s,v) => { TerrainFriction = v; /* TODO: set on real terrain */} ),
492 new ParameterDefn<float>("TerrainHitFraction", "Distance to measure hit collisions" , 544 new ParameterDefn<float>("TerrainHitFraction", "Distance to measure hit collisions" ,
493 0.8f, 545 0.8f ),
494 (s) => { return TerrainHitFraction; },
495 (s,v) => { TerrainHitFraction = v; /* TODO: set on real terrain */ } ),
496 new ParameterDefn<float>("TerrainRestitution", "Bouncyness" , 546 new ParameterDefn<float>("TerrainRestitution", "Bouncyness" ,
497 0f, 547 0f ),
498 (s) => { return TerrainRestitution; },
499 (s,v) => { TerrainRestitution = v; /* TODO: set on real terrain */ } ),
500 new ParameterDefn<float>("TerrainContactProcessingThreshold", "Distance from terrain to stop processing collisions" , 548 new ParameterDefn<float>("TerrainContactProcessingThreshold", "Distance from terrain to stop processing collisions" ,
501 0.0f, 549 0.0f ),
502 (s) => { return TerrainContactProcessingThreshold; },
503 (s,v) => { TerrainContactProcessingThreshold = v; /* TODO: set on real terrain */ } ),
504 new ParameterDefn<float>("TerrainCollisionMargin", "Margin where collision checking starts" , 550 new ParameterDefn<float>("TerrainCollisionMargin", "Margin where collision checking starts" ,
505 0.08f, 551 0.08f ),
506 (s) => { return TerrainCollisionMargin; },
507 (s,v) => { TerrainCollisionMargin = v; /* TODO: set on real terrain */ } ),
508 552
509 new ParameterDefn<float>("AvatarFriction", "Factor to reduce movement against an avatar. Changed on avatar recreation.", 553 new ParameterDefn<float>("AvatarFriction", "Factor to reduce movement against an avatar. Changed on avatar recreation.",
510 0.2f, 554 0.2f ),
511 (s) => { return AvatarFriction; },
512 (s,v) => { AvatarFriction = v; } ),
513 new ParameterDefn<float>("AvatarStandingFriction", "Avatar friction when standing. Changed on avatar recreation.", 555 new ParameterDefn<float>("AvatarStandingFriction", "Avatar friction when standing. Changed on avatar recreation.",
514 0.95f, 556 0.95f ),
515 (s) => { return AvatarStandingFriction; },
516 (s,v) => { AvatarStandingFriction = v; } ),
517 new ParameterDefn<float>("AvatarAlwaysRunFactor", "Speed multiplier if avatar is set to always run", 557 new ParameterDefn<float>("AvatarAlwaysRunFactor", "Speed multiplier if avatar is set to always run",
518 1.3f, 558 1.3f ),
519 (s) => { return AvatarAlwaysRunFactor; }, 559 // For historical reasons, density is reported * 100
520 (s,v) => { AvatarAlwaysRunFactor = v; } ), 560 new ParameterDefn<float>("AvatarDensity", "Density of an avatar. Changed on avatar recreation. Scaled times 100.",
521 new ParameterDefn<float>("AvatarDensity", "Density of an avatar. Changed on avatar recreation.", 561 3500f) , // 3.5 * 100
522 3.5f,
523 (s) => { return AvatarDensity; },
524 (s,v) => { AvatarDensity = v; } ),
525 new ParameterDefn<float>("AvatarRestitution", "Bouncyness. Changed on avatar recreation.", 562 new ParameterDefn<float>("AvatarRestitution", "Bouncyness. Changed on avatar recreation.",
526 0f, 563 0f ),
527 (s) => { return AvatarRestitution; },
528 (s,v) => { AvatarRestitution = v; } ),
529 new ParameterDefn<float>("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule", 564 new ParameterDefn<float>("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule",
530 0.6f, 565 0.6f ) ,
531 (s) => { return AvatarCapsuleWidth; },
532 (s,v) => { AvatarCapsuleWidth = v; } ),
533 new ParameterDefn<float>("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule", 566 new ParameterDefn<float>("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule",
534 0.45f, 567 0.45f ),
535 (s) => { return AvatarCapsuleDepth; },
536 (s,v) => { AvatarCapsuleDepth = v; } ),
537 new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar", 568 new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar",
538 1.5f, 569 1.5f ),
539 (s) => { return AvatarCapsuleHeight; }, 570 new ParameterDefn<float>("AvatarHeightLowFudge", "A fudge factor to make small avatars stand on the ground",
540 (s,v) => { AvatarCapsuleHeight = v; } ), 571 -0.2f ),
572 new ParameterDefn<float>("AvatarHeightMidFudge", "A fudge distance to adjust average sized avatars to be standing on ground",
573 0.2f ),
574 new ParameterDefn<float>("AvatarHeightHighFudge", "A fudge factor to make tall avatars stand on the ground",
575 0.2f ),
541 new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", 576 new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions",
542 0.1f, 577 0.1f ),
543 (s) => { return AvatarContactProcessingThreshold; },
544 (s,v) => { AvatarContactProcessingThreshold = v; } ),
545 new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", 578 new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground",
546 1.0f, 579 1.0f ),
547 (s) => { return AvatarBelowGroundUpCorrectionMeters; }, 580 new ParameterDefn<int>("AvatarJumpFrames", "Number of frames to allow jump forces. Changes jump height.",
548 (s,v) => { AvatarBelowGroundUpCorrectionMeters = v; } ), 581 4 ),
549 new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction", 582 new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction",
550 0.3f, 583 0.6f ) ,
551 (s) => { return AvatarStepHeight; },
552 (s,v) => { AvatarStepHeight = v; } ),
553 new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)", 584 new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)",
554 0.6f, 585 0.6f ),
555 (s) => { return AvatarStepApproachFactor; },
556 (s,v) => { AvatarStepApproachFactor = v; } ),
557 new ParameterDefn<float>("AvatarStepForceFactor", "Controls the amount of force up applied to step up onto a step", 586 new ParameterDefn<float>("AvatarStepForceFactor", "Controls the amount of force up applied to step up onto a step",
558 2.0f, 587 1.0f ),
559 (s) => { return AvatarStepForceFactor; }, 588 new ParameterDefn<float>("AvatarStepUpCorrectionFactor", "Multiplied by height of step collision to create up movement at step",
560 (s,v) => { AvatarStepForceFactor = v; } ), 589 1.0f ),
590 new ParameterDefn<int>("AvatarStepSmoothingSteps", "Number of frames after a step collision that we continue walking up stairs",
591 2 ),
561 592
562 new ParameterDefn<float>("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle", 593 new ParameterDefn<float>("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle",
563 1000.0f, 594 1000.0f,
@@ -568,37 +599,33 @@ public static class BSParam
568 (s) => { return (float)VehicleMaxAngularVelocity; }, 599 (s) => { return (float)VehicleMaxAngularVelocity; },
569 (s,v) => { VehicleMaxAngularVelocity = v; VehicleMaxAngularVelocitySq = v * v; } ), 600 (s,v) => { VehicleMaxAngularVelocity = v; VehicleMaxAngularVelocitySq = v * v; } ),
570 new ParameterDefn<float>("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)", 601 new ParameterDefn<float>("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)",
571 0.0f, 602 0.0f ),
572 (s) => { return VehicleAngularDamping; },
573 (s,v) => { VehicleAngularDamping = v; } ),
574 new ParameterDefn<Vector3>("VehicleLinearFactor", "Fraction of physical linear changes applied to vehicle (<0,0,0> to <1,1,1>)", 603 new ParameterDefn<Vector3>("VehicleLinearFactor", "Fraction of physical linear changes applied to vehicle (<0,0,0> to <1,1,1>)",
575 new Vector3(1f, 1f, 1f), 604 new Vector3(1f, 1f, 1f) ),
576 (s) => { return VehicleLinearFactor; },
577 (s,v) => { VehicleLinearFactor = v; } ),
578 new ParameterDefn<Vector3>("VehicleAngularFactor", "Fraction of physical angular changes applied to vehicle (<0,0,0> to <1,1,1>)", 605 new ParameterDefn<Vector3>("VehicleAngularFactor", "Fraction of physical angular changes applied to vehicle (<0,0,0> to <1,1,1>)",
579 new Vector3(1f, 1f, 1f), 606 new Vector3(1f, 1f, 1f) ),
580 (s) => { return VehicleAngularFactor; }, 607 new ParameterDefn<Vector3>("VehicleInertiaFactor", "Fraction of physical inertia applied (<0,0,0> to <1,1,1>)",
581 (s,v) => { VehicleAngularFactor = v; } ), 608 new Vector3(1f, 1f, 1f) ),
582 new ParameterDefn<float>("VehicleFriction", "Friction of vehicle on the ground (0.0 - 1.0)", 609 new ParameterDefn<float>("VehicleFriction", "Friction of vehicle on the ground (0.0 - 1.0)",
583 0.0f, 610 0.0f ),
584 (s) => { return VehicleFriction; },
585 (s,v) => { VehicleFriction = v; } ),
586 new ParameterDefn<float>("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)", 611 new ParameterDefn<float>("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)",
587 0.0f, 612 0.0f ),
588 (s) => { return VehicleRestitution; },
589 (s,v) => { VehicleRestitution = v; } ),
590 new ParameterDefn<float>("VehicleGroundGravityFudge", "Factor to multiply gravity if a ground vehicle is probably on the ground (0.0 - 1.0)", 613 new ParameterDefn<float>("VehicleGroundGravityFudge", "Factor to multiply gravity if a ground vehicle is probably on the ground (0.0 - 1.0)",
591 0.2f, 614 0.2f ),
592 (s) => { return VehicleGroundGravityFudge; },
593 (s,v) => { VehicleGroundGravityFudge = v; } ),
594 new ParameterDefn<float>("VehicleAngularBankingTimescaleFudge", "Factor to multiple angular banking timescale. Tune to increase realism.", 615 new ParameterDefn<float>("VehicleAngularBankingTimescaleFudge", "Factor to multiple angular banking timescale. Tune to increase realism.",
595 60.0f, 616 60.0f ),
596 (s) => { return VehicleAngularBankingTimescaleFudge; }, 617 new ParameterDefn<bool>("VehicleEnableLinearDeflection", "Turn on/off vehicle linear deflection effect",
597 (s,v) => { VehicleAngularBankingTimescaleFudge = v; } ), 618 true ),
598 new ParameterDefn<bool>("VehicleDebuggingEnable", "Turn on/off vehicle debugging", 619 new ParameterDefn<bool>("VehicleLinearDeflectionNotCollidingNoZ", "Turn on/off linear deflection Z effect on non-colliding vehicles",
599 false, 620 true ),
600 (s) => { return VehicleDebuggingEnabled; }, 621 new ParameterDefn<bool>("VehicleEnableAngularVerticalAttraction", "Turn on/off vehicle angular vertical attraction effect",
601 (s,v) => { VehicleDebuggingEnabled = v; } ), 622 true ),
623 new ParameterDefn<int>("VehicleAngularVerticalAttractionAlgorithm", "Select vertical attraction algo. You need to look at the source.",
624 0 ),
625 new ParameterDefn<bool>("VehicleEnableAngularDeflection", "Turn on/off vehicle angular deflection effect",
626 true ),
627 new ParameterDefn<bool>("VehicleEnableAngularBanking", "Turn on/off vehicle angular banking effect",
628 true ),
602 629
603 new ParameterDefn<float>("MaxPersistantManifoldPoolSize", "Number of manifolds pooled (0 means default of 4096)", 630 new ParameterDefn<float>("MaxPersistantManifoldPoolSize", "Number of manifolds pooled (0 means default of 4096)",
604 0f, 631 0f,
@@ -611,7 +638,7 @@ public static class BSParam
611 new ParameterDefn<bool>("ShouldDisableContactPoolDynamicAllocation", "Enable to allow large changes in object count", 638 new ParameterDefn<bool>("ShouldDisableContactPoolDynamicAllocation", "Enable to allow large changes in object count",
612 false, 639 false,
613 (s) => { return ShouldDisableContactPoolDynamicAllocation; }, 640 (s) => { return ShouldDisableContactPoolDynamicAllocation; },
614 (s,v) => { ShouldDisableContactPoolDynamicAllocation = v; 641 (s,v) => { ShouldDisableContactPoolDynamicAllocation = v;
615 s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation = NumericBool(v); } ), 642 s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation = NumericBool(v); } ),
616 new ParameterDefn<bool>("ShouldForceUpdateAllAabbs", "Enable to recomputer AABBs every simulator step", 643 new ParameterDefn<bool>("ShouldForceUpdateAllAabbs", "Enable to recomputer AABBs every simulator step",
617 false, 644 false,
@@ -643,62 +670,55 @@ public static class BSParam
643 (s,v) => { GlobalContactBreakingThreshold = v; s.UnmanagedParams[0].globalContactBreakingThreshold = v; } ), 670 (s,v) => { GlobalContactBreakingThreshold = v; s.UnmanagedParams[0].globalContactBreakingThreshold = v; } ),
644 671
645 new ParameterDefn<int>("CSHullMaxDepthSplit", "CS impl: max depth to split for hull. 1-10 but > 7 is iffy", 672 new ParameterDefn<int>("CSHullMaxDepthSplit", "CS impl: max depth to split for hull. 1-10 but > 7 is iffy",
646 7, 673 7 ),
647 (s) => { return CSHullMaxDepthSplit; },
648 (s,v) => { CSHullMaxDepthSplit = v; } ),
649 new ParameterDefn<int>("CSHullMaxDepthSplitForSimpleShapes", "CS impl: max depth setting for simple prim shapes", 674 new ParameterDefn<int>("CSHullMaxDepthSplitForSimpleShapes", "CS impl: max depth setting for simple prim shapes",
650 2, 675 2 ),
651 (s) => { return CSHullMaxDepthSplitForSimpleShapes; },
652 (s,v) => { CSHullMaxDepthSplitForSimpleShapes = v; } ),
653 new ParameterDefn<float>("CSHullConcavityThresholdPercent", "CS impl: concavity threshold percent (0-20)", 676 new ParameterDefn<float>("CSHullConcavityThresholdPercent", "CS impl: concavity threshold percent (0-20)",
654 5f, 677 5f ),
655 (s) => { return CSHullConcavityThresholdPercent; },
656 (s,v) => { CSHullConcavityThresholdPercent = v; } ),
657 new ParameterDefn<float>("CSHullVolumeConservationThresholdPercent", "percent volume conservation to collapse hulls (0-30)", 678 new ParameterDefn<float>("CSHullVolumeConservationThresholdPercent", "percent volume conservation to collapse hulls (0-30)",
658 5f, 679 5f ),
659 (s) => { return CSHullVolumeConservationThresholdPercent; },
660 (s,v) => { CSHullVolumeConservationThresholdPercent = v; } ),
661 new ParameterDefn<int>("CSHullMaxVertices", "CS impl: maximum number of vertices in output hulls. Keep < 50.", 680 new ParameterDefn<int>("CSHullMaxVertices", "CS impl: maximum number of vertices in output hulls. Keep < 50.",
662 32, 681 32 ),
663 (s) => { return CSHullMaxVertices; },
664 (s,v) => { CSHullMaxVertices = v; } ),
665 new ParameterDefn<float>("CSHullMaxSkinWidth", "CS impl: skin width to apply to output hulls.", 682 new ParameterDefn<float>("CSHullMaxSkinWidth", "CS impl: skin width to apply to output hulls.",
666 0, 683 0f ),
667 (s) => { return CSHullMaxSkinWidth; }, 684
668 (s,v) => { CSHullMaxSkinWidth = v; } ), 685 new ParameterDefn<float>("BHullMaxVerticesPerHull", "Bullet impl: max number of vertices per created hull",
686 100f ),
687 new ParameterDefn<float>("BHullMinClusters", "Bullet impl: minimum number of hulls to create per mesh",
688 2f ),
689 new ParameterDefn<float>("BHullCompacityWeight", "Bullet impl: weight factor for how compact to make hulls",
690 0.1f ),
691 new ParameterDefn<float>("BHullVolumeWeight", "Bullet impl: weight factor for volume in created hull",
692 0f ),
693 new ParameterDefn<float>("BHullConcavity", "Bullet impl: weight factor for how convex a created hull can be",
694 100f ),
695 new ParameterDefn<bool>("BHullAddExtraDistPoints", "Bullet impl: whether to add extra vertices for long distance vectors",
696 false ),
697 new ParameterDefn<bool>("BHullAddNeighboursDistPoints", "Bullet impl: whether to add extra vertices between neighbor hulls",
698 false ),
699 new ParameterDefn<bool>("BHullAddFacesPoints", "Bullet impl: whether to add extra vertices to break up hull faces",
700 false ),
701 new ParameterDefn<bool>("BHullShouldAdjustCollisionMargin", "Bullet impl: whether to shrink resulting hulls to account for collision margin",
702 false ),
669 703
670 new ParameterDefn<float>("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)", 704 new ParameterDefn<float>("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)",
671 (float)BSLinkset.LinksetImplementation.Compound, 705 (float)BSLinkset.LinksetImplementation.Compound ),
672 (s) => { return LinksetImplementation; }, 706 new ParameterDefn<bool>("LinksetOffsetCenterOfMass", "If 'true', compute linkset center-of-mass and offset linkset position to account for same",
673 (s,v) => { LinksetImplementation = v; } ), 707 true ),
674 new ParameterDefn<bool>("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.", 708 new ParameterDefn<bool>("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.",
675 false, 709 false ),
676 (s) => { return LinkConstraintUseFrameOffset; },
677 (s,v) => { LinkConstraintUseFrameOffset = v; } ),
678 new ParameterDefn<bool>("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints", 710 new ParameterDefn<bool>("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints",
679 true, 711 true ),
680 (s) => { return LinkConstraintEnableTransMotor; },
681 (s,v) => { LinkConstraintEnableTransMotor = v; } ),
682 new ParameterDefn<float>("LinkConstraintTransMotorMaxVel", "Maximum velocity to be applied by translational motor in linkset constraints", 712 new ParameterDefn<float>("LinkConstraintTransMotorMaxVel", "Maximum velocity to be applied by translational motor in linkset constraints",
683 5.0f, 713 5.0f ),
684 (s) => { return LinkConstraintTransMotorMaxVel; },
685 (s,v) => { LinkConstraintTransMotorMaxVel = v; } ),
686 new ParameterDefn<float>("LinkConstraintTransMotorMaxForce", "Maximum force to be applied by translational motor in linkset constraints", 714 new ParameterDefn<float>("LinkConstraintTransMotorMaxForce", "Maximum force to be applied by translational motor in linkset constraints",
687 0.1f, 715 0.1f ),
688 (s) => { return LinkConstraintTransMotorMaxForce; },
689 (s,v) => { LinkConstraintTransMotorMaxForce = v; } ),
690 new ParameterDefn<float>("LinkConstraintCFM", "Amount constraint can be violated. 0=no violation, 1=infinite. Default=0.1", 716 new ParameterDefn<float>("LinkConstraintCFM", "Amount constraint can be violated. 0=no violation, 1=infinite. Default=0.1",
691 0.1f, 717 0.1f ),
692 (s) => { return LinkConstraintCFM; },
693 (s,v) => { LinkConstraintCFM = v; } ),
694 new ParameterDefn<float>("LinkConstraintERP", "Amount constraint is corrected each tick. 0=none, 1=all. Default = 0.2", 718 new ParameterDefn<float>("LinkConstraintERP", "Amount constraint is corrected each tick. 0=none, 1=all. Default = 0.2",
695 0.1f, 719 0.1f ),
696 (s) => { return LinkConstraintERP; },
697 (s,v) => { LinkConstraintERP = v; } ),
698 new ParameterDefn<float>("LinkConstraintSolverIterations", "Number of solver iterations when computing constraint. (0 = Bullet default)", 720 new ParameterDefn<float>("LinkConstraintSolverIterations", "Number of solver iterations when computing constraint. (0 = Bullet default)",
699 40, 721 40 ),
700 (s) => { return LinkConstraintSolverIterations; },
701 (s,v) => { LinkConstraintSolverIterations = v; } ),
702 722
703 new ParameterDefn<int>("PhysicsMetricFrames", "Frames between outputting detailed phys metrics. (0 is off)", 723 new ParameterDefn<int>("PhysicsMetricFrames", "Frames between outputting detailed phys metrics. (0 is off)",
704 0, 724 0,
@@ -707,7 +727,7 @@ public static class BSParam
707 new ParameterDefn<float>("ResetBroadphasePool", "Setting this is any value resets the broadphase collision pool", 727 new ParameterDefn<float>("ResetBroadphasePool", "Setting this is any value resets the broadphase collision pool",
708 0f, 728 0f,
709 (s) => { return 0f; }, 729 (s) => { return 0f; },
710 (s,v) => { BSParam.ResetBroadphasePoolTainted(s, v); } ), 730 (s,v) => { BSParam.ResetBroadphasePoolTainted(s, v, false /* inTaintTime */); } ),
711 new ParameterDefn<float>("ResetConstraintSolver", "Setting this is any value resets the constraint solver", 731 new ParameterDefn<float>("ResetConstraintSolver", "Setting this is any value resets the constraint solver",
712 0f, 732 0f,
713 (s) => { return 0f; }, 733 (s) => { return 0f; },
@@ -793,10 +813,10 @@ public static class BSParam
793 // ===================================================================== 813 // =====================================================================
794 // There are parameters that, when set, cause things to happen in the physics engine. 814 // There are parameters that, when set, cause things to happen in the physics engine.
795 // This causes the broadphase collision cache to be cleared. 815 // This causes the broadphase collision cache to be cleared.
796 private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v) 816 private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v, bool inTaintTime)
797 { 817 {
798 BSScene physScene = pPhysScene; 818 BSScene physScene = pPhysScene;
799 physScene.TaintedObject("BSParam.ResetBroadphasePoolTainted", delegate() 819 physScene.TaintedObject(inTaintTime, "BSParam.ResetBroadphasePoolTainted", delegate()
800 { 820 {
801 physScene.PE.ResetBroadphasePool(physScene.World); 821 physScene.PE.ResetBroadphasePool(physScene.World);
802 }); 822 });
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index 6bb88c7..9dc52d5 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -38,12 +38,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
38 * Class to wrap all objects. 38 * Class to wrap all objects.
39 * The rest of BulletSim doesn't need to keep checking for avatars or prims 39 * The rest of BulletSim doesn't need to keep checking for avatars or prims
40 * unless the difference is significant. 40 * unless the difference is significant.
41 * 41 *
42 * Variables in the physicsl objects are in three forms: 42 * Variables in the physicsl objects are in three forms:
43 * VariableName: used by the simulator and performs taint operations, etc 43 * VariableName: used by the simulator and performs taint operations, etc
44 * RawVariableName: direct reference to the BulletSim storage for the variable value 44 * RawVariableName: direct reference to the BulletSim storage for the variable value
45 * ForceVariableName: direct reference (store and fetch) to the value in the physics engine. 45 * ForceVariableName: direct reference (store and fetch) to the value in the physics engine.
46 * The last two (and certainly the last one) should be referenced only in taint-time. 46 * The last one should only be referenced in taint-time.
47 */ 47 */
48 48
49/* 49/*
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
52 * SOP.ApplyImpulse SOP.ApplyAngularImpulse SOP.SetAngularImpulse SOP.SetForce 52 * SOP.ApplyImpulse SOP.ApplyAngularImpulse SOP.SetAngularImpulse SOP.SetForce
53 * SOG.ApplyImpulse SOG.ApplyAngularImpulse SOG.SetAngularImpulse 53 * SOG.ApplyImpulse SOG.ApplyAngularImpulse SOG.SetAngularImpulse
54 * PA.AddForce PA.AddAngularForce PA.Torque = v PA.Force = v 54 * PA.AddForce PA.AddAngularForce PA.Torque = v PA.Force = v
55 * BS.ApplyCentralForce BS.ApplyTorque 55 * BS.ApplyCentralForce BS.ApplyTorque
56 */ 56 */
57 57
58// Flags used to denote which properties updates when making UpdateProperties calls to linksets, etc. 58// Flags used to denote which properties updates when making UpdateProperties calls to linksets, etc.
@@ -72,19 +72,27 @@ public abstract class BSPhysObject : PhysicsActor
72 } 72 }
73 protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName) 73 protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName)
74 { 74 {
75 PhysicsScene = parentScene; 75 IsInitialized = false;
76
77 PhysScene = parentScene;
76 LocalID = localID; 78 LocalID = localID;
77 PhysObjectName = name; 79 PhysObjectName = name;
78 Name = name; // PhysicsActor also has the name of the object. Someday consolidate. 80 Name = name; // PhysicsActor also has the name of the object. Someday consolidate.
79 TypeName = typeName; 81 TypeName = typeName;
80 82
83 // The collection of things that push me around
84 PhysicalActors = new BSActorCollection(PhysScene);
85
81 // Initialize variables kept in base. 86 // Initialize variables kept in base.
82 GravModifier = 1.0f; 87 GravModifier = 1.0f;
83 Gravity = new OMV.Vector3(0f, 0f, BSParam.Gravity); 88 Gravity = new OMV.Vector3(0f, 0f, BSParam.Gravity);
89 HoverActive = false;
84 90
85 // We don't have any physical representation yet. 91 // We don't have any physical representation yet.
86 PhysBody = new BulletBody(localID); 92 PhysBody = new BulletBody(localID);
87 PhysShape = new BulletShape(); 93 PhysShape = new BSShapeNull();
94
95 UserSetCenterOfMassDisplacement = null;
88 96
89 PrimAssetState = PrimAssetCondition.Unknown; 97 PrimAssetState = PrimAssetCondition.Unknown;
90 98
@@ -92,30 +100,41 @@ public abstract class BSPhysObject : PhysicsActor
92 SetMaterial((int)MaterialAttributes.Material.Wood); 100 SetMaterial((int)MaterialAttributes.Material.Wood);
93 101
94 CollisionCollection = new CollisionEventUpdate(); 102 CollisionCollection = new CollisionEventUpdate();
95 CollisionsLastTick = CollisionCollection; 103 CollisionsLastReported = CollisionCollection;
104 CollisionsLastTick = new CollisionEventUpdate();
105 CollisionsLastTickStep = -1;
106
96 SubscribedEventsMs = 0; 107 SubscribedEventsMs = 0;
97 CollidingStep = 0; 108 // Crazy values that will never be true
98 CollidingGroundStep = 0; 109 CollidingStep = BSScene.NotASimulationStep;
99 CollisionAccumulation = 0; 110 CollidingGroundStep = BSScene.NotASimulationStep;
111 CollisionAccumulation = BSScene.NotASimulationStep;
100 ColliderIsMoving = false; 112 ColliderIsMoving = false;
101 CollisionScore = 0; 113 CollisionScore = 0;
102 114
103 // All axis free. 115 // All axis free.
104 LockedAxis = LockedAxisFree; 116 LockedLinearAxis = LockedAxisFree;
117 LockedAngularAxis = LockedAxisFree;
105 } 118 }
106 119
107 // Tell the object to clean up. 120 // Tell the object to clean up.
108 public virtual void Destroy() 121 public virtual void Destroy()
109 { 122 {
110 UnRegisterAllPreStepActions(); 123 PhysicalActors.Enable(false);
111 UnRegisterAllPostStepActions(); 124 PhysScene.TaintedObject("BSPhysObject.Destroy", delegate()
125 {
126 PhysicalActors.Dispose();
127 });
112 } 128 }
113 129
114 public BSScene PhysicsScene { get; protected set; } 130 public BSScene PhysScene { get; protected set; }
115 // public override uint LocalID { get; set; } // Use the LocalID definition in PhysicsActor 131 // public override uint LocalID { get; set; } // Use the LocalID definition in PhysicsActor
116 public string PhysObjectName { get; protected set; } 132 public string PhysObjectName { get; protected set; }
117 public string TypeName { get; protected set; } 133 public string TypeName { get; protected set; }
118 134
135 // Set to 'true' when the object is completely initialized.
136 // This mostly prevents property updates and collisions until the object is completely here.
137 public bool IsInitialized { get; protected set; }
119 138
120 // Return the object mass without calculating it or having side effects 139 // Return the object mass without calculating it or having side effects
121 public abstract float RawMass { get; } 140 public abstract float RawMass { get; }
@@ -131,26 +150,19 @@ public abstract class BSPhysObject : PhysicsActor
131 // Reference to the physical body (btCollisionObject) of this object 150 // Reference to the physical body (btCollisionObject) of this object
132 public BulletBody PhysBody; 151 public BulletBody PhysBody;
133 // Reference to the physical shape (btCollisionShape) of this object 152 // Reference to the physical shape (btCollisionShape) of this object
134 public BulletShape PhysShape; 153 public BSShape PhysShape;
135 154
136 // The physical representation of the prim might require an asset fetch. 155 // The physical representation of the prim might require an asset fetch.
137 // The asset state is first 'Unknown' then 'Waiting' then either 'Failed' or 'Fetched'. 156 // The asset state is first 'Unknown' then 'Waiting' then either 'Failed' or 'Fetched'.
138 public enum PrimAssetCondition 157 public enum PrimAssetCondition
139 { 158 {
140 Unknown, Waiting, Failed, Fetched 159 Unknown, Waiting, FailedAssetFetch, FailedMeshing, Fetched
141 } 160 }
142 public PrimAssetCondition PrimAssetState { get; set; } 161 public PrimAssetCondition PrimAssetState { get; set; }
143 162
144 // The objects base shape information. Null if not a prim type shape. 163 // The objects base shape information. Null if not a prim type shape.
145 public PrimitiveBaseShape BaseShape { get; protected set; } 164 public PrimitiveBaseShape BaseShape { get; protected set; }
146 165
147 // Some types of objects have preferred physical representations.
148 // Returns SHAPE_UNKNOWN if there is no preference.
149 public virtual BSPhysicsShapeType PreferredPhysicalShape
150 {
151 get { return BSPhysicsShapeType.SHAPE_UNKNOWN; }
152 }
153
154 // When the physical properties are updated, an EntityProperty holds the update values. 166 // When the physical properties are updated, an EntityProperty holds the update values.
155 // Keep the current and last EntityProperties to enable computation of differences 167 // Keep the current and last EntityProperties to enable computation of differences
156 // between the current update and the previous values. 168 // between the current update and the previous values.
@@ -168,6 +180,7 @@ public abstract class BSPhysObject : PhysicsActor
168 public abstract bool IsSolid { get; } 180 public abstract bool IsSolid { get; }
169 public abstract bool IsStatic { get; } 181 public abstract bool IsStatic { get; }
170 public abstract bool IsSelected { get; } 182 public abstract bool IsSelected { get; }
183 public abstract bool IsVolumeDetect { get; }
171 184
172 // Materialness 185 // Materialness
173 public MaterialAttributes.Material Material { get; private set; } 186 public MaterialAttributes.Material Material { get; private set; }
@@ -176,11 +189,25 @@ public abstract class BSPhysObject : PhysicsActor
176 Material = (MaterialAttributes.Material)material; 189 Material = (MaterialAttributes.Material)material;
177 190
178 // Setting the material sets the material attributes also. 191 // Setting the material sets the material attributes also.
192 // TODO: decide if this is necessary -- the simulator does this.
179 MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, false); 193 MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, false);
180 Friction = matAttrib.friction; 194 Friction = matAttrib.friction;
181 Restitution = matAttrib.restitution; 195 Restitution = matAttrib.restitution;
182 Density = matAttrib.density / BSParam.DensityScaleFactor; 196 Density = matAttrib.density;
183 DetailLog("{0},{1}.SetMaterial,Mat={2},frict={3},rest={4},den={5}", LocalID, TypeName, Material, Friction, Restitution, Density); 197 // DetailLog("{0},{1}.SetMaterial,Mat={2},frict={3},rest={4},den={5}", LocalID, TypeName, Material, Friction, Restitution, Density);
198 }
199
200 public override float Density
201 {
202 get
203 {
204 return base.Density;
205 }
206 set
207 {
208 DetailLog("{0},BSPhysObject.Density,set,den={1}", LocalID, value);
209 base.Density = value;
210 }
184 } 211 }
185 212
186 // Stop all physical motion. 213 // Stop all physical motion.
@@ -190,21 +217,55 @@ public abstract class BSPhysObject : PhysicsActor
190 // Update the physical location and motion of the object. Called with data from Bullet. 217 // Update the physical location and motion of the object. Called with data from Bullet.
191 public abstract void UpdateProperties(EntityProperties entprop); 218 public abstract void UpdateProperties(EntityProperties entprop);
192 219
193 public abstract OMV.Vector3 RawPosition { get; set; } 220 public virtual OMV.Vector3 RawPosition { get; set; }
194 public abstract OMV.Vector3 ForcePosition { get; set; } 221 public abstract OMV.Vector3 ForcePosition { get; set; }
195 222
196 public abstract OMV.Quaternion RawOrientation { get; set; } 223 public virtual OMV.Quaternion RawOrientation { get; set; }
197 public abstract OMV.Quaternion ForceOrientation { get; set; } 224 public abstract OMV.Quaternion ForceOrientation { get; set; }
198 225
199 public abstract OMV.Vector3 RawVelocity { get; set; } 226 public OMV.Vector3 RawVelocity { get; set; }
200 public abstract OMV.Vector3 ForceVelocity { get; set; } 227 public abstract OMV.Vector3 ForceVelocity { get; set; }
201 228
229 public OMV.Vector3 RawForce { get; set; }
230 public OMV.Vector3 RawTorque { get; set; }
231 public override void AddAngularForce(OMV.Vector3 force, bool pushforce)
232 {
233 AddAngularForce(force, pushforce, false);
234 }
235 public abstract void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime);
236 public abstract void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime);
237
202 public abstract OMV.Vector3 ForceRotationalVelocity { get; set; } 238 public abstract OMV.Vector3 ForceRotationalVelocity { get; set; }
203 239
204 public abstract float ForceBuoyancy { get; set; } 240 public abstract float ForceBuoyancy { get; set; }
205 241
206 public virtual bool ForceBodyShapeRebuild(bool inTaintTime) { return false; } 242 public virtual bool ForceBodyShapeRebuild(bool inTaintTime) { return false; }
207 243
244 public override bool PIDActive { set { MoveToTargetActive = value; } }
245 public override OMV.Vector3 PIDTarget { set { MoveToTargetTarget = value; } }
246 public override float PIDTau { set { MoveToTargetTau = value; } }
247
248 public bool MoveToTargetActive { get; set; }
249 public OMV.Vector3 MoveToTargetTarget { get; set; }
250 public float MoveToTargetTau { get; set; }
251
252 // Used for llSetHoverHeight and maybe vehicle height. Hover Height will override MoveTo target's Z
253 public override bool PIDHoverActive { set { HoverActive = value; } }
254 public override float PIDHoverHeight { set { HoverHeight = value; } }
255 public override PIDHoverType PIDHoverType { set { HoverType = value; } }
256 public override float PIDHoverTau { set { HoverTau = value; } }
257
258 public bool HoverActive { get; set; }
259 public float HoverHeight { get; set; }
260 public PIDHoverType HoverType { get; set; }
261 public float HoverTau { get; set; }
262
263 // For RotLookAt
264 public override OMV.Quaternion APIDTarget { set { return; } }
265 public override bool APIDActive { set { return; } }
266 public override float APIDStrength { set { return; } }
267 public override float APIDDamping { set { return; } }
268
208 // The current velocity forward 269 // The current velocity forward
209 public virtual float ForwardSpeed 270 public virtual float ForwardSpeed
210 { 271 {
@@ -226,10 +287,58 @@ public abstract class BSPhysObject : PhysicsActor
226 287
227 // The user can optionally set the center of mass. The user's setting will override any 288 // The user can optionally set the center of mass. The user's setting will override any
228 // computed center-of-mass (like in linksets). 289 // computed center-of-mass (like in linksets).
229 public OMV.Vector3? UserSetCenterOfMass { get; set; } 290 // Note this is a displacement from the root's coordinates. Zero means use the root prim as center-of-mass.
291 public OMV.Vector3? UserSetCenterOfMassDisplacement { get; set; }
292
293 public OMV.Vector3 LockedLinearAxis { get; set; } // zero means locked. one means free.
294 public OMV.Vector3 LockedAngularAxis { get; set; } // zero means locked. one means free.
295 public const float FreeAxis = 1f;
296 public readonly OMV.Vector3 LockedAxisFree = new OMV.Vector3(FreeAxis, FreeAxis, FreeAxis); // All axis are free
297
298 // Enable physical actions. Bullet will keep sleeping non-moving physical objects so
299 // they need waking up when parameters are changed.
300 // Called in taint-time!!
301 public void ActivateIfPhysical(bool forceIt)
302 {
303 if (IsPhysical && PhysBody.HasPhysicalBody)
304 PhysScene.PE.Activate(PhysBody, forceIt);
305 }
230 306
231 public OMV.Vector3 LockedAxis { get; set; } // zero means locked. one means free. 307 // 'actors' act on the physical object to change or constrain its motion. These can range from
232 public readonly OMV.Vector3 LockedAxisFree = new OMV.Vector3(1f, 1f, 1f); // All axis are free 308 // hovering to complex vehicle motion.
309 // May be called at non-taint time as this just adds the actor to the action list and the real
310 // work is done during the simulation step.
311 // Note that, if the actor is already in the list and we are disabling same, the actor is just left
312 // in the list disabled.
313 public delegate BSActor CreateActor();
314 public void EnableActor(bool enableActor, string actorName, CreateActor creator)
315 {
316 lock (PhysicalActors)
317 {
318 BSActor theActor;
319 if (PhysicalActors.TryGetActor(actorName, out theActor))
320 {
321 // The actor already exists so just turn it on or off
322 DetailLog("{0},BSPhysObject.EnableActor,enablingExistingActor,name={1},enable={2}", LocalID, actorName, enableActor);
323 theActor.Enabled = enableActor;
324 }
325 else
326 {
327 // The actor does not exist. If it should, create it.
328 if (enableActor)
329 {
330 DetailLog("{0},BSPhysObject.EnableActor,creatingActor,name={1}", LocalID, actorName);
331 theActor = creator();
332 PhysicalActors.Add(actorName, theActor);
333 theActor.Enabled = true;
334 }
335 else
336 {
337 DetailLog("{0},BSPhysObject.EnableActor,notCreatingActorSinceNotEnabled,name={1}", LocalID, actorName);
338 }
339 }
340 }
341 }
233 342
234 #region Collisions 343 #region Collisions
235 344
@@ -247,70 +356,98 @@ public abstract class BSPhysObject : PhysicsActor
247 protected CollisionFlags CurrentCollisionFlags { get; set; } 356 protected CollisionFlags CurrentCollisionFlags { get; set; }
248 // On a collision, check the collider and remember if the last collider was moving 357 // On a collision, check the collider and remember if the last collider was moving
249 // Used to modify the standing of avatars (avatars on stationary things stand still) 358 // Used to modify the standing of avatars (avatars on stationary things stand still)
250 protected bool ColliderIsMoving; 359 public bool ColliderIsMoving;
360 // 'true' if the last collider was a volume detect object
361 public bool ColliderIsVolumeDetect;
362 // Used by BSCharacter to manage standing (and not slipping)
363 public bool IsStationary;
251 364
252 // Count of collisions for this object 365 // Count of collisions for this object
253 protected long CollisionAccumulation { get; set; } 366 protected long CollisionAccumulation { get; set; }
254 367
255 public override bool IsColliding { 368 public override bool IsColliding {
256 get { return (CollidingStep == PhysicsScene.SimulationStep); } 369 get { return (CollidingStep == PhysScene.SimulationStep); }
257 set { 370 set {
258 if (value) 371 if (value)
259 CollidingStep = PhysicsScene.SimulationStep; 372 CollidingStep = PhysScene.SimulationStep;
260 else 373 else
261 CollidingStep = 0; 374 CollidingStep = BSScene.NotASimulationStep;
262 } 375 }
263 } 376 }
377 // Complex objects (like linksets) need to know if there is a collision on any part of
378 // their shape. 'IsColliding' has an existing definition of reporting a collision on
379 // only this specific prim or component of linksets.
380 // 'HasSomeCollision' is defined as reporting if there is a collision on any part of
381 // the complex body that this prim is the root of.
382 public virtual bool HasSomeCollision
383 {
384 get { return IsColliding; }
385 set { IsColliding = value; }
386 }
264 public override bool CollidingGround { 387 public override bool CollidingGround {
265 get { return (CollidingGroundStep == PhysicsScene.SimulationStep); } 388 get { return (CollidingGroundStep == PhysScene.SimulationStep); }
266 set 389 set
267 { 390 {
268 if (value) 391 if (value)
269 CollidingGroundStep = PhysicsScene.SimulationStep; 392 CollidingGroundStep = PhysScene.SimulationStep;
270 else 393 else
271 CollidingGroundStep = 0; 394 CollidingGroundStep = BSScene.NotASimulationStep;
272 } 395 }
273 } 396 }
274 public override bool CollidingObj { 397 public override bool CollidingObj {
275 get { return (CollidingObjectStep == PhysicsScene.SimulationStep); } 398 get { return (CollidingObjectStep == PhysScene.SimulationStep); }
276 set { 399 set {
277 if (value) 400 if (value)
278 CollidingObjectStep = PhysicsScene.SimulationStep; 401 CollidingObjectStep = PhysScene.SimulationStep;
279 else 402 else
280 CollidingObjectStep = 0; 403 CollidingObjectStep = BSScene.NotASimulationStep;
281 } 404 }
282 } 405 }
283 406
284 // The collisions that have been collected this tick 407 // The collisions that have been collected for the next collision reporting (throttled by subscription)
285 protected CollisionEventUpdate CollisionCollection; 408 protected CollisionEventUpdate CollisionCollection;
286 // Remember collisions from last tick for fancy collision based actions 409 // This is the collision collection last reported to the Simulator.
410 public CollisionEventUpdate CollisionsLastReported;
411 // Remember the collisions recorded in the last tick for fancy collision checking
287 // (like a BSCharacter walking up stairs). 412 // (like a BSCharacter walking up stairs).
288 protected CollisionEventUpdate CollisionsLastTick; 413 public CollisionEventUpdate CollisionsLastTick;
414 private long CollisionsLastTickStep = -1;
289 415
290 // The simulation step is telling this object about a collision. 416 // The simulation step is telling this object about a collision.
291 // Return 'true' if a collision was processed and should be sent up. 417 // Return 'true' if a collision was processed and should be sent up.
292 // Return 'false' if this object is not enabled/subscribed/appropriate for or has already seen this collision. 418 // Return 'false' if this object is not enabled/subscribed/appropriate for or has already seen this collision.
293 // Called at taint time from within the Step() function 419 // Called at taint time from within the Step() function
420 public delegate bool CollideCall(uint collidingWith, BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth);
294 public virtual bool Collide(uint collidingWith, BSPhysObject collidee, 421 public virtual bool Collide(uint collidingWith, BSPhysObject collidee,
295 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) 422 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
296 { 423 {
297 bool ret = false; 424 bool ret = false;
298 425
299 // The following lines make IsColliding(), CollidingGround() and CollidingObj work 426 // The following lines make IsColliding(), CollidingGround() and CollidingObj work
300 CollidingStep = PhysicsScene.SimulationStep; 427 CollidingStep = PhysScene.SimulationStep;
301 if (collidingWith <= PhysicsScene.TerrainManager.HighestTerrainID) 428 if (collidingWith <= PhysScene.TerrainManager.HighestTerrainID)
302 { 429 {
303 CollidingGroundStep = PhysicsScene.SimulationStep; 430 CollidingGroundStep = PhysScene.SimulationStep;
304 } 431 }
305 else 432 else
306 { 433 {
307 CollidingObjectStep = PhysicsScene.SimulationStep; 434 CollidingObjectStep = PhysScene.SimulationStep;
308 } 435 }
309 436
310 CollisionAccumulation++; 437 CollisionAccumulation++;
311 438
312 // For movement tests, remember if we are colliding with an object that is moving. 439 // For movement tests, remember if we are colliding with an object that is moving.
313 ColliderIsMoving = collidee != null ? (collidee.RawVelocity != OMV.Vector3.Zero) : false; 440 ColliderIsMoving = collidee != null ? (collidee.RawVelocity != OMV.Vector3.Zero) : false;
441 ColliderIsVolumeDetect = collidee != null ? (collidee.IsVolumeDetect) : false;
442
443 // Make a collection of the collisions that happened the last simulation tick.
444 // This is different than the collection created for sending up to the simulator as it is cleared every tick.
445 if (CollisionsLastTickStep != PhysScene.SimulationStep)
446 {
447 CollisionsLastTick = new CollisionEventUpdate();
448 CollisionsLastTickStep = PhysScene.SimulationStep;
449 }
450 CollisionsLastTick.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
314 451
315 // If someone has subscribed for collision events log the collision so it will be reported up 452 // If someone has subscribed for collision events log the collision so it will be reported up
316 if (SubscribedEvents()) { 453 if (SubscribedEvents()) {
@@ -332,12 +469,12 @@ public abstract class BSPhysObject : PhysicsActor
332 bool ret = true; 469 bool ret = true;
333 470
334 // If the 'no collision' call, force it to happen right now so quick collision_end 471 // If the 'no collision' call, force it to happen right now so quick collision_end
335 bool force = (CollisionCollection.Count == 0 && CollisionsLastTick.Count != 0); 472 bool force = (CollisionCollection.Count == 0 && CollisionsLastReported.Count != 0);
336 473
337 // throttle the collisions to the number of milliseconds specified in the subscription 474 // throttle the collisions to the number of milliseconds specified in the subscription
338 if (force || (PhysicsScene.SimulationNowTime >= NextCollisionOkTime)) 475 if (force || (PhysScene.SimulationNowTime >= NextCollisionOkTime))
339 { 476 {
340 NextCollisionOkTime = PhysicsScene.SimulationNowTime + SubscribedEventsMs; 477 NextCollisionOkTime = PhysScene.SimulationNowTime + SubscribedEventsMs;
341 478
342 // We are called if we previously had collisions. If there are no collisions 479 // We are called if we previously had collisions. If there are no collisions
343 // this time, send up one last empty event so OpenSim can sense collision end. 480 // this time, send up one last empty event so OpenSim can sense collision end.
@@ -351,11 +488,11 @@ public abstract class BSPhysObject : PhysicsActor
351 base.SendCollisionUpdate(CollisionCollection); 488 base.SendCollisionUpdate(CollisionCollection);
352 489
353 // Remember the collisions from this tick for some collision specific processing. 490 // Remember the collisions from this tick for some collision specific processing.
354 CollisionsLastTick = CollisionCollection; 491 CollisionsLastReported = CollisionCollection;
355 492
356 // The CollisionCollection instance is passed around in the simulator. 493 // The CollisionCollection instance is passed around in the simulator.
357 // Make sure we don't have a handle to that one and that a new one is used for next time. 494 // Make sure we don't have a handle to that one and that a new one is used for next time.
358 // This fixes an interesting 'gotcha'. If we call CollisionCollection.Clear() here, 495 // This fixes an interesting 'gotcha'. If we call CollisionCollection.Clear() here,
359 // a race condition is created for the other users of this instance. 496 // a race condition is created for the other users of this instance.
360 CollisionCollection = new CollisionEventUpdate(); 497 CollisionCollection = new CollisionEventUpdate();
361 } 498 }
@@ -372,10 +509,10 @@ public abstract class BSPhysObject : PhysicsActor
372 // make sure first collision happens 509 // make sure first collision happens
373 NextCollisionOkTime = Util.EnvironmentTickCountSubtract(SubscribedEventsMs); 510 NextCollisionOkTime = Util.EnvironmentTickCountSubtract(SubscribedEventsMs);
374 511
375 PhysicsScene.TaintedObject(TypeName+".SubscribeEvents", delegate() 512 PhysScene.TaintedObject(TypeName+".SubscribeEvents", delegate()
376 { 513 {
377 if (PhysBody.HasPhysicalBody) 514 if (PhysBody.HasPhysicalBody)
378 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 515 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
379 }); 516 });
380 } 517 }
381 else 518 else
@@ -387,11 +524,11 @@ public abstract class BSPhysObject : PhysicsActor
387 public override void UnSubscribeEvents() { 524 public override void UnSubscribeEvents() {
388 // DetailLog("{0},{1}.UnSubscribeEvents,unsubscribing", LocalID, TypeName); 525 // DetailLog("{0},{1}.UnSubscribeEvents,unsubscribing", LocalID, TypeName);
389 SubscribedEventsMs = 0; 526 SubscribedEventsMs = 0;
390 PhysicsScene.TaintedObject(TypeName+".UnSubscribeEvents", delegate() 527 PhysScene.TaintedObject(TypeName+".UnSubscribeEvents", delegate()
391 { 528 {
392 // Make sure there is a body there because sometimes destruction happens in an un-ideal order. 529 // Make sure there is a body there because sometimes destruction happens in an un-ideal order.
393 if (PhysBody.HasPhysicalBody) 530 if (PhysBody.HasPhysicalBody)
394 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 531 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
395 }); 532 });
396 } 533 }
397 // Return 'true' if the simulator wants collision events 534 // Return 'true' if the simulator wants collision events
@@ -405,7 +542,7 @@ public abstract class BSPhysObject : PhysicsActor
405 { 542 {
406 // Scale the collision count by the time since the last collision. 543 // Scale the collision count by the time since the last collision.
407 // The "+1" prevents dividing by zero. 544 // The "+1" prevents dividing by zero.
408 long timeAgo = PhysicsScene.SimulationStep - CollidingStep + 1; 545 long timeAgo = PhysScene.SimulationStep - CollidingStep + 1;
409 CollisionScore = CollisionAccumulation / timeAgo; 546 CollisionScore = CollisionAccumulation / timeAgo;
410 } 547 }
411 public override float CollisionScore { get; set; } 548 public override float CollisionScore { get; set; }
@@ -413,103 +550,8 @@ public abstract class BSPhysObject : PhysicsActor
413 #endregion // Collisions 550 #endregion // Collisions
414 551
415 #region Per Simulation Step actions 552 #region Per Simulation Step actions
416 // There are some actions that must be performed for a physical object before each simulation step.
417 // These actions are optional so, rather than scanning all the physical objects and asking them
418 // if they have anything to do, a physical object registers for an event call before the step is performed.
419 // This bookkeeping makes it easy to add, remove and clean up after all these registrations.
420 private Dictionary<string, BSScene.PreStepAction> RegisteredPrestepActions = new Dictionary<string, BSScene.PreStepAction>();
421 private Dictionary<string, BSScene.PostStepAction> RegisteredPoststepActions = new Dictionary<string, BSScene.PostStepAction>();
422 protected void RegisterPreStepAction(string op, uint id, BSScene.PreStepAction actn)
423 {
424 string identifier = op + "-" + id.ToString();
425
426 lock (RegisteredPrestepActions)
427 {
428 // Clean out any existing action
429 UnRegisterPreStepAction(op, id);
430 RegisteredPrestepActions[identifier] = actn;
431 PhysicsScene.BeforeStep += actn;
432 }
433 DetailLog("{0},BSPhysObject.RegisterPreStepAction,id={1}", LocalID, identifier);
434 }
435 553
436 // Unregister a pre step action. Safe to call if the action has not been registered. 554 public BSActorCollection PhysicalActors;
437 // Returns 'true' if an action was actually removed
438 protected bool UnRegisterPreStepAction(string op, uint id)
439 {
440 string identifier = op + "-" + id.ToString();
441 bool removed = false;
442 lock (RegisteredPrestepActions)
443 {
444 if (RegisteredPrestepActions.ContainsKey(identifier))
445 {
446 PhysicsScene.BeforeStep -= RegisteredPrestepActions[identifier];
447 RegisteredPrestepActions.Remove(identifier);
448 removed = true;
449 }
450 }
451 DetailLog("{0},BSPhysObject.UnRegisterPreStepAction,id={1},removed={2}", LocalID, identifier, removed);
452 return removed;
453 }
454
455 protected void UnRegisterAllPreStepActions()
456 {
457 lock (RegisteredPrestepActions)
458 {
459 foreach (KeyValuePair<string, BSScene.PreStepAction> kvp in RegisteredPrestepActions)
460 {
461 PhysicsScene.BeforeStep -= kvp.Value;
462 }
463 RegisteredPrestepActions.Clear();
464 }
465 DetailLog("{0},BSPhysObject.UnRegisterAllPreStepActions,", LocalID);
466 }
467
468 protected void RegisterPostStepAction(string op, uint id, BSScene.PostStepAction actn)
469 {
470 string identifier = op + "-" + id.ToString();
471
472 lock (RegisteredPoststepActions)
473 {
474 // Clean out any existing action
475 UnRegisterPostStepAction(op, id);
476 RegisteredPoststepActions[identifier] = actn;
477 PhysicsScene.AfterStep += actn;
478 }
479 DetailLog("{0},BSPhysObject.RegisterPostStepAction,id={1}", LocalID, identifier);
480 }
481
482 // Unregister a pre step action. Safe to call if the action has not been registered.
483 // Returns 'true' if an action was actually removed.
484 protected bool UnRegisterPostStepAction(string op, uint id)
485 {
486 string identifier = op + "-" + id.ToString();
487 bool removed = false;
488 lock (RegisteredPoststepActions)
489 {
490 if (RegisteredPoststepActions.ContainsKey(identifier))
491 {
492 PhysicsScene.AfterStep -= RegisteredPoststepActions[identifier];
493 RegisteredPoststepActions.Remove(identifier);
494 removed = true;
495 }
496 }
497 DetailLog("{0},BSPhysObject.UnRegisterPostStepAction,id={1},removed={2}", LocalID, identifier, removed);
498 return removed;
499 }
500
501 protected void UnRegisterAllPostStepActions()
502 {
503 lock (RegisteredPoststepActions)
504 {
505 foreach (KeyValuePair<string, BSScene.PostStepAction> kvp in RegisteredPoststepActions)
506 {
507 PhysicsScene.AfterStep -= kvp.Value;
508 }
509 RegisteredPoststepActions.Clear();
510 }
511 DetailLog("{0},BSPhysObject.UnRegisterAllPostStepActions,", LocalID);
512 }
513 555
514 // When an update to the physical properties happens, this event is fired to let 556 // When an update to the physical properties happens, this event is fired to let
515 // different actors to modify the update before it is passed around 557 // different actors to modify the update before it is passed around
@@ -522,53 +564,13 @@ public abstract class BSPhysObject : PhysicsActor
522 actions(ref entprop); 564 actions(ref entprop);
523 } 565 }
524 566
525 private Dictionary<string, PreUpdatePropertyAction> RegisteredPreUpdatePropertyActions = new Dictionary<string, PreUpdatePropertyAction>();
526 public void RegisterPreUpdatePropertyAction(string identifier, PreUpdatePropertyAction actn)
527 {
528 lock (RegisteredPreUpdatePropertyActions)
529 {
530 // Clean out any existing action
531 UnRegisterPreUpdatePropertyAction(identifier);
532 RegisteredPreUpdatePropertyActions[identifier] = actn;
533 OnPreUpdateProperty += actn;
534 }
535 DetailLog("{0},BSPhysObject.RegisterPreUpdatePropertyAction,id={1}", LocalID, identifier);
536 }
537 public bool UnRegisterPreUpdatePropertyAction(string identifier)
538 {
539 bool removed = false;
540 lock (RegisteredPreUpdatePropertyActions)
541 {
542 if (RegisteredPreUpdatePropertyActions.ContainsKey(identifier))
543 {
544 OnPreUpdateProperty -= RegisteredPreUpdatePropertyActions[identifier];
545 RegisteredPreUpdatePropertyActions.Remove(identifier);
546 removed = true;
547 }
548 }
549 DetailLog("{0},BSPhysObject.UnRegisterPreUpdatePropertyAction,id={1},removed={2}", LocalID, identifier, removed);
550 return removed;
551 }
552 public void UnRegisterAllPreUpdatePropertyActions()
553 {
554 lock (RegisteredPreUpdatePropertyActions)
555 {
556 foreach (KeyValuePair<string, PreUpdatePropertyAction> kvp in RegisteredPreUpdatePropertyActions)
557 {
558 OnPreUpdateProperty -= kvp.Value;
559 }
560 RegisteredPreUpdatePropertyActions.Clear();
561 }
562 DetailLog("{0},BSPhysObject.UnRegisterAllPreUpdatePropertyAction,", LocalID);
563 }
564
565 #endregion // Per Simulation Step actions 567 #endregion // Per Simulation Step actions
566 568
567 // High performance detailed logging routine used by the physical objects. 569 // High performance detailed logging routine used by the physical objects.
568 protected void DetailLog(string msg, params Object[] args) 570 protected void DetailLog(string msg, params Object[] args)
569 { 571 {
570 if (PhysicsScene.PhysicsLogging.Enabled) 572 if (PhysScene.PhysicsLogging.Enabled)
571 PhysicsScene.DetailLog(msg, args); 573 PhysScene.DetailLog(msg, args);
572 } 574 }
573 575
574} 576}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 6a5461a..d5b999d 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -51,15 +51,8 @@ public class BSPrim : BSPhysObject
51 private bool _isSelected; 51 private bool _isSelected;
52 private bool _isVolumeDetect; 52 private bool _isVolumeDetect;
53 53
54 // _position is what the simulator thinks the positions of the prim is.
55 private OMV.Vector3 _position;
56
57 private float _mass; // the mass of this object 54 private float _mass; // the mass of this object
58 private OMV.Vector3 _force;
59 private OMV.Vector3 _velocity;
60 private OMV.Vector3 _torque;
61 private OMV.Vector3 _acceleration; 55 private OMV.Vector3 _acceleration;
62 private OMV.Quaternion _orientation;
63 private int _physicsActorType; 56 private int _physicsActorType;
64 private bool _isPhysical; 57 private bool _isPhysical;
65 private bool _flying; 58 private bool _flying;
@@ -72,16 +65,18 @@ public class BSPrim : BSPhysObject
72 65
73 private int CrossingFailures { get; set; } 66 private int CrossingFailures { get; set; }
74 67
75 public BSDynamics VehicleController { get; private set; } 68 // Keep a handle to the vehicle actor so it is easy to set parameters on same.
76 69 public const string VehicleActorName = "BasicVehicle";
77 private BSVMotor _targetMotor;
78 private OMV.Vector3 _PIDTarget;
79 private float _PIDTau;
80 70
81 private BSFMotor _hoverMotor; 71 // Parameters for the hover actor
82 private float _PIDHoverHeight; 72 public const string HoverActorName = "BSPrim.HoverActor";
83 private PIDHoverType _PIDHoverType; 73 // Parameters for the axis lock actor
84 private float _PIDHoverTau; 74 public const String LockedAxisActorName = "BSPrim.LockedAxis";
75 // Parameters for the move to target actor
76 public const string MoveToTargetActorName = "BSPrim.MoveToTargetActor";
77 // Parameters for the setForce and setTorque actors
78 public const string SetForceActorName = "BSPrim.SetForceActor";
79 public const string SetTorqueActorName = "BSPrim.SetTorqueActor";
85 80
86 public BSPrim(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, 81 public BSPrim(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
87 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 82 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
@@ -89,31 +84,34 @@ public class BSPrim : BSPhysObject
89 { 84 {
90 // m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID); 85 // m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID);
91 _physicsActorType = (int)ActorTypes.Prim; 86 _physicsActorType = (int)ActorTypes.Prim;
92 _position = pos; 87 RawPosition = pos;
93 _size = size; 88 _size = size;
94 Scale = size; // prims are the size the user wants them to be (different for BSCharactes). 89 Scale = size; // prims are the size the user wants them to be (different for BSCharactes).
95 _orientation = rotation; 90 RawOrientation = rotation;
96 _buoyancy = 0f; 91 _buoyancy = 0f;
97 _velocity = OMV.Vector3.Zero; 92 RawVelocity = OMV.Vector3.Zero;
98 _rotationalVelocity = OMV.Vector3.Zero; 93 _rotationalVelocity = OMV.Vector3.Zero;
99 BaseShape = pbs; 94 BaseShape = pbs;
100 _isPhysical = pisPhysical; 95 _isPhysical = pisPhysical;
101 _isVolumeDetect = false; 96 _isVolumeDetect = false;
102 97
103 VehicleController = new BSDynamics(PhysicsScene, this); // add vehicleness 98 // Add a dynamic vehicle to our set of actors that can move this prim.
99 // PhysicalActors.Add(VehicleActorName, new BSDynamics(PhysScene, this, VehicleActorName));
104 100
105 _mass = CalculateMass(); 101 _mass = CalculateMass();
106 102
107 DetailLog("{0},BSPrim.constructor,call", LocalID); 103 // DetailLog("{0},BSPrim.constructor,call", LocalID);
108 // do the actual object creation at taint time 104 // do the actual object creation at taint time
109 PhysicsScene.TaintedObject("BSPrim.create", delegate() 105 PhysScene.TaintedObject("BSPrim.create", delegate()
110 { 106 {
111 // Make sure the object is being created with some sanity. 107 // Make sure the object is being created with some sanity.
112 ExtremeSanityCheck(true /* inTaintTime */); 108 ExtremeSanityCheck(true /* inTaintTime */);
113 109
114 CreateGeomAndObject(true); 110 CreateGeomAndObject(true);
115 111
116 CurrentCollisionFlags = PhysicsScene.PE.GetCollisionFlags(PhysBody); 112 CurrentCollisionFlags = PhysScene.PE.GetCollisionFlags(PhysBody);
113
114 IsInitialized = true;
117 }); 115 });
118 } 116 }
119 117
@@ -121,19 +119,21 @@ public class BSPrim : BSPhysObject
121 public override void Destroy() 119 public override void Destroy()
122 { 120 {
123 // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID); 121 // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID);
122 IsInitialized = false;
123
124 base.Destroy(); 124 base.Destroy();
125 125
126 // Undo any vehicle properties 126 // Undo any vehicle properties
127 this.VehicleType = (int)Vehicle.TYPE_NONE; 127 this.VehicleType = (int)Vehicle.TYPE_NONE;
128 128
129 PhysicsScene.TaintedObject("BSPrim.destroy", delegate() 129 PhysScene.TaintedObject("BSPrim.Destroy", delegate()
130 { 130 {
131 DetailLog("{0},BSPrim.Destroy,taint,", LocalID); 131 DetailLog("{0},BSPrim.Destroy,taint,", LocalID);
132 // If there are physical body and shape, release my use of same. 132 // If there are physical body and shape, release my use of same.
133 PhysicsScene.Shapes.DereferenceBody(PhysBody, null); 133 PhysScene.Shapes.DereferenceBody(PhysBody, null);
134 PhysBody.Clear(); 134 PhysBody.Clear();
135 PhysicsScene.Shapes.DereferenceShape(PhysShape, null); 135 PhysShape.Dereference(PhysScene);
136 PhysShape.Clear(); 136 PhysShape = new BSShapeNull();
137 }); 137 });
138 } 138 }
139 139
@@ -159,25 +159,13 @@ public class BSPrim : BSPhysObject
159 ForceBodyShapeRebuild(false); 159 ForceBodyShapeRebuild(false);
160 } 160 }
161 } 161 }
162 // 'unknown' says to choose the best type
163 public override BSPhysicsShapeType PreferredPhysicalShape
164 { get { return BSPhysicsShapeType.SHAPE_UNKNOWN; } }
165
166 public override bool ForceBodyShapeRebuild(bool inTaintTime) 162 public override bool ForceBodyShapeRebuild(bool inTaintTime)
167 { 163 {
168 if (inTaintTime) 164 PhysScene.TaintedObject(inTaintTime, "BSPrim.ForceBodyShapeRebuild", delegate()
169 { 165 {
170 _mass = CalculateMass(); // changing the shape changes the mass 166 _mass = CalculateMass(); // changing the shape changes the mass
171 CreateGeomAndObject(true); 167 CreateGeomAndObject(true);
172 } 168 });
173 else
174 {
175 PhysicsScene.TaintedObject("BSPrim.ForceBodyShapeRebuild", delegate()
176 {
177 _mass = CalculateMass(); // changing the shape changes the mass
178 CreateGeomAndObject(true);
179 });
180 }
181 return true; 169 return true;
182 } 170 }
183 public override bool Grabbed { 171 public override bool Grabbed {
@@ -190,7 +178,7 @@ public class BSPrim : BSPhysObject
190 if (value != _isSelected) 178 if (value != _isSelected)
191 { 179 {
192 _isSelected = value; 180 _isSelected = value;
193 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() 181 PhysScene.TaintedObject("BSPrim.setSelected", delegate()
194 { 182 {
195 DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); 183 DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected);
196 SetObjectDynamic(false); 184 SetObjectDynamic(false);
@@ -231,165 +219,93 @@ public class BSPrim : BSPhysObject
231 // Called at taint time! 219 // Called at taint time!
232 public override void ZeroMotion(bool inTaintTime) 220 public override void ZeroMotion(bool inTaintTime)
233 { 221 {
234 _velocity = OMV.Vector3.Zero; 222 RawVelocity = OMV.Vector3.Zero;
235 _acceleration = OMV.Vector3.Zero; 223 _acceleration = OMV.Vector3.Zero;
236 _rotationalVelocity = OMV.Vector3.Zero; 224 _rotationalVelocity = OMV.Vector3.Zero;
237 225
238 // Zero some other properties in the physics engine 226 // Zero some other properties in the physics engine
239 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate() 227 PhysScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate()
240 { 228 {
241 if (PhysBody.HasPhysicalBody) 229 if (PhysBody.HasPhysicalBody)
242 PhysicsScene.PE.ClearAllForces(PhysBody); 230 PhysScene.PE.ClearAllForces(PhysBody);
243 }); 231 });
244 } 232 }
245 public override void ZeroAngularMotion(bool inTaintTime) 233 public override void ZeroAngularMotion(bool inTaintTime)
246 { 234 {
247 _rotationalVelocity = OMV.Vector3.Zero; 235 _rotationalVelocity = OMV.Vector3.Zero;
248 // Zero some other properties in the physics engine 236 // Zero some other properties in the physics engine
249 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate() 237 PhysScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate()
250 { 238 {
251 // DetailLog("{0},BSPrim.ZeroAngularMotion,call,rotVel={1}", LocalID, _rotationalVelocity); 239 // DetailLog("{0},BSPrim.ZeroAngularMotion,call,rotVel={1}", LocalID, _rotationalVelocity);
252 if (PhysBody.HasPhysicalBody) 240 if (PhysBody.HasPhysicalBody)
253 { 241 {
254 PhysicsScene.PE.SetInterpolationAngularVelocity(PhysBody, _rotationalVelocity); 242 PhysScene.PE.SetInterpolationAngularVelocity(PhysBody, _rotationalVelocity);
255 PhysicsScene.PE.SetAngularVelocity(PhysBody, _rotationalVelocity); 243 PhysScene.PE.SetAngularVelocity(PhysBody, _rotationalVelocity);
256 } 244 }
257 }); 245 });
258 } 246 }
259 247
260 bool TryExperimentalLockAxisCode = false;
261 BSConstraint LockAxisConstraint = null;
262 public override void LockAngularMotion(OMV.Vector3 axis) 248 public override void LockAngularMotion(OMV.Vector3 axis)
263 { 249 {
264 DetailLog("{0},BSPrim.LockAngularMotion,call,axis={1}", LocalID, axis); 250 DetailLog("{0},BSPrim.LockAngularMotion,call,axis={1}", LocalID, axis);
265 251
266 // "1" means free, "0" means locked 252 // "1" means free, "0" means locked
267 OMV.Vector3 locking = new OMV.Vector3(1f, 1f, 1f); 253 OMV.Vector3 locking = LockedAxisFree;
268 if (axis.X != 1) locking.X = 0f; 254 if (axis.X != 1) locking.X = 0f;
269 if (axis.Y != 1) locking.Y = 0f; 255 if (axis.Y != 1) locking.Y = 0f;
270 if (axis.Z != 1) locking.Z = 0f; 256 if (axis.Z != 1) locking.Z = 0f;
271 LockedAxis = locking; 257 LockedAngularAxis = locking;
272 258
273 if (TryExperimentalLockAxisCode && LockedAxis != LockedAxisFree) 259 EnableActor(LockedAngularAxis != LockedAxisFree, LockedAxisActorName, delegate()
274 { 260 {
275 // Lock that axis by creating a 6DOF constraint that has one end in the world and 261 return new BSActorLockAxis(PhysScene, this, LockedAxisActorName);
276 // the other in the object. 262 });
277 // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817
278 // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380
279
280 PhysicsScene.TaintedObject("BSPrim.LockAngularMotion", delegate()
281 {
282 CleanUpLockAxisPhysicals(true /* inTaintTime */);
283
284 BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(PhysicsScene.World, PhysBody,
285 OMV.Vector3.Zero, OMV.Quaternion.Inverse(RawOrientation),
286 true /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
287 LockAxisConstraint = axisConstrainer;
288 PhysicsScene.Constraints.AddConstraint(LockAxisConstraint);
289
290 // The constraint is tied to the world and oriented to the prim.
291
292 // Free to move linearly
293 OMV.Vector3 linearLow = OMV.Vector3.Zero;
294 OMV.Vector3 linearHigh = PhysicsScene.TerrainManager.DefaultRegionSize;
295 axisConstrainer.SetLinearLimits(linearLow, linearHigh);
296
297 // Angular with some axis locked
298 float f2PI = (float)Math.PI * 2f;
299 OMV.Vector3 angularLow = new OMV.Vector3(-f2PI, -f2PI, -f2PI);
300 OMV.Vector3 angularHigh = new OMV.Vector3(f2PI, f2PI, f2PI);
301 if (LockedAxis.X != 1f)
302 {
303 angularLow.X = 0f;
304 angularHigh.X = 0f;
305 }
306 if (LockedAxis.Y != 1f)
307 {
308 angularLow.Y = 0f;
309 angularHigh.Y = 0f;
310 }
311 if (LockedAxis.Z != 1f)
312 {
313 angularLow.Z = 0f;
314 angularHigh.Z = 0f;
315 }
316 axisConstrainer.SetAngularLimits(angularLow, angularHigh);
317
318 DetailLog("{0},BSPrim.LockAngularMotion,create,linLow={1},linHi={2},angLow={3},angHi={4}",
319 LocalID, linearLow, linearHigh, angularLow, angularHigh);
320
321 // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo.
322 axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f);
323 263
324 axisConstrainer.RecomputeConstraintVariables(RawMass); 264 // Update parameters so the new actor's Refresh() action is called at the right time.
325 }); 265 PhysScene.TaintedObject("BSPrim.LockAngularMotion", delegate()
326 }
327 else
328 { 266 {
329 // Everything seems unlocked 267 UpdatePhysicalParameters();
330 CleanUpLockAxisPhysicals(false /* inTaintTime */); 268 });
331 }
332 269
333 return; 270 return;
334 } 271 }
335 // Get rid of any constraint built for LockAxis
336 // Most often the constraint is removed when the constraint collection is cleaned for this prim.
337 private void CleanUpLockAxisPhysicals(bool inTaintTime)
338 {
339 if (LockAxisConstraint != null)
340 {
341 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.CleanUpLockAxisPhysicals", delegate()
342 {
343 if (LockAxisConstraint != null)
344 {
345 PhysicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint);
346 LockAxisConstraint = null;
347 DetailLog("{0},BSPrim.CleanUpLockAxisPhysicals,destroyingConstraint", LocalID);
348 }
349 });
350 }
351 }
352 272
353 public override OMV.Vector3 RawPosition
354 {
355 get { return _position; }
356 set { _position = value; }
357 }
358 public override OMV.Vector3 Position { 273 public override OMV.Vector3 Position {
359 get { 274 get {
360 // don't do the GetObjectPosition for root elements because this function is called a zillion times. 275 // don't do the GetObjectPosition for root elements because this function is called a zillion times.
361 // _position = ForcePosition; 276 // RawPosition = ForcePosition;
362 return _position; 277 return RawPosition;
363 } 278 }
364 set { 279 set {
365 // If the position must be forced into the physics engine, use ForcePosition. 280 // If the position must be forced into the physics engine, use ForcePosition.
366 // All positions are given in world positions. 281 // All positions are given in world positions.
367 if (_position == value) 282 if (RawPosition == value)
368 { 283 {
369 DetailLog("{0},BSPrim.setPosition,call,positionNotChanging,pos={1},orient={2}", LocalID, _position, _orientation); 284 DetailLog("{0},BSPrim.setPosition,call,positionNotChanging,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
370 return; 285 return;
371 } 286 }
372 _position = value; 287 RawPosition = value;
373 PositionSanityCheck(false); 288 PositionSanityCheck(false);
374 289
375 PhysicsScene.TaintedObject("BSPrim.setPosition", delegate() 290 PhysScene.TaintedObject("BSPrim.setPosition", delegate()
376 { 291 {
377 DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 292 DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
378 ForcePosition = _position; 293 ForcePosition = RawPosition;
379 }); 294 });
380 } 295 }
381 } 296 }
382 297
298 // NOTE: overloaded by BSPrimDisplaced to handle offset for center-of-gravity.
383 public override OMV.Vector3 ForcePosition { 299 public override OMV.Vector3 ForcePosition {
384 get { 300 get {
385 _position = PhysicsScene.PE.GetPosition(PhysBody); 301 RawPosition = PhysScene.PE.GetPosition(PhysBody);
386 return _position; 302 return RawPosition;
387 } 303 }
388 set { 304 set {
389 _position = value; 305 RawPosition = value;
390 if (PhysBody.HasPhysicalBody) 306 if (PhysBody.HasPhysicalBody)
391 { 307 {
392 PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); 308 PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
393 ActivateIfPhysical(false); 309 ActivateIfPhysical(false);
394 } 310 }
395 } 311 }
@@ -406,7 +322,7 @@ public class BSPrim : BSPhysObject
406 if (!IsPhysicallyActive) 322 if (!IsPhysicallyActive)
407 return ret; 323 return ret;
408 324
409 if (!PhysicsScene.TerrainManager.IsWithinKnownTerrain(RawPosition)) 325 if (!PhysScene.TerrainManager.IsWithinKnownTerrain(RawPosition))
410 { 326 {
411 // The physical object is out of the known/simulated area. 327 // The physical object is out of the known/simulated area.
412 // Upper levels of code will handle the transition to other areas so, for 328 // Upper levels of code will handle the transition to other areas so, for
@@ -414,7 +330,7 @@ public class BSPrim : BSPhysObject
414 return ret; 330 return ret;
415 } 331 }
416 332
417 float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition); 333 float terrainHeight = PhysScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
418 OMV.Vector3 upForce = OMV.Vector3.Zero; 334 OMV.Vector3 upForce = OMV.Vector3.Zero;
419 float approxSize = Math.Max(Size.X, Math.Max(Size.Y, Size.Z)); 335 float approxSize = Math.Max(Size.X, Math.Max(Size.Y, Size.Z));
420 if ((RawPosition.Z + approxSize / 2f) < terrainHeight) 336 if ((RawPosition.Z + approxSize / 2f) < terrainHeight)
@@ -423,10 +339,10 @@ public class BSPrim : BSPhysObject
423 float targetHeight = terrainHeight + (Size.Z / 2f); 339 float targetHeight = terrainHeight + (Size.Z / 2f);
424 // If the object is below ground it just has to be moved up because pushing will 340 // If the object is below ground it just has to be moved up because pushing will
425 // not get it through the terrain 341 // not get it through the terrain
426 _position.Z = targetHeight; 342 RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, targetHeight);
427 if (inTaintTime) 343 if (inTaintTime)
428 { 344 {
429 ForcePosition = _position; 345 ForcePosition = RawPosition;
430 } 346 }
431 // If we are throwing the object around, zero its other forces 347 // If we are throwing the object around, zero its other forces
432 ZeroMotion(inTaintTime); 348 ZeroMotion(inTaintTime);
@@ -435,7 +351,7 @@ public class BSPrim : BSPhysObject
435 351
436 if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0) 352 if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
437 { 353 {
438 float waterHeight = PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(_position); 354 float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
439 // TODO: a floating motor so object will bob in the water 355 // TODO: a floating motor so object will bob in the water
440 if (Math.Abs(RawPosition.Z - waterHeight) > 0.1f) 356 if (Math.Abs(RawPosition.Z - waterHeight) > 0.1f)
441 { 357 {
@@ -443,8 +359,8 @@ public class BSPrim : BSPhysObject
443 upForce.Z = (waterHeight - RawPosition.Z) * 1f; 359 upForce.Z = (waterHeight - RawPosition.Z) * 1f;
444 360
445 // Apply upforce and overcome gravity. 361 // Apply upforce and overcome gravity.
446 OMV.Vector3 correctionForce = upForce - PhysicsScene.DefaultGravity; 362 OMV.Vector3 correctionForce = upForce - PhysScene.DefaultGravity;
447 DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, _position, upForce, correctionForce); 363 DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, RawPosition, upForce, correctionForce);
448 AddForce(correctionForce, false, inTaintTime); 364 AddForce(correctionForce, false, inTaintTime);
449 ret = true; 365 ret = true;
450 } 366 }
@@ -463,17 +379,17 @@ public class BSPrim : BSPhysObject
463 uint wayOutThere = Constants.RegionSize * Constants.RegionSize; 379 uint wayOutThere = Constants.RegionSize * Constants.RegionSize;
464 // There have been instances of objects getting thrown way out of bounds and crashing 380 // There have been instances of objects getting thrown way out of bounds and crashing
465 // the border crossing code. 381 // the border crossing code.
466 if ( _position.X < -Constants.RegionSize || _position.X > wayOutThere 382 if ( RawPosition.X < -Constants.RegionSize || RawPosition.X > wayOutThere
467 || _position.Y < -Constants.RegionSize || _position.Y > wayOutThere 383 || RawPosition.Y < -Constants.RegionSize || RawPosition.Y > wayOutThere
468 || _position.Z < -Constants.RegionSize || _position.Z > wayOutThere) 384 || RawPosition.Z < -Constants.RegionSize || RawPosition.Z > wayOutThere)
469 { 385 {
470 _position = new OMV.Vector3(10, 10, 50); 386 RawPosition = new OMV.Vector3(10, 10, 50);
471 ZeroMotion(inTaintTime); 387 ZeroMotion(inTaintTime);
472 ret = true; 388 ret = true;
473 } 389 }
474 if (_velocity.LengthSquared() > BSParam.MaxLinearVelocity) 390 if (RawVelocity.LengthSquared() > BSParam.MaxLinearVelocity)
475 { 391 {
476 _velocity = Util.ClampV(_velocity, BSParam.MaxLinearVelocity); 392 RawVelocity = Util.ClampV(RawVelocity, BSParam.MaxLinearVelocity);
477 ret = true; 393 ret = true;
478 } 394 }
479 if (_rotationalVelocity.LengthSquared() > BSParam.MaxAngularVelocitySquared) 395 if (_rotationalVelocity.LengthSquared() > BSParam.MaxAngularVelocitySquared)
@@ -498,7 +414,7 @@ public class BSPrim : BSPhysObject
498 get { return _mass; } 414 get { return _mass; }
499 } 415 }
500 // used when we only want this prim's mass and not the linkset thing 416 // used when we only want this prim's mass and not the linkset thing
501 public override float RawMass { 417 public override float RawMass {
502 get { return _mass; } 418 get { return _mass; }
503 } 419 }
504 // Set the physical mass to the passed mass. 420 // Set the physical mass to the passed mass.
@@ -509,10 +425,10 @@ public class BSPrim : BSPhysObject
509 { 425 {
510 if (IsStatic) 426 if (IsStatic)
511 { 427 {
512 PhysicsScene.PE.SetGravity(PhysBody, PhysicsScene.DefaultGravity); 428 PhysScene.PE.SetGravity(PhysBody, PhysScene.DefaultGravity);
513 Inertia = OMV.Vector3.Zero; 429 Inertia = OMV.Vector3.Zero;
514 PhysicsScene.PE.SetMassProps(PhysBody, 0f, Inertia); 430 PhysScene.PE.SetMassProps(PhysBody, 0f, Inertia);
515 PhysicsScene.PE.UpdateInertiaTensor(PhysBody); 431 PhysScene.PE.UpdateInertiaTensor(PhysBody);
516 } 432 }
517 else 433 else
518 { 434 {
@@ -521,16 +437,19 @@ public class BSPrim : BSPhysObject
521 // Changing interesting properties doesn't change proxy and collision cache 437 // Changing interesting properties doesn't change proxy and collision cache
522 // information. The Bullet solution is to re-add the object to the world 438 // information. The Bullet solution is to re-add the object to the world
523 // after parameters are changed. 439 // after parameters are changed.
524 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, PhysBody); 440 PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
525 } 441 }
526 442
527 // The computation of mass props requires gravity to be set on the object. 443 // The computation of mass props requires gravity to be set on the object.
528 Gravity = ComputeGravity(Buoyancy); 444 Gravity = ComputeGravity(Buoyancy);
529 PhysicsScene.PE.SetGravity(PhysBody, Gravity); 445 PhysScene.PE.SetGravity(PhysBody, Gravity);
530 446
531 Inertia = PhysicsScene.PE.CalculateLocalInertia(PhysShape, physMass); 447 // OMV.Vector3 currentScale = PhysScene.PE.GetLocalScaling(PhysShape.physShapeInfo); // DEBUG DEBUG
532 PhysicsScene.PE.SetMassProps(PhysBody, physMass, Inertia); 448 // DetailLog("{0},BSPrim.UpdateMassProperties,currentScale{1},shape={2}", LocalID, currentScale, PhysShape.physShapeInfo); // DEBUG DEBUG
533 PhysicsScene.PE.UpdateInertiaTensor(PhysBody); 449
450 Inertia = PhysScene.PE.CalculateLocalInertia(PhysShape.physShapeInfo, physMass);
451 PhysScene.PE.SetMassProps(PhysBody, physMass, Inertia);
452 PhysScene.PE.UpdateInertiaTensor(PhysBody);
534 453
535 DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2},grav={3},inWorld={4}", 454 DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2},grav={3},inWorld={4}",
536 LocalID, physMass, Inertia, Gravity, inWorld); 455 LocalID, physMass, Inertia, Gravity, inWorld);
@@ -546,7 +465,7 @@ public class BSPrim : BSPhysObject
546 // Return what gravity should be set to this very moment 465 // Return what gravity should be set to this very moment
547 public OMV.Vector3 ComputeGravity(float buoyancy) 466 public OMV.Vector3 ComputeGravity(float buoyancy)
548 { 467 {
549 OMV.Vector3 ret = PhysicsScene.DefaultGravity; 468 OMV.Vector3 ret = PhysScene.DefaultGravity;
550 469
551 if (!IsStatic) 470 if (!IsStatic)
552 { 471 {
@@ -570,95 +489,121 @@ public class BSPrim : BSPhysObject
570 } 489 }
571 490
572 public override OMV.Vector3 Force { 491 public override OMV.Vector3 Force {
573 get { return _force; } 492 get { return RawForce; }
574 set { 493 set {
575 _force = value; 494 RawForce = value;
576 if (_force != OMV.Vector3.Zero) 495 EnableActor(RawForce != OMV.Vector3.Zero, SetForceActorName, delegate()
577 { 496 {
578 // If the force is non-zero, it must be reapplied each tick because 497 return new BSActorSetForce(PhysScene, this, SetForceActorName);
579 // Bullet clears the forces applied last frame. 498 });
580 RegisterPreStepAction("BSPrim.setForce", LocalID, 499 }
581 delegate(float timeStep) 500 }
582 {
583 if (!IsPhysicallyActive || _force == OMV.Vector3.Zero)
584 {
585 UnRegisterPreStepAction("BSPrim.setForce", LocalID);
586 return;
587 }
588 501
589 DetailLog("{0},BSPrim.setForce,preStep,force={1}", LocalID, _force); 502 // Find and return a handle to the current vehicle actor.
590 if (PhysBody.HasPhysicalBody) 503 // Return 'null' if there is no vehicle actor.
591 { 504 public BSDynamics GetVehicleActor(bool createIfNone)
592 PhysicsScene.PE.ApplyCentralForce(PhysBody, _force); 505 {
593 ActivateIfPhysical(false); 506 BSDynamics ret = null;
594 } 507 BSActor actor;
595 } 508 if (PhysicalActors.TryGetActor(VehicleActorName, out actor))
596 ); 509 {
597 } 510 ret = actor as BSDynamics;
598 else 511 }
512 else
513 {
514 if (createIfNone)
599 { 515 {
600 UnRegisterPreStepAction("BSPrim.setForce", LocalID); 516 ret = new BSDynamics(PhysScene, this, VehicleActorName);
517 PhysicalActors.Add(ret.ActorName, ret);
601 } 518 }
602 } 519 }
520 return ret;
603 } 521 }
604 522
605 public override int VehicleType { 523 public override int VehicleType {
606 get { 524 get {
607 return (int)VehicleController.Type; // if we are a vehicle, return that type 525 int ret = (int)Vehicle.TYPE_NONE;
526 BSDynamics vehicleActor = GetVehicleActor(false /* createIfNone */);
527 if (vehicleActor != null)
528 ret = (int)vehicleActor.Type;
529 return ret;
608 } 530 }
609 set { 531 set {
610 Vehicle type = (Vehicle)value; 532 Vehicle type = (Vehicle)value;
611 533
612 PhysicsScene.TaintedObject("setVehicleType", delegate() 534 PhysScene.TaintedObject("setVehicleType", delegate()
613 { 535 {
614 // Done at taint time so we're sure the physics engine is not using the variables 536 // Some vehicle scripts change vehicle type on the fly as an easy way to
615 // Vehicle code changes the parameters for this vehicle type. 537 // change all the parameters. Like a plane changing to CAR when on the
616 VehicleController.ProcessTypeChange(type); 538 // ground. In this case, don't want to zero motion.
617 ActivateIfPhysical(false); 539 // ZeroMotion(true /* inTaintTime */);
618 540 if (type == Vehicle.TYPE_NONE)
619 // If an active vehicle, register the vehicle code to be called before each step
620 if (VehicleController.Type == Vehicle.TYPE_NONE)
621 { 541 {
622 UnRegisterPreStepAction("BSPrim.Vehicle", LocalID); 542 // Vehicle type is 'none' so get rid of any actor that may have been allocated.
623 UnRegisterPostStepAction("BSPrim.Vehicle", LocalID); 543 BSDynamics vehicleActor = GetVehicleActor(false /* createIfNone */);
544 if (vehicleActor != null)
545 {
546 PhysicalActors.RemoveAndRelease(vehicleActor.ActorName);
547 }
624 } 548 }
625 else 549 else
626 { 550 {
627 RegisterPreStepAction("BSPrim.Vehicle", LocalID, VehicleController.Step); 551 // Vehicle type is not 'none' so create an actor and set it running.
628 RegisterPostStepAction("BSPrim.Vehicle", LocalID, VehicleController.PostStep); 552 BSDynamics vehicleActor = GetVehicleActor(true /* createIfNone */);
553 if (vehicleActor != null)
554 {
555 vehicleActor.ProcessTypeChange(type);
556 ActivateIfPhysical(false);
557 }
629 } 558 }
630 }); 559 });
631 } 560 }
632 } 561 }
633 public override void VehicleFloatParam(int param, float value) 562 public override void VehicleFloatParam(int param, float value)
634 { 563 {
635 PhysicsScene.TaintedObject("BSPrim.VehicleFloatParam", delegate() 564 PhysScene.TaintedObject("BSPrim.VehicleFloatParam", delegate()
636 { 565 {
637 VehicleController.ProcessFloatVehicleParam((Vehicle)param, value); 566 BSDynamics vehicleActor = GetVehicleActor(true /* createIfNone */);
638 ActivateIfPhysical(false); 567 if (vehicleActor != null)
568 {
569 vehicleActor.ProcessFloatVehicleParam((Vehicle)param, value);
570 ActivateIfPhysical(false);
571 }
639 }); 572 });
640 } 573 }
641 public override void VehicleVectorParam(int param, OMV.Vector3 value) 574 public override void VehicleVectorParam(int param, OMV.Vector3 value)
642 { 575 {
643 PhysicsScene.TaintedObject("BSPrim.VehicleVectorParam", delegate() 576 PhysScene.TaintedObject("BSPrim.VehicleVectorParam", delegate()
644 { 577 {
645 VehicleController.ProcessVectorVehicleParam((Vehicle)param, value); 578 BSDynamics vehicleActor = GetVehicleActor(true /* createIfNone */);
646 ActivateIfPhysical(false); 579 if (vehicleActor != null)
580 {
581 vehicleActor.ProcessVectorVehicleParam((Vehicle)param, value);
582 ActivateIfPhysical(false);
583 }
647 }); 584 });
648 } 585 }
649 public override void VehicleRotationParam(int param, OMV.Quaternion rotation) 586 public override void VehicleRotationParam(int param, OMV.Quaternion rotation)
650 { 587 {
651 PhysicsScene.TaintedObject("BSPrim.VehicleRotationParam", delegate() 588 PhysScene.TaintedObject("BSPrim.VehicleRotationParam", delegate()
652 { 589 {
653 VehicleController.ProcessRotationVehicleParam((Vehicle)param, rotation); 590 BSDynamics vehicleActor = GetVehicleActor(true /* createIfNone */);
654 ActivateIfPhysical(false); 591 if (vehicleActor != null)
592 {
593 vehicleActor.ProcessRotationVehicleParam((Vehicle)param, rotation);
594 ActivateIfPhysical(false);
595 }
655 }); 596 });
656 } 597 }
657 public override void VehicleFlags(int param, bool remove) 598 public override void VehicleFlags(int param, bool remove)
658 { 599 {
659 PhysicsScene.TaintedObject("BSPrim.VehicleFlags", delegate() 600 PhysScene.TaintedObject("BSPrim.VehicleFlags", delegate()
660 { 601 {
661 VehicleController.ProcessVehicleFlags(param, remove); 602 BSDynamics vehicleActor = GetVehicleActor(true /* createIfNone */);
603 if (vehicleActor != null)
604 {
605 vehicleActor.ProcessVehicleFlags(param, remove);
606 }
662 }); 607 });
663 } 608 }
664 609
@@ -668,7 +613,7 @@ public class BSPrim : BSPhysObject
668 if (_isVolumeDetect != newValue) 613 if (_isVolumeDetect != newValue)
669 { 614 {
670 _isVolumeDetect = newValue; 615 _isVolumeDetect = newValue;
671 PhysicsScene.TaintedObject("BSPrim.SetVolumeDetect", delegate() 616 PhysScene.TaintedObject("BSPrim.SetVolumeDetect", delegate()
672 { 617 {
673 // DetailLog("{0},setVolumeDetect,taint,volDetect={1}", LocalID, _isVolumeDetect); 618 // DetailLog("{0},setVolumeDetect,taint,volDetect={1}", LocalID, _isVolumeDetect);
674 SetObjectDynamic(true); 619 SetObjectDynamic(true);
@@ -676,10 +621,14 @@ public class BSPrim : BSPhysObject
676 } 621 }
677 return; 622 return;
678 } 623 }
624 public override bool IsVolumeDetect
625 {
626 get { return _isVolumeDetect; }
627 }
679 public override void SetMaterial(int material) 628 public override void SetMaterial(int material)
680 { 629 {
681 base.SetMaterial(material); 630 base.SetMaterial(material);
682 PhysicsScene.TaintedObject("BSPrim.SetMaterial", delegate() 631 PhysScene.TaintedObject("BSPrim.SetMaterial", delegate()
683 { 632 {
684 UpdatePhysicalParameters(); 633 UpdatePhysicalParameters();
685 }); 634 });
@@ -692,7 +641,7 @@ public class BSPrim : BSPhysObject
692 if (base.Friction != value) 641 if (base.Friction != value)
693 { 642 {
694 base.Friction = value; 643 base.Friction = value;
695 PhysicsScene.TaintedObject("BSPrim.setFriction", delegate() 644 PhysScene.TaintedObject("BSPrim.setFriction", delegate()
696 { 645 {
697 UpdatePhysicalParameters(); 646 UpdatePhysicalParameters();
698 }); 647 });
@@ -707,7 +656,7 @@ public class BSPrim : BSPhysObject
707 if (base.Restitution != value) 656 if (base.Restitution != value)
708 { 657 {
709 base.Restitution = value; 658 base.Restitution = value;
710 PhysicsScene.TaintedObject("BSPrim.setRestitution", delegate() 659 PhysScene.TaintedObject("BSPrim.setRestitution", delegate()
711 { 660 {
712 UpdatePhysicalParameters(); 661 UpdatePhysicalParameters();
713 }); 662 });
@@ -724,7 +673,7 @@ public class BSPrim : BSPhysObject
724 if (base.Density != value) 673 if (base.Density != value)
725 { 674 {
726 base.Density = value; 675 base.Density = value;
727 PhysicsScene.TaintedObject("BSPrim.setDensity", delegate() 676 PhysScene.TaintedObject("BSPrim.setDensity", delegate()
728 { 677 {
729 UpdatePhysicalParameters(); 678 UpdatePhysicalParameters();
730 }); 679 });
@@ -739,93 +688,66 @@ public class BSPrim : BSPhysObject
739 if (base.GravModifier != value) 688 if (base.GravModifier != value)
740 { 689 {
741 base.GravModifier = value; 690 base.GravModifier = value;
742 PhysicsScene.TaintedObject("BSPrim.setGravityModifier", delegate() 691 PhysScene.TaintedObject("BSPrim.setGravityModifier", delegate()
743 { 692 {
744 UpdatePhysicalParameters(); 693 UpdatePhysicalParameters();
745 }); 694 });
746 } 695 }
747 } 696 }
748 } 697 }
749 public override OMV.Vector3 RawVelocity
750 {
751 get { return _velocity; }
752 set { _velocity = value; }
753 }
754 public override OMV.Vector3 Velocity { 698 public override OMV.Vector3 Velocity {
755 get { return _velocity; } 699 get { return RawVelocity; }
756 set { 700 set {
757 _velocity = value; 701 RawVelocity = value;
758 PhysicsScene.TaintedObject("BSPrim.setVelocity", delegate() 702 PhysScene.TaintedObject("BSPrim.setVelocity", delegate()
759 { 703 {
760 // DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, _velocity); 704 // DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, RawVelocity);
761 ForceVelocity = _velocity; 705 ForceVelocity = RawVelocity;
762 }); 706 });
763 } 707 }
764 } 708 }
765 public override OMV.Vector3 ForceVelocity { 709 public override OMV.Vector3 ForceVelocity {
766 get { return _velocity; } 710 get { return RawVelocity; }
767 set { 711 set {
768 PhysicsScene.AssertInTaintTime("BSPrim.ForceVelocity"); 712 PhysScene.AssertInTaintTime("BSPrim.ForceVelocity");
769 713
770 _velocity = Util.ClampV(value, BSParam.MaxLinearVelocity); 714 RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
771 if (PhysBody.HasPhysicalBody) 715 if (PhysBody.HasPhysicalBody)
772 { 716 {
773 DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, _velocity); 717 DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, RawVelocity);
774 PhysicsScene.PE.SetLinearVelocity(PhysBody, _velocity); 718 PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
775 ActivateIfPhysical(false); 719 ActivateIfPhysical(false);
776 } 720 }
777 } 721 }
778 } 722 }
779 public override OMV.Vector3 Torque { 723 public override OMV.Vector3 Torque {
780 get { return _torque; } 724 get { return RawTorque; }
781 set { 725 set {
782 _torque = value; 726 RawTorque = value;
783 if (_torque != OMV.Vector3.Zero) 727 EnableActor(RawTorque != OMV.Vector3.Zero, SetTorqueActorName, delegate()
784 {
785 // If the torque is non-zero, it must be reapplied each tick because
786 // Bullet clears the forces applied last frame.
787 RegisterPreStepAction("BSPrim.setTorque", LocalID,
788 delegate(float timeStep)
789 {
790 if (!IsPhysicallyActive || _torque == OMV.Vector3.Zero)
791 {
792 UnRegisterPreStepAction("BSPrim.setTorque", LocalID);
793 return;
794 }
795
796 if (PhysBody.HasPhysicalBody)
797 AddAngularForce(_torque, false, true);
798 }
799 );
800 }
801 else
802 { 728 {
803 UnRegisterPreStepAction("BSPrim.setTorque", LocalID); 729 return new BSActorSetTorque(PhysScene, this, SetTorqueActorName);
804 } 730 });
805 // DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque); 731 DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, RawTorque);
806 } 732 }
807 } 733 }
808 public override OMV.Vector3 Acceleration { 734 public override OMV.Vector3 Acceleration {
809 get { return _acceleration; } 735 get { return _acceleration; }
810 set { _acceleration = value; } 736 set { _acceleration = value; }
811 } 737 }
812 public override OMV.Quaternion RawOrientation 738
813 {
814 get { return _orientation; }
815 set { _orientation = value; }
816 }
817 public override OMV.Quaternion Orientation { 739 public override OMV.Quaternion Orientation {
818 get { 740 get {
819 return _orientation; 741 return RawOrientation;
820 } 742 }
821 set { 743 set {
822 if (_orientation == value) 744 if (RawOrientation == value)
823 return; 745 return;
824 _orientation = value; 746 RawOrientation = value;
825 747
826 PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() 748 PhysScene.TaintedObject("BSPrim.setOrientation", delegate()
827 { 749 {
828 ForceOrientation = _orientation; 750 ForceOrientation = RawOrientation;
829 }); 751 });
830 } 752 }
831 } 753 }
@@ -834,14 +756,14 @@ public class BSPrim : BSPhysObject
834 { 756 {
835 get 757 get
836 { 758 {
837 _orientation = PhysicsScene.PE.GetOrientation(PhysBody); 759 RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
838 return _orientation; 760 return RawOrientation;
839 } 761 }
840 set 762 set
841 { 763 {
842 _orientation = value; 764 RawOrientation = value;
843 if (PhysBody.HasPhysicalBody) 765 if (PhysBody.HasPhysicalBody)
844 PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); 766 PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
845 } 767 }
846 } 768 }
847 public override int PhysicsActorType { 769 public override int PhysicsActorType {
@@ -854,7 +776,7 @@ public class BSPrim : BSPhysObject
854 if (_isPhysical != value) 776 if (_isPhysical != value)
855 { 777 {
856 _isPhysical = value; 778 _isPhysical = value;
857 PhysicsScene.TaintedObject("BSPrim.setIsPhysical", delegate() 779 PhysScene.TaintedObject("BSPrim.setIsPhysical", delegate()
858 { 780 {
859 DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical); 781 DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical);
860 SetObjectDynamic(true); 782 SetObjectDynamic(true);
@@ -898,24 +820,25 @@ public class BSPrim : BSPhysObject
898 // isSolid: other objects bounce off of this object 820 // isSolid: other objects bounce off of this object
899 // isVolumeDetect: other objects pass through but can generate collisions 821 // isVolumeDetect: other objects pass through but can generate collisions
900 // collisionEvents: whether this object returns collision events 822 // collisionEvents: whether this object returns collision events
823 // NOTE: overloaded by BSPrimLinkable to also update linkset physical parameters.
901 public virtual void UpdatePhysicalParameters() 824 public virtual void UpdatePhysicalParameters()
902 { 825 {
903 if (!PhysBody.HasPhysicalBody) 826 if (!PhysBody.HasPhysicalBody)
904 { 827 {
905 // This would only happen if updates are called for during initialization when the body is not set up yet. 828 // This would only happen if updates are called for during initialization when the body is not set up yet.
906 DetailLog("{0},BSPrim.UpdatePhysicalParameters,taint,calledWithNoPhysBody", LocalID); 829 // DetailLog("{0},BSPrim.UpdatePhysicalParameters,taint,calledWithNoPhysBody", LocalID);
907 return; 830 return;
908 } 831 }
909 832
910 // Mangling all the physical properties requires the object not be in the physical world. 833 // Mangling all the physical properties requires the object not be in the physical world.
911 // This is a NOOP if the object is not in the world (BulletSim and Bullet ignore objects not found). 834 // This is a NOOP if the object is not in the world (BulletSim and Bullet ignore objects not found).
912 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, PhysBody); 835 PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
913 836
914 // Set up the object physicalness (does gravity and collisions move this object) 837 // Set up the object physicalness (does gravity and collisions move this object)
915 MakeDynamic(IsStatic); 838 MakeDynamic(IsStatic);
916 839
917 // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters) 840 // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters)
918 VehicleController.Refresh(); 841 PhysicalActors.Refresh();
919 842
920 // Arrange for collision events if the simulator wants them 843 // Arrange for collision events if the simulator wants them
921 EnableCollisions(SubscribedEvents()); 844 EnableCollisions(SubscribedEvents());
@@ -926,10 +849,11 @@ public class BSPrim : BSPhysObject
926 AddObjectToPhysicalWorld(); 849 AddObjectToPhysicalWorld();
927 850
928 // Rebuild its shape 851 // Rebuild its shape
929 PhysicsScene.PE.UpdateSingleAabb(PhysicsScene.World, PhysBody); 852 PhysScene.PE.UpdateSingleAabb(PhysScene.World, PhysBody);
930 853
931 DetailLog("{0},BSPrim.UpdatePhysicalParameters,taintExit,static={1},solid={2},mass={3},collide={4},cf={5:X},cType={6},body={7},shape={8}", 854 DetailLog("{0},BSPrim.UpdatePhysicalParameters,taintExit,static={1},solid={2},mass={3},collide={4},cf={5:X},cType={6},body={7},shape={8}",
932 LocalID, IsStatic, IsSolid, Mass, SubscribedEvents(), CurrentCollisionFlags, PhysBody.collisionType, PhysBody, PhysShape); 855 LocalID, IsStatic, IsSolid, Mass, SubscribedEvents(),
856 CurrentCollisionFlags, PhysBody.collisionType, PhysBody, PhysShape);
933 } 857 }
934 858
935 // "Making dynamic" means changing to and from static. 859 // "Making dynamic" means changing to and from static.
@@ -942,28 +866,28 @@ public class BSPrim : BSPhysObject
942 if (makeStatic) 866 if (makeStatic)
943 { 867 {
944 // Become a Bullet 'static' object type 868 // Become a Bullet 'static' object type
945 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_STATIC_OBJECT); 869 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_STATIC_OBJECT);
946 // Stop all movement 870 // Stop all movement
947 ZeroMotion(true); 871 ZeroMotion(true);
948 872
949 // Set various physical properties so other object interact properly 873 // Set various physical properties so other object interact properly
950 PhysicsScene.PE.SetFriction(PhysBody, Friction); 874 PhysScene.PE.SetFriction(PhysBody, Friction);
951 PhysicsScene.PE.SetRestitution(PhysBody, Restitution); 875 PhysScene.PE.SetRestitution(PhysBody, Restitution);
952 PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold); 876 PhysScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
953 877
954 // Mass is zero which disables a bunch of physics stuff in Bullet 878 // Mass is zero which disables a bunch of physics stuff in Bullet
955 UpdatePhysicalMassProperties(0f, false); 879 UpdatePhysicalMassProperties(0f, false);
956 // Set collision detection parameters 880 // Set collision detection parameters
957 if (BSParam.CcdMotionThreshold > 0f) 881 if (BSParam.CcdMotionThreshold > 0f)
958 { 882 {
959 PhysicsScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold); 883 PhysScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
960 PhysicsScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius); 884 PhysScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
961 } 885 }
962 886
963 // The activation state is 'disabled' so Bullet will not try to act on it. 887 // The activation state is 'disabled' so Bullet will not try to act on it.
964 // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_SIMULATION); 888 // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_SIMULATION);
965 // Start it out sleeping and physical actions could wake it up. 889 // Start it out sleeping and physical actions could wake it up.
966 PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ISLAND_SLEEPING); 890 PhysScene.PE.ForceActivationState(PhysBody, ActivationState.ISLAND_SLEEPING);
967 891
968 // This collides like a static object 892 // This collides like a static object
969 PhysBody.collisionType = CollisionType.Static; 893 PhysBody.collisionType = CollisionType.Static;
@@ -971,11 +895,11 @@ public class BSPrim : BSPhysObject
971 else 895 else
972 { 896 {
973 // Not a Bullet static object 897 // Not a Bullet static object
974 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.CF_STATIC_OBJECT); 898 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.CF_STATIC_OBJECT);
975 899
976 // Set various physical properties so other object interact properly 900 // Set various physical properties so other object interact properly
977 PhysicsScene.PE.SetFriction(PhysBody, Friction); 901 PhysScene.PE.SetFriction(PhysBody, Friction);
978 PhysicsScene.PE.SetRestitution(PhysBody, Restitution); 902 PhysScene.PE.SetRestitution(PhysBody, Restitution);
979 // DetailLog("{0},BSPrim.MakeDynamic,frict={1},rest={2}", LocalID, Friction, Restitution); 903 // DetailLog("{0},BSPrim.MakeDynamic,frict={1},rest={2}", LocalID, Friction, Restitution);
980 904
981 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382 905 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382
@@ -983,8 +907,8 @@ public class BSPrim : BSPhysObject
983 // PhysicsScene.PE.ClearAllForces(BSBody); 907 // PhysicsScene.PE.ClearAllForces(BSBody);
984 908
985 // For good measure, make sure the transform is set through to the motion state 909 // For good measure, make sure the transform is set through to the motion state
986 ForcePosition = _position; 910 ForcePosition = RawPosition;
987 ForceVelocity = _velocity; 911 ForceVelocity = RawVelocity;
988 ForceRotationalVelocity = _rotationalVelocity; 912 ForceRotationalVelocity = _rotationalVelocity;
989 913
990 // A dynamic object has mass 914 // A dynamic object has mass
@@ -993,22 +917,22 @@ public class BSPrim : BSPhysObject
993 // Set collision detection parameters 917 // Set collision detection parameters
994 if (BSParam.CcdMotionThreshold > 0f) 918 if (BSParam.CcdMotionThreshold > 0f)
995 { 919 {
996 PhysicsScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold); 920 PhysScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
997 PhysicsScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius); 921 PhysScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
998 } 922 }
999 923
1000 // Various values for simulation limits 924 // Various values for simulation limits
1001 PhysicsScene.PE.SetDamping(PhysBody, BSParam.LinearDamping, BSParam.AngularDamping); 925 PhysScene.PE.SetDamping(PhysBody, BSParam.LinearDamping, BSParam.AngularDamping);
1002 PhysicsScene.PE.SetDeactivationTime(PhysBody, BSParam.DeactivationTime); 926 PhysScene.PE.SetDeactivationTime(PhysBody, BSParam.DeactivationTime);
1003 PhysicsScene.PE.SetSleepingThresholds(PhysBody, BSParam.LinearSleepingThreshold, BSParam.AngularSleepingThreshold); 927 PhysScene.PE.SetSleepingThresholds(PhysBody, BSParam.LinearSleepingThreshold, BSParam.AngularSleepingThreshold);
1004 PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold); 928 PhysScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
1005 929
1006 // This collides like an object. 930 // This collides like an object.
1007 PhysBody.collisionType = CollisionType.Dynamic; 931 PhysBody.collisionType = CollisionType.Dynamic;
1008 932
1009 // Force activation of the object so Bullet will act on it. 933 // Force activation of the object so Bullet will act on it.
1010 // Must do the ForceActivationState2() to overcome the DISABLE_SIMULATION from static objects. 934 // Must do the ForceActivationState2() to overcome the DISABLE_SIMULATION from static objects.
1011 PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG); 935 PhysScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG);
1012 } 936 }
1013 } 937 }
1014 938
@@ -1018,7 +942,7 @@ public class BSPrim : BSPhysObject
1018 // the functions after this one set up the state of a possibly newly created collision body. 942 // the functions after this one set up the state of a possibly newly created collision body.
1019 private void MakeSolid(bool makeSolid) 943 private void MakeSolid(bool makeSolid)
1020 { 944 {
1021 CollisionObjectTypes bodyType = (CollisionObjectTypes)PhysicsScene.PE.GetBodyType(PhysBody); 945 CollisionObjectTypes bodyType = (CollisionObjectTypes)PhysScene.PE.GetBodyType(PhysBody);
1022 if (makeSolid) 946 if (makeSolid)
1023 { 947 {
1024 // Verify the previous code created the correct shape for this type of thing. 948 // Verify the previous code created the correct shape for this type of thing.
@@ -1026,7 +950,7 @@ public class BSPrim : BSPhysObject
1026 { 950 {
1027 m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for solidity. id={1}, type={2}", LogHeader, LocalID, bodyType); 951 m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for solidity. id={1}, type={2}", LogHeader, LocalID, bodyType);
1028 } 952 }
1029 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE); 953 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
1030 } 954 }
1031 else 955 else
1032 { 956 {
@@ -1034,32 +958,23 @@ public class BSPrim : BSPhysObject
1034 { 958 {
1035 m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for non-solidness. id={1}, type={2}", LogHeader, LocalID, bodyType); 959 m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for non-solidness. id={1}, type={2}", LogHeader, LocalID, bodyType);
1036 } 960 }
1037 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE); 961 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
1038 962
1039 // Change collision info from a static object to a ghosty collision object 963 // Change collision info from a static object to a ghosty collision object
1040 PhysBody.collisionType = CollisionType.VolumeDetect; 964 PhysBody.collisionType = CollisionType.VolumeDetect;
1041 } 965 }
1042 } 966 }
1043 967
1044 // Enable physical actions. Bullet will keep sleeping non-moving physical objects so
1045 // they need waking up when parameters are changed.
1046 // Called in taint-time!!
1047 private void ActivateIfPhysical(bool forceIt)
1048 {
1049 if (IsPhysical && PhysBody.HasPhysicalBody)
1050 PhysicsScene.PE.Activate(PhysBody, forceIt);
1051 }
1052
1053 // Turn on or off the flag controlling whether collision events are returned to the simulator. 968 // Turn on or off the flag controlling whether collision events are returned to the simulator.
1054 private void EnableCollisions(bool wantsCollisionEvents) 969 private void EnableCollisions(bool wantsCollisionEvents)
1055 { 970 {
1056 if (wantsCollisionEvents) 971 if (wantsCollisionEvents)
1057 { 972 {
1058 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 973 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
1059 } 974 }
1060 else 975 else
1061 { 976 {
1062 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 977 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
1063 } 978 }
1064 } 979 }
1065 980
@@ -1070,7 +985,7 @@ public class BSPrim : BSPhysObject
1070 { 985 {
1071 if (PhysBody.HasPhysicalBody) 986 if (PhysBody.HasPhysicalBody)
1072 { 987 {
1073 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, PhysBody); 988 PhysScene.PE.AddObjectToWorld(PhysScene.World, PhysBody);
1074 } 989 }
1075 else 990 else
1076 { 991 {
@@ -1105,12 +1020,12 @@ public class BSPrim : BSPhysObject
1105 public override bool FloatOnWater { 1020 public override bool FloatOnWater {
1106 set { 1021 set {
1107 _floatOnWater = value; 1022 _floatOnWater = value;
1108 PhysicsScene.TaintedObject("BSPrim.setFloatOnWater", delegate() 1023 PhysScene.TaintedObject("BSPrim.setFloatOnWater", delegate()
1109 { 1024 {
1110 if (_floatOnWater) 1025 if (_floatOnWater)
1111 CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER); 1026 CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
1112 else 1027 else
1113 CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER); 1028 CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
1114 }); 1029 });
1115 } 1030 }
1116 } 1031 }
@@ -1122,7 +1037,7 @@ public class BSPrim : BSPhysObject
1122 _rotationalVelocity = value; 1037 _rotationalVelocity = value;
1123 Util.ClampV(_rotationalVelocity, BSParam.MaxAngularVelocity); 1038 Util.ClampV(_rotationalVelocity, BSParam.MaxAngularVelocity);
1124 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity); 1039 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity);
1125 PhysicsScene.TaintedObject("BSPrim.setRotationalVelocity", delegate() 1040 PhysScene.TaintedObject("BSPrim.setRotationalVelocity", delegate()
1126 { 1041 {
1127 ForceRotationalVelocity = _rotationalVelocity; 1042 ForceRotationalVelocity = _rotationalVelocity;
1128 }); 1043 });
@@ -1137,7 +1052,7 @@ public class BSPrim : BSPhysObject
1137 if (PhysBody.HasPhysicalBody) 1052 if (PhysBody.HasPhysicalBody)
1138 { 1053 {
1139 DetailLog("{0},BSPrim.ForceRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity); 1054 DetailLog("{0},BSPrim.ForceRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity);
1140 PhysicsScene.PE.SetAngularVelocity(PhysBody, _rotationalVelocity); 1055 PhysScene.PE.SetAngularVelocity(PhysBody, _rotationalVelocity);
1141 // PhysicsScene.PE.SetInterpolationAngularVelocity(PhysBody, _rotationalVelocity); 1056 // PhysicsScene.PE.SetInterpolationAngularVelocity(PhysBody, _rotationalVelocity);
1142 ActivateIfPhysical(false); 1057 ActivateIfPhysical(false);
1143 } 1058 }
@@ -1153,7 +1068,7 @@ public class BSPrim : BSPhysObject
1153 get { return _buoyancy; } 1068 get { return _buoyancy; }
1154 set { 1069 set {
1155 _buoyancy = value; 1070 _buoyancy = value;
1156 PhysicsScene.TaintedObject("BSPrim.setBuoyancy", delegate() 1071 PhysScene.TaintedObject("BSPrim.setBuoyancy", delegate()
1157 { 1072 {
1158 ForceBuoyancy = _buoyancy; 1073 ForceBuoyancy = _buoyancy;
1159 }); 1074 });
@@ -1171,179 +1086,54 @@ public class BSPrim : BSPhysObject
1171 } 1086 }
1172 } 1087 }
1173 1088
1174 // Used for MoveTo
1175 public override OMV.Vector3 PIDTarget {
1176 set
1177 {
1178 // TODO: add a sanity check -- don't move more than a region or something like that.
1179 _PIDTarget = value;
1180 }
1181 }
1182 public override float PIDTau {
1183 set { _PIDTau = value; }
1184 }
1185 public override bool PIDActive { 1089 public override bool PIDActive {
1186 set { 1090 set {
1187 if (value) 1091 base.MoveToTargetActive = value;
1092 EnableActor(MoveToTargetActive, MoveToTargetActorName, delegate()
1188 { 1093 {
1189 // We're taking over after this. 1094 return new BSActorMoveToTarget(PhysScene, this, MoveToTargetActorName);
1190 ZeroMotion(true); 1095 });
1191 1096 }
1192 _targetMotor = new BSVMotor("BSPrim.PIDTarget", 1097 }
1193 _PIDTau, // timeScale
1194 BSMotor.Infinite, // decay time scale
1195 BSMotor.InfiniteVector, // friction timescale
1196 1f // efficiency
1197 );
1198 _targetMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
1199 _targetMotor.SetTarget(_PIDTarget);
1200 _targetMotor.SetCurrent(RawPosition);
1201 /*
1202 _targetMotor = new BSPIDVMotor("BSPrim.PIDTarget");
1203 _targetMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
1204
1205 _targetMotor.SetTarget(_PIDTarget);
1206 _targetMotor.SetCurrent(RawPosition);
1207 _targetMotor.TimeScale = _PIDTau;
1208 _targetMotor.Efficiency = 1f;
1209 */
1210
1211 RegisterPreStepAction("BSPrim.PIDTarget", LocalID, delegate(float timeStep)
1212 {
1213 if (!IsPhysicallyActive)
1214 {
1215 UnRegisterPreStepAction("BSPrim.PIDTarget", LocalID);
1216 return;
1217 }
1218
1219 OMV.Vector3 origPosition = RawPosition; // DEBUG DEBUG (for printout below)
1220
1221 // 'movePosition' is where we'd like the prim to be at this moment.
1222 OMV.Vector3 movePosition = RawPosition + _targetMotor.Step(timeStep);
1223 1098
1224 // If we are very close to our target, turn off the movement motor. 1099 public override OMV.Vector3 PIDTarget
1225 if (_targetMotor.ErrorIsZero()) 1100 {
1226 { 1101 set
1227 DetailLog("{0},BSPrim.PIDTarget,zeroMovement,movePos={1},pos={2},mass={3}", 1102 {
1228 LocalID, movePosition, RawPosition, Mass); 1103 base.PIDTarget = value;
1229 ForcePosition = _targetMotor.TargetValue; 1104 BSActor actor;
1230 _targetMotor.Enabled = false; 1105 if (PhysicalActors.TryGetActor(MoveToTargetActorName, out actor))
1231 }
1232 else
1233 {
1234 _position = movePosition;
1235 PositionSanityCheck(true /* intaintTime */);
1236 ForcePosition = _position;
1237 }
1238 DetailLog("{0},BSPrim.PIDTarget,move,fromPos={1},movePos={2}", LocalID, origPosition, movePosition);
1239 });
1240 }
1241 else
1242 { 1106 {
1243 // Stop any targetting 1107 // if the actor exists, tell it to refresh its values.
1244 UnRegisterPreStepAction("BSPrim.PIDTarget", LocalID); 1108 actor.Refresh();
1245 } 1109 }
1110
1246 } 1111 }
1247 } 1112 }
1248
1249 // Used for llSetHoverHeight and maybe vehicle height 1113 // Used for llSetHoverHeight and maybe vehicle height
1250 // Hover Height will override MoveTo target's Z 1114 // Hover Height will override MoveTo target's Z
1251 public override bool PIDHoverActive { 1115 public override bool PIDHoverActive {
1252 set { 1116 set {
1253 if (value) 1117 base.HoverActive = value;
1118 EnableActor(HoverActive, HoverActorName, delegate()
1254 { 1119 {
1255 // Turning the target on 1120 return new BSActorHover(PhysScene, this, HoverActorName);
1256 _hoverMotor = new BSFMotor("BSPrim.Hover", 1121 });
1257 _PIDHoverTau, // timeScale
1258 BSMotor.Infinite, // decay time scale
1259 BSMotor.Infinite, // friction timescale
1260 1f // efficiency
1261 );
1262 _hoverMotor.SetTarget(ComputeCurrentPIDHoverHeight());
1263 _hoverMotor.SetCurrent(RawPosition.Z);
1264 _hoverMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
1265
1266 RegisterPreStepAction("BSPrim.Hover", LocalID, delegate(float timeStep)
1267 {
1268 // Don't do hovering while the object is selected.
1269 if (!IsPhysicallyActive)
1270 return;
1271
1272 _hoverMotor.SetCurrent(RawPosition.Z);
1273 _hoverMotor.SetTarget(ComputeCurrentPIDHoverHeight());
1274 float targetHeight = _hoverMotor.Step(timeStep);
1275
1276 // 'targetHeight' is where we'd like the Z of the prim to be at this moment.
1277 // Compute the amount of force to push us there.
1278 float moveForce = (targetHeight - RawPosition.Z) * Mass;
1279 // Undo anything the object thinks it's doing at the moment
1280 moveForce = -RawVelocity.Z * Mass;
1281
1282 PhysicsScene.PE.ApplyCentralImpulse(PhysBody, new OMV.Vector3(0f, 0f, moveForce));
1283 DetailLog("{0},BSPrim.Hover,move,targHt={1},moveForce={2},mass={3}", LocalID, targetHeight, moveForce, Mass);
1284 });
1285 }
1286 else
1287 {
1288 UnRegisterPreStepAction("BSPrim.Hover", LocalID);
1289 }
1290 }
1291 }
1292 public override float PIDHoverHeight {
1293 set { _PIDHoverHeight = value; }
1294 }
1295 public override PIDHoverType PIDHoverType {
1296 set { _PIDHoverType = value; }
1297 }
1298 public override float PIDHoverTau {
1299 set { _PIDHoverTau = value; }
1300 }
1301 // Based on current position, determine what we should be hovering at now.
1302 // Must recompute often. What if we walked offa cliff>
1303 private float ComputeCurrentPIDHoverHeight()
1304 {
1305 float ret = _PIDHoverHeight;
1306 float groundHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
1307
1308 switch (_PIDHoverType)
1309 {
1310 case PIDHoverType.Ground:
1311 ret = groundHeight + _PIDHoverHeight;
1312 break;
1313 case PIDHoverType.GroundAndWater:
1314 float waterHeight = PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
1315 if (groundHeight > waterHeight)
1316 {
1317 ret = groundHeight + _PIDHoverHeight;
1318 }
1319 else
1320 {
1321 ret = waterHeight + _PIDHoverHeight;
1322 }
1323 break;
1324 } 1122 }
1325 return ret;
1326 } 1123 }
1327 1124
1328
1329 // For RotLookAt
1330 public override OMV.Quaternion APIDTarget { set { return; } }
1331 public override bool APIDActive { set { return; } }
1332 public override float APIDStrength { set { return; } }
1333 public override float APIDDamping { set { return; } }
1334
1335 public override void AddForce(OMV.Vector3 force, bool pushforce) { 1125 public override void AddForce(OMV.Vector3 force, bool pushforce) {
1336 // Per documentation, max force is limited. 1126 // Per documentation, max force is limited.
1337 OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); 1127 OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
1338 1128
1339 // Since this force is being applied in only one step, make this a force per second. 1129 // Since this force is being applied in only one step, make this a force per second.
1340 addForce /= PhysicsScene.LastTimeStep; 1130 addForce /= PhysScene.LastTimeStep;
1341 AddForce(addForce, pushforce, false /* inTaintTime */); 1131 AddForce(addForce, pushforce, false /* inTaintTime */);
1342 } 1132 }
1343 1133
1344 // Applying a force just adds this to the total force on the object. 1134 // Applying a force just adds this to the total force on the object.
1345 // This added force will only last the next simulation tick. 1135 // This added force will only last the next simulation tick.
1346 public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { 1136 public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
1347 // for an object, doesn't matter if force is a pushforce or not 1137 // for an object, doesn't matter if force is a pushforce or not
1348 if (IsPhysicallyActive) 1138 if (IsPhysicallyActive)
1349 { 1139 {
@@ -1352,13 +1142,15 @@ public class BSPrim : BSPhysObject
1352 // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); 1142 // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce);
1353 1143
1354 OMV.Vector3 addForce = force; 1144 OMV.Vector3 addForce = force;
1355 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() 1145 PhysScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate()
1356 { 1146 {
1357 // Bullet adds this central force to the total force for this tick 1147 // Bullet adds this central force to the total force for this tick.
1148 // Deep down in Bullet:
1149 // linearVelocity += totalForce / mass * timeStep;
1358 DetailLog("{0},BSPrim.addForce,taint,force={1}", LocalID, addForce); 1150 DetailLog("{0},BSPrim.addForce,taint,force={1}", LocalID, addForce);
1359 if (PhysBody.HasPhysicalBody) 1151 if (PhysBody.HasPhysicalBody)
1360 { 1152 {
1361 PhysicsScene.PE.ApplyCentralForce(PhysBody, addForce); 1153 PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
1362 ActivateIfPhysical(false); 1154 ActivateIfPhysical(false);
1363 } 1155 }
1364 }); 1156 });
@@ -1380,13 +1172,13 @@ public class BSPrim : BSPhysObject
1380 OMV.Vector3 addImpulse = Util.ClampV(impulse, BSParam.MaxAddForceMagnitude); 1172 OMV.Vector3 addImpulse = Util.ClampV(impulse, BSParam.MaxAddForceMagnitude);
1381 // DetailLog("{0},BSPrim.addForceImpulse,call,impulse={1}", LocalID, impulse); 1173 // DetailLog("{0},BSPrim.addForceImpulse,call,impulse={1}", LocalID, impulse);
1382 1174
1383 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddImpulse", delegate() 1175 PhysScene.TaintedObject(inTaintTime, "BSPrim.AddImpulse", delegate()
1384 { 1176 {
1385 // Bullet adds this impulse immediately to the velocity 1177 // Bullet adds this impulse immediately to the velocity
1386 DetailLog("{0},BSPrim.addForceImpulse,taint,impulseforce={1}", LocalID, addImpulse); 1178 DetailLog("{0},BSPrim.addForceImpulse,taint,impulseforce={1}", LocalID, addImpulse);
1387 if (PhysBody.HasPhysicalBody) 1179 if (PhysBody.HasPhysicalBody)
1388 { 1180 {
1389 PhysicsScene.PE.ApplyCentralImpulse(PhysBody, addImpulse); 1181 PhysScene.PE.ApplyCentralImpulse(PhysBody, addImpulse);
1390 ActivateIfPhysical(false); 1182 ActivateIfPhysical(false);
1391 } 1183 }
1392 }); 1184 });
@@ -1399,20 +1191,18 @@ public class BSPrim : BSPhysObject
1399 } 1191 }
1400 } 1192 }
1401 1193
1402 public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { 1194 // BSPhysObject.AddAngularForce()
1403 AddAngularForce(force, pushforce, false); 1195 public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime)
1404 }
1405 public void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime)
1406 { 1196 {
1407 if (force.IsFinite()) 1197 if (force.IsFinite())
1408 { 1198 {
1409 OMV.Vector3 angForce = force; 1199 OMV.Vector3 angForce = force;
1410 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddAngularForce", delegate() 1200 PhysScene.TaintedObject(inTaintTime, "BSPrim.AddAngularForce", delegate()
1411 { 1201 {
1412 if (PhysBody.HasPhysicalBody) 1202 if (PhysBody.HasPhysicalBody)
1413 { 1203 {
1414 DetailLog("{0},BSPrim.AddAngularForce,taint,angForce={1}", LocalID, angForce); 1204 DetailLog("{0},BSPrim.AddAngularForce,taint,angForce={1}", LocalID, angForce);
1415 PhysicsScene.PE.ApplyTorque(PhysBody, angForce); 1205 PhysScene.PE.ApplyTorque(PhysBody, angForce);
1416 ActivateIfPhysical(false); 1206 ActivateIfPhysical(false);
1417 } 1207 }
1418 }); 1208 });
@@ -1431,11 +1221,11 @@ public class BSPrim : BSPhysObject
1431 public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime) 1221 public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime)
1432 { 1222 {
1433 OMV.Vector3 applyImpulse = impulse; 1223 OMV.Vector3 applyImpulse = impulse;
1434 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ApplyTorqueImpulse", delegate() 1224 PhysScene.TaintedObject(inTaintTime, "BSPrim.ApplyTorqueImpulse", delegate()
1435 { 1225 {
1436 if (PhysBody.HasPhysicalBody) 1226 if (PhysBody.HasPhysicalBody)
1437 { 1227 {
1438 PhysicsScene.PE.ApplyTorqueImpulse(PhysBody, applyImpulse); 1228 PhysScene.PE.ApplyTorqueImpulse(PhysBody, applyImpulse);
1439 ActivateIfPhysical(false); 1229 ActivateIfPhysical(false);
1440 } 1230 }
1441 }); 1231 });
@@ -1721,9 +1511,11 @@ public class BSPrim : BSPhysObject
1721 volume *= (profileEnd - profileBegin); 1511 volume *= (profileEnd - profileBegin);
1722 1512
1723 returnMass = Density * BSParam.DensityScaleFactor * volume; 1513 returnMass = Density * BSParam.DensityScaleFactor * volume;
1724 DetailLog("{0},BSPrim.CalculateMass,den={1},vol={2},mass={3}", LocalID, Density, volume, returnMass);
1725 1514
1726 returnMass = Util.Clamp(returnMass, BSParam.MinimumObjectMass, BSParam.MaximumObjectMass); 1515 returnMass = Util.Clamp(returnMass, BSParam.MinimumObjectMass, BSParam.MaximumObjectMass);
1516 // DetailLog("{0},BSPrim.CalculateMass,den={1},vol={2},mass={3}", LocalID, Density, volume, returnMass);
1517 DetailLog("{0},BSPrim.CalculateMass,den={1},vol={2},mass={3},pathB={4},pathE={5},profB={6},profE={7},siz={8}",
1518 LocalID, Density, volume, returnMass, pathBegin, pathEnd, profileBegin, profileEnd, _size);
1727 1519
1728 return returnMass; 1520 return returnMass;
1729 }// end CalculateMass 1521 }// end CalculateMass
@@ -1736,13 +1528,14 @@ public class BSPrim : BSPhysObject
1736 { 1528 {
1737 // Create the correct physical representation for this type of object. 1529 // Create the correct physical representation for this type of object.
1738 // Updates base.PhysBody and base.PhysShape with the new information. 1530 // Updates base.PhysBody and base.PhysShape with the new information.
1739 // Ignore 'forceRebuild'. This routine makes the right choices and changes of necessary. 1531 // Ignore 'forceRebuild'. 'GetBodyAndShape' makes the right choices and changes of necessary.
1740 PhysicsScene.Shapes.GetBodyAndShape(false /*forceRebuild */, PhysicsScene.World, this, null, delegate(BulletBody dBody) 1532 PhysScene.Shapes.GetBodyAndShape(false /*forceRebuild */, PhysScene.World, this, delegate(BulletBody pBody, BulletShape pShape)
1741 { 1533 {
1742 // Called if the current prim body is about to be destroyed. 1534 // Called if the current prim body is about to be destroyed.
1743 // Remove all the physical dependencies on the old body. 1535 // Remove all the physical dependencies on the old body.
1744 // (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...) 1536 // (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...)
1745 RemoveBodyDependencies(); 1537 // Note: this virtual function is overloaded by BSPrimLinkable to remove linkset constraints.
1538 RemoveDependencies();
1746 }); 1539 });
1747 1540
1748 // Make sure the properties are set on the new object 1541 // Make sure the properties are set on the new object
@@ -1750,33 +1543,74 @@ public class BSPrim : BSPhysObject
1750 return; 1543 return;
1751 } 1544 }
1752 1545
1753 protected virtual void RemoveBodyDependencies() 1546 // Called at taint-time
1547 protected virtual void RemoveDependencies()
1754 { 1548 {
1755 VehicleController.RemoveBodyDependencies(this); 1549 PhysicalActors.RemoveDependencies();
1550 }
1551
1552 #region Extension
1553 public override object Extension(string pFunct, params object[] pParams)
1554 {
1555 object ret = null;
1556 switch (pFunct)
1557 {
1558 case BSScene.PhysFunctGetLinksetType:
1559 {
1560 BSPrimLinkable myHandle = this as BSPrimLinkable;
1561 if (myHandle != null)
1562 {
1563 ret = (object)myHandle.LinksetType;
1564 }
1565 m_log.DebugFormat("{0} Extension.physGetLinksetType, type={1}", LogHeader, ret);
1566 break;
1567 }
1568 case BSScene.PhysFunctSetLinksetType:
1569 {
1570 if (pParams.Length > 0)
1571 {
1572 BSLinkset.LinksetImplementation linksetType = (BSLinkset.LinksetImplementation)pParams[0];
1573 BSPrimLinkable myHandle = this as BSPrimLinkable;
1574 if (myHandle != null && myHandle.Linkset.IsRoot(myHandle))
1575 {
1576 PhysScene.TaintedObject("BSPrim.PhysFunctSetLinksetType", delegate()
1577 {
1578 // Cause the linkset type to change
1579 m_log.DebugFormat("{0} Extension.physSetLinksetType, oldType={1}, newType={2}",
1580 LogHeader, myHandle.Linkset.LinksetImpl, linksetType);
1581 myHandle.ConvertLinkset(linksetType);
1582 });
1583 }
1584 ret = (object)(int)linksetType;
1585 }
1586 break;
1587 }
1588 default:
1589 ret = base.Extension(pFunct, pParams);
1590 break;
1591 }
1592 return ret;
1756 } 1593 }
1594 #endregion // Extension
1757 1595
1758 // The physics engine says that properties have updated. Update same and inform 1596 // The physics engine says that properties have updated. Update same and inform
1759 // the world that things have changed. 1597 // the world that things have changed.
1598 // NOTE: BSPrim.UpdateProperties is overloaded by BSPrimLinkable which modifies updates from root and children prims.
1599 // NOTE: BSPrim.UpdateProperties is overloaded by BSPrimDisplaced which handles mapping physical position to simulator position.
1760 public override void UpdateProperties(EntityProperties entprop) 1600 public override void UpdateProperties(EntityProperties entprop)
1761 { 1601 {
1602 // Let anyone (like the actors) modify the updated properties before they are pushed into the object and the simulator.
1762 TriggerPreUpdatePropertyAction(ref entprop); 1603 TriggerPreUpdatePropertyAction(ref entprop);
1763 1604
1764 // A temporary kludge to suppress the rotational effects introduced on vehicles by Bullet
1765 // TODO: handle physics introduced by Bullet with computed vehicle physics.
1766 if (VehicleController.IsActive)
1767 {
1768 entprop.RotationalVelocity = OMV.Vector3.Zero;
1769 }
1770
1771 // DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG 1605 // DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG
1772 1606
1773 // Assign directly to the local variables so the normal set actions do not happen 1607 // Assign directly to the local variables so the normal set actions do not happen
1774 _position = entprop.Position; 1608 RawPosition = entprop.Position;
1775 _orientation = entprop.Rotation; 1609 RawOrientation = entprop.Rotation;
1776 // DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be 1610 // DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be
1777 // very sensitive to velocity changes. 1611 // very sensitive to velocity changes.
1778 if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(_velocity, BSParam.UpdateVelocityChangeThreshold)) 1612 if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(RawVelocity, BSParam.UpdateVelocityChangeThreshold))
1779 _velocity = entprop.Velocity; 1613 RawVelocity = entprop.Velocity;
1780 _acceleration = entprop.Acceleration; 1614 _acceleration = entprop.Acceleration;
1781 _rotationalVelocity = entprop.RotationalVelocity; 1615 _rotationalVelocity = entprop.RotationalVelocity;
1782 1616
@@ -1785,29 +1619,20 @@ public class BSPrim : BSPhysObject
1785 // The sanity check can change the velocity and/or position. 1619 // The sanity check can change the velocity and/or position.
1786 if (PositionSanityCheck(true /* inTaintTime */ )) 1620 if (PositionSanityCheck(true /* inTaintTime */ ))
1787 { 1621 {
1788 entprop.Position = _position; 1622 entprop.Position = RawPosition;
1789 entprop.Velocity = _velocity; 1623 entprop.Velocity = RawVelocity;
1790 entprop.RotationalVelocity = _rotationalVelocity; 1624 entprop.RotationalVelocity = _rotationalVelocity;
1791 entprop.Acceleration = _acceleration; 1625 entprop.Acceleration = _acceleration;
1792 } 1626 }
1793 1627
1794 OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation; // DEBUG DEBUG DEBUG 1628 OMV.Vector3 direction = OMV.Vector3.UnitX * RawOrientation; // DEBUG DEBUG DEBUG
1795 DetailLog("{0},BSPrim.UpdateProperties,call,entProp={1},dir={2}", LocalID, entprop, direction); 1629 DetailLog("{0},BSPrim.UpdateProperties,call,entProp={1},dir={2}", LocalID, entprop, direction);
1796 1630
1797 // remember the current and last set values 1631 // remember the current and last set values
1798 LastEntityProperties = CurrentEntityProperties; 1632 LastEntityProperties = CurrentEntityProperties;
1799 CurrentEntityProperties = entprop; 1633 CurrentEntityProperties = entprop;
1800 1634
1801 base.RequestPhysicsterseUpdate(); 1635 PhysScene.PostUpdate(this);
1802 /*
1803 else
1804 {
1805 // For debugging, report the movement of children
1806 DetailLog("{0},BSPrim.UpdateProperties,child,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
1807 LocalID, entprop.Position, entprop.Rotation, entprop.Velocity,
1808 entprop.Acceleration, entprop.RotationalVelocity);
1809 }
1810 */
1811 } 1636 }
1812} 1637}
1813} 1638}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
index f1c3b5c..2eb1440 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
@@ -23,11 +23,6 @@
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 * The quotations from http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial
28 * are Copyright (c) 2009 Linden Research, Inc and are used under their license
29 * of Creative Commons Attribution-Share Alike 3.0
30 * (http://creativecommons.org/licenses/by-sa/3.0/).
31 */ 26 */
32 27
33using System; 28using System;
@@ -44,14 +39,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
44{ 39{
45public class BSPrimDisplaced : BSPrim 40public class BSPrimDisplaced : BSPrim
46{ 41{
47 // The purpose of this module is to do any mapping between what the simulator thinks 42 // The purpose of this subclass is to do any mapping between what the simulator thinks
48 // the prim position and orientation is and what the physical position/orientation. 43 // the prim position and orientation is and what the physical position/orientation.
49 // This difference happens because Bullet assumes the center-of-mass is the <0,0,0> 44 // This difference happens because Bullet assumes the center-of-mass is the <0,0,0>
50 // of the prim/linkset. The simulator tracks the location of the prim/linkset by 45 // of the prim/linkset. The simulator, on the other hand, tracks the location of
51 // the location of the root prim. So, if center-of-mass is anywhere but the origin 46 // the prim/linkset by the location of the root prim. So, if center-of-mass is anywhere
52 // of the root prim, the physical origin is displaced from the simulator origin. 47 // but the origin of the root prim, the physical origin is displaced from the simulator origin.
53 // 48 //
54 // This routine works by capturing the Force* setting of position/orientation/... and 49 // This routine works by capturing ForcePosition and
55 // adjusting the simulator values (being set) into the physical values. 50 // adjusting the simulator values (being set) into the physical values.
56 // The conversion is also done in the opposite direction (physical origin -> simulator origin). 51 // The conversion is also done in the opposite direction (physical origin -> simulator origin).
57 // 52 //
@@ -59,8 +54,8 @@ public class BSPrimDisplaced : BSPrim
59 // are converted into simulator origin values before being passed to the base 54 // are converted into simulator origin values before being passed to the base
60 // class. 55 // class.
61 56
57 // PositionDisplacement is the vehicle relative distance from the root prim position to the center-of-mass.
62 public virtual OMV.Vector3 PositionDisplacement { get; set; } 58 public virtual OMV.Vector3 PositionDisplacement { get; set; }
63 public virtual OMV.Quaternion OrientationDisplacement { get; set; }
64 59
65 public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, 60 public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
66 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 61 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
@@ -69,68 +64,96 @@ public class BSPrimDisplaced : BSPrim
69 ClearDisplacement(); 64 ClearDisplacement();
70 } 65 }
71 66
67 // Clears any center-of-mass displacement introduced by linksets, etc.
68 // Does not clear the displacement set by the user.
72 public void ClearDisplacement() 69 public void ClearDisplacement()
73 { 70 {
74 PositionDisplacement = OMV.Vector3.Zero; 71 if (UserSetCenterOfMassDisplacement.HasValue)
75 OrientationDisplacement = OMV.Quaternion.Identity; 72 PositionDisplacement = (OMV.Vector3)UserSetCenterOfMassDisplacement;
73 else
74 PositionDisplacement = OMV.Vector3.Zero;
76 } 75 }
77 76
78 // Set this sets and computes the displacement from the passed prim to the center-of-mass. 77 // Set this sets and computes the displacement from the passed prim to the center-of-mass.
79 // A user set value for center-of-mass overrides whatever might be passed in here. 78 // A user set value for center-of-mass overrides whatever might be passed in here.
80 // The displacement is in local coordinates (relative to root prim in linkset oriented coordinates). 79 // The displacement is in local coordinates (relative to root prim in linkset oriented coordinates).
81 public virtual void SetEffectiveCenterOfMassW(Vector3 centerOfMassDisplacement) 80 // Returns the relative offset from the root position to the center-of-mass.
81 // Called at taint time.
82 public virtual Vector3 SetEffectiveCenterOfMassDisplacement(Vector3 centerOfMassDisplacement)
82 { 83 {
84 PhysScene.AssertInTaintTime("BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement");
83 Vector3 comDisp; 85 Vector3 comDisp;
84 if (UserSetCenterOfMass.HasValue) 86 if (UserSetCenterOfMassDisplacement.HasValue)
85 comDisp = (OMV.Vector3)UserSetCenterOfMass; 87 comDisp = (OMV.Vector3)UserSetCenterOfMassDisplacement;
86 else 88 else
87 comDisp = centerOfMassDisplacement; 89 comDisp = centerOfMassDisplacement;
88 90
89 if (comDisp == Vector3.Zero) 91 // Eliminate any jitter caused be very slight differences in masses and positions
90 { 92 if (comDisp.ApproxEquals(Vector3.Zero, 0.01f) )
91 // If there is no diplacement. Things get reset. 93 comDisp = Vector3.Zero;
92 PositionDisplacement = OMV.Vector3.Zero; 94
93 OrientationDisplacement = OMV.Quaternion.Identity; 95 DetailLog("{0},BSPrimDisplaced.SetEffectiveCenterOfMassDisplacement,userSet={1},comDisp={2}",
94 } 96 LocalID, UserSetCenterOfMassDisplacement.HasValue, comDisp);
95 else 97 if ( !comDisp.ApproxEquals(PositionDisplacement, 0.01f) )
96 { 98 {
97 // Remember the displacement from root as well as the origional rotation of the 99 // Displacement setting is changing.
98 // new center-of-mass. 100 // The relationship between the physical object and simulated object must be aligned.
99 PositionDisplacement = comDisp; 101 PositionDisplacement = comDisp;
100 OrientationDisplacement = OMV.Quaternion.Identity; 102 this.ForcePosition = RawPosition;
101 } 103 }
104
105 return PositionDisplacement;
102 } 106 }
103 107
108 // 'ForcePosition' is the one way to set the physical position of the body in the physics engine.
109 // Displace the simulator idea of position (center of root prim) to the physical position.
104 public override Vector3 ForcePosition 110 public override Vector3 ForcePosition
105 { 111 {
106 get { return base.ForcePosition; } 112 get {
113 OMV.Vector3 physPosition = PhysScene.PE.GetPosition(PhysBody);
114 if (PositionDisplacement != OMV.Vector3.Zero)
115 {
116 // If there is some displacement, return the physical position (center-of-mass)
117 // location minus the displacement to give the center of the root prim.
118 OMV.Vector3 displacement = PositionDisplacement * ForceOrientation;
119 DetailLog("{0},BSPrimDisplaced.ForcePosition,get,physPos={1},disp={2},simPos={3}",
120 LocalID, physPosition, displacement, physPosition - displacement);
121 physPosition -= displacement;
122 }
123 RawPosition = physPosition;
124 return physPosition;
125 }
107 set 126 set
108 { 127 {
109 if (PositionDisplacement != OMV.Vector3.Zero) 128 if (PositionDisplacement != OMV.Vector3.Zero)
110 base.ForcePosition = value - (PositionDisplacement * RawOrientation); 129 {
130 // This value is the simulator's idea of where the prim is: the center of the root prim
131 RawPosition = value;
132
133 // Move the passed root prim postion to the center-of-mass position and set in the physics engine.
134 OMV.Vector3 displacement = PositionDisplacement * RawOrientation;
135 OMV.Vector3 displacedPos = RawPosition + displacement;
136 DetailLog("{0},BSPrimDisplaced.ForcePosition,set,simPos={1},disp={2},physPos={3}",
137 LocalID, RawPosition, displacement, displacedPos);
138 if (PhysBody.HasPhysicalBody)
139 {
140 PhysScene.PE.SetTranslation(PhysBody, displacedPos, RawOrientation);
141 ActivateIfPhysical(false);
142 }
143 }
111 else 144 else
145 {
112 base.ForcePosition = value; 146 base.ForcePosition = value;
147 }
113 } 148 }
114 } 149 }
115 150
116 public override Quaternion ForceOrientation 151 // These are also overridden by BSPrimLinkable if the prim can be part of a linkset
117 {
118 get { return base.ForceOrientation; }
119 set
120 {
121 base.ForceOrientation = value;
122 }
123 }
124
125 // TODO: decide if this is the right place for these variables.
126 // Somehow incorporate the optional settability by the user.
127 // Is this used?
128 public override OMV.Vector3 CenterOfMass 152 public override OMV.Vector3 CenterOfMass
129 { 153 {
130 get { return RawPosition; } 154 get { return RawPosition; }
131 } 155 }
132 156
133 // Is this used?
134 public override OMV.Vector3 GeometricCenter 157 public override OMV.Vector3 GeometricCenter
135 { 158 {
136 get { return RawPosition; } 159 get { return RawPosition; }
@@ -139,12 +162,18 @@ public class BSPrimDisplaced : BSPrim
139 public override void UpdateProperties(EntityProperties entprop) 162 public override void UpdateProperties(EntityProperties entprop)
140 { 163 {
141 // Undo any center-of-mass displacement that might have been done. 164 // Undo any center-of-mass displacement that might have been done.
142 if (PositionDisplacement != OMV.Vector3.Zero || OrientationDisplacement != OMV.Quaternion.Identity) 165 if (PositionDisplacement != OMV.Vector3.Zero)
143 { 166 {
144 // Correct for any rotation around the center-of-mass 167 // The origional shape was offset from 'zero' by PositionDisplacement.
145 // TODO!!! 168 // These physical location must be back converted to be centered around the displaced
146 entprop.Position = entprop.Position + (PositionDisplacement * entprop.Rotation); 169 // root shape.
147 // entprop.Rotation = something; 170
171 // Move the returned center-of-mass location to the root prim location.
172 OMV.Vector3 displacement = PositionDisplacement * entprop.Rotation;
173 OMV.Vector3 displacedPos = entprop.Position - displacement;
174 DetailLog("{0},BSPrimDisplaced.UpdateProperties,physPos={1},disp={2},simPos={3}",
175 LocalID, entprop.Position, displacement, displacedPos);
176 entprop.Position = displacedPos;
148 } 177 }
149 178
150 base.UpdateProperties(entprop); 179 base.UpdateProperties(entprop);
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
index d65d407..7179a6d 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
@@ -37,19 +37,28 @@ namespace OpenSim.Region.Physics.BulletSPlugin
37{ 37{
38public class BSPrimLinkable : BSPrimDisplaced 38public class BSPrimLinkable : BSPrimDisplaced
39{ 39{
40 // The purpose of this subclass is to add linkset functionality to the prim. This overrides
41 // operations necessary for keeping the linkset created and, additionally, this
42 // calls the linkset implementation for its creation and management.
43
44 // This adds the overrides for link() and delink() so the prim is linkable.
45
40 public BSLinkset Linkset { get; set; } 46 public BSLinkset Linkset { get; set; }
41 // The index of this child prim. 47 // The index of this child prim.
42 public int LinksetChildIndex { get; set; } 48 public int LinksetChildIndex { get; set; }
43 49
44 public BSLinksetInfo LinksetInfo { get; set; } 50 public BSLinkset.LinksetImplementation LinksetType { get; set; }
45 51
46 public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, 52 public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
47 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 53 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
48 : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical) 54 : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)
49 { 55 {
50 Linkset = BSLinkset.Factory(PhysicsScene, this); 56 // Default linkset implementation for this prim
57 LinksetType = (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation;
58
59 Linkset = BSLinkset.Factory(PhysScene, this);
51 60
52 PhysicsScene.TaintedObject("BSPrimLinksetCompound.Refresh", delegate() 61 PhysScene.TaintedObject("BSPrimLinksetCompound.Refresh", delegate()
53 { 62 {
54 Linkset.Refresh(this); 63 Linkset.Refresh(this);
55 }); 64 });
@@ -61,16 +70,13 @@ public class BSPrimLinkable : BSPrimDisplaced
61 base.Destroy(); 70 base.Destroy();
62 } 71 }
63 72
64 public override BSPhysicsShapeType PreferredPhysicalShape
65 { get { return Linkset.PreferredPhysicalShape(this); } }
66
67 public override void link(Manager.PhysicsActor obj) 73 public override void link(Manager.PhysicsActor obj)
68 { 74 {
69 BSPrimLinkable parent = obj as BSPrimLinkable; 75 BSPrimLinkable parent = obj as BSPrimLinkable;
70 if (parent != null) 76 if (parent != null)
71 { 77 {
72 BSPhysObject parentBefore = Linkset.LinksetRoot; 78 BSPhysObject parentBefore = Linkset.LinksetRoot; // DEBUG
73 int childrenBefore = Linkset.NumberOfChildren; 79 int childrenBefore = Linkset.NumberOfChildren; // DEBUG
74 80
75 Linkset = parent.Linkset.AddMeToLinkset(this); 81 Linkset = parent.Linkset.AddMeToLinkset(this);
76 82
@@ -85,8 +91,8 @@ public class BSPrimLinkable : BSPrimDisplaced
85 // TODO: decide if this parent checking needs to happen at taint time 91 // TODO: decide if this parent checking needs to happen at taint time
86 // Race condition here: if link() and delink() in same simulation tick, the delink will not happen 92 // Race condition here: if link() and delink() in same simulation tick, the delink will not happen
87 93
88 BSPhysObject parentBefore = Linkset.LinksetRoot; 94 BSPhysObject parentBefore = Linkset.LinksetRoot; // DEBUG
89 int childrenBefore = Linkset.NumberOfChildren; 95 int childrenBefore = Linkset.NumberOfChildren; // DEBUG
90 96
91 Linkset = Linkset.RemoveMeFromLinkset(this); 97 Linkset = Linkset.RemoveMeFromLinkset(this);
92 98
@@ -102,7 +108,7 @@ public class BSPrimLinkable : BSPrimDisplaced
102 set 108 set
103 { 109 {
104 base.Position = value; 110 base.Position = value;
105 PhysicsScene.TaintedObject("BSPrimLinkset.setPosition", delegate() 111 PhysScene.TaintedObject("BSPrimLinkset.setPosition", delegate()
106 { 112 {
107 Linkset.UpdateProperties(UpdatedProperties.Position, this); 113 Linkset.UpdateProperties(UpdatedProperties.Position, this);
108 }); 114 });
@@ -116,7 +122,7 @@ public class BSPrimLinkable : BSPrimDisplaced
116 set 122 set
117 { 123 {
118 base.Orientation = value; 124 base.Orientation = value;
119 PhysicsScene.TaintedObject("BSPrimLinkset.setOrientation", delegate() 125 PhysScene.TaintedObject("BSPrimLinkset.setOrientation", delegate()
120 { 126 {
121 Linkset.UpdateProperties(UpdatedProperties.Orientation, this); 127 Linkset.UpdateProperties(UpdatedProperties.Orientation, this);
122 }); 128 });
@@ -128,6 +134,17 @@ public class BSPrimLinkable : BSPrimDisplaced
128 get { return Linkset.LinksetMass; } 134 get { return Linkset.LinksetMass; }
129 } 135 }
130 136
137 public override OMV.Vector3 CenterOfMass
138 {
139 get { return Linkset.CenterOfMass; }
140 }
141
142 public override OMV.Vector3 GeometricCenter
143 {
144 get { return Linkset.GeometricCenter; }
145 }
146
147 // Refresh the linkset structure and parameters when the prim's physical parameters are changed.
131 public override void UpdatePhysicalParameters() 148 public override void UpdatePhysicalParameters()
132 { 149 {
133 base.UpdatePhysicalParameters(); 150 base.UpdatePhysicalParameters();
@@ -139,22 +156,28 @@ public class BSPrimLinkable : BSPrimDisplaced
139 Linkset.Refresh(this); 156 Linkset.Refresh(this);
140 } 157 }
141 158
159 // When the prim is made dynamic or static, the linkset needs to change.
142 protected override void MakeDynamic(bool makeStatic) 160 protected override void MakeDynamic(bool makeStatic)
143 { 161 {
144 base.MakeDynamic(makeStatic); 162 base.MakeDynamic(makeStatic);
145 if (makeStatic) 163 if (Linkset != null) // null can happen during initialization
146 Linkset.MakeStatic(this); 164 {
147 else 165 if (makeStatic)
148 Linkset.MakeDynamic(this); 166 Linkset.MakeStatic(this);
167 else
168 Linkset.MakeDynamic(this);
169 }
149 } 170 }
150 171
151 // Body is being taken apart. Remove physical dependencies and schedule a rebuild. 172 // Body is being taken apart. Remove physical dependencies and schedule a rebuild.
152 protected override void RemoveBodyDependencies() 173 protected override void RemoveDependencies()
153 { 174 {
154 Linkset.RemoveBodyDependencies(this); 175 Linkset.RemoveDependencies(this);
155 base.RemoveBodyDependencies(); 176 base.RemoveDependencies();
156 } 177 }
157 178
179 // Called after a simulation step for the changes in physical object properties.
180 // Do any filtering/modification needed for linksets.
158 public override void UpdateProperties(EntityProperties entprop) 181 public override void UpdateProperties(EntityProperties entprop)
159 { 182 {
160 if (Linkset.IsRoot(this)) 183 if (Linkset.IsRoot(this))
@@ -163,20 +186,93 @@ public class BSPrimLinkable : BSPrimDisplaced
163 // TODO: this will have to change when linksets are articulated. 186 // TODO: this will have to change when linksets are articulated.
164 base.UpdateProperties(entprop); 187 base.UpdateProperties(entprop);
165 } 188 }
189 /*
190 else
191 {
192 // For debugging, report the movement of children
193 DetailLog("{0},BSPrim.UpdateProperties,child,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
194 LocalID, entprop.Position, entprop.Rotation, entprop.Velocity,
195 entprop.Acceleration, entprop.RotationalVelocity);
196 }
197 */
166 // The linkset might like to know about changing locations 198 // The linkset might like to know about changing locations
167 Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); 199 Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
168 } 200 }
169 201
202 // Called after a simulation step to post a collision with this object.
203 // This returns 'true' if the collision has been queued and the SendCollisions call must
204 // be made at the end of the simulation step.
170 public override bool Collide(uint collidingWith, BSPhysObject collidee, 205 public override bool Collide(uint collidingWith, BSPhysObject collidee,
171 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) 206 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
172 { 207 {
173 // prims in the same linkset cannot collide with each other 208 bool ret = false;
174 BSPrimLinkable convCollidee = collidee as BSPrimLinkable; 209 // Ask the linkset if it wants to handle the collision
175 if (convCollidee != null && (this.Linkset.LinksetID == convCollidee.Linkset.LinksetID)) 210 if (!Linkset.HandleCollide(collidingWith, collidee, contactPoint, contactNormal, pentrationDepth))
211 {
212 // The linkset didn't handle it so pass the collision through normal processing
213 ret = base.Collide(collidingWith, collidee, contactPoint, contactNormal, pentrationDepth);
214 }
215 return ret;
216 }
217
218 // A linkset reports any collision on any part of the linkset.
219 public long SomeCollisionSimulationStep = 0;
220 public override bool HasSomeCollision
221 {
222 get
223 {
224 return (SomeCollisionSimulationStep == PhysScene.SimulationStep) || base.IsColliding;
225 }
226 set
227 {
228 if (value)
229 SomeCollisionSimulationStep = PhysScene.SimulationStep;
230 else
231 SomeCollisionSimulationStep = 0;
232
233 base.HasSomeCollision = value;
234 }
235 }
236
237 // Convert the existing linkset of this prim into a new type.
238 public bool ConvertLinkset(BSLinkset.LinksetImplementation newType)
239 {
240 bool ret = false;
241 if (LinksetType != newType)
176 { 242 {
177 return false; 243 // Set the implementation type first so the call to BSLinkset.Factory gets the new type.
244 this.LinksetType = newType;
245
246 BSLinkset oldLinkset = this.Linkset;
247 BSLinkset newLinkset = BSLinkset.Factory(PhysScene, this);
248
249 this.Linkset = newLinkset;
250
251 // Pick up any physical dependencies this linkset might have in the physics engine.
252 oldLinkset.RemoveDependencies(this);
253
254 // Create a list of the children (mainly because can't interate through a list that's changing)
255 List<BSPrimLinkable> children = new List<BSPrimLinkable>();
256 oldLinkset.ForEachMember((child) =>
257 {
258 if (!oldLinkset.IsRoot(child))
259 children.Add(child);
260 return false; // 'false' says to continue to next member
261 });
262
263 // Remove the children from the old linkset and add to the new (will be a new instance from the factory)
264 foreach (BSPrimLinkable child in children)
265 {
266 oldLinkset.RemoveMeFromLinkset(child);
267 newLinkset.AddMeToLinkset(child);
268 child.Linkset = newLinkset;
269 }
270
271 // Force the shape and linkset to get reconstructed
272 newLinkset.Refresh(this);
273 this.ForceBodyShapeRebuild(true /* inTaintTime */);
178 } 274 }
179 return base.Collide(collidingWith, collidee, contactPoint, contactNormal, pentrationDepth); 275 return ret;
180 } 276 }
181} 277}
182} 278}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index e6aefd5..c92c9b9 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -56,12 +56,23 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
56 public string BulletEngineName { get; private set; } 56 public string BulletEngineName { get; private set; }
57 public BSAPITemplate PE; 57 public BSAPITemplate PE;
58 58
59 // If the physics engine is running on a separate thread
60 public Thread m_physicsThread;
61
59 public Dictionary<uint, BSPhysObject> PhysObjects; 62 public Dictionary<uint, BSPhysObject> PhysObjects;
60 public BSShapeCollection Shapes; 63 public BSShapeCollection Shapes;
61 64
62 // Keeping track of the objects with collisions so we can report begin and end of a collision 65 // Keeping track of the objects with collisions so we can report begin and end of a collision
63 public HashSet<BSPhysObject> ObjectsWithCollisions = new HashSet<BSPhysObject>(); 66 public HashSet<BSPhysObject> ObjectsWithCollisions = new HashSet<BSPhysObject>();
64 public HashSet<BSPhysObject> ObjectsWithNoMoreCollisions = new HashSet<BSPhysObject>(); 67 public HashSet<BSPhysObject> ObjectsWithNoMoreCollisions = new HashSet<BSPhysObject>();
68
69 // All the collision processing is protected with this lock object
70 public Object CollisionLock = new Object();
71
72 // Properties are updated here
73 public Object UpdateLock = new Object();
74 public HashSet<BSPhysObject> ObjectsWithUpdates = new HashSet<BSPhysObject>();
75
65 // Keep track of all the avatars so we can send them a collision event 76 // Keep track of all the avatars so we can send them a collision event
66 // every tick so OpenSim will update its animation. 77 // every tick so OpenSim will update its animation.
67 private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>(); 78 private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>();
@@ -77,12 +88,22 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
77 public BSConstraintCollection Constraints { get; private set; } 88 public BSConstraintCollection Constraints { get; private set; }
78 89
79 // Simulation parameters 90 // Simulation parameters
91 internal float m_physicsStepTime; // if running independently, the interval simulated by default
92
80 internal int m_maxSubSteps; 93 internal int m_maxSubSteps;
81 internal float m_fixedTimeStep; 94 internal float m_fixedTimeStep;
82 internal long m_simulationStep = 0; 95
83 internal float NominalFrameRate { get; set; } 96 internal float m_simulatedTime; // the time simulated previously. Used for physics framerate calc.
97
98 internal long m_simulationStep = 0; // The current simulation step.
84 public long SimulationStep { get { return m_simulationStep; } } 99 public long SimulationStep { get { return m_simulationStep; } }
85 internal float LastTimeStep { get; private set; } 100 // A number to use for SimulationStep that is probably not any step value
101 // Used by the collision code (which remembers the step when a collision happens) to remember not any simulation step.
102 public static long NotASimulationStep = -1234;
103
104 internal float LastTimeStep { get; private set; } // The simulation time from the last invocation of Simulate()
105
106 internal float NominalFrameRate { get; set; } // Parameterized ideal frame rate that simulation is scaled to
86 107
87 // Physical objects can register for prestep or poststep events 108 // Physical objects can register for prestep or poststep events
88 public delegate void PreStepAction(float timeStep); 109 public delegate void PreStepAction(float timeStep);
@@ -90,7 +111,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
90 public event PreStepAction BeforeStep; 111 public event PreStepAction BeforeStep;
91 public event PostStepAction AfterStep; 112 public event PostStepAction AfterStep;
92 113
93 // A value of the time now so all the collision and update routines do not have to get their own 114 // A value of the time 'now' so all the collision and update routines do not have to get their own
94 // Set to 'now' just before all the prims and actors are called for collisions and updates 115 // Set to 'now' just before all the prims and actors are called for collisions and updates
95 public int SimulationNowTime { get; private set; } 116 public int SimulationNowTime { get; private set; }
96 117
@@ -188,6 +209,9 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
188 PhysObjects = new Dictionary<uint, BSPhysObject>(); 209 PhysObjects = new Dictionary<uint, BSPhysObject>();
189 Shapes = new BSShapeCollection(this); 210 Shapes = new BSShapeCollection(this);
190 211
212 m_simulatedTime = 0f;
213 LastTimeStep = 0.1f;
214
191 // Allocate pinned memory to pass parameters. 215 // Allocate pinned memory to pass parameters.
192 UnmanagedParams = new ConfigurationParameters[1]; 216 UnmanagedParams = new ConfigurationParameters[1];
193 217
@@ -202,8 +226,8 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
202 // can be left in and every call doesn't have to check for null. 226 // can be left in and every call doesn't have to check for null.
203 if (m_physicsLoggingEnabled) 227 if (m_physicsLoggingEnabled)
204 { 228 {
205 PhysicsLogging = new Logging.LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes); 229 PhysicsLogging = new Logging.LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes, m_physicsLoggingDoFlush);
206 PhysicsLogging.ErrorLogger = m_log; // for DEBUG. Let's the logger output error messages. 230 PhysicsLogging.ErrorLogger = m_log; // for DEBUG. Let's the logger output its own error messages.
207 } 231 }
208 else 232 else
209 { 233 {
@@ -227,10 +251,20 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
227 TerrainManager = new BSTerrainManager(this); 251 TerrainManager = new BSTerrainManager(this);
228 TerrainManager.CreateInitialGroundPlaneAndTerrain(); 252 TerrainManager.CreateInitialGroundPlaneAndTerrain();
229 253
230 m_log.WarnFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation); 254 // Put some informational messages into the log file.
255 m_log.InfoFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation);
231 256
232 InTaintTime = false; 257 InTaintTime = false;
233 m_initialized = true; 258 m_initialized = true;
259
260 // If the physics engine runs on its own thread, start same.
261 if (BSParam.UseSeparatePhysicsThread)
262 {
263 // The physics simulation should happen independently of the heartbeat loop
264 m_physicsThread = new Thread(BulletSPluginPhysicsThread);
265 m_physicsThread.Name = BulletEngineName;
266 m_physicsThread.Start();
267 }
234 } 268 }
235 269
236 // All default parameter values are set here. There should be no values set in the 270 // All default parameter values are set here. There should be no values set in the
@@ -268,6 +302,13 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
268 // Do any replacements in the parameters 302 // Do any replacements in the parameters
269 m_physicsLoggingPrefix = m_physicsLoggingPrefix.Replace("%REGIONNAME%", RegionName); 303 m_physicsLoggingPrefix = m_physicsLoggingPrefix.Replace("%REGIONNAME%", RegionName);
270 } 304 }
305 else
306 {
307 // Nothing in the configuration INI file so assume unmanaged and other defaults.
308 BulletEngineName = "BulletUnmanaged";
309 m_physicsLoggingEnabled = false;
310 VehicleLoggingEnabled = false;
311 }
271 312
272 // The material characteristics. 313 // The material characteristics.
273 BSMaterials.InitializeFromDefaults(Params); 314 BSMaterials.InitializeFromDefaults(Params);
@@ -311,11 +352,22 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
311 352
312 switch (selectionName) 353 switch (selectionName)
313 { 354 {
355 case "bullet":
314 case "bulletunmanaged": 356 case "bulletunmanaged":
315 ret = new BSAPIUnman(engineName, this); 357 ret = new BSAPIUnman(engineName, this);
316 break; 358 break;
317 case "bulletxna": 359 case "bulletxna":
318 ret = new BSAPIXNA(engineName, this); 360 ret = new BSAPIXNA(engineName, this);
361 // Disable some features that are not implemented in BulletXNA
362 m_log.InfoFormat("{0} Disabling some physics features not implemented by BulletXNA", LogHeader);
363 m_log.InfoFormat("{0} Disabling ShouldUseBulletHACD", LogHeader);
364 BSParam.ShouldUseBulletHACD = false;
365 m_log.InfoFormat("{0} Disabling ShouldUseSingleConvexHullForPrims", LogHeader);
366 BSParam.ShouldUseSingleConvexHullForPrims = false;
367 m_log.InfoFormat("{0} Disabling ShouldUseGImpactShapeForPrims", LogHeader);
368 BSParam.ShouldUseGImpactShapeForPrims = false;
369 m_log.InfoFormat("{0} Setting terrain implimentation to Heightmap", LogHeader);
370 BSParam.TerrainImplementation = (float)BSTerrainPhys.TerrainImplementation.Heightmap;
319 break; 371 break;
320 } 372 }
321 373
@@ -325,7 +377,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
325 } 377 }
326 else 378 else
327 { 379 {
328 m_log.WarnFormat("{0} Selected bullet engine {1} -> {2}/{3}", LogHeader, engineName, ret.BulletEngineName, ret.BulletEngineVersion); 380 m_log.InfoFormat("{0} Selected bullet engine {1} -> {2}/{3}", LogHeader, engineName, ret.BulletEngineName, ret.BulletEngineVersion);
329 } 381 }
330 382
331 return ret; 383 return ret;
@@ -463,7 +515,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
463 515
464 if (!m_initialized) return null; 516 if (!m_initialized) return null;
465 517
466 DetailLog("{0},BSScene.AddPrimShape,call", localID); 518 // DetailLog("{0},BSScene.AddPrimShape,call", localID);
467 519
468 BSPhysObject prim = new BSPrimLinkable(localID, primName, this, position, size, rotation, pbs, isPhysical); 520 BSPhysObject prim = new BSPrimLinkable(localID, primName, this, position, size, rotation, pbs, isPhysical);
469 lock (PhysObjects) PhysObjects.Add(localID, prim); 521 lock (PhysObjects) PhysObjects.Add(localID, prim);
@@ -478,25 +530,41 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
478 #endregion // Prim and Avatar addition and removal 530 #endregion // Prim and Avatar addition and removal
479 531
480 #region Simulation 532 #region Simulation
481 // Simulate one timestep 533
534 // Call from the simulator to send physics information to the simulator objects.
535 // This pushes all the collision and property update events into the objects in
536 // the simulator and, since it is on the heartbeat thread, there is an implicit
537 // locking of those data structures from other heartbeat events.
538 // If the physics engine is running on a separate thread, the update information
539 // will be in the ObjectsWithCollions and ObjectsWithUpdates structures.
482 public override float Simulate(float timeStep) 540 public override float Simulate(float timeStep)
483 { 541 {
542 if (!BSParam.UseSeparatePhysicsThread)
543 {
544 DoPhysicsStep(timeStep);
545 }
546 return SendUpdatesToSimulator(timeStep);
547 }
548
549 // Call the physics engine to do one 'timeStep' and collect collisions and updates
550 // into ObjectsWithCollisions and ObjectsWithUpdates data structures.
551 private void DoPhysicsStep(float timeStep)
552 {
484 // prevent simulation until we've been initialized 553 // prevent simulation until we've been initialized
485 if (!m_initialized) return 5.0f; 554 if (!m_initialized) return;
486 555
487 LastTimeStep = timeStep; 556 LastTimeStep = timeStep;
488 557
489 int updatedEntityCount = 0; 558 int updatedEntityCount = 0;
490 int collidersCount = 0; 559 int collidersCount = 0;
491 560
492 int beforeTime = 0; 561 int beforeTime = Util.EnvironmentTickCount();
493 int simTime = 0; 562 int simTime = 0;
494 563
495 // update the prim states while we know the physics engine is not busy
496 int numTaints = _taintOperations.Count; 564 int numTaints = _taintOperations.Count;
497
498 InTaintTime = true; // Only used for debugging so locking is not necessary. 565 InTaintTime = true; // Only used for debugging so locking is not necessary.
499 566
567 // update the prim states while we know the physics engine is not busy
500 ProcessTaints(); 568 ProcessTaints();
501 569
502 // Some of the physical objects requre individual, pre-step calls 570 // Some of the physical objects requre individual, pre-step calls
@@ -519,18 +587,8 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
519 int numSubSteps = 0; 587 int numSubSteps = 0;
520 try 588 try
521 { 589 {
522 if (PhysicsLogging.Enabled)
523 beforeTime = Util.EnvironmentTickCount();
524
525 numSubSteps = PE.PhysicsStep(World, timeStep, m_maxSubSteps, m_fixedTimeStep, out updatedEntityCount, out collidersCount); 590 numSubSteps = PE.PhysicsStep(World, timeStep, m_maxSubSteps, m_fixedTimeStep, out updatedEntityCount, out collidersCount);
526 591
527 if (PhysicsLogging.Enabled)
528 {
529 simTime = Util.EnvironmentTickCountSubtract(beforeTime);
530 DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}",
531 DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps,
532 updatedEntityCount, collidersCount, ObjectsWithCollisions.Count);
533 }
534 } 592 }
535 catch (Exception e) 593 catch (Exception e)
536 { 594 {
@@ -542,77 +600,63 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
542 collidersCount = 0; 600 collidersCount = 0;
543 } 601 }
544 602
603 // Make the physics engine dump useful statistics periodically
545 if (PhysicsMetricDumpFrames != 0 && ((m_simulationStep % PhysicsMetricDumpFrames) == 0)) 604 if (PhysicsMetricDumpFrames != 0 && ((m_simulationStep % PhysicsMetricDumpFrames) == 0))
546 PE.DumpPhysicsStatistics(World); 605 PE.DumpPhysicsStatistics(World);
547 606
548 // Get a value for 'now' so all the collision and update routines don't have to get their own. 607 // Get a value for 'now' so all the collision and update routines don't have to get their own.
549 SimulationNowTime = Util.EnvironmentTickCount(); 608 SimulationNowTime = Util.EnvironmentTickCount();
550 609
551 // If there were collisions, process them by sending the event to the prim. 610 // Send collision information to the colliding objects. The objects decide if the collision
552 // Collisions must be processed before updates. 611 // is 'real' (like linksets don't collide with themselves) and the individual objects
553 if (collidersCount > 0) 612 // know if the simulator has subscribed to collisions.
613 lock (CollisionLock)
554 { 614 {
555 for (int ii = 0; ii < collidersCount; ii++) 615 if (collidersCount > 0)
556 { 616 {
557 uint cA = m_collisionArray[ii].aID; 617 for (int ii = 0; ii < collidersCount; ii++)
558 uint cB = m_collisionArray[ii].bID;
559 Vector3 point = m_collisionArray[ii].point;
560 Vector3 normal = m_collisionArray[ii].normal;
561 float penetration = m_collisionArray[ii].penetration;
562 SendCollision(cA, cB, point, normal, penetration);
563 SendCollision(cB, cA, point, -normal, penetration);
564 }
565 }
566
567 // The above SendCollision's batch up the collisions on the objects.
568 // Now push the collisions into the simulator.
569 if (ObjectsWithCollisions.Count > 0)
570 {
571 foreach (BSPhysObject bsp in ObjectsWithCollisions)
572 if (!bsp.SendCollisions())
573 { 618 {
574 // If the object is done colliding, see that it's removed from the colliding list 619 uint cA = m_collisionArray[ii].aID;
575 ObjectsWithNoMoreCollisions.Add(bsp); 620 uint cB = m_collisionArray[ii].bID;
621 Vector3 point = m_collisionArray[ii].point;
622 Vector3 normal = m_collisionArray[ii].normal;
623 float penetration = m_collisionArray[ii].penetration;
624 SendCollision(cA, cB, point, normal, penetration);
625 SendCollision(cB, cA, point, -normal, penetration);
576 } 626 }
627 }
577 } 628 }
578 629
579 // This is a kludge to get avatar movement updates. 630 // If any of the objects had updated properties, tell the managed objects about the update
580 // The simulator expects collisions for avatars even if there are have been no collisions. 631 // and remember that there was a change so it will be passed to the simulator.
581 // The event updates avatar animations and stuff. 632 lock (UpdateLock)
582 // If you fix avatar animation updates, remove this overhead and let normal collision processing happen.
583 foreach (BSPhysObject bsp in m_avatars)
584 if (!ObjectsWithCollisions.Contains(bsp)) // don't call avatars twice
585 bsp.SendCollisions();
586
587 // Objects that are done colliding are removed from the ObjectsWithCollisions list.
588 // Not done above because it is inside an iteration of ObjectWithCollisions.
589 // This complex collision processing is required to create an empty collision
590 // event call after all real collisions have happened on an object. This enables
591 // the simulator to generate the 'collision end' event.
592 if (ObjectsWithNoMoreCollisions.Count > 0)
593 {
594 foreach (BSPhysObject po in ObjectsWithNoMoreCollisions)
595 ObjectsWithCollisions.Remove(po);
596 ObjectsWithNoMoreCollisions.Clear();
597 }
598 // Done with collisions.
599
600 // If any of the objects had updated properties, tell the object it has been changed by the physics engine
601 if (updatedEntityCount > 0)
602 { 633 {
603 for (int ii = 0; ii < updatedEntityCount; ii++) 634 if (updatedEntityCount > 0)
604 { 635 {
605 EntityProperties entprop = m_updateArray[ii]; 636 for (int ii = 0; ii < updatedEntityCount; ii++)
606 BSPhysObject pobj;
607 if (PhysObjects.TryGetValue(entprop.ID, out pobj))
608 { 637 {
609 pobj.UpdateProperties(entprop); 638 EntityProperties entprop = m_updateArray[ii];
639 BSPhysObject pobj;
640 if (PhysObjects.TryGetValue(entprop.ID, out pobj))
641 {
642 if (pobj.IsInitialized)
643 pobj.UpdateProperties(entprop);
644 }
610 } 645 }
611 } 646 }
612 } 647 }
613 648
649 // Some actors want to know when the simulation step is complete.
614 TriggerPostStepEvent(timeStep); 650 TriggerPostStepEvent(timeStep);
615 651
652 simTime = Util.EnvironmentTickCountSubtract(beforeTime);
653 if (PhysicsLogging.Enabled)
654 {
655 DetailLog("{0},DoPhysicsStep,complete,frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}",
656 DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps,
657 updatedEntityCount, collidersCount, ObjectsWithCollisions.Count);
658 }
659
616 // The following causes the unmanaged code to output ALL the values found in ALL the objects in the world. 660 // The following causes the unmanaged code to output ALL the values found in ALL the objects in the world.
617 // Only enable this in a limited test world with few objects. 661 // Only enable this in a limited test world with few objects.
618 if (m_physicsPhysicalDumpEnabled) 662 if (m_physicsPhysicalDumpEnabled)
@@ -621,7 +665,84 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
621 // The physics engine returns the number of milliseconds it simulated this call. 665 // The physics engine returns the number of milliseconds it simulated this call.
622 // These are summed and normalized to one second and divided by 1000 to give the reported physics FPS. 666 // These are summed and normalized to one second and divided by 1000 to give the reported physics FPS.
623 // Multiply by a fixed nominal frame rate to give a rate similar to the simulator (usually 55). 667 // Multiply by a fixed nominal frame rate to give a rate similar to the simulator (usually 55).
624 return (float)numSubSteps * m_fixedTimeStep * 1000f * NominalFrameRate; 668 m_simulatedTime += (float)numSubSteps * m_fixedTimeStep * 1000f * NominalFrameRate;
669 }
670
671 // Called by a BSPhysObject to note that it has changed properties and this information
672 // should be passed up to the simulator at the proper time.
673 // Note: this is called by the BSPhysObject from invocation via DoPhysicsStep() above so
674 // this is is under UpdateLock.
675 public void PostUpdate(BSPhysObject updatee)
676 {
677 ObjectsWithUpdates.Add(updatee);
678 }
679
680 // The simulator thinks it is physics time so return all the collisions and position
681 // updates that were collected in actual physics simulation.
682 private float SendUpdatesToSimulator(float timeStep)
683 {
684 if (!m_initialized) return 5.0f;
685
686 DetailLog("{0},SendUpdatesToSimulator,collisions={1},updates={2},simedTime={3}",
687 BSScene.DetailLogZero, ObjectsWithCollisions.Count, ObjectsWithUpdates.Count, m_simulatedTime);
688 // Push the collisions into the simulator.
689 lock (CollisionLock)
690 {
691 if (ObjectsWithCollisions.Count > 0)
692 {
693 foreach (BSPhysObject bsp in ObjectsWithCollisions)
694 if (!bsp.SendCollisions())
695 {
696 // If the object is done colliding, see that it's removed from the colliding list
697 ObjectsWithNoMoreCollisions.Add(bsp);
698 }
699 }
700
701 // This is a kludge to get avatar movement updates.
702 // The simulator expects collisions for avatars even if there are have been no collisions.
703 // The event updates avatar animations and stuff.
704 // If you fix avatar animation updates, remove this overhead and let normal collision processing happen.
705 foreach (BSPhysObject bsp in m_avatars)
706 if (!ObjectsWithCollisions.Contains(bsp)) // don't call avatars twice
707 bsp.SendCollisions();
708
709 // Objects that are done colliding are removed from the ObjectsWithCollisions list.
710 // Not done above because it is inside an iteration of ObjectWithCollisions.
711 // This complex collision processing is required to create an empty collision
712 // event call after all real collisions have happened on an object. This allows
713 // the simulator to generate the 'collision end' event.
714 if (ObjectsWithNoMoreCollisions.Count > 0)
715 {
716 foreach (BSPhysObject po in ObjectsWithNoMoreCollisions)
717 ObjectsWithCollisions.Remove(po);
718 ObjectsWithNoMoreCollisions.Clear();
719 }
720 }
721
722 // Call the simulator for each object that has physics property updates.
723 HashSet<BSPhysObject> updatedObjects = null;
724 lock (UpdateLock)
725 {
726 if (ObjectsWithUpdates.Count > 0)
727 {
728 updatedObjects = ObjectsWithUpdates;
729 ObjectsWithUpdates = new HashSet<BSPhysObject>();
730 }
731 }
732 if (updatedObjects != null)
733 {
734 foreach (BSPhysObject obj in updatedObjects)
735 {
736 obj.RequestPhysicsterseUpdate();
737 }
738 updatedObjects.Clear();
739 }
740
741 // Return the framerate simulated to give the above returned results.
742 // (Race condition here but this is just bookkeeping so rare mistakes do not merit a lock).
743 float simTime = m_simulatedTime;
744 m_simulatedTime = 0f;
745 return simTime;
625 } 746 }
626 747
627 // Something has collided 748 // Something has collided
@@ -640,21 +761,49 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
640 return; 761 return;
641 } 762 }
642 763
643 // The terrain is not in the physical object list so 'collidee' can be null when Collide() is called. 764 // Note: the terrain is not in the physical object list so 'collidee' can be null when Collide() is called.
644 BSPhysObject collidee = null; 765 BSPhysObject collidee = null;
645 PhysObjects.TryGetValue(collidingWith, out collidee); 766 PhysObjects.TryGetValue(collidingWith, out collidee);
646 767
647 // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); 768 // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith);
648 769
649 if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) 770 if (collider.IsInitialized)
650 { 771 {
651 // If a collision was posted, remember to send it to the simulator 772 if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration))
652 ObjectsWithCollisions.Add(collider); 773 {
774 // If a collision was 'good', remember to send it to the simulator
775 ObjectsWithCollisions.Add(collider);
776 }
653 } 777 }
654 778
655 return; 779 return;
656 } 780 }
657 781
782 public void BulletSPluginPhysicsThread()
783 {
784 while (m_initialized)
785 {
786 int beginSimulationRealtimeMS = Util.EnvironmentTickCount();
787 DoPhysicsStep(BSParam.PhysicsTimeStep);
788 int simulationRealtimeMS = Util.EnvironmentTickCountSubtract(beginSimulationRealtimeMS);
789 int simulationTimeVsRealtimeDifferenceMS = ((int)(BSParam.PhysicsTimeStep*1000f)) - simulationRealtimeMS;
790
791 if (simulationTimeVsRealtimeDifferenceMS > 0)
792 {
793 // The simulation of the time interval took less than realtime.
794 // Do a sleep for the rest of realtime.
795 Thread.Sleep(simulationTimeVsRealtimeDifferenceMS);
796 }
797 else
798 {
799 // The simulation took longer than realtime.
800 // Do some scaling of simulation time.
801 // TODO.
802 DetailLog("{0},BulletSPluginPhysicsThread,longerThanRealtime={1}", BSScene.DetailLogZero, simulationTimeVsRealtimeDifferenceMS);
803 }
804 }
805 }
806
658 #endregion // Simulation 807 #endregion // Simulation
659 808
660 public override void GetResults() { } 809 public override void GetResults() { }
@@ -717,6 +866,23 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
717 866
718 public override bool IsThreaded { get { return false; } } 867 public override bool IsThreaded { get { return false; } }
719 868
869 #region Extensions
870 // =============================================================
871 // Per scene functions. See below.
872
873 // Per avatar functions. See BSCharacter.
874
875 // Per prim functions. See BSPrim.
876 public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType";
877 public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
878 // =============================================================
879
880 public override object Extension(string pFunct, params object[] pParams)
881 {
882 return base.Extension(pFunct, pParams);
883 }
884 #endregion // Extensions
885
720 #region Taints 886 #region Taints
721 // The simulation execution order is: 887 // The simulation execution order is:
722 // Simulate() 888 // Simulate()
@@ -780,7 +946,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
780 946
781 private void ProcessRegularTaints() 947 private void ProcessRegularTaints()
782 { 948 {
783 if (_taintOperations.Count > 0) // save allocating new list if there is nothing to process 949 if (m_initialized && _taintOperations.Count > 0) // save allocating new list if there is nothing to process
784 { 950 {
785 // swizzle a new list into the list location so we can process what's there 951 // swizzle a new list into the list location so we can process what's there
786 List<TaintCallbackEntry> oldList; 952 List<TaintCallbackEntry> oldList;
@@ -823,7 +989,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
823 // Taints that happen after the normal taint processing but before the simulation step. 989 // Taints that happen after the normal taint processing but before the simulation step.
824 private void ProcessPostTaintTaints() 990 private void ProcessPostTaintTaints()
825 { 991 {
826 if (_postTaintOperations.Count > 0) 992 if (m_initialized && _postTaintOperations.Count > 0)
827 { 993 {
828 Dictionary<string, TaintCallbackEntry> oldList; 994 Dictionary<string, TaintCallbackEntry> oldList;
829 lock (_taintLock) 995 lock (_taintLock)
@@ -963,8 +1129,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
963 public void DetailLog(string msg, params Object[] args) 1129 public void DetailLog(string msg, params Object[] args)
964 { 1130 {
965 PhysicsLogging.Write(msg, args); 1131 PhysicsLogging.Write(msg, args);
966 // Add the Flush() if debugging crashes. Gets all the messages written out.
967 if (m_physicsLoggingDoFlush) PhysicsLogging.Flush();
968 } 1132 }
969 // Used to fill in the LocalID when there isn't one. It's the correct number of characters. 1133 // Used to fill in the LocalID when there isn't one. It's the correct number of characters.
970 public const string DetailLogZero = "0000000000"; 1134 public const string DetailLogZero = "0000000000";
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index 220fbbc..32bbc8f 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -38,38 +38,15 @@ public sealed class BSShapeCollection : IDisposable
38{ 38{
39 private static string LogHeader = "[BULLETSIM SHAPE COLLECTION]"; 39 private static string LogHeader = "[BULLETSIM SHAPE COLLECTION]";
40 40
41 private BSScene PhysicsScene { get; set; } 41 private BSScene m_physicsScene { get; set; }
42 42
43 private Object m_collectionActivityLock = new Object(); 43 private Object m_collectionActivityLock = new Object();
44 44
45 // Description of a Mesh
46 private struct MeshDesc
47 {
48 public BulletShape shape;
49 public int referenceCount;
50 public DateTime lastReferenced;
51 public UInt64 shapeKey;
52 }
53
54 // Description of a hull.
55 // Meshes and hulls have the same shape hash key but we only need hulls for efficient collision calculations.
56 private struct HullDesc
57 {
58 public BulletShape shape;
59 public int referenceCount;
60 public DateTime lastReferenced;
61 public UInt64 shapeKey;
62 }
63
64 // The sharable set of meshes and hulls. Indexed by their shape hash.
65 private Dictionary<System.UInt64, MeshDesc> Meshes = new Dictionary<System.UInt64, MeshDesc>();
66 private Dictionary<System.UInt64, HullDesc> Hulls = new Dictionary<System.UInt64, HullDesc>();
67
68 private bool DDetail = false; 45 private bool DDetail = false;
69 46
70 public BSShapeCollection(BSScene physScene) 47 public BSShapeCollection(BSScene physScene)
71 { 48 {
72 PhysicsScene = physScene; 49 m_physicsScene = physScene;
73 // Set the next to 'true' for very detailed shape update detailed logging (detailed details?) 50 // Set the next to 'true' for very detailed shape update detailed logging (detailed details?)
74 // While detailed debugging is still active, this is better than commenting out all the 51 // While detailed debugging is still active, this is better than commenting out all the
75 // DetailLog statements. When debugging slows down, this and the protected logging 52 // DetailLog statements. When debugging slows down, this and the protected logging
@@ -86,22 +63,18 @@ public sealed class BSShapeCollection : IDisposable
86 // Mostly used for changing bodies out from under Linksets. 63 // Mostly used for changing bodies out from under Linksets.
87 // Useful for other cases where parameters need saving. 64 // Useful for other cases where parameters need saving.
88 // Passing 'null' says no callback. 65 // Passing 'null' says no callback.
89 public delegate void ShapeDestructionCallback(BulletShape shape); 66 public delegate void PhysicalDestructionCallback(BulletBody pBody, BulletShape pShape);
90 public delegate void BodyDestructionCallback(BulletBody body);
91 67
92 // Called to update/change the body and shape for an object. 68 // Called to update/change the body and shape for an object.
93 // First checks the shape and updates that if necessary then makes 69 // The object has some shape and body on it. Here we decide if that is the correct shape
94 // sure the body is of the right type. 70 // for the current state of the object (static/dynamic/...).
71 // If bodyCallback is not null, it is called if either the body or the shape are changed
72 // so dependencies (like constraints) can be removed before the physical object is dereferenced.
95 // Return 'true' if either the body or the shape changed. 73 // Return 'true' if either the body or the shape changed.
96 // 'shapeCallback' and 'bodyCallback' are, if non-null, functions called just before 74 // Called at taint-time.
97 // the current shape or body is destroyed. This allows the caller to remove any 75 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim, PhysicalDestructionCallback bodyCallback)
98 // higher level dependencies on the shape or body. Mostly used for LinkSets to
99 // remove the physical constraints before the body is destroyed.
100 // Called at taint-time!!
101 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim,
102 ShapeDestructionCallback shapeCallback, BodyDestructionCallback bodyCallback)
103 { 76 {
104 PhysicsScene.AssertInTaintTime("BSShapeCollection.GetBodyAndShape"); 77 m_physicsScene.AssertInTaintTime("BSShapeCollection.GetBodyAndShape");
105 78
106 bool ret = false; 79 bool ret = false;
107 80
@@ -111,12 +84,12 @@ public sealed class BSShapeCollection : IDisposable
111 // Do we have the correct geometry for this type of object? 84 // Do we have the correct geometry for this type of object?
112 // Updates prim.BSShape with information/pointers to shape. 85 // Updates prim.BSShape with information/pointers to shape.
113 // Returns 'true' of BSShape is changed to a new shape. 86 // Returns 'true' of BSShape is changed to a new shape.
114 bool newGeom = CreateGeom(forceRebuild, prim, shapeCallback); 87 bool newGeom = CreateGeom(forceRebuild, prim, bodyCallback);
115 // If we had to select a new shape geometry for the object, 88 // If we had to select a new shape geometry for the object,
116 // rebuild the body around it. 89 // rebuild the body around it.
117 // Updates prim.BSBody with information/pointers to requested body 90 // Updates prim.BSBody with information/pointers to requested body
118 // Returns 'true' if BSBody was changed. 91 // Returns 'true' if BSBody was changed.
119 bool newBody = CreateBody((newGeom || forceRebuild), prim, PhysicsScene.World, bodyCallback); 92 bool newBody = CreateBody((newGeom || forceRebuild), prim, m_physicsScene.World, bodyCallback);
120 ret = newGeom || newBody; 93 ret = newGeom || newBody;
121 } 94 }
122 DetailLog("{0},BSShapeCollection.GetBodyAndShape,taintExit,force={1},ret={2},body={3},shape={4}", 95 DetailLog("{0},BSShapeCollection.GetBodyAndShape,taintExit,force={1},ret={2},body={3},shape={4}",
@@ -127,274 +100,20 @@ public sealed class BSShapeCollection : IDisposable
127 100
128 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim) 101 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim)
129 { 102 {
130 return GetBodyAndShape(forceRebuild, sim, prim, null, null); 103 return GetBodyAndShape(forceRebuild, sim, prim, null);
131 }
132
133 // Track another user of a body.
134 // We presume the caller has allocated the body.
135 // Bodies only have one user so the body is just put into the world if not already there.
136 private void ReferenceBody(BulletBody body)
137 {
138 lock (m_collectionActivityLock)
139 {
140 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,newBody,body={1}", body.ID, body);
141 if (!PhysicsScene.PE.IsInWorld(PhysicsScene.World, body))
142 {
143 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, body);
144 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,addedToWorld,ref={1}", body.ID, body);
145 }
146 }
147 }
148
149 // Release the usage of a body.
150 // Called when releasing use of a BSBody. BSShape is handled separately.
151 // Called in taint time.
152 public void DereferenceBody(BulletBody body, BodyDestructionCallback bodyCallback )
153 {
154 if (!body.HasPhysicalBody)
155 return;
156
157 PhysicsScene.AssertInTaintTime("BSShapeCollection.DereferenceBody");
158
159 lock (m_collectionActivityLock)
160 {
161 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceBody,DestroyingBody,body={1}", body.ID, body);
162 // If the caller needs to know the old body is going away, pass the event up.
163 if (bodyCallback != null) bodyCallback(body);
164
165 if (PhysicsScene.PE.IsInWorld(PhysicsScene.World, body))
166 {
167 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, body);
168 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceBody,removingFromWorld. Body={1}", body.ID, body);
169 }
170
171 // Zero any reference to the shape so it is not freed when the body is deleted.
172 PhysicsScene.PE.SetCollisionShape(PhysicsScene.World, body, null);
173 PhysicsScene.PE.DestroyObject(PhysicsScene.World, body);
174 }
175 }
176
177 // Track the datastructures and use count for a shape.
178 // When creating a hull, this is called first to reference the mesh
179 // and then again to reference the hull.
180 // Meshes and hulls for the same shape have the same hash key.
181 // NOTE that native shapes are not added to the mesh list or removed.
182 // Returns 'true' if this is the initial reference to the shape. Otherwise reused.
183 public bool ReferenceShape(BulletShape shape)
184 {
185 bool ret = false;
186 switch (shape.type)
187 {
188 case BSPhysicsShapeType.SHAPE_MESH:
189 MeshDesc meshDesc;
190 if (Meshes.TryGetValue(shape.shapeKey, out meshDesc))
191 {
192 // There is an existing instance of this mesh.
193 meshDesc.referenceCount++;
194 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,existingMesh,key={1},cnt={2}",
195 BSScene.DetailLogZero, shape.shapeKey.ToString("X"), meshDesc.referenceCount);
196 }
197 else
198 {
199 // This is a new reference to a mesh
200 meshDesc.shape = shape.Clone();
201 meshDesc.shapeKey = shape.shapeKey;
202 // We keep a reference to the underlying IMesh data so a hull can be built
203 meshDesc.referenceCount = 1;
204 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newMesh,key={1},cnt={2}",
205 BSScene.DetailLogZero, shape.shapeKey.ToString("X"), meshDesc.referenceCount);
206 ret = true;
207 }
208 meshDesc.lastReferenced = System.DateTime.Now;
209 Meshes[shape.shapeKey] = meshDesc;
210 break;
211 case BSPhysicsShapeType.SHAPE_HULL:
212 HullDesc hullDesc;
213 if (Hulls.TryGetValue(shape.shapeKey, out hullDesc))
214 {
215 // There is an existing instance of this hull.
216 hullDesc.referenceCount++;
217 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,existingHull,key={1},cnt={2}",
218 BSScene.DetailLogZero, shape.shapeKey.ToString("X"), hullDesc.referenceCount);
219 }
220 else
221 {
222 // This is a new reference to a hull
223 hullDesc.shape = shape.Clone();
224 hullDesc.shapeKey = shape.shapeKey;
225 hullDesc.referenceCount = 1;
226 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newHull,key={1},cnt={2}",
227 BSScene.DetailLogZero, shape.shapeKey.ToString("X"), hullDesc.referenceCount);
228 ret = true;
229
230 }
231 hullDesc.lastReferenced = System.DateTime.Now;
232 Hulls[shape.shapeKey] = hullDesc;
233 break;
234 case BSPhysicsShapeType.SHAPE_UNKNOWN:
235 break;
236 default:
237 // Native shapes are not tracked and they don't go into any list
238 break;
239 }
240 return ret;
241 } 104 }
242 105
243 // Release the usage of a shape. 106 // If the existing prim's shape is to be replaced, remove the tie to the existing shape
244 public void DereferenceShape(BulletShape shape, ShapeDestructionCallback shapeCallback) 107 // before replacing it.
108 private void DereferenceExistingShape(BSPhysObject prim, PhysicalDestructionCallback shapeCallback)
245 { 109 {
246 if (!shape.HasPhysicalShape) 110 if (prim.PhysShape.HasPhysicalShape)
247 return;
248
249 PhysicsScene.AssertInTaintTime("BSShapeCollection.DereferenceShape");
250
251 if (shape.HasPhysicalShape)
252 {
253 if (shape.isNativeShape)
254 {
255 // Native shapes are not tracked and are released immediately
256 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,ptr={1}",
257 BSScene.DetailLogZero, shape.AddrString);
258 if (shapeCallback != null) shapeCallback(shape);
259 PhysicsScene.PE.DeleteCollisionShape(PhysicsScene.World, shape);
260 }
261 else
262 {
263 switch (shape.type)
264 {
265 case BSPhysicsShapeType.SHAPE_HULL:
266 DereferenceHull(shape, shapeCallback);
267 break;
268 case BSPhysicsShapeType.SHAPE_MESH:
269 DereferenceMesh(shape, shapeCallback);
270 break;
271 case BSPhysicsShapeType.SHAPE_COMPOUND:
272 DereferenceCompound(shape, shapeCallback);
273 break;
274 case BSPhysicsShapeType.SHAPE_UNKNOWN:
275 break;
276 default:
277 break;
278 }
279 }
280 }
281 }
282
283 // Count down the reference count for a mesh shape
284 // Called at taint-time.
285 private void DereferenceMesh(BulletShape shape, ShapeDestructionCallback shapeCallback)
286 {
287 MeshDesc meshDesc;
288 if (Meshes.TryGetValue(shape.shapeKey, out meshDesc))
289 { 111 {
290 meshDesc.referenceCount--; 112 if (shapeCallback != null)
291 // TODO: release the Bullet storage 113 shapeCallback(prim.PhysBody, prim.PhysShape.physShapeInfo);
292 if (shapeCallback != null) shapeCallback(shape); 114 prim.PhysShape.Dereference(m_physicsScene);
293 meshDesc.lastReferenced = System.DateTime.Now;
294 Meshes[shape.shapeKey] = meshDesc;
295 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceMesh,shape={1},refCnt={2}",
296 BSScene.DetailLogZero, shape, meshDesc.referenceCount);
297
298 }
299 }
300
301 // Count down the reference count for a hull shape
302 // Called at taint-time.
303 private void DereferenceHull(BulletShape shape, ShapeDestructionCallback shapeCallback)
304 {
305 HullDesc hullDesc;
306 if (Hulls.TryGetValue(shape.shapeKey, out hullDesc))
307 {
308 hullDesc.referenceCount--;
309 // TODO: release the Bullet storage (aging old entries?)
310
311 // Tell upper layers that, if they have dependencies on this shape, this link is going away
312 if (shapeCallback != null) shapeCallback(shape);
313
314 hullDesc.lastReferenced = System.DateTime.Now;
315 Hulls[shape.shapeKey] = hullDesc;
316 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceHull,shape={1},refCnt={2}",
317 BSScene.DetailLogZero, shape, hullDesc.referenceCount);
318 }
319 }
320
321 // Remove a reference to a compound shape.
322 // Taking a compound shape apart is a little tricky because if you just delete the
323 // physical shape, it will free all the underlying children. We can't do that because
324 // they could be shared. So, this removes each of the children from the compound and
325 // dereferences them separately before destroying the compound collision object itself.
326 // Called at taint-time.
327 private void DereferenceCompound(BulletShape shape, ShapeDestructionCallback shapeCallback)
328 {
329 if (!PhysicsScene.PE.IsCompound(shape))
330 {
331 // Failed the sanity check!!
332 PhysicsScene.Logger.ErrorFormat("{0} Attempt to free a compound shape that is not compound!! type={1}, ptr={2}",
333 LogHeader, shape.type, shape.AddrString);
334 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceCompound,notACompoundShape,type={1},ptr={2}",
335 BSScene.DetailLogZero, shape.type, shape.AddrString);
336 return;
337 }
338
339 int numChildren = PhysicsScene.PE.GetNumberOfCompoundChildren(shape);
340 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceCompound,shape={1},children={2}", BSScene.DetailLogZero, shape, numChildren);
341
342 for (int ii = numChildren - 1; ii >= 0; ii--)
343 {
344 BulletShape childShape = PhysicsScene.PE.RemoveChildShapeFromCompoundShapeIndex(shape, ii);
345 DereferenceAnonCollisionShape(childShape);
346 }
347 PhysicsScene.PE.DeleteCollisionShape(PhysicsScene.World, shape);
348 }
349
350 // Sometimes we have a pointer to a collision shape but don't know what type it is.
351 // Figure out type and call the correct dereference routine.
352 // Called at taint-time.
353 private void DereferenceAnonCollisionShape(BulletShape shapeInfo)
354 {
355 MeshDesc meshDesc;
356 HullDesc hullDesc;
357
358 if (TryGetMeshByPtr(shapeInfo, out meshDesc))
359 {
360 shapeInfo.type = BSPhysicsShapeType.SHAPE_MESH;
361 shapeInfo.shapeKey = meshDesc.shapeKey;
362 }
363 else
364 {
365 if (TryGetHullByPtr(shapeInfo, out hullDesc))
366 {
367 shapeInfo.type = BSPhysicsShapeType.SHAPE_HULL;
368 shapeInfo.shapeKey = hullDesc.shapeKey;
369 }
370 else
371 {
372 if (PhysicsScene.PE.IsCompound(shapeInfo))
373 {
374 shapeInfo.type = BSPhysicsShapeType.SHAPE_COMPOUND;
375 }
376 else
377 {
378 if (PhysicsScene.PE.IsNativeShape(shapeInfo))
379 {
380 shapeInfo.isNativeShape = true;
381 shapeInfo.type = BSPhysicsShapeType.SHAPE_BOX; // (technically, type doesn't matter)
382 }
383 }
384 }
385 }
386
387 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceAnonCollisionShape,shape={1}", BSScene.DetailLogZero, shapeInfo);
388
389 if (shapeInfo.type != BSPhysicsShapeType.SHAPE_UNKNOWN)
390 {
391 DereferenceShape(shapeInfo, null);
392 }
393 else
394 {
395 PhysicsScene.Logger.ErrorFormat("{0} Could not decypher shape type. Region={1}, addr={2}",
396 LogHeader, PhysicsScene.RegionName, shapeInfo.AddrString);
397 } 115 }
116 prim.PhysShape = new BSShapeNull();
398 } 117 }
399 118
400 // Create the geometry information in Bullet for later use. 119 // Create the geometry information in Bullet for later use.
@@ -405,60 +124,41 @@ public sealed class BSShapeCollection : IDisposable
405 // Info in prim.BSShape is updated to the new shape. 124 // Info in prim.BSShape is updated to the new shape.
406 // Returns 'true' if the geometry was rebuilt. 125 // Returns 'true' if the geometry was rebuilt.
407 // Called at taint-time! 126 // Called at taint-time!
408 private bool CreateGeom(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback) 127 private bool CreateGeom(bool forceRebuild, BSPhysObject prim, PhysicalDestructionCallback shapeCallback)
409 { 128 {
410 bool ret = false; 129 bool ret = false;
411 bool haveShape = false; 130 bool haveShape = false;
131 bool nativeShapePossible = true;
132 PrimitiveBaseShape pbs = prim.BaseShape;
412 133
413 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) 134 // Kludge to create the capsule for the avatar.
135 // TDOD: Remove/redo this when BSShapeAvatar is working!!
136 BSCharacter theChar = prim as BSCharacter;
137 if (theChar != null)
414 { 138 {
415 // an avatar capsule is close to a native shape (it is not shared) 139 DereferenceExistingShape(prim, shapeCallback);
416 GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE, FixedShapeKey.KEY_CAPSULE, shapeCallback); 140 prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim,
417 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape); 141 BSPhysicsShapeType.SHAPE_CAPSULE, FixedShapeKey.KEY_CAPSULE);
418 ret = true; 142 ret = true;
419 haveShape = true; 143 haveShape = true;
420 } 144 }
421 145
422 // Compound shapes are handled special as they are rebuilt from scratch.
423 // This isn't too great a hardship since most of the child shapes will have already been created.
424 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND)
425 {
426 ret = GetReferenceToCompoundShape(prim, shapeCallback);
427 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,compoundShape,shape={1}", prim.LocalID, prim.PhysShape);
428 haveShape = true;
429 }
430
431 if (!haveShape)
432 {
433 ret = CreateGeomNonSpecial(forceRebuild, prim, shapeCallback);
434 }
435
436 return ret;
437 }
438
439 // Create a mesh, hull or native shape.
440 // Return 'true' if the prim's shape was changed.
441 public bool CreateGeomNonSpecial(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback)
442 {
443 bool ret = false;
444 bool haveShape = false;
445 bool nativeShapePossible = true;
446 PrimitiveBaseShape pbs = prim.BaseShape;
447
448 // If the prim attributes are simple, this could be a simple Bullet native shape 146 // If the prim attributes are simple, this could be a simple Bullet native shape
147 // Native shapes work whether to object is static or physical.
449 if (!haveShape 148 if (!haveShape
450 && nativeShapePossible 149 && nativeShapePossible
451 && pbs != null 150 && pbs != null
452 && !pbs.SculptEntry 151 && PrimHasNoCuts(pbs)
453 && ((pbs.SculptEntry && !BSParam.ShouldMeshSculptedPrim) || PrimHasNoCuts(pbs)) ) 152 && ( !pbs.SculptEntry || (pbs.SculptEntry && !BSParam.ShouldMeshSculptedPrim) )
153 )
454 { 154 {
455 // Get the scale of any existing shape so we can see if the new shape is same native type and same size. 155 // Get the scale of any existing shape so we can see if the new shape is same native type and same size.
456 OMV.Vector3 scaleOfExistingShape = OMV.Vector3.Zero; 156 OMV.Vector3 scaleOfExistingShape = OMV.Vector3.Zero;
457 if (prim.PhysShape.HasPhysicalShape) 157 if (prim.PhysShape.HasPhysicalShape)
458 scaleOfExistingShape = PhysicsScene.PE.GetLocalScaling(prim.PhysShape); 158 scaleOfExistingShape = m_physicsScene.PE.GetLocalScaling(prim.PhysShape.physShapeInfo);
459 159
460 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,maybeNative,force={1},primScale={2},primSize={3},primShape={4}", 160 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,maybeNative,force={1},primScale={2},primSize={3},primShape={4}",
461 prim.LocalID, forceRebuild, prim.Scale, prim.Size, prim.PhysShape.type); 161 prim.LocalID, forceRebuild, prim.Scale, prim.Size, prim.PhysShape.physShapeInfo.shapeType);
462 162
463 // It doesn't look like Bullet scales native spheres so make sure the scales are all equal 163 // It doesn't look like Bullet scales native spheres so make sure the scales are all equal
464 if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) 164 if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1)
@@ -466,26 +166,30 @@ public sealed class BSShapeCollection : IDisposable
466 { 166 {
467 haveShape = true; 167 haveShape = true;
468 if (forceRebuild 168 if (forceRebuild
469 || prim.Scale != scaleOfExistingShape 169 || prim.PhysShape.ShapeType != BSPhysicsShapeType.SHAPE_SPHERE
470 || prim.PhysShape.type != BSPhysicsShapeType.SHAPE_SPHERE 170 )
471 )
472 { 171 {
473 ret = GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_SPHERE, 172 DereferenceExistingShape(prim, shapeCallback);
474 FixedShapeKey.KEY_SPHERE, shapeCallback); 173 prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim,
174 BSPhysicsShapeType.SHAPE_SPHERE, FixedShapeKey.KEY_SPHERE);
175 ret = true;
475 } 176 }
476 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,sphere,force={1},rebuilt={2},shape={3}", 177 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,sphere,force={1},rebuilt={2},shape={3}",
477 prim.LocalID, forceRebuild, ret, prim.PhysShape); 178 prim.LocalID, forceRebuild, ret, prim.PhysShape);
478 } 179 }
180 // If we didn't make a sphere, maybe a box will work.
479 if (!haveShape && pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) 181 if (!haveShape && pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight)
480 { 182 {
481 haveShape = true; 183 haveShape = true;
482 if (forceRebuild 184 if (forceRebuild
483 || prim.Scale != scaleOfExistingShape 185 || prim.Scale != scaleOfExistingShape
484 || prim.PhysShape.type != BSPhysicsShapeType.SHAPE_BOX 186 || prim.PhysShape.ShapeType != BSPhysicsShapeType.SHAPE_BOX
485 ) 187 )
486 { 188 {
487 ret = GetReferenceToNativeShape( prim, BSPhysicsShapeType.SHAPE_BOX, 189 DereferenceExistingShape(prim, shapeCallback);
488 FixedShapeKey.KEY_BOX, shapeCallback); 190 prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim,
191 BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX);
192 ret = true;
489 } 193 }
490 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,box,force={1},rebuilt={2},shape={3}", 194 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,box,force={1},rebuilt={2},shape={3}",
491 prim.LocalID, forceRebuild, ret, prim.PhysShape); 195 prim.LocalID, forceRebuild, ret, prim.PhysShape);
@@ -502,7 +206,7 @@ public sealed class BSShapeCollection : IDisposable
502 } 206 }
503 207
504 // return 'true' if this shape description does not include any cutting or twisting. 208 // return 'true' if this shape description does not include any cutting or twisting.
505 private bool PrimHasNoCuts(PrimitiveBaseShape pbs) 209 public static bool PrimHasNoCuts(PrimitiveBaseShape pbs)
506 { 210 {
507 return pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 211 return pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0
508 && pbs.ProfileHollow == 0 212 && pbs.ProfileHollow == 0
@@ -514,7 +218,7 @@ public sealed class BSShapeCollection : IDisposable
514 } 218 }
515 219
516 // return 'true' if the prim's shape was changed. 220 // return 'true' if the prim's shape was changed.
517 public bool CreateGeomMeshOrHull(BSPhysObject prim, ShapeDestructionCallback shapeCallback) 221 private bool CreateGeomMeshOrHull(BSPhysObject prim, PhysicalDestructionCallback shapeCallback)
518 { 222 {
519 223
520 bool ret = false; 224 bool ret = false;
@@ -522,503 +226,121 @@ public sealed class BSShapeCollection : IDisposable
522 // made. Native shapes work in either case. 226 // made. Native shapes work in either case.
523 if (prim.IsPhysical && BSParam.ShouldUseHullsForPhysicalObjects) 227 if (prim.IsPhysical && BSParam.ShouldUseHullsForPhysicalObjects)
524 { 228 {
525 // Update prim.BSShape to reference a hull of this shape. 229 // Use a simple, single mesh convex hull shape if the object is simple enough
526 ret = GetReferenceToHull(prim, shapeCallback); 230 BSShape potentialHull = null;
527 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,hull,shape={1},key={2}",
528 prim.LocalID, prim.PhysShape, prim.PhysShape.shapeKey.ToString("X"));
529 }
530 else
531 {
532 ret = GetReferenceToMesh(prim, shapeCallback);
533 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,mesh,shape={1},key={2}",
534 prim.LocalID, prim.PhysShape, prim.PhysShape.shapeKey.ToString("X"));
535 }
536 return ret;
537 }
538
539 // Creates a native shape and assignes it to prim.BSShape.
540 // "Native" shapes are never shared. they are created here and destroyed in DereferenceShape().
541 private bool GetReferenceToNativeShape(BSPhysObject prim,
542 BSPhysicsShapeType shapeType, FixedShapeKey shapeKey,
543 ShapeDestructionCallback shapeCallback)
544 {
545 // release any previous shape
546 DereferenceShape(prim.PhysShape, shapeCallback);
547
548 BulletShape newShape = BuildPhysicalNativeShape(prim, shapeType, shapeKey);
549
550 // Don't need to do a 'ReferenceShape()' here because native shapes are not shared.
551 if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}",
552 prim.LocalID, newShape, prim.Scale);
553
554 // native shapes are scaled by Bullet
555 prim.PhysShape = newShape;
556 return true;
557 }
558
559 private BulletShape BuildPhysicalNativeShape(BSPhysObject prim, BSPhysicsShapeType shapeType,
560 FixedShapeKey shapeKey)
561 {
562 BulletShape newShape;
563 // Need to make sure the passed shape information is for the native type.
564 ShapeData nativeShapeData = new ShapeData();
565 nativeShapeData.Type = shapeType;
566 nativeShapeData.ID = prim.LocalID;
567 nativeShapeData.Scale = prim.Scale;
568 nativeShapeData.Size = prim.Scale; // unneeded, I think.
569 nativeShapeData.MeshKey = (ulong)shapeKey;
570 nativeShapeData.HullKey = (ulong)shapeKey;
571
572 if (shapeType == BSPhysicsShapeType.SHAPE_CAPSULE)
573 {
574 231
575 newShape = PhysicsScene.PE.BuildCapsuleShape(PhysicsScene.World, 1f, 1f, prim.Scale); 232 PrimitiveBaseShape pbs = prim.BaseShape;
576 if (DDetail) DetailLog("{0},BSShapeCollection.BuildPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale); 233 // Use a simple, one section convex shape for prims that are probably convex (no cuts or twists)
577 } 234 if (BSParam.ShouldUseSingleConvexHullForPrims
578 else 235 && pbs != null
579 { 236 && !pbs.SculptEntry
580 // Native shapes are scaled in Bullet so set the scaling to the size 237 && PrimHasNoCuts(pbs)
581 newShape = PhysicsScene.PE.BuildNativeShape(PhysicsScene.World, nativeShapeData); 238 )
582 239 {
583 } 240 potentialHull = BSShapeConvexHull.GetReference(m_physicsScene, false /* forceRebuild */, prim);
584 if (!newShape.HasPhysicalShape) 241 }
585 { 242 // Use the GImpact shape if it is a prim that has some concaveness
586 PhysicsScene.Logger.ErrorFormat("{0} BuildPhysicalNativeShape failed. ID={1}, shape={2}", 243 if (potentialHull == null
587 LogHeader, prim.LocalID, shapeType); 244 && BSParam.ShouldUseGImpactShapeForPrims
588 } 245 && pbs != null
589 newShape.shapeKey = (System.UInt64)shapeKey; 246 && !pbs.SculptEntry
590 newShape.isNativeShape = true; 247 )
591 248 {
592 return newShape; 249 potentialHull = BSShapeGImpact.GetReference(m_physicsScene, false /* forceRebuild */, prim);
593 } 250 }
594 251 // If not any of the simple cases, just make a hull
595 // Builds a mesh shape in the physical world and updates prim.BSShape. 252 if (potentialHull == null)
596 // Dereferences previous shape in BSShape and adds a reference for this new shape. 253 {
597 // Returns 'true' of a mesh was actually built. Otherwise . 254 potentialHull = BSShapeHull.GetReference(m_physicsScene, false /*forceRebuild*/, prim);
598 // Called at taint-time! 255 }
599 private bool GetReferenceToMesh(BSPhysObject prim, ShapeDestructionCallback shapeCallback)
600 {
601 BulletShape newShape = new BulletShape();
602
603 float lod;
604 System.UInt64 newMeshKey = ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
605
606 // if this new shape is the same as last time, don't recreate the mesh
607 if (newMeshKey == prim.PhysShape.shapeKey && prim.PhysShape.type == BSPhysicsShapeType.SHAPE_MESH)
608 return false;
609
610 if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToMesh,create,oldKey={1},newKey={2},size={3},lod={4}",
611 prim.LocalID, prim.PhysShape.shapeKey.ToString("X"), newMeshKey.ToString("X"), prim.Size, lod);
612
613 // Since we're recreating new, get rid of the reference to the previous shape
614 DereferenceShape(prim.PhysShape, shapeCallback);
615
616 newShape = CreatePhysicalMesh(prim, newMeshKey, prim.BaseShape, prim.Size, lod);
617 // Take evasive action if the mesh was not constructed.
618 newShape = VerifyMeshCreated(newShape, prim);
619
620 ReferenceShape(newShape);
621
622 prim.PhysShape = newShape;
623
624 return true; // 'true' means a new shape has been added to this prim
625 }
626
627 private BulletShape CreatePhysicalMesh(BSPhysObject prim, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
628 {
629 BulletShape newShape = new BulletShape();
630 256
631 MeshDesc meshDesc; 257 // If the current shape is not what is on the prim at the moment, time to change.
632 if (Meshes.TryGetValue(newMeshKey, out meshDesc)) 258 if (!prim.PhysShape.HasPhysicalShape
633 { 259 || potentialHull.ShapeType != prim.PhysShape.ShapeType
634 // If the mesh has already been built just use it. 260 || potentialHull.physShapeInfo.shapeKey != prim.PhysShape.physShapeInfo.shapeKey)
635 newShape = meshDesc.shape.Clone(); 261 {
262 DereferenceExistingShape(prim, shapeCallback);
263 prim.PhysShape = potentialHull;
264 ret = true;
265 }
266 else
267 {
268 // The current shape on the prim is the correct one. We don't need the potential reference.
269 potentialHull.Dereference(m_physicsScene);
270 }
271 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,hull,shape={1}", prim.LocalID, prim.PhysShape);
636 } 272 }
637 else 273 else
638 { 274 {
639 IMesh meshData = PhysicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, 275 // Non-physical objects should be just meshes.
640 true, 276 BSShape potentialMesh = BSShapeMesh.GetReference(m_physicsScene, false /*forceRebuild*/, prim);
641 false, // say it is not physical so a bounding box is not built 277 // If the current shape is not what is on the prim at the moment, time to change.
642 false, // do not cache the mesh and do not use previously built versions 278 if (!prim.PhysShape.HasPhysicalShape
643 false // It's NOT for ODE 279 || potentialMesh.ShapeType != prim.PhysShape.ShapeType
644 ); 280 || potentialMesh.physShapeInfo.shapeKey != prim.PhysShape.physShapeInfo.shapeKey)
645
646 if (meshData != null)
647 { 281 {
648 282 DereferenceExistingShape(prim, shapeCallback);
649 int[] indices = meshData.getIndexListAsInt(); 283 prim.PhysShape = potentialMesh;
650 int realIndicesIndex = indices.Length; 284 ret = true;
651 float[] verticesAsFloats = meshData.getVertexListAsFloat();
652
653 if (BSParam.ShouldRemoveZeroWidthTriangles)
654 {
655 // Remove degenerate triangles. These are triangles with two of the vertices
656 // are the same. This is complicated by the problem that vertices are not
657 // made unique in sculpties so we have to compare the values in the vertex.
658 realIndicesIndex = 0;
659 for (int tri = 0; tri < indices.Length; tri += 3)
660 {
661 // Compute displacements into vertex array for each vertex of the triangle
662 int v1 = indices[tri + 0] * 3;
663 int v2 = indices[tri + 1] * 3;
664 int v3 = indices[tri + 2] * 3;
665 // Check to see if any two of the vertices are the same
666 if (!( ( verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0]
667 && verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1]
668 && verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2])
669 || ( verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0]
670 && verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1]
671 && verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2])
672 || ( verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0]
673 && verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1]
674 && verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2]) )
675 )
676 {
677 // None of the vertices of the triangles are the same. This is a good triangle;
678 indices[realIndicesIndex + 0] = indices[tri + 0];
679 indices[realIndicesIndex + 1] = indices[tri + 1];
680 indices[realIndicesIndex + 2] = indices[tri + 2];
681 realIndicesIndex += 3;
682 }
683 }
684 }
685 DetailLog("{0},BSShapeCollection.CreatePhysicalMesh,origTri={1},realTri={2},numVerts={3}",
686 BSScene.DetailLogZero, indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3);
687
688 if (realIndicesIndex != 0)
689 {
690 newShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World,
691 realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats);
692 }
693 else
694 {
695 PhysicsScene.Logger.DebugFormat("{0} All mesh triangles degenerate. Prim {1} at {2} in {3}",
696 LogHeader, prim.PhysObjectName, prim.RawPosition, PhysicsScene.Name);
697 }
698 } 285 }
286 else
287 {
288 // We don't need this reference to the mesh that is already being using.
289 potentialMesh.Dereference(m_physicsScene);
290 }
291 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,mesh,shape={1}", prim.LocalID, prim.PhysShape);
699 } 292 }
700 newShape.shapeKey = newMeshKey; 293 return ret;
701
702 return newShape;
703 }
704
705 // See that hull shape exists in the physical world and update prim.BSShape.
706 // We could be creating the hull because scale changed or whatever.
707 // Return 'true' if a new hull was built. Otherwise, returning a shared hull instance.
708 private bool GetReferenceToHull(BSPhysObject prim, ShapeDestructionCallback shapeCallback)
709 {
710 BulletShape newShape;
711
712 float lod;
713 System.UInt64 newHullKey = ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
714
715 // if the hull hasn't changed, don't rebuild it
716 if (newHullKey == prim.PhysShape.shapeKey && prim.PhysShape.type == BSPhysicsShapeType.SHAPE_HULL)
717 return false;
718
719 if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToHull,create,oldKey={1},newKey={2}",
720 prim.LocalID, prim.PhysShape.shapeKey.ToString("X"), newHullKey.ToString("X"));
721
722 // Remove usage of the previous shape.
723 DereferenceShape(prim.PhysShape, shapeCallback);
724
725 newShape = CreatePhysicalHull(prim.PhysObjectName, newHullKey, prim.BaseShape, prim.Size, lod);
726 // It might not have been created if we're waiting for an asset.
727 newShape = VerifyMeshCreated(newShape, prim);
728
729 ReferenceShape(newShape);
730
731 prim.PhysShape = newShape;
732 return true; // 'true' means a new shape has been added to this prim
733 } 294 }
734 295
735 List<ConvexResult> m_hulls; 296 // Track another user of a body.
736 private BulletShape CreatePhysicalHull(string objName, System.UInt64 newHullKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) 297 // We presume the caller has allocated the body.
298 // Bodies only have one user so the body is just put into the world if not already there.
299 private void ReferenceBody(BulletBody body)
737 { 300 {
738 301 lock (m_collectionActivityLock)
739 BulletShape newShape = new BulletShape();
740 IntPtr hullPtr = IntPtr.Zero;
741
742 HullDesc hullDesc;
743 if (Hulls.TryGetValue(newHullKey, out hullDesc))
744 {
745 // If the hull shape already has been created, just use the one shared instance.
746 newShape = hullDesc.shape.Clone();
747 }
748 else
749 { 302 {
750 // Build a new hull in the physical world. 303 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,newBody,body={1}", body.ID, body);
751 // Pass true for physicalness as this prevents the creation of bounding box which is not needed 304 if (!m_physicsScene.PE.IsInWorld(m_physicsScene.World, body))
752 IMesh meshData = PhysicsScene.mesher.CreateMesh(objName, pbs, size, lod, true, false, false, false);
753 if (meshData != null)
754 { 305 {
755 306 m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, body);
756 int[] indices = meshData.getIndexListAsInt(); 307 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,addedToWorld,ref={1}", body.ID, body);
757 List<OMV.Vector3> vertices = meshData.getVertexList();
758
759 //format conversion from IMesh format to DecompDesc format
760 List<int> convIndices = new List<int>();
761 List<float3> convVertices = new List<float3>();
762 for (int ii = 0; ii < indices.GetLength(0); ii++)
763 {
764 convIndices.Add(indices[ii]);
765 }
766 foreach (OMV.Vector3 vv in vertices)
767 {
768 convVertices.Add(new float3(vv.X, vv.Y, vv.Z));
769 }
770
771 uint maxDepthSplit = (uint)BSParam.CSHullMaxDepthSplit;
772 if (BSParam.CSHullMaxDepthSplit != BSParam.CSHullMaxDepthSplitForSimpleShapes)
773 {
774 // Simple primitive shapes we know are convex so they are better implemented with
775 // fewer hulls.
776 // Check for simple shape (prim without cuts) and reduce split parameter if so.
777 if (PrimHasNoCuts(pbs))
778 {
779 maxDepthSplit = (uint)BSParam.CSHullMaxDepthSplitForSimpleShapes;
780 }
781 }
782
783 // setup and do convex hull conversion
784 m_hulls = new List<ConvexResult>();
785 DecompDesc dcomp = new DecompDesc();
786 dcomp.mIndices = convIndices;
787 dcomp.mVertices = convVertices;
788 dcomp.mDepth = maxDepthSplit;
789 dcomp.mCpercent = BSParam.CSHullConcavityThresholdPercent;
790 dcomp.mPpercent = BSParam.CSHullVolumeConservationThresholdPercent;
791 dcomp.mMaxVertices = (uint)BSParam.CSHullMaxVertices;
792 dcomp.mSkinWidth = BSParam.CSHullMaxSkinWidth;
793 ConvexBuilder convexBuilder = new ConvexBuilder(HullReturn);
794 // create the hull into the _hulls variable
795 convexBuilder.process(dcomp);
796
797 DetailLog("{0},BSShapeCollection.CreatePhysicalHull,key={1},inVert={2},inInd={3},split={4},hulls={5}",
798 BSScene.DetailLogZero, newHullKey, indices.GetLength(0), vertices.Count, maxDepthSplit, m_hulls.Count);
799
800 // Convert the vertices and indices for passing to unmanaged.
801 // The hull information is passed as a large floating point array.
802 // The format is:
803 // convHulls[0] = number of hulls
804 // convHulls[1] = number of vertices in first hull
805 // convHulls[2] = hull centroid X coordinate
806 // convHulls[3] = hull centroid Y coordinate
807 // convHulls[4] = hull centroid Z coordinate
808 // convHulls[5] = first hull vertex X
809 // convHulls[6] = first hull vertex Y
810 // convHulls[7] = first hull vertex Z
811 // convHulls[8] = second hull vertex X
812 // ...
813 // convHulls[n] = number of vertices in second hull
814 // convHulls[n+1] = second hull centroid X coordinate
815 // ...
816 //
817 // TODO: is is very inefficient. Someday change the convex hull generator to return
818 // data structures that do not need to be converted in order to pass to Bullet.
819 // And maybe put the values directly into pinned memory rather than marshaling.
820 int hullCount = m_hulls.Count;
821 int totalVertices = 1; // include one for the count of the hulls
822 foreach (ConvexResult cr in m_hulls)
823 {
824 totalVertices += 4; // add four for the vertex count and centroid
825 totalVertices += cr.HullIndices.Count * 3; // we pass just triangles
826 }
827 float[] convHulls = new float[totalVertices];
828
829 convHulls[0] = (float)hullCount;
830 int jj = 1;
831 foreach (ConvexResult cr in m_hulls)
832 {
833 // copy vertices for index access
834 float3[] verts = new float3[cr.HullVertices.Count];
835 int kk = 0;
836 foreach (float3 ff in cr.HullVertices)
837 {
838 verts[kk++] = ff;
839 }
840
841 // add to the array one hull's worth of data
842 convHulls[jj++] = cr.HullIndices.Count;
843 convHulls[jj++] = 0f; // centroid x,y,z
844 convHulls[jj++] = 0f;
845 convHulls[jj++] = 0f;
846 foreach (int ind in cr.HullIndices)
847 {
848 convHulls[jj++] = verts[ind].x;
849 convHulls[jj++] = verts[ind].y;
850 convHulls[jj++] = verts[ind].z;
851 }
852 }
853 // create the hull data structure in Bullet
854 newShape = PhysicsScene.PE.CreateHullShape(PhysicsScene.World, hullCount, convHulls);
855 } 308 }
856 } 309 }
857
858 newShape.shapeKey = newHullKey;
859
860 return newShape;
861 }
862
863 // Callback from convex hull creater with a newly created hull.
864 // Just add it to our collection of hulls for this shape.
865 private void HullReturn(ConvexResult result)
866 {
867 m_hulls.Add(result);
868 return;
869 } 310 }
870 311
871 // Compound shapes are always built from scratch. 312 // Release the usage of a body.
872 // This shouldn't be to bad since most of the parts will be meshes that had been built previously. 313 // Called when releasing use of a BSBody. BSShape is handled separately.
873 private bool GetReferenceToCompoundShape(BSPhysObject prim, ShapeDestructionCallback shapeCallback) 314 // Called in taint time.
874 { 315 public void DereferenceBody(BulletBody body, PhysicalDestructionCallback bodyCallback )
875 // Remove reference to the old shape
876 // Don't need to do this as the shape is freed when the new root shape is created below.
877 // DereferenceShape(prim.PhysShape, true, shapeCallback);
878
879 BulletShape cShape = PhysicsScene.PE.CreateCompoundShape(PhysicsScene.World, false);
880
881 // Create the shape for the root prim and add it to the compound shape. Cannot be a native shape.
882 CreateGeomMeshOrHull(prim, shapeCallback);
883 PhysicsScene.PE.AddChildShapeToCompoundShape(cShape, prim.PhysShape, OMV.Vector3.Zero, OMV.Quaternion.Identity);
884 if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToCompoundShape,addRootPrim,compShape={1},rootShape={2}",
885 prim.LocalID, cShape, prim.PhysShape);
886
887 prim.PhysShape = cShape;
888
889 return true;
890 }
891
892 // Create a hash of all the shape parameters to be used as a key
893 // for this particular shape.
894 private System.UInt64 ComputeShapeKey(OMV.Vector3 size, PrimitiveBaseShape pbs, out float retLod)
895 {
896 // level of detail based on size and type of the object
897 float lod = BSParam.MeshLOD;
898
899 // prims with curvy internal cuts need higher lod
900 if (pbs.HollowShape == HollowShape.Circle)
901 lod = BSParam.MeshCircularLOD;
902
903 if (pbs.SculptEntry)
904 lod = BSParam.SculptLOD;
905
906 // Mega prims usually get more detail because one can interact with shape approximations at this size.
907 float maxAxis = Math.Max(size.X, Math.Max(size.Y, size.Z));
908 if (maxAxis > BSParam.MeshMegaPrimThreshold)
909 lod = BSParam.MeshMegaPrimLOD;
910
911 retLod = lod;
912 return pbs.GetMeshKey(size, lod);
913 }
914 // For those who don't want the LOD
915 private System.UInt64 ComputeShapeKey(OMV.Vector3 size, PrimitiveBaseShape pbs)
916 { 316 {
917 float lod; 317 if (!body.HasPhysicalBody)
918 return ComputeShapeKey(size, pbs, out lod); 318 return;
919 }
920 319
921 // The creation of a mesh or hull can fail if an underlying asset is not available. 320 m_physicsScene.AssertInTaintTime("BSShapeCollection.DereferenceBody");
922 // There are two cases: 1) the asset is not in the cache and it needs to be fetched;
923 // and 2) the asset cannot be converted (like failed decompression of JPEG2000s).
924 // The first case causes the asset to be fetched. The second case requires
925 // us to not loop forever.
926 // Called after creating a physical mesh or hull. If the physical shape was created,
927 // just return.
928 private BulletShape VerifyMeshCreated(BulletShape newShape, BSPhysObject prim)
929 {
930 // If the shape was successfully created, nothing more to do
931 if (newShape.HasPhysicalShape)
932 return newShape;
933 321
934 // VerifyMeshCreated is called after trying to create the mesh. If we think the asset had been 322 lock (m_collectionActivityLock)
935 // fetched but we end up here again, the meshing of the asset must have failed.
936 // Prevent trying to keep fetching the mesh by declaring failure.
937 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched)
938 {
939 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed;
940 PhysicsScene.Logger.WarnFormat("{0} Fetched asset would not mesh. {1}, texture={2}",
941 LogHeader, prim.PhysObjectName, prim.BaseShape.SculptTexture);
942 }
943 else
944 { 323 {
945 // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset 324 if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceBody,DestroyingBody,body={1}", body.ID, body);
946 if (prim.BaseShape.SculptEntry 325 // If the caller needs to know the old body is going away, pass the event up.
947 && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.Failed 326 if (bodyCallback != null)
948 && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.Waiting 327 bodyCallback(body, null);
949 && prim.BaseShape.SculptTexture != OMV.UUID.Zero
950 )
951 {
952 DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset", prim.LocalID);
953 // Multiple requestors will know we're waiting for this asset
954 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Waiting;
955
956 BSPhysObject xprim = prim;
957 Util.FireAndForget(delegate
958 {
959 RequestAssetDelegate assetProvider = PhysicsScene.RequestAssetMethod;
960 if (assetProvider != null)
961 {
962 BSPhysObject yprim = xprim; // probably not necessary, but, just in case.
963 assetProvider(yprim.BaseShape.SculptTexture, delegate(AssetBase asset)
964 {
965 bool assetFound = false;
966 string mismatchIDs = String.Empty; // DEBUG DEBUG
967 if (asset != null && yprim.BaseShape.SculptEntry)
968 {
969 if (yprim.BaseShape.SculptTexture.ToString() == asset.ID)
970 {
971 yprim.BaseShape.SculptData = asset.Data;
972 // This will cause the prim to see that the filler shape is not the right
973 // one and try again to build the object.
974 // No race condition with the normal shape setting since the rebuild is at taint time.
975 yprim.ForceBodyShapeRebuild(false /* inTaintTime */);
976 assetFound = true;
977 }
978 else
979 {
980 mismatchIDs = yprim.BaseShape.SculptTexture.ToString() + "/" + asset.ID;
981 }
982 }
983 if (assetFound)
984 yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Fetched;
985 else
986 yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed;
987 DetailLog("{0},BSShapeCollection,fetchAssetCallback,found={1},isSculpt={2},ids={3}",
988 yprim.LocalID, assetFound, yprim.BaseShape.SculptEntry, mismatchIDs );
989 328
990 }); 329 // Removing an object not in the world is a NOOP
991 } 330 m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, body);
992 else
993 {
994 xprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed;
995 PhysicsScene.Logger.ErrorFormat("{0} Physical object requires asset but no asset provider. Name={1}",
996 LogHeader, PhysicsScene.Name);
997 }
998 });
999 }
1000 else
1001 {
1002 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Failed)
1003 {
1004 PhysicsScene.Logger.WarnFormat("{0} Mesh failed to fetch asset. obj={1}, texture={2}",
1005 LogHeader, prim.PhysObjectName, prim.BaseShape.SculptTexture);
1006 }
1007 }
1008 }
1009 331
1010 // While we wait for the mesh defining asset to be loaded, stick in a simple box for the object. 332 // Zero any reference to the shape so it is not freed when the body is deleted.
1011 BulletShape fillinShape = BuildPhysicalNativeShape(prim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX); 333 m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, body, null);
1012 DetailLog("{0},BSShapeCollection.VerifyMeshCreated,boxTempShape", prim.LocalID);
1013 334
1014 return fillinShape; 335 m_physicsScene.PE.DestroyObject(m_physicsScene.World, body);
336 }
1015 } 337 }
1016 338
1017 // Create a body object in Bullet. 339 // Create a body object in Bullet.
1018 // Updates prim.BSBody with the information about the new body if one is created. 340 // Updates prim.BSBody with the information about the new body if one is created.
1019 // Returns 'true' if an object was actually created. 341 // Returns 'true' if an object was actually created.
1020 // Called at taint-time. 342 // Called at taint-time.
1021 private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletWorld sim, BodyDestructionCallback bodyCallback) 343 private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletWorld sim, PhysicalDestructionCallback bodyCallback)
1022 { 344 {
1023 bool ret = false; 345 bool ret = false;
1024 346
@@ -1029,7 +351,7 @@ public sealed class BSShapeCollection : IDisposable
1029 // If not a solid object, body is a GhostObject. Otherwise a RigidBody. 351 // If not a solid object, body is a GhostObject. Otherwise a RigidBody.
1030 if (!mustRebuild) 352 if (!mustRebuild)
1031 { 353 {
1032 CollisionObjectTypes bodyType = (CollisionObjectTypes)PhysicsScene.PE.GetBodyType(prim.PhysBody); 354 CollisionObjectTypes bodyType = (CollisionObjectTypes)m_physicsScene.PE.GetBodyType(prim.PhysBody);
1033 if (prim.IsSolid && bodyType != CollisionObjectTypes.CO_RIGID_BODY 355 if (prim.IsSolid && bodyType != CollisionObjectTypes.CO_RIGID_BODY
1034 || !prim.IsSolid && bodyType != CollisionObjectTypes.CO_GHOST_OBJECT) 356 || !prim.IsSolid && bodyType != CollisionObjectTypes.CO_GHOST_OBJECT)
1035 { 357 {
@@ -1047,12 +369,12 @@ public sealed class BSShapeCollection : IDisposable
1047 BulletBody aBody; 369 BulletBody aBody;
1048 if (prim.IsSolid) 370 if (prim.IsSolid)
1049 { 371 {
1050 aBody = PhysicsScene.PE.CreateBodyFromShape(sim, prim.PhysShape, prim.LocalID, prim.RawPosition, prim.RawOrientation); 372 aBody = m_physicsScene.PE.CreateBodyFromShape(sim, prim.PhysShape.physShapeInfo, prim.LocalID, prim.RawPosition, prim.RawOrientation);
1051 if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,mesh,body={1}", prim.LocalID, aBody); 373 if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,rigid,body={1}", prim.LocalID, aBody);
1052 } 374 }
1053 else 375 else
1054 { 376 {
1055 aBody = PhysicsScene.PE.CreateGhostFromShape(sim, prim.PhysShape, prim.LocalID, prim.RawPosition, prim.RawOrientation); 377 aBody = m_physicsScene.PE.CreateGhostFromShape(sim, prim.PhysShape.physShapeInfo, prim.LocalID, prim.RawPosition, prim.RawOrientation);
1056 if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,ghost,body={1}", prim.LocalID, aBody); 378 if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,ghost,body={1}", prim.LocalID, aBody);
1057 } 379 }
1058 380
@@ -1066,46 +388,10 @@ public sealed class BSShapeCollection : IDisposable
1066 return ret; 388 return ret;
1067 } 389 }
1068 390
1069 private bool TryGetMeshByPtr(BulletShape shape, out MeshDesc outDesc)
1070 {
1071 bool ret = false;
1072 MeshDesc foundDesc = new MeshDesc();
1073 foreach (MeshDesc md in Meshes.Values)
1074 {
1075 if (md.shape.ReferenceSame(shape))
1076 {
1077 foundDesc = md;
1078 ret = true;
1079 break;
1080 }
1081
1082 }
1083 outDesc = foundDesc;
1084 return ret;
1085 }
1086
1087 private bool TryGetHullByPtr(BulletShape shape, out HullDesc outDesc)
1088 {
1089 bool ret = false;
1090 HullDesc foundDesc = new HullDesc();
1091 foreach (HullDesc hd in Hulls.Values)
1092 {
1093 if (hd.shape.ReferenceSame(shape))
1094 {
1095 foundDesc = hd;
1096 ret = true;
1097 break;
1098 }
1099
1100 }
1101 outDesc = foundDesc;
1102 return ret;
1103 }
1104
1105 private void DetailLog(string msg, params Object[] args) 391 private void DetailLog(string msg, params Object[] args)
1106 { 392 {
1107 if (PhysicsScene.PhysicsLogging.Enabled) 393 if (m_physicsScene.PhysicsLogging.Enabled)
1108 PhysicsScene.DetailLog(msg, args); 394 m_physicsScene.DetailLog(msg, args);
1109 } 395 }
1110} 396}
1111} 397}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
index ee18379..5a0a14c 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapes.cs
@@ -29,115 +29,312 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Text; 30using System.Text;
31 31
32using OpenSim.Framework;
33using OpenSim.Region.Physics.Manager;
34using OpenSim.Region.Physics.Meshing;
35using OpenSim.Region.Physics.ConvexDecompositionDotNet;
36
32using OMV = OpenMetaverse; 37using OMV = OpenMetaverse;
33 38
34namespace OpenSim.Region.Physics.BulletSPlugin 39namespace OpenSim.Region.Physics.BulletSPlugin
35{ 40{
36public abstract class BSShape 41public abstract class BSShape
37{ 42{
43 private static string LogHeader = "[BULLETSIM SHAPE]";
44
38 public int referenceCount { get; set; } 45 public int referenceCount { get; set; }
39 public DateTime lastReferenced { get; set; } 46 public DateTime lastReferenced { get; set; }
47 public BulletShape physShapeInfo { get; set; }
40 48
41 public BSShape() 49 public BSShape()
42 { 50 {
43 referenceCount = 0; 51 referenceCount = 1;
44 lastReferenced = DateTime.Now; 52 lastReferenced = DateTime.Now;
53 physShapeInfo = new BulletShape();
45 } 54 }
46 55 public BSShape(BulletShape pShape)
47 // Get a reference to a physical shape. Create if it doesn't exist
48 public static BSShape GetShapeReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim)
49 { 56 {
50 BSShape ret = null; 57 referenceCount = 1;
51 58 lastReferenced = DateTime.Now;
52 if (prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) 59 physShapeInfo = pShape;
53 { 60 }
54 // an avatar capsule is close to a native shape (it is not shared)
55 ret = BSShapeNative.GetReference(physicsScene, prim, BSPhysicsShapeType.SHAPE_CAPSULE,
56 FixedShapeKey.KEY_CAPSULE);
57 physicsScene.DetailLog("{0},BSShape.GetShapeReference,avatarCapsule,shape={1}", prim.LocalID, ret);
58 }
59
60 // Compound shapes are handled special as they are rebuilt from scratch.
61 // This isn't too great a hardship since most of the child shapes will have already been created.
62 if (ret == null && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND)
63 {
64 // Getting a reference to a compound shape gets you the compound shape with the root prim shape added
65 ret = BSShapeCompound.GetReference(prim);
66 physicsScene.DetailLog("{0},BSShapeCollection.CreateGeom,compoundShape,shape={1}", prim.LocalID, ret);
67 }
68
69 // Avatars have their own unique shape
70 if (ret == null && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_AVATAR)
71 {
72 // Getting a reference to a compound shape gets you the compound shape with the root prim shape added
73 ret = BSShapeAvatar.GetReference(prim);
74 physicsScene.DetailLog("{0},BSShapeCollection.CreateGeom,avatarShape,shape={1}", prim.LocalID, ret);
75 }
76 61
77 if (ret == null) 62 // Get another reference to this shape.
78 ret = GetShapeReferenceNonSpecial(physicsScene, forceRebuild, prim); 63 public abstract BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim);
79 64
80 return ret; 65 // Called when this shape is being used again.
81 } 66 // Used internally. External callers should call instance.GetReference() to properly copy/reference
82 public static BSShape GetShapeReferenceNonSpecial(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) 67 // the shape.
68 protected virtual void IncrementReference()
83 { 69 {
84 return null; 70 referenceCount++;
71 lastReferenced = DateTime.Now;
85 } 72 }
86 public static BSShape GetShapeReferenceNonNative(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) 73
74 // Called when this shape is being used again.
75 protected virtual void DecrementReference()
87 { 76 {
88 return null; 77 referenceCount--;
78 lastReferenced = DateTime.Now;
89 } 79 }
90 80
91 // Release the use of a physical shape. 81 // Release the use of a physical shape.
92 public abstract void Dereference(BSScene physicsScene); 82 public abstract void Dereference(BSScene physicsScene);
93 83
94 // All shapes have a static call to get a reference to the physical shape 84 // Return 'true' if there is an allocated physics physical shape under this class instance.
95 // protected abstract static BSShape GetReference(); 85 public virtual bool HasPhysicalShape
86 {
87 get
88 {
89 if (physShapeInfo != null)
90 return physShapeInfo.HasPhysicalShape;
91 return false;
92 }
93 }
94 public virtual BSPhysicsShapeType ShapeType
95 {
96 get
97 {
98 BSPhysicsShapeType ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
99 if (physShapeInfo != null && physShapeInfo.HasPhysicalShape)
100 ret = physShapeInfo.shapeType;
101 return ret;
102 }
103 }
96 104
97 // Returns a string for debugging that uniquily identifies the memory used by this instance 105 // Returns a string for debugging that uniquily identifies the memory used by this instance
98 public virtual string AddrString 106 public virtual string AddrString
99 { 107 {
100 get { return "unknown"; } 108 get
109 {
110 if (physShapeInfo != null)
111 return physShapeInfo.AddrString;
112 return "unknown";
113 }
101 } 114 }
102 115
103 public override string ToString() 116 public override string ToString()
104 { 117 {
105 StringBuilder buff = new StringBuilder(); 118 StringBuilder buff = new StringBuilder();
106 buff.Append("<p="); 119 if (physShapeInfo == null)
107 buff.Append(AddrString); 120 {
121 buff.Append("<noPhys");
122 }
123 else
124 {
125 buff.Append("<phy=");
126 buff.Append(physShapeInfo.ToString());
127 }
108 buff.Append(",c="); 128 buff.Append(",c=");
109 buff.Append(referenceCount.ToString()); 129 buff.Append(referenceCount.ToString());
110 buff.Append(">"); 130 buff.Append(">");
111 return buff.ToString(); 131 return buff.ToString();
112 } 132 }
133
134 #region Common shape routines
135 // Create a hash of all the shape parameters to be used as a key for this particular shape.
136 public static System.UInt64 ComputeShapeKey(OMV.Vector3 size, PrimitiveBaseShape pbs, out float retLod)
137 {
138 // level of detail based on size and type of the object
139 float lod = BSParam.MeshLOD;
140 if (pbs.SculptEntry)
141 lod = BSParam.SculptLOD;
142
143 // Mega prims usually get more detail because one can interact with shape approximations at this size.
144 float maxAxis = Math.Max(size.X, Math.Max(size.Y, size.Z));
145 if (maxAxis > BSParam.MeshMegaPrimThreshold)
146 lod = BSParam.MeshMegaPrimLOD;
147
148 retLod = lod;
149 return pbs.GetMeshKey(size, lod);
150 }
151
152 // The creation of a mesh or hull can fail if an underlying asset is not available.
153 // There are two cases: 1) the asset is not in the cache and it needs to be fetched;
154 // and 2) the asset cannot be converted (like failed decompression of JPEG2000s).
155 // The first case causes the asset to be fetched. The second case requires
156 // us to not loop forever.
157 // Called after creating a physical mesh or hull. If the physical shape was created,
158 // just return.
159 public static BulletShape VerifyMeshCreated(BSScene physicsScene, BulletShape newShape, BSPhysObject prim)
160 {
161 // If the shape was successfully created, nothing more to do
162 if (newShape.HasPhysicalShape)
163 return newShape;
164
165 // VerifyMeshCreated is called after trying to create the mesh. If we think the asset had been
166 // fetched but we end up here again, the meshing of the asset must have failed.
167 // Prevent trying to keep fetching the mesh by declaring failure.
168 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched)
169 {
170 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.FailedMeshing;
171 physicsScene.Logger.WarnFormat("{0} Fetched asset would not mesh. prim={1}, texture={2}",
172 LogHeader, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
173 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,setFailed,prim={1},tex={2}",
174 prim.LocalID, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
175 }
176 else
177 {
178 // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset
179 if (prim.BaseShape.SculptEntry
180 && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.FailedAssetFetch
181 && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.FailedMeshing
182 && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.Waiting
183 && prim.BaseShape.SculptTexture != OMV.UUID.Zero
184 )
185 {
186 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,fetchAsset,objNam={1},tex={2}",
187 prim.LocalID, prim.PhysObjectName, prim.BaseShape.SculptTexture);
188 // Multiple requestors will know we're waiting for this asset
189 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Waiting;
190
191 BSPhysObject xprim = prim;
192 Util.FireAndForget(delegate
193 {
194 // physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,inFireAndForget", xprim.LocalID);
195 RequestAssetDelegate assetProvider = physicsScene.RequestAssetMethod;
196 if (assetProvider != null)
197 {
198 BSPhysObject yprim = xprim; // probably not necessary, but, just in case.
199 assetProvider(yprim.BaseShape.SculptTexture, delegate(AssetBase asset)
200 {
201 // physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,assetProviderCallback", xprim.LocalID);
202 bool assetFound = false;
203 string mismatchIDs = String.Empty; // DEBUG DEBUG
204 if (asset != null && yprim.BaseShape.SculptEntry)
205 {
206 if (yprim.BaseShape.SculptTexture.ToString() == asset.ID)
207 {
208 yprim.BaseShape.SculptData = asset.Data;
209 // This will cause the prim to see that the filler shape is not the right
210 // one and try again to build the object.
211 // No race condition with the normal shape setting since the rebuild is at taint time.
212 yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Fetched;
213 yprim.ForceBodyShapeRebuild(false /* inTaintTime */);
214 assetFound = true;
215 }
216 else
217 {
218 mismatchIDs = yprim.BaseShape.SculptTexture.ToString() + "/" + asset.ID;
219 }
220 }
221 if (!assetFound)
222 {
223 yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.FailedAssetFetch;
224 }
225 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,fetchAssetCallback,found={1},isSculpt={2},ids={3}",
226 yprim.LocalID, assetFound, yprim.BaseShape.SculptEntry, mismatchIDs );
227 });
228 }
229 else
230 {
231 xprim.PrimAssetState = BSPhysObject.PrimAssetCondition.FailedAssetFetch;
232 physicsScene.Logger.ErrorFormat("{0} Physical object requires asset but no asset provider. Name={1}",
233 LogHeader, physicsScene.Name);
234 }
235 });
236 }
237 else
238 {
239 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedAssetFetch)
240 {
241 physicsScene.Logger.WarnFormat("{0} Mesh failed to fetch asset. prim={1}, texture={2}",
242 LogHeader, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
243 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,wasFailed,prim={1},tex={2}",
244 prim.LocalID, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
245 }
246 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedMeshing)
247 {
248 physicsScene.Logger.WarnFormat("{0} Mesh asset would not mesh. prim={1}, texture={2}",
249 LogHeader, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
250 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,wasFailedMeshing,prim={1},tex={2}",
251 prim.LocalID, UsefulPrimInfo(physicsScene, prim), prim.BaseShape.SculptTexture);
252 }
253 }
254 }
255
256 // While we wait for the mesh defining asset to be loaded, stick in a simple box for the object.
257 BSShape fillShape = BSShapeNative.GetReference(physicsScene, prim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX);
258 physicsScene.DetailLog("{0},BSShape.VerifyMeshCreated,boxTempShape", prim.LocalID);
259
260 return fillShape.physShapeInfo;
261 }
262
263 public static String UsefulPrimInfo(BSScene pScene, BSPhysObject prim)
264 {
265 StringBuilder buff = new StringBuilder(prim.PhysObjectName);
266 buff.Append("/pos=");
267 buff.Append(prim.RawPosition.ToString());
268 if (pScene != null)
269 {
270 buff.Append("/rgn=");
271 buff.Append(pScene.Name);
272 }
273 return buff.ToString();
274 }
275
276 #endregion // Common shape routines
113} 277}
114 278
279// ============================================================================================================
115public class BSShapeNull : BSShape 280public class BSShapeNull : BSShape
116{ 281{
117 public BSShapeNull() : base() 282 public BSShapeNull() : base()
118 { 283 {
119 } 284 }
120 public static BSShape GetReference() { return new BSShapeNull(); } 285 public static BSShape GetReference() { return new BSShapeNull(); }
286 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim) { return new BSShapeNull(); }
121 public override void Dereference(BSScene physicsScene) { /* The magic of garbage collection will make this go away */ } 287 public override void Dereference(BSScene physicsScene) { /* The magic of garbage collection will make this go away */ }
122} 288}
123 289
290// ============================================================================================================
124public class BSShapeNative : BSShape 291public class BSShapeNative : BSShape
125{ 292{
126 private static string LogHeader = "[BULLETSIM SHAPE NATIVE]"; 293 private static string LogHeader = "[BULLETSIM SHAPE NATIVE]";
127 public BSShapeNative() : base() 294 public BSShapeNative(BulletShape pShape) : base(pShape)
128 { 295 {
129 } 296 }
130 public static BSShape GetReference(BSScene physicsScene, BSPhysObject prim, 297
131 BSPhysicsShapeType shapeType, FixedShapeKey shapeKey) 298 public static BSShape GetReference(BSScene physicsScene, BSPhysObject prim,
299 BSPhysicsShapeType shapeType, FixedShapeKey shapeKey)
132 { 300 {
133 // Native shapes are not shared and are always built anew. 301 // Native shapes are not shared and are always built anew.
134 //return new BSShapeNative(physicsScene, prim, shapeType, shapeKey); 302 return new BSShapeNative(CreatePhysicalNativeShape(physicsScene, prim, shapeType, shapeKey));
135 return null;
136 } 303 }
137 304
138 private BSShapeNative(BSScene physicsScene, BSPhysObject prim, 305 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim)
139 BSPhysicsShapeType shapeType, FixedShapeKey shapeKey)
140 { 306 {
307 // Native shapes are not shared so we return a new shape.
308 BSShape ret = null;
309 lock (physShapeInfo)
310 {
311 ret = new BSShapeNative(CreatePhysicalNativeShape(pPhysicsScene, pPrim,
312 physShapeInfo.shapeType, (FixedShapeKey)physShapeInfo.shapeKey));
313 }
314 return ret;
315 }
316
317 // Make this reference to the physical shape go away since native shapes are not shared.
318 public override void Dereference(BSScene physicsScene)
319 {
320 // Native shapes are not tracked and are released immediately
321 lock (physShapeInfo)
322 {
323 if (physShapeInfo.HasPhysicalShape)
324 {
325 physicsScene.DetailLog("{0},BSShapeNative.Dereference,deleteNativeShape,shape={1}", BSScene.DetailLogZero, this);
326 physicsScene.PE.DeleteCollisionShape(physicsScene.World, physShapeInfo);
327 }
328 physShapeInfo.Clear();
329 // Garbage collection will free up this instance.
330 }
331 }
332
333 private static BulletShape CreatePhysicalNativeShape(BSScene physicsScene, BSPhysObject prim,
334 BSPhysicsShapeType shapeType, FixedShapeKey shapeKey)
335 {
336 BulletShape newShape;
337
141 ShapeData nativeShapeData = new ShapeData(); 338 ShapeData nativeShapeData = new ShapeData();
142 nativeShapeData.Type = shapeType; 339 nativeShapeData.Type = shapeType;
143 nativeShapeData.ID = prim.LocalID; 340 nativeShapeData.ID = prim.LocalID;
@@ -146,84 +343,855 @@ public class BSShapeNative : BSShape
146 nativeShapeData.MeshKey = (ulong)shapeKey; 343 nativeShapeData.MeshKey = (ulong)shapeKey;
147 nativeShapeData.HullKey = (ulong)shapeKey; 344 nativeShapeData.HullKey = (ulong)shapeKey;
148 345
149
150 /*
151 if (shapeType == BSPhysicsShapeType.SHAPE_CAPSULE) 346 if (shapeType == BSPhysicsShapeType.SHAPE_CAPSULE)
152 { 347 {
153 ptr = PhysicsScene.PE.BuildCapsuleShape(physicsScene.World, 1f, 1f, prim.Scale); 348 newShape = physicsScene.PE.BuildCapsuleShape(physicsScene.World, 1f, 1f, prim.Scale);
154 physicsScene.DetailLog("{0},BSShapeCollection.BuiletPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale); 349 physicsScene.DetailLog("{0},BSShapeNative,capsule,scale={1}", prim.LocalID, prim.Scale);
155 } 350 }
156 else 351 else
157 { 352 {
158 ptr = PhysicsScene.PE.BuildNativeShape(physicsScene.World, nativeShapeData); 353 newShape = physicsScene.PE.BuildNativeShape(physicsScene.World, nativeShapeData);
159 } 354 }
160 if (ptr == IntPtr.Zero) 355 if (!newShape.HasPhysicalShape)
161 { 356 {
162 physicsScene.Logger.ErrorFormat("{0} BuildPhysicalNativeShape failed. ID={1}, shape={2}", 357 physicsScene.Logger.ErrorFormat("{0} BuildPhysicalNativeShape failed. ID={1}, shape={2}",
163 LogHeader, prim.LocalID, shapeType); 358 LogHeader, prim.LocalID, shapeType);
164 } 359 }
165 type = shapeType; 360 newShape.shapeType = shapeType;
166 key = (UInt64)shapeKey; 361 newShape.isNativeShape = true;
167 */ 362 newShape.shapeKey = (UInt64)shapeKey;
168 } 363 return newShape;
169 // Make this reference to the physical shape go away since native shapes are not shared.
170 public override void Dereference(BSScene physicsScene)
171 {
172 /*
173 // Native shapes are not tracked and are released immediately
174 physicsScene.DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,shape={1}", BSScene.DetailLogZero, this);
175 PhysicsScene.PE.DeleteCollisionShape(physicsScene.World, this);
176 ptr = IntPtr.Zero;
177 // Garbage collection will free up this instance.
178 */
179 } 364 }
365
180} 366}
181 367
368// ============================================================================================================
182public class BSShapeMesh : BSShape 369public class BSShapeMesh : BSShape
183{ 370{
184 private static string LogHeader = "[BULLETSIM SHAPE MESH]"; 371 private static string LogHeader = "[BULLETSIM SHAPE MESH]";
185 private static Dictionary<System.UInt64, BSShapeMesh> Meshes = new Dictionary<System.UInt64, BSShapeMesh>(); 372 public static Dictionary<System.UInt64, BSShapeMesh> Meshes = new Dictionary<System.UInt64, BSShapeMesh>();
186 373
187 public BSShapeMesh() : base() 374 public BSShapeMesh(BulletShape pShape) : base(pShape)
188 { 375 {
189 } 376 }
190 public static BSShape GetReference() { return new BSShapeNull(); } 377 public static BSShape GetReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim)
191 public override void Dereference(BSScene physicsScene) { } 378 {
379 float lod;
380 System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
381
382 BSShapeMesh retMesh = null;
383 lock (Meshes)
384 {
385 if (Meshes.TryGetValue(newMeshKey, out retMesh))
386 {
387 // The mesh has already been created. Return a new reference to same.
388 retMesh.IncrementReference();
389 }
390 else
391 {
392 retMesh = new BSShapeMesh(new BulletShape());
393 // An instance of this mesh has not been created. Build and remember same.
394 BulletShape newShape = retMesh.CreatePhysicalMesh(physicsScene, prim, newMeshKey, prim.BaseShape, prim.Size, lod);
395
396 // Check to see if mesh was created (might require an asset).
397 newShape = VerifyMeshCreated(physicsScene, newShape, prim);
398 if (!newShape.isNativeShape
399 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedMeshing
400 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedAssetFetch)
401 {
402 // If a mesh was what was created, remember the built shape for later sharing.
403 // Also note that if meshing failed we put it in the mesh list as there is nothing else to do about the mesh.
404 Meshes.Add(newMeshKey, retMesh);
405 }
406
407 retMesh.physShapeInfo = newShape;
408 }
409 }
410 physicsScene.DetailLog("{0},BSShapeMesh,getReference,mesh={1},size={2},lod={3}", prim.LocalID, retMesh, prim.Size, lod);
411 return retMesh;
412 }
413 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim)
414 {
415 BSShape ret = null;
416 // If the underlying shape is native, the actual shape has not been build (waiting for asset)
417 // and we must create a copy of the native shape since they are never shared.
418 if (physShapeInfo.HasPhysicalShape && physShapeInfo.isNativeShape)
419 {
420 // TODO: decide when the native shapes should be freed. Check in Dereference?
421 ret = BSShapeNative.GetReference(pPhysicsScene, pPrim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX);
422 }
423 else
424 {
425 // Another reference to this shape is just counted.
426 IncrementReference();
427 ret = this;
428 }
429 return ret;
430 }
431 public override void Dereference(BSScene physicsScene)
432 {
433 lock (Meshes)
434 {
435 this.DecrementReference();
436 physicsScene.DetailLog("{0},BSShapeMesh.Dereference,shape={1}", BSScene.DetailLogZero, this);
437 // TODO: schedule aging and destruction of unused meshes.
438 }
439 }
440 // Loop through all the known meshes and return the description based on the physical address.
441 public static bool TryGetMeshByPtr(BulletShape pShape, out BSShapeMesh outMesh)
442 {
443 bool ret = false;
444 BSShapeMesh foundDesc = null;
445 lock (Meshes)
446 {
447 foreach (BSShapeMesh sm in Meshes.Values)
448 {
449 if (sm.physShapeInfo.ReferenceSame(pShape))
450 {
451 foundDesc = sm;
452 ret = true;
453 break;
454 }
455
456 }
457 }
458 outMesh = foundDesc;
459 return ret;
460 }
461
462 public delegate BulletShape CreateShapeCall(BulletWorld world, int indicesCount, int[] indices, int verticesCount, float[] vertices );
463 private BulletShape CreatePhysicalMesh(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey,
464 PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
465 {
466 return BSShapeMesh.CreatePhysicalMeshShape(physicsScene, prim, newMeshKey, pbs, size, lod,
467 (w, iC, i, vC, v) => physicsScene.PE.CreateMeshShape(w, iC, i, vC, v) );
468 }
469
470 // Code that uses the mesher to create the index/vertices info for a trimesh shape.
471 // This is used by the passed 'makeShape' call to create the Bullet mesh shape.
472 // The actual build call is passed so this logic can be used by several of the shapes that use a
473 // simple mesh as their base shape.
474 public static BulletShape CreatePhysicalMeshShape(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey,
475 PrimitiveBaseShape pbs, OMV.Vector3 size, float lod, CreateShapeCall makeShape)
476 {
477 BulletShape newShape = new BulletShape();
478
479 IMesh meshData = null;
480 lock (physicsScene.mesher)
481 {
482 meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod,
483 false, // say it is not physical so a bounding box is not built
484 false, // do not cache the mesh and do not use previously built versions
485 false,
486 false
487 );
488 }
489
490 if (meshData != null)
491 {
492 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched)
493 {
494 // Release the fetched asset data once it has been used.
495 pbs.SculptData = new byte[0];
496 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Unknown;
497 }
498
499 int[] indices = meshData.getIndexListAsInt();
500 int realIndicesIndex = indices.Length;
501 float[] verticesAsFloats = meshData.getVertexListAsFloat();
502
503 if (BSParam.ShouldRemoveZeroWidthTriangles)
504 {
505 // Remove degenerate triangles. These are triangles with two of the vertices
506 // are the same. This is complicated by the problem that vertices are not
507 // made unique in sculpties so we have to compare the values in the vertex.
508 realIndicesIndex = 0;
509 for (int tri = 0; tri < indices.Length; tri += 3)
510 {
511 // Compute displacements into vertex array for each vertex of the triangle
512 int v1 = indices[tri + 0] * 3;
513 int v2 = indices[tri + 1] * 3;
514 int v3 = indices[tri + 2] * 3;
515 // Check to see if any two of the vertices are the same
516 if (!( ( verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0]
517 && verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1]
518 && verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2])
519 || ( verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0]
520 && verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1]
521 && verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2])
522 || ( verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0]
523 && verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1]
524 && verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2]) )
525 )
526 {
527 // None of the vertices of the triangles are the same. This is a good triangle;
528 indices[realIndicesIndex + 0] = indices[tri + 0];
529 indices[realIndicesIndex + 1] = indices[tri + 1];
530 indices[realIndicesIndex + 2] = indices[tri + 2];
531 realIndicesIndex += 3;
532 }
533 }
534 }
535 physicsScene.DetailLog("{0},BSShapeMesh.CreatePhysicalMesh,key={1},origTri={2},realTri={3},numVerts={4}",
536 BSScene.DetailLogZero, newMeshKey.ToString("X"), indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3);
537
538 if (realIndicesIndex != 0)
539 {
540 newShape = makeShape(physicsScene.World, realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats);
541 }
542 else
543 {
544 // Force the asset condition to 'failed' so we won't try to keep fetching and processing this mesh.
545 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.FailedMeshing;
546 physicsScene.Logger.DebugFormat("{0} All mesh triangles degenerate. Prim={1}", LogHeader, UsefulPrimInfo(physicsScene, prim) );
547 physicsScene.DetailLog("{0},BSShapeMesh.CreatePhysicalMesh,allDegenerate,key={1}", prim.LocalID, newMeshKey);
548 }
549 }
550 newShape.shapeKey = newMeshKey;
551
552 return newShape;
553 }
192} 554}
193 555
556// ============================================================================================================
194public class BSShapeHull : BSShape 557public class BSShapeHull : BSShape
195{ 558{
196 private static string LogHeader = "[BULLETSIM SHAPE HULL]"; 559 private static string LogHeader = "[BULLETSIM SHAPE HULL]";
197 private static Dictionary<System.UInt64, BSShapeHull> Hulls = new Dictionary<System.UInt64, BSShapeHull>(); 560 public static Dictionary<System.UInt64, BSShapeHull> Hulls = new Dictionary<System.UInt64, BSShapeHull>();
198 561
199 public BSShapeHull() : base() 562 public BSShapeHull(BulletShape pShape) : base(pShape)
200 { 563 {
201 } 564 }
202 public static BSShape GetReference() { return new BSShapeNull(); } 565 public static BSShape GetReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim)
203 public override void Dereference(BSScene physicsScene) { } 566 {
567 float lod;
568 System.UInt64 newHullKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
569
570 BSShapeHull retHull = null;
571 lock (Hulls)
572 {
573 if (Hulls.TryGetValue(newHullKey, out retHull))
574 {
575 // The mesh has already been created. Return a new reference to same.
576 retHull.IncrementReference();
577 }
578 else
579 {
580 retHull = new BSShapeHull(new BulletShape());
581 // An instance of this mesh has not been created. Build and remember same.
582 BulletShape newShape = retHull.CreatePhysicalHull(physicsScene, prim, newHullKey, prim.BaseShape, prim.Size, lod);
583
584 // Check to see if hull was created (might require an asset).
585 newShape = VerifyMeshCreated(physicsScene, newShape, prim);
586 if (!newShape.isNativeShape
587 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedMeshing
588 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedAssetFetch)
589 {
590 // If a mesh was what was created, remember the built shape for later sharing.
591 Hulls.Add(newHullKey, retHull);
592 }
593 retHull.physShapeInfo = newShape;
594 }
595 }
596 physicsScene.DetailLog("{0},BSShapeHull,getReference,hull={1},size={2},lod={3}", prim.LocalID, retHull, prim.Size, lod);
597 return retHull;
598 }
599 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim)
600 {
601 BSShape ret = null;
602 // If the underlying shape is native, the actual shape has not been build (waiting for asset)
603 // and we must create a copy of the native shape since they are never shared.
604 if (physShapeInfo.HasPhysicalShape && physShapeInfo.isNativeShape)
605 {
606 // TODO: decide when the native shapes should be freed. Check in Dereference?
607 ret = BSShapeNative.GetReference(pPhysicsScene, pPrim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX);
608 }
609 else
610 {
611 // Another reference to this shape is just counted.
612 IncrementReference();
613 ret = this;
614 }
615 return ret;
616 }
617 public override void Dereference(BSScene physicsScene)
618 {
619 lock (Hulls)
620 {
621 this.DecrementReference();
622 physicsScene.DetailLog("{0},BSShapeHull.Dereference,shape={1}", BSScene.DetailLogZero, this);
623 // TODO: schedule aging and destruction of unused meshes.
624 }
625 }
626 List<ConvexResult> m_hulls;
627 private BulletShape CreatePhysicalHull(BSScene physicsScene, BSPhysObject prim, System.UInt64 newHullKey,
628 PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
629 {
630 BulletShape newShape = new BulletShape();
631
632 IMesh meshData = null;
633 List<List<OMV.Vector3>> allHulls = null;
634 lock (physicsScene.mesher)
635 {
636 // Pass true for physicalness as this prevents the creation of bounding box which is not needed
637 meshData = physicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod, true /* isPhysical */, false /* shouldCache */, false, false);
638
639 // If we should use the asset's hull info, fetch it out of the locked mesher
640 if (meshData != null && BSParam.ShouldUseAssetHulls)
641 {
642 Meshmerizer realMesher = physicsScene.mesher as Meshmerizer;
643 if (realMesher != null)
644 {
645 allHulls = realMesher.GetConvexHulls(size);
646 }
647 if (allHulls == null)
648 {
649 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,assetHulls,noAssetHull", prim.LocalID);
650 }
651 }
652 }
653
654 // If there is hull data in the mesh asset, build the hull from that
655 if (allHulls != null && BSParam.ShouldUseAssetHulls)
656 {
657 int hullCount = allHulls.Count;
658 int totalVertices = 1; // include one for the count of the hulls
659 // Using the structure described for HACD hulls, create the memory sturcture
660 // to pass the hull data to the creater.
661 foreach (List<OMV.Vector3> hullVerts in allHulls)
662 {
663 totalVertices += 4; // add four for the vertex count and centroid
664 totalVertices += hullVerts.Count * 3; // one vertex is three dimensions
665 }
666 float[] convHulls = new float[totalVertices];
667
668 convHulls[0] = (float)hullCount;
669 int jj = 1;
670 foreach (List<OMV.Vector3> hullVerts in allHulls)
671 {
672 convHulls[jj + 0] = hullVerts.Count;
673 convHulls[jj + 1] = 0f; // centroid x,y,z
674 convHulls[jj + 2] = 0f;
675 convHulls[jj + 3] = 0f;
676 jj += 4;
677 foreach (OMV.Vector3 oneVert in hullVerts)
678 {
679 convHulls[jj + 0] = oneVert.X;
680 convHulls[jj + 1] = oneVert.Y;
681 convHulls[jj + 2] = oneVert.Z;
682 jj += 3;
683 }
684 }
685
686 // create the hull data structure in Bullet
687 newShape = physicsScene.PE.CreateHullShape(physicsScene.World, hullCount, convHulls);
688
689 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,assetHulls,hulls={1},totVert={2},shape={3}",
690 prim.LocalID, hullCount, totalVertices, newShape);
691 }
692
693 // If no hull specified in the asset and we should use Bullet's HACD approximation...
694 if (!newShape.HasPhysicalShape && BSParam.ShouldUseBulletHACD)
695 {
696 // Build the hull shape from an existing mesh shape.
697 // The mesh should have already been created in Bullet.
698 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,bulletHACD,entry", prim.LocalID);
699 BSShape meshShape = BSShapeMesh.GetReference(physicsScene, true, prim);
700
701 if (meshShape.physShapeInfo.HasPhysicalShape)
702 {
703 HACDParams parms;
704 parms.maxVerticesPerHull = BSParam.BHullMaxVerticesPerHull;
705 parms.minClusters = BSParam.BHullMinClusters;
706 parms.compacityWeight = BSParam.BHullCompacityWeight;
707 parms.volumeWeight = BSParam.BHullVolumeWeight;
708 parms.concavity = BSParam.BHullConcavity;
709 parms.addExtraDistPoints = BSParam.NumericBool(BSParam.BHullAddExtraDistPoints);
710 parms.addNeighboursDistPoints = BSParam.NumericBool(BSParam.BHullAddNeighboursDistPoints);
711 parms.addFacesPoints = BSParam.NumericBool(BSParam.BHullAddFacesPoints);
712 parms.shouldAdjustCollisionMargin = BSParam.NumericBool(BSParam.BHullShouldAdjustCollisionMargin);
713
714 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,hullFromMesh,beforeCall", prim.LocalID, newShape.HasPhysicalShape);
715 newShape = physicsScene.PE.BuildHullShapeFromMesh(physicsScene.World, meshShape.physShapeInfo, parms);
716 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,hullFromMesh,shape={1}", prim.LocalID, newShape);
717
718 // Now done with the mesh shape.
719 meshShape.Dereference(physicsScene);
720 }
721 physicsScene.DetailLog("{0},BSShapeHull.CreatePhysicalHull,bulletHACD,exit,hasBody={1}", prim.LocalID, newShape.HasPhysicalShape);
722 }
723
724 // If no other hull specifications, use our HACD hull approximation.
725 if (!newShape.HasPhysicalShape && meshData != null)
726 {
727 if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Fetched)
728 {
729 // Release the fetched asset data once it has been used.
730 pbs.SculptData = new byte[0];
731 prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Unknown;
732 }
733
734 int[] indices = meshData.getIndexListAsInt();
735 List<OMV.Vector3> vertices = meshData.getVertexList();
736
737 //format conversion from IMesh format to DecompDesc format
738 List<int> convIndices = new List<int>();
739 List<float3> convVertices = new List<float3>();
740 for (int ii = 0; ii < indices.GetLength(0); ii++)
741 {
742 convIndices.Add(indices[ii]);
743 }
744 foreach (OMV.Vector3 vv in vertices)
745 {
746 convVertices.Add(new float3(vv.X, vv.Y, vv.Z));
747 }
748
749 uint maxDepthSplit = (uint)BSParam.CSHullMaxDepthSplit;
750 if (BSParam.CSHullMaxDepthSplit != BSParam.CSHullMaxDepthSplitForSimpleShapes)
751 {
752 // Simple primitive shapes we know are convex so they are better implemented with
753 // fewer hulls.
754 // Check for simple shape (prim without cuts) and reduce split parameter if so.
755 if (BSShapeCollection.PrimHasNoCuts(pbs))
756 {
757 maxDepthSplit = (uint)BSParam.CSHullMaxDepthSplitForSimpleShapes;
758 }
759 }
760
761 // setup and do convex hull conversion
762 m_hulls = new List<ConvexResult>();
763 DecompDesc dcomp = new DecompDesc();
764 dcomp.mIndices = convIndices;
765 dcomp.mVertices = convVertices;
766 dcomp.mDepth = maxDepthSplit;
767 dcomp.mCpercent = BSParam.CSHullConcavityThresholdPercent;
768 dcomp.mPpercent = BSParam.CSHullVolumeConservationThresholdPercent;
769 dcomp.mMaxVertices = (uint)BSParam.CSHullMaxVertices;
770 dcomp.mSkinWidth = BSParam.CSHullMaxSkinWidth;
771 ConvexBuilder convexBuilder = new ConvexBuilder(HullReturn);
772 // create the hull into the _hulls variable
773 convexBuilder.process(dcomp);
774
775 physicsScene.DetailLog("{0},BSShapeCollection.CreatePhysicalHull,key={1},inVert={2},inInd={3},split={4},hulls={5}",
776 BSScene.DetailLogZero, newHullKey, indices.GetLength(0), vertices.Count, maxDepthSplit, m_hulls.Count);
777
778 // Convert the vertices and indices for passing to unmanaged.
779 // The hull information is passed as a large floating point array.
780 // The format is:
781 // convHulls[0] = number of hulls
782 // convHulls[1] = number of vertices in first hull
783 // convHulls[2] = hull centroid X coordinate
784 // convHulls[3] = hull centroid Y coordinate
785 // convHulls[4] = hull centroid Z coordinate
786 // convHulls[5] = first hull vertex X
787 // convHulls[6] = first hull vertex Y
788 // convHulls[7] = first hull vertex Z
789 // convHulls[8] = second hull vertex X
790 // ...
791 // convHulls[n] = number of vertices in second hull
792 // convHulls[n+1] = second hull centroid X coordinate
793 // ...
794 //
795 // TODO: is is very inefficient. Someday change the convex hull generator to return
796 // data structures that do not need to be converted in order to pass to Bullet.
797 // And maybe put the values directly into pinned memory rather than marshaling.
798 int hullCount = m_hulls.Count;
799 int totalVertices = 1; // include one for the count of the hulls
800 foreach (ConvexResult cr in m_hulls)
801 {
802 totalVertices += 4; // add four for the vertex count and centroid
803 totalVertices += cr.HullIndices.Count * 3; // we pass just triangles
804 }
805 float[] convHulls = new float[totalVertices];
806
807 convHulls[0] = (float)hullCount;
808 int jj = 1;
809 foreach (ConvexResult cr in m_hulls)
810 {
811 // copy vertices for index access
812 float3[] verts = new float3[cr.HullVertices.Count];
813 int kk = 0;
814 foreach (float3 ff in cr.HullVertices)
815 {
816 verts[kk++] = ff;
817 }
818
819 // add to the array one hull's worth of data
820 convHulls[jj++] = cr.HullIndices.Count;
821 convHulls[jj++] = 0f; // centroid x,y,z
822 convHulls[jj++] = 0f;
823 convHulls[jj++] = 0f;
824 foreach (int ind in cr.HullIndices)
825 {
826 convHulls[jj++] = verts[ind].x;
827 convHulls[jj++] = verts[ind].y;
828 convHulls[jj++] = verts[ind].z;
829 }
830 }
831 // create the hull data structure in Bullet
832 newShape = physicsScene.PE.CreateHullShape(physicsScene.World, hullCount, convHulls);
833 }
834 newShape.shapeKey = newHullKey;
835 return newShape;
836 }
837 // Callback from convex hull creater with a newly created hull.
838 // Just add it to our collection of hulls for this shape.
839 private void HullReturn(ConvexResult result)
840 {
841 m_hulls.Add(result);
842 return;
843 }
844 // Loop through all the known hulls and return the description based on the physical address.
845 public static bool TryGetHullByPtr(BulletShape pShape, out BSShapeHull outHull)
846 {
847 bool ret = false;
848 BSShapeHull foundDesc = null;
849 lock (Hulls)
850 {
851 foreach (BSShapeHull sh in Hulls.Values)
852 {
853 if (sh.physShapeInfo.ReferenceSame(pShape))
854 {
855 foundDesc = sh;
856 ret = true;
857 break;
858 }
859
860 }
861 }
862 outHull = foundDesc;
863 return ret;
864 }
204} 865}
205 866
867// ============================================================================================================
206public class BSShapeCompound : BSShape 868public class BSShapeCompound : BSShape
207{ 869{
208 private static string LogHeader = "[BULLETSIM SHAPE COMPOUND]"; 870 private static string LogHeader = "[BULLETSIM SHAPE COMPOUND]";
209 public BSShapeCompound() : base() 871 public BSShapeCompound(BulletShape pShape) : base(pShape)
210 { 872 {
211 } 873 }
212 public static BSShape GetReference(BSPhysObject prim) 874 public static BSShape GetReference(BSScene physicsScene)
213 { 875 {
214 return new BSShapeNull(); 876 // Base compound shapes are not shared so this returns a raw shape.
877 // A built compound shape can be reused in linksets.
878 return new BSShapeCompound(CreatePhysicalCompoundShape(physicsScene));
879 }
880 public override BSShape GetReference(BSScene physicsScene, BSPhysObject prim)
881 {
882 // Calling this reference means we want another handle to an existing compound shape
883 // (usually linksets) so return this copy.
884 IncrementReference();
885 return this;
886 }
887 // Dereferencing a compound shape releases the hold on all the child shapes.
888 public override void Dereference(BSScene physicsScene)
889 {
890 lock (physShapeInfo)
891 {
892 this.DecrementReference();
893 physicsScene.DetailLog("{0},BSShapeCompound.Dereference,shape={1}", BSScene.DetailLogZero, this);
894 if (referenceCount <= 0)
895 {
896 if (!physicsScene.PE.IsCompound(physShapeInfo))
897 {
898 // Failed the sanity check!!
899 physicsScene.Logger.ErrorFormat("{0} Attempt to free a compound shape that is not compound!! type={1}, ptr={2}",
900 LogHeader, physShapeInfo.shapeType, physShapeInfo.AddrString);
901 physicsScene.DetailLog("{0},BSShapeCollection.DereferenceCompound,notACompoundShape,type={1},ptr={2}",
902 BSScene.DetailLogZero, physShapeInfo.shapeType, physShapeInfo.AddrString);
903 return;
904 }
905
906 int numChildren = physicsScene.PE.GetNumberOfCompoundChildren(physShapeInfo);
907 physicsScene.DetailLog("{0},BSShapeCollection.DereferenceCompound,shape={1},children={2}",
908 BSScene.DetailLogZero, physShapeInfo, numChildren);
909
910 // Loop through all the children dereferencing each.
911 for (int ii = numChildren - 1; ii >= 0; ii--)
912 {
913 BulletShape childShape = physicsScene.PE.RemoveChildShapeFromCompoundShapeIndex(physShapeInfo, ii);
914 DereferenceAnonCollisionShape(physicsScene, childShape);
915 }
916 physicsScene.PE.DeleteCollisionShape(physicsScene.World, physShapeInfo);
917 }
918 }
919 }
920 private static BulletShape CreatePhysicalCompoundShape(BSScene physicsScene)
921 {
922 BulletShape cShape = physicsScene.PE.CreateCompoundShape(physicsScene.World, false);
923 return cShape;
924 }
925 // Sometimes we have a pointer to a collision shape but don't know what type it is.
926 // Figure out type and call the correct dereference routine.
927 // Called at taint-time.
928 private void DereferenceAnonCollisionShape(BSScene physicsScene, BulletShape pShape)
929 {
930 // TODO: figure a better way to go through all the shape types and find a possible instance.
931 BSShapeMesh meshDesc;
932 if (BSShapeMesh.TryGetMeshByPtr(pShape, out meshDesc))
933 {
934 meshDesc.Dereference(physicsScene);
935 }
936 else
937 {
938 BSShapeHull hullDesc;
939 if (BSShapeHull.TryGetHullByPtr(pShape, out hullDesc))
940 {
941 hullDesc.Dereference(physicsScene);
942 }
943 else
944 {
945 BSShapeConvexHull chullDesc;
946 if (BSShapeConvexHull.TryGetHullByPtr(pShape, out chullDesc))
947 {
948 chullDesc.Dereference(physicsScene);
949 }
950 else
951 {
952 BSShapeGImpact gImpactDesc;
953 if (BSShapeGImpact.TryGetGImpactByPtr(pShape, out gImpactDesc))
954 {
955 gImpactDesc.Dereference(physicsScene);
956 }
957 else
958 {
959 // Didn't find it in the lists of specific types. It could be compound.
960 if (physicsScene.PE.IsCompound(pShape))
961 {
962 BSShapeCompound recursiveCompound = new BSShapeCompound(pShape);
963 recursiveCompound.Dereference(physicsScene);
964 }
965 else
966 {
967 // If none of the above, maybe it is a simple native shape.
968 if (physicsScene.PE.IsNativeShape(pShape))
969 {
970 BSShapeNative nativeShape = new BSShapeNative(pShape);
971 nativeShape.Dereference(physicsScene);
972 }
973 }
974 }
975 }
976 }
977 }
215 } 978 }
216 public override void Dereference(BSScene physicsScene) { }
217} 979}
218 980
981// ============================================================================================================
982public class BSShapeConvexHull : BSShape
983{
984 private static string LogHeader = "[BULLETSIM SHAPE CONVEX HULL]";
985 public static Dictionary<System.UInt64, BSShapeConvexHull> ConvexHulls = new Dictionary<System.UInt64, BSShapeConvexHull>();
986
987 public BSShapeConvexHull(BulletShape pShape) : base(pShape)
988 {
989 }
990 public static BSShape GetReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim)
991 {
992 float lod;
993 System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
994
995 physicsScene.DetailLog("{0},BSShapeConvexHull,getReference,newKey={1},size={2},lod={3}",
996 prim.LocalID, newMeshKey.ToString("X"), prim.Size, lod);
997
998 BSShapeConvexHull retConvexHull = null;
999 lock (ConvexHulls)
1000 {
1001 if (ConvexHulls.TryGetValue(newMeshKey, out retConvexHull))
1002 {
1003 // The mesh has already been created. Return a new reference to same.
1004 retConvexHull.IncrementReference();
1005 }
1006 else
1007 {
1008 retConvexHull = new BSShapeConvexHull(new BulletShape());
1009 BulletShape convexShape = null;
1010
1011 // Get a handle to a mesh to build the hull from
1012 BSShape baseMesh = BSShapeMesh.GetReference(physicsScene, false /* forceRebuild */, prim);
1013 if (baseMesh.physShapeInfo.isNativeShape)
1014 {
1015 // We get here if the mesh was not creatable. Could be waiting for an asset from the disk.
1016 // In the short term, we return the native shape and a later ForceBodyShapeRebuild should
1017 // get back to this code with a buildable mesh.
1018 // TODO: not sure the temp native shape is freed when the mesh is rebuilt. When does this get freed?
1019 convexShape = baseMesh.physShapeInfo;
1020 }
1021 else
1022 {
1023 convexShape = physicsScene.PE.BuildConvexHullShapeFromMesh(physicsScene.World, baseMesh.physShapeInfo);
1024 convexShape.shapeKey = newMeshKey;
1025 ConvexHulls.Add(convexShape.shapeKey, retConvexHull);
1026 }
1027
1028 // Done with the base mesh
1029 baseMesh.Dereference(physicsScene);
1030
1031 retConvexHull.physShapeInfo = convexShape;
1032 }
1033 }
1034 return retConvexHull;
1035 }
1036 public override BSShape GetReference(BSScene physicsScene, BSPhysObject prim)
1037 {
1038 // Calling this reference means we want another handle to an existing shape
1039 // (usually linksets) so return this copy.
1040 IncrementReference();
1041 return this;
1042 }
1043 // Dereferencing a compound shape releases the hold on all the child shapes.
1044 public override void Dereference(BSScene physicsScene)
1045 {
1046 lock (ConvexHulls)
1047 {
1048 this.DecrementReference();
1049 physicsScene.DetailLog("{0},BSShapeConvexHull.Dereference,shape={1}", BSScene.DetailLogZero, this);
1050 // TODO: schedule aging and destruction of unused meshes.
1051 }
1052 }
1053 // Loop through all the known hulls and return the description based on the physical address.
1054 public static bool TryGetHullByPtr(BulletShape pShape, out BSShapeConvexHull outHull)
1055 {
1056 bool ret = false;
1057 BSShapeConvexHull foundDesc = null;
1058 lock (ConvexHulls)
1059 {
1060 foreach (BSShapeConvexHull sh in ConvexHulls.Values)
1061 {
1062 if (sh.physShapeInfo.ReferenceSame(pShape))
1063 {
1064 foundDesc = sh;
1065 ret = true;
1066 break;
1067 }
1068
1069 }
1070 }
1071 outHull = foundDesc;
1072 return ret;
1073 }
1074}
1075// ============================================================================================================
1076public class BSShapeGImpact : BSShape
1077{
1078 private static string LogHeader = "[BULLETSIM SHAPE GIMPACT]";
1079 public static Dictionary<System.UInt64, BSShapeGImpact> GImpacts = new Dictionary<System.UInt64, BSShapeGImpact>();
1080
1081 public BSShapeGImpact(BulletShape pShape) : base(pShape)
1082 {
1083 }
1084 public static BSShape GetReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim)
1085 {
1086 float lod;
1087 System.UInt64 newMeshKey = BSShape.ComputeShapeKey(prim.Size, prim.BaseShape, out lod);
1088
1089 physicsScene.DetailLog("{0},BSShapeGImpact,getReference,newKey={1},size={2},lod={3}",
1090 prim.LocalID, newMeshKey.ToString("X"), prim.Size, lod);
1091
1092 BSShapeGImpact retGImpact = null;
1093 lock (GImpacts)
1094 {
1095 if (GImpacts.TryGetValue(newMeshKey, out retGImpact))
1096 {
1097 // The mesh has already been created. Return a new reference to same.
1098 retGImpact.IncrementReference();
1099 }
1100 else
1101 {
1102 retGImpact = new BSShapeGImpact(new BulletShape());
1103 BulletShape newShape = retGImpact.CreatePhysicalGImpact(physicsScene, prim, newMeshKey, prim.BaseShape, prim.Size, lod);
1104
1105 // Check to see if mesh was created (might require an asset).
1106 newShape = VerifyMeshCreated(physicsScene, newShape, prim);
1107 newShape.shapeKey = newMeshKey;
1108 if (!newShape.isNativeShape
1109 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedMeshing
1110 || prim.PrimAssetState == BSPhysObject.PrimAssetCondition.FailedAssetFetch)
1111 {
1112 // If a mesh was what was created, remember the built shape for later sharing.
1113 // Also note that if meshing failed we put it in the mesh list as there is nothing
1114 // else to do about the mesh.
1115 GImpacts.Add(newMeshKey, retGImpact);
1116 }
1117
1118 retGImpact.physShapeInfo = newShape;
1119 }
1120 }
1121 return retGImpact;
1122 }
1123
1124 private BulletShape CreatePhysicalGImpact(BSScene physicsScene, BSPhysObject prim, System.UInt64 newMeshKey,
1125 PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
1126 {
1127 return BSShapeMesh.CreatePhysicalMeshShape(physicsScene, prim, newMeshKey, pbs, size, lod,
1128 (w, iC, i, vC, v) => physicsScene.PE.CreateGImpactShape(w, iC, i, vC, v) );
1129 }
1130
1131 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim)
1132 {
1133 BSShape ret = null;
1134 // If the underlying shape is native, the actual shape has not been build (waiting for asset)
1135 // and we must create a copy of the native shape since they are never shared.
1136 if (physShapeInfo.HasPhysicalShape && physShapeInfo.isNativeShape)
1137 {
1138 // TODO: decide when the native shapes should be freed. Check in Dereference?
1139 ret = BSShapeNative.GetReference(pPhysicsScene, pPrim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX);
1140 }
1141 else
1142 {
1143 // Another reference to this shape is just counted.
1144 IncrementReference();
1145 ret = this;
1146 }
1147 return ret;
1148 }
1149 // Dereferencing a compound shape releases the hold on all the child shapes.
1150 public override void Dereference(BSScene physicsScene)
1151 {
1152 lock (GImpacts)
1153 {
1154 this.DecrementReference();
1155 physicsScene.DetailLog("{0},BSShapeGImpact.Dereference,shape={1}", BSScene.DetailLogZero, this);
1156 // TODO: schedule aging and destruction of unused meshes.
1157 }
1158 }
1159 // Loop through all the known hulls and return the description based on the physical address.
1160 public static bool TryGetGImpactByPtr(BulletShape pShape, out BSShapeGImpact outHull)
1161 {
1162 bool ret = false;
1163 BSShapeGImpact foundDesc = null;
1164 lock (GImpacts)
1165 {
1166 foreach (BSShapeGImpact sh in GImpacts.Values)
1167 {
1168 if (sh.physShapeInfo.ReferenceSame(pShape))
1169 {
1170 foundDesc = sh;
1171 ret = true;
1172 break;
1173 }
1174
1175 }
1176 }
1177 outHull = foundDesc;
1178 return ret;
1179 }
1180}
1181
1182// ============================================================================================================
219public class BSShapeAvatar : BSShape 1183public class BSShapeAvatar : BSShape
220{ 1184{
221 private static string LogHeader = "[BULLETSIM SHAPE AVATAR]"; 1185 private static string LogHeader = "[BULLETSIM SHAPE AVATAR]";
222 public BSShapeAvatar() : base() 1186 public BSShapeAvatar() : base()
223 { 1187 {
224 } 1188 }
225 public static BSShape GetReference(BSPhysObject prim) 1189 public static BSShape GetReference(BSPhysObject prim)
226 { 1190 {
1191 return new BSShapeNull();
1192 }
1193 public override BSShape GetReference(BSScene pPhysicsScene, BSPhysObject pPrim)
1194 {
227 return new BSShapeNull(); 1195 return new BSShapeNull();
228 } 1196 }
229 public override void Dereference(BSScene physicsScene) { } 1197 public override void Dereference(BSScene physicsScene) { }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainHeightmap.cs b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainHeightmap.cs
index e4fecc3..c7deb4e 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainHeightmap.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainHeightmap.cs
@@ -68,7 +68,7 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
68 68
69 // This minCoords and maxCoords passed in give the size of the terrain (min and max Z 69 // This minCoords and maxCoords passed in give the size of the terrain (min and max Z
70 // are the high and low points of the heightmap). 70 // are the high and low points of the heightmap).
71 public BSTerrainHeightmap(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap, 71 public BSTerrainHeightmap(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap,
72 Vector3 minCoords, Vector3 maxCoords) 72 Vector3 minCoords, Vector3 maxCoords)
73 : base(physicsScene, regionBase, id) 73 : base(physicsScene, regionBase, id)
74 { 74 {
@@ -92,7 +92,7 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
92 private void BuildHeightmapTerrain() 92 private void BuildHeightmapTerrain()
93 { 93 {
94 // Create the terrain shape from the mapInfo 94 // Create the terrain shape from the mapInfo
95 m_mapInfo.terrainShape = PhysicsScene.PE.CreateTerrainShape( m_mapInfo.ID, 95 m_mapInfo.terrainShape = m_physicsScene.PE.CreateTerrainShape( m_mapInfo.ID,
96 new Vector3(m_mapInfo.sizeX, m_mapInfo.sizeY, 0), m_mapInfo.minZ, m_mapInfo.maxZ, 96 new Vector3(m_mapInfo.sizeX, m_mapInfo.sizeY, 0), m_mapInfo.minZ, m_mapInfo.maxZ,
97 m_mapInfo.heightMap, 1f, BSParam.TerrainCollisionMargin); 97 m_mapInfo.heightMap, 1f, BSParam.TerrainCollisionMargin);
98 98
@@ -103,26 +103,26 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
103 centerPos.Y = m_mapInfo.minCoords.Y + (m_mapInfo.sizeY / 2f); 103 centerPos.Y = m_mapInfo.minCoords.Y + (m_mapInfo.sizeY / 2f);
104 centerPos.Z = m_mapInfo.minZ + ((m_mapInfo.maxZ - m_mapInfo.minZ) / 2f); 104 centerPos.Z = m_mapInfo.minZ + ((m_mapInfo.maxZ - m_mapInfo.minZ) / 2f);
105 105
106 m_mapInfo.terrainBody = PhysicsScene.PE.CreateBodyWithDefaultMotionState(m_mapInfo.terrainShape, 106 m_mapInfo.terrainBody = m_physicsScene.PE.CreateBodyWithDefaultMotionState(m_mapInfo.terrainShape,
107 m_mapInfo.ID, centerPos, Quaternion.Identity); 107 m_mapInfo.ID, centerPos, Quaternion.Identity);
108 108
109 // Set current terrain attributes 109 // Set current terrain attributes
110 PhysicsScene.PE.SetFriction(m_mapInfo.terrainBody, BSParam.TerrainFriction); 110 m_physicsScene.PE.SetFriction(m_mapInfo.terrainBody, BSParam.TerrainFriction);
111 PhysicsScene.PE.SetHitFraction(m_mapInfo.terrainBody, BSParam.TerrainHitFraction); 111 m_physicsScene.PE.SetHitFraction(m_mapInfo.terrainBody, BSParam.TerrainHitFraction);
112 PhysicsScene.PE.SetRestitution(m_mapInfo.terrainBody, BSParam.TerrainRestitution); 112 m_physicsScene.PE.SetRestitution(m_mapInfo.terrainBody, BSParam.TerrainRestitution);
113 PhysicsScene.PE.SetCollisionFlags(m_mapInfo.terrainBody, CollisionFlags.CF_STATIC_OBJECT); 113 m_physicsScene.PE.SetCollisionFlags(m_mapInfo.terrainBody, CollisionFlags.CF_STATIC_OBJECT);
114 114
115 // Return the new terrain to the world of physical objects 115 // Return the new terrain to the world of physical objects
116 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, m_mapInfo.terrainBody); 116 m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, m_mapInfo.terrainBody);
117 117
118 // redo its bounding box now that it is in the world 118 // redo its bounding box now that it is in the world
119 PhysicsScene.PE.UpdateSingleAabb(PhysicsScene.World, m_mapInfo.terrainBody); 119 m_physicsScene.PE.UpdateSingleAabb(m_physicsScene.World, m_mapInfo.terrainBody);
120 120
121 m_mapInfo.terrainBody.collisionType = CollisionType.Terrain; 121 m_mapInfo.terrainBody.collisionType = CollisionType.Terrain;
122 m_mapInfo.terrainBody.ApplyCollisionMask(PhysicsScene); 122 m_mapInfo.terrainBody.ApplyCollisionMask(m_physicsScene);
123 123
124 // Make it so the terrain will not move or be considered for movement. 124 // Make it so the terrain will not move or be considered for movement.
125 PhysicsScene.PE.ForceActivationState(m_mapInfo.terrainBody, ActivationState.DISABLE_SIMULATION); 125 m_physicsScene.PE.ForceActivationState(m_mapInfo.terrainBody, ActivationState.DISABLE_SIMULATION);
126 126
127 return; 127 return;
128 } 128 }
@@ -134,9 +134,9 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
134 { 134 {
135 if (m_mapInfo.terrainBody.HasPhysicalBody) 135 if (m_mapInfo.terrainBody.HasPhysicalBody)
136 { 136 {
137 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, m_mapInfo.terrainBody); 137 m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, m_mapInfo.terrainBody);
138 // Frees both the body and the shape. 138 // Frees both the body and the shape.
139 PhysicsScene.PE.DestroyObject(PhysicsScene.World, m_mapInfo.terrainBody); 139 m_physicsScene.PE.DestroyObject(m_physicsScene.World, m_mapInfo.terrainBody);
140 } 140 }
141 } 141 }
142 m_mapInfo = null; 142 m_mapInfo = null;
@@ -155,7 +155,7 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
155 catch 155 catch
156 { 156 {
157 // Sometimes they give us wonky values of X and Y. Give a warning and return something. 157 // Sometimes they give us wonky values of X and Y. Give a warning and return something.
158 PhysicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}", 158 m_physicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}",
159 LogHeader, m_mapInfo.terrainRegionBase, pos); 159 LogHeader, m_mapInfo.terrainRegionBase, pos);
160 ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; 160 ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET;
161 } 161 }
@@ -165,7 +165,7 @@ public sealed class BSTerrainHeightmap : BSTerrainPhys
165 // The passed position is relative to the base of the region. 165 // The passed position is relative to the base of the region.
166 public override float GetWaterLevelAtXYZ(Vector3 pos) 166 public override float GetWaterLevelAtXYZ(Vector3 pos)
167 { 167 {
168 return PhysicsScene.SimpleWaterLevel; 168 return m_physicsScene.SimpleWaterLevel;
169 } 169 }
170} 170}
171} 171}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
index b2fb835..c4807c4 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
@@ -50,14 +50,14 @@ public abstract class BSTerrainPhys : IDisposable
50 Mesh = 1 50 Mesh = 1
51 } 51 }
52 52
53 public BSScene PhysicsScene { get; private set; } 53 protected BSScene m_physicsScene { get; private set; }
54 // Base of the region in world coordinates. Coordinates inside the region are relative to this. 54 // Base of the region in world coordinates. Coordinates inside the region are relative to this.
55 public Vector3 TerrainBase { get; private set; } 55 public Vector3 TerrainBase { get; private set; }
56 public uint ID { get; private set; } 56 public uint ID { get; private set; }
57 57
58 public BSTerrainPhys(BSScene physicsScene, Vector3 regionBase, uint id) 58 public BSTerrainPhys(BSScene physicsScene, Vector3 regionBase, uint id)
59 { 59 {
60 PhysicsScene = physicsScene; 60 m_physicsScene = physicsScene;
61 TerrainBase = regionBase; 61 TerrainBase = regionBase;
62 ID = id; 62 ID = id;
63 } 63 }
@@ -86,7 +86,7 @@ public sealed class BSTerrainManager : IDisposable
86 public Vector3 DefaultRegionSize = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); 86 public Vector3 DefaultRegionSize = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight);
87 87
88 // The scene that I am part of 88 // The scene that I am part of
89 private BSScene PhysicsScene { get; set; } 89 private BSScene m_physicsScene { get; set; }
90 90
91 // The ground plane created to keep thing from falling to infinity. 91 // The ground plane created to keep thing from falling to infinity.
92 private BulletBody m_groundPlane; 92 private BulletBody m_groundPlane;
@@ -113,7 +113,7 @@ public sealed class BSTerrainManager : IDisposable
113 113
114 public BSTerrainManager(BSScene physicsScene) 114 public BSTerrainManager(BSScene physicsScene)
115 { 115 {
116 PhysicsScene = physicsScene; 116 m_physicsScene = physicsScene;
117 m_terrains = new Dictionary<Vector3,BSTerrainPhys>(); 117 m_terrains = new Dictionary<Vector3,BSTerrainPhys>();
118 118
119 // Assume one region of default size 119 // Assume one region of default size
@@ -132,21 +132,21 @@ public sealed class BSTerrainManager : IDisposable
132 // safe to call Bullet in real time. We hope no one is moving prims around yet. 132 // safe to call Bullet in real time. We hope no one is moving prims around yet.
133 public void CreateInitialGroundPlaneAndTerrain() 133 public void CreateInitialGroundPlaneAndTerrain()
134 { 134 {
135 DetailLog("{0},BSTerrainManager.CreateInitialGroundPlaneAndTerrain,region={1}", BSScene.DetailLogZero, PhysicsScene.RegionName); 135 DetailLog("{0},BSTerrainManager.CreateInitialGroundPlaneAndTerrain,region={1}", BSScene.DetailLogZero, m_physicsScene.RegionName);
136 // The ground plane is here to catch things that are trying to drop to negative infinity 136 // The ground plane is here to catch things that are trying to drop to negative infinity
137 BulletShape groundPlaneShape = PhysicsScene.PE.CreateGroundPlaneShape(BSScene.GROUNDPLANE_ID, 1f, BSParam.TerrainCollisionMargin); 137 BulletShape groundPlaneShape = m_physicsScene.PE.CreateGroundPlaneShape(BSScene.GROUNDPLANE_ID, 1f, BSParam.TerrainCollisionMargin);
138 m_groundPlane = PhysicsScene.PE.CreateBodyWithDefaultMotionState(groundPlaneShape, 138 m_groundPlane = m_physicsScene.PE.CreateBodyWithDefaultMotionState(groundPlaneShape,
139 BSScene.GROUNDPLANE_ID, Vector3.Zero, Quaternion.Identity); 139 BSScene.GROUNDPLANE_ID, Vector3.Zero, Quaternion.Identity);
140 140
141 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, m_groundPlane); 141 m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, m_groundPlane);
142 PhysicsScene.PE.UpdateSingleAabb(PhysicsScene.World, m_groundPlane); 142 m_physicsScene.PE.UpdateSingleAabb(m_physicsScene.World, m_groundPlane);
143 // Ground plane does not move 143 // Ground plane does not move
144 PhysicsScene.PE.ForceActivationState(m_groundPlane, ActivationState.DISABLE_SIMULATION); 144 m_physicsScene.PE.ForceActivationState(m_groundPlane, ActivationState.DISABLE_SIMULATION);
145 // Everything collides with the ground plane. 145 // Everything collides with the ground plane.
146 m_groundPlane.collisionType = CollisionType.Groundplane; 146 m_groundPlane.collisionType = CollisionType.Groundplane;
147 m_groundPlane.ApplyCollisionMask(PhysicsScene); 147 m_groundPlane.ApplyCollisionMask(m_physicsScene);
148 148
149 BSTerrainPhys initialTerrain = new BSTerrainHeightmap(PhysicsScene, Vector3.Zero, BSScene.TERRAIN_ID, DefaultRegionSize); 149 BSTerrainPhys initialTerrain = new BSTerrainHeightmap(m_physicsScene, Vector3.Zero, BSScene.TERRAIN_ID, DefaultRegionSize);
150 lock (m_terrains) 150 lock (m_terrains)
151 { 151 {
152 // Build an initial terrain and put it in the world. This quickly gets replaced by the real region terrain. 152 // Build an initial terrain and put it in the world. This quickly gets replaced by the real region terrain.
@@ -157,12 +157,12 @@ public sealed class BSTerrainManager : IDisposable
157 // Release all the terrain structures we might have allocated 157 // Release all the terrain structures we might have allocated
158 public void ReleaseGroundPlaneAndTerrain() 158 public void ReleaseGroundPlaneAndTerrain()
159 { 159 {
160 DetailLog("{0},BSTerrainManager.ReleaseGroundPlaneAndTerrain,region={1}", BSScene.DetailLogZero, PhysicsScene.RegionName); 160 DetailLog("{0},BSTerrainManager.ReleaseGroundPlaneAndTerrain,region={1}", BSScene.DetailLogZero, m_physicsScene.RegionName);
161 if (m_groundPlane.HasPhysicalBody) 161 if (m_groundPlane.HasPhysicalBody)
162 { 162 {
163 if (PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, m_groundPlane)) 163 if (m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, m_groundPlane))
164 { 164 {
165 PhysicsScene.PE.DestroyObject(PhysicsScene.World, m_groundPlane); 165 m_physicsScene.PE.DestroyObject(m_physicsScene.World, m_groundPlane);
166 } 166 }
167 m_groundPlane.Clear(); 167 m_groundPlane.Clear();
168 } 168 }
@@ -188,7 +188,7 @@ public sealed class BSTerrainManager : IDisposable
188 float[] localHeightMap = heightMap; 188 float[] localHeightMap = heightMap;
189 // If there are multiple requests for changes to the same terrain between ticks, 189 // If there are multiple requests for changes to the same terrain between ticks,
190 // only do that last one. 190 // only do that last one.
191 PhysicsScene.PostTaintObject("TerrainManager.SetTerrain-"+ m_worldOffset.ToString(), 0, delegate() 191 m_physicsScene.PostTaintObject("TerrainManager.SetTerrain-"+ m_worldOffset.ToString(), 0, delegate()
192 { 192 {
193 if (m_worldOffset != Vector3.Zero && MegaRegionParentPhysicsScene != null) 193 if (m_worldOffset != Vector3.Zero && MegaRegionParentPhysicsScene != null)
194 { 194 {
@@ -199,15 +199,8 @@ public sealed class BSTerrainManager : IDisposable
199 if (MegaRegionParentPhysicsScene is BSScene) 199 if (MegaRegionParentPhysicsScene is BSScene)
200 { 200 {
201 DetailLog("{0},SetTerrain.ToParent,offset={1},worldMax={2}", BSScene.DetailLogZero, m_worldOffset, m_worldMax); 201 DetailLog("{0},SetTerrain.ToParent,offset={1},worldMax={2}", BSScene.DetailLogZero, m_worldOffset, m_worldMax);
202 // This looks really odd but this region is passing its terrain to its mega-region root region 202 ((BSScene)MegaRegionParentPhysicsScene).TerrainManager.AddMegaRegionChildTerrain(
203 // and the creation of the terrain must happen on the root region's taint thread and not 203 BSScene.CHILDTERRAIN_ID, localHeightMap, m_worldOffset, m_worldOffset + DefaultRegionSize);
204 // my taint thread.
205 ((BSScene)MegaRegionParentPhysicsScene).PostTaintObject("TerrainManager.SetTerrain.Mega-" + m_worldOffset.ToString(), 0, delegate()
206 {
207 ((BSScene)MegaRegionParentPhysicsScene).TerrainManager.UpdateTerrain(
208 BSScene.CHILDTERRAIN_ID, localHeightMap,
209 m_worldOffset, m_worldOffset + DefaultRegionSize, true /* inTaintTime */);
210 });
211 } 204 }
212 } 205 }
213 else 206 else
@@ -215,12 +208,23 @@ public sealed class BSTerrainManager : IDisposable
215 // If not doing the mega-prim thing, just change the terrain 208 // If not doing the mega-prim thing, just change the terrain
216 DetailLog("{0},SetTerrain.Existing", BSScene.DetailLogZero); 209 DetailLog("{0},SetTerrain.Existing", BSScene.DetailLogZero);
217 210
218 UpdateTerrain(BSScene.TERRAIN_ID, localHeightMap, 211 UpdateTerrain(BSScene.TERRAIN_ID, localHeightMap, m_worldOffset, m_worldOffset + DefaultRegionSize);
219 m_worldOffset, m_worldOffset + DefaultRegionSize, true /* inTaintTime */);
220 } 212 }
221 }); 213 });
222 } 214 }
223 215
216 // Another region is calling this region and passing a terrain.
217 // A region that is not the mega-region root will pass its terrain to the root region so the root region
218 // physics engine will have all the terrains.
219 private void AddMegaRegionChildTerrain(uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords)
220 {
221 // Since we are called by another region's thread, the action must be rescheduled onto our processing thread.
222 m_physicsScene.PostTaintObject("TerrainManager.AddMegaRegionChild" + minCoords.ToString(), id, delegate()
223 {
224 UpdateTerrain(id, heightMap, minCoords, maxCoords);
225 });
226 }
227
224 // If called for terrain has has not been previously allocated, a new terrain will be built 228 // If called for terrain has has not been previously allocated, a new terrain will be built
225 // based on the passed information. The 'id' should be either the terrain id or 229 // based on the passed information. The 'id' should be either the terrain id or
226 // BSScene.CHILDTERRAIN_ID. If the latter, a new child terrain ID will be allocated and used. 230 // BSScene.CHILDTERRAIN_ID. If the latter, a new child terrain ID will be allocated and used.
@@ -230,11 +234,10 @@ public sealed class BSTerrainManager : IDisposable
230 // This call is most often used to update the heightMap and parameters of the terrain. 234 // This call is most often used to update the heightMap and parameters of the terrain.
231 // (The above does suggest that some simplification/refactoring is in order.) 235 // (The above does suggest that some simplification/refactoring is in order.)
232 // Called during taint-time. 236 // Called during taint-time.
233 private void UpdateTerrain(uint id, float[] heightMap, 237 private void UpdateTerrain(uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords)
234 Vector3 minCoords, Vector3 maxCoords, bool inTaintTime)
235 { 238 {
236 DetailLog("{0},BSTerrainManager.UpdateTerrain,call,id={1},minC={2},maxC={3},inTaintTime={4}", 239 DetailLog("{0},BSTerrainManager.UpdateTerrain,call,id={1},minC={2},maxC={3}",
237 BSScene.DetailLogZero, id, minCoords, maxCoords, inTaintTime); 240 BSScene.DetailLogZero, id, minCoords, maxCoords);
238 241
239 // Find high and low points of passed heightmap. 242 // Find high and low points of passed heightmap.
240 // The min and max passed in is usually the area objects can be in (maximum 243 // The min and max passed in is usually the area objects can be in (maximum
@@ -303,7 +306,7 @@ public sealed class BSTerrainManager : IDisposable
303 newTerrainID = ++m_terrainCount; 306 newTerrainID = ++m_terrainCount;
304 307
305 DetailLog("{0},BSTerrainManager.UpdateTerrain:NewTerrain,taint,newID={1},minCoord={2},maxCoord={3}", 308 DetailLog("{0},BSTerrainManager.UpdateTerrain:NewTerrain,taint,newID={1},minCoord={2},maxCoord={3}",
306 BSScene.DetailLogZero, newTerrainID, minCoords, minCoords); 309 BSScene.DetailLogZero, newTerrainID, minCoords, maxCoords);
307 BSTerrainPhys newTerrainPhys = BuildPhysicalTerrain(terrainRegionBase, id, heightMap, minCoords, maxCoords); 310 BSTerrainPhys newTerrainPhys = BuildPhysicalTerrain(terrainRegionBase, id, heightMap, minCoords, maxCoords);
308 m_terrains.Add(terrainRegionBase, newTerrainPhys); 311 m_terrains.Add(terrainRegionBase, newTerrainPhys);
309 312
@@ -315,26 +318,26 @@ public sealed class BSTerrainManager : IDisposable
315 // TODO: redo terrain implementation selection to allow other base types than heightMap. 318 // TODO: redo terrain implementation selection to allow other base types than heightMap.
316 private BSTerrainPhys BuildPhysicalTerrain(Vector3 terrainRegionBase, uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords) 319 private BSTerrainPhys BuildPhysicalTerrain(Vector3 terrainRegionBase, uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords)
317 { 320 {
318 PhysicsScene.Logger.DebugFormat("{0} Terrain for {1}/{2} created with {3}", 321 m_physicsScene.Logger.DebugFormat("{0} Terrain for {1}/{2} created with {3}",
319 LogHeader, PhysicsScene.RegionName, terrainRegionBase, 322 LogHeader, m_physicsScene.RegionName, terrainRegionBase,
320 (BSTerrainPhys.TerrainImplementation)BSParam.TerrainImplementation); 323 (BSTerrainPhys.TerrainImplementation)BSParam.TerrainImplementation);
321 BSTerrainPhys newTerrainPhys = null; 324 BSTerrainPhys newTerrainPhys = null;
322 switch ((int)BSParam.TerrainImplementation) 325 switch ((int)BSParam.TerrainImplementation)
323 { 326 {
324 case (int)BSTerrainPhys.TerrainImplementation.Heightmap: 327 case (int)BSTerrainPhys.TerrainImplementation.Heightmap:
325 newTerrainPhys = new BSTerrainHeightmap(PhysicsScene, terrainRegionBase, id, 328 newTerrainPhys = new BSTerrainHeightmap(m_physicsScene, terrainRegionBase, id,
326 heightMap, minCoords, maxCoords); 329 heightMap, minCoords, maxCoords);
327 break; 330 break;
328 case (int)BSTerrainPhys.TerrainImplementation.Mesh: 331 case (int)BSTerrainPhys.TerrainImplementation.Mesh:
329 newTerrainPhys = new BSTerrainMesh(PhysicsScene, terrainRegionBase, id, 332 newTerrainPhys = new BSTerrainMesh(m_physicsScene, terrainRegionBase, id,
330 heightMap, minCoords, maxCoords); 333 heightMap, minCoords, maxCoords);
331 break; 334 break;
332 default: 335 default:
333 PhysicsScene.Logger.ErrorFormat("{0} Bad terrain implementation specified. Type={1}/{2},Region={3}/{4}", 336 m_physicsScene.Logger.ErrorFormat("{0} Bad terrain implementation specified. Type={1}/{2},Region={3}/{4}",
334 LogHeader, 337 LogHeader,
335 (int)BSParam.TerrainImplementation, 338 (int)BSParam.TerrainImplementation,
336 BSParam.TerrainImplementation, 339 BSParam.TerrainImplementation,
337 PhysicsScene.RegionName, terrainRegionBase); 340 m_physicsScene.RegionName, terrainRegionBase);
338 break; 341 break;
339 } 342 }
340 return newTerrainPhys; 343 return newTerrainPhys;
@@ -426,8 +429,8 @@ public sealed class BSTerrainManager : IDisposable
426 } 429 }
427 else 430 else
428 { 431 {
429 PhysicsScene.Logger.ErrorFormat("{0} GetTerrainHeightAtXY: terrain not found: region={1}, x={2}, y={3}", 432 m_physicsScene.Logger.ErrorFormat("{0} GetTerrainHeightAtXY: terrain not found: region={1}, x={2}, y={3}",
430 LogHeader, PhysicsScene.RegionName, tX, tY); 433 LogHeader, m_physicsScene.RegionName, tX, tY);
431 DetailLog("{0},BSTerrainManager.GetTerrainHeightAtXYZ,terrainNotFound,pos={1},base={2}", 434 DetailLog("{0},BSTerrainManager.GetTerrainHeightAtXYZ,terrainNotFound,pos={1},base={2}",
432 BSScene.DetailLogZero, pos, terrainBaseXYZ); 435 BSScene.DetailLogZero, pos, terrainBaseXYZ);
433 } 436 }
@@ -448,8 +451,8 @@ public sealed class BSTerrainManager : IDisposable
448 } 451 }
449 else 452 else
450 { 453 {
451 PhysicsScene.Logger.ErrorFormat("{0} GetWaterHeightAtXY: terrain not found: pos={1}, terrainBase={2}, height={3}", 454 m_physicsScene.Logger.ErrorFormat("{0} GetWaterHeightAtXY: terrain not found: pos={1}, terrainBase={2}, height={3}",
452 LogHeader, PhysicsScene.RegionName, pos, terrainBaseXYZ, ret); 455 LogHeader, m_physicsScene.RegionName, pos, terrainBaseXYZ, ret);
453 } 456 }
454 return ret; 457 return ret;
455 } 458 }
@@ -561,7 +564,7 @@ public sealed class BSTerrainManager : IDisposable
561 564
562 private void DetailLog(string msg, params Object[] args) 565 private void DetailLog(string msg, params Object[] args)
563 { 566 {
564 PhysicsScene.PhysicsLogging.Write(msg, args); 567 m_physicsScene.PhysicsLogging.Write(msg, args);
565 } 568 }
566} 569}
567} 570}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs
index 2ce1513..e4ca098 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainMesh.cs
@@ -51,7 +51,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
51 BulletShape m_terrainShape; 51 BulletShape m_terrainShape;
52 BulletBody m_terrainBody; 52 BulletBody m_terrainBody;
53 53
54 public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, Vector3 regionSize) 54 public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, Vector3 regionSize)
55 : base(physicsScene, regionBase, id) 55 : base(physicsScene, regionBase, id)
56 { 56 {
57 } 57 }
@@ -62,7 +62,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
62 } 62 }
63 63
64 // Create terrain mesh from a heightmap. 64 // Create terrain mesh from a heightmap.
65 public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap, 65 public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap,
66 Vector3 minCoords, Vector3 maxCoords) 66 Vector3 minCoords, Vector3 maxCoords)
67 : base(physicsScene, regionBase, id) 67 : base(physicsScene, regionBase, id)
68 { 68 {
@@ -80,7 +80,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
80 if (BSParam.TerrainMeshMagnification == 1) 80 if (BSParam.TerrainMeshMagnification == 1)
81 { 81 {
82 // If a magnification of one, use the old routine that is tried and true. 82 // If a magnification of one, use the old routine that is tried and true.
83 meshCreationSuccess = BSTerrainMesh.ConvertHeightmapToMesh(PhysicsScene, 83 meshCreationSuccess = BSTerrainMesh.ConvertHeightmapToMesh(m_physicsScene,
84 initialMap, m_sizeX, m_sizeY, // input size 84 initialMap, m_sizeX, m_sizeY, // input size
85 Vector3.Zero, // base for mesh 85 Vector3.Zero, // base for mesh
86 out indicesCount, out indices, out verticesCount, out vertices); 86 out indicesCount, out indices, out verticesCount, out vertices);
@@ -88,7 +88,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
88 else 88 else
89 { 89 {
90 // Other magnifications use the newer routine 90 // Other magnifications use the newer routine
91 meshCreationSuccess = BSTerrainMesh.ConvertHeightmapToMesh2(PhysicsScene, 91 meshCreationSuccess = BSTerrainMesh.ConvertHeightmapToMesh2(m_physicsScene,
92 initialMap, m_sizeX, m_sizeY, // input size 92 initialMap, m_sizeX, m_sizeY, // input size
93 BSParam.TerrainMeshMagnification, 93 BSParam.TerrainMeshMagnification,
94 physicsScene.TerrainManager.DefaultRegionSize, 94 physicsScene.TerrainManager.DefaultRegionSize,
@@ -98,21 +98,21 @@ public sealed class BSTerrainMesh : BSTerrainPhys
98 if (!meshCreationSuccess) 98 if (!meshCreationSuccess)
99 { 99 {
100 // DISASTER!! 100 // DISASTER!!
101 PhysicsScene.DetailLog("{0},BSTerrainMesh.create,failedConversionOfHeightmap,id={1}", BSScene.DetailLogZero, ID); 101 m_physicsScene.DetailLog("{0},BSTerrainMesh.create,failedConversionOfHeightmap,id={1}", BSScene.DetailLogZero, ID);
102 PhysicsScene.Logger.ErrorFormat("{0} Failed conversion of heightmap to mesh! base={1}", LogHeader, TerrainBase); 102 m_physicsScene.Logger.ErrorFormat("{0} Failed conversion of heightmap to mesh! base={1}", LogHeader, TerrainBase);
103 // Something is very messed up and a crash is in our future. 103 // Something is very messed up and a crash is in our future.
104 return; 104 return;
105 } 105 }
106 106
107 PhysicsScene.DetailLog("{0},BSTerrainMesh.create,meshed,id={1},indices={2},indSz={3},vertices={4},vertSz={5}", 107 m_physicsScene.DetailLog("{0},BSTerrainMesh.create,meshed,id={1},indices={2},indSz={3},vertices={4},vertSz={5}",
108 BSScene.DetailLogZero, ID, indicesCount, indices.Length, verticesCount, vertices.Length); 108 BSScene.DetailLogZero, ID, indicesCount, indices.Length, verticesCount, vertices.Length);
109 109
110 m_terrainShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World, indicesCount, indices, verticesCount, vertices); 110 m_terrainShape = m_physicsScene.PE.CreateMeshShape(m_physicsScene.World, indicesCount, indices, verticesCount, vertices);
111 if (!m_terrainShape.HasPhysicalShape) 111 if (!m_terrainShape.HasPhysicalShape)
112 { 112 {
113 // DISASTER!! 113 // DISASTER!!
114 PhysicsScene.DetailLog("{0},BSTerrainMesh.create,failedCreationOfShape,id={1}", BSScene.DetailLogZero, ID); 114 m_physicsScene.DetailLog("{0},BSTerrainMesh.create,failedCreationOfShape,id={1}", BSScene.DetailLogZero, ID);
115 PhysicsScene.Logger.ErrorFormat("{0} Failed creation of terrain mesh! base={1}", LogHeader, TerrainBase); 115 m_physicsScene.Logger.ErrorFormat("{0} Failed creation of terrain mesh! base={1}", LogHeader, TerrainBase);
116 // Something is very messed up and a crash is in our future. 116 // Something is very messed up and a crash is in our future.
117 return; 117 return;
118 } 118 }
@@ -120,52 +120,52 @@ public sealed class BSTerrainMesh : BSTerrainPhys
120 Vector3 pos = regionBase; 120 Vector3 pos = regionBase;
121 Quaternion rot = Quaternion.Identity; 121 Quaternion rot = Quaternion.Identity;
122 122
123 m_terrainBody = PhysicsScene.PE.CreateBodyWithDefaultMotionState(m_terrainShape, ID, pos, rot); 123 m_terrainBody = m_physicsScene.PE.CreateBodyWithDefaultMotionState(m_terrainShape, ID, pos, rot);
124 if (!m_terrainBody.HasPhysicalBody) 124 if (!m_terrainBody.HasPhysicalBody)
125 { 125 {
126 // DISASTER!! 126 // DISASTER!!
127 PhysicsScene.Logger.ErrorFormat("{0} Failed creation of terrain body! base={1}", LogHeader, TerrainBase); 127 m_physicsScene.Logger.ErrorFormat("{0} Failed creation of terrain body! base={1}", LogHeader, TerrainBase);
128 // Something is very messed up and a crash is in our future. 128 // Something is very messed up and a crash is in our future.
129 return; 129 return;
130 } 130 }
131 physicsScene.PE.SetShapeCollisionMargin(m_terrainShape, BSParam.TerrainCollisionMargin); 131 physicsScene.PE.SetShapeCollisionMargin(m_terrainShape, BSParam.TerrainCollisionMargin);
132 132
133 // Set current terrain attributes 133 // Set current terrain attributes
134 PhysicsScene.PE.SetFriction(m_terrainBody, BSParam.TerrainFriction); 134 m_physicsScene.PE.SetFriction(m_terrainBody, BSParam.TerrainFriction);
135 PhysicsScene.PE.SetHitFraction(m_terrainBody, BSParam.TerrainHitFraction); 135 m_physicsScene.PE.SetHitFraction(m_terrainBody, BSParam.TerrainHitFraction);
136 PhysicsScene.PE.SetRestitution(m_terrainBody, BSParam.TerrainRestitution); 136 m_physicsScene.PE.SetRestitution(m_terrainBody, BSParam.TerrainRestitution);
137 PhysicsScene.PE.SetContactProcessingThreshold(m_terrainBody, BSParam.TerrainContactProcessingThreshold); 137 m_physicsScene.PE.SetContactProcessingThreshold(m_terrainBody, BSParam.TerrainContactProcessingThreshold);
138 PhysicsScene.PE.SetCollisionFlags(m_terrainBody, CollisionFlags.CF_STATIC_OBJECT); 138 m_physicsScene.PE.SetCollisionFlags(m_terrainBody, CollisionFlags.CF_STATIC_OBJECT);
139 139
140 // Static objects are not very massive. 140 // Static objects are not very massive.
141 PhysicsScene.PE.SetMassProps(m_terrainBody, 0f, Vector3.Zero); 141 m_physicsScene.PE.SetMassProps(m_terrainBody, 0f, Vector3.Zero);
142 142
143 // Put the new terrain to the world of physical objects 143 // Put the new terrain to the world of physical objects
144 PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, m_terrainBody); 144 m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, m_terrainBody);
145 145
146 // Redo its bounding box now that it is in the world 146 // Redo its bounding box now that it is in the world
147 PhysicsScene.PE.UpdateSingleAabb(PhysicsScene.World, m_terrainBody); 147 m_physicsScene.PE.UpdateSingleAabb(m_physicsScene.World, m_terrainBody);
148 148
149 m_terrainBody.collisionType = CollisionType.Terrain; 149 m_terrainBody.collisionType = CollisionType.Terrain;
150 m_terrainBody.ApplyCollisionMask(PhysicsScene); 150 m_terrainBody.ApplyCollisionMask(m_physicsScene);
151 151
152 if (BSParam.UseSingleSidedMeshes) 152 if (BSParam.UseSingleSidedMeshes)
153 { 153 {
154 PhysicsScene.DetailLog("{0},BSTerrainMesh.settingCustomMaterial,id={1}", BSScene.DetailLogZero, id); 154 m_physicsScene.DetailLog("{0},BSTerrainMesh.settingCustomMaterial,id={1}", BSScene.DetailLogZero, id);
155 PhysicsScene.PE.AddToCollisionFlags(m_terrainBody, CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK); 155 m_physicsScene.PE.AddToCollisionFlags(m_terrainBody, CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
156 } 156 }
157 157
158 // Make it so the terrain will not move or be considered for movement. 158 // Make it so the terrain will not move or be considered for movement.
159 PhysicsScene.PE.ForceActivationState(m_terrainBody, ActivationState.DISABLE_SIMULATION); 159 m_physicsScene.PE.ForceActivationState(m_terrainBody, ActivationState.DISABLE_SIMULATION);
160 } 160 }
161 161
162 public override void Dispose() 162 public override void Dispose()
163 { 163 {
164 if (m_terrainBody.HasPhysicalBody) 164 if (m_terrainBody.HasPhysicalBody)
165 { 165 {
166 PhysicsScene.PE.RemoveObjectFromWorld(PhysicsScene.World, m_terrainBody); 166 m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, m_terrainBody);
167 // Frees both the body and the shape. 167 // Frees both the body and the shape.
168 PhysicsScene.PE.DestroyObject(PhysicsScene.World, m_terrainBody); 168 m_physicsScene.PE.DestroyObject(m_physicsScene.World, m_terrainBody);
169 m_terrainBody.Clear(); 169 m_terrainBody.Clear();
170 m_terrainShape.Clear(); 170 m_terrainShape.Clear();
171 } 171 }
@@ -185,7 +185,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
185 catch 185 catch
186 { 186 {
187 // Sometimes they give us wonky values of X and Y. Give a warning and return something. 187 // Sometimes they give us wonky values of X and Y. Give a warning and return something.
188 PhysicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}", 188 m_physicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}",
189 LogHeader, TerrainBase, pos); 189 LogHeader, TerrainBase, pos);
190 ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; 190 ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET;
191 } 191 }
@@ -195,7 +195,7 @@ public sealed class BSTerrainMesh : BSTerrainPhys
195 // The passed position is relative to the base of the region. 195 // The passed position is relative to the base of the region.
196 public override float GetWaterLevelAtXYZ(Vector3 pos) 196 public override float GetWaterLevelAtXYZ(Vector3 pos)
197 { 197 {
198 return PhysicsScene.SimpleWaterLevel; 198 return m_physicsScene.SimpleWaterLevel;
199 } 199 }
200 200
201 // Convert the passed heightmap to mesh information suitable for CreateMeshShape2(). 201 // Convert the passed heightmap to mesh information suitable for CreateMeshShape2().
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs
index 8012d91..d5060e3 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs
@@ -104,11 +104,11 @@ public class BulletShape
104{ 104{
105 public BulletShape() 105 public BulletShape()
106 { 106 {
107 type = BSPhysicsShapeType.SHAPE_UNKNOWN; 107 shapeType = BSPhysicsShapeType.SHAPE_UNKNOWN;
108 shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE; 108 shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE;
109 isNativeShape = false; 109 isNativeShape = false;
110 } 110 }
111 public BSPhysicsShapeType type; 111 public BSPhysicsShapeType shapeType;
112 public System.UInt64 shapeKey; 112 public System.UInt64 shapeKey;
113 public bool isNativeShape; 113 public bool isNativeShape;
114 114
@@ -133,7 +133,7 @@ public class BulletShape
133 buff.Append("<p="); 133 buff.Append("<p=");
134 buff.Append(AddrString); 134 buff.Append(AddrString);
135 buff.Append(",s="); 135 buff.Append(",s=");
136 buff.Append(type.ToString()); 136 buff.Append(shapeType.ToString());
137 buff.Append(",k="); 137 buff.Append(",k=");
138 buff.Append(shapeKey.ToString("X")); 138 buff.Append(shapeKey.ToString("X"));
139 buff.Append(",n="); 139 buff.Append(",n=");
@@ -224,42 +224,42 @@ public static class BulletSimData
224// As mentioned above, don't use the CollisionFilterGroups definitions directly in the code 224// As mentioned above, don't use the CollisionFilterGroups definitions directly in the code
225// but, instead, use references to this dictionary. Finding and debugging 225// but, instead, use references to this dictionary. Finding and debugging
226// collision flag problems will be made easier. 226// collision flag problems will be made easier.
227public static Dictionary<CollisionType, CollisionTypeFilterGroup> CollisionTypeMasks 227public static Dictionary<CollisionType, CollisionTypeFilterGroup> CollisionTypeMasks
228 = new Dictionary<CollisionType, CollisionTypeFilterGroup>() 228 = new Dictionary<CollisionType, CollisionTypeFilterGroup>()
229{ 229{
230 { CollisionType.Avatar, 230 { CollisionType.Avatar,
231 new CollisionTypeFilterGroup(CollisionType.Avatar, 231 new CollisionTypeFilterGroup(CollisionType.Avatar,
232 (uint)CollisionFilterGroups.BCharacterGroup, 232 (uint)CollisionFilterGroups.BCharacterGroup,
233 (uint)CollisionFilterGroups.BAllGroup) 233 (uint)CollisionFilterGroups.BAllGroup)
234 }, 234 },
235 { CollisionType.Groundplane, 235 { CollisionType.Groundplane,
236 new CollisionTypeFilterGroup(CollisionType.Groundplane, 236 new CollisionTypeFilterGroup(CollisionType.Groundplane,
237 (uint)CollisionFilterGroups.BGroundPlaneGroup, 237 (uint)CollisionFilterGroups.BGroundPlaneGroup,
238 (uint)CollisionFilterGroups.BAllGroup) 238 (uint)CollisionFilterGroups.BAllGroup)
239 }, 239 },
240 { CollisionType.Terrain, 240 { CollisionType.Terrain,
241 new CollisionTypeFilterGroup(CollisionType.Terrain, 241 new CollisionTypeFilterGroup(CollisionType.Terrain,
242 (uint)CollisionFilterGroups.BTerrainGroup, 242 (uint)CollisionFilterGroups.BTerrainGroup,
243 (uint)(CollisionFilterGroups.BAllGroup & ~CollisionFilterGroups.BStaticGroup)) 243 (uint)(CollisionFilterGroups.BAllGroup & ~CollisionFilterGroups.BStaticGroup))
244 }, 244 },
245 { CollisionType.Static, 245 { CollisionType.Static,
246 new CollisionTypeFilterGroup(CollisionType.Static, 246 new CollisionTypeFilterGroup(CollisionType.Static,
247 (uint)CollisionFilterGroups.BStaticGroup, 247 (uint)CollisionFilterGroups.BStaticGroup,
248 (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup)) 248 (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup))
249 }, 249 },
250 { CollisionType.Dynamic, 250 { CollisionType.Dynamic,
251 new CollisionTypeFilterGroup(CollisionType.Dynamic, 251 new CollisionTypeFilterGroup(CollisionType.Dynamic,
252 (uint)CollisionFilterGroups.BSolidGroup, 252 (uint)CollisionFilterGroups.BSolidGroup,
253 (uint)(CollisionFilterGroups.BAllGroup)) 253 (uint)(CollisionFilterGroups.BAllGroup))
254 }, 254 },
255 { CollisionType.VolumeDetect, 255 { CollisionType.VolumeDetect,
256 new CollisionTypeFilterGroup(CollisionType.VolumeDetect, 256 new CollisionTypeFilterGroup(CollisionType.VolumeDetect,
257 (uint)CollisionFilterGroups.BSensorTrigger, 257 (uint)CollisionFilterGroups.BSensorTrigger,
258 (uint)(~CollisionFilterGroups.BSensorTrigger)) 258 (uint)(~CollisionFilterGroups.BSensorTrigger))
259 }, 259 },
260 { CollisionType.LinksetChild, 260 { CollisionType.LinksetChild,
261 new CollisionTypeFilterGroup(CollisionType.LinksetChild, 261 new CollisionTypeFilterGroup(CollisionType.LinksetChild,
262 (uint)CollisionFilterGroups.BLinksetChildGroup, 262 (uint)CollisionFilterGroups.BLinksetChildGroup,
263 (uint)(CollisionFilterGroups.BNoneGroup)) 263 (uint)(CollisionFilterGroups.BNoneGroup))
264 // (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup)) 264 // (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup))
265 }, 265 },
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
index 8a15abe..0453376 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
@@ -1,65 +1,61 @@
1CURRENT PRIORITIES 1CURRENT PROBLEMS TO FIX AND/OR LOOK AT
2================================================= 2=================================================
3Use the HACD convex hull routine in Bullet rather than the C# version. 3Vehicle buoyancy. Computed correctly? Possibly creating very large effective mass.
4 Speed up hullifying large meshes. 4 Interaction of llSetBuoyancy and vehicle buoyancy. Should be additive?
5 Negative buoyancy computed correctly
6Center-of-gravity
7Computation of mesh mass. How done? How should it be done?
5Enable vehicle border crossings (at least as poorly as ODE) 8Enable vehicle border crossings (at least as poorly as ODE)
6 Terrain skirts 9 Terrain skirts
7 Avatar created in previous region and not new region when crossing border 10 Avatar created in previous region and not new region when crossing border
8 Vehicle recreated in new sim at small Z value (offset from root value?) (DONE) 11 Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
9Lock axis 12User settable terrain mesh
13 Allow specifying as convex or concave and use different getHeight functions depending
14Boats, when turning nose down into the water
15 Acts like rotation around Z is also effecting rotation around X and Y
10Deleting a linkset while standing on the root will leave the physical shape of the root behind. 16Deleting a linkset while standing on the root will leave the physical shape of the root behind.
11 Not sure if it is because standing on it. Done with large prim linksets. 17 Not sure if it is because standing on it. Done with large prim linksets.
12Linkset child rotations. 18Linkset child rotations.
13 Nebadon spiral tube has middle sections which are rotated wrong. 19 Nebadon spiral tube has middle sections which are rotated wrong.
14 Select linked spiral tube. Delink and note where the middle section ends up. 20 Select linked spiral tube. Delink and note where the middle section ends up.
15Vehicle angular vertical attraction
16vehicle angular banking
17Center-of-gravity
18Vehicle angular deflection
19 Preferred orientation angular correction fix
20when should angular and linear motor targets be zeroed? when selected?
21 Need a vehicle.clear()? Or an 'else' in prestep if not physical.
22Teravus llMoveToTarget script debug 21Teravus llMoveToTarget script debug
23 Mixing of hover, buoyancy/gravity, moveToTarget, into one force 22 Mixing of hover, buoyancy/gravity, moveToTarget, into one force
24 Setting hover height to zero disables hover even if hover flags are on (from SL wiki) 23 Setting hover height to zero disables hover even if hover flags are on (from SL wiki)
25limitMotorUp calibration (more down?) 24limitMotorUp calibration (more down?)
26llRotLookAt 25llRotLookAt
27llLookAt 26llLookAt
28Avatars walking up stairs (HALF DONE) 27Convert to avatar mesh capsule. Include rotation of capsule.
29Avatar movement
30 flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE)
31 walking up stairs is not calibrated correctly (stairs out of Kepler cabin)
32 avatar capsule rotation completed (NOT DONE - Bullet's capsule shape is not the solution)
33Vehicle script tuning/debugging 28Vehicle script tuning/debugging
34 Avanti speed script 29 Avanti speed script
35 Weapon shooter script 30 Weapon shooter script
36Move material definitions (friction, ...) into simulator. 31Move material definitions (friction, ...) into simulator.
37Add material densities to the material types. 32osGetPhysicsEngineVerion() and create a version code for the C++ DLL
38Terrain detail: double terrain mesh detail
39One sided meshes? Should terrain be built into a closed shape? 33One sided meshes? Should terrain be built into a closed shape?
40 When meshes get partially wedged into the terrain, they cannot push themselves out. 34 When meshes get partially wedged into the terrain, they cannot push themselves out.
41 It is possible that Bullet processes collisions whether entering or leaving a mesh. 35 It is possible that Bullet processes collisions whether entering or leaving a mesh.
42 Ref: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4869 36 Ref: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4869
37Small physical objects do not interact correctly
38 Create chain of .5x.5x.1 torui and make all but top physical so to hang.
39 The chain will fall apart and pairs will dance around on ground
40 Chains of 1x1x.2 will stay connected but will dance.
41 Chains above 2x2x.4 are more stable and get stablier as torui get larger.
43 42
44VEHICLES TODO LIST: 43VEHICLES TODO LIST:
45================================================= 44=================================================
46Border crossing with linked vehicle causes crash 45LINEAR_MOTOR_DIRECTION values should be clamped to reasonable numbers.
47 20121129.1411: editting/moving phys object across region boundries causes crash 46 What are the limits in SL?
48 getPos-> btRigidBody::upcast -> getBodyType -> BOOM 47 Same for other velocity settings.
49Vehicles (Move smoothly) 48UBit improvements to remove rubber-banding of avatars sitting on vehicle child prims:
49 https://github.com/UbitUmarov/Ubit-opensim
50Some vehicles should not be able to turn if no speed or off ground. 50Some vehicles should not be able to turn if no speed or off ground.
51What to do if vehicle and prim buoyancy differ?
52Cannot edit/move a vehicle being ridden: it jumps back to the origional position. 51Cannot edit/move a vehicle being ridden: it jumps back to the origional position.
53Neb car jiggling left and right 52Neb car jiggling left and right
54 Happens on terrain and any other mesh object. Flat cubes are much smoother. 53 Happens on terrain and any other mesh object. Flat cubes are much smoother.
55 This has been reduced but not eliminated. 54 This has been reduced but not eliminated.
56Implement referenceFrame for all the motion routines. 55Implement referenceFrame for all the motion routines.
57For limitMotorUp, use raycast down to find if vehicle is in the air.
58Verify llGetVel() is returning a smooth and good value for vehicle movement. 56Verify llGetVel() is returning a smooth and good value for vehicle movement.
59llGetVel() should return the root's velocity if requested in a child prim. 57llGetVel() should return the root's velocity if requested in a child prim.
60Implement function efficiency for lineaar and angular motion. 58Implement function efficiency for lineaar and angular motion.
61After getting off a vehicle, the root prim is phantom (can be walked through)
62 Need to force a position update for the root prim after compound shape destruction
63Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint) 59Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint)
64Remove vehicle angular velocity zeroing in BSPrim.UpdateProperties(). 60Remove vehicle angular velocity zeroing in BSPrim.UpdateProperties().
65 A kludge that isn't fixing the real problem of Bullet adding extra motion. 61 A kludge that isn't fixing the real problem of Bullet adding extra motion.
@@ -68,11 +64,10 @@ Incorporate inter-relationship of angular corrections. For instance, angularDefl
68 creates over-correction and over-shoot and wabbling. 64 creates over-correction and over-shoot and wabbling.
69Vehicle attributes are not restored when a vehicle is rezzed on region creation 65Vehicle attributes are not restored when a vehicle is rezzed on region creation
70 Create vehicle, setup vehicle properties, restart region, vehicle is not reinitialized. 66 Create vehicle, setup vehicle properties, restart region, vehicle is not reinitialized.
67What to do if vehicle and prim buoyancy differ?
71 68
72GENERAL TODO LIST: 69GENERAL TODO LIST:
73================================================= 70=================================================
74Explore btGImpactMeshShape as alternative to convex hulls for simplified physical objects.
75 Regular triangle meshes don't do physical collisions.
76Resitution of a prim works on another prim but not on terrain. 71Resitution of a prim works on another prim but not on terrain.
77 The dropped prim doesn't bounce properly on the terrain. 72 The dropped prim doesn't bounce properly on the terrain.
78Add a sanity check for PIDTarget location. 73Add a sanity check for PIDTarget location.
@@ -98,29 +93,15 @@ Revisit CollisionMargin. Builders notice the 0.04 spacing between prims.
98Duplicating a physical prim causes old prim to jump away 93Duplicating a physical prim causes old prim to jump away
99 Dup a phys prim and the original become unselected and thus interacts w/ selected prim. 94 Dup a phys prim and the original become unselected and thus interacts w/ selected prim.
100Scenes with hundred of thousands of static objects take a lot of physics CPU time. 95Scenes with hundred of thousands of static objects take a lot of physics CPU time.
101BSPrim.Force should set a continious force on the prim. The force should be
102 applied each tick. Some limits?
103Gun sending shooter flying. 96Gun sending shooter flying.
104Collision margin (gap between physical objects lying on each other) 97Collision margin (gap between physical objects lying on each other)
105Boundry checking (crashes related to crossing boundry) 98Boundry checking (crashes related to crossing boundry)
106 Add check for border edge position for avatars and objects. 99 Add check for border edge position for avatars and objects.
107 Verify the events are created for border crossings. 100 Verify the events are created for border crossings.
108Avatar rotation (check out changes to ScenePresence for physical rotation)
109Avatar running (what does phys engine need to do?)
110Small physical objects do not interact correctly
111 Create chain of .5x.5x.1 torui and make all but top physical so to hang.
112 The chain will fall apart and pairs will dance around on ground
113 Chains of 1x1x.2 will stay connected but will dance.
114 Chains above 2x2x.4 are more stable and get stablier as torui get larger.
115Add PID motor for avatar movement (slow to stop, ...)
116setForce should set a constant force. Different than AddImpulse.
117Implement raycast.
118Implement ShapeCollection.Dispose() 101Implement ShapeCollection.Dispose()
119Implement water as a plain so raycasting and collisions can happen with same. 102Implement water as a plain or mesh so raycasting and collisions can happen with same.
120Add collision penetration return 103Add collision penetration return
121 Add field passed back by BulletSim.dll and fill with info in ManifoldConstact.GetDistance() 104 Add field passed back by BulletSim.dll and fill with info in ManifoldConstact.GetDistance()
122Add osGetPhysicsEngineName() so scripters can tell whether BulletSim or ODE
123 Also osGetPhysicsEngineVerion() maybe.
124Linkset.Position and Linkset.Orientation requre rewrite to properly return 105Linkset.Position and Linkset.Orientation requre rewrite to properly return
125 child position. LinksetConstraint acts like it's at taint time!! 106 child position. LinksetConstraint acts like it's at taint time!!
126Implement LockAngularMotion -- implements llSetStatus(ROTATE_AXIS_*, T/F) 107Implement LockAngularMotion -- implements llSetStatus(ROTATE_AXIS_*, T/F)
@@ -132,9 +113,6 @@ Selecting and deselecting physical objects causes CPU processing time to jump
132Re-implement buoyancy as a separate force on the object rather than diddling gravity. 113Re-implement buoyancy as a separate force on the object rather than diddling gravity.
133 Register a pre-step event to add the force. 114 Register a pre-step event to add the force.
134More efficient memory usage when passing hull information from BSPrim to BulletSim 115More efficient memory usage when passing hull information from BSPrim to BulletSim
135Avatar movement motor check for zero or small movement. Somehow suppress small movements
136 when avatar has stopped and is just standing. Simple test for near zero has
137 the problem of preventing starting up (increase from zero) especially when falling.
138Physical and phantom will drop through the terrain 116Physical and phantom will drop through the terrain
139 117
140 118
@@ -168,6 +146,7 @@ Eliminate collisions between objects in a linkset. (LinksetConstraint)
168 146
169MORE 147MORE
170====================================================== 148======================================================
149Compute avatar size and scale correctly. Now it is a bit off from the capsule size.
171Create tests for different interface components 150Create tests for different interface components
172 Have test objects/scripts measure themselves and turn color if correct/bad 151 Have test objects/scripts measure themselves and turn color if correct/bad
173 Test functions in SL and calibrate correctness there 152 Test functions in SL and calibrate correctness there
@@ -176,7 +155,6 @@ Do we need to do convex hulls all the time? Can complex meshes be left meshes?
176 There is some problem with meshes and collisions 155 There is some problem with meshes and collisions
177 Hulls are not as detailed as meshes. Hulled vehicles insides are different shape. 156 Hulls are not as detailed as meshes. Hulled vehicles insides are different shape.
178Debounce avatar contact so legs don't keep folding up when standing. 157Debounce avatar contact so legs don't keep folding up when standing.
179Implement LSL physics controls. Like STATUS_ROTATE_X.
180Add border extensions to terrain to help region crossings and objects leaving region. 158Add border extensions to terrain to help region crossings and objects leaving region.
181Use a different capsule shape for avatar when sitting 159Use a different capsule shape for avatar when sitting
182 LL uses a pyrimidal shape scaled by the avatar's bounding box 160 LL uses a pyrimidal shape scaled by the avatar's bounding box
@@ -209,8 +187,6 @@ Keep avatar scaling correct. http://pennycow.blogspot.fr/2011/07/matter-of-scale
209 187
210INTERNAL IMPROVEMENT/CLEANUP 188INTERNAL IMPROVEMENT/CLEANUP
211================================================= 189=================================================
212Can the 'inTaintTime' flag be cleaned up and used? For instance, a call to
213 BSScene.TaintedObject() could immediately execute the callback if already in taint time.
214Create the physical wrapper classes (BulletBody, BulletShape) by methods on 190Create the physical wrapper classes (BulletBody, BulletShape) by methods on
215 BSAPITemplate and make their actual implementation Bullet engine specific. 191 BSAPITemplate and make their actual implementation Bullet engine specific.
216 For the short term, just call the existing functions in ShapeCollection. 192 For the short term, just call the existing functions in ShapeCollection.
@@ -344,3 +320,60 @@ Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
344 Verify that angular motion specified around Z moves in the vehicle coordinates. 320 Verify that angular motion specified around Z moves in the vehicle coordinates.
345 DONE 20130120: BulletSim properly applies force in vehicle relative coordinates. 321 DONE 20130120: BulletSim properly applies force in vehicle relative coordinates.
346Nebadon vehicles turning funny in arena (DONE) 322Nebadon vehicles turning funny in arena (DONE)
323Lock axis (DONE 20130401)
324Terrain detail: double terrain mesh detail (DONE)
325Use the HACD convex hull routine in Bullet rather than the C# version.
326 Speed up hullifying large meshes. (DONE)
327Vehicle ride, get up, ride again. Second time vehicle does not act correctly.
328 Have to rez new vehicle and delete the old to fix situation.
329 (DONE 20130520: normalize rotations)
330Hitting RESET on Nebadon's vehicle while riding causes vehicle to get into odd
331 position state where it will not settle onto ground properly, etc
332 (DONE 20130520: normalize rotations)
333Two of Nebadon vehicles in a sim max the CPU. This is new.
334 (DONE 20130520: two problems: if asset failed to mesh, constantly refetched
335 asset; vehicle was sending too many messages to all linkset members)
336Add material densities to the material types. (WILL NOT BE DONE: not how it is done)
337Avatars walking up stairs (DONE)
338Avatar movement
339 flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE)
340 walking up stairs is not calibrated correctly (stairs out of Kepler cabin) (DONE)
341 avatar capsule rotation completed (NOT DONE - Bullet's capsule shape is not the solution)
342After getting off a vehicle, the root prim is phantom (can be walked through)
343 Need to force a position update for the root prim after compound shape destruction
344 (DONE)
345Explore btGImpactMeshShape as alternative to convex hulls for simplified physical objects.
346 Regular triangle meshes don't do physical collisions.
347 (DONE: discovered GImpact is VERY CPU intensive)
348Script changing rotation of child prim while vehicle moving (eg turning wheel) causes
349 the wheel to appear to jump back. Looks like sending position from previous update.
350 (DONE: redo of compound linksets fixed problem)
351Refarb compound linkset creation to create a pseudo-root for center-of-mass
352 Let children change their shape to physical indendently and just add shapes to compound
353 (DONE: redo of compound linkset fixed problem)
354Vehicle angular vertical attraction (DONE: vegaslon code)
355vehicle angular banking (DONE: vegaslon code)
356Vehicle angular deflection (DONE: vegaslon code)
357 Preferred orientation angular correction fix
358Vehicles (Move smoothly)
359For limitMotorUp, use raycast down to find if vehicle is in the air.
360 (WILL NOT BE DONE: gravity does the job well enough)
361BSPrim.Force should set a continious force on the prim. The force should be
362 applied each tick. Some limits?
363 (DONE: added physical actors. Implemented SetForce, SetTorque, ...)
364Implement LSL physics controls. Like STATUS_ROTATE_X. (DONE)
365Add osGetPhysicsEngineName() so scripters can tell whether BulletSim or ODE
366Avatar rotation (check out changes to ScenePresence for physical rotation) (DONE)
367Avatar running (what does phys engine need to do?) (DONE: multiplies run factor by walking force)
368setForce should set a constant force. Different than AddImpulse. (DONE)
369Add PID motor for avatar movement (slow to stop, ...) (WNBD: current works ok)
370Avatar movement motor check for zero or small movement. Somehow suppress small movements
371 when avatar has stopped and is just standing. Simple test for near zero has
372 the problem of preventing starting up (increase from zero) especially when falling.
373 (DONE: avatar movement actor knows if standing on stationary object and zeros motion)
374Can the 'inTaintTime' flag be cleaned up and used? For instance, a call to
375 BSScene.TaintedObject() could immediately execute the callback if already in taint time.
376 (DONE)
377
378
379
diff --git a/OpenSim/Region/Physics/BulletSPlugin/Tests/BasicVehicles.cs b/OpenSim/Region/Physics/BulletSPlugin/Tests/BasicVehicles.cs
index 33232bd..48e74eb 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/Tests/BasicVehicles.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/Tests/BasicVehicles.cs
@@ -57,6 +57,8 @@ public class BasicVehicles : OpenSimTestCase
57 public void Init() 57 public void Init()
58 { 58 {
59 Dictionary<string, string> engineParams = new Dictionary<string, string>(); 59 Dictionary<string, string> engineParams = new Dictionary<string, string>();
60 engineParams.Add("VehicleEnableAngularVerticalAttraction", "true");
61 engineParams.Add("VehicleAngularVerticalAttractionAlgorithm", "1");
60 PhysicsScene = BulletSimTestsUtil.CreateBasicPhysicsEngine(engineParams); 62 PhysicsScene = BulletSimTestsUtil.CreateBasicPhysicsEngine(engineParams);
61 63
62 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateSphere(); 64 PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateSphere();
@@ -114,21 +116,25 @@ public class BasicVehicles : OpenSimTestCase
114 // Instead the appropriate values are set and calls are made just the parts of the 116 // Instead the appropriate values are set and calls are made just the parts of the
115 // controller we want to exercise. Stepping the physics engine then applies 117 // controller we want to exercise. Stepping the physics engine then applies
116 // the actions of that one feature. 118 // the actions of that one feature.
117 TestVehicle.VehicleController.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_EFFICIENCY, efficiency); 119 BSDynamics vehicleActor = TestVehicle.GetVehicleActor(true /* createIfNone */);
118 TestVehicle.VehicleController.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_TIMESCALE, timeScale); 120 if (vehicleActor != null)
119 TestVehicle.VehicleController.enableAngularVerticalAttraction = true;
120
121 TestVehicle.IsPhysical = true;
122 PhysicsScene.ProcessTaints();
123
124 // Step the simulator a bunch of times and vertical attraction should orient the vehicle up
125 for (int ii = 0; ii < simSteps; ii++)
126 { 121 {
127 TestVehicle.VehicleController.ForgetKnownVehicleProperties(); 122 vehicleActor.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_EFFICIENCY, efficiency);
128 TestVehicle.VehicleController.ComputeAngularVerticalAttraction(); 123 vehicleActor.ProcessFloatVehicleParam(Vehicle.VERTICAL_ATTRACTION_TIMESCALE, timeScale);
129 TestVehicle.VehicleController.PushKnownChanged(); 124 // vehicleActor.enableAngularVerticalAttraction = true;
130 125
131 PhysicsScene.Simulate(simulationTimeStep); 126 TestVehicle.IsPhysical = true;
127 PhysicsScene.ProcessTaints();
128
129 // Step the simulator a bunch of times and vertical attraction should orient the vehicle up
130 for (int ii = 0; ii < simSteps; ii++)
131 {
132 vehicleActor.ForgetKnownVehicleProperties();
133 vehicleActor.ComputeAngularVerticalAttraction();
134 vehicleActor.PushKnownChanged();
135
136 PhysicsScene.Simulate(simulationTimeStep);
137 }
132 } 138 }
133 139
134 TestVehicle.IsPhysical = false; 140 TestVehicle.IsPhysical = false;
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 7cd364b..44bfd42 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -415,6 +415,12 @@ namespace OpenSim.Region.Physics.Manager
415 public virtual PhysicsActor ParentActor { get { return this; } } 415 public virtual PhysicsActor ParentActor { get { return this; } }
416 416
417 417
418 // Extendable interface for new, physics engine specific operations
419 public virtual object Extension(string pFunct, params object[] pParams)
420 {
421 // A NOP of the physics engine does not implement this feature
422 return null;
423 }
418 } 424 }
419 425
420 public class NullPhysicsActor : PhysicsActor 426 public class NullPhysicsActor : PhysicsActor
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index 20a70b4..dd9bbc1 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -25,10 +25,13 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System;
28using System.Collections.Generic; 29using System.Collections.Generic;
29using System.Reflection; 30using System.Reflection;
31
30using log4net; 32using log4net;
31using Nini.Config; 33using Nini.Config;
34
32using OpenSim.Framework; 35using OpenSim.Framework;
33using OpenMetaverse; 36using OpenMetaverse;
34 37
@@ -386,5 +389,12 @@ namespace OpenSim.Region.Physics.Manager
386 { 389 {
387 return 0; 390 return 0;
388 } 391 }
392
393 // Extendable interface for new, physics engine specific operations
394 public virtual object Extension(string pFunct, params object[] pParams)
395 {
396 // A NOP if the extension thing is not implemented by the physics engine
397 return null;
398 }
389 } 399 }
390} 400}
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index d181b78..16d65eb 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -64,6 +64,7 @@ namespace OpenSim.Region.Physics.Meshing
64 public class Meshmerizer : IMesher 64 public class Meshmerizer : IMesher
65 { 65 {
66 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 66 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
67 private static string LogHeader = "[MESH]";
67 68
68 // Setting baseDir to a path will enable the dumping of raw files 69 // Setting baseDir to a path will enable the dumping of raw files
69 // raw files can be imported by blender so a visual inspection of the results can be done 70 // raw files can be imported by blender so a visual inspection of the results can be done
@@ -72,6 +73,8 @@ namespace OpenSim.Region.Physics.Meshing
72#else 73#else
73 private const string baseDir = null; //"rawFiles"; 74 private const string baseDir = null; //"rawFiles";
74#endif 75#endif
76 // If 'true', lots of DEBUG logging of asset parsing details
77 private bool debugDetail = false;
75 78
76 private bool cacheSculptMaps = true; 79 private bool cacheSculptMaps = true;
77 private string decodedSculptMapPath = null; 80 private string decodedSculptMapPath = null;
@@ -79,6 +82,9 @@ namespace OpenSim.Region.Physics.Meshing
79 82
80 private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh 83 private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh
81 84
85 private List<List<Vector3>> mConvexHulls = null;
86 private List<Vector3> mBoundingHull = null;
87
82 private Dictionary<ulong, Mesh> m_uniqueMeshes = new Dictionary<ulong, Mesh>(); 88 private Dictionary<ulong, Mesh> m_uniqueMeshes = new Dictionary<ulong, Mesh>();
83 89
84 public Meshmerizer(IConfigSource config) 90 public Meshmerizer(IConfigSource config)
@@ -88,8 +94,11 @@ namespace OpenSim.Region.Physics.Meshing
88 94
89 decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache"); 95 decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache");
90 cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps); 96 cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps);
91 if(mesh_config != null) 97 if (mesh_config != null)
98 {
92 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh); 99 useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
100 debugDetail = mesh_config.GetBoolean("LogMeshDetails", debugDetail);
101 }
93 102
94 try 103 try
95 { 104 {
@@ -319,6 +328,9 @@ namespace OpenSim.Region.Physics.Meshing
319 faces = new List<Face>(); 328 faces = new List<Face>();
320 OSD meshOsd = null; 329 OSD meshOsd = null;
321 330
331 mConvexHulls = null;
332 mBoundingHull = null;
333
322 if (primShape.SculptData.Length <= 0) 334 if (primShape.SculptData.Length <= 0)
323 { 335 {
324 // XXX: At the moment we can not log here since ODEPrim, for instance, ends up triggering this 336 // XXX: At the moment we can not log here since ODEPrim, for instance, ends up triggering this
@@ -355,9 +367,139 @@ namespace OpenSim.Region.Physics.Meshing
355 OSDMap physicsParms = null; 367 OSDMap physicsParms = null;
356 OSDMap map = (OSDMap)meshOsd; 368 OSDMap map = (OSDMap)meshOsd;
357 if (map.ContainsKey("physics_shape")) 369 if (map.ContainsKey("physics_shape"))
370 {
358 physicsParms = (OSDMap)map["physics_shape"]; // old asset format 371 physicsParms = (OSDMap)map["physics_shape"]; // old asset format
372 if (debugDetail) m_log.DebugFormat("{0} prim='{1}': using 'physics_shape' mesh data", LogHeader, primName);
373 }
359 else if (map.ContainsKey("physics_mesh")) 374 else if (map.ContainsKey("physics_mesh"))
375 {
360 physicsParms = (OSDMap)map["physics_mesh"]; // new asset format 376 physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
377 if (debugDetail) m_log.DebugFormat("{0} prim='{1}':using 'physics_mesh' mesh data", LogHeader, primName);
378 }
379 else if (map.ContainsKey("medium_lod"))
380 {
381 physicsParms = (OSDMap)map["medium_lod"]; // if no physics mesh, try to fall back to medium LOD display mesh
382 if (debugDetail) m_log.DebugFormat("{0} prim='{1}':using 'medium_lod' mesh data", LogHeader, primName);
383 }
384 else if (map.ContainsKey("high_lod"))
385 {
386 physicsParms = (OSDMap)map["high_lod"]; // if all else fails, use highest LOD display mesh and hope it works :)
387 if (debugDetail) m_log.DebugFormat("{0} prim='{1}':using 'high_lod' mesh data", LogHeader, primName);
388 }
389
390 if (map.ContainsKey("physics_convex"))
391 { // pull this out also in case physics engine can use it
392 OSD convexBlockOsd = null;
393 try
394 {
395 OSDMap convexBlock = (OSDMap)map["physics_convex"];
396 {
397 int convexOffset = convexBlock["offset"].AsInteger() + (int)start;
398 int convexSize = convexBlock["size"].AsInteger();
399
400 byte[] convexBytes = new byte[convexSize];
401
402 System.Buffer.BlockCopy(primShape.SculptData, convexOffset, convexBytes, 0, convexSize);
403
404 try
405 {
406 convexBlockOsd = DecompressOsd(convexBytes);
407 }
408 catch (Exception e)
409 {
410 m_log.ErrorFormat("{0} prim='{1}': exception decoding convex block: {2}", LogHeader, primName, e);
411 //return false;
412 }
413 }
414
415 if (convexBlockOsd != null && convexBlockOsd is OSDMap)
416 {
417 convexBlock = convexBlockOsd as OSDMap;
418
419 if (debugDetail)
420 {
421 string keys = LogHeader + " keys found in convexBlock: ";
422 foreach (KeyValuePair<string, OSD> kvp in convexBlock)
423 keys += "'" + kvp.Key + "' ";
424 m_log.Debug(keys);
425 }
426
427 Vector3 min = new Vector3(-0.5f, -0.5f, -0.5f);
428 if (convexBlock.ContainsKey("Min")) min = convexBlock["Min"].AsVector3();
429 Vector3 max = new Vector3(0.5f, 0.5f, 0.5f);
430 if (convexBlock.ContainsKey("Max")) max = convexBlock["Max"].AsVector3();
431
432 List<Vector3> boundingHull = null;
433
434 if (convexBlock.ContainsKey("BoundingVerts"))
435 {
436 byte[] boundingVertsBytes = convexBlock["BoundingVerts"].AsBinary();
437 boundingHull = new List<Vector3>();
438 for (int i = 0; i < boundingVertsBytes.Length; )
439 {
440 ushort uX = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2;
441 ushort uY = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2;
442 ushort uZ = Utils.BytesToUInt16(boundingVertsBytes, i); i += 2;
443
444 Vector3 pos = new Vector3(
445 Utils.UInt16ToFloat(uX, min.X, max.X),
446 Utils.UInt16ToFloat(uY, min.Y, max.Y),
447 Utils.UInt16ToFloat(uZ, min.Z, max.Z)
448 );
449
450 boundingHull.Add(pos);
451 }
452
453 mBoundingHull = boundingHull;
454 if (debugDetail) m_log.DebugFormat("{0} prim='{1}': parsed bounding hull. nVerts={2}", LogHeader, primName, mBoundingHull.Count);
455 }
456
457 if (convexBlock.ContainsKey("HullList"))
458 {
459 byte[] hullList = convexBlock["HullList"].AsBinary();
460
461 byte[] posBytes = convexBlock["Positions"].AsBinary();
462
463 List<List<Vector3>> hulls = new List<List<Vector3>>();
464 int posNdx = 0;
465
466 foreach (byte cnt in hullList)
467 {
468 int count = cnt == 0 ? 256 : cnt;
469 List<Vector3> hull = new List<Vector3>();
470
471 for (int i = 0; i < count; i++)
472 {
473 ushort uX = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2;
474 ushort uY = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2;
475 ushort uZ = Utils.BytesToUInt16(posBytes, posNdx); posNdx += 2;
476
477 Vector3 pos = new Vector3(
478 Utils.UInt16ToFloat(uX, min.X, max.X),
479 Utils.UInt16ToFloat(uY, min.Y, max.Y),
480 Utils.UInt16ToFloat(uZ, min.Z, max.Z)
481 );
482
483 hull.Add(pos);
484 }
485
486 hulls.Add(hull);
487 }
488
489 mConvexHulls = hulls;
490 if (debugDetail) m_log.DebugFormat("{0} prim='{1}': parsed hulls. nHulls={2}", LogHeader, primName, mConvexHulls.Count);
491 }
492 else
493 {
494 if (debugDetail) m_log.DebugFormat("{0} prim='{1}' has physics_convex but no HullList", LogHeader, primName);
495 }
496 }
497 }
498 catch (Exception e)
499 {
500 m_log.WarnFormat("{0} exception decoding convex block: {1}", LogHeader, e);
501 }
502 }
361 503
362 if (physicsParms == null) 504 if (physicsParms == null)
363 { 505 {
@@ -374,34 +516,14 @@ namespace OpenSim.Region.Physics.Meshing
374 OSD decodedMeshOsd = new OSD(); 516 OSD decodedMeshOsd = new OSD();
375 byte[] meshBytes = new byte[physSize]; 517 byte[] meshBytes = new byte[physSize];
376 System.Buffer.BlockCopy(primShape.SculptData, physOffset, meshBytes, 0, physSize); 518 System.Buffer.BlockCopy(primShape.SculptData, physOffset, meshBytes, 0, physSize);
377// byte[] decompressed = new byte[physSize * 5]; 519 // byte[] decompressed = new byte[physSize * 5];
378 try 520 try
379 { 521 {
380 using (MemoryStream inMs = new MemoryStream(meshBytes)) 522 decodedMeshOsd = DecompressOsd(meshBytes);
381 {
382 using (MemoryStream outMs = new MemoryStream())
383 {
384 using (ZOutputStream zOut = new ZOutputStream(outMs))
385 {
386 byte[] readBuffer = new byte[2048];
387 int readLen = 0;
388 while ((readLen = inMs.Read(readBuffer, 0, readBuffer.Length)) > 0)
389 {
390 zOut.Write(readBuffer, 0, readLen);
391 }
392 zOut.Flush();
393 outMs.Seek(0, SeekOrigin.Begin);
394
395 byte[] decompressedBuf = outMs.GetBuffer();
396
397 decodedMeshOsd = OSDParser.DeserializeLLSDBinary(decompressedBuf);
398 }
399 }
400 }
401 } 523 }
402 catch (Exception e) 524 catch (Exception e)
403 { 525 {
404 m_log.Error("[MESH]: exception decoding physical mesh: " + e.ToString()); 526 m_log.ErrorFormat("{0} prim='{1}': exception decoding physical mesh: {2}", LogHeader, primName, e);
405 return false; 527 return false;
406 } 528 }
407 529
@@ -410,7 +532,7 @@ namespace OpenSim.Region.Physics.Meshing
410 // physics_shape is an array of OSDMaps, one for each submesh 532 // physics_shape is an array of OSDMaps, one for each submesh
411 if (decodedMeshOsd is OSDArray) 533 if (decodedMeshOsd is OSDArray)
412 { 534 {
413// Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd)); 535 // Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd));
414 536
415 decodedMeshOsdArray = (OSDArray)decodedMeshOsd; 537 decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
416 foreach (OSD subMeshOsd in decodedMeshOsdArray) 538 foreach (OSD subMeshOsd in decodedMeshOsdArray)
@@ -418,12 +540,50 @@ namespace OpenSim.Region.Physics.Meshing
418 if (subMeshOsd is OSDMap) 540 if (subMeshOsd is OSDMap)
419 AddSubMesh(subMeshOsd as OSDMap, size, coords, faces); 541 AddSubMesh(subMeshOsd as OSDMap, size, coords, faces);
420 } 542 }
543 if (debugDetail)
544 m_log.DebugFormat("{0} {1}: mesh decoded. offset={2}, size={3}, nCoords={4}, nFaces={5}",
545 LogHeader, primName, physOffset, physSize, coords.Count, faces.Count);
421 } 546 }
422 } 547 }
423 548
424 return true; 549 return true;
425 } 550 }
426 551
552
553 /// <summary>
554 /// decompresses a gzipped OSD object
555 /// </summary>
556 /// <param name="decodedOsd"></param> the OSD object
557 /// <param name="meshBytes"></param>
558 /// <returns></returns>
559 private static OSD DecompressOsd(byte[] meshBytes)
560 {
561 OSD decodedOsd = null;
562
563 using (MemoryStream inMs = new MemoryStream(meshBytes))
564 {
565 using (MemoryStream outMs = new MemoryStream())
566 {
567 using (ZOutputStream zOut = new ZOutputStream(outMs))
568 {
569 byte[] readBuffer = new byte[2048];
570 int readLen = 0;
571 while ((readLen = inMs.Read(readBuffer, 0, readBuffer.Length)) > 0)
572 {
573 zOut.Write(readBuffer, 0, readLen);
574 }
575 zOut.Flush();
576 outMs.Seek(0, SeekOrigin.Begin);
577
578 byte[] decompressedBuf = outMs.GetBuffer();
579
580 decodedOsd = OSDParser.DeserializeLLSDBinary(decompressedBuf);
581 }
582 }
583 }
584 return decodedOsd;
585 }
586
427 /// <summary> 587 /// <summary>
428 /// Generate the co-ords and faces necessary to construct a mesh from the sculpt data the accompanies a prim. 588 /// Generate the co-ords and faces necessary to construct a mesh from the sculpt data the accompanies a prim.
429 /// </summary> 589 /// </summary>
@@ -700,6 +860,45 @@ namespace OpenSim.Region.Physics.Meshing
700 return true; 860 return true;
701 } 861 }
702 862
863 /// <summary>
864 /// temporary prototype code - please do not use until the interface has been finalized!
865 /// </summary>
866 /// <param name="size">value to scale the hull points by</param>
867 /// <returns>a list of vertices in the bounding hull if it exists and has been successfully decoded, otherwise null</returns>
868 public List<Vector3> GetBoundingHull(Vector3 size)
869 {
870 if (mBoundingHull == null)
871 return null;
872
873 List<Vector3> verts = new List<Vector3>();
874 foreach (var vert in mBoundingHull)
875 verts.Add(vert * size);
876
877 return verts;
878 }
879
880 /// <summary>
881 /// temporary prototype code - please do not use until the interface has been finalized!
882 /// </summary>
883 /// <param name="size">value to scale the hull points by</param>
884 /// <returns>a list of hulls if they exist and have been successfully decoded, otherwise null</returns>
885 public List<List<Vector3>> GetConvexHulls(Vector3 size)
886 {
887 if (mConvexHulls == null)
888 return null;
889
890 List<List<Vector3>> hulls = new List<List<Vector3>>();
891 foreach (var hull in mConvexHulls)
892 {
893 List<Vector3> verts = new List<Vector3>();
894 foreach (var vert in hull)
895 verts.Add(vert * size);
896 hulls.Add(verts);
897 }
898
899 return hulls;
900 }
901
703 public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod) 902 public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
704 { 903 {
705 return CreateMesh(primName, primShape, size, lod, false, true); 904 return CreateMesh(primName, primShape, size, lod, false, true);
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index d09aa62..b4b7e7f 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -108,7 +108,6 @@ namespace OpenSim.Region.Physics.OdePlugin
108 private Vector3 m_taintAngularLock = Vector3.One; 108 private Vector3 m_taintAngularLock = Vector3.One;
109 private IntPtr Amotor = IntPtr.Zero; 109 private IntPtr Amotor = IntPtr.Zero;
110 110
111 private object m_assetsLock = new object();
112 private bool m_assetFailed = false; 111 private bool m_assetFailed = false;
113 112
114 private Vector3 m_PIDTarget; 113 private Vector3 m_PIDTarget;
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 07663b3..7e652fc 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Region.Physics.OdePlugin
46 /// </summary> 46 /// </summary>
47 public class OdePlugin : IPhysicsPlugin 47 public class OdePlugin : IPhysicsPlugin
48 { 48 {
49 private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 49// private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
50 50
51 private OdeScene m_scene; 51 private OdeScene m_scene;
52 52
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs
index f424e7f..83732e2 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerIndividualEventForwarder.cs
@@ -51,7 +51,8 @@ namespace OpenSim.Region.RegionCombinerModule
51 m_virtScene.UnSubscribeToClientPrimEvents(client); 51 m_virtScene.UnSubscribeToClientPrimEvents(client);
52 m_virtScene.UnSubscribeToClientPrimRezEvents(client); 52 m_virtScene.UnSubscribeToClientPrimRezEvents(client);
53 m_virtScene.UnSubscribeToClientInventoryEvents(client); 53 m_virtScene.UnSubscribeToClientInventoryEvents(client);
54 ((AttachmentsModule)m_virtScene.AttachmentsModule).UnsubscribeFromClientEvents(client); 54 if(m_virtScene.AttachmentsModule != null)
55 ((AttachmentsModule)m_virtScene.AttachmentsModule).UnsubscribeFromClientEvents(client);
55 //m_virtScene.UnSubscribeToClientTeleportEvents(client); 56 //m_virtScene.UnSubscribeToClientTeleportEvents(client);
56 m_virtScene.UnSubscribeToClientScriptEvents(client); 57 m_virtScene.UnSubscribeToClientScriptEvents(client);
57 58
@@ -66,7 +67,8 @@ namespace OpenSim.Region.RegionCombinerModule
66 client.OnRezObject += LocalRezObject; 67 client.OnRezObject += LocalRezObject;
67 68
68 m_rootScene.SubscribeToClientInventoryEvents(client); 69 m_rootScene.SubscribeToClientInventoryEvents(client);
69 ((AttachmentsModule)m_rootScene.AttachmentsModule).SubscribeToClientEvents(client); 70 if (m_rootScene.AttachmentsModule != null)
71 ((AttachmentsModule)m_rootScene.AttachmentsModule).SubscribeToClientEvents(client);
70 //m_rootScene.SubscribeToClientTeleportEvents(client); 72 //m_rootScene.SubscribeToClientTeleportEvents(client);
71 m_rootScene.SubscribeToClientScriptEvents(client); 73 m_rootScene.SubscribeToClientScriptEvents(client);
72 74
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
index b4abc1d..4bf2a82 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
@@ -27,6 +27,8 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection;
31using log4net;
30using OpenMetaverse; 32using OpenMetaverse;
31using OpenSim.Framework; 33using OpenSim.Framework;
32using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
@@ -34,10 +36,10 @@ using OpenSim.Region.CoreModules.World.Land;
34 36
35namespace OpenSim.Region.RegionCombinerModule 37namespace OpenSim.Region.RegionCombinerModule
36{ 38{
37public class RegionCombinerLargeLandChannel : ILandChannel 39 public class RegionCombinerLargeLandChannel : ILandChannel
38 { 40 {
39 // private static readonly ILog m_log = 41// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
40 // LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 42
41 private RegionData RegData; 43 private RegionData RegData;
42 private ILandChannel RootRegionLandChannel; 44 private ILandChannel RootRegionLandChannel;
43 private readonly List<RegionData> RegionConnections; 45 private readonly List<RegionData> RegionConnections;
@@ -75,40 +77,51 @@ public class RegionCombinerLargeLandChannel : ILandChannel
75 77
76 public ILandObject GetLandObject(int x, int y) 78 public ILandObject GetLandObject(int x, int y)
77 { 79 {
78 //m_log.DebugFormat("[BIGLANDTESTINT]: <{0},{1}>", x, y); 80 return GetLandObject((float)x, (float)y);
79 81
80 if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize) 82// m_log.DebugFormat("[BIGLANDTESTINT]: <{0},{1}>", x, y);
81 { 83//
82 return RootRegionLandChannel.GetLandObject(x, y); 84// if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
83 } 85// {
84 else 86// return RootRegionLandChannel.GetLandObject(x, y);
85 { 87// }
86 int offsetX = (x / (int)Constants.RegionSize); 88// else
87 int offsetY = (y / (int)Constants.RegionSize); 89// {
88 offsetX *= (int)Constants.RegionSize; 90// int offsetX = (x / (int)Constants.RegionSize);
89 offsetY *= (int)Constants.RegionSize; 91// int offsetY = (y / (int)Constants.RegionSize);
90 92// offsetX *= (int)Constants.RegionSize;
91 foreach (RegionData regionData in RegionConnections) 93// offsetY *= (int)Constants.RegionSize;
92 { 94//
93 if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY) 95// foreach (RegionData regionData in RegionConnections)
94 { 96// {
95 return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY); 97// if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
96 } 98// {
97 } 99// m_log.DebugFormat(
98 ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene); 100// "[REGION COMBINER LARGE LAND CHANNEL]: Found region {0} at offset {1},{2}",
99 obj.LandData.Name = "NO LAND"; 101// regionData.RegionScene.Name, offsetX, offsetY);
100 return obj; 102//
101 } 103// return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
104// }
105// }
106// //ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
107// //obj.LandData.Name = "NO LAND";
108// //return obj;
109// }
110//
111// m_log.DebugFormat("[REGION COMBINER LARGE LAND CHANNEL]: No region found at {0},{1}, returning null", x, y);
112//
113// return null;
102 } 114 }
103 115
104 public ILandObject GetLandObject(int localID) 116 public ILandObject GetLandObject(int localID)
105 { 117 {
118 // XXX: Possibly should be looking in every land channel, not just the root.
106 return RootRegionLandChannel.GetLandObject(localID); 119 return RootRegionLandChannel.GetLandObject(localID);
107 } 120 }
108 121
109 public ILandObject GetLandObject(float x, float y) 122 public ILandObject GetLandObject(float x, float y)
110 { 123 {
111 //m_log.DebugFormat("[BIGLANDTESTFLOAT]: <{0},{1}>", x, y); 124// m_log.DebugFormat("[BIGLANDTESTFLOAT]: <{0},{1}>", x, y);
112 125
113 if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize) 126 if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
114 { 127 {
@@ -125,14 +138,22 @@ public class RegionCombinerLargeLandChannel : ILandChannel
125 { 138 {
126 if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY) 139 if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
127 { 140 {
141// m_log.DebugFormat(
142// "[REGION COMBINER LARGE LAND CHANNEL]: Found region {0} at offset {1},{2}",
143// regionData.RegionScene.Name, offsetX, offsetY);
144
128 return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY); 145 return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
129 } 146 }
130 } 147 }
131 148
132 ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene); 149// ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
133 obj.LandData.Name = "NO LAND"; 150// obj.LandData.Name = "NO LAND";
134 return obj; 151// return obj;
135 } 152 }
153
154// m_log.DebugFormat("[REGION COMBINER LARGE LAND CHANNEL]: No region found at {0},{1}, returning null", x, y);
155
156 return null;
136 } 157 }
137 158
138 public bool IsForcefulBansAllowed() 159 public bool IsForcefulBansAllowed()
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index 35ae44c..b9a217b 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
51 public interface IScriptWorkItem 51 public interface IScriptWorkItem
52 { 52 {
53 bool Cancel(); 53 bool Cancel();
54 void Abort(); 54 bool Abort();
55 55
56 /// <summary> 56 /// <summary>
57 /// Wait for the work item to complete. 57 /// Wait for the work item to complete.
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index 6879ebb..1e19032 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -37,6 +37,8 @@ using OpenSim.Region.ScriptEngine.Interfaces;
37using OpenSim.Region.ScriptEngine.Shared; 37using OpenSim.Region.ScriptEngine.Shared;
38using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; 38using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
39using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; 39using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer;
40using System.Reflection;
41using log4net;
40 42
41namespace OpenSim.Region.ScriptEngine.Shared.Api 43namespace OpenSim.Region.ScriptEngine.Shared.Api
42{ 44{
@@ -45,15 +47,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
45 /// </summary> 47 /// </summary>
46 public class AsyncCommandManager 48 public class AsyncCommandManager
47 { 49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51
48 private static Thread cmdHandlerThread; 52 private static Thread cmdHandlerThread;
49 private static int cmdHandlerThreadCycleSleepms; 53 private static int cmdHandlerThreadCycleSleepms;
50 54
51 private static List<IScene> m_Scenes = new List<IScene>(); 55 /// <summary>
56 /// Lock for reading/writing static components of AsyncCommandManager.
57 /// </summary>
58 /// <remarks>
59 /// This lock exists so that multiple threads from different engines and/or different copies of the same engine
60 /// are prevented from running non-thread safe code (e.g. read/write of lists) concurrently.
61 /// </remarks>
62 private static object staticLock = new object();
63
52 private static List<IScriptEngine> m_ScriptEngines = 64 private static List<IScriptEngine> m_ScriptEngines =
53 new List<IScriptEngine>(); 65 new List<IScriptEngine>();
54 66
55 public IScriptEngine m_ScriptEngine; 67 public IScriptEngine m_ScriptEngine;
56 private IScene m_Scene;
57 68
58 private static Dictionary<IScriptEngine, Dataserver> m_Dataserver = 69 private static Dictionary<IScriptEngine, Dataserver> m_Dataserver =
59 new Dictionary<IScriptEngine, Dataserver>(); 70 new Dictionary<IScriptEngine, Dataserver>();
@@ -70,67 +81,99 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
70 81
71 public Dataserver DataserverPlugin 82 public Dataserver DataserverPlugin
72 { 83 {
73 get { return m_Dataserver[m_ScriptEngine]; } 84 get
85 {
86 lock (staticLock)
87 return m_Dataserver[m_ScriptEngine];
88 }
74 } 89 }
75 90
76 public Timer TimerPlugin 91 public Timer TimerPlugin
77 { 92 {
78 get { return m_Timer[m_ScriptEngine]; } 93 get
94 {
95 lock (staticLock)
96 return m_Timer[m_ScriptEngine];
97 }
79 } 98 }
80 99
81 public HttpRequest HttpRequestPlugin 100 public HttpRequest HttpRequestPlugin
82 { 101 {
83 get { return m_HttpRequest[m_ScriptEngine]; } 102 get
103 {
104 lock (staticLock)
105 return m_HttpRequest[m_ScriptEngine];
106 }
84 } 107 }
85 108
86 public Listener ListenerPlugin 109 public Listener ListenerPlugin
87 { 110 {
88 get { return m_Listener[m_ScriptEngine]; } 111 get
112 {
113 lock (staticLock)
114 return m_Listener[m_ScriptEngine];
115 }
89 } 116 }
90 117
91 public SensorRepeat SensorRepeatPlugin 118 public SensorRepeat SensorRepeatPlugin
92 { 119 {
93 get { return m_SensorRepeat[m_ScriptEngine]; } 120 get
121 {
122 lock (staticLock)
123 return m_SensorRepeat[m_ScriptEngine];
124 }
94 } 125 }
95 126
96 public XmlRequest XmlRequestPlugin 127 public XmlRequest XmlRequestPlugin
97 { 128 {
98 get { return m_XmlRequest[m_ScriptEngine]; } 129 get
130 {
131 lock (staticLock)
132 return m_XmlRequest[m_ScriptEngine];
133 }
99 } 134 }
100 135
101 public IScriptEngine[] ScriptEngines 136 public IScriptEngine[] ScriptEngines
102 { 137 {
103 get { return m_ScriptEngines.ToArray(); } 138 get
139 {
140 lock (staticLock)
141 return m_ScriptEngines.ToArray();
142 }
104 } 143 }
105 144
106 public AsyncCommandManager(IScriptEngine _ScriptEngine) 145 public AsyncCommandManager(IScriptEngine _ScriptEngine)
107 { 146 {
108 m_ScriptEngine = _ScriptEngine; 147 m_ScriptEngine = _ScriptEngine;
109 m_Scene = m_ScriptEngine.World; 148
110 149 // If there is more than one scene in the simulator or multiple script engines are used on the same region
111 if (m_Scenes.Count == 0) 150 // then more than one thread could arrive at this block of code simultaneously. However, it cannot be
112 ReadConfig(); 151 // executed concurrently both because concurrent list operations are not thread-safe and because of other
113 152 // race conditions such as the later check of cmdHandlerThread == null.
114 if (!m_Scenes.Contains(m_Scene)) 153 lock (staticLock)
115 m_Scenes.Add(m_Scene); 154 {
116 if (!m_ScriptEngines.Contains(m_ScriptEngine)) 155 if (m_ScriptEngines.Count == 0)
117 m_ScriptEngines.Add(m_ScriptEngine); 156 ReadConfig();
118 157
119 // Create instances of all plugins 158 if (!m_ScriptEngines.Contains(m_ScriptEngine))
120 if (!m_Dataserver.ContainsKey(m_ScriptEngine)) 159 m_ScriptEngines.Add(m_ScriptEngine);
121 m_Dataserver[m_ScriptEngine] = new Dataserver(this); 160
122 if (!m_Timer.ContainsKey(m_ScriptEngine)) 161 // Create instances of all plugins
123 m_Timer[m_ScriptEngine] = new Timer(this); 162 if (!m_Dataserver.ContainsKey(m_ScriptEngine))
124 if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) 163 m_Dataserver[m_ScriptEngine] = new Dataserver(this);
125 m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); 164 if (!m_Timer.ContainsKey(m_ScriptEngine))
126 if (!m_Listener.ContainsKey(m_ScriptEngine)) 165 m_Timer[m_ScriptEngine] = new Timer(this);
127 m_Listener[m_ScriptEngine] = new Listener(this); 166 if (!m_HttpRequest.ContainsKey(m_ScriptEngine))
128 if (!m_SensorRepeat.ContainsKey(m_ScriptEngine)) 167 m_HttpRequest[m_ScriptEngine] = new HttpRequest(this);
129 m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this); 168 if (!m_Listener.ContainsKey(m_ScriptEngine))
130 if (!m_XmlRequest.ContainsKey(m_ScriptEngine)) 169 m_Listener[m_ScriptEngine] = new Listener(this);
131 m_XmlRequest[m_ScriptEngine] = new XmlRequest(this); 170 if (!m_SensorRepeat.ContainsKey(m_ScriptEngine))
132 171 m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this);
133 StartThread(); 172 if (!m_XmlRequest.ContainsKey(m_ScriptEngine))
173 m_XmlRequest[m_ScriptEngine] = new XmlRequest(this);
174
175 StartThread();
176 }
134 } 177 }
135 178
136 private static void StartThread() 179 private static void StartThread()
@@ -179,42 +222,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
179 { 222 {
180 try 223 try
181 { 224 {
182 while (true) 225 Thread.Sleep(cmdHandlerThreadCycleSleepms);
183 {
184 Thread.Sleep(cmdHandlerThreadCycleSleepms);
185 226
186 DoOneCmdHandlerPass(); 227 DoOneCmdHandlerPass();
187 228
188 Watchdog.UpdateThread(); 229 Watchdog.UpdateThread();
189 }
190 } 230 }
191 catch 231 catch (Exception e)
192 { 232 {
233 m_log.Error("[ASYNC COMMAND MANAGER]: Exception in command handler pass: ", e);
193 } 234 }
194 } 235 }
195 } 236 }
196 237
197 private static void DoOneCmdHandlerPass() 238 private static void DoOneCmdHandlerPass()
198 { 239 {
199 // Check HttpRequests 240 lock (staticLock)
200 m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests(); 241 {
242 // Check HttpRequests
243 m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests();
201 244
202 // Check XMLRPCRequests 245 // Check XMLRPCRequests
203 m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests(); 246 m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests();
204 247
205 foreach (IScriptEngine s in m_ScriptEngines) 248 foreach (IScriptEngine s in m_ScriptEngines)
206 { 249 {
207 // Check Listeners 250 // Check Listeners
208 m_Listener[s].CheckListeners(); 251 m_Listener[s].CheckListeners();
209 252
210 // Check timers 253 // Check timers
211 m_Timer[s].CheckTimerEvents(); 254 m_Timer[s].CheckTimerEvents();
212 255
213 // Check Sensors 256 // Check Sensors
214 m_SensorRepeat[s].CheckSenseRepeaterEvents(); 257 m_SensorRepeat[s].CheckSenseRepeaterEvents();
215 258
216 // Check dataserver 259 // Check dataserver
217 m_Dataserver[s].ExpireRequests(); 260 m_Dataserver[s].ExpireRequests();
261 }
218 } 262 }
219 } 263 }
220 264
@@ -226,31 +270,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
226 public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) 270 public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID)
227 { 271 {
228 // Remove a specific script 272 // Remove a specific script
273// m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID);
229 274
230 // Remove dataserver events 275 lock (staticLock)
231 m_Dataserver[engine].RemoveEvents(localID, itemID); 276 {
277 // Remove dataserver events
278 m_Dataserver[engine].RemoveEvents(localID, itemID);
232 279
233 // Remove from: Timers 280 // Remove from: Timers
234 m_Timer[engine].UnSetTimerEvents(localID, itemID); 281 m_Timer[engine].UnSetTimerEvents(localID, itemID);
235 282
236 // Remove from: HttpRequest 283 // Remove from: HttpRequest
237 IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); 284 IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>();
238 if (iHttpReq != null) 285 if (iHttpReq != null)
239 iHttpReq.StopHttpRequest(localID, itemID); 286 iHttpReq.StopHttpRequest(localID, itemID);
240 287
241 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); 288 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
242 if (comms != null) 289 if (comms != null)
243 comms.DeleteListener(itemID); 290 comms.DeleteListener(itemID);
244 291
245 IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); 292 IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>();
246 if (xmlrpc != null) 293 if (xmlrpc != null)
247 { 294 {
248 xmlrpc.DeleteChannels(itemID); 295 xmlrpc.DeleteChannels(itemID);
249 xmlrpc.CancelSRDRequests(itemID); 296 xmlrpc.CancelSRDRequests(itemID);
250 } 297 }
251 298
252 // Remove Sensors 299 // Remove Sensors
253 m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); 300 m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID);
301 }
254 } 302 }
255 303
256 /// <summary> 304 /// <summary>
@@ -260,10 +308,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
260 /// <returns></returns> 308 /// <returns></returns>
261 public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine) 309 public static SensorRepeat GetSensorRepeatPlugin(IScriptEngine engine)
262 { 310 {
263 if (m_SensorRepeat.ContainsKey(engine)) 311 lock (staticLock)
264 return m_SensorRepeat[engine]; 312 {
265 else 313 if (m_SensorRepeat.ContainsKey(engine))
266 return null; 314 return m_SensorRepeat[engine];
315 else
316 return null;
317 }
267 } 318 }
268 319
269 /// <summary> 320 /// <summary>
@@ -273,10 +324,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
273 /// <returns></returns> 324 /// <returns></returns>
274 public static Dataserver GetDataserverPlugin(IScriptEngine engine) 325 public static Dataserver GetDataserverPlugin(IScriptEngine engine)
275 { 326 {
276 if (m_Dataserver.ContainsKey(engine)) 327 lock (staticLock)
277 return m_Dataserver[engine]; 328 {
278 else 329 if (m_Dataserver.ContainsKey(engine))
279 return null; 330 return m_Dataserver[engine];
331 else
332 return null;
333 }
280 } 334 }
281 335
282 /// <summary> 336 /// <summary>
@@ -286,10 +340,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
286 /// <returns></returns> 340 /// <returns></returns>
287 public static Timer GetTimerPlugin(IScriptEngine engine) 341 public static Timer GetTimerPlugin(IScriptEngine engine)
288 { 342 {
289 if (m_Timer.ContainsKey(engine)) 343 lock (staticLock)
290 return m_Timer[engine]; 344 {
291 else 345 if (m_Timer.ContainsKey(engine))
292 return null; 346 return m_Timer[engine];
347 else
348 return null;
349 }
293 } 350 }
294 351
295 /// <summary> 352 /// <summary>
@@ -299,10 +356,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
299 /// <returns></returns> 356 /// <returns></returns>
300 public static Listener GetListenerPlugin(IScriptEngine engine) 357 public static Listener GetListenerPlugin(IScriptEngine engine)
301 { 358 {
302 if (m_Listener.ContainsKey(engine)) 359 lock (staticLock)
303 return m_Listener[engine]; 360 {
304 else 361 if (m_Listener.ContainsKey(engine))
305 return null; 362 return m_Listener[engine];
363 else
364 return null;
365 }
306 } 366 }
307 367
308 public static void StateChange(IScriptEngine engine, uint localID, UUID itemID) 368 public static void StateChange(IScriptEngine engine, uint localID, UUID itemID)
@@ -332,28 +392,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
332 { 392 {
333 List<Object> data = new List<Object>(); 393 List<Object> data = new List<Object>();
334 394
335 Object[] listeners = m_Listener[engine].GetSerializationData(itemID); 395 lock (staticLock)
336 if (listeners.Length > 0)
337 { 396 {
338 data.Add("listener"); 397 Object[] listeners = m_Listener[engine].GetSerializationData(itemID);
339 data.Add(listeners.Length); 398 if (listeners.Length > 0)
340 data.AddRange(listeners); 399 {
341 } 400 data.Add("listener");
401 data.Add(listeners.Length);
402 data.AddRange(listeners);
403 }
342 404
343 Object[] timers=m_Timer[engine].GetSerializationData(itemID); 405 Object[] timers=m_Timer[engine].GetSerializationData(itemID);
344 if (timers.Length > 0) 406 if (timers.Length > 0)
345 { 407 {
346 data.Add("timer"); 408 data.Add("timer");
347 data.Add(timers.Length); 409 data.Add(timers.Length);
348 data.AddRange(timers); 410 data.AddRange(timers);
349 } 411 }
350 412
351 Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); 413 Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID);
352 if (sensors.Length > 0) 414 if (sensors.Length > 0)
353 { 415 {
354 data.Add("sensor"); 416 data.Add("sensor");
355 data.Add(sensors.Length); 417 data.Add(sensors.Length);
356 data.AddRange(sensors); 418 data.AddRange(sensors);
419 }
357 } 420 }
358 421
359 return data.ToArray(); 422 return data.ToArray();
@@ -378,41 +441,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
378 441
379 idx+=len; 442 idx+=len;
380 443
444 lock (staticLock)
445 {
381 switch (type) 446 switch (type)
382 { 447 {
383 case "listener": 448 case "listener":
384 m_Listener[engine].CreateFromData(localID, itemID, 449 m_Listener[engine].CreateFromData(localID, itemID,
385 hostID, item); 450 hostID, item);
386 break; 451 break;
387 case "timer": 452 case "timer":
388 m_Timer[engine].CreateFromData(localID, itemID, 453 m_Timer[engine].CreateFromData(localID, itemID,
389 hostID, item); 454 hostID, item);
390 break; 455 break;
391 case "sensor": 456 case "sensor":
392 m_SensorRepeat[engine].CreateFromData(localID, 457 m_SensorRepeat[engine].CreateFromData(localID,
393 itemID, hostID, item); 458 itemID, hostID, item);
394 break; 459 break;
460 }
395 } 461 }
396 } 462 }
397 } 463 }
398 } 464 }
399
400 #region Check llRemoteData channels
401
402 #endregion
403
404 #region Check llListeners
405
406 #endregion
407
408 /// <summary>
409 /// If set to true then threads and stuff should try to make a graceful exit
410 /// </summary>
411 public bool PleaseShutdown
412 {
413 get { return _PleaseShutdown; }
414 set { _PleaseShutdown = value; }
415 }
416 private bool _PleaseShutdown = false;
417 } 465 }
418} 466}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index e8502ac..f05aaa9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1664,6 +1664,75 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1664 m_host.SetFaceColorAlpha(face, color, null); 1664 m_host.SetFaceColorAlpha(face, color, null);
1665 } 1665 }
1666 1666
1667 /*
1668 public void llSetContentType(LSL_Key id, LSL_Integer type)
1669 {
1670 m_host.AddScriptLPS(1);
1671
1672 if (m_UrlModule == null)
1673 return;
1674
1675 // Make sure the content type is text/plain to start with
1676 m_UrlModule.HttpContentType(new UUID(id), "text/plain");
1677
1678 // Is the object owner online and in the region
1679 ScenePresence agent = World.GetScenePresence(m_host.ParentGroup.OwnerID);
1680 if (agent == null || agent.IsChildAgent)
1681 return; // Fail if the owner is not in the same region
1682
1683 // Is it the embeded browser?
1684 string userAgent = m_UrlModule.GetHttpHeader(new UUID(id), "user-agent");
1685 if (userAgent.IndexOf("SecondLife") < 0)
1686 return; // Not the embedded browser. Is this check good enough?
1687
1688 // Use the IP address of the client and check against the request
1689 // seperate logins from the same IP will allow all of them to get non-text/plain as long
1690 // as the owner is in the region. Same as SL!
1691 string logonFromIPAddress = agent.ControllingClient.RemoteEndPoint.Address.ToString();
1692 string requestFromIPAddress = m_UrlModule.GetHttpHeader(new UUID(id), "remote_addr");
1693 //m_log.Debug("IP from header='" + requestFromIPAddress + "' IP from endpoint='" + logonFromIPAddress + "'");
1694 if (requestFromIPAddress == null || requestFromIPAddress.Trim() == "")
1695 return;
1696 if (logonFromIPAddress == null || logonFromIPAddress.Trim() == "")
1697 return;
1698
1699 // If the request isnt from the same IP address then the request cannot be from the owner
1700 if (!requestFromIPAddress.Trim().Equals(logonFromIPAddress.Trim()))
1701 return;
1702
1703 switch (type)
1704 {
1705 case ScriptBaseClass.CONTENT_TYPE_HTML:
1706 m_UrlModule.HttpContentType(new UUID(id), "text/html");
1707 break;
1708 case ScriptBaseClass.CONTENT_TYPE_XML:
1709 m_UrlModule.HttpContentType(new UUID(id), "application/xml");
1710 break;
1711 case ScriptBaseClass.CONTENT_TYPE_XHTML:
1712 m_UrlModule.HttpContentType(new UUID(id), "application/xhtml+xml");
1713 break;
1714 case ScriptBaseClass.CONTENT_TYPE_ATOM:
1715 m_UrlModule.HttpContentType(new UUID(id), "application/atom+xml");
1716 break;
1717 case ScriptBaseClass.CONTENT_TYPE_JSON:
1718 m_UrlModule.HttpContentType(new UUID(id), "application/json");
1719 break;
1720 case ScriptBaseClass.CONTENT_TYPE_LLSD:
1721 m_UrlModule.HttpContentType(new UUID(id), "application/llsd+xml");
1722 break;
1723 case ScriptBaseClass.CONTENT_TYPE_FORM:
1724 m_UrlModule.HttpContentType(new UUID(id), "application/x-www-form-urlencoded");
1725 break;
1726 case ScriptBaseClass.CONTENT_TYPE_RSS:
1727 m_UrlModule.HttpContentType(new UUID(id), "application/rss+xml");
1728 break;
1729 default:
1730 m_UrlModule.HttpContentType(new UUID(id), "text/plain");
1731 break;
1732 }
1733 }
1734 */
1735
1667 public void SetTexGen(SceneObjectPart part, int face,int style) 1736 public void SetTexGen(SceneObjectPart part, int face,int style)
1668 { 1737 {
1669 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 1738 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
@@ -2772,9 +2841,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2772 // send the sound, once, to all clients in range 2841 // send the sound, once, to all clients in range
2773 if (m_SoundModule != null) 2842 if (m_SoundModule != null)
2774 { 2843 {
2775 m_SoundModule.SendSound(m_host.UUID, 2844 m_SoundModule.SendSound(
2776 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0, 2845 m_host.UUID,
2777 0, false, false); 2846 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound),
2847 volume, false, m_host.SoundQueueing ? (byte)SoundFlags.Queue : (byte)SoundFlags.None,
2848 0, false, false);
2778 } 2849 }
2779 } 2850 }
2780 2851
@@ -5108,6 +5179,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5108 5179
5109 s = Math.Cos(angle * 0.5); 5180 s = Math.Cos(angle * 0.5);
5110 t = Math.Sin(angle * 0.5); // temp value to avoid 2 more sin() calcs 5181 t = Math.Sin(angle * 0.5); // temp value to avoid 2 more sin() calcs
5182 axis = LSL_Vector.Norm(axis);
5111 x = axis.x * t; 5183 x = axis.x * t;
5112 y = axis.y * t; 5184 y = axis.y * t;
5113 z = axis.z * t; 5185 z = axis.z * t;
@@ -5115,41 +5187,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5115 return new LSL_Rotation(x,y,z,s); 5187 return new LSL_Rotation(x,y,z,s);
5116 } 5188 }
5117 5189
5118 5190 /// <summary>
5119 // Xantor 29/apr/2008 5191 /// Returns the axis of rotation for a quaternion
5120 // converts a Quaternion to X,Y,Z axis rotations 5192 /// </summary>
5193 /// <returns></returns>
5194 /// <param name='rot'></param>
5121 public LSL_Vector llRot2Axis(LSL_Rotation rot) 5195 public LSL_Vector llRot2Axis(LSL_Rotation rot)
5122 { 5196 {
5123 m_host.AddScriptLPS(1); 5197 m_host.AddScriptLPS(1);
5124 double x,y,z;
5125 5198
5126 if (rot.s > 1) // normalization needed 5199 if (Math.Abs(rot.s) > 1) // normalization needed
5127 { 5200 rot.Normalize();
5128 double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y +
5129 rot.z * rot.z + rot.s * rot.s);
5130
5131 rot.x /= length;
5132 rot.y /= length;
5133 rot.z /= length;
5134 rot.s /= length;
5135 5201
5136 }
5137
5138 // double angle = 2 * Math.Acos(rot.s);
5139 double s = Math.Sqrt(1 - rot.s * rot.s); 5202 double s = Math.Sqrt(1 - rot.s * rot.s);
5140 if (s < 0.001) 5203 if (s < 0.001)
5141 { 5204 {
5142 x = 1; 5205 return new LSL_Vector(1, 0, 0);
5143 y = z = 0;
5144 } 5206 }
5145 else 5207 else
5146 { 5208 {
5147 x = rot.x / s; // normalise axis 5209 double invS = 1.0 / s;
5148 y = rot.y / s; 5210 if (rot.s < 0) invS = -invS;
5149 z = rot.z / s; 5211 return new LSL_Vector(rot.x * invS, rot.y * invS, rot.z * invS);
5150 } 5212 }
5151
5152 return new LSL_Vector(x,y,z);
5153 } 5213 }
5154 5214
5155 5215
@@ -5158,18 +5218,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5158 { 5218 {
5159 m_host.AddScriptLPS(1); 5219 m_host.AddScriptLPS(1);
5160 5220
5161 if (rot.s > 1) // normalization needed 5221 if (Math.Abs(rot.s) > 1) // normalization needed
5162 { 5222 rot.Normalize();
5163 double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y +
5164 rot.z * rot.z + rot.s * rot.s);
5165
5166 rot.x /= length;
5167 rot.y /= length;
5168 rot.z /= length;
5169 rot.s /= length;
5170 }
5171 5223
5172 double angle = 2 * Math.Acos(rot.s); 5224 double angle = 2 * Math.Acos(rot.s);
5225 if (angle > Math.PI)
5226 angle = 2 * Math.PI - angle;
5173 5227
5174 return angle; 5228 return angle;
5175 } 5229 }
@@ -8255,7 +8309,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8255 return null; 8309 return null;
8256 8310
8257 string ph = rules.Data[idx++].ToString(); 8311 string ph = rules.Data[idx++].ToString();
8258 parentgrp.ScriptSetPhantomStatus(ph.Equals("1")); 8312 part.ParentGroup.ScriptSetPhantomStatus(ph.Equals("1"));
8259 8313
8260 break; 8314 break;
8261 8315
@@ -8308,7 +8362,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8308 return null; 8362 return null;
8309 string temp = rules.Data[idx++].ToString(); 8363 string temp = rules.Data[idx++].ToString();
8310 8364
8311 parentgrp.ScriptSetTemporaryStatus(temp.Equals("1")); 8365 part.ParentGroup.ScriptSetTemporaryStatus(temp.Equals("1"));
8312 8366
8313 break; 8367 break;
8314 8368
@@ -12673,6 +12727,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12673 public void llSetSoundQueueing(int queue) 12727 public void llSetSoundQueueing(int queue)
12674 { 12728 {
12675 m_host.AddScriptLPS(1); 12729 m_host.AddScriptLPS(1);
12730
12731 if (m_SoundModule != null)
12732 m_SoundModule.SetSoundQueueing(m_host.UUID, queue == ScriptBaseClass.TRUE.value);
12676 } 12733 }
12677 12734
12678 public void llCollisionSprite(string impact_sprite) 12735 public void llCollisionSprite(string impact_sprite)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index bd776b6..edcdfbc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -319,7 +319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
319 319
320 object[] convertedParms = new object[parms.Length]; 320 object[] convertedParms = new object[parms.Length];
321 for (int i = 0; i < parms.Length; i++) 321 for (int i = 0; i < parms.Length; i++)
322 convertedParms[i] = ConvertFromLSL(parms[i],signature[i], fname); 322 convertedParms[i] = ConvertFromLSL(parms[i], signature[i], fname);
323 323
324 // now call the function, the contract with the function is that it will always return 324 // now call the function, the contract with the function is that it will always return
325 // non-null but don't trust it completely 325 // non-null but don't trust it completely
@@ -448,7 +448,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
448 } 448 }
449 } 449 }
450 450
451 MODError(String.Format("{1}: parameter type mismatch; expecting {0}",type.Name, fname)); 451 MODError(String.Format("{0}: parameter type mismatch; expecting {1}, type(parm)={2}", fname, type.Name, lslparm.GetType()));
452 return null; 452 return null;
453 } 453 }
454 454
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index a47e452..44a7c14 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -353,6 +353,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
353 // Position of a sensor in a child prim attached to an avatar 353 // Position of a sensor in a child prim attached to an avatar
354 // will be still wrong. 354 // will be still wrong.
355 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 355 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
356
357 // Don't proceed if the avatar for this attachment has since been removed from the scene.
358 if (avatar == null)
359 return sensedEntities;
360
356 fromRegionPos = avatar.AbsolutePosition; 361 fromRegionPos = avatar.AbsolutePosition;
357 q = avatar.Rotation; 362 q = avatar.Rotation;
358 } 363 }
@@ -483,6 +488,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
483 // Position of a sensor in a child prim attached to an avatar 488 // Position of a sensor in a child prim attached to an avatar
484 // will be still wrong. 489 // will be still wrong.
485 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 490 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
491
492 // Don't proceed if the avatar for this attachment has since been removed from the scene.
486 if (avatar == null) 493 if (avatar == null)
487 return sensedEntities; 494 return sensedEntities;
488 fromRegionPos = avatar.AbsolutePosition; 495 fromRegionPos = avatar.AbsolutePosition;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index daf89e5..d211a2b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -332,7 +332,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
332 void llSensorRemove(); 332 void llSensorRemove();
333 void llSensorRepeat(string name, string id, int type, double range, double arc, double rate); 333 void llSensorRepeat(string name, string id, int type, double range, double arc, double rate);
334 void llSetAlpha(double alpha, int face); 334 void llSetAlpha(double alpha, int face);
335 void llSetAngularVelocity(LSL_Vector angvelocity, int local);
336 void llSetBuoyancy(double buoyancy); 335 void llSetBuoyancy(double buoyancy);
337 void llSetCameraAtOffset(LSL_Vector offset); 336 void llSetCameraAtOffset(LSL_Vector offset);
338 void llSetCameraEyeOffset(LSL_Vector offset); 337 void llSetCameraEyeOffset(LSL_Vector offset);
@@ -340,9 +339,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
340 void llSetCameraParams(LSL_List rules); 339 void llSetCameraParams(LSL_List rules);
341 void llSetClickAction(int action); 340 void llSetClickAction(int action);
342 void llSetColor(LSL_Vector color, int face); 341 void llSetColor(LSL_Vector color, int face);
342 void llSetContentType(LSL_Key id, LSL_Integer type);
343 void llSetDamage(double damage); 343 void llSetDamage(double damage);
344 void llSetForce(LSL_Vector force, int local); 344 void llSetForce(LSL_Vector force, int local);
345 void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local); 345 void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local);
346 void llSetAngularVelocity(LSL_Vector angularVelocity, int local);
346 void llSetHoverHeight(double height, int water, double tau); 347 void llSetHoverHeight(double height, int water, double tau);
347 void llSetInventoryPermMask(string item, int mask, int value); 348 void llSetInventoryPermMask(string item, int mask, int value);
348 void llSetLinkAlpha(int linknumber, double alpha, int face); 349 void llSetLinkAlpha(int linknumber, double alpha, int face);
@@ -383,7 +384,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
383 void llSetVehicleRotationParam(int param, LSL_Rotation rot); 384 void llSetVehicleRotationParam(int param, LSL_Rotation rot);
384 void llSetVehicleType(int type); 385 void llSetVehicleType(int type);
385 void llSetVehicleVectorParam(int param, LSL_Vector vec); 386 void llSetVehicleVectorParam(int param, LSL_Vector vec);
386 void llSetVelocity(LSL_Vector velocity, int local);
387 void llShout(int channelID, string text); 387 void llShout(int channelID, string text);
388 LSL_Float llSin(double f); 388 LSL_Float llSin(double f);
389 void llSitTarget(LSL_Vector offset, LSL_Rotation rot); 389 void llSitTarget(LSL_Vector offset, LSL_Rotation rot);
@@ -434,6 +434,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
434 void llSetKeyframedMotion(LSL_List frames, LSL_List options); 434 void llSetKeyframedMotion(LSL_List frames, LSL_List options);
435 LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); 435 LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
436 LSL_List llGetPhysicsMaterial(); 436 LSL_List llGetPhysicsMaterial();
437 void llSetContentType(LSL_Key id, LSL_Integer content_type);
438 } 437 }
439} 438}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 6efa73f..15b21ac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -361,6 +361,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
361 public const int HTTP_CUSTOM_HEADER = 5; 361 public const int HTTP_CUSTOM_HEADER = 5;
362 public const int HTTP_PRAGMA_NO_CACHE = 6; 362 public const int HTTP_PRAGMA_NO_CACHE = 6;
363 363
364 // llSetContentType
365 public const int CONTENT_TYPE_TEXT = 0; //text/plain
366 public const int CONTENT_TYPE_HTML = 1; //text/html
367 public const int CONTENT_TYPE_XML = 2; //application/xml
368 public const int CONTENT_TYPE_XHTML = 3; //application/xhtml+xml
369 public const int CONTENT_TYPE_ATOM = 4; //application/atom+xml
370 public const int CONTENT_TYPE_JSON = 5; //application/json
371 public const int CONTENT_TYPE_LLSD = 6; //application/llsd+xml
372 public const int CONTENT_TYPE_FORM = 7; //application/x-www-form-urlencoded
373 public const int CONTENT_TYPE_RSS = 8; //application/rss+xml
374
364 public const int PRIM_MATERIAL = 2; 375 public const int PRIM_MATERIAL = 2;
365 public const int PRIM_PHYSICS = 3; 376 public const int PRIM_PHYSICS = 3;
366 public const int PRIM_TEMP_ON_REZ = 4; 377 public const int PRIM_TEMP_ON_REZ = 4;
@@ -772,8 +783,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
772 /// process message parameter as regex 783 /// process message parameter as regex
773 /// </summary> 784 /// </summary>
774 public const int OS_LISTEN_REGEX_MESSAGE = 0x2; 785 public const int OS_LISTEN_REGEX_MESSAGE = 0x2;
775
776 public const int CONTENT_TYPE_TEXT = 0;
777 public const int CONTENT_TYPE_HTML = 1;
778 } 786 }
779} 787}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 6f3677c..4fc8d65 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -1495,11 +1495,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1495 m_LSL_Functions.llSetAlpha(alpha, face); 1495 m_LSL_Functions.llSetAlpha(alpha, face);
1496 } 1496 }
1497 1497
1498 public void llSetAngularVelocity(LSL_Vector angvelocity, int local)
1499 {
1500 m_LSL_Functions.llSetAngularVelocity(angvelocity, local);
1501 }
1502
1503 public void llSetBuoyancy(double buoyancy) 1498 public void llSetBuoyancy(double buoyancy)
1504 { 1499 {
1505 m_LSL_Functions.llSetBuoyancy(buoyancy); 1500 m_LSL_Functions.llSetBuoyancy(buoyancy);
@@ -1535,6 +1530,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1535 m_LSL_Functions.llSetColor(color, face); 1530 m_LSL_Functions.llSetColor(color, face);
1536 } 1531 }
1537 1532
1533 public void llSetContentType(LSL_Key id, LSL_Integer type)
1534 {
1535 m_LSL_Functions.llSetContentType(id, type);
1536 }
1537
1538 public void llSetDamage(double damage) 1538 public void llSetDamage(double damage)
1539 { 1539 {
1540 m_LSL_Functions.llSetDamage(damage); 1540 m_LSL_Functions.llSetDamage(damage);
@@ -1550,6 +1550,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1550 m_LSL_Functions.llSetForceAndTorque(force, torque, local); 1550 m_LSL_Functions.llSetForceAndTorque(force, torque, local);
1551 } 1551 }
1552 1552
1553 public void llSetAngularVelocity(LSL_Vector force, int local)
1554 {
1555 m_LSL_Functions.llSetAngularVelocity(force, local);
1556 }
1557
1553 public void llSetHoverHeight(double height, int water, double tau) 1558 public void llSetHoverHeight(double height, int water, double tau)
1554 { 1559 {
1555 m_LSL_Functions.llSetHoverHeight(height, water, tau); 1560 m_LSL_Functions.llSetHoverHeight(height, water, tau);
@@ -1740,11 +1745,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1740 m_LSL_Functions.llSetVehicleVectorParam(param, vec); 1745 m_LSL_Functions.llSetVehicleVectorParam(param, vec);
1741 } 1746 }
1742 1747
1743 public void llSetVelocity(LSL_Vector velocity, int local)
1744 {
1745 m_LSL_Functions.llSetVelocity(velocity, local);
1746 }
1747
1748 public void llShout(int channelID, string text) 1748 public void llShout(int channelID, string text)
1749 { 1749 {
1750 m_LSL_Functions.llShout(channelID, text); 1750 m_LSL_Functions.llShout(channelID, text);
@@ -2014,10 +2014,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
2014 { 2014 {
2015 return m_LSL_Functions.llGetPhysicsMaterial(); 2015 return m_LSL_Functions.llGetPhysicsMaterial();
2016 } 2016 }
2017
2018 public void llSetContentType(LSL_Key id, LSL_Integer content_type)
2019 {
2020 m_LSL_Functions.llSetContentType(id, content_type);
2021 }
2022 } 2017 }
2023} 2018}
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
index 9e32f40..6aa717d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
@@ -937,7 +937,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
937 { 937 {
938 string retval = null; 938 string retval = null;
939 if (value is int) 939 if (value is int)
940 retval = ((int)value).ToString(); 940 retval = String.Format("new LSL_Types.LSLInteger({0})",((int)value).ToString());
941 else if (value is float) 941 else if (value is float)
942 retval = String.Format("new LSL_Types.LSLFloat({0})",((float)value).ToString()); 942 retval = String.Format("new LSL_Types.LSLFloat({0})",((float)value).ToString());
943 else if (value is string) 943 else if (value is string)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index a2ac9c5..2427cbe 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -243,7 +243,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
243 if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") 243 if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op")
244 { 244 {
245 m_coopTermination = true; 245 m_coopTermination = true;
246 m_coopSleepHandle = new AutoResetEvent(false); 246 m_coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset);
247 } 247 }
248 } 248 }
249 249
@@ -529,8 +529,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
529 { 529 {
530 File.Delete(savedState); 530 File.Delete(savedState);
531 } 531 }
532 catch(Exception) 532 catch (Exception e)
533 { 533 {
534 m_log.Warn(
535 string.Format(
536 "[SCRIPT INSTANCE]: Could not delete script state {0} for script {1} (id {2}) in part {3} (id {4}) in object {5} in {6}. Exception ",
537 savedState, ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name),
538 e);
534 } 539 }
535 } 540 }
536 541
@@ -568,9 +573,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
568 573
569 public bool Stop(int timeout) 574 public bool Stop(int timeout)
570 { 575 {
571// m_log.DebugFormat( 576 if (DebugLevel >= 1)
572// "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", 577 m_log.DebugFormat(
573// ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); 578 "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}",
579 ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks);
574 580
575 IScriptWorkItem workItem; 581 IScriptWorkItem workItem;
576 582
@@ -1216,4 +1222,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1216 Suspended = false; 1222 Suspended = false;
1217 } 1223 }
1218 } 1224 }
1219} 1225
1226 /// <summary>
1227 /// Xengine event wait handle.
1228 /// </summary>
1229 /// <remarks>
1230 /// This class exists becase XEngineScriptBase gets a reference to this wait handle. We need to make sure that
1231 /// when scripts are running in different AppDomains the lease does not expire.
1232 /// FIXME: Like LSL_Api, etc., this effectively leaks memory since the GC will never collect it. To avoid this,
1233 /// proper remoting sponsorship needs to be implemented across the board.
1234 /// </remarks>
1235 public class XEngineEventWaitHandle : EventWaitHandle
1236 {
1237 public XEngineEventWaitHandle(bool initialState, EventResetMode mode) : base(initialState, mode) {}
1238
1239 public override Object InitializeLifetimeService()
1240 {
1241 return null;
1242 }
1243 }
1244} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index b524a18..4ba0e64 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -371,6 +371,31 @@ namespace OpenSim.Region.ScriptEngine.Shared
371 371
372 #endregion 372 #endregion
373 373
374 #region Methods
375 public Quaternion Normalize()
376 {
377 double length = Math.Sqrt(x * x + y * y + z * z + s * s);
378 if (length < float.Epsilon)
379 {
380 x = 0;
381 y = 0;
382 z = 0;
383 s = 1;
384 }
385 else
386 {
387
388 double invLength = 1.0 / length;
389 x *= invLength;
390 y *= invLength;
391 z *= invLength;
392 s *= invLength;
393 }
394
395 return this;
396 }
397 #endregion
398
374 #region Overriders 399 #region Overriders
375 400
376 public override int GetHashCode() 401 public override int GetHashCode()
@@ -546,21 +571,33 @@ namespace OpenSim.Region.ScriptEngine.Shared
546 571
547 set {m_data = value; } 572 set {m_data = value; }
548 } 573 }
549 // Function to obtain LSL type from an index. This is needed 574
550 // because LSL lists allow for multiple types, and safely 575 /// <summary>
551 // iterating in them requires a type check. 576 /// Obtain LSL type from an index.
577 /// </summary>
578 /// <remarks>
579 /// This is needed because LSL lists allow for multiple types, and safely
580 /// iterating in them requires a type check.
581 /// </remarks>
582 /// <returns></returns>
583 /// <param name='itemIndex'></param>
552 public Type GetLSLListItemType(int itemIndex) 584 public Type GetLSLListItemType(int itemIndex)
553 { 585 {
554 return m_data[itemIndex].GetType(); 586 return m_data[itemIndex].GetType();
555 } 587 }
556 588
557 // Member functions to obtain item as specific types. 589 /// <summary>
558 // For cases where implicit conversions would apply if items 590 /// Obtain float from an index.
559 // were not in a list (e.g. integer to float, but not float 591 /// </summary>
560 // to integer) functions check for alternate types so as to 592 /// <remarks>
561 // down-cast from Object to the correct type. 593 /// For cases where implicit conversions would apply if items
562 // Note: no checks for item index being valid are performed 594 /// were not in a list (e.g. integer to float, but not float
563 595 /// to integer) functions check for alternate types so as to
596 /// down-cast from Object to the correct type.
597 /// Note: no checks for item index being valid are performed
598 /// </remarks>
599 /// <returns></returns>
600 /// <param name='itemIndex'></param>
564 public LSL_Types.LSLFloat GetLSLFloatItem(int itemIndex) 601 public LSL_Types.LSLFloat GetLSLFloatItem(int itemIndex)
565 { 602 {
566 if (m_data[itemIndex] is LSL_Types.LSLInteger) 603 if (m_data[itemIndex] is LSL_Types.LSLInteger)
@@ -591,26 +628,14 @@ namespace OpenSim.Region.ScriptEngine.Shared
591 628
592 public LSL_Types.LSLString GetLSLStringItem(int itemIndex) 629 public LSL_Types.LSLString GetLSLStringItem(int itemIndex)
593 { 630 {
594 if (m_data[itemIndex] is LSL_Types.key) 631 if (m_data[itemIndex] is LSL_Types.key)
595 { 632 {
596 return (LSL_Types.key)m_data[itemIndex]; 633 return (LSL_Types.key)m_data[itemIndex];
597 } 634 }
598 else if (m_data[itemIndex] is String) 635 else
599 { 636 {
600 return new LSL_Types.LSLString((string)m_data[itemIndex]); 637 return new LSL_Types.LSLString(m_data[itemIndex].ToString());
601 } 638 }
602 else if (m_data[itemIndex] is LSL_Types.LSLFloat)
603 {
604 return new LSL_Types.LSLString((LSLFloat)m_data[itemIndex]);
605 }
606 else if (m_data[itemIndex] is LSL_Types.LSLInteger)
607 {
608 return new LSL_Types.LSLString((LSLInteger)m_data[itemIndex]);
609 }
610 else
611 {
612 return (LSL_Types.LSLString)m_data[itemIndex];
613 }
614 } 639 }
615 640
616 public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex) 641 public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 74f010e..495e684 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -180,6 +180,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
180 public void TestOsNpcLoadAppearance() 180 public void TestOsNpcLoadAppearance()
181 { 181 {
182 TestHelpers.InMethod(); 182 TestHelpers.InMethod();
183 //TestHelpers.EnableLogging();
183 184
184 // Store an avatar with a different height from default in a notecard. 185 // Store an avatar with a different height from default in a notecard.
185 UUID userId = TestHelpers.ParseTail(0x1); 186 UUID userId = TestHelpers.ParseTail(0x1);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 04a4e53..27d7674 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -551,7 +551,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
551 /// <param name="instance"></param> 551 /// <param name="instance"></param>
552 /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param> 552 /// <param name="keySelector">Basis on which to sort output. Can be null if no sort needs to take place</param>
553 private void HandleScriptsAction<TKey>( 553 private void HandleScriptsAction<TKey>(
554 string[] cmdparams, Action<IScriptInstance> action, Func<IScriptInstance, TKey> keySelector) 554 string[] cmdparams, Action<IScriptInstance> action, System.Func<IScriptInstance, TKey> keySelector)
555 { 555 {
556 if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) 556 if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene))
557 return; 557 return;
@@ -609,7 +609,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
609 if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) 609 if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene))
610 return; 610 return;
611 611
612 MainConsole.Instance.OutputFormat(GetStatusReport()); 612 MainConsole.Instance.Output(GetStatusReport());
613 } 613 }
614 614
615 public string GetStatusReport() 615 public string GetStatusReport()
@@ -708,7 +708,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
708 sb.AppendFormat("Containing part UUID: {0}\n", instance.ObjectID); 708 sb.AppendFormat("Containing part UUID: {0}\n", instance.ObjectID);
709 sb.AppendFormat("Position : {0}\n", sop.AbsolutePosition); 709 sb.AppendFormat("Position : {0}\n", sop.AbsolutePosition);
710 710
711 MainConsole.Instance.OutputFormat(sb.ToString()); 711 MainConsole.Instance.Output(sb.ToString());
712 } 712 }
713 713
714 private void HandleSuspendScript(IScriptInstance instance) 714 private void HandleSuspendScript(IScriptInstance instance)
@@ -1633,7 +1633,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1633 startInfo.MaxWorkerThreads = maxThreads; 1633 startInfo.MaxWorkerThreads = maxThreads;
1634 startInfo.MinWorkerThreads = minThreads; 1634 startInfo.MinWorkerThreads = minThreads;
1635 startInfo.ThreadPriority = threadPriority;; 1635 startInfo.ThreadPriority = threadPriority;;
1636 startInfo.StackSize = stackSize; 1636 startInfo.MaxStackSize = stackSize;
1637 startInfo.StartSuspended = true; 1637 startInfo.StartSuspended = true;
1638 1638
1639 m_ThreadPool = new SmartThreadPool(startInfo); 1639 m_ThreadPool = new SmartThreadPool(startInfo);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
index 8dd7677..9d9dee1 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs
@@ -52,16 +52,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
52 return wr.Cancel(); 52 return wr.Cancel();
53 } 53 }
54 54
55 public void Abort() 55 public bool Abort()
56 { 56 {
57 wr.Abort(); 57 return wr.Cancel(true);
58 } 58 }
59 59
60 public bool Wait(int t) 60 public bool Wait(int t)
61 { 61 {
62 // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the 62 // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the
63 // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an 63 // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an
64 // int (32-bit) we can end up with bad values. This occurs on Windows though curious not on Mono 2.10.8 64 // int (32-bit) we can end up with bad values. This occurs on Windows though curiously not on Mono 2.10.8
65 // (or very likely other versions of Mono at least up until 3.0.3). 65 // (or very likely other versions of Mono at least up until 3.0.3).
66 return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); 66 return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false);
67 } 67 }
diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs
index 210a314..08ba50d 100644
--- a/OpenSim/Server/Base/ServerUtils.cs
+++ b/OpenSim/Server/Base/ServerUtils.cs
@@ -286,6 +286,7 @@ namespace OpenSim.Server.Base
286 e.InnerException == null ? e.Message : e.InnerException.Message, 286 e.InnerException == null ? e.Message : e.InnerException.Message,
287 e.StackTrace); 287 e.StackTrace);
288 } 288 }
289 m_log.ErrorFormat("[SERVER UTILS]: Error loading plugin {0}: {1} args.Length {2}", dllName, e.Message, args.Length);
289 return null; 290 return null;
290 } 291 }
291 292
diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs
index 7c8e6b7..667cef8 100644
--- a/OpenSim/Server/Base/ServicesServerBase.cs
+++ b/OpenSim/Server/Base/ServicesServerBase.cs
@@ -34,6 +34,7 @@ using System.Text;
34using System.Xml; 34using System.Xml;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Console; 36using OpenSim.Framework.Console;
37using OpenSim.Framework.Monitoring;
37using OpenSim.Framework.Servers; 38using OpenSim.Framework.Servers;
38using log4net; 39using log4net;
39using log4net.Config; 40using log4net.Config;
@@ -171,11 +172,6 @@ namespace OpenSim.Server.Base
171 172
172 m_console = MainConsole.Instance; 173 m_console = MainConsole.Instance;
173 174
174 // Configure the appenders for log4net
175 //
176 OpenSimAppender consoleAppender = null;
177 FileAppender fileAppender = null;
178
179 if (logConfig != null) 175 if (logConfig != null)
180 { 176 {
181 FileInfo cfg = new FileInfo(logConfig); 177 FileInfo cfg = new FileInfo(logConfig);
@@ -195,16 +191,7 @@ namespace OpenSim.Server.Base
195 } 191 }
196 192
197 RegisterCommonCommands(); 193 RegisterCommonCommands();
198 194 RegisterCommonComponents(Config);
199 // Register the quit command
200 //
201 MainConsole.Instance.Commands.AddCommand("General", false, "quit",
202 "quit",
203 "Quit the application", HandleQuit);
204
205 MainConsole.Instance.Commands.AddCommand("General", false, "shutdown",
206 "shutdown",
207 "Quit the application", HandleQuit);
208 195
209 // Allow derived classes to perform initialization that 196 // Allow derived classes to perform initialization that
210 // needs to be done after the console has opened 197 // needs to be done after the console has opened
@@ -219,6 +206,9 @@ namespace OpenSim.Server.Base
219 206
220 public virtual int Run() 207 public virtual int Run()
221 { 208 {
209 Watchdog.Enabled = true;
210 MemoryWatchdog.Enabled = true;
211
222 while (m_Running) 212 while (m_Running)
223 { 213 {
224 try 214 try
@@ -236,11 +226,12 @@ namespace OpenSim.Server.Base
236 return 0; 226 return 0;
237 } 227 }
238 228
239 protected virtual void HandleQuit(string module, string[] args) 229 protected override void ShutdownSpecific()
240 { 230 {
241 m_Running = false; 231 m_Running = false;
242 m_log.Info("[CONSOLE] Quitting"); 232 m_log.Info("[CONSOLE] Quitting");
243 233
234 base.ShutdownSpecific();
244 } 235 }
245 236
246 protected virtual void ReadConfig() 237 protected virtual void ReadConfig()
@@ -251,4 +242,4 @@ namespace OpenSim.Server.Base
251 { 242 {
252 } 243 }
253 } 244 }
254} 245} \ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
index ff45d94..cc4325a 100644
--- a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
+++ b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
@@ -119,16 +119,14 @@ namespace OpenSim.Server.Handlers.Asset
119 119
120 if (asset == null || asset.Data.Length == 0) 120 if (asset == null || asset.Data.Length == 0)
121 { 121 {
122 MainConsole.Instance.Output("Asset not found"); 122 MainConsole.Instance.OutputFormat("Could not find asset with ID {0}", args[2]);
123 return; 123 return;
124 } 124 }
125 125
126 m_AssetService.Delete(args[2]); 126 if (!m_AssetService.Delete(asset.ID))
127 127 MainConsole.Instance.OutputFormat("ERROR: Could not delete asset {0} {1}", asset.ID, asset.Name);
128 //MainConsole.Instance.Output("Asset deleted"); 128 else
129 // TODO: Implement this 129 MainConsole.Instance.OutputFormat("Deleted asset {0} {1}", asset.ID, asset.Name);
130
131 MainConsole.Instance.Output("Asset deletion not supported by database");
132 } 130 }
133 131
134 void HandleDumpAsset(string module, string[] args) 132 void HandleDumpAsset(string module, string[] args)
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerDeleteHandler.cs b/OpenSim/Server/Handlers/Asset/AssetServerDeleteHandler.cs
index 986394b..941b97d 100644
--- a/OpenSim/Server/Handlers/Asset/AssetServerDeleteHandler.cs
+++ b/OpenSim/Server/Handlers/Asset/AssetServerDeleteHandler.cs
@@ -70,7 +70,7 @@ namespace OpenSim.Server.Handlers.Asset
70 m_allowedTypes = allowedTypes; 70 m_allowedTypes = allowedTypes;
71 } 71 }
72 72
73 public override byte[] Handle(string path, Stream request, 73 protected override byte[] ProcessRequest(string path, Stream request,
74 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 74 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
75 { 75 {
76 bool result = false; 76 bool result = false;
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs b/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs
index 8f7412b..8b23a83 100644
--- a/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs
+++ b/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Server.Handlers.Asset
54 m_AssetService = service; 54 m_AssetService = service;
55 } 55 }
56 56
57 public override byte[] Handle(string path, Stream request, 57 protected override byte[] ProcessRequest(string path, Stream request,
58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
59 { 59 {
60 byte[] result = new byte[0]; 60 byte[] result = new byte[0];
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerPostHandler.cs b/OpenSim/Server/Handlers/Asset/AssetServerPostHandler.cs
index a006fa8..8eebc61 100644
--- a/OpenSim/Server/Handlers/Asset/AssetServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Asset/AssetServerPostHandler.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Server.Handlers.Asset
54 m_AssetService = service; 54 m_AssetService = service;
55 } 55 }
56 56
57 public override byte[] Handle(string path, Stream request, 57 protected override byte[] ProcessRequest(string path, Stream request,
58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
59 { 59 {
60 AssetBase asset; 60 AssetBase asset;
diff --git a/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs b/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs
index 6b93cd9..16e011a 100644
--- a/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Authentication/AuthenticationServerPostHandler.cs
@@ -70,7 +70,7 @@ namespace OpenSim.Server.Handlers.Authentication
70 } 70 }
71 } 71 }
72 72
73 public override byte[] Handle(string path, Stream request, 73 protected override byte[] ProcessRequest(string path, Stream request,
74 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 74 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
75 { 75 {
76 string[] p = SplitParams(path); 76 string[] p = SplitParams(path);
diff --git a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs
index 18cef15..66a26fc 100644
--- a/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs
+++ b/OpenSim/Server/Handlers/Authentication/OpenIdServerHandler.cs
@@ -147,7 +147,7 @@ namespace OpenSim.Server.Handlers.Authentication
147 #endregion 147 #endregion
148 } 148 }
149 149
150 public class OpenIdStreamHandler : IStreamHandler 150 public class OpenIdStreamHandler : BaseOutputStreamHandler
151 { 151 {
152 #region HTML 152 #region HTML
153 153
@@ -191,42 +191,34 @@ For more information, see <a href='http://openid.net/'>http://openid.net/</a>.
191 191
192 #endregion HTML 192 #endregion HTML
193 193
194 public string Name { get { return "OpenId"; } }
195 public string Description { get { return null; } }
196 public string ContentType { get { return m_contentType; } }
197 public string HttpMethod { get { return m_httpMethod; } }
198 public string Path { get { return m_path; } }
199
200 string m_contentType;
201 string m_httpMethod;
202 string m_path;
203 IAuthenticationService m_authenticationService; 194 IAuthenticationService m_authenticationService;
204 IUserAccountService m_userAccountService; 195 IUserAccountService m_userAccountService;
205 ProviderMemoryStore m_openidStore = new ProviderMemoryStore(); 196 ProviderMemoryStore m_openidStore = new ProviderMemoryStore();
206 197
198 public override string ContentType { get { return "text/html"; } }
199
207 /// <summary> 200 /// <summary>
208 /// Constructor 201 /// Constructor
209 /// </summary> 202 /// </summary>
210 public OpenIdStreamHandler(string httpMethod, string path, IUserAccountService userService, IAuthenticationService authService) 203 public OpenIdStreamHandler(
204 string httpMethod, string path, IUserAccountService userService, IAuthenticationService authService)
205 : base(httpMethod, path, "OpenId", "OpenID stream handler")
211 { 206 {
212 m_authenticationService = authService; 207 m_authenticationService = authService;
213 m_userAccountService = userService; 208 m_userAccountService = userService;
214 m_httpMethod = httpMethod;
215 m_path = path;
216
217 m_contentType = "text/html";
218 } 209 }
219 210
220 /// <summary> 211 /// <summary>
221 /// Handles all GET and POST requests for OpenID identifier pages and endpoint 212 /// Handles all GET and POST requests for OpenID identifier pages and endpoint
222 /// server communication 213 /// server communication
223 /// </summary> 214 /// </summary>
224 public void Handle(string path, Stream request, Stream response, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 215 protected override void ProcessRequest(
216 string path, Stream request, Stream response, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
225 { 217 {
226 Uri providerEndpoint = new Uri(String.Format("{0}://{1}{2}", httpRequest.Url.Scheme, httpRequest.Url.Authority, httpRequest.Url.AbsolutePath)); 218 Uri providerEndpoint = new Uri(String.Format("{0}://{1}{2}", httpRequest.Url.Scheme, httpRequest.Url.Authority, httpRequest.Url.AbsolutePath));
227 219
228 // Defult to returning HTML content 220 // Defult to returning HTML content
229 m_contentType = "text/html"; 221 httpResponse.ContentType = ContentType;
230 222
231 try 223 try
232 { 224 {
@@ -276,7 +268,7 @@ For more information, see <a href='http://openid.net/'>http://openid.net/</a>.
276 268
277 string[] contentTypeValues = provider.Request.Response.Headers.GetValues("Content-Type"); 269 string[] contentTypeValues = provider.Request.Response.Headers.GetValues("Content-Type");
278 if (contentTypeValues != null && contentTypeValues.Length == 1) 270 if (contentTypeValues != null && contentTypeValues.Length == 1)
279 m_contentType = contentTypeValues[0]; 271 httpResponse.ContentType = contentTypeValues[0];
280 272
281 // Set the response code and document body based on the OpenID result 273 // Set the response code and document body based on the OpenID result
282 httpResponse.StatusCode = (int)provider.Request.Response.Code; 274 httpResponse.StatusCode = (int)provider.Request.Response.Code;
@@ -344,4 +336,4 @@ For more information, see <a href='http://openid.net/'>http://openid.net/</a>.
344 return false; 336 return false;
345 } 337 }
346 } 338 }
347} 339} \ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs b/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
index bcf9d47..c9b4e9b 100644
--- a/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Server.Handlers.Authorization
54 m_AuthorizationService = service; 54 m_AuthorizationService = service;
55 } 55 }
56 56
57 public override byte[] Handle(string path, Stream request, 57 protected override byte[] ProcessRequest(string path, Stream request,
58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 58 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
59 { 59 {
60 XmlSerializer xs = new XmlSerializer(typeof (AuthorizationRequest)); 60 XmlSerializer xs = new XmlSerializer(typeof (AuthorizationRequest));
diff --git a/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs b/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs
index 8cd747e..d6bbb8f 100644
--- a/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Avatar/AvatarServerPostHandler.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Server.Handlers.Avatar
56 m_AvatarService = service; 56 m_AvatarService = service;
57 } 57 }
58 58
59 public override byte[] Handle(string path, Stream requestData, 59 protected override byte[] ProcessRequest(string path, Stream requestData,
60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
61 { 61 {
62 StreamReader sr = new StreamReader(requestData); 62 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs
index 47a8558..ca0a24c 100644
--- a/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Friends/FriendsServerPostHandler.cs
@@ -57,7 +57,7 @@ namespace OpenSim.Server.Handlers.Friends
57 m_FriendsService = service; 57 m_FriendsService = service;
58 } 58 }
59 59
60 public override byte[] Handle(string path, Stream requestData, 60 protected override byte[] ProcessRequest(string path, Stream requestData,
61 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 61 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
62 { 62 {
63 StreamReader sr = new StreamReader(requestData); 63 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index ef5f33e..c63b409 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -57,7 +57,7 @@ namespace OpenSim.Server.Handlers.Grid
57 m_GridService = service; 57 m_GridService = service;
58 } 58 }
59 59
60 public override byte[] Handle(string path, Stream requestData, 60 protected override byte[] ProcessRequest(string path, Stream requestData,
61 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 61 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
62 { 62 {
63 StreamReader sr = new StreamReader(requestData); 63 StreamReader sr = new StreamReader(requestData);
@@ -106,6 +106,9 @@ namespace OpenSim.Server.Handlers.Grid
106 case "get_default_regions": 106 case "get_default_regions":
107 return GetDefaultRegions(request); 107 return GetDefaultRegions(request);
108 108
109 case "get_default_hypergrid_regions":
110 return GetDefaultHypergridRegions(request);
111
109 case "get_fallback_regions": 112 case "get_fallback_regions":
110 return GetFallbackRegions(request); 113 return GetFallbackRegions(request);
111 114
@@ -444,6 +447,36 @@ namespace OpenSim.Server.Handlers.Grid
444 return Util.UTF8NoBomEncoding.GetBytes(xmlString); 447 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
445 } 448 }
446 449
450 byte[] GetDefaultHypergridRegions(Dictionary<string, object> request)
451 {
452 //m_log.DebugFormat("[GRID HANDLER]: GetDefaultRegions");
453 UUID scopeID = UUID.Zero;
454 if (request.ContainsKey("SCOPEID"))
455 UUID.TryParse(request["SCOPEID"].ToString(), out scopeID);
456 else
457 m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get region range");
458
459 List<GridRegion> rinfos = m_GridService.GetDefaultHypergridRegions(scopeID);
460
461 Dictionary<string, object> result = new Dictionary<string, object>();
462 if ((rinfos == null) || ((rinfos != null) && (rinfos.Count == 0)))
463 result["result"] = "null";
464 else
465 {
466 int i = 0;
467 foreach (GridRegion rinfo in rinfos)
468 {
469 Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
470 result["region" + i] = rinfoDict;
471 i++;
472 }
473 }
474 string xmlString = ServerUtils.BuildXmlResponse(result);
475
476 //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
477 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
478 }
479
447 byte[] GetFallbackRegions(Dictionary<string, object> request) 480 byte[] GetFallbackRegions(Dictionary<string, object> request)
448 { 481 {
449 //m_log.DebugFormat("[GRID HANDLER]: GetRegionRange"); 482 //m_log.DebugFormat("[GRID HANDLER]: GetRegionRange");
diff --git a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs
index 687cf8d..0b98e9a 100644
--- a/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/GridUser/GridUserServerPostHandler.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Server.Handlers.GridUser
56 m_GridUserService = service; 56 m_GridUserService = service;
57 } 57 }
58 58
59 public override byte[] Handle(string path, Stream requestData, 59 protected override byte[] ProcessRequest(string path, Stream requestData,
60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
61 { 61 {
62 StreamReader sr = new StreamReader(requestData); 62 StreamReader sr = new StreamReader(requestData);
@@ -185,10 +185,12 @@ namespace OpenSim.Server.Handlers.GridUser
185 GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(user); 185 GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(user);
186 186
187 Dictionary<string, object> result = new Dictionary<string, object>(); 187 Dictionary<string, object> result = new Dictionary<string, object>();
188 result["result"] = guinfo.ToKeyValuePairs(); 188 if (guinfo != null)
189 result["result"] = guinfo.ToKeyValuePairs();
190 else
191 result["result"] = "null";
189 192
190 string xmlString = ServerUtils.BuildXmlResponse(result); 193 string xmlString = ServerUtils.BuildXmlResponse(result);
191
192 //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString); 194 //m_log.DebugFormat("[GRID USER HANDLER]: resp string: {0}", xmlString);
193 return Util.UTF8NoBomEncoding.GetBytes(xmlString); 195 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
194 } 196 }
diff --git a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
index cf1af15..adc2fbc 100644
--- a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
@@ -61,7 +61,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
61 m_Proxy = proxy; 61 m_Proxy = proxy;
62 } 62 }
63 63
64 protected override bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) 64 protected override bool CreateAgent(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, bool fromLogin, out string reason)
65 { 65 {
66 return m_GatekeeperService.LoginAgent(aCircuit, destination, out reason); 66 return m_GatekeeperService.LoginAgent(aCircuit, destination, out reason);
67 } 67 }
diff --git a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
index 0d4990a..ffe2f36 100644
--- a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
@@ -76,10 +76,14 @@ namespace OpenSim.Server.Handlers.Hypergrid
76 server.AddStreamHandler(new GatekeeperAgentHandler(m_GatekeeperService, m_Proxy)); 76 server.AddStreamHandler(new GatekeeperAgentHandler(m_GatekeeperService, m_Proxy));
77 } 77 }
78 78
79 public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server) 79 public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server, string configName)
80 : this(config, server, null) 80 : this(config, server, (ISimulationService)null)
81 { 81 {
82 } 82 }
83 83
84 public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server)
85 : this(config, server, String.Empty)
86 {
87 }
84 } 88 }
85} 89}
diff --git a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
index 0aa2729..a2bdadb 100644
--- a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
68 m_log.ErrorFormat("[HGFRIENDS HANDLER]: TheService is null!"); 68 m_log.ErrorFormat("[HGFRIENDS HANDLER]: TheService is null!");
69 } 69 }
70 70
71 public override byte[] Handle(string path, Stream requestData, 71 protected override byte[] ProcessRequest(string path, Stream requestData,
72 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 72 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
73 { 73 {
74 StreamReader sr = new StreamReader(requestData); 74 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs
index f306b1c..06eaf2e 100644
--- a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs
@@ -91,7 +91,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
91 m_HandlersType = handlersType; 91 m_HandlersType = handlersType;
92 } 92 }
93 93
94 public override byte[] Handle(string path, Stream requestData, 94 protected override byte[] ProcessRequest(string path, Stream requestData,
95 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 95 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
96 { 96 {
97 return OKResponse(httpResponse); 97 return OKResponse(httpResponse);
diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs
index 968c1e6..04bb9e8 100644
--- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs
@@ -49,191 +49,88 @@ using log4net;
49 49
50namespace OpenSim.Server.Handlers.Hypergrid 50namespace OpenSim.Server.Handlers.Hypergrid
51{ 51{
52 public class HomeAgentHandler 52 public class HomeAgentHandler : AgentPostHandler
53 { 53 {
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 private IUserAgentService m_UserAgentService; 55 private IUserAgentService m_UserAgentService;
56 56
57 private string m_LoginServerIP; 57 private string m_LoginServerIP;
58 private bool m_Proxy = false;
59 58
60 public HomeAgentHandler(IUserAgentService userAgentService, string loginServerIP, bool proxy) 59 public HomeAgentHandler(IUserAgentService userAgentService, string loginServerIP, bool proxy) :
60 base("/homeagent")
61 { 61 {
62 m_UserAgentService = userAgentService; 62 m_UserAgentService = userAgentService;
63 m_LoginServerIP = loginServerIP; 63 m_LoginServerIP = loginServerIP;
64 m_Proxy = proxy; 64 m_Proxy = proxy;
65 } 65 }
66 66
67 public Hashtable Handler(Hashtable request) 67 protected override AgentDestinationData CreateAgentDestinationData()
68 { 68 {
69// m_log.Debug("[CONNECTION DEBUGGING]: HomeAgentHandler Called"); 69 return new ExtendedAgentDestinationData();
70// 70 }
71// m_log.Debug("---------------------------"); 71
72// m_log.Debug(" >> uri=" + request["uri"]); 72 protected override void UnpackData(OSDMap args, AgentDestinationData d, Hashtable request)
73// m_log.Debug(" >> content-type=" + request["content-type"]); 73 {
74// m_log.Debug(" >> http-method=" + request["http-method"]); 74 base.UnpackData(args, d, request);
75// m_log.Debug("---------------------------\n"); 75 ExtendedAgentDestinationData data = (ExtendedAgentDestinationData)d;
76 76 try
77 Hashtable responsedata = new Hashtable();
78 responsedata["content_type"] = "text/html";
79 responsedata["keepalive"] = false;
80
81
82 UUID agentID;
83 UUID regionID;
84 string action;
85 if (!Utils.GetParams((string)request["uri"], out agentID, out regionID, out action))
86 { 77 {
87 m_log.InfoFormat("[HOME AGENT HANDLER]: Invalid parameters for agent message {0}", request["uri"]); 78 if (args.ContainsKey("gatekeeper_host") && args["gatekeeper_host"] != null)
88 responsedata["int_response_code"] = 404; 79 data.host = args["gatekeeper_host"].AsString();
89 responsedata["str_response_string"] = "false"; 80 if (args.ContainsKey("gatekeeper_port") && args["gatekeeper_port"] != null)
81 Int32.TryParse(args["gatekeeper_port"].AsString(), out data.port);
82 if (args.ContainsKey("gatekeeper_serveruri") && args["gatekeeper_serveruri"] != null)
83 data.gatekeeperServerURI = args["gatekeeper_serveruri"];
84 if (args.ContainsKey("destination_serveruri") && args["destination_serveruri"] != null)
85 data.destinationServerURI = args["destination_serveruri"];
90 86
91 return responsedata;
92 } 87 }
93 88 catch (InvalidCastException)
94 // Next, let's parse the verb
95 string method = (string)request["http-method"];
96 if (method.Equals("POST"))
97 { 89 {
98 DoAgentPost(request, responsedata, agentID); 90 m_log.ErrorFormat("[HOME AGENT HANDLER]: Bad cast in UnpackData");
99 return responsedata;
100 } 91 }
101 else
102 {
103 m_log.InfoFormat("[HOME AGENT HANDLER]: method {0} not supported in agent message", method);
104 responsedata["int_response_code"] = HttpStatusCode.MethodNotAllowed;
105 responsedata["str_response_string"] = "Method not allowed";
106 92
107 return responsedata; 93 string callerIP = GetCallerIP(request);
108 } 94 // Verify if this call came from the login server
95 if (callerIP == m_LoginServerIP)
96 data.fromLogin = true;
109 97
110 } 98 }
111 99
112 protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) 100 protected override GridRegion ExtractGatekeeper(AgentDestinationData d)
113 { 101 {
114 OSDMap args = Utils.GetOSDMap((string)request["body"]); 102 if (d is ExtendedAgentDestinationData)
115 if (args == null)
116 { 103 {
117 responsedata["int_response_code"] = HttpStatusCode.BadRequest; 104 ExtendedAgentDestinationData data = (ExtendedAgentDestinationData)d;
118 responsedata["str_response_string"] = "Bad request"; 105 GridRegion gatekeeper = new GridRegion();
119 return; 106 gatekeeper.ServerURI = data.gatekeeperServerURI;
107 gatekeeper.ExternalHostName = data.host;
108 gatekeeper.HttpPort = (uint)data.port;
109 gatekeeper.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
110
111 return gatekeeper;
120 } 112 }
121
122 // retrieve the input arguments
123 int x = 0, y = 0;
124 UUID uuid = UUID.Zero;
125 string regionname = string.Empty;
126 string gatekeeper_host = string.Empty;
127 string gatekeeper_serveruri = string.Empty;
128 string destination_serveruri = string.Empty;
129 int gatekeeper_port = 0;
130 IPEndPoint client_ipaddress = null;
131
132 if (args.ContainsKey("gatekeeper_host") && args["gatekeeper_host"] != null)
133 gatekeeper_host = args["gatekeeper_host"].AsString();
134 if (args.ContainsKey("gatekeeper_port") && args["gatekeeper_port"] != null)
135 Int32.TryParse(args["gatekeeper_port"].AsString(), out gatekeeper_port);
136 if (args.ContainsKey("gatekeeper_serveruri") && args["gatekeeper_serveruri"] !=null)
137 gatekeeper_serveruri = args["gatekeeper_serveruri"];
138 if (args.ContainsKey("destination_serveruri") && args["destination_serveruri"] !=null)
139 destination_serveruri = args["destination_serveruri"];
140
141 GridRegion gatekeeper = new GridRegion();
142 gatekeeper.ServerURI = gatekeeper_serveruri;
143 gatekeeper.ExternalHostName = gatekeeper_host;
144 gatekeeper.HttpPort = (uint)gatekeeper_port;
145 gatekeeper.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
146
147 if (args.ContainsKey("destination_x") && args["destination_x"] != null)
148 Int32.TryParse(args["destination_x"].AsString(), out x);
149 else
150 m_log.WarnFormat(" -- request didn't have destination_x");
151 if (args.ContainsKey("destination_y") && args["destination_y"] != null)
152 Int32.TryParse(args["destination_y"].AsString(), out y);
153 else 113 else
154 m_log.WarnFormat(" -- request didn't have destination_y"); 114 m_log.WarnFormat("[HOME AGENT HANDLER]: Wrong data type");
155 if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
156 UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
157 if (args.ContainsKey("destination_name") && args["destination_name"] != null)
158 regionname = args["destination_name"].ToString();
159
160 if (args.ContainsKey("client_ip") && args["client_ip"] != null)
161 {
162 string ip_str = args["client_ip"].ToString();
163 try
164 {
165 string callerIP = GetCallerIP(request);
166 // Verify if this caller has authority to send the client IP
167 if (callerIP == m_LoginServerIP)
168 client_ipaddress = new IPEndPoint(IPAddress.Parse(ip_str), 0);
169 else // leaving this for now, but this warning should be removed
170 m_log.WarnFormat("[HOME AGENT HANDLER]: Unauthorized machine {0} tried to set client ip to {1}", callerIP, ip_str);
171 }
172 catch
173 {
174 m_log.DebugFormat("[HOME AGENT HANDLER]: Exception parsing client ip address from {0}", ip_str);
175 }
176 }
177 115
178 GridRegion destination = new GridRegion(); 116 return null;
179 destination.RegionID = uuid;
180 destination.RegionLocX = x;
181 destination.RegionLocY = y;
182 destination.RegionName = regionname;
183 destination.ServerURI = destination_serveruri;
184
185 AgentCircuitData aCircuit = new AgentCircuitData();
186 try
187 {
188 aCircuit.UnpackAgentCircuitData(args);
189 }
190 catch (Exception ex)
191 {
192 m_log.InfoFormat("[HOME AGENT HANDLER]: exception on unpacking ChildCreate message {0}", ex.Message);
193 responsedata["int_response_code"] = HttpStatusCode.BadRequest;
194 responsedata["str_response_string"] = "Bad request";
195 return;
196 }
197
198 OSDMap resp = new OSDMap(2);
199 string reason = String.Empty;
200
201 bool result = m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, client_ipaddress, out reason);
202
203 resp["reason"] = OSD.FromString(reason);
204 resp["success"] = OSD.FromBoolean(result);
205
206 // TODO: add reason if not String.Empty?
207 responsedata["int_response_code"] = HttpStatusCode.OK;
208 responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
209 } 117 }
210 118
211 private string GetCallerIP(Hashtable request)
212 {
213 if (!m_Proxy)
214 return Util.GetCallerIP(request);
215
216 // We're behind a proxy
217 Hashtable headers = (Hashtable)request["headers"];
218 string xff = "X-Forwarded-For";
219 if (headers.ContainsKey(xff.ToLower()))
220 xff = xff.ToLower();
221 119
222 if (!headers.ContainsKey(xff) || headers[xff] == null) 120 protected override bool CreateAgent(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, bool fromLogin, out string reason)
223 { 121 {
224 m_log.WarnFormat("[AGENT HANDLER]: No XFF header"); 122 return m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, fromLogin, out reason);
225 return Util.GetCallerIP(request); 123 }
226 }
227 124
228 m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers[xff]); 125 }
229 126
230 IPEndPoint ep = Util.GetClientIPFromXFF((string)headers[xff]); 127 public class ExtendedAgentDestinationData : AgentDestinationData
231 if (ep != null) 128 {
232 return ep.Address.ToString(); 129 public string host;
130 public int port;
131 public string gatekeeperServerURI;
132 public string destinationServerURI;
233 133
234 // Oops
235 return Util.GetCallerIP(request);
236 }
237 } 134 }
238 135
239} 136}
diff --git a/OpenSim/Server/Handlers/Hypergrid/InstantMessageServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/InstantMessageServerConnector.cs
index 80eb5d2..8145a21 100644
--- a/OpenSim/Server/Handlers/Hypergrid/InstantMessageServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/InstantMessageServerConnector.cs
@@ -54,10 +54,15 @@ namespace OpenSim.Server.Handlers.Hypergrid
54 private IInstantMessage m_IMService; 54 private IInstantMessage m_IMService;
55 55
56 public InstantMessageServerConnector(IConfigSource config, IHttpServer server) : 56 public InstantMessageServerConnector(IConfigSource config, IHttpServer server) :
57 this(config, server, null) 57 this(config, server, (IInstantMessageSimConnector)null)
58 { 58 {
59 } 59 }
60 60
61 public InstantMessageServerConnector(IConfigSource config, IHttpServer server, string configName) :
62 this(config, server)
63 {
64 }
65
61 public InstantMessageServerConnector(IConfigSource config, IHttpServer server, IInstantMessageSimConnector simConnector) : 66 public InstantMessageServerConnector(IConfigSource config, IHttpServer server, IInstantMessageSimConnector simConnector) :
62 base(config, server, String.Empty) 67 base(config, server, String.Empty)
63 { 68 {
diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
index db62aaa..7137836 100644
--- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
@@ -62,10 +62,15 @@ namespace OpenSim.Server.Handlers.Hypergrid
62 private bool m_VerifyCallers = false; 62 private bool m_VerifyCallers = false;
63 63
64 public UserAgentServerConnector(IConfigSource config, IHttpServer server) : 64 public UserAgentServerConnector(IConfigSource config, IHttpServer server) :
65 this(config, server, null) 65 this(config, server, (IFriendsSimConnector)null)
66 { 66 {
67 } 67 }
68 68
69 public UserAgentServerConnector(IConfigSource config, IHttpServer server, string configName) :
70 this(config, server)
71 {
72 }
73
69 public UserAgentServerConnector(IConfigSource config, IHttpServer server, IFriendsSimConnector friendsConnector) : 74 public UserAgentServerConnector(IConfigSource config, IHttpServer server, IFriendsSimConnector friendsConnector) :
70 base(config, server, String.Empty) 75 base(config, server, String.Empty)
71 { 76 {
@@ -103,7 +108,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
103 server.AddXmlRPCHandler("get_uui", GetUUI, false); 108 server.AddXmlRPCHandler("get_uui", GetUUI, false);
104 server.AddXmlRPCHandler("get_uuid", GetUUID, false); 109 server.AddXmlRPCHandler("get_uuid", GetUUID, false);
105 110
106 server.AddHTTPHandler("/homeagent/", new HomeAgentHandler(m_HomeUsersService, loginServerIP, proxy).Handler); 111 server.AddStreamHandler(new HomeAgentHandler(m_HomeUsersService, loginServerIP, proxy));
107 } 112 }
108 113
109 public XmlRpcResponse GetHomeRegion(XmlRpcRequest request, IPEndPoint remoteClient) 114 public XmlRpcResponse GetHomeRegion(XmlRpcRequest request, IPEndPoint remoteClient)
@@ -448,7 +453,6 @@ namespace OpenSim.Server.Handlers.Hypergrid
448 XmlRpcResponse response = new XmlRpcResponse(); 453 XmlRpcResponse response = new XmlRpcResponse();
449 response.Value = hash; 454 response.Value = hash;
450 return response; 455 return response;
451
452 } 456 }
453 457
454 /// <summary> 458 /// <summary>
@@ -466,9 +470,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
466 //string portstr = (string)requestData["port"]; 470 //string portstr = (string)requestData["port"];
467 if (requestData.ContainsKey("first") && requestData.ContainsKey("last")) 471 if (requestData.ContainsKey("first") && requestData.ContainsKey("last"))
468 { 472 {
469 UUID userID = UUID.Zero;
470 string first = (string)requestData["first"]; 473 string first = (string)requestData["first"];
471
472 string last = (string)requestData["last"]; 474 string last = (string)requestData["last"];
473 UUID uuid = m_HomeUsersService.GetUUID(first, last); 475 UUID uuid = m_HomeUsersService.GetUUID(first, last);
474 hash["UUID"] = uuid.ToString(); 476 hash["UUID"] = uuid.ToString();
@@ -477,7 +479,6 @@ namespace OpenSim.Server.Handlers.Hypergrid
477 XmlRpcResponse response = new XmlRpcResponse(); 479 XmlRpcResponse response = new XmlRpcResponse();
478 response.Value = hash; 480 response.Value = hash;
479 return response; 481 return response;
480
481 } 482 }
482 } 483 }
483} 484} \ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs
index 231e32f..e2c50fe 100644
--- a/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs
+++ b/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Server.Handlers.Inventory
56 m_InventoryService = service; 56 m_InventoryService = service;
57 } 57 }
58 58
59 public override byte[] Handle(string path, Stream request, 59 protected override byte[] ProcessRequest(string path, Stream request,
60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
61 { 61 {
62 XmlSerializer xs = new XmlSerializer(typeof (List<InventoryItemBase>)); 62 XmlSerializer xs = new XmlSerializer(typeof (List<InventoryItemBase>));
diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
index 64127c2..0d7c136 100644
--- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
+++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
@@ -87,7 +87,7 @@ namespace OpenSim.Server.Handlers.Asset
87 m_InventoryService = service; 87 m_InventoryService = service;
88 } 88 }
89 89
90 public override byte[] Handle(string path, Stream requestData, 90 protected override byte[] ProcessRequest(string path, Stream requestData,
91 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 91 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
92 { 92 {
93 StreamReader sr = new StreamReader(requestData); 93 StreamReader sr = new StreamReader(requestData);
@@ -155,7 +155,7 @@ namespace OpenSim.Server.Handlers.Asset
155 } 155 }
156 catch (Exception e) 156 catch (Exception e)
157 { 157 {
158 m_log.DebugFormat("[XINVENTORY HANDLER]: Exception {0}", e.StackTrace); 158 m_log.ErrorFormat("[XINVENTORY HANDLER]: Exception {0}", e.StackTrace);
159 } 159 }
160 160
161 return FailureResult(); 161 return FailureResult();
diff --git a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
index 9a7ad34..1fb0dbc 100644
--- a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
+++ b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
@@ -60,8 +60,8 @@ namespace OpenSim.Server.Handlers.Login
60 InitializeHandlers(server); 60 InitializeHandlers(server);
61 } 61 }
62 62
63 public LLLoginServiceInConnector(IConfigSource config, IHttpServer server) : 63 public LLLoginServiceInConnector(IConfigSource config, IHttpServer server, string configName) :
64 base(config, server, String.Empty) 64 base(config, server, configName)
65 { 65 {
66 string loginService = ReadLocalServiceFromConfig(config); 66 string loginService = ReadLocalServiceFromConfig(config);
67 67
@@ -72,6 +72,11 @@ namespace OpenSim.Server.Handlers.Login
72 InitializeHandlers(server); 72 InitializeHandlers(server);
73 } 73 }
74 74
75 public LLLoginServiceInConnector(IConfigSource config, IHttpServer server) :
76 this(config, server, String.Empty)
77 {
78 }
79
75 private string ReadLocalServiceFromConfig(IConfigSource config) 80 private string ReadLocalServiceFromConfig(IConfigSource config)
76 { 81 {
77 IConfig serverConfig = config.Configs["LoginService"]; 82 IConfig serverConfig = config.Configs["LoginService"];
diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
index 4a61969..d438fc7 100644
--- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
+++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
@@ -99,7 +99,7 @@ namespace OpenSim.Server.Handlers.MapImage
99 m_Proxy = proxy; 99 m_Proxy = proxy;
100 } 100 }
101 101
102 public override byte[] Handle(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 102 protected override byte[] ProcessRequest(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
103 { 103 {
104// m_log.DebugFormat("[MAP SERVICE IMAGE HANDLER]: Received {0}", path); 104// m_log.DebugFormat("[MAP SERVICE IMAGE HANDLER]: Received {0}", path);
105 StreamReader sr = new StreamReader(requestData); 105 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs b/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
index 4502b7d..bd1ddbd 100644
--- a/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
+++ b/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
@@ -83,7 +83,7 @@ namespace OpenSim.Server.Handlers.MapImage
83 m_MapService = service; 83 m_MapService = service;
84 } 84 }
85 85
86 public override byte[] Handle(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 86 protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
87 { 87 {
88 ev.WaitOne(); 88 ev.WaitOne();
89 lock (ev) 89 lock (ev)
diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
index 8a1f824..3525a01 100644
--- a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
+++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Server.Handlers.Neighbour
58 // TODO: unused: m_AuthenticationService = authentication; 58 // TODO: unused: m_AuthenticationService = authentication;
59 } 59 }
60 60
61 public override byte[] Handle(string path, Stream request, 61 protected override byte[] ProcessRequest(string path, Stream request,
62 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 62 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
63 { 63 {
64 // Not implemented yet 64 // Not implemented yet
@@ -83,7 +83,7 @@ namespace OpenSim.Server.Handlers.Neighbour
83 // TODO: unused: m_AllowForeignGuests = foreignGuests; 83 // TODO: unused: m_AllowForeignGuests = foreignGuests;
84 } 84 }
85 85
86 public override byte[] Handle(string path, Stream request, 86 protected override byte[] ProcessRequest(string path, Stream request,
87 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 87 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
88 { 88 {
89 byte[] result = new byte[0]; 89 byte[] result = new byte[0];
@@ -176,7 +176,7 @@ namespace OpenSim.Server.Handlers.Neighbour
176 // TODO: unused: m_AuthenticationService = authentication; 176 // TODO: unused: m_AuthenticationService = authentication;
177 } 177 }
178 178
179 public override byte[] Handle(string path, Stream request, 179 protected override byte[] ProcessRequest(string path, Stream request,
180 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 180 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
181 { 181 {
182 // Not implemented yet 182 // Not implemented yet
@@ -197,7 +197,7 @@ namespace OpenSim.Server.Handlers.Neighbour
197 // TODO: unused: m_AuthenticationService = authentication; 197 // TODO: unused: m_AuthenticationService = authentication;
198 } 198 }
199 199
200 public override byte[] Handle(string path, Stream request, 200 protected override byte[] ProcessRequest(string path, Stream request,
201 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 201 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
202 { 202 {
203 // Not implemented yet 203 // Not implemented yet
diff --git a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs
index 2d67c6d..abb4b19 100644
--- a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Server.Handlers.Presence
56 m_PresenceService = service; 56 m_PresenceService = service;
57 } 57 }
58 58
59 public override byte[] Handle(string path, Stream requestData, 59 protected override byte[] ProcessRequest(string path, Stream requestData,
60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
61 { 61 {
62 StreamReader sr = new StreamReader(requestData); 62 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs
new file mode 100644
index 0000000..28dbbc2
--- /dev/null
+++ b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs
@@ -0,0 +1,112 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using Nini.Config;
31using OpenSim.Server.Base;
32using OpenSim.Services.Interfaces;
33using OpenSim.Framework.Servers.HttpServer;
34using OpenSim.Framework;
35using OpenSim.Server.Handlers.Base;
36using log4net;
37
38namespace OpenSim.Server.Handlers.Profiles
39{
40 public class UserProfilesConnector: ServiceConnector
41 {
42// static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 // Our Local Module
45 public IUserProfilesService ServiceModule
46 {
47 get; private set;
48 }
49
50 // The HTTP server.
51 public IHttpServer Server
52 {
53 get; private set;
54 }
55
56 public string ConfigName
57 {
58 get; private set;
59 }
60
61 public bool Enabled
62 {
63 get; private set;
64 }
65
66 public UserProfilesConnector(IConfigSource config, IHttpServer server, string configName) :
67 base(config, server, configName)
68 {
69 ConfigName = "UserProfilesService";
70 if(!string.IsNullOrEmpty(configName))
71 ConfigName = configName;
72
73 IConfig serverConfig = config.Configs[ConfigName];
74 if (serverConfig == null)
75 throw new Exception(String.Format("No section {0} in config file", ConfigName));
76
77 if(!serverConfig.GetBoolean("Enabled",false))
78 {
79 Enabled = false;
80 return;
81 }
82
83 Enabled = true;
84
85 Server = server;
86
87 string service = serverConfig.GetString("LocalServiceModule", String.Empty);
88
89 Object[] args = new Object[] { config, ConfigName };
90 ServiceModule = ServerUtils.LoadPlugin<IUserProfilesService>(service, args);
91
92 JsonRpcProfileHandlers handler = new JsonRpcProfileHandlers(ServiceModule);
93
94 Server.AddJsonRPCHandler("avatarclassifiedsrequest", handler.AvatarClassifiedsRequest);
95 Server.AddJsonRPCHandler("classified_update", handler.ClassifiedUpdate);
96 Server.AddJsonRPCHandler("classifieds_info_query", handler.ClassifiedInfoRequest);
97 Server.AddJsonRPCHandler("classified_delete", handler.ClassifiedDelete);
98 Server.AddJsonRPCHandler("avatarpicksrequest", handler.AvatarPicksRequest);
99 Server.AddJsonRPCHandler("pickinforequest", handler.PickInfoRequest);
100 Server.AddJsonRPCHandler("picks_update", handler.PicksUpdate);
101 Server.AddJsonRPCHandler("picks_delete", handler.PicksDelete);
102 Server.AddJsonRPCHandler("avatarnotesrequest", handler.AvatarNotesRequest);
103 Server.AddJsonRPCHandler("avatar_notes_update", handler.NotesUpdate);
104 Server.AddJsonRPCHandler("avatar_properties_request", handler.AvatarPropertiesRequest);
105 Server.AddJsonRPCHandler("avatar_properties_update", handler.AvatarPropertiesUpdate);
106 Server.AddJsonRPCHandler("avatar_interests_update", handler.AvatarInterestsUpdate);
107 Server.AddJsonRPCHandler("image_assets_request", handler.AvatarImageAssetsRequest);
108 Server.AddJsonRPCHandler("user_data_request", handler.RequestUserAppData);
109 Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData);
110 }
111 }
112} \ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs
new file mode 100644
index 0000000..f5f0794
--- /dev/null
+++ b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs
@@ -0,0 +1,461 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using OpenMetaverse;
31using OpenMetaverse.StructuredData;
32using log4net;
33using OpenSim.Services.Interfaces;
34using OpenSim.Framework.Servers.HttpServer;
35using OpenSim.Framework;
36
37namespace OpenSim.Server.Handlers
38{
39 public class UserProfilesHandlers
40 {
41 public UserProfilesHandlers ()
42 {
43 }
44 }
45
46 public class JsonRpcProfileHandlers
47 {
48 static readonly ILog m_log =
49 LogManager.GetLogger(
50 MethodBase.GetCurrentMethod().DeclaringType);
51
52 public IUserProfilesService Service
53 {
54 get; private set;
55 }
56
57 public JsonRpcProfileHandlers(IUserProfilesService service)
58 {
59 Service = service;
60 }
61
62 #region Classifieds
63 /// <summary>
64 /// Request avatar's classified ads.
65 /// </summary>
66 /// <returns>
67 /// An array containing all the calassified uuid and it's name created by the creator id
68 /// </returns>
69 /// <param name='json'>
70 /// Our parameters are in the OSDMap json["params"]
71 /// </param>
72 /// <param name='response'>
73 /// If set to <c>true</c> response.
74 /// </param>
75 public bool AvatarClassifiedsRequest(OSDMap json, ref JsonRpcResponse response)
76 {
77 if(!json.ContainsKey("params"))
78 {
79 response.Error.Code = ErrorCode.ParseError;
80 m_log.DebugFormat ("Classified Request");
81 return false;
82 }
83
84 OSDMap request = (OSDMap)json["params"];
85 UUID creatorId = new UUID(request["creatorId"].AsString());
86
87
88 OSDArray data = (OSDArray) Service.AvatarClassifiedsRequest(creatorId);
89 response.Result = data;
90
91 return true;
92 }
93
94 public bool ClassifiedUpdate(OSDMap json, ref JsonRpcResponse response)
95 {
96 if(!json.ContainsKey("params"))
97 {
98 response.Error.Code = ErrorCode.ParseError;
99 response.Error.Message = "Error parsing classified update request";
100 m_log.DebugFormat ("Classified Update Request");
101 return false;
102 }
103
104 string result = string.Empty;
105 UserClassifiedAdd ad = new UserClassifiedAdd();
106 object Ad = (object)ad;
107 OSD.DeserializeMembers(ref Ad, (OSDMap)json["params"]);
108 if(Service.ClassifiedUpdate(ad, ref result))
109 {
110 response.Result = OSD.SerializeMembers(ad);
111 return true;
112 }
113
114 response.Error.Code = ErrorCode.InternalError;
115 response.Error.Message = string.Format("{0}", result);
116 return false;
117 }
118
119 public bool ClassifiedDelete(OSDMap json, ref JsonRpcResponse response)
120 {
121 if(!json.ContainsKey("params"))
122 {
123 response.Error.Code = ErrorCode.ParseError;
124 m_log.DebugFormat ("Classified Delete Request");
125 return false;
126 }
127
128 OSDMap request = (OSDMap)json["params"];
129 UUID classifiedId = new UUID(request["classifiedID"].AsString());
130
131 OSDMap res = new OSDMap();
132 res["result"] = OSD.FromString("success");
133 response.Result = res;
134
135 return true;
136
137 }
138
139 public bool ClassifiedInfoRequest(OSDMap json, ref JsonRpcResponse response)
140 {
141 if(!json.ContainsKey("params"))
142 {
143 response.Error.Code = ErrorCode.ParseError;
144 response.Error.Message = "no parameters supplied";
145 m_log.DebugFormat ("Classified Info Request");
146 return false;
147 }
148
149 string result = string.Empty;
150 UserClassifiedAdd ad = new UserClassifiedAdd();
151 object Ad = (object)ad;
152 OSD.DeserializeMembers(ref Ad, (OSDMap)json["params"]);
153 if(Service.ClassifiedInfoRequest(ref ad, ref result))
154 {
155 response.Result = OSD.SerializeMembers(ad);
156 return true;
157 }
158
159 response.Error.Code = ErrorCode.InternalError;
160 response.Error.Message = string.Format("{0}", result);
161 return false;
162 }
163 #endregion Classifieds
164
165 #region Picks
166 public bool AvatarPicksRequest(OSDMap json, ref JsonRpcResponse response)
167 {
168 if(!json.ContainsKey("params"))
169 {
170 response.Error.Code = ErrorCode.ParseError;
171 m_log.DebugFormat ("Avatar Picks Request");
172 return false;
173 }
174
175 OSDMap request = (OSDMap)json["params"];
176 UUID creatorId = new UUID(request["creatorId"].AsString());
177
178
179 OSDArray data = (OSDArray) Service.AvatarPicksRequest(creatorId);
180 response.Result = data;
181
182 return true;
183 }
184
185 public bool PickInfoRequest(OSDMap json, ref JsonRpcResponse response)
186 {
187 if(!json.ContainsKey("params"))
188 {
189 response.Error.Code = ErrorCode.ParseError;
190 response.Error.Message = "no parameters supplied";
191 m_log.DebugFormat ("Avatar Picks Info Request");
192 return false;
193 }
194
195 string result = string.Empty;
196 UserProfilePick pick = new UserProfilePick();
197 object Pick = (object)pick;
198 OSD.DeserializeMembers(ref Pick, (OSDMap)json["params"]);
199 if(Service.PickInfoRequest(ref pick, ref result))
200 {
201 response.Result = OSD.SerializeMembers(pick);
202 return true;
203 }
204
205 response.Error.Code = ErrorCode.InternalError;
206 response.Error.Message = string.Format("{0}", result);
207 return false;
208 }
209
210 public bool PicksUpdate(OSDMap json, ref JsonRpcResponse response)
211 {
212 if(!json.ContainsKey("params"))
213 {
214 response.Error.Code = ErrorCode.ParseError;
215 response.Error.Message = "no parameters supplied";
216 m_log.DebugFormat ("Avatar Picks Update Request");
217 return false;
218 }
219
220 string result = string.Empty;
221 UserProfilePick pick = new UserProfilePick();
222 object Pick = (object)pick;
223 OSD.DeserializeMembers(ref Pick, (OSDMap)json["params"]);
224 if(Service.PicksUpdate(ref pick, ref result))
225 {
226 response.Result = OSD.SerializeMembers(pick);
227 return true;
228 }
229
230 response.Error.Code = ErrorCode.InternalError;
231 response.Error.Message = "unable to update pick";
232
233 return false;
234 }
235
236 public bool PicksDelete(OSDMap json, ref JsonRpcResponse response)
237 {
238 if(!json.ContainsKey("params"))
239 {
240 response.Error.Code = ErrorCode.ParseError;
241 m_log.DebugFormat ("Avatar Picks Delete Request");
242 return false;
243 }
244
245 OSDMap request = (OSDMap)json["params"];
246 UUID pickId = new UUID(request["pickId"].AsString());
247 if(Service.PicksDelete(pickId))
248 return true;
249
250 response.Error.Code = ErrorCode.InternalError;
251 response.Error.Message = "data error removing record";
252 return false;
253 }
254 #endregion Picks
255
256 #region Notes
257 public bool AvatarNotesRequest(OSDMap json, ref JsonRpcResponse response)
258 {
259 if(!json.ContainsKey("params"))
260 {
261 response.Error.Code = ErrorCode.ParseError;
262 response.Error.Message = "Params missing";
263 m_log.DebugFormat ("Avatar Notes Request");
264 return false;
265 }
266
267 string result = string.Empty;
268 UserProfileNotes note = new UserProfileNotes();
269 object Note = (object)note;
270 OSD.DeserializeMembers(ref Note, (OSDMap)json["params"]);
271 if(Service.AvatarNotesRequest(ref note))
272 {
273 response.Result = OSD.SerializeMembers(note);
274 return true;
275 }
276
277 object Notes = (object) note;
278 OSD.DeserializeMembers(ref Notes, (OSDMap)json["params"]);
279 return true;
280 }
281
282 public bool NotesUpdate(OSDMap json, ref JsonRpcResponse response)
283 {
284 if(!json.ContainsKey("params"))
285 {
286 response.Error.Code = ErrorCode.ParseError;
287 response.Error.Message = "No parameters";
288 m_log.DebugFormat ("Avatar Notes Update Request");
289 return false;
290 }
291
292 string result = string.Empty;
293 UserProfileNotes note = new UserProfileNotes();
294 object Notes = (object) note;
295 OSD.DeserializeMembers(ref Notes, (OSDMap)json["params"]);
296 if(Service.NotesUpdate(ref note, ref result))
297 {
298 response.Result = OSD.SerializeMembers(note);
299 return true;
300 }
301 return true;
302 }
303 #endregion Notes
304
305 #region Profile Properties
306 public bool AvatarPropertiesRequest(OSDMap json, ref JsonRpcResponse response)
307 {
308 if(!json.ContainsKey("params"))
309 {
310 response.Error.Code = ErrorCode.ParseError;
311 response.Error.Message = "no parameters supplied";
312 m_log.DebugFormat ("Avatar Properties Request");
313 return false;
314 }
315
316 string result = string.Empty;
317 UserProfileProperties props = new UserProfileProperties();
318 object Props = (object)props;
319 OSD.DeserializeMembers(ref Props, (OSDMap)json["params"]);
320 if(Service.AvatarPropertiesRequest(ref props, ref result))
321 {
322 response.Result = OSD.SerializeMembers(props);
323 return true;
324 }
325
326 response.Error.Code = ErrorCode.InternalError;
327 response.Error.Message = string.Format("{0}", result);
328 return false;
329 }
330
331 public bool AvatarPropertiesUpdate(OSDMap json, ref JsonRpcResponse response)
332 {
333 if(!json.ContainsKey("params"))
334 {
335 response.Error.Code = ErrorCode.ParseError;
336 response.Error.Message = "no parameters supplied";
337 m_log.DebugFormat ("Avatar Properties Update Request");
338 return false;
339 }
340
341 string result = string.Empty;
342 UserProfileProperties props = new UserProfileProperties();
343 object Props = (object)props;
344 OSD.DeserializeMembers(ref Props, (OSDMap)json["params"]);
345 if(Service.AvatarPropertiesUpdate(ref props, ref result))
346 {
347 response.Result = OSD.SerializeMembers(props);
348 return true;
349 }
350
351 response.Error.Code = ErrorCode.InternalError;
352 response.Error.Message = string.Format("{0}", result);
353 return false;
354 }
355 #endregion Profile Properties
356
357 #region Interests
358 public bool AvatarInterestsUpdate(OSDMap json, ref JsonRpcResponse response)
359 {
360 if(!json.ContainsKey("params"))
361 {
362 response.Error.Code = ErrorCode.ParseError;
363 response.Error.Message = "no parameters supplied";
364 m_log.DebugFormat ("Avatar Interests Update Request");
365 return false;
366 }
367
368 string result = string.Empty;
369 UserProfileProperties props = new UserProfileProperties();
370 object Props = (object)props;
371 OSD.DeserializeMembers(ref Props, (OSDMap)json["params"]);
372 if(Service.AvatarInterestsUpdate(props, ref result))
373 {
374 response.Result = OSD.SerializeMembers(props);
375 return true;
376 }
377
378 response.Error.Code = ErrorCode.InternalError;
379 response.Error.Message = string.Format("{0}", result);
380 return false;
381 }
382 #endregion Interests
383
384 #region Utility
385 public bool AvatarImageAssetsRequest(OSDMap json, ref JsonRpcResponse response)
386 {
387 if(!json.ContainsKey("params"))
388 {
389 response.Error.Code = ErrorCode.ParseError;
390 m_log.DebugFormat ("Avatar Image Assets Request");
391 return false;
392 }
393
394 OSDMap request = (OSDMap)json["params"];
395 UUID avatarId = new UUID(request["avatarId"].AsString());
396
397 OSDArray data = (OSDArray) Service.AvatarImageAssetsRequest(avatarId);
398 response.Result = data;
399
400 return true;
401 }
402 #endregion Utiltiy
403
404 #region UserData
405 public bool RequestUserAppData(OSDMap json, ref JsonRpcResponse response)
406 {
407 if(!json.ContainsKey("params"))
408 {
409 response.Error.Code = ErrorCode.ParseError;
410 response.Error.Message = "no parameters supplied";
411 m_log.DebugFormat ("User Application Service URL Request: No Parameters!");
412 return false;
413 }
414
415 string result = string.Empty;
416 UserAppData props = new UserAppData();
417 object Props = (object)props;
418 OSD.DeserializeMembers(ref Props, (OSDMap)json["params"]);
419 if(Service.RequestUserAppData(ref props, ref result))
420 {
421 OSDMap res = new OSDMap();
422 res["result"] = OSD.FromString("success");
423 res["token"] = OSD.FromString (result);
424 response.Result = res;
425
426 return true;
427 }
428
429 response.Error.Code = ErrorCode.InternalError;
430 response.Error.Message = string.Format("{0}", result);
431 return false;
432 }
433
434 public bool UpdateUserAppData(OSDMap json, ref JsonRpcResponse response)
435 {
436 if(!json.ContainsKey("params"))
437 {
438 response.Error.Code = ErrorCode.ParseError;
439 response.Error.Message = "no parameters supplied";
440 m_log.DebugFormat ("User App Data Update Request");
441 return false;
442 }
443
444 string result = string.Empty;
445 UserAppData props = new UserAppData();
446 object Props = (object)props;
447 OSD.DeserializeMembers(ref Props, (OSDMap)json["params"]);
448 if(Service.SetUserAppData(props, ref result))
449 {
450 response.Result = OSD.SerializeMembers(props);
451 return true;
452 }
453
454 response.Error.Code = ErrorCode.InternalError;
455 response.Error.Message = string.Format("{0}", result);
456 return false;
457 }
458 #endregion UserData
459 }
460}
461
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index 0bd8269..964ccf8 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -27,11 +27,13 @@
27 27
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Specialized;
30using System.IO; 31using System.IO;
31using System.IO.Compression; 32using System.IO.Compression;
32using System.Reflection; 33using System.Reflection;
33using System.Net; 34using System.Net;
34using System.Text; 35using System.Text;
36using System.Web;
35 37
36using OpenSim.Server.Base; 38using OpenSim.Server.Base;
37using OpenSim.Server.Handlers.Base; 39using OpenSim.Server.Handlers.Base;
@@ -90,19 +92,13 @@ namespace OpenSim.Server.Handlers.Simulation
90 92
91 // Next, let's parse the verb 93 // Next, let's parse the verb
92 string method = (string)request["http-method"]; 94 string method = (string)request["http-method"];
93 if (method.Equals("GET")) 95 if (method.Equals("DELETE"))
94 { 96 {
95 DoAgentGet(request, responsedata, agentID, regionID); 97 string auth_token = string.Empty;
96 return responsedata; 98 if (request.ContainsKey("auth"))
97 } 99 auth_token = request["auth"].ToString();
98 else if (method.Equals("DELETE")) 100
99 { 101 DoAgentDelete(request, responsedata, agentID, action, regionID, auth_token);
100 DoAgentDelete(request, responsedata, agentID, action, regionID);
101 return responsedata;
102 }
103 else if (method.Equals("DELETECHILD"))
104 {
105 DoChildAgentDelete(request, responsedata, agentID, action, regionID);
106 return responsedata; 102 return responsedata;
107 } 103 }
108 else if (method.Equals("QUERYACCESS")) 104 else if (method.Equals("QUERYACCESS"))
@@ -112,7 +108,7 @@ namespace OpenSim.Server.Handlers.Simulation
112 } 108 }
113 else 109 else
114 { 110 {
115 m_log.InfoFormat("[AGENT HANDLER]: method {0} not supported in agent message", method); 111 m_log.ErrorFormat("[AGENT HANDLER]: method {0} not supported in agent message {1} (caller is {2})", method, (string)request["uri"], Util.GetCallerIP(request));
116 responsedata["int_response_code"] = HttpStatusCode.MethodNotAllowed; 112 responsedata["int_response_code"] = HttpStatusCode.MethodNotAllowed;
117 responsedata["str_response_string"] = "Method not allowed"; 113 responsedata["str_response_string"] = "Method not allowed";
118 114
@@ -161,79 +157,12 @@ namespace OpenSim.Server.Handlers.Simulation
161// Console.WriteLine("str_response_string [{0}]", responsedata["str_response_string"]); 157// Console.WriteLine("str_response_string [{0}]", responsedata["str_response_string"]);
162 } 158 }
163 159
164 protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) 160 protected void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID, string auth_token)
165 { 161 {
166 if (m_SimulationService == null) 162 if (string.IsNullOrEmpty(action))
167 { 163 m_log.DebugFormat("[AGENT HANDLER]: >>> DELETE <<< RegionID: {0}; from: {1}; auth_code: {2}", regionID, Util.GetCallerIP(request), auth_token);
168 m_log.Debug("[AGENT HANDLER]: Agent GET called. Harmless but useless.");
169 responsedata["content_type"] = "application/json";
170 responsedata["int_response_code"] = HttpStatusCode.NotImplemented;
171 responsedata["str_response_string"] = string.Empty;
172
173 return;
174 }
175
176 GridRegion destination = new GridRegion();
177 destination.RegionID = regionID;
178
179 IAgentData agent = null;
180 bool result = m_SimulationService.RetrieveAgent(destination, id, out agent);
181 OSDMap map = null;
182 if (result)
183 {
184 if (agent != null) // just to make sure
185 {
186 map = agent.Pack();
187 string strBuffer = "";
188 try
189 {
190 strBuffer = OSDParser.SerializeJsonString(map);
191 }
192 catch (Exception e)
193 {
194 m_log.WarnFormat("[AGENT HANDLER]: Exception thrown on serialization of DoAgentGet: {0}", e.Message);
195 responsedata["int_response_code"] = HttpStatusCode.InternalServerError;
196 // ignore. buffer will be empty, caller should check.
197 }
198
199 responsedata["content_type"] = "application/json";
200 responsedata["int_response_code"] = HttpStatusCode.OK;
201 responsedata["str_response_string"] = strBuffer;
202 }
203 else
204 {
205 responsedata["int_response_code"] = HttpStatusCode.InternalServerError;
206 responsedata["str_response_string"] = "Internal error";
207 }
208 }
209 else
210 {
211 responsedata["int_response_code"] = HttpStatusCode.NotFound;
212 responsedata["str_response_string"] = "Not Found";
213 }
214 }
215
216 protected void DoChildAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID)
217 {
218 m_log.Debug(" >>> DoChildAgentDelete action:" + action + "; RegionID:" + regionID);
219
220 GridRegion destination = new GridRegion();
221 destination.RegionID = regionID;
222
223 if (action.Equals("release"))
224 ReleaseAgent(regionID, id);
225 else 164 else
226 m_SimulationService.CloseChildAgent(destination, id); 165 m_log.DebugFormat("[AGENT HANDLER]: Release {0} to RegionID: {1}", id, regionID);
227
228 responsedata["int_response_code"] = HttpStatusCode.OK;
229 responsedata["str_response_string"] = "OpenSim agent " + id.ToString();
230
231 m_log.Debug("[AGENT HANDLER]: Child Agent Released/Deleted.");
232 }
233
234 protected void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID)
235 {
236 m_log.Debug(" >>> DoDelete action:" + action + "; RegionID:" + regionID);
237 166
238 GridRegion destination = new GridRegion(); 167 GridRegion destination = new GridRegion();
239 destination.RegionID = regionID; 168 destination.RegionID = regionID;
@@ -241,12 +170,12 @@ namespace OpenSim.Server.Handlers.Simulation
241 if (action.Equals("release")) 170 if (action.Equals("release"))
242 ReleaseAgent(regionID, id); 171 ReleaseAgent(regionID, id);
243 else 172 else
244 m_SimulationService.CloseAgent(destination, id); 173 Util.FireAndForget(delegate { m_SimulationService.CloseAgent(destination, id, auth_token); });
245 174
246 responsedata["int_response_code"] = HttpStatusCode.OK; 175 responsedata["int_response_code"] = HttpStatusCode.OK;
247 responsedata["str_response_string"] = "OpenSim agent " + id.ToString(); 176 responsedata["str_response_string"] = "OpenSim agent " + id.ToString();
248 177
249 m_log.DebugFormat("[AGENT HANDLER]: Agent {0} Released/Deleted from region {1}", id, regionID); 178 //m_log.DebugFormat("[AGENT HANDLER]: Agent {0} Released/Deleted from region {1}", id, regionID);
250 } 179 }
251 180
252 protected virtual void ReleaseAgent(UUID regionID, UUID id) 181 protected virtual void ReleaseAgent(UUID regionID, UUID id)
@@ -274,7 +203,7 @@ namespace OpenSim.Server.Handlers.Simulation
274 m_SimulationService = null; 203 m_SimulationService = null;
275 } 204 }
276 205
277 public override byte[] Handle(string path, Stream request, 206 protected override byte[] ProcessRequest(string path, Stream request,
278 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 207 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
279 { 208 {
280// m_log.DebugFormat("[SIMULATION]: Stream handler called"); 209// m_log.DebugFormat("[SIMULATION]: Stream handler called");
@@ -351,31 +280,16 @@ namespace OpenSim.Server.Handlers.Simulation
351 return; 280 return;
352 } 281 }
353 282
354 // retrieve the input arguments 283 AgentDestinationData data = CreateAgentDestinationData();
355 int x = 0, y = 0; 284 UnpackData(args, data, request);
356 UUID uuid = UUID.Zero;
357 string regionname = string.Empty;
358 uint teleportFlags = 0;
359 if (args.ContainsKey("destination_x") && args["destination_x"] != null)
360 Int32.TryParse(args["destination_x"].AsString(), out x);
361 else
362 m_log.WarnFormat(" -- request didn't have destination_x");
363 if (args.ContainsKey("destination_y") && args["destination_y"] != null)
364 Int32.TryParse(args["destination_y"].AsString(), out y);
365 else
366 m_log.WarnFormat(" -- request didn't have destination_y");
367 if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
368 UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
369 if (args.ContainsKey("destination_name") && args["destination_name"] != null)
370 regionname = args["destination_name"].ToString();
371 if (args.ContainsKey("teleport_flags") && args["teleport_flags"] != null)
372 teleportFlags = args["teleport_flags"].AsUInteger();
373 285
374 GridRegion destination = new GridRegion(); 286 GridRegion destination = new GridRegion();
375 destination.RegionID = uuid; 287 destination.RegionID = data.uuid;
376 destination.RegionLocX = x; 288 destination.RegionLocX = data.x;
377 destination.RegionLocY = y; 289 destination.RegionLocY = data.y;
378 destination.RegionName = regionname; 290 destination.RegionName = data.name;
291
292 GridRegion gatekeeper = ExtractGatekeeper(data);
379 293
380 AgentCircuitData aCircuit = new AgentCircuitData(); 294 AgentCircuitData aCircuit = new AgentCircuitData();
381 try 295 try
@@ -396,7 +310,7 @@ namespace OpenSim.Server.Handlers.Simulation
396 // This is the meaning of POST agent 310 // This is the meaning of POST agent
397 //m_regionClient.AdjustUserInformation(aCircuit); 311 //m_regionClient.AdjustUserInformation(aCircuit);
398 //bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason); 312 //bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
399 bool result = CreateAgent(destination, aCircuit, teleportFlags, out reason); 313 bool result = CreateAgent(gatekeeper, destination, aCircuit, data.flags, data.fromLogin, out reason);
400 314
401 resp["reason"] = OSD.FromString(reason); 315 resp["reason"] = OSD.FromString(reason);
402 resp["success"] = OSD.FromBoolean(result); 316 resp["success"] = OSD.FromBoolean(result);
@@ -408,7 +322,36 @@ namespace OpenSim.Server.Handlers.Simulation
408 responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); 322 responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
409 } 323 }
410 324
411 private string GetCallerIP(Hashtable request) 325 protected virtual AgentDestinationData CreateAgentDestinationData()
326 {
327 return new AgentDestinationData();
328 }
329
330 protected virtual void UnpackData(OSDMap args, AgentDestinationData data, Hashtable request)
331 {
332 // retrieve the input arguments
333 if (args.ContainsKey("destination_x") && args["destination_x"] != null)
334 Int32.TryParse(args["destination_x"].AsString(), out data.x);
335 else
336 m_log.WarnFormat(" -- request didn't have destination_x");
337 if (args.ContainsKey("destination_y") && args["destination_y"] != null)
338 Int32.TryParse(args["destination_y"].AsString(), out data.y);
339 else
340 m_log.WarnFormat(" -- request didn't have destination_y");
341 if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
342 UUID.TryParse(args["destination_uuid"].AsString(), out data.uuid);
343 if (args.ContainsKey("destination_name") && args["destination_name"] != null)
344 data.name = args["destination_name"].ToString();
345 if (args.ContainsKey("teleport_flags") && args["teleport_flags"] != null)
346 data.flags = args["teleport_flags"].AsUInteger();
347 }
348
349 protected virtual GridRegion ExtractGatekeeper(AgentDestinationData data)
350 {
351 return null;
352 }
353
354 protected string GetCallerIP(Hashtable request)
412 { 355 {
413 if (!m_Proxy) 356 if (!m_Proxy)
414 return Util.GetCallerIP(request); 357 return Util.GetCallerIP(request);
@@ -441,7 +384,7 @@ namespace OpenSim.Server.Handlers.Simulation
441 } 384 }
442 385
443 // subclasses can override this 386 // subclasses can override this
444 protected virtual bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) 387 protected virtual bool CreateAgent(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, bool fromLogin, out string reason)
445 { 388 {
446 reason = String.Empty; 389 reason = String.Empty;
447 390
@@ -474,7 +417,7 @@ namespace OpenSim.Server.Handlers.Simulation
474 m_SimulationService = null; 417 m_SimulationService = null;
475 } 418 }
476 419
477 public override byte[] Handle(string path, Stream request, 420 protected override byte[] ProcessRequest(string path, Stream request,
478 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 421 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
479 { 422 {
480// m_log.DebugFormat("[SIMULATION]: Stream handler called"); 423// m_log.DebugFormat("[SIMULATION]: Stream handler called");
@@ -593,7 +536,6 @@ namespace OpenSim.Server.Handlers.Simulation
593 //agent.Dump(); 536 //agent.Dump();
594 // This is one of the meanings of PUT agent 537 // This is one of the meanings of PUT agent
595 result = UpdateAgent(destination, agent); 538 result = UpdateAgent(destination, agent);
596
597 } 539 }
598 else if ("AgentPosition".Equals(messageType)) 540 else if ("AgentPosition".Equals(messageType))
599 { 541 {
@@ -624,4 +566,14 @@ namespace OpenSim.Server.Handlers.Simulation
624 return m_SimulationService.UpdateAgent(destination, agent); 566 return m_SimulationService.UpdateAgent(destination, agent);
625 } 567 }
626 } 568 }
569
570 public class AgentDestinationData
571 {
572 public int x;
573 public int y;
574 public string name;
575 public UUID uuid;
576 public uint flags;
577 public bool fromLogin;
578 }
627} 579}
diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
index 72551ef..24c9de6 100644
--- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Server.Handlers.UserAccounts
68 } 68 }
69 } 69 }
70 70
71 public override byte[] Handle(string path, Stream requestData, 71 protected override byte[] ProcessRequest(string path, Stream requestData,
72 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 72 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
73 { 73 {
74 StreamReader sr = new StreamReader(requestData); 74 StreamReader sr = new StreamReader(requestData);
diff --git a/OpenSim/Services/AssetService/XAssetService.cs b/OpenSim/Services/AssetService/XAssetService.cs
index 8a2ca7c..6047616 100644
--- a/OpenSim/Services/AssetService/XAssetService.cs
+++ b/OpenSim/Services/AssetService/XAssetService.cs
@@ -205,15 +205,16 @@ namespace OpenSim.Services.AssetService
205 if (!UUID.TryParse(id, out assetID)) 205 if (!UUID.TryParse(id, out assetID))
206 return false; 206 return false;
207 207
208 // Don't bother deleting from a chained asset service. This isn't a big deal since deleting happens 208 if (HasChainedAssetService)
209 // very rarely. 209 m_ChainedAssetService.Delete(id);
210 210
211 return m_Database.Delete(id); 211 return m_Database.Delete(id);
212 } 212 }
213 213
214 private void MigrateFromChainedService(AssetBase asset) 214 private void MigrateFromChainedService(AssetBase asset)
215 { 215 {
216 Util.FireAndForget(o => { Store(asset); m_ChainedAssetService.Delete(asset.ID); }); 216 Store(asset);
217 m_ChainedAssetService.Delete(asset.ID);
217 } 218 }
218 } 219 }
219} \ No newline at end of file 220} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
index 8b702e0..bf0cc35 100644
--- a/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Asset/AssetServicesConnector.cs
@@ -66,6 +66,12 @@ namespace OpenSim.Services.Connectors
66 66
67 private Thread[] m_fetchThreads; 67 private Thread[] m_fetchThreads;
68 68
69 public int MaxAssetRequestConcurrency
70 {
71 get { return m_maxAssetRequestConcurrency; }
72 set { m_maxAssetRequestConcurrency = value; }
73 }
74
69 public AssetServicesConnector() 75 public AssetServicesConnector()
70 { 76 {
71 } 77 }
diff --git a/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs b/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs
index f982cc1..af91cdb 100644
--- a/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServicesConnector.cs
@@ -525,6 +525,57 @@ namespace OpenSim.Services.Connectors
525 return rinfos; 525 return rinfos;
526 } 526 }
527 527
528 public List<GridRegion> GetDefaultHypergridRegions(UUID scopeID)
529 {
530 Dictionary<string, object> sendData = new Dictionary<string, object>();
531
532 sendData["SCOPEID"] = scopeID.ToString();
533
534 sendData["METHOD"] = "get_default_hypergrid_regions";
535
536 List<GridRegion> rinfos = new List<GridRegion>();
537 string reply = string.Empty;
538 string uri = m_ServerURI + "/grid";
539 try
540 {
541 reply = SynchronousRestFormsRequester.MakeRequest("POST",
542 uri,
543 ServerUtils.BuildQueryString(sendData));
544
545 //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply);
546 }
547 catch (Exception e)
548 {
549 m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server at {0}: {1}", uri, e.Message);
550 return rinfos;
551 }
552
553 if (reply != string.Empty)
554 {
555 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
556
557 if (replyData != null)
558 {
559 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
560 foreach (object r in rinfosList)
561 {
562 if (r is Dictionary<string, object>)
563 {
564 GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
565 rinfos.Add(rinfo);
566 }
567 }
568 }
569 else
570 m_log.DebugFormat("[GRID CONNECTOR]: GetDefaultHypergridRegions {0} received null response",
571 scopeID);
572 }
573 else
574 m_log.DebugFormat("[GRID CONNECTOR]: GetDefaultHypergridRegions received null reply");
575
576 return rinfos;
577 }
578
528 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) 579 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y)
529 { 580 {
530 Dictionary<string, object> sendData = new Dictionary<string, object>(); 581 Dictionary<string, object> sendData = new Dictionary<string, object>();
diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs
index 94bda82..1a62d2f 100644
--- a/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs
+++ b/OpenSim/Services/Connectors/GridUser/GridUserServicesConnector.cs
@@ -214,7 +214,7 @@ namespace OpenSim.Services.Connectors
214 214
215 } 215 }
216 else 216 else
217 m_log.DebugFormat("[GRID USER CONNECTOR]: Loggedin received empty reply"); 217 m_log.DebugFormat("[GRID USER CONNECTOR]: Get received empty reply");
218 } 218 }
219 catch (Exception e) 219 catch (Exception e)
220 { 220 {
diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
index d840527..803cd1b 100644
--- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
@@ -53,7 +53,8 @@ namespace OpenSim.Services.Connectors.Hypergrid
53 53
54 private IAssetService m_AssetService; 54 private IAssetService m_AssetService;
55 55
56 public GatekeeperServiceConnector() : base() 56 public GatekeeperServiceConnector()
57 : base()
57 { 58 {
58 } 59 }
59 60
@@ -123,11 +124,13 @@ namespace OpenSim.Services.Connectors.Hypergrid
123 realHandle = Convert.ToUInt64((string)hash["handle"]); 124 realHandle = Convert.ToUInt64((string)hash["handle"]);
124 //m_log.Debug(">> HERE, realHandle: " + realHandle); 125 //m_log.Debug(">> HERE, realHandle: " + realHandle);
125 } 126 }
126 if (hash["region_image"] != null) { 127 if (hash["region_image"] != null)
128 {
127 imageURL = (string)hash["region_image"]; 129 imageURL = (string)hash["region_image"];
128 //m_log.Debug(">> HERE, imageURL: " + imageURL); 130 //m_log.Debug(">> HERE, imageURL: " + imageURL);
129 } 131 }
130 if (hash["external_name"] != null) { 132 if (hash["external_name"] != null)
133 {
131 externalName = (string)hash["external_name"]; 134 externalName = (string)hash["external_name"];
132 //m_log.Debug(">> HERE, externalName: " + externalName); 135 //m_log.Debug(">> HERE, externalName: " + externalName);
133 } 136 }
@@ -179,7 +182,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
179 //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); 182 //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width);
180 imageData = OpenJPEG.EncodeFromImage(bitmap, true); 183 imageData = OpenJPEG.EncodeFromImage(bitmap, true);
181 } 184 }
182 185
183 AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString()); 186 AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString());
184 187
185 // !!! for now 188 // !!! for now
@@ -257,7 +260,8 @@ namespace OpenSim.Services.Connectors.Hypergrid
257 region.RegionName = (string)hash["region_name"]; 260 region.RegionName = (string)hash["region_name"];
258 //m_log.Debug(">> HERE, region_name: " + region.RegionName); 261 //m_log.Debug(">> HERE, region_name: " + region.RegionName);
259 } 262 }
260 if (hash["hostname"] != null) { 263 if (hash["hostname"] != null)
264 {
261 region.ExternalHostName = (string)hash["hostname"]; 265 region.ExternalHostName = (string)hash["hostname"];
262 //m_log.Debug(">> HERE, hostname: " + region.ExternalHostName); 266 //m_log.Debug(">> HERE, hostname: " + region.ExternalHostName);
263 } 267 }
@@ -275,10 +279,10 @@ namespace OpenSim.Services.Connectors.Hypergrid
275 region.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), p); 279 region.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), p);
276 //m_log.Debug(">> HERE, internal_port: " + region.InternalEndPoint); 280 //m_log.Debug(">> HERE, internal_port: " + region.InternalEndPoint);
277 } 281 }
278 282
279 if (hash["server_uri"] != null) 283 if (hash["server_uri"] != null)
280 { 284 {
281 region.ServerURI = (string) hash["server_uri"]; 285 region.ServerURI = (string)hash["server_uri"];
282 //m_log.Debug(">> HERE, server_uri: " + region.ServerURI); 286 //m_log.Debug(">> HERE, server_uri: " + region.ServerURI);
283 } 287 }
284 288
@@ -295,55 +299,5 @@ namespace OpenSim.Services.Connectors.Hypergrid
295 299
296 return null; 300 return null;
297 } 301 }
298
299 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
300 {
301 // m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: CreateAgent start");
302
303 myipaddress = String.Empty;
304 reason = String.Empty;
305
306 if (destination == null)
307 {
308 m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Given destination is null");
309 return false;
310 }
311
312 string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
313
314 try
315 {
316 OSDMap args = aCircuit.PackAgentCircuitData();
317
318 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
319 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
320 args["destination_name"] = OSD.FromString(destination.RegionName);
321 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
322 args["teleport_flags"] = OSD.FromString(flags.ToString());
323
324 OSDMap result = WebUtil.PostToService(uri, args, 80000);
325 if (result["Success"].AsBoolean())
326 {
327 OSDMap unpacked = (OSDMap)result["_Result"];
328
329 if (unpacked != null)
330 {
331 reason = unpacked["reason"].AsString();
332 myipaddress = unpacked["your_ip"].AsString();
333 return unpacked["success"].AsBoolean();
334 }
335 }
336
337 reason = result["Message"] != null ? result["Message"].AsString() : "error";
338 return false;
339 }
340 catch (Exception e)
341 {
342 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
343 reason = e.Message;
344 }
345
346 return false;
347 }
348 } 302 }
349} 303}
diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs
index e984a54..622d4e1 100644
--- a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs
@@ -277,7 +277,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
277 { 277 {
278 reply = SynchronousRestFormsRequester.MakeRequest("POST", 278 reply = SynchronousRestFormsRequester.MakeRequest("POST",
279 uri, 279 uri,
280 ServerUtils.BuildQueryString(sendData)); 280 ServerUtils.BuildQueryString(sendData), 15);
281 } 281 }
282 catch (Exception e) 282 catch (Exception e)
283 { 283 {
diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
index d7e38f1..5f5b7a7 100644
--- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
@@ -44,13 +44,14 @@ using Nini.Config;
44 44
45namespace OpenSim.Services.Connectors.Hypergrid 45namespace OpenSim.Services.Connectors.Hypergrid
46{ 46{
47 public class UserAgentServiceConnector : IUserAgentService 47 public class UserAgentServiceConnector : SimulationServiceConnector, IUserAgentService
48 { 48 {
49 private static readonly ILog m_log = 49 private static readonly ILog m_log =
50 LogManager.GetLogger( 50 LogManager.GetLogger(
51 MethodBase.GetCurrentMethod().DeclaringType); 51 MethodBase.GetCurrentMethod().DeclaringType);
52 52
53 string m_ServerURL; 53 private string m_ServerURL;
54 private GridRegion m_Gatekeeper;
54 55
55 public UserAgentServiceConnector(string url) : this(url, true) 56 public UserAgentServiceConnector(string url) : this(url, true)
56 { 57 {
@@ -102,9 +103,15 @@ namespace OpenSim.Services.Connectors.Hypergrid
102 m_log.DebugFormat("[USER AGENT CONNECTOR]: UserAgentServiceConnector started for {0}", m_ServerURL); 103 m_log.DebugFormat("[USER AGENT CONNECTOR]: UserAgentServiceConnector started for {0}", m_ServerURL);
103 } 104 }
104 105
106 protected override string AgentPath()
107 {
108 return "homeagent/";
109 }
105 110
106 // The Login service calls this interface with a non-null [client] ipaddress 111 // The Login service calls this interface with fromLogin=true
107 public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, IPEndPoint ipaddress, out string reason) 112 // Sims call it with fromLogin=false
113 // Either way, this is verified by the handler
114 public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, bool fromLogin, out string reason)
108 { 115 {
109 reason = String.Empty; 116 reason = String.Empty;
110 117
@@ -115,119 +122,34 @@ namespace OpenSim.Services.Connectors.Hypergrid
115 return false; 122 return false;
116 } 123 }
117 124
118 string uri = m_ServerURL + "homeagent/" + aCircuit.AgentID + "/"; 125 GridRegion home = new GridRegion();
119 126 home.ServerURI = m_ServerURL;
120 Console.WriteLine(" >>> LoginAgentToGrid <<< " + uri); 127 home.RegionID = destination.RegionID;
121 128 home.RegionLocX = destination.RegionLocX;
122 HttpWebRequest AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri); 129 home.RegionLocY = destination.RegionLocY;
123 AgentCreateRequest.Method = "POST";
124 AgentCreateRequest.ContentType = "application/json";
125 AgentCreateRequest.Timeout = 10000;
126 //AgentCreateRequest.KeepAlive = false;
127 //AgentCreateRequest.Headers.Add("Authorization", authKey);
128
129 // Fill it in
130 OSDMap args = PackCreateAgentArguments(aCircuit, gatekeeper, destination, ipaddress);
131
132 string strBuffer = "";
133 byte[] buffer = new byte[1];
134 try
135 {
136 strBuffer = OSDParser.SerializeJsonString(args);
137 Encoding str = Util.UTF8;
138 buffer = str.GetBytes(strBuffer);
139
140 }
141 catch (Exception e)
142 {
143 m_log.WarnFormat("[USER AGENT CONNECTOR]: Exception thrown on serialization of ChildCreate: {0}", e.Message);
144 // ignore. buffer will be empty, caller should check.
145 }
146
147 Stream os = null;
148 try
149 { // send the Post
150 AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send
151 os = AgentCreateRequest.GetRequestStream();
152 os.Write(buffer, 0, strBuffer.Length); //Send it
153 m_log.InfoFormat("[USER AGENT CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}",
154 uri, destination.RegionName, destination.RegionLocX, destination.RegionLocY);
155 }
156 //catch (WebException ex)
157 catch
158 {
159 //m_log.InfoFormat("[USER AGENT CONNECTOR]: Bad send on ChildAgentUpdate {0}", ex.Message);
160 reason = "cannot contact remote region";
161 return false;
162 }
163 finally
164 {
165 if (os != null)
166 os.Close();
167 }
168
169 // Let's wait for the response
170 //m_log.Info("[USER AGENT CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
171 130
172 try 131 m_Gatekeeper = gatekeeper;
173 {
174 using (WebResponse webResponse = AgentCreateRequest.GetResponse())
175 {
176 if (webResponse == null)
177 {
178 m_log.Info("[USER AGENT CONNECTOR]: Null reply on DoCreateChildAgentCall post");
179 }
180 else
181 {
182 using (Stream s = webResponse.GetResponseStream())
183 {
184 using (StreamReader sr = new StreamReader(s))
185 {
186 string response = sr.ReadToEnd().Trim();
187 m_log.InfoFormat("[USER AGENT CONNECTOR]: DoCreateChildAgentCall reply was {0} ", response);
188
189 if (!String.IsNullOrEmpty(response))
190 {
191 try
192 {
193 // we assume we got an OSDMap back
194 OSDMap r = Util.GetOSDMap(response);
195 bool success = r["success"].AsBoolean();
196 reason = r["reason"].AsString();
197 return success;
198 }
199 catch (NullReferenceException e)
200 {
201 m_log.InfoFormat("[USER AGENT CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
202
203 // check for old style response
204 if (response.ToLower().StartsWith("true"))
205 return true;
206
207 return false;
208 }
209 }
210 }
211 }
212 }
213 }
214 }
215 catch (WebException ex)
216 {
217 m_log.InfoFormat("[USER AGENT CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
218 reason = "Destination did not reply";
219 return false;
220 }
221 132
222 return true; 133 Console.WriteLine(" >>> LoginAgentToGrid <<< " + home.ServerURI);
223 134
135 uint flags = fromLogin ? (uint)TeleportFlags.ViaLogin : (uint)TeleportFlags.ViaHome;
136 return CreateAgent(home, aCircuit, flags, out reason);
224 } 137 }
225 138
226 139
227 // The simulators call this interface 140 // The simulators call this interface
228 public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, out string reason) 141 public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, out string reason)
229 { 142 {
230 return LoginAgentToGrid(aCircuit, gatekeeper, destination, null, out reason); 143 return LoginAgentToGrid(aCircuit, gatekeeper, destination, false, out reason);
144 }
145
146 protected override void PackData(OSDMap args, AgentCircuitData aCircuit, GridRegion destination, uint flags)
147 {
148 base.PackData(args, aCircuit, destination, flags);
149 args["gatekeeper_serveruri"] = OSD.FromString(m_Gatekeeper.ServerURI);
150 args["gatekeeper_host"] = OSD.FromString(m_Gatekeeper.ExternalHostName);
151 args["gatekeeper_port"] = OSD.FromString(m_Gatekeeper.HttpPort.ToString());
152 args["destination_serveruri"] = OSD.FromString(destination.ServerURI);
231 } 153 }
232 154
233 protected OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, IPEndPoint ipaddress) 155 protected OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, IPEndPoint ipaddress)
diff --git a/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs b/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs
index dbce9f6..e19c23d 100644
--- a/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs
+++ b/OpenSim/Services/Connectors/InstantMessage/InstantMessageServiceConnector.cs
@@ -123,6 +123,7 @@ namespace OpenSim.Services.Connectors.InstantMessage
123 gim["position_z"] = msg.Position.Z.ToString(); 123 gim["position_z"] = msg.Position.Z.ToString();
124 gim["region_id"] = msg.RegionID.ToString(); 124 gim["region_id"] = msg.RegionID.ToString();
125 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket, Base64FormattingOptions.None); 125 gim["binary_bucket"] = Convert.ToBase64String(msg.binaryBucket, Base64FormattingOptions.None);
126 gim["region_id"] = new UUID(msg.RegionID).ToString();
126 127
127 return gim; 128 return gim;
128 } 129 }
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
index 44f5e01..36d4ae2 100644
--- a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
@@ -84,6 +84,30 @@ namespace OpenSim.Services.Connectors
84 m_ServerURI = serviceURI; 84 m_ServerURI = serviceURI;
85 } 85 }
86 86
87 private bool CheckReturn(Dictionary<string, object> ret)
88 {
89 if (ret == null)
90 return false;
91
92 if (ret.Count == 0)
93 return false;
94
95 if (ret.ContainsKey("RESULT"))
96 {
97 if (ret["RESULT"] is string)
98 {
99 bool result;
100
101 if (bool.TryParse((string)ret["RESULT"], out result))
102 return result;
103
104 return false;
105 }
106 }
107
108 return true;
109 }
110
87 public bool CreateUserInventory(UUID principalID) 111 public bool CreateUserInventory(UUID principalID)
88 { 112 {
89 Dictionary<string,object> ret = MakeRequest("CREATEUSERINVENTORY", 113 Dictionary<string,object> ret = MakeRequest("CREATEUSERINVENTORY",
@@ -91,12 +115,7 @@ namespace OpenSim.Services.Connectors
91 { "PRINCIPAL", principalID.ToString() } 115 { "PRINCIPAL", principalID.ToString() }
92 }); 116 });
93 117
94 if (ret == null) 118 return CheckReturn(ret);
95 return false;
96 if (ret.Count == 0)
97 return false;
98
99 return bool.Parse(ret["RESULT"].ToString());
100 } 119 }
101 120
102 public List<InventoryFolderBase> GetInventorySkeleton(UUID principalID) 121 public List<InventoryFolderBase> GetInventorySkeleton(UUID principalID)
@@ -106,9 +125,7 @@ namespace OpenSim.Services.Connectors
106 { "PRINCIPAL", principalID.ToString() } 125 { "PRINCIPAL", principalID.ToString() }
107 }); 126 });
108 127
109 if (ret == null) 128 if (!CheckReturn(ret))
110 return null;
111 if (ret.Count == 0)
112 return null; 129 return null;
113 130
114 Dictionary<string, object> folders = (Dictionary<string, object>)ret["FOLDERS"]; 131 Dictionary<string, object> folders = (Dictionary<string, object>)ret["FOLDERS"];
@@ -135,9 +152,7 @@ namespace OpenSim.Services.Connectors
135 { "PRINCIPAL", principalID.ToString() } 152 { "PRINCIPAL", principalID.ToString() }
136 }); 153 });
137 154
138 if (ret == null) 155 if (!CheckReturn(ret))
139 return null;
140 if (ret.Count == 0)
141 return null; 156 return null;
142 157
143 return BuildFolder((Dictionary<string, object>)ret["folder"]); 158 return BuildFolder((Dictionary<string, object>)ret["folder"]);
@@ -151,9 +166,7 @@ namespace OpenSim.Services.Connectors
151 { "TYPE", ((int)type).ToString() } 166 { "TYPE", ((int)type).ToString() }
152 }); 167 });
153 168
154 if (ret == null) 169 if (!CheckReturn(ret))
155 return null;
156 if (ret.Count == 0)
157 return null; 170 return null;
158 171
159 return BuildFolder((Dictionary<string, object>)ret["folder"]); 172 return BuildFolder((Dictionary<string, object>)ret["folder"]);
@@ -174,9 +187,7 @@ namespace OpenSim.Services.Connectors
174 { "FOLDER", folderID.ToString() } 187 { "FOLDER", folderID.ToString() }
175 }); 188 });
176 189
177 if (ret == null) 190 if (!CheckReturn(ret))
178 return null;
179 if (ret.Count == 0)
180 return null; 191 return null;
181 192
182 Dictionary<string,object> folders = 193 Dictionary<string,object> folders =
@@ -205,9 +216,7 @@ namespace OpenSim.Services.Connectors
205 { "FOLDER", folderID.ToString() } 216 { "FOLDER", folderID.ToString() }
206 }); 217 });
207 218
208 if (ret == null) 219 if (!CheckReturn(ret))
209 return null;
210 if (ret.Count == 0)
211 return null; 220 return null;
212 221
213 Dictionary<string, object> items = (Dictionary<string, object>)ret["ITEMS"]; 222 Dictionary<string, object> items = (Dictionary<string, object>)ret["ITEMS"];
@@ -230,10 +239,7 @@ namespace OpenSim.Services.Connectors
230 { "ID", folder.ID.ToString() } 239 { "ID", folder.ID.ToString() }
231 }); 240 });
232 241
233 if (ret == null) 242 return CheckReturn(ret);
234 return false;
235
236 return bool.Parse(ret["RESULT"].ToString());
237 } 243 }
238 244
239 public bool UpdateFolder(InventoryFolderBase folder) 245 public bool UpdateFolder(InventoryFolderBase folder)
@@ -248,10 +254,7 @@ namespace OpenSim.Services.Connectors
248 { "ID", folder.ID.ToString() } 254 { "ID", folder.ID.ToString() }
249 }); 255 });
250 256
251 if (ret == null) 257 return CheckReturn(ret);
252 return false;
253
254 return bool.Parse(ret["RESULT"].ToString());
255 } 258 }
256 259
257 public bool MoveFolder(InventoryFolderBase folder) 260 public bool MoveFolder(InventoryFolderBase folder)
@@ -263,10 +266,7 @@ namespace OpenSim.Services.Connectors
263 { "PRINCIPAL", folder.Owner.ToString() } 266 { "PRINCIPAL", folder.Owner.ToString() }
264 }); 267 });
265 268
266 if (ret == null) 269 return CheckReturn(ret);
267 return false;
268
269 return bool.Parse(ret["RESULT"].ToString());
270 } 270 }
271 271
272 public bool DeleteFolders(UUID principalID, List<UUID> folderIDs) 272 public bool DeleteFolders(UUID principalID, List<UUID> folderIDs)
@@ -282,10 +282,7 @@ namespace OpenSim.Services.Connectors
282 { "FOLDERS", slist } 282 { "FOLDERS", slist }
283 }); 283 });
284 284
285 if (ret == null) 285 return CheckReturn(ret);
286 return false;
287
288 return bool.Parse(ret["RESULT"].ToString());
289 } 286 }
290 287
291 public bool PurgeFolder(InventoryFolderBase folder) 288 public bool PurgeFolder(InventoryFolderBase folder)
@@ -295,10 +292,7 @@ namespace OpenSim.Services.Connectors
295 { "ID", folder.ID.ToString() } 292 { "ID", folder.ID.ToString() }
296 }); 293 });
297 294
298 if (ret == null) 295 return CheckReturn(ret);
299 return false;
300
301 return bool.Parse(ret["RESULT"].ToString());
302 } 296 }
303 297
304 public bool AddItem(InventoryItemBase item) 298 public bool AddItem(InventoryItemBase item)
@@ -330,10 +324,7 @@ namespace OpenSim.Services.Connectors
330 { "CreationDate", item.CreationDate.ToString() } 324 { "CreationDate", item.CreationDate.ToString() }
331 }); 325 });
332 326
333 if (ret == null) 327 return CheckReturn(ret);
334 return false;
335
336 return bool.Parse(ret["RESULT"].ToString());
337 } 328 }
338 329
339 public bool UpdateItem(InventoryItemBase item) 330 public bool UpdateItem(InventoryItemBase item)
@@ -365,10 +356,7 @@ namespace OpenSim.Services.Connectors
365 { "CreationDate", item.CreationDate.ToString() } 356 { "CreationDate", item.CreationDate.ToString() }
366 }); 357 });
367 358
368 if (ret == null) 359 return CheckReturn(ret);
369 return false;
370
371 return bool.Parse(ret["RESULT"].ToString());
372 } 360 }
373 361
374 public bool MoveItems(UUID principalID, List<InventoryItemBase> items) 362 public bool MoveItems(UUID principalID, List<InventoryItemBase> items)
@@ -389,10 +377,7 @@ namespace OpenSim.Services.Connectors
389 { "DESTLIST", destlist } 377 { "DESTLIST", destlist }
390 }); 378 });
391 379
392 if (ret == null) 380 return CheckReturn(ret);
393 return false;
394
395 return bool.Parse(ret["RESULT"].ToString());
396 } 381 }
397 382
398 public bool DeleteItems(UUID principalID, List<UUID> itemIDs) 383 public bool DeleteItems(UUID principalID, List<UUID> itemIDs)
@@ -408,10 +393,7 @@ namespace OpenSim.Services.Connectors
408 { "ITEMS", slist } 393 { "ITEMS", slist }
409 }); 394 });
410 395
411 if (ret == null) 396 return CheckReturn(ret);
412 return false;
413
414 return bool.Parse(ret["RESULT"].ToString());
415 } 397 }
416 398
417 public InventoryItemBase GetItem(InventoryItemBase item) 399 public InventoryItemBase GetItem(InventoryItemBase item)
@@ -423,9 +405,7 @@ namespace OpenSim.Services.Connectors
423 { "ID", item.ID.ToString() } 405 { "ID", item.ID.ToString() }
424 }); 406 });
425 407
426 if (ret == null) 408 if (!CheckReturn(ret))
427 return null;
428 if (ret.Count == 0)
429 return null; 409 return null;
430 410
431 return BuildItem((Dictionary<string, object>)ret["item"]); 411 return BuildItem((Dictionary<string, object>)ret["item"]);
@@ -447,9 +427,7 @@ namespace OpenSim.Services.Connectors
447 { "ID", folder.ID.ToString() } 427 { "ID", folder.ID.ToString() }
448 }); 428 });
449 429
450 if (ret == null) 430 if (!CheckReturn(ret))
451 return null;
452 if (ret.Count == 0)
453 return null; 431 return null;
454 432
455 return BuildFolder((Dictionary<string, object>)ret["folder"]); 433 return BuildFolder((Dictionary<string, object>)ret["folder"]);
@@ -469,7 +447,7 @@ namespace OpenSim.Services.Connectors
469 { "PRINCIPAL", principalID.ToString() } 447 { "PRINCIPAL", principalID.ToString() }
470 }); 448 });
471 449
472 if (ret == null) 450 if (!CheckReturn(ret))
473 return null; 451 return null;
474 452
475 List<InventoryItemBase> items = new List<InventoryItemBase>(); 453 List<InventoryItemBase> items = new List<InventoryItemBase>();
@@ -488,10 +466,22 @@ namespace OpenSim.Services.Connectors
488 { "ASSET", assetID.ToString() } 466 { "ASSET", assetID.ToString() }
489 }); 467 });
490 468
469 // We cannot use CheckReturn() here because valid values for RESULT are "false" (in the case of request failure) or an int
491 if (ret == null) 470 if (ret == null)
492 return 0; 471 return 0;
493 472
494 return int.Parse(ret["RESULT"].ToString()); 473 if (ret.ContainsKey("RESULT"))
474 {
475 if (ret["RESULT"] is string)
476 {
477 int intResult;
478
479 if (int.TryParse ((string)ret["RESULT"], out intResult))
480 return intResult;
481 }
482 }
483
484 return 0;
495 } 485 }
496 486
497 public InventoryCollection GetUserInventory(UUID principalID) 487 public InventoryCollection GetUserInventory(UUID principalID)
@@ -508,9 +498,7 @@ namespace OpenSim.Services.Connectors
508 { "PRINCIPAL", principalID.ToString() } 498 { "PRINCIPAL", principalID.ToString() }
509 }); 499 });
510 500
511 if (ret == null) 501 if (!CheckReturn(ret))
512 return null;
513 if (ret.Count == 0)
514 return null; 502 return null;
515 503
516 Dictionary<string, object> folders = 504 Dictionary<string, object> folders =
diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
index b36fa23..245703c 100644
--- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
@@ -98,7 +98,7 @@ namespace OpenSim.Services.Connectors
98 catch (Exception e) 98 catch (Exception e)
99 { 99 {
100 m_log.WarnFormat( 100 m_log.WarnFormat(
101 "[NEIGHBOUR SERVICE CONNCTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}", 101 "[NEIGHBOUR SERVICES CONNECTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}",
102 uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); 102 uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
103 103
104 return false; 104 return false;
@@ -117,7 +117,7 @@ namespace OpenSim.Services.Connectors
117 catch (Exception e) 117 catch (Exception e)
118 { 118 {
119 m_log.WarnFormat( 119 m_log.WarnFormat(
120 "[NEIGHBOUR SERVICE CONNCTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}", 120 "[NEIGHBOUR SERVICES CONNECTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}",
121 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); 121 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
122 122
123 return false; 123 return false;
@@ -137,7 +137,7 @@ namespace OpenSim.Services.Connectors
137 catch (Exception e) 137 catch (Exception e)
138 { 138 {
139 m_log.WarnFormat( 139 m_log.WarnFormat(
140 "[NEIGHBOUR SERVICE CONNCTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}", 140 "[NEIGHBOUR SERVICES CONNECTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}",
141 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); 141 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
142 142
143 return false; 143 return false;
@@ -175,7 +175,7 @@ namespace OpenSim.Services.Connectors
175 if (webResponse == null) 175 if (webResponse == null)
176 { 176 {
177 m_log.DebugFormat( 177 m_log.DebugFormat(
178 "[REST COMMS]: Null reply on DoHelloNeighbourCall post from {0} to {1}", 178 "[NEIGHBOUR SERVICES CONNECTOR]: Null reply on DoHelloNeighbourCall post from {0} to {1}",
179 thisRegion.RegionName, region.RegionName); 179 thisRegion.RegionName, region.RegionName);
180 } 180 }
181 181
@@ -193,7 +193,7 @@ namespace OpenSim.Services.Connectors
193 catch (Exception e) 193 catch (Exception e)
194 { 194 {
195 m_log.WarnFormat( 195 m_log.WarnFormat(
196 "[NEIGHBOUR SERVICE CONNCTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}", 196 "[NEIGHBOUR SERVICES CONNECTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}",
197 region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace); 197 region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace);
198 198
199 return false; 199 return false;
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
index 74b980c..6f8d9ed 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Collections.Specialized;
30using System.IO; 31using System.IO;
31using System.Net; 32using System.Net;
32using System.Reflection; 33using System.Reflection;
@@ -122,7 +123,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
122 m_Enabled = true; 123 m_Enabled = true;
123 } 124 }
124 125
125 #region IAssetService 126#region IAssetService
126 127
127 public AssetBase Get(string id) 128 public AssetBase Get(string id)
128 { 129 {
@@ -140,8 +141,9 @@ namespace OpenSim.Services.Connectors.SimianGrid
140 return asset; 141 return asset;
141 } 142 }
142 143
143 return GetRemote(id); 144 return SimianGetOperation(id);
144 } 145 }
146
145 147
146 public AssetBase GetCached(string id) 148 public AssetBase GetCached(string id)
147 { 149 {
@@ -164,8 +166,6 @@ namespace OpenSim.Services.Connectors.SimianGrid
164 throw new InvalidOperationException(); 166 throw new InvalidOperationException();
165 } 167 }
166 168
167 AssetMetadata metadata = null;
168
169 // Cache fetch 169 // Cache fetch
170 if (m_cache != null) 170 if (m_cache != null)
171 { 171 {
@@ -174,50 +174,18 @@ namespace OpenSim.Services.Connectors.SimianGrid
174 return asset.Metadata; 174 return asset.Metadata;
175 } 175 }
176 176
177 Uri url; 177 // return GetRemoteMetadata(id);
178 178 return SimianGetMetadataOperation(id);
179 // Determine if id is an absolute URL or a grid-relative UUID
180 if (!Uri.TryCreate(id, UriKind.Absolute, out url))
181 url = new Uri(m_serverUrl + id);
182
183 try
184 {
185 HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
186 request.Method = "HEAD";
187
188 using (WebResponse response = request.GetResponse())
189 {
190 using (Stream responseStream = response.GetResponseStream())
191 {
192 // Create the metadata object
193 metadata = new AssetMetadata();
194 metadata.ContentType = response.ContentType;
195 metadata.ID = id;
196
197 UUID uuid;
198 if (UUID.TryParse(id, out uuid))
199 metadata.FullID = uuid;
200
201 string lastModifiedStr = response.Headers.Get("Last-Modified");
202 if (!String.IsNullOrEmpty(lastModifiedStr))
203 {
204 DateTime lastModified;
205 if (DateTime.TryParse(lastModifiedStr, out lastModified))
206 metadata.CreationDate = lastModified;
207 }
208 }
209 }
210 }
211 catch (Exception ex)
212 {
213 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset HEAD from " + url + " failed: " + ex.Message);
214 }
215
216 return metadata;
217 } 179 }
218 180
219 public byte[] GetData(string id) 181 public byte[] GetData(string id)
220 { 182 {
183 if (String.IsNullOrEmpty(m_serverUrl))
184 {
185 m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured");
186 throw new InvalidOperationException();
187 }
188
221 AssetBase asset = Get(id); 189 AssetBase asset = Get(id);
222 190
223 if (asset != null) 191 if (asset != null)
@@ -255,7 +223,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
255 Util.FireAndForget( 223 Util.FireAndForget(
256 delegate(object o) 224 delegate(object o)
257 { 225 {
258 AssetBase asset = GetRemote(id); 226 AssetBase asset = SimianGetOperation(id);
259 handler(id, sender, asset); 227 handler(id, sender, asset);
260 } 228 }
261 ); 229 );
@@ -278,7 +246,6 @@ namespace OpenSim.Services.Connectors.SimianGrid
278 } 246 }
279 247
280 bool storedInCache = false; 248 bool storedInCache = false;
281 string errorMessage = null;
282 249
283 // AssetID handling 250 // AssetID handling
284 if (String.IsNullOrEmpty(asset.ID) || asset.ID == ZeroID) 251 if (String.IsNullOrEmpty(asset.ID) || asset.ID == ZeroID)
@@ -307,83 +274,9 @@ namespace OpenSim.Services.Connectors.SimianGrid
307 return asset.ID; 274 return asset.ID;
308 } 275 }
309 276
310 // Distinguish public and private assets 277 return SimianStoreOperation(asset);
311 bool isPublic = true;
312 switch ((AssetType)asset.Type)
313 {
314 case AssetType.CallingCard:
315 case AssetType.Gesture:
316 case AssetType.LSLBytecode:
317 case AssetType.LSLText:
318 isPublic = false;
319 break;
320 }
321
322 // Make sure ContentType is set
323 if (String.IsNullOrEmpty(asset.Metadata.ContentType))
324 asset.Metadata.ContentType = SLUtil.SLAssetTypeToContentType(asset.Type);
325
326 // Build the remote storage request
327 List<MultipartForm.Element> postParameters = new List<MultipartForm.Element>()
328 {
329 new MultipartForm.Parameter("AssetID", asset.FullID.ToString()),
330 new MultipartForm.Parameter("CreatorID", asset.Metadata.CreatorID),
331 new MultipartForm.Parameter("Temporary", asset.Temporary ? "1" : "0"),
332 new MultipartForm.Parameter("Public", isPublic ? "1" : "0"),
333 new MultipartForm.File("Asset", asset.Name, asset.Metadata.ContentType, asset.Data)
334 };
335
336 // Make the remote storage request
337 try
338 {
339 // Simian does not require the asset ID to be in the URL because it's in the post data.
340 // By appending it to the URL also, we allow caching proxies (squid) to invalidate asset URLs
341 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl + asset.FullID.ToString());
342
343 using (HttpWebResponse response = MultipartForm.Post(request, postParameters))
344 {
345 using (Stream responseStream = response.GetResponseStream())
346 {
347 string responseStr = null;
348
349 try
350 {
351 responseStr = responseStream.GetStreamString();
352 OSD responseOSD = OSDParser.Deserialize(responseStr);
353 if (responseOSD.Type == OSDType.Map)
354 {
355 OSDMap responseMap = (OSDMap)responseOSD;
356 if (responseMap["Success"].AsBoolean())
357 return asset.ID;
358 else
359 errorMessage = "Upload failed: " + responseMap["Message"].AsString();
360 }
361 else
362 {
363 errorMessage = "Response format was invalid:\n" + responseStr;
364 }
365 }
366 catch (Exception ex)
367 {
368 if (!String.IsNullOrEmpty(responseStr))
369 errorMessage = "Failed to parse the response:\n" + responseStr;
370 else
371 errorMessage = "Failed to retrieve the response: " + ex.Message;
372 }
373 }
374 }
375 }
376 catch (WebException ex)
377 {
378 errorMessage = ex.Message;
379 }
380
381 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: Failed to store asset \"{0}\" ({1}, {2}): {3}",
382 asset.Name, asset.ID, asset.Metadata.ContentType, errorMessage);
383
384 return null;
385 } 278 }
386 279
387 /// <summary> 280 /// <summary>
388 /// Update an asset's content 281 /// Update an asset's content
389 /// </summary> 282 /// </summary>
@@ -393,11 +286,17 @@ namespace OpenSim.Services.Connectors.SimianGrid
393 /// <returns></returns> 286 /// <returns></returns>
394 public bool UpdateContent(string id, byte[] data) 287 public bool UpdateContent(string id, byte[] data)
395 { 288 {
289 if (String.IsNullOrEmpty(m_serverUrl))
290 {
291 m_log.Error("[SIMIAN ASSET CONNECTOR]: No AssetServerURI configured");
292 throw new InvalidOperationException();
293 }
294
396 AssetBase asset = Get(id); 295 AssetBase asset = Get(id);
397 296
398 if (asset == null) 297 if (asset == null)
399 { 298 {
400 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Failed to fetch asset " + id + " for updating"); 299 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: Failed to fetch asset {0} for updating", id);
401 return false; 300 return false;
402 } 301 }
403 302
@@ -420,83 +319,347 @@ namespace OpenSim.Services.Connectors.SimianGrid
420 throw new InvalidOperationException(); 319 throw new InvalidOperationException();
421 } 320 }
422 321
423 //string errorMessage = String.Empty;
424 string url = m_serverUrl + id;
425
426 if (m_cache != null) 322 if (m_cache != null)
427 m_cache.Expire(id); 323 m_cache.Expire(id);
428 324
325 return SimianDeleteOperation(id);
326 }
327
328#endregion IAssetService
329
330#region SimianOperations
331 /// <summary>
332 /// Invokes the xRemoveAsset operation on the simian server to delete an asset
333 /// </summary>
334 /// <param name="id"></param>
335 /// <returns></returns>
336 private bool SimianDeleteOperation(string id)
337 {
429 try 338 try
430 { 339 {
431 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 340 NameValueCollection requestArgs = new NameValueCollection
432 request.Method = "DELETE"; 341 {
342 { "RequestMethod", "xRemoveAsset" },
343 { "AssetID", id }
344 };
433 345
434 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 346 OSDMap response = SimianGrid.PostToService(m_serverUrl,requestArgs);
347 if (! response["Success"].AsBoolean())
435 { 348 {
436 if (response.StatusCode != HttpStatusCode.NoContent) 349 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: failed to delete asset; {0}",response["Message"].AsString());
437 { 350 return false;
438 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Unexpected response when deleting asset " + url + ": " +
439 response.StatusCode + " (" + response.StatusDescription + ")");
440 }
441 } 351 }
442 352
443 return true; 353 return true;
354
444 } 355 }
445 catch (Exception ex) 356 catch (Exception ex)
446 { 357 {
447 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Failed to delete asset " + id + " from the asset service: " + ex.Message); 358 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: failed to delete asset {0}; {1}", id, ex.Message);
448 return false;
449 } 359 }
450 }
451 360
452 #endregion IAssetService 361 return false;
362 }
453 363
454 private AssetBase GetRemote(string id) 364 /// <summary>
365 /// Invokes the xAddAsset operation on the simian server to create or update an asset
366 /// </summary>
367 /// <param name="id"></param>
368 /// <returns></returns>
369 private string SimianStoreOperation(AssetBase asset)
455 { 370 {
456 AssetBase asset = null; 371 try
457 Uri url; 372 {
373 NameValueCollection requestArgs = new NameValueCollection
374 {
375 { "RequestMethod", "xAddAsset" },
376 { "ContentType", asset.Metadata.ContentType },
377 { "EncodedData", Convert.ToBase64String(asset.Data) },
378 { "AssetID", asset.FullID.ToString() },
379 { "CreatorID", asset.Metadata.CreatorID },
380 { "Temporary", asset.Temporary ? "1" : "0" },
381 { "Name", asset.Name }
382 };
383
384 OSDMap response = SimianGrid.PostToService(m_serverUrl,requestArgs);
385 if (! response["Success"].AsBoolean())
386 {
387 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR] failed to store asset; {0}",response["Message"].AsString());
388 return null;
389 }
458 390
459 // Determine if id is an absolute URL or a grid-relative UUID 391 // asset.ID is always set before calling this function
460 if (!Uri.TryCreate(id, UriKind.Absolute, out url)) 392 return asset.ID;
461 url = new Uri(m_serverUrl + id); 393
394 }
395 catch (Exception ex)
396 {
397 m_log.ErrorFormat("[SIMIAN ASSET CONNECTOR] failed to store asset; {0}",ex.Message);
398 }
399
400 return null;
401 }
462 402
463 try 403 /// <summary>
404 /// Invokes the xGetAsset operation on the simian server to get data associated with an asset
405 /// </summary>
406 /// <param name="id"></param>
407 /// <returns></returns>
408 private AssetBase SimianGetOperation(string id)
409 {
410 try
464 { 411 {
465 HttpWebRequest request = UntrustedHttpWebRequest.Create(url); 412 NameValueCollection requestArgs = new NameValueCollection
413 {
414 { "RequestMethod", "xGetAsset" },
415 { "ID", id }
416 };
466 417
467 using (WebResponse response = request.GetResponse()) 418 OSDMap response = SimianGrid.PostToService(m_serverUrl,requestArgs);
419 if (! response["Success"].AsBoolean())
468 { 420 {
469 using (Stream responseStream = response.GetResponseStream()) 421 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR] Failed to get asset; {0}",response["Message"].AsString());
470 { 422 return null;
471 string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
472
473 // Create the asset object
474 asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
475
476 UUID assetID;
477 if (UUID.TryParse(id, out assetID))
478 asset.FullID = assetID;
479
480 // Grab the asset data from the response stream
481 using (MemoryStream stream = new MemoryStream())
482 {
483 responseStream.CopyStream(stream, Int32.MaxValue);
484 asset.Data = stream.ToArray();
485 }
486 }
487 } 423 }
424
425 AssetBase asset = new AssetBase();
488 426
489 // Cache store 427 asset.ID = id;
490 if (m_cache != null && asset != null) 428 asset.Name = String.Empty;
491 m_cache.Cache(asset); 429 asset.Metadata.ContentType = response["ContentType"].AsString(); // this will also set the asset Type property
430 asset.CreatorID = response["CreatorID"].AsString();
431 asset.Data = System.Convert.FromBase64String(response["EncodedData"].AsString());
432 asset.Local = false;
433 asset.Temporary = response["Temporary"];
492 434
493 return asset; 435 return asset;
494 } 436 }
495 catch (Exception ex) 437 catch (Exception ex)
496 { 438 {
497 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message); 439 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: failed to retrieve asset {0}; {1}", id, ex.Message);
498 return null;
499 } 440 }
441
442 return null;
443 }
444
445 /// <summary>
446 /// Invokes the xGetAssetMetadata operation on the simian server to retrieve metadata for an asset
447 /// This operation is generally used to determine if an asset exists in the database
448 /// </summary>
449 /// <param name="id"></param>
450 /// <returns></returns>
451 private AssetMetadata SimianGetMetadataOperation(string id)
452 {
453 try
454 {
455 NameValueCollection requestArgs = new NameValueCollection
456 {
457 { "RequestMethod", "xGetAssetMetadata" },
458 { "ID", id }
459 };
460
461 OSDMap response = SimianGrid.PostToService(m_serverUrl,requestArgs);
462 if (! response["Success"].AsBoolean())
463 {
464 // this is not really an error, this call is used to test existence
465 // m_log.DebugFormat("[SIMIAN ASSET CONNECTOR] Failed to get asset metadata; {0}",response["Message"].AsString());
466 return null;
467 }
468
469 AssetMetadata metadata = new AssetMetadata();
470 metadata.ID = id;
471 metadata.ContentType = response["ContentType"].AsString();
472 metadata.CreatorID = response["CreatorID"].AsString();
473 metadata.Local = false;
474 metadata.Temporary = response["Temporary"];
475
476 string lastModifiedStr = response["Last-Modified"].AsString();
477 if (! String.IsNullOrEmpty(lastModifiedStr))
478 {
479 DateTime lastModified;
480 if (DateTime.TryParse(lastModifiedStr, out lastModified))
481 metadata.CreationDate = lastModified;
482 }
483
484 return metadata;
485 }
486 catch (Exception ex)
487 {
488 m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: Failed to get asset metadata; {0}", ex.Message);
489 }
490
491 return null;
500 } 492 }
493#endregion
494
495 // private AssetMetadata GetRemoteMetadata(string id)
496 // {
497 // Uri url;
498 // AssetMetadata metadata = null;
499
500 // // Determine if id is an absolute URL or a grid-relative UUID
501 // if (!Uri.TryCreate(id, UriKind.Absolute, out url))
502 // url = new Uri(m_serverUrl + id);
503
504 // try
505 // {
506 // HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
507 // request.Method = "HEAD";
508
509 // using (WebResponse response = request.GetResponse())
510 // {
511 // using (Stream responseStream = response.GetResponseStream())
512 // {
513 // // Create the metadata object
514 // metadata = new AssetMetadata();
515 // metadata.ContentType = response.ContentType;
516 // metadata.ID = id;
517
518 // UUID uuid;
519 // if (UUID.TryParse(id, out uuid))
520 // metadata.FullID = uuid;
521
522 // string lastModifiedStr = response.Headers.Get("Last-Modified");
523 // if (!String.IsNullOrEmpty(lastModifiedStr))
524 // {
525 // DateTime lastModified;
526 // if (DateTime.TryParse(lastModifiedStr, out lastModified))
527 // metadata.CreationDate = lastModified;
528 // }
529 // }
530 // }
531 // }
532 // catch (Exception ex)
533 // {
534 // m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset HEAD from " + url + " failed: " + ex.Message);
535 // }
536
537 // return metadata;
538 // }
539
540 // private AssetBase GetRemote(string id)
541 // {
542 // AssetBase asset = null;
543 // Uri url;
544
545 // // Determine if id is an absolute URL or a grid-relative UUID
546 // if (!Uri.TryCreate(id, UriKind.Absolute, out url))
547 // url = new Uri(m_serverUrl + id);
548
549 // try
550 // {
551 // HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
552
553 // using (WebResponse response = request.GetResponse())
554 // {
555 // using (Stream responseStream = response.GetResponseStream())
556 // {
557 // string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
558
559 // // Create the asset object
560 // asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
561
562 // UUID assetID;
563 // if (UUID.TryParse(id, out assetID))
564 // asset.FullID = assetID;
565
566 // // Grab the asset data from the response stream
567 // using (MemoryStream stream = new MemoryStream())
568 // {
569 // responseStream.CopyStream(stream, Int32.MaxValue);
570 // asset.Data = stream.ToArray();
571 // }
572 // }
573 // }
574
575 // // Cache store
576 // if (m_cache != null && asset != null)
577 // m_cache.Cache(asset);
578
579 // return asset;
580 // }
581 // catch (Exception ex)
582 // {
583 // m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message);
584 // return null;
585 // }
586 // }
587
588 // private string StoreRemote(AssetBase asset)
589 // {
590 // // Distinguish public and private assets
591 // bool isPublic = true;
592 // switch ((AssetType)asset.Type)
593 // {
594 // case AssetType.CallingCard:
595 // case AssetType.Gesture:
596 // case AssetType.LSLBytecode:
597 // case AssetType.LSLText:
598 // isPublic = false;
599 // break;
600 // }
601
602 // string errorMessage = null;
603
604 // // Build the remote storage request
605 // List<MultipartForm.Element> postParameters = new List<MultipartForm.Element>()
606 // {
607 // new MultipartForm.Parameter("AssetID", asset.FullID.ToString()),
608 // new MultipartForm.Parameter("CreatorID", asset.Metadata.CreatorID),
609 // new MultipartForm.Parameter("Temporary", asset.Temporary ? "1" : "0"),
610 // new MultipartForm.Parameter("Public", isPublic ? "1" : "0"),
611 // new MultipartForm.File("Asset", asset.Name, asset.Metadata.ContentType, asset.Data)
612 // };
613
614 // // Make the remote storage request
615 // try
616 // {
617 // // Simian does not require the asset ID to be in the URL because it's in the post data.
618 // // By appending it to the URL also, we allow caching proxies (squid) to invalidate asset URLs
619 // HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl + asset.FullID.ToString());
620
621 // using (HttpWebResponse response = MultipartForm.Post(request, postParameters))
622 // {
623 // using (Stream responseStream = response.GetResponseStream())
624 // {
625 // string responseStr = null;
626
627 // try
628 // {
629 // responseStr = responseStream.GetStreamString();
630 // OSD responseOSD = OSDParser.Deserialize(responseStr);
631 // if (responseOSD.Type == OSDType.Map)
632 // {
633 // OSDMap responseMap = (OSDMap)responseOSD;
634 // if (responseMap["Success"].AsBoolean())
635 // return asset.ID;
636 // else
637 // errorMessage = "Upload failed: " + responseMap["Message"].AsString();
638 // }
639 // else
640 // {
641 // errorMessage = "Response format was invalid:\n" + responseStr;
642 // }
643 // }
644 // catch (Exception ex)
645 // {
646 // if (!String.IsNullOrEmpty(responseStr))
647 // errorMessage = "Failed to parse the response:\n" + responseStr;
648 // else
649 // errorMessage = "Failed to retrieve the response: " + ex.Message;
650 // }
651 // }
652 // }
653 // }
654 // catch (WebException ex)
655 // {
656 // errorMessage = ex.Message;
657 // }
658
659 // m_log.WarnFormat("[SIMIAN ASSET CONNECTOR]: Failed to store asset \"{0}\" ({1}, {2}): {3}",
660 // asset.Name, asset.ID, asset.Metadata.ContentType, errorMessage);
661
662 // return null;
663 // }
501 } 664 }
502} 665}
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs
index 03b19ae..c402907 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs
@@ -116,7 +116,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
116 { "UserID", principalID.ToString() } 116 { "UserID", principalID.ToString() }
117 }; 117 };
118 118
119 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 119 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
120 if (response["Success"].AsBoolean() && response["Identities"] is OSDArray) 120 if (response["Success"].AsBoolean() && response["Identities"] is OSDArray)
121 { 121 {
122 bool md5hashFound = false; 122 bool md5hashFound = false;
@@ -159,7 +159,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
159 { "SessionID", token } 159 { "SessionID", token }
160 }; 160 };
161 161
162 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 162 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
163 if (response["Success"].AsBoolean()) 163 if (response["Success"].AsBoolean())
164 { 164 {
165 return true; 165 return true;
@@ -181,7 +181,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
181 { "UserID", principalID.ToString() } 181 { "UserID", principalID.ToString() }
182 }; 182 };
183 183
184 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 184 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
185 if (response["Success"].AsBoolean()) 185 if (response["Success"].AsBoolean())
186 { 186 {
187 return true; 187 return true;
@@ -204,7 +204,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
204 { "UserID", principalID.ToString() } 204 { "UserID", principalID.ToString() }
205 }; 205 };
206 206
207 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 207 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
208 if (response["Success"].AsBoolean() && response["User"] is OSDMap) 208 if (response["Success"].AsBoolean() && response["User"] is OSDMap)
209 { 209 {
210 OSDMap userMap = (OSDMap)response["User"]; 210 OSDMap userMap = (OSDMap)response["User"];
@@ -224,7 +224,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
224 { "UserID", principalID.ToString() } 224 { "UserID", principalID.ToString() }
225 }; 225 };
226 226
227 response = WebUtil.PostToService(m_serverUrl, requestArgs); 227 response = SimianGrid.PostToService(m_serverUrl, requestArgs);
228 bool success = response["Success"].AsBoolean(); 228 bool success = response["Success"].AsBoolean();
229 229
230 if (!success) 230 if (!success)
@@ -303,7 +303,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
303 { "UserID", userID.ToString() } 303 { "UserID", userID.ToString() }
304 }; 304 };
305 305
306 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 306 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
307 if (response["Success"].AsBoolean()) 307 if (response["Success"].AsBoolean())
308 return response["SessionID"].AsUUID().ToString(); 308 return response["SessionID"].AsUUID().ToString();
309 else 309 else
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
index 841bfa0..a397740 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
@@ -122,7 +122,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
122 { "UserID", userID.ToString() } 122 { "UserID", userID.ToString() }
123 }; 123 };
124 124
125 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 125 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
126 if (response["Success"].AsBoolean()) 126 if (response["Success"].AsBoolean())
127 { 127 {
128 OSDMap map = null; 128 OSDMap map = null;
@@ -168,7 +168,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
168 { "LLPackedAppearance", OSDParser.SerializeJsonString(map) } 168 { "LLPackedAppearance", OSDParser.SerializeJsonString(map) }
169 }; 169 };
170 170
171 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 171 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
172 bool success = response["Success"].AsBoolean(); 172 bool success = response["Success"].AsBoolean();
173 173
174 if (! success) 174 if (! success)
@@ -189,7 +189,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
189 { "UserID", userID.ToString() } 189 { "UserID", userID.ToString() }
190 }; 190 };
191 191
192 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 192 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
193 if (response["Success"].AsBoolean()) 193 if (response["Success"].AsBoolean())
194 { 194 {
195 OSDMap map = null; 195 OSDMap map = null;
@@ -306,7 +306,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
306 { "LLAttachments", OSDParser.SerializeJsonString(items) } 306 { "LLAttachments", OSDParser.SerializeJsonString(items) }
307 }; 307 };
308 308
309 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 309 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
310 bool success = response["Success"].AsBoolean(); 310 bool success = response["Success"].AsBoolean();
311 311
312 if (!success) 312 if (!success)
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs b/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs
new file mode 100644
index 0000000..764e71f
--- /dev/null
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianExternalCapsModule.cs
@@ -0,0 +1,180 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using System.IO;
33using System.Web;
34
35using log4net;
36using Nini.Config;
37using Mono.Addins;
38
39using OpenMetaverse;
40using OpenMetaverse.StructuredData;
41
42using OpenSim.Framework;
43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes;
45using OpenSim.Services.Interfaces;
46using Caps = OpenSim.Framework.Capabilities.Caps;
47
48namespace OpenSim.Services.Connectors.SimianGrid
49{
50 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SimianExternalCapsModule")]
51 public class SimianExternalCapsModule : INonSharedRegionModule, IExternalCapsModule
52 {
53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54
55 private bool m_enabled = true;
56 private Scene m_scene;
57 private String m_simianURL;
58
59#region IRegionModule Members
60
61 public string Name
62 {
63 get { return this.GetType().Name; }
64 }
65
66 public void Initialise(IConfigSource config)
67 {
68 try
69 {
70 IConfig m_config;
71
72 if ((m_config = config.Configs["SimianExternalCaps"]) != null)
73 {
74 m_enabled = m_config.GetBoolean("Enabled", m_enabled);
75 if ((m_config = config.Configs["SimianGrid"]) != null)
76 {
77 m_simianURL = m_config.GetString("SimianServiceURL");
78 if (String.IsNullOrEmpty(m_simianURL))
79 {
80 //m_log.DebugFormat("[SimianGrid] service URL is not defined");
81 m_enabled = false;
82 return;
83 }
84 }
85 }
86 else
87 m_enabled = false;
88 }
89 catch (Exception e)
90 {
91 m_log.ErrorFormat("[SimianExternalCaps] initialization error: {0}",e.Message);
92 return;
93 }
94 }
95
96 public void PostInitialise() { }
97 public void Close() { }
98
99 public void AddRegion(Scene scene)
100 {
101 if (! m_enabled)
102 return;
103
104 m_scene = scene;
105 m_scene.RegisterModuleInterface<IExternalCapsModule>(this);
106 }
107
108 public void RemoveRegion(Scene scene)
109 {
110 if (! m_enabled)
111 return;
112
113 m_scene.EventManager.OnRegisterCaps -= RegisterCapsEventHandler;
114 m_scene.EventManager.OnDeregisterCaps -= DeregisterCapsEventHandler;
115 }
116
117 public void RegionLoaded(Scene scene)
118 {
119 if (! m_enabled)
120 return;
121
122 m_scene.EventManager.OnRegisterCaps += RegisterCapsEventHandler;
123 m_scene.EventManager.OnDeregisterCaps += DeregisterCapsEventHandler;
124 }
125
126 public Type ReplaceableInterface
127 {
128 get { return null; }
129 }
130
131#endregion
132
133#region IExternalCapsModule
134 // Eg http://grid.sciencesim.com/GridPublic/%CAP%/%OP%/"
135 public bool RegisterExternalUserCapsHandler(UUID agentID, Caps caps, String capName, String urlSkel)
136 {
137 UUID cap = UUID.Random();
138
139 // Call to simian to register the cap we generated
140 // NameValueCollection requestArgs = new NameValueCollection
141 // {
142 // { "RequestMethod", "AddCapability" },
143 // { "Resource", "user" },
144 // { "Expiration", 0 },
145 // { "OwnerID", agentID.ToString() },
146 // { "CapabilityID", cap.ToString() }
147 // };
148
149 // OSDMap response = SimianGrid.PostToService(m_simianURL, requestArgs);
150
151 Dictionary<String,String> subs = new Dictionary<String,String>();
152 subs["%OP%"] = capName;
153 subs["%USR%"] = agentID.ToString();
154 subs["%CAP%"] = cap.ToString();
155 subs["%SIM%"] = m_scene.RegionInfo.RegionID.ToString();
156
157 caps.RegisterHandler(capName,ExpandSkeletonURL(urlSkel,subs));
158 return true;
159 }
160
161#endregion
162
163#region EventHandlers
164 public void RegisterCapsEventHandler(UUID agentID, Caps caps) { }
165 public void DeregisterCapsEventHandler(UUID agentID, Caps caps) { }
166#endregion
167
168 private String ExpandSkeletonURL(String urlSkel, Dictionary<String,String> subs)
169 {
170 String result = urlSkel;
171
172 foreach (KeyValuePair<String,String> kvp in subs)
173 {
174 result = result.Replace(kvp.Key,kvp.Value);
175 }
176
177 return result;
178 }
179 }
180} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs
index 7422d94..9a8164c 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs
@@ -153,7 +153,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
153 { "Value", flags.ToString() } 153 { "Value", flags.ToString() }
154 }; 154 };
155 155
156 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 156 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
157 bool success = response["Success"].AsBoolean(); 157 bool success = response["Success"].AsBoolean();
158 158
159 if (!success) 159 if (!success)
@@ -180,7 +180,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
180 { "Key", friend } 180 { "Key", friend }
181 }; 181 };
182 182
183 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 183 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
184 bool success = response["Success"].AsBoolean(); 184 bool success = response["Success"].AsBoolean();
185 185
186 if (!success) 186 if (!success)
@@ -200,7 +200,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
200 { "Type", "Friend" } 200 { "Type", "Friend" }
201 }; 201 };
202 202
203 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 203 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
204 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray) 204 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray)
205 { 205 {
206 return (OSDArray)response["Entries"]; 206 return (OSDArray)response["Entries"];
@@ -221,7 +221,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
221 { "Type", "Friend" } 221 { "Type", "Friend" }
222 }; 222 };
223 223
224 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 224 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
225 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray) 225 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray)
226 { 226 {
227 return (OSDArray)response["Entries"]; 227 return (OSDArray)response["Entries"];
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs
index 847319c..9898da9 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs
@@ -26,8 +26,122 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic;
30using System.Collections.Specialized;
31using System.Reflection;
32using log4net;
29using Mono.Addins; 33using Mono.Addins;
30using Nini.Config; 34using Nini.Config;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Services.Interfaces;
39using OpenMetaverse;
40using OpenMetaverse.StructuredData;
31 41
32[assembly: Addin("SimianGrid", "1.0")] 42[assembly: Addin("SimianGrid", "1.0")]
33[assembly: AddinDependency("OpenSim", "0.5")] 43[assembly: AddinDependency("OpenSim", "0.5")]
44
45namespace OpenSim.Services.Connectors.SimianGrid
46{
47 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SimianExternalCapsModule")]
48 public class SimianGrid : ISharedRegionModule
49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51
52 private IConfig m_config = null;
53
54 private String m_simianURL;
55
56#region IRegionModule Members
57
58 public string Name
59 {
60 get { return this.GetType().Name; }
61 }
62
63 public void Initialise(IConfigSource config)
64 {
65 try
66 {
67 m_config = config.Configs["SimianGrid"];
68
69 if (m_config != null)
70 {
71 m_simianURL = m_config.GetString("SimianServiceURL");
72 if (String.IsNullOrEmpty(m_simianURL))
73 {
74 // m_log.DebugFormat("[SimianGrid] service URL is not defined");
75 return;
76 }
77
78 InitialiseSimCap();
79 SimulatorCapability = SimulatorCapability.Trim();
80 m_log.InfoFormat("[SimianExternalCaps] using {0} as simulator capability",SimulatorCapability);
81 }
82 }
83 catch (Exception e)
84 {
85 m_log.ErrorFormat("[SimianExternalCaps] initialization error: {0}",e.Message);
86 return;
87 }
88 }
89
90 public void PostInitialise() { }
91 public void Close() { }
92 public void AddRegion(Scene scene) { }
93 public void RemoveRegion(Scene scene) { }
94 public void RegionLoaded(Scene scene) { }
95
96 public Type ReplaceableInterface
97 {
98 get { return null; }
99 }
100
101 ///<summary>
102 /// Try a variety of methods for finding the simian simulator capability; first check the
103 /// configuration itself, then look for a file that contains the cap, then finally look
104 /// for an environment variable that contains it.
105 ///</summary>
106 private void InitialiseSimCap()
107 {
108 if (m_config.Contains("SimulatorCapability"))
109 {
110 SimulatorCapability = m_config.GetString("SimulatorCapability");
111 return;
112 }
113
114 if (m_config.Contains("SimulatorCapabilityFile"))
115 {
116 String filename = m_config.GetString("SimulatorCapabilityFile");
117 if (System.IO.File.Exists(filename))
118 {
119 SimulatorCapability = System.IO.File.ReadAllText(filename);
120 return;
121 }
122 }
123
124 if (m_config.Contains("SimulatorCapabilityVariable"))
125 {
126 String envname = m_config.GetString("SimulatorCapabilityVariable");
127 String envvalue = System.Environment.GetEnvironmentVariable(envname);
128 if (envvalue != null)
129 {
130 SimulatorCapability = envvalue;
131 return;
132 }
133 }
134
135 m_log.WarnFormat("[SimianExternalCaps] no method specified for simulator capability");
136 }
137
138#endregion
139
140 public static String SimulatorCapability = UUID.Zero.ToString();
141 public static OSDMap PostToService(string url, NameValueCollection data)
142 {
143 data["cap"] = SimulatorCapability;
144 return WebUtil.PostToService(url, data);
145 }
146 }
147} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs
index 93fdae3..b999509 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Collections.Specialized;
30using System.Reflection; 31using System.Reflection;
31using System.Net; 32using System.Net;
32using System.IO; 33using System.IO;
@@ -43,7 +44,8 @@ using OpenSim.Region.Framework.Scenes;
43using OpenMetaverse; 44using OpenMetaverse;
44using OpenMetaverse.StructuredData; 45using OpenMetaverse.StructuredData;
45 46
46namespace OpenSim.Region.OptionalModules.Simian 47//namespace OpenSim.Region.OptionalModules.Simian
48namespace OpenSim.Services.Connectors.SimianGrid
47{ 49{
48 /// <summary> 50 /// <summary>
49 /// </summary> 51 /// </summary>
@@ -196,67 +198,84 @@ namespace OpenSim.Region.OptionalModules.Simian
196 } 198 }
197 } 199 }
198 200
199 List<MultipartForm.Element> postParameters = new List<MultipartForm.Element>() 201 NameValueCollection requestArgs = new NameValueCollection
202 {
203 { "RequestMethod", "xAddMapTile" },
204 { "X", scene.RegionInfo.RegionLocX.ToString() },
205 { "Y", scene.RegionInfo.RegionLocY.ToString() },
206 { "ContentType", "image/png" },
207 { "EncodedData", System.Convert.ToBase64String(pngData) }
208 };
209
210 OSDMap response = SimianGrid.PostToService(m_serverUrl,requestArgs);
211 if (! response["Success"].AsBoolean())
200 { 212 {
201 new MultipartForm.Parameter("X", scene.RegionInfo.RegionLocX.ToString()), 213 m_log.WarnFormat("[SIMIAN MAPTILE] failed to store map tile; {0}",response["Message"].AsString());
202 new MultipartForm.Parameter("Y", scene.RegionInfo.RegionLocY.ToString()), 214 return;
203 new MultipartForm.File("Tile", "tile.png", "image/png", pngData) 215 }
204 };
205 216
206 string errorMessage = null; 217 // List<MultipartForm.Element> postParameters = new List<MultipartForm.Element>()
207 int tickstart = Util.EnvironmentTickCount(); 218 // {
219 // new MultipartForm.Parameter("X", scene.RegionInfo.RegionLocX.ToString()),
220 // new MultipartForm.Parameter("Y", scene.RegionInfo.RegionLocY.ToString()),
221 // new MultipartForm.File("Tile", "tile.png", "image/png", pngData)
222 // };
208 223
209 // Make the remote storage request 224 // string errorMessage = null;
210 try 225 // int tickstart = Util.EnvironmentTickCount();
211 {
212 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl);
213 request.Timeout = 20000;
214 request.ReadWriteTimeout = 5000;
215 226
216 using (HttpWebResponse response = MultipartForm.Post(request, postParameters)) 227 // // Make the remote storage request
217 { 228 // try
218 using (Stream responseStream = response.GetResponseStream()) 229 // {
219 { 230 // HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl);
220 string responseStr = responseStream.GetStreamString(); 231 // request.Timeout = 20000;
221 OSD responseOSD = OSDParser.Deserialize(responseStr); 232 // request.ReadWriteTimeout = 5000;
222 if (responseOSD.Type == OSDType.Map)
223 {
224 OSDMap responseMap = (OSDMap)responseOSD;
225 if (responseMap["Success"].AsBoolean())
226 return;
227 233
228 errorMessage = "Upload failed: " + responseMap["Message"].AsString(); 234 // using (HttpWebResponse response = MultipartForm.Post(request, postParameters))
229 } 235 // {
230 else 236 // using (Stream responseStream = response.GetResponseStream())
231 { 237 // {
232 errorMessage = "Response format was invalid:\n" + responseStr; 238 // string responseStr = responseStream.GetStreamString();
233 } 239 // OSD responseOSD = OSDParser.Deserialize(responseStr);
234 } 240 // if (responseOSD.Type == OSDType.Map)
235 } 241 // {
236 } 242 // OSDMap responseMap = (OSDMap)responseOSD;
237 catch (WebException we) 243 // if (responseMap["Success"].AsBoolean())
238 { 244 // return;
239 errorMessage = we.Message; 245
240 if (we.Status == WebExceptionStatus.ProtocolError) 246 // errorMessage = "Upload failed: " + responseMap["Message"].AsString();
241 { 247 // }
242 HttpWebResponse webResponse = (HttpWebResponse)we.Response; 248 // else
243 errorMessage = String.Format("[{0}] {1}", 249 // {
244 webResponse.StatusCode,webResponse.StatusDescription); 250 // errorMessage = "Response format was invalid:\n" + responseStr;
245 } 251 // }
246 } 252 // }
247 catch (Exception ex) 253 // }
248 { 254 // }
249 errorMessage = ex.Message; 255 // catch (WebException we)
250 } 256 // {
251 finally 257 // errorMessage = we.Message;
252 { 258 // if (we.Status == WebExceptionStatus.ProtocolError)
253 // This just dumps a warning for any operation that takes more than 100 ms 259 // {
254 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 260 // HttpWebResponse webResponse = (HttpWebResponse)we.Response;
255 m_log.DebugFormat("[SIMIAN MAPTILE]: map tile uploaded in {0}ms",tickdiff); 261 // errorMessage = String.Format("[{0}] {1}",
256 } 262 // webResponse.StatusCode,webResponse.StatusDescription);
263 // }
264 // }
265 // catch (Exception ex)
266 // {
267 // errorMessage = ex.Message;
268 // }
269 // finally
270 // {
271 // // This just dumps a warning for any operation that takes more than 100 ms
272 // int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
273 // m_log.DebugFormat("[SIMIAN MAPTILE]: map tile uploaded in {0}ms",tickdiff);
274 // }
275
276 // m_log.WarnFormat("[SIMIAN MAPTILE]: Failed to store {0} byte tile for {1}: {2}",
277 // pngData.Length, scene.RegionInfo.RegionName, errorMessage);
257 278
258 m_log.WarnFormat("[SIMIAN MAPTILE]: Failed to store {0} byte tile for {1}: {2}",
259 pngData.Length, scene.RegionInfo.RegionName, errorMessage);
260 } 279 }
261 } 280 }
262} \ No newline at end of file 281} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
index 20eaa3a..36a5182 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
@@ -140,7 +140,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
140 { "ExtraData", OSDParser.SerializeJsonString(extraData) } 140 { "ExtraData", OSDParser.SerializeJsonString(extraData) }
141 }; 141 };
142 142
143 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 143 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
144 if (response["Success"].AsBoolean()) 144 if (response["Success"].AsBoolean())
145 return String.Empty; 145 return String.Empty;
146 else 146 else
@@ -156,7 +156,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
156 { "Enabled", "0" } 156 { "Enabled", "0" }
157 }; 157 };
158 158
159 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 159 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
160 bool success = response["Success"].AsBoolean(); 160 bool success = response["Success"].AsBoolean();
161 161
162 if (!success) 162 if (!success)
@@ -203,7 +203,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
203 203
204 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region with uuid {0}",regionID.ToString()); 204 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region with uuid {0}",regionID.ToString());
205 205
206 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 206 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
207 if (response["Success"].AsBoolean()) 207 if (response["Success"].AsBoolean())
208 { 208 {
209 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] uuid request successful {0}",response["Name"].AsString()); 209 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] uuid request successful {0}",response["Name"].AsString());
@@ -231,7 +231,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
231 231
232 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request grid at {0}",position.ToString()); 232 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request grid at {0}",position.ToString());
233 233
234 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 234 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
235 if (response["Success"].AsBoolean()) 235 if (response["Success"].AsBoolean())
236 { 236 {
237 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] position request successful {0}",response["Name"].AsString()); 237 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] position request successful {0}",response["Name"].AsString());
@@ -272,7 +272,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
272 272
273 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions with name {0}",name); 273 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions with name {0}",name);
274 274
275 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 275 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
276 if (response["Success"].AsBoolean()) 276 if (response["Success"].AsBoolean())
277 { 277 {
278 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name); 278 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name);
@@ -310,7 +310,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
310 //m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString()); 310 //m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString());
311 311
312 312
313 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 313 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
314 if (response["Success"].AsBoolean()) 314 if (response["Success"].AsBoolean())
315 { 315 {
316 OSDArray array = response["Scenes"] as OSDArray; 316 OSDArray array = response["Scenes"] as OSDArray;
@@ -341,6 +341,12 @@ namespace OpenSim.Services.Connectors.SimianGrid
341 return new List<GridRegion>(0); 341 return new List<GridRegion>(0);
342 } 342 }
343 343
344 public List<GridRegion> GetDefaultHypergridRegions(UUID scopeID)
345 {
346 // TODO: Allow specifying the default grid location
347 return GetDefaultRegions(scopeID);
348 }
349
344 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) 350 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y)
345 { 351 {
346 GridRegion defRegion = GetNearestRegion(new Vector3d(x, y, 0.0), true); 352 GridRegion defRegion = GetNearestRegion(new Vector3d(x, y, 0.0), true);
@@ -361,7 +367,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
361 { "Enabled", "1" } 367 { "Enabled", "1" }
362 }; 368 };
363 369
364 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 370 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
365 if (response["Success"].AsBoolean()) 371 if (response["Success"].AsBoolean())
366 { 372 {
367 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name); 373 // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name);
@@ -391,7 +397,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
391 397
392 m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString()); 398 m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString());
393 399
394 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 400 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
395 if (response["Success"].AsBoolean()) 401 if (response["Success"].AsBoolean())
396 { 402 {
397 OSDMap extraData = response["ExtraData"] as OSDMap; 403 OSDMap extraData = response["ExtraData"] as OSDMap;
@@ -498,7 +504,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
498 if (onlyEnabled) 504 if (onlyEnabled)
499 requestArgs["Enabled"] = "1"; 505 requestArgs["Enabled"] = "1";
500 506
501 OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); 507 OSDMap response = SimianGrid.PostToService(m_ServerURI, requestArgs);
502 if (response["Success"].AsBoolean()) 508 if (response["Success"].AsBoolean())
503 { 509 {
504 return ResponseToGridRegion(response); 510 return ResponseToGridRegion(response);
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs
index 36325ce..97eaabe 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs
@@ -156,7 +156,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
156 { "OwnerID", userID.ToString() } 156 { "OwnerID", userID.ToString() }
157 }; 157 };
158 158
159 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 159 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
160 bool success = response["Success"].AsBoolean(); 160 bool success = response["Success"].AsBoolean();
161 161
162 if (!success) 162 if (!success)
@@ -182,7 +182,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
182 { "ChildrenOnly", "0" } 182 { "ChildrenOnly", "0" }
183 }; 183 };
184 184
185 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 185 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
186 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 186 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
187 { 187 {
188 OSDArray items = (OSDArray)response["Items"]; 188 OSDArray items = (OSDArray)response["Items"];
@@ -244,7 +244,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
244 { "ChildrenOnly", "1" } 244 { "ChildrenOnly", "1" }
245 }; 245 };
246 246
247 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 247 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
248 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 248 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
249 { 249 {
250 OSDArray items = (OSDArray)response["Items"]; 250 OSDArray items = (OSDArray)response["Items"];
@@ -274,7 +274,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
274 { "OwnerID", userID.ToString() } 274 { "OwnerID", userID.ToString() }
275 }; 275 };
276 276
277 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 277 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
278 if (response["Success"].AsBoolean() && response["Folder"] is OSDMap) 278 if (response["Success"].AsBoolean() && response["Folder"] is OSDMap)
279 { 279 {
280 OSDMap folder = (OSDMap)response["Folder"]; 280 OSDMap folder = (OSDMap)response["Folder"];
@@ -312,7 +312,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
312 { "ChildrenOnly", "1" } 312 { "ChildrenOnly", "1" }
313 }; 313 };
314 314
315 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 315 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
316 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 316 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
317 { 317 {
318 List<InventoryItemBase> items = GetItemsFromResponse((OSDArray)response["Items"]); 318 List<InventoryItemBase> items = GetItemsFromResponse((OSDArray)response["Items"]);
@@ -349,7 +349,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
349 { "ChildrenOnly", "1" } 349 { "ChildrenOnly", "1" }
350 }; 350 };
351 351
352 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 352 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
353 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 353 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
354 { 354 {
355 OSDArray items = (OSDArray)response["Items"]; 355 OSDArray items = (OSDArray)response["Items"];
@@ -383,7 +383,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
383 { "ChildrenOnly", "1" } 383 { "ChildrenOnly", "1" }
384 }; 384 };
385 385
386 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 386 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
387 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 387 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
388 { 388 {
389 OSDArray items = (OSDArray)response["Items"]; 389 OSDArray items = (OSDArray)response["Items"];
@@ -423,7 +423,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
423 { "ChildrenOnly", "1" } 423 { "ChildrenOnly", "1" }
424 }; 424 };
425 425
426 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 426 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
427 if (response["Success"].AsBoolean() && response["Items"] is OSDArray) 427 if (response["Success"].AsBoolean() && response["Items"] is OSDArray)
428 { 428 {
429 OSDArray items = (OSDArray)response["Items"]; 429 OSDArray items = (OSDArray)response["Items"];
@@ -454,7 +454,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
454 { "ContentType", SLUtil.SLAssetTypeToContentType(folder.Type) } 454 { "ContentType", SLUtil.SLAssetTypeToContentType(folder.Type) }
455 }; 455 };
456 456
457 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 457 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
458 bool success = response["Success"].AsBoolean(); 458 bool success = response["Success"].AsBoolean();
459 459
460 if (!success) 460 if (!success)
@@ -518,7 +518,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
518 { "ItemID", itemID.ToString() } 518 { "ItemID", itemID.ToString() }
519 }; 519 };
520 520
521 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 521 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
522 bool success = response["Success"].AsBoolean(); 522 bool success = response["Success"].AsBoolean();
523 523
524 if (!success) 524 if (!success)
@@ -546,7 +546,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
546 { "FolderID", folder.ID.ToString() } 546 { "FolderID", folder.ID.ToString() }
547 }; 547 };
548 548
549 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 549 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
550 bool success = response["Success"].AsBoolean(); 550 bool success = response["Success"].AsBoolean();
551 551
552 if (!success) 552 if (!success)
@@ -623,7 +623,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
623 { "ExtraData", OSDParser.SerializeJsonString(extraData) } 623 { "ExtraData", OSDParser.SerializeJsonString(extraData) }
624 }; 624 };
625 625
626 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 626 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
627 bool success = response["Success"].AsBoolean(); 627 bool success = response["Success"].AsBoolean();
628 628
629 if (!success) 629 if (!success)
@@ -847,7 +847,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
847 { "Items", String.Join(",", itemIDs) } 847 { "Items", String.Join(",", itemIDs) }
848 }; 848 };
849 849
850 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 850 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
851 bool success = response["Success"].AsBoolean(); 851 bool success = response["Success"].AsBoolean();
852 852
853 if (!success) 853 if (!success)
@@ -885,7 +885,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
885 { "UserID", userID.ToString() } 885 { "UserID", userID.ToString() }
886 }; 886 };
887 887
888 OSDMap response = WebUtil.PostToService(m_userServerUrl, requestArgs); 888 OSDMap response = SimianGrid.PostToService(m_userServerUrl, requestArgs);
889 if (response["Success"].AsBoolean()) 889 if (response["Success"].AsBoolean())
890 { 890 {
891 OSDMap user = response["User"] as OSDMap; 891 OSDMap user = response["User"] as OSDMap;
@@ -916,7 +916,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
916 { "Gestures", OSDParser.SerializeJsonString(gestures) } 916 { "Gestures", OSDParser.SerializeJsonString(gestures) }
917 }; 917 };
918 918
919 OSDMap response = WebUtil.PostToService(m_userServerUrl, requestArgs); 919 OSDMap response = SimianGrid.PostToService(m_userServerUrl, requestArgs);
920 if (!response["Success"].AsBoolean()) 920 if (!response["Success"].AsBoolean())
921 { 921 {
922 m_log.Warn("[SIMIAN INVENTORY CONNECTOR]: Failed to save active gestures for " + userID + ": " + 922 m_log.Warn("[SIMIAN INVENTORY CONNECTOR]: Failed to save active gestures for " + userID + ": " +
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
index 854bea4..211b775 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs
@@ -65,7 +65,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
65 public void PostInitialise() { } 65 public void PostInitialise() { }
66 public void Close() { } 66 public void Close() { }
67 67
68 public SimianPresenceServiceConnector() { m_activityDetector = new SimianActivityDetector(this); } 68 public SimianPresenceServiceConnector() { }
69 public string Name { get { return "SimianPresenceServiceConnector"; } } 69 public string Name { get { return "SimianPresenceServiceConnector"; } }
70 public void AddRegion(Scene scene) 70 public void AddRegion(Scene scene)
71 { 71 {
@@ -121,6 +121,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
121 if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) 121 if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("="))
122 serviceUrl = serviceUrl + '/'; 122 serviceUrl = serviceUrl + '/';
123 m_serverUrl = serviceUrl; 123 m_serverUrl = serviceUrl;
124 m_activityDetector = new SimianActivityDetector(this);
124 m_Enabled = true; 125 m_Enabled = true;
125 } 126 }
126 } 127 }
@@ -137,17 +138,18 @@ namespace OpenSim.Services.Connectors.SimianGrid
137 userID, sessionID, secureSessionID); 138 userID, sessionID, secureSessionID);
138 139
139 NameValueCollection requestArgs = new NameValueCollection 140 NameValueCollection requestArgs = new NameValueCollection
140 { 141 {
141 { "RequestMethod", "AddSession" }, 142 { "RequestMethod", "AddSession" },
142 { "UserID", userID.ToString() } 143 { "UserID", userID.ToString() }
143 }; 144 };
145
144 if (sessionID != UUID.Zero) 146 if (sessionID != UUID.Zero)
145 { 147 {
146 requestArgs["SessionID"] = sessionID.ToString(); 148 requestArgs["SessionID"] = sessionID.ToString();
147 requestArgs["SecureSessionID"] = secureSessionID.ToString(); 149 requestArgs["SecureSessionID"] = secureSessionID.ToString();
148 } 150 }
149 151
150 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 152 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
151 bool success = response["Success"].AsBoolean(); 153 bool success = response["Success"].AsBoolean();
152 154
153 if (!success) 155 if (!success)
@@ -158,15 +160,15 @@ namespace OpenSim.Services.Connectors.SimianGrid
158 160
159 public bool LogoutAgent(UUID sessionID) 161 public bool LogoutAgent(UUID sessionID)
160 { 162 {
161// m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for agent with sessionID " + sessionID); 163 // m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for agent with sessionID " + sessionID);
162 164
163 NameValueCollection requestArgs = new NameValueCollection 165 NameValueCollection requestArgs = new NameValueCollection
164 { 166 {
165 { "RequestMethod", "RemoveSession" }, 167 { "RequestMethod", "RemoveSession" },
166 { "SessionID", sessionID.ToString() } 168 { "SessionID", sessionID.ToString() }
167 }; 169 };
168 170
169 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 171 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
170 bool success = response["Success"].AsBoolean(); 172 bool success = response["Success"].AsBoolean();
171 173
172 if (!success) 174 if (!success)
@@ -177,15 +179,15 @@ namespace OpenSim.Services.Connectors.SimianGrid
177 179
178 public bool LogoutRegionAgents(UUID regionID) 180 public bool LogoutRegionAgents(UUID regionID)
179 { 181 {
180// m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for all agents in region " + regionID); 182 // m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for all agents in region " + regionID);
181 183
182 NameValueCollection requestArgs = new NameValueCollection 184 NameValueCollection requestArgs = new NameValueCollection
183 { 185 {
184 { "RequestMethod", "RemoveSessions" }, 186 { "RequestMethod", "RemoveSessions" },
185 { "SceneID", regionID.ToString() } 187 { "SceneID", regionID.ToString() }
186 }; 188 };
187 189
188 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 190 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
189 bool success = response["Success"].AsBoolean(); 191 bool success = response["Success"].AsBoolean();
190 192
191 if (!success) 193 if (!success)
@@ -202,49 +204,46 @@ namespace OpenSim.Services.Connectors.SimianGrid
202 204
203 public PresenceInfo GetAgent(UUID sessionID) 205 public PresenceInfo GetAgent(UUID sessionID)
204 { 206 {
205// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent with sessionID " + sessionID); 207 OSDMap sessionResponse = GetSessionDataFromSessionID(sessionID);
206 208 if (sessionResponse == null)
207 NameValueCollection requestArgs = new NameValueCollection
208 {
209 { "RequestMethod", "GetSession" },
210 { "SessionID", sessionID.ToString() }
211 };
212
213 OSDMap sessionResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
214 if (sessionResponse["Success"].AsBoolean())
215 { 209 {
216 UUID userID = sessionResponse["UserID"].AsUUID(); 210 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session {0}: {1}",sessionID.ToString(),sessionResponse["Message"].AsString());
217 m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID); 211 return null;
218
219 requestArgs = new NameValueCollection
220 {
221 { "RequestMethod", "GetUser" },
222 { "UserID", userID.ToString() }
223 };
224
225 OSDMap userResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
226 if (userResponse["Success"].AsBoolean())
227 return ResponseToPresenceInfo(sessionResponse, userResponse);
228 else
229 m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + userResponse["Message"].AsString());
230 } 212 }
231 else 213
214 UUID userID = sessionResponse["UserID"].AsUUID();
215 OSDMap userResponse = GetUserData(userID);
216 if (userResponse == null)
232 { 217 {
233 m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session " + sessionID + ": " + sessionResponse["Message"].AsString()); 218 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}: {1}",userID.ToString(),userResponse["Message"].AsString());
219 return null;
234 } 220 }
235 221
236 return null; 222 return ResponseToPresenceInfo(sessionResponse);
237 } 223 }
238 224
239 public PresenceInfo[] GetAgents(string[] userIDs) 225 public PresenceInfo[] GetAgents(string[] userIDs)
240 { 226 {
241 List<PresenceInfo> presences = new List<PresenceInfo>(userIDs.Length); 227 List<PresenceInfo> presences = new List<PresenceInfo>();
228
229 NameValueCollection requestArgs = new NameValueCollection
230 {
231 { "RequestMethod", "GetSessions" },
232 { "UserIDList", String.Join(",",userIDs) }
233 };
242 234
243 for (int i = 0; i < userIDs.Length; i++) 235 OSDMap sessionListResponse = SimianGrid.PostToService(m_serverUrl, requestArgs);
236 if (! sessionListResponse["Success"].AsBoolean())
244 { 237 {
245 UUID userID; 238 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve sessions: {0}",sessionListResponse["Message"].AsString());
246 if (UUID.TryParse(userIDs[i], out userID) && userID != UUID.Zero) 239 return null;
247 presences.AddRange(GetSessions(userID)); 240 }
241
242 OSDArray sessionList = sessionListResponse["Sessions"] as OSDArray;
243 for (int i = 0; i < sessionList.Count; i++)
244 {
245 OSDMap sessionInfo = sessionList[i] as OSDMap;
246 presences.Add(ResponseToPresenceInfo(sessionInfo));
248 } 247 }
249 248
250 return presences.ToArray(); 249 return presences.ToArray();
@@ -262,7 +261,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
262 261
263 public bool LoggedOut(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) 262 public bool LoggedOut(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt)
264 { 263 {
265// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Logging out user " + userID); 264 // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Logging out user " + userID);
266 265
267 // Remove the session to mark this user offline 266 // Remove the session to mark this user offline
268 if (!LogoutAgent(sessionID)) 267 if (!LogoutAgent(sessionID))
@@ -270,13 +269,13 @@ namespace OpenSim.Services.Connectors.SimianGrid
270 269
271 // Save our last position as user data 270 // Save our last position as user data
272 NameValueCollection requestArgs = new NameValueCollection 271 NameValueCollection requestArgs = new NameValueCollection
273 { 272 {
274 { "RequestMethod", "AddUserData" }, 273 { "RequestMethod", "AddUserData" },
275 { "UserID", userID.ToString() }, 274 { "UserID", userID.ToString() },
276 { "LastLocation", SerializeLocation(regionID, lastPosition, lastLookAt) } 275 { "LastLocation", SerializeLocation(regionID, lastPosition, lastLookAt) }
277 }; 276 };
278 277
279 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 278 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
280 bool success = response["Success"].AsBoolean(); 279 bool success = response["Success"].AsBoolean();
281 280
282 if (!success) 281 if (!success)
@@ -287,16 +286,16 @@ namespace OpenSim.Services.Connectors.SimianGrid
287 286
288 public bool SetHome(string userID, UUID regionID, Vector3 position, Vector3 lookAt) 287 public bool SetHome(string userID, UUID regionID, Vector3 position, Vector3 lookAt)
289 { 288 {
290// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Setting home location for user " + userID); 289 // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Setting home location for user " + userID);
291 290
292 NameValueCollection requestArgs = new NameValueCollection 291 NameValueCollection requestArgs = new NameValueCollection
293 { 292 {
294 { "RequestMethod", "AddUserData" }, 293 { "RequestMethod", "AddUserData" },
295 { "UserID", userID.ToString() }, 294 { "UserID", userID.ToString() },
296 { "HomeLocation", SerializeLocation(regionID, position, lookAt) } 295 { "HomeLocation", SerializeLocation(regionID, position, lookAt) }
297 }; 296 };
298 297
299 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 298 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
300 bool success = response["Success"].AsBoolean(); 299 bool success = response["Success"].AsBoolean();
301 300
302 if (!success) 301 if (!success)
@@ -312,24 +311,19 @@ namespace OpenSim.Services.Connectors.SimianGrid
312 311
313 public GridUserInfo GetGridUserInfo(string user) 312 public GridUserInfo GetGridUserInfo(string user)
314 { 313 {
315// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent " + user); 314 // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent " + user);
316 315
317 UUID userID = new UUID(user); 316 UUID userID = new UUID(user);
318// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID); 317 OSDMap userResponse = GetUserData(userID);
319 318
320 NameValueCollection requestArgs = new NameValueCollection 319 if (userResponse == null)
321 { 320 {
322 { "RequestMethod", "GetUser" }, 321 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}", userID);
323 { "UserID", userID.ToString() } 322 }
324 };
325 323
326 OSDMap userResponse = WebUtil.PostToService(m_serverUrl, requestArgs); 324 // Note that ResponseToGridUserInfo properly checks for and returns a null if passed a null.
327 if (userResponse["Success"].AsBoolean()) 325 return ResponseToGridUserInfo(userResponse);
328 return ResponseToGridUserInfo(userResponse);
329 else
330 m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + userResponse["Message"].AsString());
331 326
332 return null;
333 } 327 }
334 328
335 #endregion 329 #endregion
@@ -338,67 +332,51 @@ namespace OpenSim.Services.Connectors.SimianGrid
338 332
339 private OSDMap GetUserData(UUID userID) 333 private OSDMap GetUserData(UUID userID)
340 { 334 {
341// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID); 335 // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID);
342 336
343 NameValueCollection requestArgs = new NameValueCollection 337 NameValueCollection requestArgs = new NameValueCollection
344 { 338 {
345 { "RequestMethod", "GetUser" }, 339 { "RequestMethod", "GetUser" },
346 { "UserID", userID.ToString() } 340 { "UserID", userID.ToString() }
347 }; 341 };
348 342
349 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 343 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
350 if (response["Success"].AsBoolean() && response["User"] is OSDMap) 344 if (response["Success"].AsBoolean() && response["User"] is OSDMap)
351 return response; 345 return response;
352 else
353 m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + response["Message"].AsString());
354 346
347 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}; {1}",userID.ToString(),response["Message"].AsString());
355 return null; 348 return null;
356 } 349 }
357 350
358 private List<PresenceInfo> GetSessions(UUID userID) 351 private OSDMap GetSessionDataFromSessionID(UUID sessionID)
359 { 352 {
360 List<PresenceInfo> presences = new List<PresenceInfo>(1); 353 NameValueCollection requestArgs = new NameValueCollection
361
362 OSDMap userResponse = GetUserData(userID);
363 if (userResponse != null)
364 {
365// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting sessions for " + userID);
366
367 NameValueCollection requestArgs = new NameValueCollection
368 { 354 {
369 { "RequestMethod", "GetSession" }, 355 { "RequestMethod", "GetSession" },
370 { "UserID", userID.ToString() } 356 { "SessionID", sessionID.ToString() }
371 }; 357 };
372 358
373 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 359 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
374 if (response["Success"].AsBoolean()) 360 if (response["Success"].AsBoolean())
375 { 361 return response;
376 PresenceInfo presence = ResponseToPresenceInfo(response, userResponse);
377 if (presence != null)
378 presences.Add(presence);
379 }
380// else
381// {
382// m_log.Debug("[SIMIAN PRESENCE CONNECTOR]: No session returned for " + userID + ": " + response["Message"].AsString());
383// }
384 }
385 362
386 return presences; 363 m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session data for {0}; {1}",sessionID.ToString(),response["Message"].AsString());
364 return null;
387 } 365 }
388 366
389 private bool UpdateSession(UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) 367 private bool UpdateSession(UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt)
390 { 368 {
391 // Save our current location as session data 369 // Save our current location as session data
392 NameValueCollection requestArgs = new NameValueCollection 370 NameValueCollection requestArgs = new NameValueCollection
393 { 371 {
394 { "RequestMethod", "UpdateSession" }, 372 { "RequestMethod", "UpdateSession" },
395 { "SessionID", sessionID.ToString() }, 373 { "SessionID", sessionID.ToString() },
396 { "SceneID", regionID.ToString() }, 374 { "SceneID", regionID.ToString() },
397 { "ScenePosition", lastPosition.ToString() }, 375 { "ScenePosition", lastPosition.ToString() },
398 { "SceneLookAt", lastLookAt.ToString() } 376 { "SceneLookAt", lastLookAt.ToString() }
399 }; 377 };
400 378
401 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 379 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
402 bool success = response["Success"].AsBoolean(); 380 bool success = response["Success"].AsBoolean();
403 381
404 if (!success) 382 if (!success)
@@ -407,7 +385,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
407 return success; 385 return success;
408 } 386 }
409 387
410 private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse, OSDMap userResponse) 388 private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse)
411 { 389 {
412 if (sessionResponse == null) 390 if (sessionResponse == null)
413 return null; 391 return null;
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs
index bd8069f..684a0db 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs
@@ -392,7 +392,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
392 { "UserID", client.AgentId.ToString() } 392 { "UserID", client.AgentId.ToString() }
393 }; 393 };
394 394
395 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 395 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
396 string email = response["Email"].AsString(); 396 string email = response["Email"].AsString();
397 397
398 if (!response["Success"].AsBoolean()) 398 if (!response["Success"].AsBoolean())
@@ -443,7 +443,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
443 { key, OSDParser.SerializeJsonString(value) } 443 { key, OSDParser.SerializeJsonString(value) }
444 }; 444 };
445 445
446 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 446 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
447 bool success = response["Success"].AsBoolean(); 447 bool success = response["Success"].AsBoolean();
448 448
449 if (!success) 449 if (!success)
@@ -462,7 +462,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
462 { "UserID", userID.ToString() } 462 { "UserID", userID.ToString() }
463 }; 463 };
464 464
465 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 465 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
466 if (response["Success"].AsBoolean() && response["User"] is OSDMap) 466 if (response["Success"].AsBoolean() && response["User"] is OSDMap)
467 { 467 {
468 return (OSDMap)response["User"]; 468 return (OSDMap)response["User"];
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs
index fcb5115..fdc8697 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs
@@ -165,7 +165,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
165 { "NameQuery", query } 165 { "NameQuery", query }
166 }; 166 };
167 167
168 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 168 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
169 if (response["Success"].AsBoolean()) 169 if (response["Success"].AsBoolean())
170 { 170 {
171 OSDArray array = response["Users"] as OSDArray; 171 OSDArray array = response["Users"] as OSDArray;
@@ -209,7 +209,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
209 { "AccessLevel", data.UserLevel.ToString() } 209 { "AccessLevel", data.UserLevel.ToString() }
210 }; 210 };
211 211
212 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 212 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
213 213
214 if (response["Success"].AsBoolean()) 214 if (response["Success"].AsBoolean())
215 { 215 {
@@ -224,7 +224,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
224 { "UserTitle", data.UserTitle } 224 { "UserTitle", data.UserTitle }
225 }; 225 };
226 226
227 response = WebUtil.PostToService(m_serverUrl, requestArgs); 227 response = SimianGrid.PostToService(m_serverUrl, requestArgs);
228 bool success = response["Success"].AsBoolean(); 228 bool success = response["Success"].AsBoolean();
229 229
230 if (success) 230 if (success)
@@ -257,7 +257,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
257 string lookupValue = (requestArgs.Count > 1) ? requestArgs[1] : "(Unknown)"; 257 string lookupValue = (requestArgs.Count > 1) ? requestArgs[1] : "(Unknown)";
258// m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Looking up user account with query: " + lookupValue); 258// m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Looking up user account with query: " + lookupValue);
259 259
260 OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); 260 OSDMap response = SimianGrid.PostToService(m_serverUrl, requestArgs);
261 if (response["Success"].AsBoolean()) 261 if (response["Success"].AsBoolean())
262 { 262 {
263 OSDMap user = response["User"] as OSDMap; 263 OSDMap user = response["User"] as OSDMap;
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index ef2494a..0e74073 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -79,11 +79,27 @@ namespace OpenSim.Services.Connectors.Simulation
79 return "agent/"; 79 return "agent/";
80 } 80 }
81 81
82 protected virtual void PackData(OSDMap args, AgentCircuitData aCircuit, GridRegion destination, uint flags)
83 {
84 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
85 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
86 args["destination_name"] = OSD.FromString(destination.RegionName);
87 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
88 args["teleport_flags"] = OSD.FromString(flags.ToString());
89 }
90
82 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) 91 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
83 { 92 {
84 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start"); 93 string tmp = String.Empty;
85 94 return CreateAgent(destination, aCircuit, flags, out tmp, out reason);
95 }
96
97 public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
98 {
99 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI);
86 reason = String.Empty; 100 reason = String.Empty;
101 myipaddress = String.Empty;
102
87 if (destination == null) 103 if (destination == null)
88 { 104 {
89 reason = "Destination not found"; 105 reason = "Destination not found";
@@ -96,12 +112,7 @@ namespace OpenSim.Services.Connectors.Simulation
96 try 112 try
97 { 113 {
98 OSDMap args = aCircuit.PackAgentCircuitData(); 114 OSDMap args = aCircuit.PackAgentCircuitData();
99 115 PackData(args, aCircuit, destination, flags);
100 args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
101 args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
102 args["destination_name"] = OSD.FromString(destination.RegionName);
103 args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
104 args["teleport_flags"] = OSD.FromString(flags.ToString());
105 116
106 OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000); 117 OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000);
107 bool success = result["success"].AsBoolean(); 118 bool success = result["success"].AsBoolean();
@@ -111,6 +122,7 @@ namespace OpenSim.Services.Connectors.Simulation
111 122
112 reason = data["reason"].AsString(); 123 reason = data["reason"].AsString();
113 success = data["success"].AsBoolean(); 124 success = data["success"].AsBoolean();
125 myipaddress = data["your_ip"].AsString();
114 return success; 126 return success;
115 } 127 }
116 128
@@ -125,6 +137,7 @@ namespace OpenSim.Services.Connectors.Simulation
125 137
126 reason = data["reason"].AsString(); 138 reason = data["reason"].AsString();
127 success = data["success"].AsBoolean(); 139 success = data["success"].AsBoolean();
140 myipaddress = data["your_ip"].AsString();
128 m_log.WarnFormat( 141 m_log.WarnFormat(
129 "[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName); 142 "[REMOTE SIMULATION CONNECTOR]: Remote simulator {0} did not accept compressed transfer, suggest updating it.", destination.RegionName);
130 return success; 143 return success;
@@ -229,7 +242,7 @@ namespace OpenSim.Services.Connectors.Simulation
229 /// </summary> 242 /// </summary>
230 private bool UpdateAgent(GridRegion destination, IAgentData cAgentData, int timeout) 243 private bool UpdateAgent(GridRegion destination, IAgentData cAgentData, int timeout)
231 { 244 {
232 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start"); 245 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent in {0}", destination.ServerURI);
233 246
234 // Eventually, we want to use a caps url instead of the agentID 247 // Eventually, we want to use a caps url instead of the agentID
235 string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/"; 248 string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/";
@@ -259,41 +272,6 @@ namespace OpenSim.Services.Connectors.Simulation
259 return false; 272 return false;
260 } 273 }
261 274
262 /// <summary>
263 /// Not sure what sequence causes this function to be invoked. The only calling
264 /// path is through the GET method
265 /// </summary>
266 public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
267 {
268 // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start");
269
270 agent = null;
271
272 // Eventually, we want to use a caps url instead of the agentID
273 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
274
275 try
276 {
277 OSDMap result = WebUtil.GetFromService(uri, 10000);
278 if (result["Success"].AsBoolean())
279 {
280 // OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
281 OSDMap args = (OSDMap)result["_Result"];
282 if (args != null)
283 {
284 agent = new CompleteAgentData();
285 agent.Unpack(args, null);
286 return true;
287 }
288 }
289 }
290 catch (Exception e)
291 {
292 m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
293 }
294
295 return false;
296 }
297 275
298 /// <summary> 276 /// <summary>
299 /// </summary> 277 /// </summary>
@@ -392,35 +370,25 @@ namespace OpenSim.Services.Connectors.Simulation
392 return true; 370 return true;
393 } 371 }
394 372
395 private bool CloseAgent(GridRegion destination, UUID id, bool ChildOnly) 373 /// <summary>
374 /// </summary>
375 public bool CloseAgent(GridRegion destination, UUID id, string auth_code)
396 { 376 {
397// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start"); 377 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/?auth=" + auth_code;
398 Util.FireAndForget(x => { 378 m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent {0}", uri);
399 string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
400 379
401 try 380 try
402 { 381 {
403 WebUtil.ServiceOSDRequest(uri, null, "DELETE", 10000, false); 382 WebUtil.ServiceOSDRequest(uri, null, "DELETE", 10000, false);
404 } 383 }
405 catch (Exception e) 384 catch (Exception e)
406 { 385 {
407 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CloseAgent failed with exception; {0}",e.ToString()); 386 m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CloseAgent failed with exception; {0}",e.ToString());
408 } 387 }
409 });
410 388
411 return true; 389 return true;
412 } 390 }
413 391
414 public bool CloseChildAgent(GridRegion destination, UUID id)
415 {
416 return CloseAgent(destination, id, true);
417 }
418
419 public bool CloseAgent(GridRegion destination, UUID id)
420 {
421 return CloseAgent(destination, id, false);
422 }
423
424 #endregion Agents 392 #endregion Agents
425 393
426 #region Objects 394 #region Objects
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index daebf8b..e72b7f9 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -86,7 +86,7 @@ namespace OpenSim.Services.GridService
86 { 86 {
87 MainConsole.Instance.Commands.AddCommand("Regions", true, 87 MainConsole.Instance.Commands.AddCommand("Regions", true,
88 "deregister region id", 88 "deregister region id",
89 "deregister region id <Region UUID>", 89 "deregister region id <region-id>+",
90 "Deregister a region manually.", 90 "Deregister a region manually.",
91 String.Empty, 91 String.Empty,
92 HandleDeregisterRegion); 92 HandleDeregisterRegion);
@@ -265,8 +265,9 @@ namespace OpenSim.Services.GridService
265 m_log.DebugFormat("[GRID SERVICE]: Database exception: {0}", e); 265 m_log.DebugFormat("[GRID SERVICE]: Database exception: {0}", e);
266 } 266 }
267 267
268 m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) registered successfully at {2}-{3}", 268 m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) registered successfully at {2}-{3} with flags {4}",
269 regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionCoordX, regionInfos.RegionCoordY); 269 regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionCoordX, regionInfos.RegionCoordY,
270 (OpenSim.Framework.RegionFlags)flags);
270 271
271 return String.Empty; 272 return String.Empty;
272 } 273 }
@@ -478,6 +479,33 @@ namespace OpenSim.Services.GridService
478 return ret; 479 return ret;
479 } 480 }
480 481
482 public List<GridRegion> GetDefaultHypergridRegions(UUID scopeID)
483 {
484 List<GridRegion> ret = new List<GridRegion>();
485
486 List<RegionData> regions = m_Database.GetDefaultHypergridRegions(scopeID);
487
488 foreach (RegionData r in regions)
489 {
490 if ((Convert.ToInt32(r.Data["flags"]) & (int)OpenSim.Framework.RegionFlags.RegionOnline) != 0)
491 ret.Add(RegionData2RegionInfo(r));
492 }
493
494 int hgDefaultRegionsFoundOnline = regions.Count;
495
496 // For now, hypergrid default regions will always be given precedence but we will also return simple default
497 // regions in case no specific hypergrid regions are specified.
498 ret.AddRange(GetDefaultRegions(scopeID));
499
500 int normalDefaultRegionsFoundOnline = ret.Count - hgDefaultRegionsFoundOnline;
501
502 m_log.DebugFormat(
503 "[GRID SERVICE]: GetDefaultHypergridRegions returning {0} hypergrid default and {1} normal default regions",
504 hgDefaultRegionsFoundOnline, normalDefaultRegionsFoundOnline);
505
506 return ret;
507 }
508
481 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) 509 public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y)
482 { 510 {
483 List<GridRegion> ret = new List<GridRegion>(); 511 List<GridRegion> ret = new List<GridRegion>();
@@ -526,40 +554,41 @@ namespace OpenSim.Services.GridService
526 554
527 private void HandleDeregisterRegion(string module, string[] cmd) 555 private void HandleDeregisterRegion(string module, string[] cmd)
528 { 556 {
529 if (cmd.Length != 4) 557 if (cmd.Length < 4)
530 { 558 {
531 MainConsole.Instance.Output("Syntax: degregister region id <Region UUID>"); 559 MainConsole.Instance.Output("Usage: degregister region id <region-id>+");
532 return; 560 return;
533 } 561 }
534 562
535 string rawRegionUuid = cmd[3]; 563 for (int i = 3; i < cmd.Length; i++)
536 UUID regionUuid;
537
538 if (!UUID.TryParse(rawRegionUuid, out regionUuid))
539 { 564 {
540 MainConsole.Instance.OutputFormat("{0} is not a valid region uuid", rawRegionUuid); 565 string rawRegionUuid = cmd[i];
541 return; 566 UUID regionUuid;
542 }
543 567
544 GridRegion region = GetRegionByUUID(UUID.Zero, regionUuid); 568 if (!UUID.TryParse(rawRegionUuid, out regionUuid))
569 {
570 MainConsole.Instance.OutputFormat("{0} is not a valid region uuid", rawRegionUuid);
571 return;
572 }
545 573
546 if (region == null) 574 GridRegion region = GetRegionByUUID(UUID.Zero, regionUuid);
547 {
548 MainConsole.Instance.OutputFormat("No region with UUID {0}", regionUuid);
549 return;
550 }
551 575
552 if (DeregisterRegion(regionUuid)) 576 if (region == null)
553 { 577 {
554 MainConsole.Instance.OutputFormat("Deregistered {0} {1}", region.RegionName, regionUuid); 578 MainConsole.Instance.OutputFormat("No region with UUID {0}", regionUuid);
555 } 579 return;
556 else 580 }
557 {
558 // I don't think this can ever occur if we know that the region exists.
559 MainConsole.Instance.OutputFormat("Error deregistering {0} {1}", region.RegionName, regionUuid);
560 }
561 581
562 return; 582 if (DeregisterRegion(regionUuid))
583 {
584 MainConsole.Instance.OutputFormat("Deregistered {0} {1}", region.RegionName, regionUuid);
585 }
586 else
587 {
588 // I don't think this can ever occur if we know that the region exists.
589 MainConsole.Instance.OutputFormat("Error deregistering {0} {1}", region.RegionName, regionUuid);
590 }
591 }
563 } 592 }
564 593
565 private void HandleShowRegions(string module, string[] cmd) 594 private void HandleShowRegions(string module, string[] cmd)
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs
index 8335724..4024295 100644
--- a/OpenSim/Services/GridService/HypergridLinker.cs
+++ b/OpenSim/Services/GridService/HypergridLinker.cs
@@ -79,7 +79,7 @@ namespace OpenSim.Services.GridService
79 { 79 {
80 if (m_DefaultRegion == null) 80 if (m_DefaultRegion == null)
81 { 81 {
82 List<GridRegion> defs = m_GridService.GetDefaultRegions(m_ScopeID); 82 List<GridRegion> defs = m_GridService.GetDefaultHypergridRegions(m_ScopeID);
83 if (defs != null && defs.Count > 0) 83 if (defs != null && defs.Count > 0)
84 m_DefaultRegion = defs[0]; 84 m_DefaultRegion = defs[0];
85 else 85 else
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs
index 97a0afc..f6136b5 100644
--- a/OpenSim/Services/HypergridService/GatekeeperService.cs
+++ b/OpenSim/Services/HypergridService/GatekeeperService.cs
@@ -58,6 +58,7 @@ namespace OpenSim.Services.HypergridService
58 private static IUserAgentService m_UserAgentService; 58 private static IUserAgentService m_UserAgentService;
59 private static ISimulationService m_SimulationService; 59 private static ISimulationService m_SimulationService;
60 private static IGridUserService m_GridUserService; 60 private static IGridUserService m_GridUserService;
61 private static IBansService m_BansService;
61 62
62 private static string m_AllowedClients = string.Empty; 63 private static string m_AllowedClients = string.Empty;
63 private static string m_DeniedClients = string.Empty; 64 private static string m_DeniedClients = string.Empty;
@@ -87,6 +88,7 @@ namespace OpenSim.Services.HypergridService
87 string presenceService = serverConfig.GetString("PresenceService", String.Empty); 88 string presenceService = serverConfig.GetString("PresenceService", String.Empty);
88 string simulationService = serverConfig.GetString("SimulationService", String.Empty); 89 string simulationService = serverConfig.GetString("SimulationService", String.Empty);
89 string gridUserService = serverConfig.GetString("GridUserService", String.Empty); 90 string gridUserService = serverConfig.GetString("GridUserService", String.Empty);
91 string bansService = serverConfig.GetString("BansService", String.Empty);
90 92
91 // These are mandatory, the others aren't 93 // These are mandatory, the others aren't
92 if (gridService == string.Empty || presenceService == string.Empty) 94 if (gridService == string.Empty || presenceService == string.Empty)
@@ -121,6 +123,8 @@ namespace OpenSim.Services.HypergridService
121 m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(homeUsersService, args); 123 m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(homeUsersService, args);
122 if (gridUserService != string.Empty) 124 if (gridUserService != string.Empty)
123 m_GridUserService = ServerUtils.LoadPlugin<IGridUserService>(gridUserService, args); 125 m_GridUserService = ServerUtils.LoadPlugin<IGridUserService>(gridUserService, args);
126 if (bansService != string.Empty)
127 m_BansService = ServerUtils.LoadPlugin<IBansService>(bansService, args);
124 128
125 if (simService != null) 129 if (simService != null)
126 m_SimulationService = simService; 130 m_SimulationService = simService;
@@ -167,7 +171,7 @@ namespace OpenSim.Services.HypergridService
167 m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to link to {0}", (regionName == string.Empty)? "default region" : regionName); 171 m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to link to {0}", (regionName == string.Empty)? "default region" : regionName);
168 if (!m_AllowTeleportsToAnyRegion || regionName == string.Empty) 172 if (!m_AllowTeleportsToAnyRegion || regionName == string.Empty)
169 { 173 {
170 List<GridRegion> defs = m_GridService.GetDefaultRegions(m_ScopeID); 174 List<GridRegion> defs = m_GridService.GetDefaultHypergridRegions(m_ScopeID);
171 if (defs != null && defs.Count > 0) 175 if (defs != null && defs.Count > 0)
172 { 176 {
173 region = defs[0]; 177 region = defs[0];
@@ -223,7 +227,7 @@ namespace OpenSim.Services.HypergridService
223 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2} ({3}) at {4} using viewer {5}, channel {6}, IP {7}, Mac {8}, Id0 {9} Teleport Flags {10}", 227 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2} ({3}) at {4} using viewer {5}, channel {6}, IP {7}, Mac {8}, Id0 {9} Teleport Flags {10}",
224 aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName, 228 aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName,
225 aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0, aCircuit.teleportFlags.ToString()); 229 aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0, aCircuit.teleportFlags.ToString());
226 230
227 // 231 //
228 // Check client 232 // Check client
229 // 233 //
@@ -287,17 +291,16 @@ namespace OpenSim.Services.HypergridService
287 } 291 }
288 } 292 }
289 } 293 }
290 m_log.DebugFormat("[GATEKEEPER SERVICE]: User is ok");
291 294
292 // 295 //
293 // Foreign agents allowed? Exceptions? 296 // Foreign agents allowed? Exceptions?
294 // 297 //
295 if (account == null) 298 if (account == null)
296 { 299 {
297 bool allowed = m_ForeignAgentsAllowed; 300 bool allowed = m_ForeignAgentsAllowed;
298 301
299 if (m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsAllowedExceptions)) 302 if (m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsAllowedExceptions))
300 allowed = false; 303 allowed = false;
301 304
302 if (!m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsDisallowedExceptions)) 305 if (!m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsDisallowedExceptions))
303 allowed = true; 306 allowed = true;
@@ -311,6 +314,20 @@ namespace OpenSim.Services.HypergridService
311 } 314 }
312 } 315 }
313 316
317 //
318 // Is the user banned?
319 // This uses a Ban service that's more powerful than the configs
320 //
321 string uui = (account != null ? aCircuit.AgentID.ToString() : Util.ProduceUserUniversalIdentifier(aCircuit));
322 if (m_BansService != null && m_BansService.IsBanned(uui, aCircuit.IPAddress, aCircuit.Id0, authURL))
323 {
324 reason = "You are banned from this world";
325 m_log.InfoFormat("[GATEKEEPER SERVICE]: Login failed, reason: user {0} is banned", uui);
326 return false;
327 }
328
329 m_log.DebugFormat("[GATEKEEPER SERVICE]: User {0} is ok", aCircuit.Name);
330
314 bool isFirstLogin = false; 331 bool isFirstLogin = false;
315 // 332 //
316 // Login the presence, if it's not there yet (by the login service) 333 // Login the presence, if it's not there yet (by the login service)
@@ -328,7 +345,8 @@ namespace OpenSim.Services.HypergridService
328 aCircuit.firstname, aCircuit.lastname); 345 aCircuit.firstname, aCircuit.lastname);
329 return false; 346 return false;
330 } 347 }
331 m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok"); 348
349 m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence {0} is ok", aCircuit.Name);
332 350
333 // Also login foreigners with GridUser service 351 // Also login foreigners with GridUser service
334 if (m_GridUserService != null && account == null) 352 if (m_GridUserService != null && account == null)
@@ -359,7 +377,9 @@ namespace OpenSim.Services.HypergridService
359 reason = "Destination region not found"; 377 reason = "Destination region not found";
360 return false; 378 return false;
361 } 379 }
362 m_log.DebugFormat("[GATEKEEPER SERVICE]: destination ok: {0}", destination.RegionName); 380
381 m_log.DebugFormat(
382 "[GATEKEEPER SERVICE]: Destination {0} is ok for {1}", destination.RegionName, aCircuit.Name);
363 383
364 // 384 //
365 // Adjust the visible name 385 // Adjust the visible name
@@ -393,7 +413,8 @@ namespace OpenSim.Services.HypergridService
393 // Preserve our TeleportFlags we have gathered so-far 413 // Preserve our TeleportFlags we have gathered so-far
394 loginFlag |= (Constants.TeleportFlags) aCircuit.teleportFlags; 414 loginFlag |= (Constants.TeleportFlags) aCircuit.teleportFlags;
395 415
396 m_log.DebugFormat("[GATEKEEPER SERVICE]: launching agent {0}", loginFlag); 416 m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0} {1}", aCircuit.Name, loginFlag);
417
397 return m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason); 418 return m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason);
398 } 419 }
399 420
@@ -402,6 +423,12 @@ namespace OpenSim.Services.HypergridService
402 if (!CheckAddress(aCircuit.ServiceSessionID)) 423 if (!CheckAddress(aCircuit.ServiceSessionID))
403 return false; 424 return false;
404 425
426 if (string.IsNullOrEmpty(aCircuit.IPAddress))
427 {
428 m_log.DebugFormat("[GATEKEEPER SERVICE]: Agent did not provide a client IP address.");
429 return false;
430 }
431
405 string userURL = string.Empty; 432 string userURL = string.Empty;
406 if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) 433 if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
407 userURL = aCircuit.ServiceURLs["HomeURI"].ToString(); 434 userURL = aCircuit.ServiceURLs["HomeURI"].ToString();
diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
index eecf757..0601ece 100644
--- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
+++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
@@ -54,7 +54,7 @@ namespace OpenSim.Services.HypergridService
54 LogManager.GetLogger( 54 LogManager.GetLogger(
55 MethodBase.GetCurrentMethod().DeclaringType); 55 MethodBase.GetCurrentMethod().DeclaringType);
56 56
57 private string m_HomeURL; 57// private string m_HomeURL;
58 private IUserAccountService m_UserAccountService; 58 private IUserAccountService m_UserAccountService;
59 private IAvatarService m_AvatarService; 59 private IAvatarService m_AvatarService;
60 60
@@ -96,8 +96,8 @@ namespace OpenSim.Services.HypergridService
96 if (m_AvatarService == null) 96 if (m_AvatarService == null)
97 throw new Exception(String.Format("Unable to create m_AvatarService from {0}", avatarDll)); 97 throw new Exception(String.Format("Unable to create m_AvatarService from {0}", avatarDll));
98 98
99 m_HomeURL = Util.GetConfigVarFromSections<string>(config, "HomeURI", 99// m_HomeURL = Util.GetConfigVarFromSections<string>(config, "HomeURI",
100 new string[] { "Startup", "Hypergrid", m_ConfigName }, String.Empty); 100// new string[] { "Startup", "Hypergrid", m_ConfigName }, String.Empty);
101 101
102// m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService); 102// m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
103 } 103 }
@@ -115,6 +115,12 @@ namespace OpenSim.Services.HypergridService
115 { 115 {
116 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); 116 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
117 117
118 if (suitcase == null)
119 {
120 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Found no suitcase folder for user {0} when looking for inventory skeleton", principalID);
121 return null;
122 }
123
118 List<XInventoryFolder> tree = GetFolderTree(principalID, suitcase.folderID); 124 List<XInventoryFolder> tree = GetFolderTree(principalID, suitcase.folderID);
119 if (tree == null || (tree != null && tree.Count == 0)) 125 if (tree == null || (tree != null && tree.Count == 0))
120 return null; 126 return null;
@@ -134,6 +140,7 @@ namespace OpenSim.Services.HypergridService
134 public override InventoryCollection GetUserInventory(UUID userID) 140 public override InventoryCollection GetUserInventory(UUID userID)
135 { 141 {
136 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Get Suitcase inventory for user {0}", userID); 142 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Get Suitcase inventory for user {0}", userID);
143
137 InventoryCollection userInventory = new InventoryCollection(); 144 InventoryCollection userInventory = new InventoryCollection();
138 userInventory.UserID = userID; 145 userInventory.UserID = userID;
139 userInventory.Folders = new List<InventoryFolderBase>(); 146 userInventory.Folders = new List<InventoryFolderBase>();
@@ -141,6 +148,12 @@ namespace OpenSim.Services.HypergridService
141 148
142 XInventoryFolder suitcase = GetSuitcaseXFolder(userID); 149 XInventoryFolder suitcase = GetSuitcaseXFolder(userID);
143 150
151 if (suitcase == null)
152 {
153 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Found no suitcase folder for user {0} when looking for user inventory", userID);
154 return null;
155 }
156
144 List<XInventoryFolder> tree = GetFolderTree(userID, suitcase.folderID); 157 List<XInventoryFolder> tree = GetFolderTree(userID, suitcase.folderID);
145 if (tree == null || (tree != null && tree.Count == 0)) 158 if (tree == null || (tree != null && tree.Count == 0))
146 { 159 {
@@ -182,7 +195,8 @@ namespace OpenSim.Services.HypergridService
182 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetRootFolder for {0}", principalID); 195 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetRootFolder for {0}", principalID);
183 196
184 // Let's find out the local root folder 197 // Let's find out the local root folder
185 XInventoryFolder root = GetRootXFolder(principalID); ; 198 XInventoryFolder root = GetRootXFolder(principalID);
199
186 if (root == null) 200 if (root == null)
187 { 201 {
188 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve local root folder for user {0}", principalID); 202 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve local root folder for user {0}", principalID);
@@ -255,6 +269,13 @@ namespace OpenSim.Services.HypergridService
255 { 269 {
256 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetFolderForType for {0} {0}", principalID, type); 270 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetFolderForType for {0} {0}", principalID, type);
257 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); 271 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
272
273 if (suitcase == null)
274 {
275 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Found no suitcase folder for user {0} when looking for child type folder {1}", principalID, type);
276 return null;
277 }
278
258 XInventoryFolder[] folders = m_Database.GetFolders( 279 XInventoryFolder[] folders = m_Database.GetFolders(
259 new string[] { "agentID", "type", "parentFolderID" }, 280 new string[] { "agentID", "type", "parentFolderID" },
260 new string[] { principalID.ToString(), ((int)type).ToString(), suitcase.folderID.ToString() }); 281 new string[] { principalID.ToString(), ((int)type).ToString(), suitcase.folderID.ToString() });
@@ -472,6 +493,22 @@ namespace OpenSim.Services.HypergridService
472 return null; 493 return null;
473 } 494 }
474 495
496 private XInventoryFolder GetCurrentOutfitXFolder(UUID userID)
497 {
498 XInventoryFolder root = GetRootXFolder(userID);
499 if (root == null)
500 return null;
501
502 XInventoryFolder[] folders = m_Database.GetFolders(
503 new string[] { "agentID", "type", "parentFolderID" },
504 new string[] { userID.ToString(), ((int)AssetType.CurrentOutfitFolder).ToString(), root.folderID.ToString() });
505
506 if (folders.Length == 0)
507 return null;
508
509 return folders[0];
510 }
511
475 private XInventoryFolder GetSuitcaseXFolder(UUID principalID) 512 private XInventoryFolder GetSuitcaseXFolder(UUID principalID)
476 { 513 {
477 // Warp! Root folder for travelers 514 // Warp! Root folder for travelers
@@ -510,6 +547,7 @@ namespace OpenSim.Services.HypergridService
510 if (m_SuitcaseTrees.TryGetValue(principalID, out t)) 547 if (m_SuitcaseTrees.TryGetValue(principalID, out t))
511 return t; 548 return t;
512 549
550 // Get the tree of the suitcase folder
513 t = GetFolderTreeRecursive(folder); 551 t = GetFolderTreeRecursive(folder);
514 m_SuitcaseTrees.AddOrUpdate(principalID, t, 5*60); // 5minutes 552 m_SuitcaseTrees.AddOrUpdate(principalID, t, 5*60); // 5minutes
515 return t; 553 return t;
@@ -546,6 +584,7 @@ namespace OpenSim.Services.HypergridService
546 private bool IsWithinSuitcaseTree(UUID principalID, UUID folderID) 584 private bool IsWithinSuitcaseTree(UUID principalID, UUID folderID)
547 { 585 {
548 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); 586 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
587
549 if (suitcase == null) 588 if (suitcase == null)
550 { 589 {
551 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder", principalID); 590 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder", principalID);
@@ -555,6 +594,9 @@ namespace OpenSim.Services.HypergridService
555 List<XInventoryFolder> tree = new List<XInventoryFolder>(); 594 List<XInventoryFolder> tree = new List<XInventoryFolder>();
556 tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder 595 tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder
557 tree.AddRange(GetFolderTree(principalID, suitcase.folderID)); 596 tree.AddRange(GetFolderTree(principalID, suitcase.folderID));
597 // Also add the Current Outfit folder to the list of available folders
598 tree.Add(GetCurrentOutfitXFolder(principalID));
599
558 XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl) 600 XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl)
559 { 601 {
560 if (fl.folderID == folderID) return true; 602 if (fl.folderID == folderID) return true;
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
index ec76508..b414aca 100644
--- a/OpenSim/Services/HypergridService/UserAgentService.cs
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.Net; 30using System.Net;
31using System.Reflection; 31using System.Reflection;
32 32
33using OpenSim.Data;
33using OpenSim.Framework; 34using OpenSim.Framework;
34using OpenSim.Services.Connectors.Friends; 35using OpenSim.Services.Connectors.Friends;
35using OpenSim.Services.Connectors.Hypergrid; 36using OpenSim.Services.Connectors.Hypergrid;
@@ -50,14 +51,14 @@ namespace OpenSim.Services.HypergridService
50 /// needs to do it for them. 51 /// needs to do it for them.
51 /// Once we have better clients, this shouldn't be needed. 52 /// Once we have better clients, this shouldn't be needed.
52 /// </summary> 53 /// </summary>
53 public class UserAgentService : IUserAgentService 54 public class UserAgentService : UserAgentServiceBase, IUserAgentService
54 { 55 {
55 private static readonly ILog m_log = 56 private static readonly ILog m_log =
56 LogManager.GetLogger( 57 LogManager.GetLogger(
57 MethodBase.GetCurrentMethod().DeclaringType); 58 MethodBase.GetCurrentMethod().DeclaringType);
58 59
59 // This will need to go into a DB table 60 // This will need to go into a DB table
60 static Dictionary<UUID, TravelingAgentInfo> m_TravelingAgents = new Dictionary<UUID, TravelingAgentInfo>(); 61 //static Dictionary<UUID, TravelingAgentInfo> m_Database = new Dictionary<UUID, TravelingAgentInfo>();
61 62
62 static bool m_Initialized = false; 63 static bool m_Initialized = false;
63 64
@@ -86,6 +87,7 @@ namespace OpenSim.Services.HypergridService
86 } 87 }
87 88
88 public UserAgentService(IConfigSource config, IFriendsSimConnector friendsConnector) 89 public UserAgentService(IConfigSource config, IFriendsSimConnector friendsConnector)
90 : base(config)
89 { 91 {
90 // Let's set this always, because we don't know the sequence 92 // Let's set this always, because we don't know the sequence
91 // of instantiations 93 // of instantiations
@@ -146,6 +148,9 @@ namespace OpenSim.Services.HypergridService
146 if (!m_GridName.EndsWith("/")) 148 if (!m_GridName.EndsWith("/"))
147 m_GridName = m_GridName + "/"; 149 m_GridName = m_GridName + "/";
148 150
151 // Finally some cleanup
152 m_Database.DeleteOld();
153
149 } 154 }
150 } 155 }
151 156
@@ -210,10 +215,10 @@ namespace OpenSim.Services.HypergridService
210 return home; 215 return home;
211 } 216 }
212 217
213 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint clientIP, out string reason) 218 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason)
214 { 219 {
215 m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}", 220 m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}",
216 agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI); 221 agentCircuit.firstname, agentCircuit.lastname, (fromLogin ? agentCircuit.IPAddress : "stored IP"), gatekeeper.ServerURI);
217 222
218 string gridName = gatekeeper.ServerURI; 223 string gridName = gatekeeper.ServerURI;
219 224
@@ -260,12 +265,13 @@ namespace OpenSim.Services.HypergridService
260 265
261 // Generate a new service session 266 // Generate a new service session
262 agentCircuit.ServiceSessionID = region.ServerURI + ";" + UUID.Random(); 267 agentCircuit.ServiceSessionID = region.ServerURI + ";" + UUID.Random();
263 TravelingAgentInfo old = UpdateTravelInfo(agentCircuit, region); 268 TravelingAgentInfo old = null;
269 TravelingAgentInfo travel = CreateTravelInfo(agentCircuit, region, fromLogin, out old);
264 270
265 bool success = false; 271 bool success = false;
266 string myExternalIP = string.Empty; 272 string myExternalIP = string.Empty;
267 273
268 m_log.DebugFormat("[USER AGENT SERVICE]: this grid: {0}, desired grid: {1}", m_GridName, gridName); 274 m_log.DebugFormat("[USER AGENT SERVICE]: this grid: {0}, desired grid: {1}, desired region: {2}", m_GridName, gridName, region.RegionID);
269 275
270 if (m_GridName == gridName) 276 if (m_GridName == gridName)
271 success = m_GatekeeperService.LoginAgent(agentCircuit, finalDestination, out reason); 277 success = m_GatekeeperService.LoginAgent(agentCircuit, finalDestination, out reason);
@@ -282,23 +288,21 @@ namespace OpenSim.Services.HypergridService
282 m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}", 288 m_log.DebugFormat("[USER AGENT SERVICE]: Unable to login user {0} {1} to grid {2}, reason: {3}",
283 agentCircuit.firstname, agentCircuit.lastname, region.ServerURI, reason); 289 agentCircuit.firstname, agentCircuit.lastname, region.ServerURI, reason);
284 290
285 // restore the old travel info 291 if (old != null)
286 lock (m_TravelingAgents) 292 StoreTravelInfo(old);
287 { 293 else
288 if (old == null) 294 m_Database.Delete(agentCircuit.SessionID);
289 m_TravelingAgents.Remove(agentCircuit.SessionID);
290 else
291 m_TravelingAgents[agentCircuit.SessionID] = old;
292 }
293 295
294 return false; 296 return false;
295 } 297 }
296 298
299 // Everything is ok
300
301 // Update the perceived IP Address of our grid
297 m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP); 302 m_log.DebugFormat("[USER AGENT SERVICE]: Gatekeeper sees me as {0}", myExternalIP);
298 // else set the IP addresses associated with this client 303 travel.MyIpAddress = myExternalIP;
299 if (clientIP != null) 304
300 m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress = clientIP.Address.ToString(); 305 StoreTravelInfo(travel);
301 m_TravelingAgents[agentCircuit.SessionID].MyIpAddress = myExternalIP;
302 306
303 return true; 307 return true;
304 } 308 }
@@ -306,60 +310,42 @@ namespace OpenSim.Services.HypergridService
306 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason) 310 public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
307 { 311 {
308 reason = string.Empty; 312 reason = string.Empty;
309 return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, null, out reason); 313 return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, false, out reason);
310 } 314 }
311 315
312 private void SetClientIP(UUID sessionID, string ip) 316 TravelingAgentInfo CreateTravelInfo(AgentCircuitData agentCircuit, GridRegion region, bool fromLogin, out TravelingAgentInfo existing)
313 { 317 {
314 if (m_TravelingAgents.ContainsKey(sessionID)) 318 HGTravelingData hgt = m_Database.Get(agentCircuit.SessionID);
315 { 319 existing = null;
316 m_log.DebugFormat("[USER AGENT SERVICE]: Setting IP {0} for session {1}", ip, sessionID);
317 m_TravelingAgents[sessionID].ClientIPAddress = ip;
318 }
319 }
320 320
321 TravelingAgentInfo UpdateTravelInfo(AgentCircuitData agentCircuit, GridRegion region) 321 if (hgt != null)
322 {
323 TravelingAgentInfo travel = new TravelingAgentInfo();
324 TravelingAgentInfo old = null;
325 lock (m_TravelingAgents)
326 { 322 {
327 if (m_TravelingAgents.ContainsKey(agentCircuit.SessionID)) 323 // Very important! Override whatever this agent comes with.
328 { 324 // UserAgentService always sets the IP for every new agent
329 // Very important! Override whatever this agent comes with. 325 // with the original IP address.
330 // UserAgentService always sets the IP for every new agent 326 existing = new TravelingAgentInfo(hgt);
331 // with the original IP address. 327 agentCircuit.IPAddress = existing.ClientIPAddress;
332 agentCircuit.IPAddress = m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress;
333
334 old = m_TravelingAgents[agentCircuit.SessionID];
335 }
336
337 m_TravelingAgents[agentCircuit.SessionID] = travel;
338 } 328 }
329
330 TravelingAgentInfo travel = new TravelingAgentInfo(existing);
331 travel.SessionID = agentCircuit.SessionID;
339 travel.UserID = agentCircuit.AgentID; 332 travel.UserID = agentCircuit.AgentID;
340 travel.GridExternalName = region.ServerURI; 333 travel.GridExternalName = region.ServerURI;
341 travel.ServiceToken = agentCircuit.ServiceSessionID; 334 travel.ServiceToken = agentCircuit.ServiceSessionID;
342 if (old != null)
343 travel.ClientIPAddress = old.ClientIPAddress;
344 335
345 return old; 336 if (fromLogin)
337 travel.ClientIPAddress = agentCircuit.IPAddress;
338
339 StoreTravelInfo(travel);
340
341 return travel;
346 } 342 }
347 343
348 public void LogoutAgent(UUID userID, UUID sessionID) 344 public void LogoutAgent(UUID userID, UUID sessionID)
349 { 345 {
350 m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID); 346 m_log.DebugFormat("[USER AGENT SERVICE]: User {0} logged out", userID);
351 347
352 lock (m_TravelingAgents) 348 m_Database.Delete(sessionID);
353 {
354 List<UUID> travels = new List<UUID>();
355 foreach (KeyValuePair<UUID, TravelingAgentInfo> kvp in m_TravelingAgents)
356 if (kvp.Value == null) // do some clean up
357 travels.Add(kvp.Key);
358 else if (kvp.Value.UserID == userID)
359 travels.Add(kvp.Key);
360 foreach (UUID session in travels)
361 m_TravelingAgents.Remove(session);
362 }
363 349
364 GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(userID.ToString()); 350 GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(userID.ToString());
365 if (guinfo != null) 351 if (guinfo != null)
@@ -369,10 +355,11 @@ namespace OpenSim.Services.HypergridService
369 // We need to prevent foreign users with the same UUID as a local user 355 // We need to prevent foreign users with the same UUID as a local user
370 public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName) 356 public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName)
371 { 357 {
372 if (!m_TravelingAgents.ContainsKey(sessionID)) 358 HGTravelingData hgt = m_Database.Get(sessionID);
359 if (hgt == null)
373 return false; 360 return false;
374 361
375 TravelingAgentInfo travel = m_TravelingAgents[sessionID]; 362 TravelingAgentInfo travel = new TravelingAgentInfo(hgt);
376 363
377 return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower(); 364 return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower();
378 } 365 }
@@ -385,29 +372,32 @@ namespace OpenSim.Services.HypergridService
385 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with reported IP {1}.", 372 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying Client session {0} with reported IP {1}.",
386 sessionID, reportedIP); 373 sessionID, reportedIP);
387 374
388 if (m_TravelingAgents.ContainsKey(sessionID)) 375 HGTravelingData hgt = m_Database.Get(sessionID);
389 { 376 if (hgt == null)
390 m_log.DebugFormat("[USER AGENT SERVICE]: Comparing with login IP {0} and MyIP {1}", 377 return false;
391 m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress);
392 378
393 return m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || 379 TravelingAgentInfo travel = new TravelingAgentInfo(hgt);
394 m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed 380
395 } 381 bool result = travel.ClientIPAddress == reportedIP || travel.MyIpAddress == reportedIP; // NATed
396 382
397 return false; 383 m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}",
384 reportedIP, travel.ClientIPAddress, travel.MyIpAddress, result);
385
386 return result;
398 } 387 }
399 388
400 public bool VerifyAgent(UUID sessionID, string token) 389 public bool VerifyAgent(UUID sessionID, string token)
401 { 390 {
402 if (m_TravelingAgents.ContainsKey(sessionID)) 391 HGTravelingData hgt = m_Database.Get(sessionID);
392 if (hgt == null)
403 { 393 {
404 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, m_TravelingAgents[sessionID].ServiceToken); 394 m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID);
405 return m_TravelingAgents[sessionID].ServiceToken == token; 395 return false;
406 } 396 }
407 397
408 m_log.DebugFormat("[USER AGENT SERVICE]: Token verification for session {0}: no such session", sessionID); 398 TravelingAgentInfo travel = new TravelingAgentInfo(hgt);
409 399 m_log.DebugFormat("[USER AGENT SERVICE]: Verifying agent token {0} against {1}", token, travel.ServiceToken);
410 return false; 400 return travel.ServiceToken == token;
411 } 401 }
412 402
413 [Obsolete] 403 [Obsolete]
@@ -470,17 +460,17 @@ namespace OpenSim.Services.HypergridService
470 } 460 }
471 } 461 }
472 462
473 // Lastly, let's notify the rest who may be online somewhere else 463 //// Lastly, let's notify the rest who may be online somewhere else
474 foreach (string user in usersToBeNotified) 464 //foreach (string user in usersToBeNotified)
475 { 465 //{
476 UUID id = new UUID(user); 466 // UUID id = new UUID(user);
477 if (m_TravelingAgents.ContainsKey(id) && m_TravelingAgents[id].GridExternalName != m_GridName) 467 // if (m_Database.ContainsKey(id) && m_Database[id].GridExternalName != m_GridName)
478 { 468 // {
479 string url = m_TravelingAgents[id].GridExternalName; 469 // string url = m_Database[id].GridExternalName;
480 // forward 470 // // forward
481 m_log.WarnFormat("[USER AGENT SERVICE]: User {0} is visiting {1}. HG Status notifications still not implemented.", user, url); 471 // m_log.WarnFormat("[USER AGENT SERVICE]: User {0} is visiting {1}. HG Status notifications still not implemented.", user, url);
482 } 472 // }
483 } 473 //}
484 474
485 // and finally, let's send the online friends 475 // and finally, let's send the online friends
486 if (online) 476 if (online)
@@ -607,16 +597,13 @@ namespace OpenSim.Services.HypergridService
607 597
608 public string LocateUser(UUID userID) 598 public string LocateUser(UUID userID)
609 { 599 {
610 foreach (TravelingAgentInfo t in m_TravelingAgents.Values) 600 HGTravelingData[] hgts = m_Database.GetSessions(userID);
611 { 601 if (hgts == null)
612 if (t == null) 602 return string.Empty;
613 { 603
614 m_log.ErrorFormat("[USER AGENT SERVICE]: Oops! Null TravelingAgentInfo. Please report this on mantis"); 604 foreach (HGTravelingData t in hgts)
615 continue; 605 if (t.Data.ContainsKey("GridExternalName") && !m_GridName.Equals(t.Data["GridExternalName"]))
616 } 606 return t.Data["GridExternalName"];
617 if (t.UserID == userID && !m_GridName.Equals(t.GridExternalName))
618 return t.GridExternalName;
619 }
620 607
621 return string.Empty; 608 return string.Empty;
622 } 609 }
@@ -687,17 +674,60 @@ namespace OpenSim.Services.HypergridService
687 return exception; 674 return exception;
688 } 675 }
689 676
677 private void StoreTravelInfo(TravelingAgentInfo travel)
678 {
679 if (travel == null)
680 return;
681
682 HGTravelingData hgt = new HGTravelingData();
683 hgt.SessionID = travel.SessionID;
684 hgt.UserID = travel.UserID;
685 hgt.Data = new Dictionary<string, string>();
686 hgt.Data["GridExternalName"] = travel.GridExternalName;
687 hgt.Data["ServiceToken"] = travel.ServiceToken;
688 hgt.Data["ClientIPAddress"] = travel.ClientIPAddress;
689 hgt.Data["MyIPAddress"] = travel.MyIpAddress;
690
691 m_Database.Store(hgt);
692 }
690 #endregion 693 #endregion
691 694
692 } 695 }
693 696
694 class TravelingAgentInfo 697 class TravelingAgentInfo
695 { 698 {
699 public UUID SessionID;
696 public UUID UserID; 700 public UUID UserID;
697 public string GridExternalName = string.Empty; 701 public string GridExternalName = string.Empty;
698 public string ServiceToken = string.Empty; 702 public string ServiceToken = string.Empty;
699 public string ClientIPAddress = string.Empty; // as seen from this user agent service 703 public string ClientIPAddress = string.Empty; // as seen from this user agent service
700 public string MyIpAddress = string.Empty; // the user agent service's external IP, as seen from the next gatekeeper 704 public string MyIpAddress = string.Empty; // the user agent service's external IP, as seen from the next gatekeeper
705
706 public TravelingAgentInfo(HGTravelingData t)
707 {
708 if (t.Data != null)
709 {
710 SessionID = new UUID(t.SessionID);
711 UserID = new UUID(t.UserID);
712 GridExternalName = t.Data["GridExternalName"];
713 ServiceToken = t.Data["ServiceToken"];
714 ClientIPAddress = t.Data["ClientIPAddress"];
715 MyIpAddress = t.Data["MyIPAddress"];
716 }
717 }
718
719 public TravelingAgentInfo(TravelingAgentInfo old)
720 {
721 if (old != null)
722 {
723 SessionID = old.SessionID;
724 UserID = old.UserID;
725 GridExternalName = old.GridExternalName;
726 ServiceToken = old.ServiceToken;
727 ClientIPAddress = old.ClientIPAddress;
728 MyIpAddress = old.MyIpAddress;
729 }
730 }
701 } 731 }
702 732
703} 733}
diff --git a/OpenSim/Services/HypergridService/UserAgentServiceBase.cs b/OpenSim/Services/HypergridService/UserAgentServiceBase.cs
new file mode 100644
index 0000000..a00e5a6
--- /dev/null
+++ b/OpenSim/Services/HypergridService/UserAgentServiceBase.cs
@@ -0,0 +1,84 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using Nini.Config;
31using OpenSim.Framework;
32using OpenSim.Data;
33using OpenSim.Services.Interfaces;
34using OpenSim.Services.Base;
35
36namespace OpenSim.Services.HypergridService
37{
38 public class UserAgentServiceBase : ServiceBase
39 {
40 protected IHGTravelingData m_Database = null;
41
42 public UserAgentServiceBase(IConfigSource config)
43 : base(config)
44 {
45 string dllName = String.Empty;
46 string connString = String.Empty;
47 string realm = "hg_traveling_data";
48
49 //
50 // Try reading the [DatabaseService] section, if it exists
51 //
52 IConfig dbConfig = config.Configs["DatabaseService"];
53 if (dbConfig != null)
54 {
55 if (dllName == String.Empty)
56 dllName = dbConfig.GetString("StorageProvider", String.Empty);
57 if (connString == String.Empty)
58 connString = dbConfig.GetString("ConnectionString", String.Empty);
59 }
60
61 //
62 // [UserAgentService] section overrides [DatabaseService], if it exists
63 //
64 IConfig gridConfig = config.Configs["UserAgentService"];
65 if (gridConfig != null)
66 {
67 dllName = gridConfig.GetString("StorageProvider", dllName);
68 connString = gridConfig.GetString("ConnectionString", connString);
69 realm = gridConfig.GetString("Realm", realm);
70 }
71
72 //
73 // We tried, but this doesn't exist. We can't proceed.
74 //
75 if (dllName.Equals(String.Empty))
76 throw new Exception("No StorageProvider configured");
77
78 m_Database = LoadPlugin<IHGTravelingData>(dllName, new Object[] { connString, realm });
79 if (m_Database == null)
80 throw new Exception("Could not find a storage interface in the given module");
81
82 }
83 }
84}
diff --git a/OpenSim/Services/Interfaces/IBansService.cs b/OpenSim/Services/Interfaces/IBansService.cs
new file mode 100644
index 0000000..8fd3521
--- /dev/null
+++ b/OpenSim/Services/Interfaces/IBansService.cs
@@ -0,0 +1,48 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Collections.Generic;
29
30using OpenSim.Framework;
31using OpenMetaverse;
32
33namespace OpenSim.Services.Interfaces
34{
35 public interface IBansService
36 {
37 /// <summary>
38 /// Are any of the given arguments banned from the grid?
39 /// </summary>
40 /// <param name="userID"></param>
41 /// <param name="ip"></param>
42 /// <param name="id0"></param>
43 /// <param name="origin"></param>
44 /// <returns></returns>
45 bool IsBanned(string userID, string ip, string id0, string origin);
46 }
47
48}
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 3f4c958..e3c70d3 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -97,6 +97,7 @@ namespace OpenSim.Services.Interfaces
97 List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax); 97 List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
98 98
99 List<GridRegion> GetDefaultRegions(UUID scopeID); 99 List<GridRegion> GetDefaultRegions(UUID scopeID);
100 List<GridRegion> GetDefaultHypergridRegions(UUID scopeID);
100 List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y); 101 List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y);
101 List<GridRegion> GetHyperlinks(UUID scopeID); 102 List<GridRegion> GetHyperlinks(UUID scopeID);
102 103
@@ -137,7 +138,10 @@ namespace OpenSim.Services.Interfaces
137 if ( m_serverURI != string.Empty ) { 138 if ( m_serverURI != string.Empty ) {
138 return m_serverURI; 139 return m_serverURI;
139 } else { 140 } else {
140 return "http://" + m_externalHostName + ":" + m_httpPort + "/"; 141 if (m_httpPort == 0)
142 return "http://" + m_externalHostName + "/";
143 else
144 return "http://" + m_externalHostName + ":" + m_httpPort + "/";
141 } 145 }
142 } 146 }
143 set { 147 set {
diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs
index 3dc877a..f9e7f08 100644
--- a/OpenSim/Services/Interfaces/IHypergridServices.cs
+++ b/OpenSim/Services/Interfaces/IHypergridServices.cs
@@ -48,10 +48,7 @@ namespace OpenSim.Services.Interfaces
48 /// </summary> 48 /// </summary>
49 public interface IUserAgentService 49 public interface IUserAgentService
50 { 50 {
51 // called by login service only 51 bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason);
52 bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, IPEndPoint clientIP, out string reason);
53 // called by simulators
54 bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, out string reason);
55 void LogoutAgent(UUID userID, UUID sessionID); 52 void LogoutAgent(UUID userID, UUID sessionID);
56 GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt); 53 GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt);
57 Dictionary<string, object> GetServerURLs(UUID userID); 54 Dictionary<string, object> GetServerURLs(UUID userID);
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs
index a963b8e..1c82b3e 100644
--- a/OpenSim/Services/Interfaces/ISimulationService.cs
+++ b/OpenSim/Services/Interfaces/ISimulationService.cs
@@ -75,8 +75,6 @@ namespace OpenSim.Services.Interfaces
75 /// <returns></returns> 75 /// <returns></returns>
76 bool UpdateAgent(GridRegion destination, AgentPosition data); 76 bool UpdateAgent(GridRegion destination, AgentPosition data);
77 77
78 bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent);
79
80 bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason); 78 bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason);
81 79
82 /// <summary> 80 /// <summary>
@@ -90,20 +88,12 @@ namespace OpenSim.Services.Interfaces
90 bool ReleaseAgent(UUID originRegion, UUID id, string uri); 88 bool ReleaseAgent(UUID originRegion, UUID id, string uri);
91 89
92 /// <summary> 90 /// <summary>
93 /// Close child agent.
94 /// </summary>
95 /// <param name="regionHandle"></param>
96 /// <param name="id"></param>
97 /// <returns></returns>
98 bool CloseChildAgent(GridRegion destination, UUID id);
99
100 /// <summary>
101 /// Close agent. 91 /// Close agent.
102 /// </summary> 92 /// </summary>
103 /// <param name="regionHandle"></param> 93 /// <param name="regionHandle"></param>
104 /// <param name="id"></param> 94 /// <param name="id"></param>
105 /// <returns></returns> 95 /// <returns></returns>
106 bool CloseAgent(GridRegion destination, UUID id); 96 bool CloseAgent(GridRegion destination, UUID id, string auth_token);
107 97
108 #endregion Agents 98 #endregion Agents
109 99
diff --git a/OpenSim/Services/Interfaces/IUserProfilesService.cs b/OpenSim/Services/Interfaces/IUserProfilesService.cs
new file mode 100644
index 0000000..319d307
--- /dev/null
+++ b/OpenSim/Services/Interfaces/IUserProfilesService.cs
@@ -0,0 +1,75 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using OpenSim.Framework;
30using OpenMetaverse;
31using OpenMetaverse.StructuredData;
32
33namespace OpenSim.Services.Interfaces
34{
35 public interface IUserProfilesService
36 {
37 #region Classifieds
38 OSD AvatarClassifiedsRequest(UUID creatorId);
39 bool ClassifiedUpdate(UserClassifiedAdd ad, ref string result);
40 bool ClassifiedInfoRequest(ref UserClassifiedAdd ad, ref string result);
41 bool ClassifiedDelete(UUID recordId);
42 #endregion Classifieds
43
44 #region Picks
45 OSD AvatarPicksRequest(UUID creatorId);
46 bool PickInfoRequest(ref UserProfilePick pick, ref string result);
47 bool PicksUpdate(ref UserProfilePick pick, ref string result);
48 bool PicksDelete(UUID pickId);
49 #endregion Picks
50
51 #region Notes
52 bool AvatarNotesRequest(ref UserProfileNotes note);
53 bool NotesUpdate(ref UserProfileNotes note, ref string result);
54 #endregion Notes
55
56 #region Profile Properties
57 bool AvatarPropertiesRequest(ref UserProfileProperties prop, ref string result);
58 bool AvatarPropertiesUpdate(ref UserProfileProperties prop, ref string result);
59 #endregion Profile Properties
60
61 #region Interests
62 bool AvatarInterestsUpdate(UserProfileProperties prop, ref string result);
63 #endregion Interests
64
65 #region Utility
66 OSD AvatarImageAssetsRequest(UUID avatarId);
67 #endregion Utility
68
69 #region UserData
70 bool RequestUserAppData(ref UserAppData prop, ref string result);
71 bool SetUserAppData(UserAppData prop, ref string result);
72 #endregion UserData
73 }
74}
75
diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs
index e2f947c..057c492 100644
--- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs
@@ -196,6 +196,7 @@ namespace OpenSim.Services.LLLoginService
196 private BuddyList m_buddyList = null; 196 private BuddyList m_buddyList = null;
197 197
198 private string currency; 198 private string currency;
199 private string classifiedFee;
199 200
200 static LLLoginResponse() 201 static LLLoginResponse()
201 { 202 {
@@ -233,7 +234,7 @@ namespace OpenSim.Services.LLLoginService
233 GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, 234 GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService,
234 string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, 235 string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message,
235 GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency, 236 GridRegion home, IPEndPoint clientIP, string mapTileURL, string profileURL, string openIDURL, string searchURL, string currency,
236 string DSTZone, UUID realID) 237 string DSTZone, string destinationsURL, string avatarsURL, UUID realID, string classifiedFee)
237 : this() 238 : this()
238 { 239 {
239 FillOutInventoryData(invSkel, libService); 240 FillOutInventoryData(invSkel, libService);
@@ -253,9 +254,13 @@ namespace OpenSim.Services.LLLoginService
253 MapTileURL = mapTileURL; 254 MapTileURL = mapTileURL;
254 ProfileURL = profileURL; 255 ProfileURL = profileURL;
255 OpenIDURL = openIDURL; 256 OpenIDURL = openIDURL;
257 DestinationsURL = destinationsURL;
258 AvatarsURL = avatarsURL;
256 259
257 SearchURL = searchURL; 260 SearchURL = searchURL;
258 Currency = currency; 261 Currency = currency;
262 ClassifiedFee = classifiedFee;
263
259 264
260 FillOutHomeData(pinfo, home); 265 FillOutHomeData(pinfo, home);
261 LookAt = String.Format("[r{0},r{1},r{2}]", lookAt.X, lookAt.Y, lookAt.Z); 266 LookAt = String.Format("[r{0},r{1},r{2}]", lookAt.X, lookAt.Y, lookAt.Z);
@@ -470,6 +475,7 @@ namespace OpenSim.Services.LLLoginService
470 searchURL = String.Empty; 475 searchURL = String.Empty;
471 476
472 currency = String.Empty; 477 currency = String.Empty;
478 ClassifiedFee = "0";
473 } 479 }
474 480
475 481
@@ -543,6 +549,12 @@ namespace OpenSim.Services.LLLoginService
543 if (profileURL != String.Empty) 549 if (profileURL != String.Empty)
544 responseData["profile-server-url"] = profileURL; 550 responseData["profile-server-url"] = profileURL;
545 551
552 if (DestinationsURL != String.Empty)
553 responseData["destination_guide_url"] = DestinationsURL;
554
555 if (AvatarsURL != String.Empty)
556 responseData["avatar_picker_url"] = AvatarsURL;
557
546 // We need to send an openid_token back in the response too 558 // We need to send an openid_token back in the response too
547 if (openIDURL != String.Empty) 559 if (openIDURL != String.Empty)
548 responseData["openid_url"] = openIDURL; 560 responseData["openid_url"] = openIDURL;
@@ -557,6 +569,9 @@ namespace OpenSim.Services.LLLoginService
557 // responseData["real_currency"] = currency; 569 // responseData["real_currency"] = currency;
558 responseData["currency"] = currency; 570 responseData["currency"] = currency;
559 } 571 }
572
573 if (ClassifiedFee != String.Empty)
574 responseData["classified_fee"] = ClassifiedFee;
560 575
561 responseData["login"] = "true"; 576 responseData["login"] = "true";
562 577
@@ -662,6 +677,9 @@ namespace OpenSim.Services.LLLoginService
662 if (searchURL != String.Empty) 677 if (searchURL != String.Empty)
663 map["search"] = OSD.FromString(searchURL); 678 map["search"] = OSD.FromString(searchURL);
664 679
680 if (ClassifiedFee != String.Empty)
681 map["classified_fee"] = OSD.FromString(ClassifiedFee);
682
665 if (m_buddyList != null) 683 if (m_buddyList != null)
666 { 684 {
667 map["buddy-list"] = ArrayListToOSDArray(m_buddyList.ToArray()); 685 map["buddy-list"] = ArrayListToOSDArray(m_buddyList.ToArray());
@@ -1073,6 +1091,22 @@ namespace OpenSim.Services.LLLoginService
1073 set { currency = value; } 1091 set { currency = value; }
1074 } 1092 }
1075 1093
1094 public string ClassifiedFee
1095 {
1096 get { return classifiedFee; }
1097 set { classifiedFee = value; }
1098 }
1099
1100 public string DestinationsURL
1101 {
1102 get; set;
1103 }
1104
1105 public string AvatarsURL
1106 {
1107 get; set;
1108 }
1109
1076 #endregion 1110 #endregion
1077 1111
1078 public class UserInfo 1112 public class UserInfo
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index ede2353..faf7f71 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -78,6 +78,9 @@ namespace OpenSim.Services.LLLoginService
78 protected string m_OpenIDURL; 78 protected string m_OpenIDURL;
79 protected string m_SearchURL; 79 protected string m_SearchURL;
80 protected string m_Currency; 80 protected string m_Currency;
81 protected string m_ClassifiedFee;
82 protected string m_DestinationGuide;
83 protected string m_AvatarPicker;
81 84
82 protected string m_AllowedClients; 85 protected string m_AllowedClients;
83 protected string m_DeniedClients; 86 protected string m_DeniedClients;
@@ -117,6 +120,9 @@ namespace OpenSim.Services.LLLoginService
117 m_OpenIDURL = m_LoginServerConfig.GetString("OpenIDServerURL", String.Empty); 120 m_OpenIDURL = m_LoginServerConfig.GetString("OpenIDServerURL", String.Empty);
118 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty); 121 m_SearchURL = m_LoginServerConfig.GetString("SearchURL", string.Empty);
119 m_Currency = m_LoginServerConfig.GetString("Currency", string.Empty); 122 m_Currency = m_LoginServerConfig.GetString("Currency", string.Empty);
123 m_ClassifiedFee = m_LoginServerConfig.GetString("ClassifiedFee", string.Empty);
124 m_DestinationGuide = m_LoginServerConfig.GetString ("DestinationGuide", string.Empty);
125 m_AvatarPicker = m_LoginServerConfig.GetString ("AvatarPicker", string.Empty);
120 126
121 m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty); 127 m_AllowedClients = m_LoginServerConfig.GetString("AllowedClients", string.Empty);
122 m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty); 128 m_DeniedClients = m_LoginServerConfig.GetString("DeniedClients", string.Empty);
@@ -461,7 +467,8 @@ namespace OpenSim.Services.LLLoginService
461 = new LLLoginResponse( 467 = new LLLoginResponse(
462 account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, 468 account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService,
463 where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, 469 where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP,
464 m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone, realID); 470 m_MapTileURL, m_ProfileURL, m_OpenIDURL, m_SearchURL, m_Currency, m_DSTZone,
471 m_DestinationGuide, m_AvatarPicker, realID, m_ClassifiedFee);
465 472
466 m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName); 473 m_log.DebugFormat("[LLOGIN SERVICE]: All clear. Sending login response to {0} {1}", firstName, lastName);
467 474
@@ -934,7 +941,7 @@ namespace OpenSim.Services.LLLoginService
934 private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason) 941 private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason)
935 { 942 {
936 m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName); 943 m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName);
937 if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, clientIP, out reason)) 944 if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, true, out reason))
938 return true; 945 return true;
939 return false; 946 return false;
940 } 947 }
diff --git a/OpenSim/Services/MapImageService/MapImageService.cs b/OpenSim/Services/MapImageService/MapImageService.cs
index a85ee70..9ba5dab 100644
--- a/OpenSim/Services/MapImageService/MapImageService.cs
+++ b/OpenSim/Services/MapImageService/MapImageService.cs
@@ -86,7 +86,7 @@ namespace OpenSim.Services.MapImageService
86 { 86 {
87 Bitmap waterTile = new Bitmap(IMAGE_WIDTH, IMAGE_WIDTH); 87 Bitmap waterTile = new Bitmap(IMAGE_WIDTH, IMAGE_WIDTH);
88 FillImage(waterTile, m_Watercolor); 88 FillImage(waterTile, m_Watercolor);
89 waterTile.Save(m_WaterTileFile); 89 waterTile.Save(m_WaterTileFile, ImageFormat.Jpeg);
90 } 90 }
91 } 91 }
92 } 92 }
diff --git a/OpenSim/Services/UserAccountService/GridUserService.cs b/OpenSim/Services/UserAccountService/GridUserService.cs
index 43fa04b..944411f 100644
--- a/OpenSim/Services/UserAccountService/GridUserService.cs
+++ b/OpenSim/Services/UserAccountService/GridUserService.cs
@@ -46,12 +46,66 @@ namespace OpenSim.Services.UserAccountService
46 46
47 public GridUserService(IConfigSource config) : base(config) 47 public GridUserService(IConfigSource config) : base(config)
48 { 48 {
49 m_log.Debug("[USER GRID SERVICE]: Starting user grid service"); 49 m_log.Debug("[GRID USER SERVICE]: Starting user grid service");
50
51 MainConsole.Instance.Commands.AddCommand(
52 "Users", false,
53 "show grid users online",
54 "show grid users online",
55 "Show number of grid users registered as online.",
56 "This number may not be accurate as a region may crash or not be cleanly shutdown and leave grid users shown as online\n."
57 + "For this reason, users online for more than 5 days are not currently counted",
58 HandleShowGridUsersOnline);
59 }
60
61 protected void HandleShowGridUsersOnline(string module, string[] cmdparams)
62 {
63// if (cmdparams.Length != 4)
64// {
65// MainConsole.Instance.Output("Usage: show grid users online");
66// return;
67// }
68
69// int onlineCount;
70 int onlineRecentlyCount = 0;
71
72 DateTime now = DateTime.UtcNow;
73
74 foreach (GridUserData gu in m_Database.GetAll(""))
75 {
76 if (bool.Parse(gu.Data["Online"]))
77 {
78// onlineCount++;
79
80 int unixLoginTime = int.Parse(gu.Data["Login"]);
81
82 if ((now - Util.ToDateTime(unixLoginTime)).Days < 5)
83 onlineRecentlyCount++;
84 }
85 }
86
87 MainConsole.Instance.OutputFormat("Users online: {0}", onlineRecentlyCount);
50 } 88 }
51 89
52 public virtual GridUserInfo GetGridUserInfo(string userID) 90 public virtual GridUserInfo GetGridUserInfo(string userID)
53 { 91 {
54 GridUserData d = m_Database.Get(userID); 92 GridUserData d = null;
93 if (userID.Length > 36) // it's a UUI
94 d = m_Database.Get(userID);
95 else // it's a UUID
96 {
97 GridUserData[] ds = m_Database.GetAll(userID);
98 if (ds == null)
99 return null;
100
101 if (ds.Length > 0)
102 {
103 d = ds[0];
104 foreach (GridUserData dd in ds)
105 if (dd.UserID.Length > d.UserID.Length) // find the longest
106 d = dd;
107 }
108 }
55 109
56 if (d == null) 110 if (d == null)
57 return null; 111 return null;
@@ -73,7 +127,7 @@ namespace OpenSim.Services.UserAccountService
73 return info; 127 return info;
74 } 128 }
75 129
76 public GridUserInfo[] GetGridUserInfo(string[] userIDs) 130 public virtual GridUserInfo[] GetGridUserInfo(string[] userIDs)
77 { 131 {
78 List<GridUserInfo> ret = new List<GridUserInfo>(); 132 List<GridUserInfo> ret = new List<GridUserInfo>();
79 133
@@ -140,7 +194,7 @@ namespace OpenSim.Services.UserAccountService
140 194
141 public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) 195 public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt)
142 { 196 {
143 //m_log.DebugFormat("[Grid User Service]: SetLastPosition for {0}", userID); 197 m_log.DebugFormat("[GRID USER SERVICE]: SetLastPosition for {0}", userID);
144 GridUserData d = m_Database.Get(userID); 198 GridUserData d = m_Database.Get(userID);
145 if (d == null) 199 if (d == null)
146 { 200 {
diff --git a/OpenSim/Services/UserProfilesService/UserProfilesService.cs b/OpenSim/Services/UserProfilesService/UserProfilesService.cs
new file mode 100644
index 0000000..d00f34d
--- /dev/null
+++ b/OpenSim/Services/UserProfilesService/UserProfilesService.cs
@@ -0,0 +1,187 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using System.Text;
31using Nini.Config;
32using log4net;
33using OpenSim.Server.Base;
34using OpenSim.Services.Interfaces;
35using OpenSim.Services.UserAccountService;
36using OpenSim.Data;
37using OpenMetaverse;
38using OpenMetaverse.StructuredData;
39using OpenSim.Framework;
40
41namespace OpenSim.Services.ProfilesService
42{
43 public class UserProfilesService: UserProfilesServiceBase, IUserProfilesService
44 {
45 static readonly ILog m_log =
46 LogManager.GetLogger(
47 MethodBase.GetCurrentMethod().DeclaringType);
48
49 IUserAccountService userAccounts;
50 IAuthenticationService authService;
51
52 public UserProfilesService(IConfigSource config, string configName):
53 base(config, configName)
54 {
55 IConfig Config = config.Configs[configName];
56 if (Config == null)
57 {
58 m_log.Warn("[PROFILES]: No configuration found!");
59 return;
60 }
61 Object[] args = null;
62
63 args = new Object[] { config };
64 string accountService = Config.GetString("UserAccountService", String.Empty);
65 if (accountService != string.Empty)
66 userAccounts = ServerUtils.LoadPlugin<IUserAccountService>(accountService, args);
67
68 args = new Object[] { config };
69 string authServiceConfig = Config.GetString("AuthenticationServiceModule", String.Empty);
70 if (accountService != string.Empty)
71 authService = ServerUtils.LoadPlugin<IAuthenticationService>(authServiceConfig, args);
72 }
73
74 #region Classifieds
75 public OSD AvatarClassifiedsRequest(UUID creatorId)
76 {
77 OSDArray records = ProfilesData.GetClassifiedRecords(creatorId);
78
79 return records;
80 }
81
82 public bool ClassifiedUpdate(UserClassifiedAdd ad, ref string result)
83 {
84 if(!ProfilesData.UpdateClassifiedRecord(ad, ref result))
85 {
86 return false;
87 }
88 result = "success";
89 return true;
90 }
91
92 public bool ClassifiedDelete(UUID recordId)
93 {
94 if(ProfilesData.DeleteClassifiedRecord(recordId))
95 return true;
96
97 return false;
98 }
99
100 public bool ClassifiedInfoRequest(ref UserClassifiedAdd ad, ref string result)
101 {
102 if(ProfilesData.GetClassifiedInfo(ref ad, ref result))
103 return true;
104
105 return false;
106 }
107 #endregion Classifieds
108
109 #region Picks
110 public OSD AvatarPicksRequest(UUID creatorId)
111 {
112 OSDArray records = ProfilesData.GetAvatarPicks(creatorId);
113
114 return records;
115 }
116
117 public bool PickInfoRequest(ref UserProfilePick pick, ref string result)
118 {
119 pick = ProfilesData.GetPickInfo(pick.CreatorId, pick.PickId);
120 result = "OK";
121 return true;
122 }
123
124 public bool PicksUpdate(ref UserProfilePick pick, ref string result)
125 {
126 return ProfilesData.UpdatePicksRecord(pick);
127 }
128
129 public bool PicksDelete(UUID pickId)
130 {
131 return ProfilesData.DeletePicksRecord(pickId);
132 }
133 #endregion Picks
134
135 #region Notes
136 public bool AvatarNotesRequest(ref UserProfileNotes note)
137 {
138 return ProfilesData.GetAvatarNotes(ref note);
139 }
140
141 public bool NotesUpdate(ref UserProfileNotes note, ref string result)
142 {
143 return ProfilesData.UpdateAvatarNotes(ref note, ref result);
144 }
145 #endregion Notes
146
147 #region Profile Properties
148 public bool AvatarPropertiesRequest(ref UserProfileProperties prop, ref string result)
149 {
150 return ProfilesData.GetAvatarProperties(ref prop, ref result);
151 }
152
153 public bool AvatarPropertiesUpdate(ref UserProfileProperties prop, ref string result)
154 {
155 return ProfilesData.UpdateAvatarProperties(ref prop, ref result);
156 }
157 #endregion Profile Properties
158
159 #region Interests
160 public bool AvatarInterestsUpdate(UserProfileProperties prop, ref string result)
161 {
162 return ProfilesData.UpdateAvatarInterests(prop, ref result);
163 }
164 #endregion Interests
165
166 #region Utility
167 public OSD AvatarImageAssetsRequest(UUID avatarId)
168 {
169 OSDArray records = ProfilesData.GetUserImageAssets(avatarId);
170 return records;
171 }
172 #endregion Utility
173
174 #region UserData
175 public bool RequestUserAppData(ref UserAppData prop, ref string result)
176 {
177 return ProfilesData.GetUserAppData(ref prop, ref result);
178 }
179
180 public bool SetUserAppData(UserAppData prop, ref string result)
181 {
182 return true;
183 }
184 #endregion UserData
185 }
186}
187
diff --git a/OpenSim/Services/UserProfilesService/UserProfilesServiceBase.cs b/OpenSim/Services/UserProfilesService/UserProfilesServiceBase.cs
new file mode 100644
index 0000000..927f7c9
--- /dev/null
+++ b/OpenSim/Services/UserProfilesService/UserProfilesServiceBase.cs
@@ -0,0 +1,86 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using Nini.Config;
31using log4net;
32using OpenSim.Services.Base;
33using OpenSim.Data;
34
35namespace OpenSim.Services.ProfilesService
36{
37 public class UserProfilesServiceBase: ServiceBase
38 {
39 static readonly ILog m_log =
40 LogManager.GetLogger(
41 MethodBase.GetCurrentMethod().DeclaringType);
42
43 public IProfilesData ProfilesData;
44
45 public string ConfigName
46 {
47 get; private set;
48 }
49
50 public UserProfilesServiceBase(IConfigSource config, string configName):
51 base(config)
52 {
53 if(string.IsNullOrEmpty(configName))
54 {
55 m_log.WarnFormat("[PROFILES]: Configuration section not given!");
56 return;
57 }
58
59 string dllName = String.Empty;
60 string connString = null;
61 string realm = String.Empty;
62
63 IConfig dbConfig = config.Configs["DatabaseService"];
64 if (dbConfig != null)
65 {
66 if (dllName == String.Empty)
67 dllName = dbConfig.GetString("StorageProvider", String.Empty);
68 if (string.IsNullOrEmpty(connString))
69 connString = dbConfig.GetString("ConnectionString", String.Empty);
70 }
71
72 IConfig ProfilesConfig = config.Configs[configName];
73 if (ProfilesConfig != null)
74 {
75 connString = ProfilesConfig.GetString("ConnectionString", connString);
76 realm = ProfilesConfig.GetString("Realm", realm);
77 }
78
79 ProfilesData = LoadPlugin<IProfilesData>(dllName, new Object[] { connString });
80 if (ProfilesData == null)
81 throw new Exception("Could not find a storage interface in the given module");
82
83 }
84 }
85}
86
diff --git a/OpenSim/Tests/Clients/Assets/AssetsClient.cs b/OpenSim/Tests/Clients/Assets/AssetsClient.cs
new file mode 100644
index 0000000..e988d0e
--- /dev/null
+++ b/OpenSim/Tests/Clients/Assets/AssetsClient.cs
@@ -0,0 +1,126 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Net;
31using System.Text;
32using System.Reflection;
33using System.Threading;
34
35using OpenMetaverse;
36using log4net;
37using log4net.Appender;
38using log4net.Layout;
39
40using OpenSim.Framework;
41using OpenSim.Services.Interfaces;
42using OpenSim.Services.Connectors;
43
44namespace OpenSim.Tests.Clients.AssetsClient
45{
46 public class AssetsClient
47 {
48 private static readonly ILog m_log =
49 LogManager.GetLogger(
50 MethodBase.GetCurrentMethod().DeclaringType);
51
52 private static int m_MaxThreadID = 0;
53 private static readonly int NREQS = 150;
54 private static int m_NReceived = 0;
55
56 public static void Main(string[] args)
57 {
58 ConsoleAppender consoleAppender = new ConsoleAppender();
59 consoleAppender.Layout =
60 new PatternLayout("[%thread] - %message%newline");
61 log4net.Config.BasicConfigurator.Configure(consoleAppender);
62
63 string serverURI = "http://127.0.0.1:8003";
64 if (args.Length > 1)
65 serverURI = args[1];
66 int max1, max2;
67 ThreadPool.GetMaxThreads(out max1, out max2);
68 m_log.InfoFormat("[ASSET CLIENT]: Connecting to {0} max threads = {1} - {2}", serverURI, max1, max2);
69 ThreadPool.GetMinThreads(out max1, out max2);
70 m_log.InfoFormat("[ASSET CLIENT]: Connecting to {0} min threads = {1} - {2}", serverURI, max1, max2);
71
72 if (!ThreadPool.SetMinThreads(1, 1))
73 m_log.WarnFormat("[ASSET CLIENT]: Failed to set min threads");
74
75 if (!ThreadPool.SetMaxThreads(10, 3))
76 m_log.WarnFormat("[ASSET CLIENT]: Failed to set max threads");
77
78 ThreadPool.GetMaxThreads(out max1, out max2);
79 m_log.InfoFormat("[ASSET CLIENT]: Post set max threads = {1} - {2}", serverURI, max1, max2);
80 ThreadPool.GetMinThreads(out max1, out max2);
81 m_log.InfoFormat("[ASSET CLIENT]: Post set min threads = {1} - {2}", serverURI, max1, max2);
82
83 ServicePointManager.DefaultConnectionLimit = 12;
84
85 AssetServicesConnector m_Connector = new AssetServicesConnector(serverURI);
86 m_Connector.MaxAssetRequestConcurrency = 30;
87
88 for (int i = 0; i < NREQS; i++)
89 {
90 UUID uuid = UUID.Random();
91 m_Connector.Get(uuid.ToString(), null, ResponseReceived);
92 m_log.InfoFormat("[ASSET CLIENT]: [{0}] requested asset {1}", i, uuid);
93 }
94
95 for (int i = 0; i < 500; i++)
96 {
97 var x = i;
98 ThreadPool.QueueUserWorkItem(delegate
99 {
100 Dummy(x);
101 });
102 }
103
104 Thread.Sleep(30 * 1000);
105 m_log.InfoFormat("[ASSET CLIENT]: Received responses {0}", m_NReceived);
106 }
107
108 private static void ResponseReceived(string id, Object sender, AssetBase asset)
109 {
110 if (Thread.CurrentThread.ManagedThreadId > m_MaxThreadID)
111 m_MaxThreadID = Thread.CurrentThread.ManagedThreadId;
112 int max1, max2;
113 ThreadPool.GetAvailableThreads(out max1, out max2);
114 m_log.InfoFormat("[ASSET CLIENT]: Received asset {0} ({1}) ({2}-{3}) {4}", id, m_MaxThreadID, max1, max2, DateTime.Now.ToString("hh:mm:ss"));
115 m_NReceived++;
116 }
117
118 private static void Dummy(int i)
119 {
120 int max1, max2;
121 ThreadPool.GetAvailableThreads(out max1, out max2);
122 m_log.InfoFormat("[ASSET CLIENT]: ({0}) Hello! {1} - {2} {3}", i, max1, max2, DateTime.Now.ToString("hh:mm:ss"));
123 Thread.Sleep(2000);
124 }
125 }
126}
diff --git a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
index 6cc7ff2..ff6608d 100644
--- a/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/EntityTransferHelpers.cs
@@ -31,6 +31,7 @@ using System.IO;
31using System.Net; 31using System.Net;
32using System.Reflection; 32using System.Reflection;
33using System.Text; 33using System.Text;
34using System.Threading;
34using log4net; 35using log4net;
35using Nini.Config; 36using Nini.Config;
36using NUnit.Framework; 37using NUnit.Framework;
@@ -59,7 +60,8 @@ namespace OpenSim.Tests.Common
59 /// A list that will be populated with any TestClients set up in response to 60 /// A list that will be populated with any TestClients set up in response to
60 /// being informed about a destination region. 61 /// being informed about a destination region.
61 /// </param> 62 /// </param>
62 public static void SetUpInformClientOfNeighbour(TestClient tc, List<TestClient> neighbourTcs) 63 public static void SetupInformClientOfNeighbourTriggersNeighbourClientCreate(
64 TestClient tc, List<TestClient> neighbourTcs)
63 { 65 {
64 // XXX: Confusingly, this is also used for non-neighbour notification (as in teleports that do not use the 66 // XXX: Confusingly, this is also used for non-neighbour notification (as in teleports that do not use the
65 // event queue). 67 // event queue).
@@ -75,17 +77,52 @@ namespace OpenSim.Tests.Common
75 "[TEST CLIENT]: Processing inform client of neighbour located at {0},{1} at {2}", 77 "[TEST CLIENT]: Processing inform client of neighbour located at {0},{1} at {2}",
76 x, y, neighbourExternalEndPoint); 78 x, y, neighbourExternalEndPoint);
77 79
78 // In response to this message, we are going to make a teleport to the scene we've previous been told
79 // about by test code (this needs to be improved).
80 AgentCircuitData newAgent = tc.RequestClientInfo(); 80 AgentCircuitData newAgent = tc.RequestClientInfo();
81 81
82 Scene neighbourScene; 82 Scene neighbourScene;
83 SceneManager.Instance.TryGetScene(x, y, out neighbourScene); 83 SceneManager.Instance.TryGetScene(x, y, out neighbourScene);
84 84
85 TestClient neighbourTc = new TestClient(newAgent, neighbourScene, SceneManager.Instance); 85 TestClient neighbourTc = new TestClient(newAgent, neighbourScene);
86 neighbourTcs.Add(neighbourTc); 86 neighbourTcs.Add(neighbourTc);
87 neighbourScene.AddNewClient(neighbourTc, PresenceType.User); 87 neighbourScene.AddNewClient(neighbourTc, PresenceType.User);
88 }; 88 };
89 } 89 }
90
91 /// <summary>
92 /// Set up correct handling of the InformClientOfNeighbour call from the source region that triggers the
93 /// viewer to setup a connection with the destination region.
94 /// </summary>
95 /// <param name='tc'></param>
96 /// <param name='neighbourTcs'>
97 /// A list that will be populated with any TestClients set up in response to
98 /// being informed about a destination region.
99 /// </param>
100 public static void SetupSendRegionTeleportTriggersDestinationClientCreateAndCompleteMovement(
101 TestClient client, List<TestClient> destinationClients)
102 {
103 client.OnTestClientSendRegionTeleport
104 += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) =>
105 {
106 uint x, y;
107 Utils.LongToUInts(regionHandle, out x, out y);
108 x /= Constants.RegionSize;
109 y /= Constants.RegionSize;
110
111 m_log.DebugFormat(
112 "[TEST CLIENT]: Processing send region teleport for destination at {0},{1} at {2}",
113 x, y, regionExternalEndPoint);
114
115 AgentCircuitData newAgent = client.RequestClientInfo();
116
117 Scene destinationScene;
118 SceneManager.Instance.TryGetScene(x, y, out destinationScene);
119
120 TestClient destinationClient = new TestClient(newAgent, destinationScene);
121 destinationClients.Add(destinationClient);
122 destinationScene.AddNewClient(destinationClient, PresenceType.User);
123
124 ThreadPool.UnsafeQueueUserWorkItem(o => destinationClient.CompleteMovement(), null);
125 };
126 }
90 } 127 }
91} \ No newline at end of file 128} \ No newline at end of file
diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
index bdd9093..d9bb85e 100644
--- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs
@@ -447,9 +447,6 @@ namespace OpenSim.Tests.Common
447 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test 447 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
448 /// </summary> 448 /// </summary>
449 /// <remarks> 449 /// <remarks>
450 /// This can be used for tests where there is only one region or where there are multiple non-neighbour regions
451 /// and teleport doesn't take place.
452 ///
453 /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will 450 /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will
454 /// make the agent circuit data (e.g. first, lastname) consistent with the user account data. 451 /// make the agent circuit data (e.g. first, lastname) consistent with the user account data.
455 /// </remarks> 452 /// </remarks>
@@ -462,22 +459,6 @@ namespace OpenSim.Tests.Common
462 } 459 }
463 460
464 /// <summary> 461 /// <summary>
465 /// Add a root agent where the details of the agent connection (apart from the id) are unimportant for the test
466 /// </summary>
467 /// <remarks>
468 /// XXX: Use the version of this method that takes the UserAccount structure wherever possible - this will
469 /// make the agent circuit data (e.g. first, lastname) consistent with the user account data.
470 /// </remarks>
471 /// <param name="scene"></param>
472 /// <param name="agentId"></param>
473 /// <param name="sceneManager"></param>
474 /// <returns></returns>
475 public static ScenePresence AddScenePresence(Scene scene, UUID agentId, SceneManager sceneManager)
476 {
477 return AddScenePresence(scene, GenerateAgentData(agentId), sceneManager);
478 }
479
480 /// <summary>
481 /// Add a root agent. 462 /// Add a root agent.
482 /// </summary> 463 /// </summary>
483 /// <param name="scene"></param> 464 /// <param name="scene"></param>
@@ -508,31 +489,7 @@ namespace OpenSim.Tests.Common
508 /// <returns></returns> 489 /// <returns></returns>
509 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) 490 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData)
510 { 491 {
511 return AddScenePresence(scene, agentData, null); 492 return AddScenePresence(scene, new TestClient(agentData, scene), agentData);
512 }
513
514 /// <summary>
515 /// Add a root agent.
516 /// </summary>
517 /// <remarks>
518 /// This function
519 ///
520 /// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
521 /// userserver if grid) would give initial login data back to the client and separately tell the scene that the
522 /// agent was coming.
523 ///
524 /// 2) Connects the agent with the scene
525 ///
526 /// This function performs actions equivalent with notifying the scene that an agent is
527 /// coming and then actually connecting the agent to the scene. The one step missed out is the very first
528 /// </remarks>
529 /// <param name="scene"></param>
530 /// <param name="agentData"></param>
531 /// <param name="sceneManager"></param>
532 /// <returns></returns>
533 public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData, SceneManager sceneManager)
534 {
535 return AddScenePresence(scene, new TestClient(agentData, scene, sceneManager), agentData, sceneManager);
536 } 493 }
537 494
538 /// <summary> 495 /// <summary>
@@ -552,10 +509,9 @@ namespace OpenSim.Tests.Common
552 /// </remarks> 509 /// </remarks>
553 /// <param name="scene"></param> 510 /// <param name="scene"></param>
554 /// <param name="agentData"></param> 511 /// <param name="agentData"></param>
555 /// <param name="sceneManager"></param>
556 /// <returns></returns> 512 /// <returns></returns>
557 public static ScenePresence AddScenePresence( 513 public static ScenePresence AddScenePresence(
558 Scene scene, IClientAPI client, AgentCircuitData agentData, SceneManager sceneManager) 514 Scene scene, IClientAPI client, AgentCircuitData agentData)
559 { 515 {
560 // We emulate the proper login sequence here by doing things in four stages 516 // We emulate the proper login sequence here by doing things in four stages
561 517
@@ -578,10 +534,6 @@ namespace OpenSim.Tests.Common
578 /// Introduce an agent into the scene by adding a new client. 534 /// Introduce an agent into the scene by adding a new client.
579 /// </summary> 535 /// </summary>
580 /// <returns>The scene presence added</returns> 536 /// <returns>The scene presence added</returns>
581 /// <param name='sceneManager'>
582 /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not
583 /// neighbours and where no teleporting takes place.
584 /// </param>
585 /// <param name='scene'></param> 537 /// <param name='scene'></param>
586 /// <param name='testClient'></param> 538 /// <param name='testClient'></param>
587 /// <param name='agentData'></param> 539 /// <param name='agentData'></param>
@@ -607,7 +559,7 @@ namespace OpenSim.Tests.Common
607 acd.child = true; 559 acd.child = true;
608 560
609 // XXX: ViaLogin may not be correct for child agents 561 // XXX: ViaLogin may not be correct for child agents
610 TestClient client = new TestClient(acd, scene, null); 562 TestClient client = new TestClient(acd, scene);
611 return IntroduceClientToScene(scene, client, acd, TeleportFlags.ViaLogin); 563 return IntroduceClientToScene(scene, client, acd, TeleportFlags.ViaLogin);
612 } 564 }
613 565
diff --git a/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs b/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs
index a1794c9..b3b75af 100644
--- a/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs
+++ b/OpenSim/Tests/Common/Helpers/UserInventoryHelpers.cs
@@ -218,12 +218,37 @@ namespace OpenSim.Tests.Common
218 public static InventoryFolderBase CreateInventoryFolder( 218 public static InventoryFolderBase CreateInventoryFolder(
219 IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders) 219 IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders)
220 { 220 {
221 return CreateInventoryFolder(inventoryService, userId, UUID.Random(), path, useExistingFolders);
222 }
223
224 /// <summary>
225 /// Create inventory folders starting from the user's root folder.
226 /// </summary>
227 /// <param name="inventoryService"></param>
228 /// <param name="userId"></param>
229 /// <param name="folderId"></param>
230 /// <param name="path">
231 /// The folders to create. Multiple folders can be specified on a path delimited by the PATH_DELIMITER
232 /// </param>
233 /// <param name="useExistingFolders">
234 /// If true, then folders in the path which already the same name are
235 /// used. This applies to the terminal folder as well.
236 /// If false, then all folders in the path are created, even if there is already a folder at a particular
237 /// level with the same name.
238 /// </param>
239 /// <returns>
240 /// The folder created. If the path contains multiple folders then the last one created is returned.
241 /// Will return null if the root folder could not be found.
242 /// </returns>
243 public static InventoryFolderBase CreateInventoryFolder(
244 IInventoryService inventoryService, UUID userId, UUID folderId, string path, bool useExistingFolders)
245 {
221 InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId); 246 InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId);
222 247
223 if (null == rootFolder) 248 if (null == rootFolder)
224 return null; 249 return null;
225 250
226 return CreateInventoryFolder(inventoryService, rootFolder, path, useExistingFolders); 251 return CreateInventoryFolder(inventoryService, folderId, rootFolder, path, useExistingFolders);
227 } 252 }
228 253
229 /// <summary> 254 /// <summary>
@@ -235,6 +260,7 @@ namespace OpenSim.Tests.Common
235 /// TODO: May need to make it an option to create duplicate folders. 260 /// TODO: May need to make it an option to create duplicate folders.
236 /// </remarks> 261 /// </remarks>
237 /// <param name="inventoryService"></param> 262 /// <param name="inventoryService"></param>
263 /// <param name="folderId">ID of the folder to create</param>
238 /// <param name="parentFolder"></param> 264 /// <param name="parentFolder"></param>
239 /// <param name="path"> 265 /// <param name="path">
240 /// The folder to create. 266 /// The folder to create.
@@ -249,7 +275,7 @@ namespace OpenSim.Tests.Common
249 /// The folder created. If the path contains multiple folders then the last one created is returned. 275 /// The folder created. If the path contains multiple folders then the last one created is returned.
250 /// </returns> 276 /// </returns>
251 public static InventoryFolderBase CreateInventoryFolder( 277 public static InventoryFolderBase CreateInventoryFolder(
252 IInventoryService inventoryService, InventoryFolderBase parentFolder, string path, bool useExistingFolders) 278 IInventoryService inventoryService, UUID folderId, InventoryFolderBase parentFolder, string path, bool useExistingFolders)
253 { 279 {
254 string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None); 280 string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None);
255 281
@@ -262,9 +288,16 @@ namespace OpenSim.Tests.Common
262 { 288 {
263// Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name); 289// Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name);
264 290
291 UUID folderIdForCreate;
292
293 if (components.Length > 1)
294 folderIdForCreate = UUID.Random();
295 else
296 folderIdForCreate = folderId;
297
265 folder 298 folder
266 = new InventoryFolderBase( 299 = new InventoryFolderBase(
267 UUID.Random(), components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0); 300 folderIdForCreate, components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0);
268 301
269 inventoryService.AddFolder(folder); 302 inventoryService.AddFolder(folder);
270 } 303 }
@@ -274,7 +307,7 @@ namespace OpenSim.Tests.Common
274// } 307// }
275 308
276 if (components.Length > 1) 309 if (components.Length > 1)
277 return CreateInventoryFolder(inventoryService, folder, components[1], useExistingFolders); 310 return CreateInventoryFolder(inventoryService, folderId, folder, components[1], useExistingFolders);
278 else 311 else
279 return folder; 312 return folder;
280 } 313 }
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index dce2fd7..e8520f2 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -47,9 +47,9 @@ namespace OpenSim.Tests.Common.Mock
47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing"); 47 EventWaitHandle wh = new EventWaitHandle (false, EventResetMode.AutoReset, "Crossing");
48 48
49 private Scene m_scene; 49 private Scene m_scene;
50 private SceneManager m_sceneManager;
51 50
52 // Properties so that we can get at received data for test purposes 51 // Properties so that we can get at received data for test purposes
52 public List<uint> ReceivedKills { get; private set; }
53 public List<UUID> ReceivedOfflineNotifications { get; private set; } 53 public List<UUID> ReceivedOfflineNotifications { get; private set; }
54 public List<UUID> ReceivedOnlineNotifications { get; private set; } 54 public List<UUID> ReceivedOnlineNotifications { get; private set; }
55 public List<UUID> ReceivedFriendshipTerminations { get; private set; } 55 public List<UUID> ReceivedFriendshipTerminations { get; private set; }
@@ -61,6 +61,12 @@ namespace OpenSim.Tests.Common.Mock
61 // Test client specific events - for use by tests to implement some IClientAPI behaviour. 61 // Test client specific events - for use by tests to implement some IClientAPI behaviour.
62 public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion; 62 public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion;
63 public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour; 63 public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour;
64 public event TestClientOnSendRegionTeleportDelegate OnTestClientSendRegionTeleport;
65 public event Action<GridInstantMessage> OnReceivedInstantMessage;
66
67 public delegate void TestClientOnSendRegionTeleportDelegate(
68 ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
69 uint locationID, uint flags, string capsURL);
64 70
65// disable warning: public events, part of the public API 71// disable warning: public events, part of the public API
66#pragma warning disable 67 72#pragma warning disable 67
@@ -106,6 +112,7 @@ namespace OpenSim.Tests.Common.Mock
106 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 112 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
107 public event UpdateAgent OnPreAgentUpdate; 113 public event UpdateAgent OnPreAgentUpdate;
108 public event UpdateAgent OnAgentUpdate; 114 public event UpdateAgent OnAgentUpdate;
115 public event UpdateAgent OnAgentCameraUpdate;
109 public event AgentRequestSit OnAgentRequestSit; 116 public event AgentRequestSit OnAgentRequestSit;
110 public event AgentSit OnAgentSit; 117 public event AgentSit OnAgentSit;
111 public event AvatarPickerRequest OnAvatarPickerRequest; 118 public event AvatarPickerRequest OnAvatarPickerRequest;
@@ -197,6 +204,7 @@ namespace OpenSim.Tests.Common.Mock
197 public event EstateCovenantRequest OnEstateCovenantRequest; 204 public event EstateCovenantRequest OnEstateCovenantRequest;
198 public event EstateChangeInfo OnEstateChangeInfo; 205 public event EstateChangeInfo OnEstateChangeInfo;
199 public event EstateManageTelehub OnEstateManageTelehub; 206 public event EstateManageTelehub OnEstateManageTelehub;
207 public event CachedTextureRequest OnCachedTextureRequest;
200 208
201 public event ObjectDuplicateOnRay OnObjectDuplicateOnRay; 209 public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
202 210
@@ -435,33 +443,21 @@ namespace OpenSim.Tests.Common.Mock
435 /// <summary> 443 /// <summary>
436 /// Constructor 444 /// Constructor
437 /// </summary> 445 /// </summary>
438 /// <remarks>
439 /// Can be used for a test where there is only one region or where there are multiple regions that are not
440 /// neighbours and where no teleporting takes place. In other situations, the constructor that takes in a
441 /// scene manager should be used.
442 /// </remarks>
443 /// <param name="agentData"></param>
444 /// <param name="scene"></param>
445 public TestClient(AgentCircuitData agentData, Scene scene) : this(agentData, scene, null) {}
446
447 /// <summary>
448 /// Constructor
449 /// </summary>
450 /// <param name="agentData"></param> 446 /// <param name="agentData"></param>
451 /// <param name="scene"></param> 447 /// <param name="scene"></param>
452 /// <param name="sceneManager"></param> 448 /// <param name="sceneManager"></param>
453 public TestClient(AgentCircuitData agentData, Scene scene, SceneManager sceneManager) 449 public TestClient(AgentCircuitData agentData, Scene scene)
454 { 450 {
455 m_agentId = agentData.AgentID; 451 m_agentId = agentData.AgentID;
456 m_firstName = agentData.firstname; 452 m_firstName = agentData.firstname;
457 m_lastName = agentData.lastname; 453 m_lastName = agentData.lastname;
458 m_circuitCode = agentData.circuitcode; 454 m_circuitCode = agentData.circuitcode;
459 m_scene = scene; 455 m_scene = scene;
460 m_sceneManager = sceneManager;
461 SessionId = agentData.SessionID; 456 SessionId = agentData.SessionID;
462 SecureSessionId = agentData.SecureSessionID; 457 SecureSessionId = agentData.SecureSessionID;
463 CapsSeedUrl = agentData.CapsPath; 458 CapsSeedUrl = agentData.CapsPath;
464 459
460 ReceivedKills = new List<uint>();
465 ReceivedOfflineNotifications = new List<UUID>(); 461 ReceivedOfflineNotifications = new List<UUID>();
466 ReceivedOnlineNotifications = new List<UUID>(); 462 ReceivedOnlineNotifications = new List<UUID>();
467 ReceivedFriendshipTerminations = new List<UUID>(); 463 ReceivedFriendshipTerminations = new List<UUID>();
@@ -484,7 +480,20 @@ namespace OpenSim.Tests.Common.Mock
484 480
485 public void CompleteMovement() 481 public void CompleteMovement()
486 { 482 {
487 OnCompleteMovementToRegion(this, true); 483 if (OnCompleteMovementToRegion != null)
484 OnCompleteMovementToRegion(this, true);
485 }
486
487 /// <summary>
488 /// Emulate sending an IM from the viewer to the simulator.
489 /// </summary>
490 /// <param name='im'></param>
491 public void HandleImprovedInstantMessage(GridInstantMessage im)
492 {
493 ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
494
495 if (handlerInstantMessage != null)
496 handlerInstantMessage(this, im);
488 } 497 }
489 498
490 public virtual void ActivateGesture(UUID assetId, UUID gestureId) 499 public virtual void ActivateGesture(UUID assetId, UUID gestureId)
@@ -499,6 +508,11 @@ namespace OpenSim.Tests.Common.Mock
499 { 508 {
500 } 509 }
501 510
511 public void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures)
512 {
513
514 }
515
502 public virtual void Kick(string message) 516 public virtual void Kick(string message)
503 { 517 {
504 } 518 }
@@ -513,11 +527,11 @@ namespace OpenSim.Tests.Common.Mock
513 527
514 public virtual void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle) 528 public virtual void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
515 { 529 {
516
517 } 530 }
518 531
519 public virtual void SendKillObject(ulong regionHandle, List<uint> localID) 532 public virtual void SendKillObject(List<uint> localID)
520 { 533 {
534 ReceivedKills.AddRange(localID);
521 } 535 }
522 536
523 public virtual void SetChildAgentThrottle(byte[] throttle) 537 public virtual void SetChildAgentThrottle(byte[] throttle)
@@ -526,15 +540,13 @@ namespace OpenSim.Tests.Common.Mock
526 540
527 public void SetAgentThrottleSilent(int throttle, int setting) 541 public void SetAgentThrottleSilent(int throttle, int setting)
528 { 542 {
529
530
531 } 543 }
544
532 public byte[] GetThrottlesPacked(float multiplier) 545 public byte[] GetThrottlesPacked(float multiplier)
533 { 546 {
534 return new byte[0]; 547 return new byte[0];
535 } 548 }
536 549
537
538 public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs) 550 public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
539 { 551 {
540 } 552 }
@@ -547,7 +559,8 @@ namespace OpenSim.Tests.Common.Mock
547 559
548 public void SendInstantMessage(GridInstantMessage im) 560 public void SendInstantMessage(GridInstantMessage im)
549 { 561 {
550 562 if (OnReceivedInstantMessage != null)
563 OnReceivedInstantMessage(im);
551 } 564 }
552 565
553 public void SendGenericMessage(string method, UUID invoice, List<string> message) 566 public void SendGenericMessage(string method, UUID invoice, List<string> message)
@@ -585,7 +598,7 @@ namespace OpenSim.Tests.Common.Mock
585 { 598 {
586 AgentCircuitData agentData = new AgentCircuitData(); 599 AgentCircuitData agentData = new AgentCircuitData();
587 agentData.AgentID = AgentId; 600 agentData.AgentID = AgentId;
588 agentData.SessionID = UUID.Zero; 601 agentData.SessionID = SessionId;
589 agentData.SecureSessionID = UUID.Zero; 602 agentData.SecureSessionID = UUID.Zero;
590 agentData.circuitcode = m_circuitCode; 603 agentData.circuitcode = m_circuitCode;
591 agentData.child = false; 604 agentData.child = false;
@@ -608,21 +621,25 @@ namespace OpenSim.Tests.Common.Mock
608 OnTestClientInformClientOfNeighbour(neighbourHandle, neighbourExternalEndPoint); 621 OnTestClientInformClientOfNeighbour(neighbourHandle, neighbourExternalEndPoint);
609 } 622 }
610 623
611 public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, 624 public virtual void SendRegionTeleport(
612 uint locationID, uint flags, string capsURL) 625 ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
626 uint locationID, uint flags, string capsURL)
613 { 627 {
614 m_log.DebugFormat("[TEST CLIENT]: Received SendRegionTeleport"); 628 m_log.DebugFormat(
629 "[TEST CLIENT]: Received SendRegionTeleport for {0} {1} on {2}", m_firstName, m_lastName, m_scene.Name);
615 630
616 CapsSeedUrl = capsURL; 631 CapsSeedUrl = capsURL;
617 632
618 // We don't do this here so that the source region can complete processing first in a single-threaded 633 if (OnTestClientSendRegionTeleport != null)
619 // regression test scenario. The test itself will have to call CompleteTeleportClientSide() after a teleport 634 OnTestClientSendRegionTeleport(
620 // CompleteTeleportClientSide(); 635 regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL);
621 } 636 }
622 637
623 public virtual void SendTeleportFailed(string reason) 638 public virtual void SendTeleportFailed(string reason)
624 { 639 {
625 m_log.DebugFormat("[TEST CLIENT]: Teleport failed with reason {0}", reason); 640 m_log.DebugFormat(
641 "[TEST CLIENT]: Teleport failed for {0} {1} on {2} with reason {3}",
642 m_firstName, m_lastName, m_scene.Name, reason);
626 } 643 }
627 644
628 public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, 645 public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt,
@@ -1260,7 +1277,7 @@ namespace OpenSim.Tests.Common.Mock
1260 { 1277 {
1261 } 1278 }
1262 1279
1263 public void StopFlying(ISceneEntity presence) 1280 public void SendAgentTerseUpdate(ISceneEntity presence)
1264 { 1281 {
1265 } 1282 }
1266 1283
diff --git a/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
index ccbdf81..2be5524 100644
--- a/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
+++ b/OpenSim/Tests/Common/Mock/TestXInventoryDataPlugin.cs
@@ -53,6 +53,9 @@ namespace OpenSim.Tests.Common.Mock
53 53
54 public XInventoryFolder[] GetFolders(string[] fields, string[] vals) 54 public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
55 { 55 {
56// Console.WriteLine(
57// "Requesting folders, fields {0}, vals {1}", string.Join(",", fields), string.Join(",", vals));
58
56 List<XInventoryFolder> origFolders 59 List<XInventoryFolder> origFolders
57 = Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList()); 60 = Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList());
58 61
@@ -104,7 +107,30 @@ namespace OpenSim.Tests.Common.Mock
104 } 107 }
105 108
106 public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); } 109 public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); }
107 public bool MoveFolder(string id, string newParent) { throw new NotImplementedException(); } 110
111 public bool MoveFolder(string id, string newParent)
112 {
113 // Don't use GetFolders() here - it takes a clone!
114 XInventoryFolder folder = m_allFolders[new UUID(id)];
115
116 if (folder == null)
117 return false;
118
119 folder.parentFolderID = new UUID(newParent);
120
121// XInventoryFolder[] newParentFolders
122// = GetFolders(new string[] { "folderID" }, new string[] { folder.parentFolderID.ToString() });
123
124// Console.WriteLine(
125// "Moved folder {0} {1}, to {2} {3}",
126// folder.folderName, folder.folderID, newParentFolders[0].folderName, folder.parentFolderID);
127
128 // TODO: Really need to implement folder version incrementing, though this should be common code anyway,
129 // not reimplemented in each db plugin.
130
131 return true;
132 }
133
108 public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); } 134 public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); }
109 public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); } 135 public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); }
110 } 136 }
diff --git a/OpenSim/Tests/Common/OpenSimTestCase.cs b/OpenSim/Tests/Common/OpenSimTestCase.cs
index 8c40923..3c47faa 100644
--- a/OpenSim/Tests/Common/OpenSimTestCase.cs
+++ b/OpenSim/Tests/Common/OpenSimTestCase.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using NUnit.Framework; 29using NUnit.Framework;
30using OpenSim.Framework.Servers;
30 31
31namespace OpenSim.Tests.Common 32namespace OpenSim.Tests.Common
32{ 33{
@@ -40,7 +41,14 @@ namespace OpenSim.Tests.Common
40 // Disable logging for each test so that one where logging is enabled doesn't cause all subsequent tests 41 // Disable logging for each test so that one where logging is enabled doesn't cause all subsequent tests
41 // to have logging on if it failed with an exception. 42 // to have logging on if it failed with an exception.
42 TestHelpers.DisableLogging(); 43 TestHelpers.DisableLogging();
44
45 // This is an unfortunate bit of clean up we have to do because MainServer manages things through static
46 // variables and the VM is not restarted between tests.
47 if (MainServer.Instance != null)
48 {
49 MainServer.RemoveHttpServer(MainServer.Instance.Port);
50// MainServer.Instance = null;
51 }
43 } 52 }
44 } 53 }
45} 54} \ No newline at end of file
46
diff --git a/OpenSim/Tools/Configger/ConfigurationLoader.cs b/OpenSim/Tools/Configger/ConfigurationLoader.cs
index 28bcc99..72ba185 100644
--- a/OpenSim/Tools/Configger/ConfigurationLoader.cs
+++ b/OpenSim/Tools/Configger/ConfigurationLoader.cs
@@ -239,7 +239,6 @@ namespace OpenSim.Tools.Configger
239 config.Set("physics", "OpenDynamicsEngine"); 239 config.Set("physics", "OpenDynamicsEngine");
240 config.Set("meshing", "Meshmerizer"); 240 config.Set("meshing", "Meshmerizer");
241 config.Set("physical_prim", true); 241 config.Set("physical_prim", true);
242 config.Set("see_into_this_sim_from_neighbor", true);
243 config.Set("serverside_object_permissions", true); 242 config.Set("serverside_object_permissions", true);
244 config.Set("storage_plugin", "OpenSim.Data.SQLite.dll"); 243 config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
245 config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3"); 244 config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
diff --git a/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
index 9a9371d..9bc8512 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/AbstractBehaviour.cs
@@ -35,6 +35,11 @@ namespace pCampBot
35{ 35{
36 public class AbstractBehaviour : IBehaviour 36 public class AbstractBehaviour : IBehaviour
37 { 37 {
38 /// <summary>
39 /// Abbreviated name of this behaviour.
40 /// </summary>
41 public string AbbreviatedName { get; protected set; }
42
38 public string Name { get; protected set; } 43 public string Name { get; protected set; }
39 44
40 public Bot Bot { get; protected set; } 45 public Bot Bot { get; protected set; }
@@ -45,5 +50,7 @@ namespace pCampBot
45 { 50 {
46 Bot = bot; 51 Bot = bot;
47 } 52 }
53
54 public virtual void Close() {}
48 } 55 }
49} 56}
diff --git a/OpenSim/Tools/pCampBot/Behaviours/CrossBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/CrossBehaviour.cs
index 1e01c64..4d806fc 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/CrossBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/CrossBehaviour.cs
@@ -47,7 +47,11 @@ namespace pCampBot
47 47
48 public const int m_regionCrossingTimeout = 1000 * 60; 48 public const int m_regionCrossingTimeout = 1000 * 60;
49 49
50 public CrossBehaviour() { Name = "Cross"; } 50 public CrossBehaviour()
51 {
52 AbbreviatedName = "c";
53 Name = "Cross";
54 }
51 55
52 public override void Action() 56 public override void Action()
53 { 57 {
diff --git a/OpenSim/Tools/pCampBot/Behaviours/GrabbingBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/GrabbingBehaviour.cs
index 66a336a..59f6244 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/GrabbingBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/GrabbingBehaviour.cs
@@ -29,6 +29,7 @@ using OpenMetaverse;
29using System; 29using System;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Linq; 31using System.Linq;
32using System.Threading;
32using pCampBot.Interfaces; 33using pCampBot.Interfaces;
33 34
34namespace pCampBot 35namespace pCampBot
@@ -41,7 +42,11 @@ namespace pCampBot
41 /// </remarks> 42 /// </remarks>
42 public class GrabbingBehaviour : AbstractBehaviour 43 public class GrabbingBehaviour : AbstractBehaviour
43 { 44 {
44 public GrabbingBehaviour() { Name = "Grabbing"; } 45 public GrabbingBehaviour()
46 {
47 AbbreviatedName = "g";
48 Name = "Grabbing";
49 }
45 50
46 public override void Action() 51 public override void Action()
47 { 52 {
@@ -56,6 +61,8 @@ namespace pCampBot
56 Bot.Client.Self.Grab(prim.LocalID); 61 Bot.Client.Self.Grab(prim.LocalID);
57 Bot.Client.Self.GrabUpdate(prim.ID, Vector3.Zero); 62 Bot.Client.Self.GrabUpdate(prim.ID, Vector3.Zero);
58 Bot.Client.Self.DeGrab(prim.LocalID); 63 Bot.Client.Self.DeGrab(prim.LocalID);
64
65 Thread.Sleep(1000);
59 } 66 }
60 } 67 }
61} \ No newline at end of file 68} \ No newline at end of file
diff --git a/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs
new file mode 100644
index 0000000..9a3075c
--- /dev/null
+++ b/OpenSim/Tools/pCampBot/Behaviours/NoneBehaviour.cs
@@ -0,0 +1,47 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using OpenMetaverse;
29using System;
30using System.Collections.Generic;
31using System.Linq;
32using pCampBot.Interfaces;
33
34namespace pCampBot
35{
36 /// <summary>
37 /// Do nothing
38 /// </summary>
39 public class NoneBehaviour : AbstractBehaviour
40 {
41 public NoneBehaviour()
42 {
43 AbbreviatedName = "n";
44 Name = "None";
45 }
46 }
47} \ No newline at end of file
diff --git a/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
index daa7485..6fd2b7c 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/PhysicsBehaviour.cs
@@ -46,6 +46,7 @@ namespace pCampBot
46 46
47 public PhysicsBehaviour() 47 public PhysicsBehaviour()
48 { 48 {
49 AbbreviatedName = "p";
49 Name = "Physics"; 50 Name = "Physics";
50 talkarray = readexcuses(); 51 talkarray = readexcuses();
51 } 52 }
@@ -77,6 +78,12 @@ namespace pCampBot
77 Bot.Client.Self.Chat(randomf, 0, ChatType.Normal); 78 Bot.Client.Self.Chat(randomf, 0, ChatType.Normal);
78 } 79 }
79 80
81 public override void Close()
82 {
83 if (Bot.ConnectionState == ConnectionState.Connected)
84 Bot.Client.Self.Jump(false);
85 }
86
80 private string[] readexcuses() 87 private string[] readexcuses()
81 { 88 {
82 string allexcuses = ""; 89 string allexcuses = "";
diff --git a/OpenSim/Tools/pCampBot/Behaviours/TeleportBehaviour.cs b/OpenSim/Tools/pCampBot/Behaviours/TeleportBehaviour.cs
index fbb4e96..81f250d 100644
--- a/OpenSim/Tools/pCampBot/Behaviours/TeleportBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Behaviours/TeleportBehaviour.cs
@@ -29,6 +29,7 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Linq; 30using System.Linq;
31using System.Reflection; 31using System.Reflection;
32using System.Threading;
32using log4net; 33using log4net;
33using OpenMetaverse; 34using OpenMetaverse;
34using pCampBot.Interfaces; 35using pCampBot.Interfaces;
@@ -42,7 +43,11 @@ namespace pCampBot
42 { 43 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 45
45 public TeleportBehaviour() { Name = "Teleport"; } 46 public TeleportBehaviour()
47 {
48 AbbreviatedName = "t";
49 Name = "Teleport";
50 }
46 51
47 public override void Action() 52 public override void Action()
48 { 53 {
@@ -70,6 +75,8 @@ namespace pCampBot
70 Bot.Name, sourceRegion.Name, Bot.Client.Self.SimPosition, destRegion.Name, destPosition); 75 Bot.Name, sourceRegion.Name, Bot.Client.Self.SimPosition, destRegion.Name, destPosition);
71 76
72 Bot.Client.Self.Teleport(destRegion.RegionHandle, destPosition); 77 Bot.Client.Self.Teleport(destRegion.RegionHandle, destPosition);
78
79 Thread.Sleep(Bot.Random.Next(3000, 10000));
73 } 80 }
74 } 81 }
75} \ No newline at end of file 82} \ No newline at end of file
diff --git a/OpenSim/Tools/pCampBot/Bot.cs b/OpenSim/Tools/pCampBot/Bot.cs
index 9821180..d0a4ef3 100644
--- a/OpenSim/Tools/pCampBot/Bot.cs
+++ b/OpenSim/Tools/pCampBot/Bot.cs
@@ -59,22 +59,23 @@ namespace pCampBot
59 public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events 59 public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events
60 60
61 /// <summary> 61 /// <summary>
62 /// Bot manager. 62 /// Controls whether bots request textures for the object information they receive
63 /// </summary> 63 /// </summary>
64 public BotManager Manager { get; private set; } 64 public bool RequestObjectTextures { get; set; }
65 65
66 /// <summary> 66 /// <summary>
67 /// Bot config, passed from BotManager. 67 /// Bot manager.
68 /// </summary> 68 /// </summary>
69 private IConfig startupConfig; 69 public BotManager Manager { get; private set; }
70 70
71 /// <summary> 71 /// <summary>
72 /// Behaviours implemented by this bot. 72 /// Behaviours implemented by this bot.
73 /// </summary> 73 /// </summary>
74 /// <remarks> 74 /// <remarks>
75 /// Lock this list before manipulating it. 75 /// Indexed by abbreviated name. There can only be one instance of a particular behaviour.
76 /// Lock this structure before manipulating it.
76 /// </remarks> 77 /// </remarks>
77 public List<IBehaviour> Behaviours { get; private set; } 78 public Dictionary<string, IBehaviour> Behaviours { get; private set; }
78 79
79 /// <summary> 80 /// <summary>
80 /// Objects that the bot has discovered. 81 /// Objects that the bot has discovered.
@@ -97,11 +98,35 @@ namespace pCampBot
97 /// </summary> 98 /// </summary>
98 public ConnectionState ConnectionState { get; private set; } 99 public ConnectionState ConnectionState { get; private set; }
99 100
101 public List<Simulator> Simulators
102 {
103 get
104 {
105 lock (Client.Network.Simulators)
106 return new List<Simulator>(Client.Network.Simulators);
107 }
108 }
109
110 /// <summary>
111 /// The number of connections that this bot has to different simulators.
112 /// </summary>
113 /// <value>Includes both root and child connections.</value>
114 public int SimulatorsCount
115 {
116 get
117 {
118 lock (Client.Network.Simulators)
119 return Client.Network.Simulators.Count;
120 }
121 }
122
100 public string FirstName { get; private set; } 123 public string FirstName { get; private set; }
101 public string LastName { get; private set; } 124 public string LastName { get; private set; }
102 public string Name { get; private set; } 125 public string Name { get; private set; }
103 public string Password { get; private set; } 126 public string Password { get; private set; }
104 public string LoginUri { get; private set; } 127 public string LoginUri { get; private set; }
128 public string StartLocation { get; private set; }
129
105 public string saveDir; 130 public string saveDir;
106 public string wear; 131 public string wear;
107 132
@@ -137,94 +162,177 @@ namespace pCampBot
137 /// <param name="behaviours"></param> 162 /// <param name="behaviours"></param>
138 public Bot( 163 public Bot(
139 BotManager bm, List<IBehaviour> behaviours, 164 BotManager bm, List<IBehaviour> behaviours,
140 string firstName, string lastName, string password, string loginUri) 165 string firstName, string lastName, string password, string startLocation, string loginUri)
141 { 166 {
142 ConnectionState = ConnectionState.Disconnected; 167 ConnectionState = ConnectionState.Disconnected;
143 168
144 behaviours.ForEach(b => b.Initialize(this));
145
146 Client = new GridClient();
147
148 Random = new Random(Environment.TickCount);// We do stuff randomly here 169 Random = new Random(Environment.TickCount);// We do stuff randomly here
149 FirstName = firstName; 170 FirstName = firstName;
150 LastName = lastName; 171 LastName = lastName;
151 Name = string.Format("{0} {1}", FirstName, LastName); 172 Name = string.Format("{0} {1}", FirstName, LastName);
152 Password = password; 173 Password = password;
153 LoginUri = loginUri; 174 LoginUri = loginUri;
175 StartLocation = startLocation;
154 176
155 Manager = bm; 177 Manager = bm;
156 startupConfig = bm.Config;
157 readconfig();
158 178
159 Behaviours = behaviours; 179 Behaviours = new Dictionary<string, IBehaviour>();
180 foreach (IBehaviour behaviour in behaviours)
181 AddBehaviour(behaviour);
182
183 // Only calling for use as a template.
184 CreateLibOmvClient();
185 }
186
187 public bool TryGetBehaviour(string abbreviatedName, out IBehaviour behaviour)
188 {
189 lock (Behaviours)
190 return Behaviours.TryGetValue(abbreviatedName, out behaviour);
191 }
192
193 public bool AddBehaviour(IBehaviour behaviour)
194 {
195 lock (Behaviours)
196 {
197 if (!Behaviours.ContainsKey(behaviour.AbbreviatedName))
198 {
199 behaviour.Initialize(this);
200 Behaviours.Add(behaviour.AbbreviatedName, behaviour);
201
202 return true;
203 }
204 }
205
206 return false;
207 }
208
209 public bool RemoveBehaviour(string abbreviatedName)
210 {
211 lock (Behaviours)
212 {
213 IBehaviour behaviour;
214
215 if (!Behaviours.TryGetValue(abbreviatedName, out behaviour))
216 return false;
217
218 behaviour.Close();
219 Behaviours.Remove(abbreviatedName);
220
221 return true;
222 }
223 }
224
225 private void CreateLibOmvClient()
226 {
227 GridClient newClient = new GridClient();
228
229 if (Client != null)
230 {
231 newClient.Settings.LOGIN_SERVER = Client.Settings.LOGIN_SERVER;
232 newClient.Settings.ALWAYS_DECODE_OBJECTS = Client.Settings.ALWAYS_DECODE_OBJECTS;
233 newClient.Settings.AVATAR_TRACKING = Client.Settings.AVATAR_TRACKING;
234 newClient.Settings.OBJECT_TRACKING = Client.Settings.OBJECT_TRACKING;
235 newClient.Settings.SEND_AGENT_THROTTLE = Client.Settings.SEND_AGENT_THROTTLE;
236 newClient.Settings.SEND_AGENT_UPDATES = Client.Settings.SEND_AGENT_UPDATES;
237 newClient.Settings.SEND_PINGS = Client.Settings.SEND_PINGS;
238 newClient.Settings.STORE_LAND_PATCHES = Client.Settings.STORE_LAND_PATCHES;
239 newClient.Settings.USE_ASSET_CACHE = Client.Settings.USE_ASSET_CACHE;
240 newClient.Settings.MULTIPLE_SIMS = Client.Settings.MULTIPLE_SIMS;
241 newClient.Throttle.Asset = Client.Throttle.Asset;
242 newClient.Throttle.Land = Client.Throttle.Land;
243 newClient.Throttle.Task = Client.Throttle.Task;
244 newClient.Throttle.Texture = Client.Throttle.Texture;
245 newClient.Throttle.Wind = Client.Throttle.Wind;
246 newClient.Throttle.Total = Client.Throttle.Total;
247 }
248 else
249 {
250 newClient.Settings.LOGIN_SERVER = LoginUri;
251 newClient.Settings.ALWAYS_DECODE_OBJECTS = false;
252 newClient.Settings.AVATAR_TRACKING = false;
253 newClient.Settings.OBJECT_TRACKING = false;
254 newClient.Settings.SEND_AGENT_THROTTLE = true;
255 newClient.Settings.SEND_PINGS = true;
256 newClient.Settings.STORE_LAND_PATCHES = false;
257 newClient.Settings.USE_ASSET_CACHE = false;
258 newClient.Settings.MULTIPLE_SIMS = true;
259 newClient.Throttle.Asset = 100000;
260 newClient.Throttle.Land = 100000;
261 newClient.Throttle.Task = 100000;
262 newClient.Throttle.Texture = 100000;
263 newClient.Throttle.Wind = 100000;
264 newClient.Throttle.Total = 400000;
265 }
266
267 newClient.Network.LoginProgress += this.Network_LoginProgress;
268 newClient.Network.SimConnected += this.Network_SimConnected;
269 newClient.Network.Disconnected += this.Network_OnDisconnected;
270 newClient.Objects.ObjectUpdate += Objects_NewPrim;
271
272 Client = newClient;
160 } 273 }
161 274
162 //We do our actions here. This is where one would 275 //We do our actions here. This is where one would
163 //add additional steps and/or things the bot should do 276 //add additional steps and/or things the bot should do
164 private void Action() 277 private void Action()
165 { 278 {
166 while (true) 279 while (ConnectionState != ConnectionState.Disconnecting)
280 {
167 lock (Behaviours) 281 lock (Behaviours)
168 Behaviours.ForEach( 282 {
169 b => 283 foreach (IBehaviour behaviour in Behaviours.Values)
170 { 284 {
171 Thread.Sleep(Random.Next(3000, 10000)); 285// Thread.Sleep(Random.Next(3000, 10000));
172 286
173 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType()); 287 // m_log.DebugFormat("[pCAMPBOT]: For {0} performing action {1}", Name, b.GetType());
174 b.Action(); 288 behaviour.Action();
175 } 289 }
176 ); 290 }
177 }
178 291
179 /// <summary> 292 // XXX: This is a really shitty way of yielding so that behaviours can be added/removed
180 /// Read the Nini config and initialize 293 Thread.Sleep(100);
181 /// </summary> 294 }
182 public void readconfig() 295
183 { 296 lock (Behaviours)
184 wear = startupConfig.GetString("wear", "no"); 297 foreach (IBehaviour b in Behaviours.Values)
298 b.Close();
185 } 299 }
186 300
187 /// <summary> 301 /// <summary>
188 /// Tells LibSecondLife to logout and disconnect. Raises the disconnect events once it finishes. 302 /// Tells LibSecondLife to logout and disconnect. Raises the disconnect events once it finishes.
189 /// </summary> 303 /// </summary>
190 public void shutdown() 304 public void Disconnect()
191 { 305 {
192 ConnectionState = ConnectionState.Disconnecting; 306 ConnectionState = ConnectionState.Disconnecting;
193 307
194 if (m_actionThread != null) 308// if (m_actionThread != null)
195 m_actionThread.Abort(); 309// m_actionThread.Abort();
196 310
197 Client.Network.Logout(); 311 Client.Network.Logout();
198 } 312 }
199 313
314 public void Connect()
315 {
316 Thread connectThread = new Thread(ConnectInternal);
317 connectThread.Name = Name;
318 connectThread.IsBackground = true;
319
320 connectThread.Start();
321 }
322
200 /// <summary> 323 /// <summary>
201 /// This is the bot startup loop. 324 /// This is the bot startup loop.
202 /// </summary> 325 /// </summary>
203 public void startup() 326 private void ConnectInternal()
204 { 327 {
205 Client.Settings.LOGIN_SERVER = LoginUri;
206 Client.Settings.ALWAYS_DECODE_OBJECTS = false;
207 Client.Settings.AVATAR_TRACKING = false;
208 Client.Settings.OBJECT_TRACKING = false;
209 Client.Settings.SEND_AGENT_THROTTLE = true;
210 Client.Settings.SEND_PINGS = true;
211 Client.Settings.STORE_LAND_PATCHES = false;
212 Client.Settings.USE_ASSET_CACHE = false;
213 Client.Settings.MULTIPLE_SIMS = true;
214 Client.Throttle.Asset = 100000;
215 Client.Throttle.Land = 100000;
216 Client.Throttle.Task = 100000;
217 Client.Throttle.Texture = 100000;
218 Client.Throttle.Wind = 100000;
219 Client.Throttle.Total = 400000;
220 Client.Network.LoginProgress += this.Network_LoginProgress;
221 Client.Network.SimConnected += this.Network_SimConnected;
222 Client.Network.Disconnected += this.Network_OnDisconnected;
223 Client.Objects.ObjectUpdate += Objects_NewPrim;
224
225 ConnectionState = ConnectionState.Connecting; 328 ConnectionState = ConnectionState.Connecting;
226 329
227 if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", "Your name")) 330 // Current create a new client on each connect. libomv doesn't seem to process new sim
331 // information (e.g. EstablishAgentCommunication events) if connecting after a disceonnect with the same
332 // client
333 CreateLibOmvClient();
334
335 if (Client.Network.Login(FirstName, LastName, Password, "pCampBot", StartLocation, "Your name"))
228 { 336 {
229 ConnectionState = ConnectionState.Connected; 337 ConnectionState = ConnectionState.Connected;
230 338
@@ -268,6 +376,30 @@ namespace pCampBot
268 } 376 }
269 } 377 }
270 378
379 /// <summary>
380 /// Sit this bot on the ground.
381 /// </summary>
382 public void SitOnGround()
383 {
384 if (ConnectionState == ConnectionState.Connected)
385 Client.Self.SitOnGround();
386 }
387
388 /// <summary>
389 /// Stand this bot
390 /// </summary>
391 public void Stand()
392 {
393 if (ConnectionState == ConnectionState.Connected)
394 {
395 // Unlike sit on ground, here libomv checks whether we have SEND_AGENT_UPDATES enabled.
396 bool prevUpdatesSetting = Client.Settings.SEND_AGENT_UPDATES;
397 Client.Settings.SEND_AGENT_UPDATES = true;
398 Client.Self.Stand();
399 Client.Settings.SEND_AGENT_UPDATES = prevUpdatesSetting;
400 }
401 }
402
271 public void SaveDefaultAppearance() 403 public void SaveDefaultAppearance()
272 { 404 {
273 saveDir = "MyAppearance/" + FirstName + "_" + LastName; 405 saveDir = "MyAppearance/" + FirstName + "_" + LastName;
@@ -468,6 +600,8 @@ namespace pCampBot
468// || args.Reason == NetworkManager.DisconnectType.NetworkTimeout) 600// || args.Reason == NetworkManager.DisconnectType.NetworkTimeout)
469// && OnDisconnected != null) 601// && OnDisconnected != null)
470 602
603
604
471 if ( 605 if (
472 (args.Reason == NetworkManager.DisconnectType.ClientInitiated 606 (args.Reason == NetworkManager.DisconnectType.ClientInitiated
473 || args.Reason == NetworkManager.DisconnectType.ServerInitiated 607 || args.Reason == NetworkManager.DisconnectType.ServerInitiated
@@ -481,8 +615,8 @@ namespace pCampBot
481 615
482 public void Objects_NewPrim(object sender, PrimEventArgs args) 616 public void Objects_NewPrim(object sender, PrimEventArgs args)
483 { 617 {
484// if (Name.EndsWith("4")) 618 if (!RequestObjectTextures)
485// throw new Exception("Aaargh"); 619 return;
486 620
487 Primitive prim = args.Prim; 621 Primitive prim = args.Prim;
488 622
diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs
index d615b3f..3c1b11e 100644
--- a/OpenSim/Tools/pCampBot/BotManager.cs
+++ b/OpenSim/Tools/pCampBot/BotManager.cs
@@ -52,6 +52,16 @@ namespace pCampBot
52 public const int DefaultLoginDelay = 5000; 52 public const int DefaultLoginDelay = 5000;
53 53
54 /// <summary> 54 /// <summary>
55 /// Is pCampbot in the process of connecting bots?
56 /// </summary>
57 public bool ConnectingBots { get; private set; }
58
59 /// <summary>
60 /// Is pCampbot in the process of disconnecting bots?
61 /// </summary>
62 public bool DisconnectingBots { get; private set; }
63
64 /// <summary>
55 /// Delay between logins of multiple bots. 65 /// Delay between logins of multiple bots.
56 /// </summary> 66 /// </summary>
57 /// <remarks>TODO: This value needs to be configurable by a command line argument.</remarks> 67 /// <remarks>TODO: This value needs to be configurable by a command line argument.</remarks>
@@ -63,19 +73,24 @@ namespace pCampBot
63 protected CommandConsole m_console; 73 protected CommandConsole m_console;
64 74
65 /// <summary> 75 /// <summary>
66 /// Created bots, whether active or inactive. 76 /// Controls whether bots start out sending agent updates on connection.
67 /// </summary> 77 /// </summary>
68 protected List<Bot> m_lBot; 78 public bool InitBotSendAgentUpdates { get; set; }
69 79
70 /// <summary> 80 /// <summary>
71 /// Random number generator. 81 /// Controls whether bots request textures for the object information they receive
72 /// </summary> 82 /// </summary>
73 public Random Rng { get; private set; } 83 public bool InitBotRequestObjectTextures { get; set; }
74 84
75 /// <summary> 85 /// <summary>
76 /// Overall configuration. 86 /// Created bots, whether active or inactive.
77 /// </summary> 87 /// </summary>
78 public IConfig Config { get; private set; } 88 protected List<Bot> m_bots;
89
90 /// <summary>
91 /// Random number generator.
92 /// </summary>
93 public Random Rng { get; private set; }
79 94
80 /// <summary> 95 /// <summary>
81 /// Track the assets we have and have not received so we don't endlessly repeat requests. 96 /// Track the assets we have and have not received so we don't endlessly repeat requests.
@@ -88,10 +103,53 @@ namespace pCampBot
88 public Dictionary<ulong, GridRegion> RegionsKnown { get; private set; } 103 public Dictionary<ulong, GridRegion> RegionsKnown { get; private set; }
89 104
90 /// <summary> 105 /// <summary>
106 /// First name for bots
107 /// </summary>
108 private string m_firstName;
109
110 /// <summary>
111 /// Last name stem for bots
112 /// </summary>
113 private string m_lastNameStem;
114
115 /// <summary>
116 /// Password for bots
117 /// </summary>
118 private string m_password;
119
120 /// <summary>
121 /// Login URI for bots.
122 /// </summary>
123 private string m_loginUri;
124
125 /// <summary>
126 /// Start location for bots.
127 /// </summary>
128 private string m_startUri;
129
130 /// <summary>
131 /// Postfix bot number at which bot sequence starts.
132 /// </summary>
133 private int m_fromBotNumber;
134
135 /// <summary>
136 /// Wear setting for bots.
137 /// </summary>
138 private string m_wearSetting;
139
140 /// <summary>
141 /// Behaviour switches for bots.
142 /// </summary>
143 private HashSet<string> m_defaultBehaviourSwitches = new HashSet<string>();
144
145 /// <summary>
91 /// Constructor Creates MainConsole.Instance to take commands and provide the place to write data 146 /// Constructor Creates MainConsole.Instance to take commands and provide the place to write data
92 /// </summary> 147 /// </summary>
93 public BotManager() 148 public BotManager()
94 { 149 {
150 InitBotSendAgentUpdates = true;
151 InitBotRequestObjectTextures = true;
152
95 LoginDelay = DefaultLoginDelay; 153 LoginDelay = DefaultLoginDelay;
96 154
97 Rng = new Random(Environment.TickCount); 155 Rng = new Random(Environment.TickCount);
@@ -117,30 +175,61 @@ namespace pCampBot
117 } 175 }
118 } 176 }
119 177
120 m_console.Commands.AddCommand("bot", false, "shutdown", 178 m_console.Commands.AddCommand(
121 "shutdown", 179 "bot", false, "shutdown", "shutdown", "Shutdown bots and exit", HandleShutdown);
122 "Shutdown bots and exit", HandleShutdown); 180
123 181 m_console.Commands.AddCommand(
124 m_console.Commands.AddCommand("bot", false, "quit", 182 "bot", false, "quit", "quit", "Shutdown bots and exit", HandleShutdown);
125 "quit", 183
126 "Shutdown bots and exit", 184 m_console.Commands.AddCommand(
127 HandleShutdown); 185 "bot", false, "connect", "connect [<n>]", "Connect bots",
128 186 "If an <n> is given, then the first <n> disconnected bots by postfix number are connected.\n"
129 m_console.Commands.AddCommand("bot", false, "show regions", 187 + "If no <n> is given, then all currently disconnected bots are connected.",
130 "show regions", 188 HandleConnect);
131 "Show regions known to bots", 189
132 HandleShowRegions); 190 m_console.Commands.AddCommand(
133 191 "bot", false, "disconnect", "disconnect [<n>]", "Disconnect bots",
134 m_console.Commands.AddCommand("bot", false, "show bots", 192 "Disconnecting bots will interupt any bot connection process, including connection on startup.\n"
135 "show bots", 193 + "If an <n> is given, then the last <n> connected bots by postfix number are disconnected.\n"
136 "Shows the status of all bots", 194 + "If no <n> is given, then all currently connected bots are disconnected.",
137 HandleShowStatus); 195 HandleDisconnect);
138 196
139// m_console.Commands.AddCommand("bot", false, "add bots", 197 m_console.Commands.AddCommand(
140// "add bots <number>", 198 "bot", false, "add behaviour", "add behaviour <abbreviated-name> [<bot-number>]",
141// "Add more bots", HandleAddBots); 199 "Add a behaviour to a bot",
142 200 "If no bot number is specified then behaviour is added to all bots.\n"
143 m_lBot = new List<Bot>(); 201 + "Can be performed on connected or disconnected bots.",
202 HandleAddBehaviour);
203
204 m_console.Commands.AddCommand(
205 "bot", false, "remove behaviour", "remove behaviour <abbreviated-name> [<bot-number>]",
206 "Remove a behaviour from a bot",
207 "If no bot number is specified then behaviour is added to all bots.\n"
208 + "Can be performed on connected or disconnected bots.",
209 HandleRemoveBehaviour);
210
211 m_console.Commands.AddCommand(
212 "bot", false, "sit", "sit", "Sit all bots on the ground.",
213 HandleSit);
214
215 m_console.Commands.AddCommand(
216 "bot", false, "stand", "stand", "Stand all bots.",
217 HandleStand);
218
219 m_console.Commands.AddCommand(
220 "bot", false, "set bots", "set bots <key> <value>", "Set a setting for all bots.", HandleSetBots);
221
222 m_console.Commands.AddCommand(
223 "bot", false, "show regions", "show regions", "Show regions known to bots", HandleShowRegions);
224
225 m_console.Commands.AddCommand(
226 "bot", false, "show bots", "show bots", "Shows the status of all bots", HandleShowBotsStatus);
227
228 m_console.Commands.AddCommand(
229 "bot", false, "show bot", "show bot <bot-number>",
230 "Shows the detailed status and settings of a particular bot.", HandleShowBotStatus);
231
232 m_bots = new List<Bot>();
144 } 233 }
145 234
146 /// <summary> 235 /// <summary>
@@ -148,74 +237,167 @@ namespace pCampBot
148 /// </summary> 237 /// </summary>
149 /// <param name="botcount">How many bots to start up</param> 238 /// <param name="botcount">How many bots to start up</param>
150 /// <param name="cs">The configuration for the bots to use</param> 239 /// <param name="cs">The configuration for the bots to use</param>
151 public void dobotStartup(int botcount, IConfig cs) 240 public void CreateBots(int botcount, IConfig startupConfig)
152 { 241 {
153 Config = cs; 242 m_firstName = startupConfig.GetString("firstname");
243 m_lastNameStem = startupConfig.GetString("lastname");
244 m_password = startupConfig.GetString("password");
245 m_loginUri = startupConfig.GetString("loginuri");
246 m_fromBotNumber = startupConfig.GetInt("from", 0);
247 m_wearSetting = startupConfig.GetString("wear", "no");
154 248
155 string firstName = cs.GetString("firstname"); 249 m_startUri = ParseInputStartLocationToUri(startupConfig.GetString("start", "last"));
156 string lastNameStem = cs.GetString("lastname");
157 string password = cs.GetString("password");
158 string loginUri = cs.GetString("loginuri");
159 250
160 HashSet<string> behaviourSwitches = new HashSet<string>();
161 Array.ForEach<string>( 251 Array.ForEach<string>(
162 cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); 252 startupConfig.GetString("behaviours", "p").Split(new char[] { ',' }), b => m_defaultBehaviourSwitches.Add(b));
253
254 for (int i = 0; i < botcount; i++)
255 {
256 lock (m_bots)
257 {
258 string lastName = string.Format("{0}_{1}", m_lastNameStem, i + m_fromBotNumber);
259
260 CreateBot(
261 this,
262 CreateBehavioursFromAbbreviatedNames(m_defaultBehaviourSwitches),
263 m_firstName, lastName, m_password, m_loginUri, m_startUri, m_wearSetting);
264 }
265 }
266 }
267
268 private List<IBehaviour> CreateBehavioursFromAbbreviatedNames(HashSet<string> abbreviatedNames)
269 {
270 // We must give each bot its own list of instantiated behaviours since they store state.
271 List<IBehaviour> behaviours = new List<IBehaviour>();
272
273 // Hard-coded for now
274 foreach (string abName in abbreviatedNames)
275 {
276 IBehaviour newBehaviour = null;
277
278 if (abName == "c")
279 newBehaviour = new CrossBehaviour();
280
281 if (abName == "g")
282 newBehaviour = new GrabbingBehaviour();
283
284 if (abName == "n")
285 newBehaviour = new NoneBehaviour();
286
287 if (abName == "p")
288 newBehaviour = new PhysicsBehaviour();
289
290 if (abName == "t")
291 newBehaviour = new TeleportBehaviour();
292
293 if (newBehaviour != null)
294 {
295 behaviours.Add(newBehaviour);
296 }
297 else
298 {
299 MainConsole.Instance.OutputFormat("No behaviour with abbreviated name {0} found", abName);
300 }
301 }
302
303 return behaviours;
304 }
163 305
306 public void ConnectBots(int botcount)
307 {
308 ConnectingBots = true;
309
310 Thread connectBotThread = new Thread(o => ConnectBotsInternal(botcount));
311
312 connectBotThread.Name = "Bots connection thread";
313 connectBotThread.Start();
314 }
315
316 private void ConnectBotsInternal(int botCount)
317 {
164 MainConsole.Instance.OutputFormat( 318 MainConsole.Instance.OutputFormat(
165 "[BOT MANAGER]: Starting {0} bots connecting to {1}, named {2} {3}_<n>", 319 "[BOT MANAGER]: Starting {0} bots connecting to {1}, location {2}, named {3} {4}_<n>",
166 botcount, 320 botCount,
167 loginUri, 321 m_loginUri,
168 firstName, 322 m_startUri,
169 lastNameStem); 323 m_firstName,
324 m_lastNameStem);
170 325
171 MainConsole.Instance.OutputFormat("[BOT MANAGER]: Delay between logins is {0}ms", LoginDelay); 326 MainConsole.Instance.OutputFormat("[BOT MANAGER]: Delay between logins is {0}ms", LoginDelay);
327 MainConsole.Instance.OutputFormat("[BOT MANAGER]: BotsSendAgentUpdates is {0}", InitBotSendAgentUpdates);
328 MainConsole.Instance.OutputFormat("[BOT MANAGER]: InitBotRequestObjectTextures is {0}", InitBotRequestObjectTextures);
172 329
173 for (int i = 0; i < botcount; i++) 330 int connectedBots = 0;
331
332 for (int i = 0; i < m_bots.Count; i++)
174 { 333 {
175 string lastName = string.Format("{0}_{1}", lastNameStem, i); 334 lock (m_bots)
176 335 {
177 // We must give each bot its own list of instantiated behaviours since they store state. 336 if (DisconnectingBots)
178 List<IBehaviour> behaviours = new List<IBehaviour>(); 337 {
179 338 MainConsole.Instance.Output(
180 // Hard-coded for now 339 "[BOT MANAGER]: Aborting bot connection due to user-initiated disconnection");
181 if (behaviourSwitches.Contains("p")) 340 break;
182 behaviours.Add(new PhysicsBehaviour()); 341 }
183 342
184 if (behaviourSwitches.Contains("g")) 343 if (m_bots[i].ConnectionState == ConnectionState.Disconnected)
185 behaviours.Add(new GrabbingBehaviour()); 344 {
186 345 m_bots[i].Connect();
187 if (behaviourSwitches.Contains("t")) 346 connectedBots++;
188 behaviours.Add(new TeleportBehaviour()); 347
189 348 if (connectedBots >= botCount)
190 if (behaviourSwitches.Contains("c")) 349 break;
191 behaviours.Add(new CrossBehaviour()); 350
192 351 // Stagger logins
193 StartBot(this, behaviours, firstName, lastName, password, loginUri); 352 Thread.Sleep(LoginDelay);
353 }
354 }
194 } 355 }
356
357 ConnectingBots = false;
195 } 358 }
196 359
197// /// <summary> 360 /// <summary>
198// /// Add additional bots (and threads) to our bot pool 361 /// Parses the command line start location to a start string/uri that the login mechanism will recognize.
199// /// </summary> 362 /// </summary>
200// /// <param name="botcount">How Many of them to add</param> 363 /// <returns>
201// public void addbots(int botcount) 364 /// The input start location to URI.
202// { 365 /// </returns>
203// int len = m_td.Length; 366 /// <param name='startLocation'>
204// Thread[] m_td2 = new Thread[len + botcount]; 367 /// Start location.
205// for (int i = 0; i < len; i++) 368 /// </param>
206// { 369 private string ParseInputStartLocationToUri(string startLocation)
207// m_td2[i] = m_td[i]; 370 {
208// } 371 if (startLocation == "home" || startLocation == "last")
209// m_td = m_td2; 372 return startLocation;
210// int newlen = len + botcount; 373
211// for (int i = len; i < newlen; i++) 374 string regionName;
212// { 375
213// startupBot(Config); 376 // Just a region name or only one (!) extra component. Like a viewer, we will stick 128/128/0 on the end
214// } 377 Vector3 startPos = new Vector3(128, 128, 0);
215// } 378
379 string[] startLocationComponents = startLocation.Split('/');
380
381 regionName = startLocationComponents[0];
382
383 if (startLocationComponents.Length >= 2)
384 {
385 float.TryParse(startLocationComponents[1], out startPos.X);
386
387 if (startLocationComponents.Length >= 3)
388 {
389 float.TryParse(startLocationComponents[2], out startPos.Y);
390
391 if (startLocationComponents.Length >= 4)
392 float.TryParse(startLocationComponents[3], out startPos.Z);
393 }
394 }
395
396 return string.Format("uri:{0}&{1}&{2}&{3}", regionName, startPos.X, startPos.Y, startPos.Z);
397 }
216 398
217 /// <summary> 399 /// <summary>
218 /// This starts up the bot and stores the thread for the bot in the thread array 400 /// This creates a bot but does not start it.
219 /// </summary> 401 /// </summary>
220 /// <param name="bm"></param> 402 /// <param name="bm"></param>
221 /// <param name="behaviours">Behaviours for this bot to perform.</param> 403 /// <param name="behaviours">Behaviours for this bot to perform.</param>
@@ -223,30 +405,25 @@ namespace pCampBot
223 /// <param name="lastName">Last name</param> 405 /// <param name="lastName">Last name</param>
224 /// <param name="password">Password</param> 406 /// <param name="password">Password</param>
225 /// <param name="loginUri">Login URI</param> 407 /// <param name="loginUri">Login URI</param>
226 public void StartBot( 408 /// <param name="startLocation">Location to start the bot. Can be "last", "home" or a specific sim name.</param>
409 /// <param name="wearSetting"></param>
410 public void CreateBot(
227 BotManager bm, List<IBehaviour> behaviours, 411 BotManager bm, List<IBehaviour> behaviours,
228 string firstName, string lastName, string password, string loginUri) 412 string firstName, string lastName, string password, string loginUri, string startLocation, string wearSetting)
229 { 413 {
230 MainConsole.Instance.OutputFormat( 414 MainConsole.Instance.OutputFormat(
231 "[BOT MANAGER]: Starting bot {0} {1}, behaviours are {2}", 415 "[BOT MANAGER]: Creating bot {0} {1}, behaviours are {2}",
232 firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray())); 416 firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray()));
233 417
234 Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri); 418 Bot pb = new Bot(bm, behaviours, firstName, lastName, password, startLocation, loginUri);
419 pb.wear = wearSetting;
420 pb.Client.Settings.SEND_AGENT_UPDATES = InitBotSendAgentUpdates;
421 pb.RequestObjectTextures = InitBotRequestObjectTextures;
235 422
236 pb.OnConnected += handlebotEvent; 423 pb.OnConnected += handlebotEvent;
237 pb.OnDisconnected += handlebotEvent; 424 pb.OnDisconnected += handlebotEvent;
238 425
239 lock (m_lBot) 426 m_bots.Add(pb);
240 m_lBot.Add(pb);
241
242 Thread pbThread = new Thread(pb.startup);
243 pbThread.Name = pb.Name;
244 pbThread.IsBackground = true;
245
246 pbThread.Start();
247
248 // Stagger logins
249 Thread.Sleep(LoginDelay);
250 } 427 }
251 428
252 /// <summary> 429 /// <summary>
@@ -259,52 +436,270 @@ namespace pCampBot
259 switch (eventt) 436 switch (eventt)
260 { 437 {
261 case EventType.CONNECTED: 438 case EventType.CONNECTED:
439 {
262 m_log.Info("[" + callbot.FirstName + " " + callbot.LastName + "]: Connected"); 440 m_log.Info("[" + callbot.FirstName + " " + callbot.LastName + "]: Connected");
263 break; 441 break;
442 }
443
264 case EventType.DISCONNECTED: 444 case EventType.DISCONNECTED:
445 {
265 m_log.Info("[" + callbot.FirstName + " " + callbot.LastName + "]: Disconnected"); 446 m_log.Info("[" + callbot.FirstName + " " + callbot.LastName + "]: Disconnected");
447 break;
448 }
449 }
450 }
266 451
267 lock (m_lBot) 452 /// <summary>
268 { 453 /// Standard CreateConsole routine
269 if (m_lBot.TrueForAll(b => b.ConnectionState == ConnectionState.Disconnected)) 454 /// </summary>
270 Environment.Exit(0); 455 /// <returns></returns>
456 protected CommandConsole CreateConsole()
457 {
458 return new LocalConsole("pCampbot");
459 }
271 460
272 break; 461 private void HandleConnect(string module, string[] cmd)
462 {
463 if (ConnectingBots)
464 {
465 MainConsole.Instance.Output("Still connecting bots. Please wait for previous process to complete.");
466 return;
467 }
468
469 lock (m_bots)
470 {
471 int botsToConnect;
472 int disconnectedBots = m_bots.Count(b => b.ConnectionState == ConnectionState.Disconnected);
473
474 if (cmd.Length == 1)
475 {
476 botsToConnect = disconnectedBots;
477 }
478 else
479 {
480 if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[1], out botsToConnect))
481 return;
482
483 botsToConnect = Math.Min(botsToConnect, disconnectedBots);
484 }
485
486 MainConsole.Instance.OutputFormat("Connecting {0} bots", botsToConnect);
487
488 ConnectBots(botsToConnect);
489 }
490 }
491
492 private void HandleAddBehaviour(string module, string[] cmd)
493 {
494 if (cmd.Length < 3 || cmd.Length > 4)
495 {
496 MainConsole.Instance.OutputFormat("Usage: add behaviour <abbreviated-behaviour> [<bot-number>]");
497 return;
498 }
499
500 string rawBehaviours = cmd[2];
501
502 List<Bot> botsToEffect = new List<Bot>();
503
504 if (cmd.Length == 3)
505 {
506 lock (m_bots)
507 botsToEffect.AddRange(m_bots);
508 }
509 else
510 {
511 int botNumber;
512 if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[3], out botNumber))
513 return;
514
515 Bot bot = GetBotFromNumber(botNumber);
516
517 if (bot == null)
518 {
519 MainConsole.Instance.OutputFormat("Error: No bot found with number {0}", botNumber);
520 return;
521 }
522
523 botsToEffect.Add(bot);
524 }
525
526
527 HashSet<string> rawAbbreviatedSwitchesToAdd = new HashSet<string>();
528 Array.ForEach<string>(rawBehaviours.Split(new char[] { ',' }), b => rawAbbreviatedSwitchesToAdd.Add(b));
529
530 foreach (Bot bot in botsToEffect)
531 {
532 List<IBehaviour> behavioursAdded = new List<IBehaviour>();
533
534 foreach (IBehaviour behaviour in CreateBehavioursFromAbbreviatedNames(rawAbbreviatedSwitchesToAdd))
535 {
536 if (bot.AddBehaviour(behaviour))
537 behavioursAdded.Add(behaviour);
538 }
539
540 MainConsole.Instance.OutputFormat(
541 "Added behaviours {0} to bot {1}",
542 string.Join(", ", behavioursAdded.ConvertAll<string>(b => b.Name).ToArray()), bot.Name);
543 }
544 }
545
546 private void HandleRemoveBehaviour(string module, string[] cmd)
547 {
548 if (cmd.Length < 3 || cmd.Length > 4)
549 {
550 MainConsole.Instance.OutputFormat("Usage: remove behaviour <abbreviated-behaviour> [<bot-number>]");
551 return;
552 }
553
554 string rawBehaviours = cmd[2];
555
556 List<Bot> botsToEffect = new List<Bot>();
557
558 if (cmd.Length == 3)
559 {
560 lock (m_bots)
561 botsToEffect.AddRange(m_bots);
562 }
563 else
564 {
565 int botNumber;
566 if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[3], out botNumber))
567 return;
568
569 Bot bot = GetBotFromNumber(botNumber);
570
571 if (bot == null)
572 {
573 MainConsole.Instance.OutputFormat("Error: No bot found with number {0}", botNumber);
574 return;
575 }
576
577 botsToEffect.Add(bot);
578 }
579
580 HashSet<string> abbreviatedBehavioursToRemove = new HashSet<string>();
581 Array.ForEach<string>(rawBehaviours.Split(new char[] { ',' }), b => abbreviatedBehavioursToRemove.Add(b));
582
583 foreach (Bot bot in botsToEffect)
584 {
585 List<IBehaviour> behavioursRemoved = new List<IBehaviour>();
586
587 foreach (string b in abbreviatedBehavioursToRemove)
588 {
589 IBehaviour behaviour;
590
591 if (bot.TryGetBehaviour(b, out behaviour))
592 {
593 bot.RemoveBehaviour(b);
594 behavioursRemoved.Add(behaviour);
273 } 595 }
596 }
597
598 MainConsole.Instance.OutputFormat(
599 "Removed behaviours {0} to bot {1}",
600 string.Join(", ", behavioursRemoved.ConvertAll<string>(b => b.Name).ToArray()), bot.Name);
274 } 601 }
275 } 602 }
276 603
277 /// <summary> 604 private void HandleDisconnect(string module, string[] cmd)
278 /// Shut down all bots
279 /// </summary>
280 /// <remarks>
281 /// We launch each shutdown on its own thread so that a slow shutting down bot doesn't hold up all the others.
282 /// </remarks>
283 public void doBotShutdown()
284 { 605 {
285 lock (m_lBot) 606 lock (m_bots)
286 { 607 {
287 foreach (Bot bot in m_lBot) 608 int botsToDisconnect;
609 int connectedBots = m_bots.Count(b => b.ConnectionState == ConnectionState.Connected);
610
611 if (cmd.Length == 1)
288 { 612 {
289 Bot thisBot = bot; 613 botsToDisconnect = connectedBots;
290 Util.FireAndForget(o => thisBot.shutdown());
291 } 614 }
615 else
616 {
617 if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[1], out botsToDisconnect))
618 return;
619
620 botsToDisconnect = Math.Min(botsToDisconnect, connectedBots);
621 }
622
623 DisconnectingBots = true;
624
625 MainConsole.Instance.OutputFormat("Disconnecting {0} bots", botsToDisconnect);
626
627 int disconnectedBots = 0;
628
629 for (int i = m_bots.Count - 1; i >= 0; i--)
630 {
631 if (disconnectedBots >= botsToDisconnect)
632 break;
633
634 Bot thisBot = m_bots[i];
635
636 if (thisBot.ConnectionState == ConnectionState.Connected)
637 {
638 Util.FireAndForget(o => thisBot.Disconnect());
639 disconnectedBots++;
640 }
641 }
642
643 DisconnectingBots = false;
292 } 644 }
293 } 645 }
294 646
295 /// <summary> 647 private void HandleSit(string module, string[] cmd)
296 /// Standard CreateConsole routine
297 /// </summary>
298 /// <returns></returns>
299 protected CommandConsole CreateConsole()
300 { 648 {
301 return new LocalConsole("pCampbot"); 649 lock (m_bots)
650 {
651 m_bots.ForEach(b => b.SitOnGround());
652 }
653 }
654
655 private void HandleStand(string module, string[] cmd)
656 {
657 lock (m_bots)
658 {
659 m_bots.ForEach(b => b.Stand());
660 }
302 } 661 }
303 662
304 private void HandleShutdown(string module, string[] cmd) 663 private void HandleShutdown(string module, string[] cmd)
305 { 664 {
306 m_log.Info("[BOTMANAGER]: Shutting down bots"); 665 lock (m_bots)
307 doBotShutdown(); 666 {
667 int connectedBots = m_bots.Count(b => b.ConnectionState == ConnectionState.Connected);
668
669 if (connectedBots > 0)
670 {
671 MainConsole.Instance.OutputFormat("Please disconnect {0} connected bots first", connectedBots);
672 return;
673 }
674 }
675
676 MainConsole.Instance.Output("Shutting down");
677
678 Environment.Exit(0);
679 }
680
681 private void HandleSetBots(string module, string[] cmd)
682 {
683 string key = cmd[2];
684 string rawValue = cmd[3];
685
686 if (key == "SEND_AGENT_UPDATES")
687 {
688 bool newSendAgentUpdatesSetting;
689
690 if (!ConsoleUtil.TryParseConsoleBool(MainConsole.Instance, rawValue, out newSendAgentUpdatesSetting))
691 return;
692
693 MainConsole.Instance.OutputFormat(
694 "Setting SEND_AGENT_UPDATES to {0} for all bots", newSendAgentUpdatesSetting);
695
696 lock (m_bots)
697 m_bots.ForEach(b => b.Client.Settings.SEND_AGENT_UPDATES = newSendAgentUpdatesSetting);
698 }
699 else
700 {
701 MainConsole.Instance.Output("Error: Only setting currently available is SEND_AGENT_UPDATES");
702 }
308 } 703 }
309 704
310 private void HandleShowRegions(string module, string[] cmd) 705 private void HandleShowRegions(string module, string[] cmd)
@@ -322,43 +717,114 @@ namespace pCampBot
322 } 717 }
323 } 718 }
324 719
325 private void HandleShowStatus(string module, string[] cmd) 720 private void HandleShowBotsStatus(string module, string[] cmd)
326 { 721 {
327 string outputFormat = "{0,-30} {1, -30} {2,-14}"; 722 ConsoleDisplayTable cdt = new ConsoleDisplayTable();
328 MainConsole.Instance.OutputFormat(outputFormat, "Name", "Region", "Status"); 723 cdt.AddColumn("Name", 24);
329 724 cdt.AddColumn("Region", 24);
330 lock (m_lBot) 725 cdt.AddColumn("Status", 13);
726 cdt.AddColumn("Conns", 5);
727 cdt.AddColumn("Behaviours", 20);
728
729 Dictionary<ConnectionState, int> totals = new Dictionary<ConnectionState, int>();
730 foreach (object o in Enum.GetValues(typeof(ConnectionState)))
731 totals[(ConnectionState)o] = 0;
732
733 lock (m_bots)
331 { 734 {
332 foreach (Bot pb in m_lBot) 735 foreach (Bot bot in m_bots)
333 { 736 {
334 Simulator currentSim = pb.Client.Network.CurrentSim; 737 Simulator currentSim = bot.Client.Network.CurrentSim;
335 738 totals[bot.ConnectionState]++;
336 MainConsole.Instance.OutputFormat( 739
337 outputFormat, 740 cdt.AddRow(
338 pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.ConnectionState); 741 bot.Name,
742 currentSim != null ? currentSim.Name : "(none)",
743 bot.ConnectionState,
744 bot.SimulatorsCount,
745 string.Join(",", bot.Behaviours.Keys.ToArray()));
339 } 746 }
340 } 747 }
748
749 MainConsole.Instance.Output(cdt.ToString());
750
751 ConsoleDisplayList cdl = new ConsoleDisplayList();
752
753 foreach (KeyValuePair<ConnectionState, int> kvp in totals)
754 cdl.AddRow(kvp.Key, kvp.Value);
755
756 MainConsole.Instance.Output(cdl.ToString());
341 } 757 }
342 758
343 /* 759 private void HandleShowBotStatus(string module, string[] cmd)
344 private void HandleQuit(string module, string[] cmd)
345 { 760 {
346 m_console.Warn("DANGER", "This should only be used to quit the program if you've already used the shutdown command and the program hasn't quit"); 761 if (cmd.Length != 3)
347 Environment.Exit(0); 762 {
763 MainConsole.Instance.Output("Usage: show bot <n>");
764 return;
765 }
766
767 int botNumber;
768
769 if (!ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, cmd[2], out botNumber))
770 return;
771
772 Bot bot = GetBotFromNumber(botNumber);
773
774 if (bot == null)
775 {
776 MainConsole.Instance.OutputFormat("Error: No bot found with number {0}", botNumber);
777 return;
778 }
779
780 ConsoleDisplayList cdl = new ConsoleDisplayList();
781 cdl.AddRow("Name", bot.Name);
782 cdl.AddRow("Status", bot.ConnectionState);
783
784 Simulator currentSim = bot.Client.Network.CurrentSim;
785 cdl.AddRow("Region", currentSim != null ? currentSim.Name : "(none)");
786
787 List<Simulator> connectedSimulators = bot.Simulators;
788 List<string> simulatorNames = connectedSimulators.ConvertAll<string>(cs => cs.Name);
789 cdl.AddRow("Connections", string.Join(", ", simulatorNames.ToArray()));
790
791 MainConsole.Instance.Output(cdl.ToString());
792
793 MainConsole.Instance.Output("Settings");
794
795 ConsoleDisplayList statusCdl = new ConsoleDisplayList();
796
797 statusCdl.AddRow(
798 "Behaviours",
799 string.Join(", ", bot.Behaviours.Values.ToList().ConvertAll<string>(b => b.Name).ToArray()));
800
801 GridClient botClient = bot.Client;
802 statusCdl.AddRow("SEND_AGENT_UPDATES", botClient.Settings.SEND_AGENT_UPDATES);
803
804 MainConsole.Instance.Output(statusCdl.ToString());
805 }
806
807 /// <summary>
808 /// Get a specific bot from its number.
809 /// </summary>
810 /// <returns>null if no bot was found</returns>
811 /// <param name='botNumber'></param>
812 private Bot GetBotFromNumber(int botNumber)
813 {
814 string name = GenerateBotNameFromNumber(botNumber);
815
816 Bot bot;
817
818 lock (m_bots)
819 bot = m_bots.Find(b => b.Name == name);
820
821 return bot;
822 }
823
824 private string GenerateBotNameFromNumber(int botNumber)
825 {
826 return string.Format("{0} {1}_{2}", m_firstName, m_lastNameStem, botNumber);
348 } 827 }
349 */
350//
351// private void HandleAddBots(string module, string[] cmd)
352// {
353// int newbots = 0;
354//
355// if (cmd.Length > 2)
356// {
357// Int32.TryParse(cmd[2], out newbots);
358// }
359// if (newbots > 0)
360// addbots(newbots);
361// }
362 828
363 internal void Grid_GridRegion(object o, GridRegionEventArgs args) 829 internal void Grid_GridRegion(object o, GridRegionEventArgs args)
364 { 830 {
@@ -379,4 +845,4 @@ namespace pCampBot
379 } 845 }
380 } 846 }
381 } 847 }
382} 848} \ No newline at end of file
diff --git a/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs b/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
index 9c984be..0ed4825 100644
--- a/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
+++ b/OpenSim/Tools/pCampBot/Interfaces/IBehaviour.cs
@@ -32,6 +32,11 @@ namespace pCampBot.Interfaces
32 public interface IBehaviour 32 public interface IBehaviour
33 { 33 {
34 /// <summary> 34 /// <summary>
35 /// Abbreviated name of this behaviour.
36 /// </summary>
37 string AbbreviatedName { get; }
38
39 /// <summary>
35 /// Name of this behaviour. 40 /// Name of this behaviour.
36 /// </summary> 41 /// </summary>
37 string Name { get; } 42 string Name { get; }
@@ -46,6 +51,14 @@ namespace pCampBot.Interfaces
46 void Initialize(Bot bot); 51 void Initialize(Bot bot);
47 52
48 /// <summary> 53 /// <summary>
54 /// Close down this behaviour.
55 /// </summary>
56 /// <remarks>
57 /// This is triggered if a behaviour is removed via explicit command and when a bot is disconnected
58 /// </remarks>
59 void Close();
60
61 /// <summary>
49 /// Action to take when this behaviour is invoked. 62 /// Action to take when this behaviour is invoked.
50 /// </summary> 63 /// </summary>
51 /// <param name="bot"></param> 64 /// <param name="bot"></param>
diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs
index 9e82577..781bb00 100644
--- a/OpenSim/Tools/pCampBot/pCampBot.cs
+++ b/OpenSim/Tools/pCampBot/pCampBot.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.IO;
29using System.Reflection; 30using System.Reflection;
30using System.Threading; 31using System.Threading;
31using log4net; 32using log4net;
@@ -50,30 +51,62 @@ namespace pCampBot
50 { 51 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 53
54 public const string ConfigFileName = "pCampBot.ini";
55
53 [STAThread] 56 [STAThread]
54 public static void Main(string[] args) 57 public static void Main(string[] args)
55 { 58 {
56 XmlConfigurator.Configure(); 59 XmlConfigurator.Configure();
57 60
58 IConfig config = ParseConfig(args); 61 IConfig commandLineConfig = ParseConfig(args);
59 if (config.Get("help") != null || config.Get("loginuri") == null) 62 if (commandLineConfig.Get("help") != null || commandLineConfig.Get("loginuri") == null)
60 { 63 {
61 Help(); 64 Help();
62 } 65 }
63 else if (config.Get("firstname") == null || config.Get("lastname") == null || config.Get("password") == null) 66 else if (
67 commandLineConfig.Get("firstname") == null
68 || commandLineConfig.Get("lastname") == null
69 || commandLineConfig.Get("password") == null)
64 { 70 {
65 Console.WriteLine("ERROR: You must supply a firstname, lastname and password for the bots."); 71 Console.WriteLine("ERROR: You must supply a firstname, lastname and password for the bots.");
66 } 72 }
67 else 73 else
68 { 74 {
69 int botcount = config.GetInt("botcount", 1);
70
71 BotManager bm = new BotManager(); 75 BotManager bm = new BotManager();
72 76
73 //startup specified number of bots. 1 is the default 77 string iniFilePath = Path.GetFullPath(Path.Combine(Util.configDir(), ConfigFileName));
74 Thread startBotThread = new Thread(o => bm.dobotStartup(botcount, config)); 78
75 startBotThread.Name = "Initial start bots thread"; 79 if (File.Exists(iniFilePath))
76 startBotThread.Start(); 80 {
81 m_log.InfoFormat("[PCAMPBOT]: Reading configuration settings from {0}", iniFilePath);
82
83 IConfigSource configSource = new IniConfigSource(iniFilePath);
84
85 IConfig botManagerConfig = configSource.Configs["BotManager"];
86
87 if (botManagerConfig != null)
88 {
89 bm.LoginDelay = botManagerConfig.GetInt("LoginDelay", bm.LoginDelay);
90 }
91
92 IConfig botConfig = configSource.Configs["Bot"];
93
94 if (botConfig != null)
95 {
96 bm.InitBotSendAgentUpdates
97 = botConfig.GetBoolean("SendAgentUpdates", bm.InitBotSendAgentUpdates);
98 bm.InitBotRequestObjectTextures
99 = botConfig.GetBoolean("RequestObjectTextures", bm.InitBotRequestObjectTextures);
100 }
101 }
102
103 int botcount = commandLineConfig.GetInt("botcount", 1);
104 bool startConnected = commandLineConfig.Get("connect") != null;
105
106 bm.CreateBots(botcount, commandLineConfig);
107
108 if (startConnected)
109 bm.ConnectBots(botcount);
77 110
78 while (true) 111 while (true)
79 { 112 {
@@ -94,8 +127,11 @@ namespace pCampBot
94 //Set up our nifty config.. thanks to nini 127 //Set up our nifty config.. thanks to nini
95 ArgvConfigSource cs = new ArgvConfigSource(args); 128 ArgvConfigSource cs = new ArgvConfigSource(args);
96 129
130 cs.AddSwitch("Startup", "connect", "c");
97 cs.AddSwitch("Startup", "botcount", "n"); 131 cs.AddSwitch("Startup", "botcount", "n");
132 cs.AddSwitch("Startup", "from", "f");
98 cs.AddSwitch("Startup", "loginuri", "l"); 133 cs.AddSwitch("Startup", "loginuri", "l");
134 cs.AddSwitch("Startup", "start", "s");
99 cs.AddSwitch("Startup", "firstname"); 135 cs.AddSwitch("Startup", "firstname");
100 cs.AddSwitch("Startup", "lastname"); 136 cs.AddSwitch("Startup", "lastname");
101 cs.AddSwitch("Startup", "password"); 137 cs.AddSwitch("Startup", "password");
@@ -113,22 +149,27 @@ namespace pCampBot
113 // You can either say no, to not load anything, yes, to load one of the default wearables, a folder 149 // You can either say no, to not load anything, yes, to load one of the default wearables, a folder
114 // name, to load an specific folder, or save, to save an avatar with some already existing wearables 150 // name, to load an specific folder, or save, to save an avatar with some already existing wearables
115 // worn to the folder MyAppearance/FirstName_LastName, and the load it. 151 // worn to the folder MyAppearance/FirstName_LastName, and the load it.
152
116 Console.WriteLine( 153 Console.WriteLine(
117 "usage: pCampBot <-loginuri loginuri> [OPTIONS]\n" + 154 "usage: pCampBot <-loginuri loginuri> [OPTIONS]\n"
118 "Spawns a set of bots to test an OpenSim region\n\n" + 155 + "Spawns a set of bots to test an OpenSim region\n\n"
119 " -l, -loginuri loginuri for sim to log into (required)\n" + 156 + " -l, -loginuri loginuri for grid/standalone (required)\n"
120 " -n, -botcount number of bots to start (default: 1)\n" + 157 + " -s, -start start location for bots (optional). Can be \"last\", \"home\" or a specific location with or without co-ords (e.g. \"region1\" or \"region2/50/30/90\"\n"
121 " -firstname first name for the bots\n" + 158 + " -firstname first name for the bots (required)\n"
122 " -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" + 159 + " -lastname lastname for the bots (required). Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n"
123 " -password password for the bots\n" + 160 + " -password password for the bots (required)\n"
124 " -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" + 161 + " -n, -botcount number of bots to start (default: 1) (optional)\n"
125 " current options are:\n" + 162 + " -f, -from starting number for login bot names, e.g. 25 will login Ima Bot_25, Ima Bot_26, etc. (default: 0) (optional)\n"
126 " p (physics)\n" + 163 + " -c, -connect connect all bots at startup (optional)\n"
127 " g (grab)\n" + 164 + " -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p (required)\n"
128 " t (teleport)\n" + 165 + " current options are:\n"
129// " c (cross)" + 166 + " p (physics - bots constantly move and jump around)\n"
130 " -wear set appearance folder to load from (default: no)\n" + 167 + " g (grab - bots randomly click prims whether set clickable or not)\n"
131 " -h, -help show this message"); 168 + " n (none - bots do nothing)\n"
169 + " t (teleport - bots regularly teleport between regions on the grid)\n"
170// " c (cross)\n" +
171 + " -wear folder from which to load appearance data, \"no\" if there is no such folder (default: no) (optional)\n"
172 + " -h, -help show this message.\n");
132 } 173 }
133 } 174 }
134} 175}
diff --git a/README.md b/README.md
index 552cdef..118fe71 100644
--- a/README.md
+++ b/README.md
@@ -111,3 +111,4 @@ project can always be found at http://opensimulator.org.
111 111
112Thanks for trying OpenSim, we hope it is a pleasant experience. 112Thanks for trying OpenSim, we hope it is a pleasant experience.
113 113
114
diff --git a/ThirdParty/SmartThreadPool/AssemblyInfo.cs b/ThirdParty/SmartThreadPool/AssemblyInfo.cs
deleted file mode 100644
index e2465b0..0000000
--- a/ThirdParty/SmartThreadPool/AssemblyInfo.cs
+++ /dev/null
@@ -1,61 +0,0 @@
1using System;
2using System.Reflection;
3using System.Runtime.InteropServices;
4
5//
6// General Information about an assembly is controlled through the following
7// set of attributes. Change these attribute values to modify the information
8// associated with an assembly.
9//
10[assembly: AssemblyTitle("")]
11[assembly: AssemblyDescription("")]
12[assembly: AssemblyConfiguration("")]
13[assembly: AssemblyCompany("")]
14[assembly: AssemblyProduct("")]
15[assembly: AssemblyCopyright("")]
16[assembly: AssemblyTrademark("")]
17[assembly: AssemblyCulture("")]
18[assembly: ComVisible(false)]
19[assembly: CLSCompliant(true)]
20
21//
22// Version information for an assembly consists of the following four values:
23//
24// Major Version
25// Minor Version
26// Build Number
27// Revision
28//
29// You can specify all the values or you can default the Revision and Build Numbers
30// by using the '*' as shown below:
31
32[assembly: AssemblyVersion("0.7.6.*")]
33
34//
35// In order to sign your assembly you must specify a key to use. Refer to the
36// Microsoft .NET Framework documentation for more information on assembly signing.
37//
38// Use the attributes below to control which key is used for signing.
39//
40// Notes:
41// (*) If no key is specified, the assembly is not signed.
42// (*) KeyName refers to a key that has been installed in the Crypto Service
43// Provider (CSP) on your machine. KeyFile refers to a file which contains
44// a key.
45// (*) If the KeyFile and the KeyName values are both specified, the
46// following processing occurs:
47// (1) If the KeyName can be found in the CSP, that key is used.
48// (2) If the KeyName does not exist and the KeyFile does exist, the key
49// in the KeyFile is installed into the CSP and used.
50// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
51// When specifying the KeyFile, the location of the KeyFile should be
52// relative to the project output directory which is
53// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
54// located in the project directory, you would specify the AssemblyKeyFile
55// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
56// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
57// documentation for more information on this.
58//
59[assembly: AssemblyDelaySign(false)]
60[assembly: AssemblyKeyFile("")]
61[assembly: AssemblyKeyName("")]
diff --git a/ThirdParty/SmartThreadPool/CallerThreadContext.cs b/ThirdParty/SmartThreadPool/CallerThreadContext.cs
index 6ea53f6..e63add5 100644
--- a/ThirdParty/SmartThreadPool/CallerThreadContext.cs
+++ b/ThirdParty/SmartThreadPool/CallerThreadContext.cs
@@ -1,3 +1,6 @@
1
2#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
3
1using System; 4using System;
2using System.Diagnostics; 5using System.Diagnostics;
3using System.Threading; 6using System.Threading;
@@ -6,218 +9,130 @@ using System.Web;
6using System.Runtime.Remoting.Messaging; 9using System.Runtime.Remoting.Messaging;
7 10
8 11
9namespace Amib.Threading 12namespace Amib.Threading.Internal
10{ 13{
11 #region CallerThreadContext class 14#region CallerThreadContext class
12
13 /// <summary>
14 /// This class stores the caller call context in order to restore
15 /// it when the work item is executed in the thread pool environment.
16 /// </summary>
17 internal class CallerThreadContext
18 {
19 #region Prepare reflection information
20
21 // Cached type information.
22 private static MethodInfo getLogicalCallContextMethodInfo =
23 typeof(Thread).GetMethod("GetLogicalCallContext", BindingFlags.Instance | BindingFlags.NonPublic);
24
25 private static MethodInfo setLogicalCallContextMethodInfo =
26 typeof(Thread).GetMethod("SetLogicalCallContext", BindingFlags.Instance | BindingFlags.NonPublic);
27 15
28 private static string HttpContextSlotName = GetHttpContextSlotName(); 16 /// <summary>
17 /// This class stores the caller call context in order to restore
18 /// it when the work item is executed in the thread pool environment.
19 /// </summary>
20 internal class CallerThreadContext
21 {
22#region Prepare reflection information
29 23
30 private static string GetHttpContextSlotName() 24 // Cached type information.
31 { 25 private static readonly MethodInfo getLogicalCallContextMethodInfo =
32 FieldInfo fi = typeof(HttpContext).GetField("CallContextSlotName", BindingFlags.Static | BindingFlags.NonPublic); 26 typeof(Thread).GetMethod("GetLogicalCallContext", BindingFlags.Instance | BindingFlags.NonPublic);
33 27
34 if( fi != null ) 28 private static readonly MethodInfo setLogicalCallContextMethodInfo =
35 return (string)fi.GetValue(null); 29 typeof(Thread).GetMethod("SetLogicalCallContext", BindingFlags.Instance | BindingFlags.NonPublic);
36 else // Use the default "HttpContext" slot name
37 return "HttpContext";
38 }
39 30
40 #endregion 31 private static string HttpContextSlotName = GetHttpContextSlotName();
41
42 #region Private fields
43
44 private HttpContext _httpContext = null;
45 private LogicalCallContext _callContext = null;
46
47 #endregion
48 32
49 /// <summary> 33 private static string GetHttpContextSlotName()
50 /// Constructor 34 {
51 /// </summary> 35 FieldInfo fi = typeof(HttpContext).GetField("CallContextSlotName", BindingFlags.Static | BindingFlags.NonPublic);
52 private CallerThreadContext()
53 {
54 }
55 36
56 public bool CapturedCallContext 37 if (fi != null)
57 {
58 get
59 { 38 {
60 return (null != _callContext); 39 return (string) fi.GetValue(null);
61 } 40 }
62 }
63 41
64 public bool CapturedHttpContext 42 return "HttpContext";
65 { 43 }
66 get
67 {
68 return (null != _httpContext);
69 }
70 }
71
72 /// <summary>
73 /// Captures the current thread context
74 /// </summary>
75 /// <returns></returns>
76 public static CallerThreadContext Capture(
77 bool captureCallContext,
78 bool captureHttpContext)
79 {
80 Debug.Assert(captureCallContext || captureHttpContext);
81
82 CallerThreadContext callerThreadContext = new CallerThreadContext();
83
84 // TODO: In NET 2.0, redo using the new feature of ExecutionContext class - Capture()
85 // Capture Call Context
86 if(captureCallContext && (getLogicalCallContextMethodInfo != null))
87 {
88 callerThreadContext._callContext = (LogicalCallContext)getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null);
89 if (callerThreadContext._callContext != null)
90 {
91 callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone();
92 }
93 }
94
95 // Capture httpContext
96 if (captureHttpContext && (null != HttpContext.Current))
97 {
98 callerThreadContext._httpContext = HttpContext.Current;
99 }
100
101 return callerThreadContext;
102 }
103 44
104 /// <summary> 45 #endregion
105 /// Applies the thread context stored earlier
106 /// </summary>
107 /// <param name="callerThreadContext"></param>
108 public static void Apply(CallerThreadContext callerThreadContext)
109 {
110 if (null == callerThreadContext)
111 {
112 throw new ArgumentNullException("callerThreadContext");
113 }
114
115 // Todo: In NET 2.0, redo using the new feature of ExecutionContext class - Run()
116 // Restore call context
117 if ((callerThreadContext._callContext != null) && (setLogicalCallContextMethodInfo != null))
118 {
119 setLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, new object[] { callerThreadContext._callContext });
120 }
121
122 // Restore HttpContext
123 if (callerThreadContext._httpContext != null)
124 {
125 CallContext.SetData(HttpContextSlotName, callerThreadContext._httpContext);
126 }
127 }
128 }
129
130 #endregion
131
132}
133 46
47#region Private fields
134 48
135/* 49 private HttpContext _httpContext;
136// Ami Bar 50 private LogicalCallContext _callContext;
137// amibar@gmail.com
138 51
139using System; 52 #endregion
140using System.Threading;
141using System.Globalization;
142using System.Security.Principal;
143using System.Reflection;
144using System.Runtime.Remoting.Contexts;
145 53
146namespace Amib.Threading.Internal 54 /// <summary>
147{ 55 /// Constructor
148 #region CallerThreadContext class 56 /// </summary>
149 57 private CallerThreadContext()
150 /// <summary> 58 {
151 /// This class stores the caller thread context in order to restore 59 }
152 /// it when the work item is executed in the context of the thread 60
153 /// from the pool. 61 public bool CapturedCallContext
154 /// Note that we can't store the thread's CompressedStack, because 62 {
155 /// it throws a security exception 63 get
156 /// </summary> 64 {
157 public class CallerThreadContext 65 return (null != _callContext);
158 { 66 }
159 private CultureInfo _culture = null; 67 }
160 private CultureInfo _cultureUI = null; 68
161 private IPrincipal _principal; 69 public bool CapturedHttpContext
162 private System.Runtime.Remoting.Contexts.Context _context; 70 {
163 71 get
164 private static FieldInfo _fieldInfo = GetFieldInfo(); 72 {
165 73 return (null != _httpContext);
166 private static FieldInfo GetFieldInfo() 74 }
167 { 75 }
168 Type threadType = typeof(Thread); 76
169 return threadType.GetField( 77 /// <summary>
170 "m_Context", 78 /// Captures the current thread context
171 BindingFlags.Instance | BindingFlags.NonPublic); 79 /// </summary>
172 } 80 /// <returns></returns>
173 81 public static CallerThreadContext Capture(
174 /// <summary> 82 bool captureCallContext,
175 /// Constructor 83 bool captureHttpContext)
176 /// </summary> 84 {
177 private CallerThreadContext() 85 Debug.Assert(captureCallContext || captureHttpContext);
178 { 86
179 } 87 CallerThreadContext callerThreadContext = new CallerThreadContext();
180 88
181 /// <summary> 89 // TODO: In NET 2.0, redo using the new feature of ExecutionContext class - Capture()
182 /// Captures the current thread context 90 // Capture Call Context
183 /// </summary> 91 if(captureCallContext && (getLogicalCallContextMethodInfo != null))
184 /// <returns></returns> 92 {
185 public static CallerThreadContext Capture() 93 callerThreadContext._callContext = (LogicalCallContext)getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null);
186 { 94 if (callerThreadContext._callContext != null)
187 CallerThreadContext callerThreadContext = new CallerThreadContext(); 95 {
188 96 callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone();
189 Thread thread = Thread.CurrentThread; 97 }
190 callerThreadContext._culture = thread.CurrentCulture; 98 }
191 callerThreadContext._cultureUI = thread.CurrentUICulture; 99
192 callerThreadContext._principal = Thread.CurrentPrincipal; 100 // Capture httpContext
193 callerThreadContext._context = Thread.CurrentContext; 101 if (captureHttpContext && (null != HttpContext.Current))
194 return callerThreadContext; 102 {
195 } 103 callerThreadContext._httpContext = HttpContext.Current;
196 104 }
197 /// <summary> 105
198 /// Applies the thread context stored earlier 106 return callerThreadContext;
199 /// </summary> 107 }
200 /// <param name="callerThreadContext"></param> 108
201 public static void Apply(CallerThreadContext callerThreadContext) 109 /// <summary>
202 { 110 /// Applies the thread context stored earlier
203 Thread thread = Thread.CurrentThread; 111 /// </summary>
204 thread.CurrentCulture = callerThreadContext._culture; 112 /// <param name="callerThreadContext"></param>
205 thread.CurrentUICulture = callerThreadContext._cultureUI; 113 public static void Apply(CallerThreadContext callerThreadContext)
206 Thread.CurrentPrincipal = callerThreadContext._principal; 114 {
207 115 if (null == callerThreadContext)
208 // Uncomment the following block to enable the Thread.CurrentThread 116 {
209/* 117 throw new ArgumentNullException("callerThreadContext");
210 if (null != _fieldInfo) 118 }
211 { 119
212 _fieldInfo.SetValue( 120 // Todo: In NET 2.0, redo using the new feature of ExecutionContext class - Run()
213 Thread.CurrentThread, 121 // Restore call context
214 callerThreadContext._context); 122 if ((callerThreadContext._callContext != null) && (setLogicalCallContextMethodInfo != null))
215 } 123 {
216* / 124 setLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, new object[] { callerThreadContext._callContext });
217 } 125 }
218 } 126
127 // Restore HttpContext
128 if (callerThreadContext._httpContext != null)
129 {
130 HttpContext.Current = callerThreadContext._httpContext;
131 //CallContext.SetData(HttpContextSlotName, callerThreadContext._httpContext);
132 }
133 }
134 }
219 135
220 #endregion 136 #endregion
221} 137}
222*/ 138#endif
223
diff --git a/ThirdParty/SmartThreadPool/CanceledWorkItemsGroup.cs b/ThirdParty/SmartThreadPool/CanceledWorkItemsGroup.cs
new file mode 100644
index 0000000..5752957
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/CanceledWorkItemsGroup.cs
@@ -0,0 +1,14 @@
1namespace Amib.Threading.Internal
2{
3 internal class CanceledWorkItemsGroup
4 {
5 public readonly static CanceledWorkItemsGroup NotCanceledWorkItemsGroup = new CanceledWorkItemsGroup();
6
7 public CanceledWorkItemsGroup()
8 {
9 IsCanceled = false;
10 }
11
12 public bool IsCanceled { get; set; }
13 }
14} \ No newline at end of file
diff --git a/ThirdParty/SmartThreadPool/EventWaitHandle.cs b/ThirdParty/SmartThreadPool/EventWaitHandle.cs
new file mode 100644
index 0000000..25be07a
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/EventWaitHandle.cs
@@ -0,0 +1,104 @@
1#if (_WINDOWS_CE)
2
3using System;
4using System.Runtime.InteropServices;
5using System.Threading;
6
7namespace Amib.Threading.Internal
8{
9 /// <summary>
10 /// EventWaitHandle class
11 /// In WindowsCE this class doesn't exist and I needed the WaitAll and WaitAny implementation.
12 /// So I wrote this class to implement these two methods with some of their overloads.
13 /// It uses the WaitForMultipleObjects API to do the WaitAll and WaitAny.
14 /// Note that this class doesn't even inherit from WaitHandle!
15 /// </summary>
16 public class STPEventWaitHandle
17 {
18 #region Public Constants
19
20 public const int WaitTimeout = Timeout.Infinite;
21
22 #endregion
23
24 #region Private External Constants
25
26 private const Int32 WAIT_FAILED = -1;
27 private const Int32 WAIT_TIMEOUT = 0x102;
28 private const UInt32 INFINITE = 0xFFFFFFFF;
29
30 #endregion
31
32 #region WaitAll and WaitAny
33
34 internal static bool WaitOne(WaitHandle waitHandle, int millisecondsTimeout, bool exitContext)
35 {
36 return waitHandle.WaitOne(millisecondsTimeout, exitContext);
37 }
38
39 private static IntPtr[] PrepareNativeHandles(WaitHandle[] waitHandles)
40 {
41 IntPtr[] nativeHandles = new IntPtr[waitHandles.Length];
42 for (int i = 0; i < waitHandles.Length; i++)
43 {
44 nativeHandles[i] = waitHandles[i].Handle;
45 }
46 return nativeHandles;
47 }
48
49 public static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
50 {
51 uint timeout = millisecondsTimeout < 0 ? INFINITE : (uint)millisecondsTimeout;
52
53 IntPtr[] nativeHandles = PrepareNativeHandles(waitHandles);
54
55 int result = WaitForMultipleObjects((uint)waitHandles.Length, nativeHandles, true, timeout);
56
57 if (result == WAIT_TIMEOUT || result == WAIT_FAILED)
58 {
59 return false;
60 }
61
62 return true;
63 }
64
65
66 public static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
67 {
68 uint timeout = millisecondsTimeout < 0 ? INFINITE : (uint)millisecondsTimeout;
69
70 IntPtr[] nativeHandles = PrepareNativeHandles(waitHandles);
71
72 int result = WaitForMultipleObjects((uint)waitHandles.Length, nativeHandles, false, timeout);
73
74 if (result >= 0 && result < waitHandles.Length)
75 {
76 return result;
77 }
78
79 return -1;
80 }
81
82 public static int WaitAny(WaitHandle[] waitHandles)
83 {
84 return WaitAny(waitHandles, Timeout.Infinite, false);
85 }
86
87 public static int WaitAny(WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext)
88 {
89 int millisecondsTimeout = (int)timeout.TotalMilliseconds;
90
91 return WaitAny(waitHandles, millisecondsTimeout, false);
92 }
93
94 #endregion
95
96 #region External methods
97
98 [DllImport("coredll.dll", SetLastError = true)]
99 public static extern int WaitForMultipleObjects(uint nCount, IntPtr[] lpHandles, bool fWaitAll, uint dwMilliseconds);
100
101 #endregion
102 }
103}
104#endif \ No newline at end of file
diff --git a/ThirdParty/SmartThreadPool/EventWaitHandleFactory.cs b/ThirdParty/SmartThreadPool/EventWaitHandleFactory.cs
new file mode 100644
index 0000000..3c9c849
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/EventWaitHandleFactory.cs
@@ -0,0 +1,82 @@
1using System.Threading;
2
3#if (_WINDOWS_CE)
4using System;
5using System.Runtime.InteropServices;
6#endif
7
8namespace Amib.Threading.Internal
9{
10 /// <summary>
11 /// EventWaitHandleFactory class.
12 /// This is a static class that creates AutoResetEvent and ManualResetEvent objects.
13 /// In WindowCE the WaitForMultipleObjects API fails to use the Handle property
14 /// of XxxResetEvent. It can use only handles that were created by the CreateEvent API.
15 /// Consequently this class creates the needed XxxResetEvent and replaces the handle if
16 /// it's a WindowsCE OS.
17 /// </summary>
18 public static class EventWaitHandleFactory
19 {
20 /// <summary>
21 /// Create a new AutoResetEvent object
22 /// </summary>
23 /// <returns>Return a new AutoResetEvent object</returns>
24 public static AutoResetEvent CreateAutoResetEvent()
25 {
26 AutoResetEvent waitHandle = new AutoResetEvent(false);
27
28#if (_WINDOWS_CE)
29 ReplaceEventHandle(waitHandle, false, false);
30#endif
31
32 return waitHandle;
33 }
34
35 /// <summary>
36 /// Create a new ManualResetEvent object
37 /// </summary>
38 /// <returns>Return a new ManualResetEvent object</returns>
39 public static ManualResetEvent CreateManualResetEvent(bool initialState)
40 {
41 ManualResetEvent waitHandle = new ManualResetEvent(initialState);
42
43#if (_WINDOWS_CE)
44 ReplaceEventHandle(waitHandle, true, initialState);
45#endif
46
47 return waitHandle;
48 }
49
50#if (_WINDOWS_CE)
51
52 /// <summary>
53 /// Replace the event handle
54 /// </summary>
55 /// <param name="waitHandle">The WaitHandle object which its handle needs to be replaced.</param>
56 /// <param name="manualReset">Indicates if the event is a ManualResetEvent (true) or an AutoResetEvent (false)</param>
57 /// <param name="initialState">The initial state of the event</param>
58 private static void ReplaceEventHandle(WaitHandle waitHandle, bool manualReset, bool initialState)
59 {
60 // Store the old handle
61 IntPtr oldHandle = waitHandle.Handle;
62
63 // Create a new event
64 IntPtr newHandle = CreateEvent(IntPtr.Zero, manualReset, initialState, null);
65
66 // Replace the old event with the new event
67 waitHandle.Handle = newHandle;
68
69 // Close the old event
70 CloseHandle (oldHandle);
71 }
72
73 [DllImport("coredll.dll", SetLastError = true)]
74 public static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);
75
76 //Handle
77 [DllImport("coredll.dll", SetLastError = true)]
78 public static extern bool CloseHandle(IntPtr hObject);
79#endif
80
81 }
82}
diff --git a/ThirdParty/SmartThreadPool/Exceptions.cs b/ThirdParty/SmartThreadPool/Exceptions.cs
index c454709..6c6a88b 100644
--- a/ThirdParty/SmartThreadPool/Exceptions.cs
+++ b/ThirdParty/SmartThreadPool/Exceptions.cs
@@ -1,8 +1,7 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
2#if !(_WINDOWS_CE)
5using System.Runtime.Serialization; 3using System.Runtime.Serialization;
4#endif
6 5
7namespace Amib.Threading 6namespace Amib.Threading
8{ 7{
@@ -11,22 +10,39 @@ namespace Amib.Threading
11 /// <summary> 10 /// <summary>
12 /// Represents an exception in case IWorkItemResult.GetResult has been canceled 11 /// Represents an exception in case IWorkItemResult.GetResult has been canceled
13 /// </summary> 12 /// </summary>
14 [Serializable] 13 public sealed partial class WorkItemCancelException : Exception
15 public sealed class WorkItemCancelException : ApplicationException
16 { 14 {
17 public WorkItemCancelException() : base() 15 public WorkItemCancelException()
18 { 16 {
19 } 17 }
20 18
21 public WorkItemCancelException(string message) : base(message) 19 public WorkItemCancelException(string message)
20 : base(message)
22 { 21 {
23 } 22 }
24 23
25 public WorkItemCancelException(string message, Exception e) : base(message, e) 24 public WorkItemCancelException(string message, Exception e)
25 : base(message, e)
26 { 26 {
27 } 27 }
28 }
28 29
29 public WorkItemCancelException(SerializationInfo si, StreamingContext sc) : base(si, sc) 30 /// <summary>
31 /// Represents an exception in case IWorkItemResult.GetResult has been timed out
32 /// </summary>
33 public sealed partial class WorkItemTimeoutException : Exception
34 {
35 public WorkItemTimeoutException()
36 {
37 }
38
39 public WorkItemTimeoutException(string message)
40 : base(message)
41 {
42 }
43
44 public WorkItemTimeoutException(string message, Exception e)
45 : base(message, e)
30 { 46 {
31 } 47 }
32 } 48 }
@@ -34,22 +50,33 @@ namespace Amib.Threading
34 /// <summary> 50 /// <summary>
35 /// Represents an exception in case IWorkItemResult.GetResult has been timed out 51 /// Represents an exception in case IWorkItemResult.GetResult has been timed out
36 /// </summary> 52 /// </summary>
37 [Serializable] 53 public sealed partial class WorkItemResultException : Exception
38 public sealed class WorkItemTimeoutException : ApplicationException
39 { 54 {
40 public WorkItemTimeoutException() : base() 55 public WorkItemResultException()
41 { 56 {
42 } 57 }
43 58
44 public WorkItemTimeoutException(string message) : base(message) 59 public WorkItemResultException(string message)
60 : base(message)
45 { 61 {
46 } 62 }
47 63
48 public WorkItemTimeoutException(string message, Exception e) : base(message, e) 64 public WorkItemResultException(string message, Exception e)
65 : base(message, e)
49 { 66 {
50 } 67 }
68 }
51 69
52 public WorkItemTimeoutException(SerializationInfo si, StreamingContext sc) : base(si, sc) 70
71#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
72 /// <summary>
73 /// Represents an exception in case IWorkItemResult.GetResult has been canceled
74 /// </summary>
75 [Serializable]
76 public sealed partial class WorkItemCancelException
77 {
78 public WorkItemCancelException(SerializationInfo si, StreamingContext sc)
79 : base(si, sc)
53 { 80 {
54 } 81 }
55 } 82 }
@@ -58,24 +85,27 @@ namespace Amib.Threading
58 /// Represents an exception in case IWorkItemResult.GetResult has been timed out 85 /// Represents an exception in case IWorkItemResult.GetResult has been timed out
59 /// </summary> 86 /// </summary>
60 [Serializable] 87 [Serializable]
61 public sealed class WorkItemResultException : ApplicationException 88 public sealed partial class WorkItemTimeoutException
62 { 89 {
63 public WorkItemResultException() : base() 90 public WorkItemTimeoutException(SerializationInfo si, StreamingContext sc)
64 { 91 : base(si, sc)
65 }
66
67 public WorkItemResultException(string message) : base(message)
68 {
69 }
70
71 public WorkItemResultException(string message, Exception e) : base(message, e)
72 { 92 {
73 } 93 }
94 }
74 95
75 public WorkItemResultException(SerializationInfo si, StreamingContext sc) : base(si, sc) 96 /// <summary>
97 /// Represents an exception in case IWorkItemResult.GetResult has been timed out
98 /// </summary>
99 [Serializable]
100 public sealed partial class WorkItemResultException
101 {
102 public WorkItemResultException(SerializationInfo si, StreamingContext sc)
103 : base(si, sc)
76 { 104 {
77 } 105 }
78 } 106 }
79 107
108#endif
109
80 #endregion 110 #endregion
81} 111}
diff --git a/ThirdParty/SmartThreadPool/Interfaces.cs b/ThirdParty/SmartThreadPool/Interfaces.cs
index f1c1fcf..513422f 100644
--- a/ThirdParty/SmartThreadPool/Interfaces.cs
+++ b/ThirdParty/SmartThreadPool/Interfaces.cs
@@ -1,271 +1,628 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
5using System.Threading; 2using System.Threading;
6 3
7namespace Amib.Threading 4namespace Amib.Threading
8{ 5{
9 #region Delegates 6 #region Delegates
7
8 /// <summary>
9 /// A delegate that represents the method to run as the work item
10 /// </summary>
11 /// <param name="state">A state object for the method to run</param>
12 public delegate object WorkItemCallback(object state);
13
14 /// <summary>
15 /// A delegate to call after the WorkItemCallback completed
16 /// </summary>
17 /// <param name="wir">The work item result object</param>
18 public delegate void PostExecuteWorkItemCallback(IWorkItemResult wir);
10 19
11 /// <summary> 20 /// <summary>
12 /// A delegate that represents the method to run as the work item 21 /// A delegate to call after the WorkItemCallback completed
13 /// </summary> 22 /// </summary>
14 /// <param name="state">A state object for the method to run</param> 23 /// <param name="wir">The work item result object</param>
15 public delegate object WorkItemCallback(object state); 24 public delegate void PostExecuteWorkItemCallback<TResult>(IWorkItemResult<TResult> wir);
25
26 /// <summary>
27 /// A delegate to call when a WorkItemsGroup becomes idle
28 /// </summary>
29 /// <param name="workItemsGroup">A reference to the WorkItemsGroup that became idle</param>
30 public delegate void WorkItemsGroupIdleHandler(IWorkItemsGroup workItemsGroup);
16 31
17 /// <summary> 32 /// <summary>
18 /// A delegate to call after the WorkItemCallback completed 33 /// A delegate to call after a thread is created, but before
34 /// it's first use.
19 /// </summary> 35 /// </summary>
20 /// <param name="wir">The work item result object</param> 36 public delegate void ThreadInitializationHandler();
21 public delegate void PostExecuteWorkItemCallback(IWorkItemResult wir);
22 37
23 /// <summary> 38 /// <summary>
24 /// A delegate to call when a WorkItemsGroup becomes idle 39 /// A delegate to call when a thread is about to exit, after
40 /// it is no longer belong to the pool.
25 /// </summary> 41 /// </summary>
26 /// <param name="workItemsGroup">A reference to the WorkItemsGroup that became idle</param> 42 public delegate void ThreadTerminationHandler();
27 public delegate void WorkItemsGroupIdleHandler(IWorkItemsGroup workItemsGroup);
28 43
29 #endregion 44 #endregion
30 45
31 #region WorkItem Priority 46 #region WorkItem Priority
32 47
33 public enum WorkItemPriority 48 /// <summary>
34 { 49 /// Defines the availeable priorities of a work item.
35 Lowest, 50 /// The higher the priority a work item has, the sooner
36 BelowNormal, 51 /// it will be executed.
37 Normal, 52 /// </summary>
38 AboveNormal, 53 public enum WorkItemPriority
39 Highest, 54 {
40 } 55 Lowest,
56 BelowNormal,
57 Normal,
58 AboveNormal,
59 Highest,
60 }
61
62 #endregion
63
64 #region IWorkItemsGroup interface
65
66 /// <summary>
67 /// IWorkItemsGroup interface
68 /// Created by SmartThreadPool.CreateWorkItemsGroup()
69 /// </summary>
70 public interface IWorkItemsGroup
71 {
72 /// <summary>
73 /// Get/Set the name of the WorkItemsGroup
74 /// </summary>
75 string Name { get; set; }
41 76
42 #endregion 77 /// <summary>
78 /// Get/Set the maximum number of workitem that execute cocurrency on the thread pool
79 /// </summary>
80 int Concurrency { get; set; }
81
82 /// <summary>
83 /// Get the number of work items waiting in the queue.
84 /// </summary>
85 int WaitingCallbacks { get; }
43 86
44 #region IHasWorkItemPriority interface 87 /// <summary>
88 /// Get an array with all the state objects of the currently running items.
89 /// The array represents a snap shot and impact performance.
90 /// </summary>
91 object[] GetStates();
45 92
46 public interface IHasWorkItemPriority 93 /// <summary>
47 { 94 /// Get the WorkItemsGroup start information
48 WorkItemPriority WorkItemPriority { get; } 95 /// </summary>
49 } 96 WIGStartInfo WIGStartInfo { get; }
50 97
51 #endregion 98 /// <summary>
99 /// Starts to execute work items
100 /// </summary>
101 void Start();
52 102
53 #region IWorkItemsGroup interface 103 /// <summary>
104 /// Cancel all the work items.
105 /// Same as Cancel(false)
106 /// </summary>
107 void Cancel();
54 108
55 /// <summary>
56 /// IWorkItemsGroup interface
57 /// </summary>
58 public interface IWorkItemsGroup
59 {
60 /// <summary> 109 /// <summary>
61 /// Get/Set the name of the WorkItemsGroup 110 /// Cancel all work items using thread abortion
62 /// </summary> 111 /// </summary>
63 string Name { get; set; } 112 /// <param name="abortExecution">True to stop work items by raising ThreadAbortException</param>
113 void Cancel(bool abortExecution);
64 114
115 /// <summary>
116 /// Wait for all work item to complete.
117 /// </summary>
118 void WaitForIdle();
119
120 /// <summary>
121 /// Wait for all work item to complete, until timeout expired
122 /// </summary>
123 /// <param name="timeout">How long to wait for the work items to complete</param>
124 /// <returns>Returns true if work items completed within the timeout, otherwise false.</returns>
125 bool WaitForIdle(TimeSpan timeout);
126
127 /// <summary>
128 /// Wait for all work item to complete, until timeout expired
129 /// </summary>
130 /// <param name="millisecondsTimeout">How long to wait for the work items to complete in milliseconds</param>
131 /// <returns>Returns true if work items completed within the timeout, otherwise false.</returns>
132 bool WaitForIdle(int millisecondsTimeout);
133
134 /// <summary>
135 /// IsIdle is true when there are no work items running or queued.
136 /// </summary>
137 bool IsIdle { get; }
138
139 /// <summary>
140 /// This event is fired when all work items are completed.
141 /// (When IsIdle changes to true)
142 /// This event only work on WorkItemsGroup. On SmartThreadPool
143 /// it throws the NotImplementedException.
144 /// </summary>
145 event WorkItemsGroupIdleHandler OnIdle;
146
147 #region QueueWorkItem
148
149 /// <summary>
150 /// Queue a work item
151 /// </summary>
152 /// <param name="callback">A callback to execute</param>
153 /// <returns>Returns a work item result</returns>
65 IWorkItemResult QueueWorkItem(WorkItemCallback callback); 154 IWorkItemResult QueueWorkItem(WorkItemCallback callback);
155
156 /// <summary>
157 /// Queue a work item
158 /// </summary>
159 /// <param name="callback">A callback to execute</param>
160 /// <param name="workItemPriority">The priority of the work item</param>
161 /// <returns>Returns a work item result</returns>
66 IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority); 162 IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority);
163
164 /// <summary>
165 /// Queue a work item
166 /// </summary>
167 /// <param name="callback">A callback to execute</param>
168 /// <param name="state">
169 /// The context object of the work item. Used for passing arguments to the work item.
170 /// </param>
171 /// <returns>Returns a work item result</returns>
67 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state); 172 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state);
173
174 /// <summary>
175 /// Queue a work item
176 /// </summary>
177 /// <param name="callback">A callback to execute</param>
178 /// <param name="state">
179 /// The context object of the work item. Used for passing arguments to the work item.
180 /// </param>
181 /// <param name="workItemPriority">The work item priority</param>
182 /// <returns>Returns a work item result</returns>
68 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority); 183 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority);
184
185 /// <summary>
186 /// Queue a work item
187 /// </summary>
188 /// <param name="callback">A callback to execute</param>
189 /// <param name="state">
190 /// The context object of the work item. Used for passing arguments to the work item.
191 /// </param>
192 /// <param name="postExecuteWorkItemCallback">
193 /// A delegate to call after the callback completion
194 /// </param>
195 /// <returns>Returns a work item result</returns>
69 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback); 196 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback);
197
198 /// <summary>
199 /// Queue a work item
200 /// </summary>
201 /// <param name="callback">A callback to execute</param>
202 /// <param name="state">
203 /// The context object of the work item. Used for passing arguments to the work item.
204 /// </param>
205 /// <param name="postExecuteWorkItemCallback">
206 /// A delegate to call after the callback completion
207 /// </param>
208 /// <param name="workItemPriority">The work item priority</param>
209 /// <returns>Returns a work item result</returns>
70 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, WorkItemPriority workItemPriority); 210 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, WorkItemPriority workItemPriority);
211
212 /// <summary>
213 /// Queue a work item
214 /// </summary>
215 /// <param name="callback">A callback to execute</param>
216 /// <param name="state">
217 /// The context object of the work item. Used for passing arguments to the work item.
218 /// </param>
219 /// <param name="postExecuteWorkItemCallback">
220 /// A delegate to call after the callback completion
221 /// </param>
222 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
223 /// <returns>Returns a work item result</returns>
71 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute); 224 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute);
225
226 /// <summary>
227 /// Queue a work item
228 /// </summary>
229 /// <param name="callback">A callback to execute</param>
230 /// <param name="state">
231 /// The context object of the work item. Used for passing arguments to the work item.
232 /// </param>
233 /// <param name="postExecuteWorkItemCallback">
234 /// A delegate to call after the callback completion
235 /// </param>
236 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
237 /// <param name="workItemPriority">The work item priority</param>
238 /// <returns>Returns a work item result</returns>
72 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute, WorkItemPriority workItemPriority); 239 IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute, WorkItemPriority workItemPriority);
73 240
241 /// <summary>
242 /// Queue a work item
243 /// </summary>
244 /// <param name="workItemInfo">Work item info</param>
245 /// <param name="callback">A callback to execute</param>
246 /// <returns>Returns a work item result</returns>
74 IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback); 247 IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback);
75 IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state);
76
77 void WaitForIdle();
78 bool WaitForIdle(TimeSpan timeout);
79 bool WaitForIdle(int millisecondsTimeout);
80 248
81 int WaitingCallbacks { get; } 249 /// <summary>
82 event WorkItemsGroupIdleHandler OnIdle; 250 /// Queue a work item
83 251 /// </summary>
84 void Cancel(); 252 /// <param name="workItemInfo">Work item information</param>
85 void Start(); 253 /// <param name="callback">A callback to execute</param>
86 } 254 /// <param name="state">
255 /// The context object of the work item. Used for passing arguments to the work item.
256 /// </param>
257 /// <returns>Returns a work item result</returns>
258 IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state);
87 259
88 #endregion 260 #endregion
89 261
90 #region CallToPostExecute enumerator 262 #region QueueWorkItem(Action<...>)
91 263
92 [Flags] 264 /// <summary>
93 public enum CallToPostExecute 265 /// Queue a work item.
94 { 266 /// </summary>
95 Never = 0x00, 267 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
96 WhenWorkItemCanceled = 0x01, 268 IWorkItemResult QueueWorkItem(Action action);
97 WhenWorkItemNotCanceled = 0x02,
98 Always = WhenWorkItemCanceled | WhenWorkItemNotCanceled,
99 }
100 269
101 #endregion 270 /// <summary>
271 /// Queue a work item.
272 /// </summary>
273 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
274 IWorkItemResult QueueWorkItem (Action action, WorkItemPriority priority);
102 275
103 #region IWorkItemResult interface 276 /// <summary>
277 /// Queue a work item.
278 /// </summary>
279 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
280 IWorkItemResult QueueWorkItem<T> (Action<T> action, T arg, WorkItemPriority priority);
104 281
105 /// <summary>
106 /// IWorkItemResult interface
107 /// </summary>
108 public interface IWorkItemResult
109 {
110 /// <summary> 282 /// <summary>
111 /// Get the result of the work item. 283 /// Queue a work item.
112 /// If the work item didn't run yet then the caller waits.
113 /// </summary> 284 /// </summary>
114 /// <returns>The result of the work item</returns> 285 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
115 object GetResult(); 286 IWorkItemResult QueueWorkItem<T> (Action<T> action, T arg);
116 287
117 /// <summary> 288 /// <summary>
118 /// Get the result of the work item. 289 /// Queue a work item.
119 /// If the work item didn't run yet then the caller waits until timeout.
120 /// </summary> 290 /// </summary>
121 /// <returns>The result of the work item</returns> 291 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
122 /// On timeout throws WorkItemTimeoutException 292 IWorkItemResult QueueWorkItem<T1, T2>(Action<T1, T2> action, T1 arg1, T2 arg2);
123 object GetResult(
124 int millisecondsTimeout,
125 bool exitContext);
126 293
127 /// <summary> 294 /// <summary>
128 /// Get the result of the work item. 295 /// Queue a work item.
129 /// If the work item didn't run yet then the caller waits until timeout.
130 /// </summary> 296 /// </summary>
131 /// <returns>The result of the work item</returns> 297 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
132 /// On timeout throws WorkItemTimeoutException 298 IWorkItemResult QueueWorkItem<T1, T2> (Action<T1, T2> action, T1 arg1, T2 arg2, WorkItemPriority priority);
133 object GetResult(
134 TimeSpan timeout,
135 bool exitContext);
136 299
137 void Abort(); 300 /// <summary>
301 /// Queue a work item.
302 /// </summary>
303 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
304 IWorkItemResult QueueWorkItem<T1, T2, T3>(Action<T1, T2, T3> action, T1 arg1, T2 arg2, T3 arg3);
138 305
139 /// <summary> 306 /// <summary>
140 /// Get the result of the work item. 307 /// Queue a work item.
141 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
142 /// </summary> 308 /// </summary>
143 /// <param name="millisecondsTimeout">Timeout in milliseconds, or -1 for infinite</param> 309 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
144 /// <param name="exitContext"> 310 IWorkItemResult QueueWorkItem<T1, T2, T3> (Action<T1, T2, T3> action, T1 arg1, T2 arg2, T3 arg3, WorkItemPriority priority);
145 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
146 /// </param>
147 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the blocking if needed</param>
148 /// <returns>The result of the work item</returns>
149 /// On timeout throws WorkItemTimeoutException
150 /// On cancel throws WorkItemCancelException
151 object GetResult(
152 int millisecondsTimeout,
153 bool exitContext,
154 WaitHandle cancelWaitHandle);
155 311
156 /// <summary> 312 /// <summary>
157 /// Get the result of the work item. 313 /// Queue a work item.
158 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
159 /// </summary> 314 /// </summary>
160 /// <returns>The result of the work item</returns> 315 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
161 /// On timeout throws WorkItemTimeoutException 316 IWorkItemResult QueueWorkItem<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
162 /// On cancel throws WorkItemCancelException
163 object GetResult(
164 TimeSpan timeout,
165 bool exitContext,
166 WaitHandle cancelWaitHandle);
167 317
168 /// <summary> 318 /// <summary>
169 /// Get the result of the work item. 319 /// Queue a work item.
170 /// If the work item didn't run yet then the caller waits.
171 /// </summary> 320 /// </summary>
172 /// <param name="e">Filled with the exception if one was thrown</param> 321 /// <returns>Returns a IWorkItemResult object, but its GetResult() will always return null</returns>
173 /// <returns>The result of the work item</returns> 322 IWorkItemResult QueueWorkItem<T1, T2, T3, T4> (Action<T1, T2, T3, T4> action, T1 arg1, T2 arg2, T3 arg3, T4 arg4, WorkItemPriority priority);
174 object GetResult(out Exception e); 323
324 #endregion
325
326 #region QueueWorkItem(Func<...>)
175 327
176 /// <summary> 328 /// <summary>
177 /// Get the result of the work item. 329 /// Queue a work item.
178 /// If the work item didn't run yet then the caller waits until timeout.
179 /// </summary> 330 /// </summary>
180 /// <param name="e">Filled with the exception if one was thrown</param> 331 /// <returns>Returns a IWorkItemResult&lt;TResult&gt; object.
181 /// <returns>The result of the work item</returns> 332 /// its GetResult() returns a TResult object</returns>
182 /// On timeout throws WorkItemTimeoutException 333 IWorkItemResult<TResult> QueueWorkItem<TResult>(Func<TResult> func);
183 object GetResult(
184 int millisecondsTimeout,
185 bool exitContext,
186 out Exception e);
187 334
188 /// <summary> 335 /// <summary>
189 /// Get the result of the work item. 336 /// Queue a work item.
190 /// If the work item didn't run yet then the caller waits until timeout.
191 /// </summary> 337 /// </summary>
192 /// <param name="e">Filled with the exception if one was thrown</param> 338 /// <returns>Returns a IWorkItemResult&lt;TResult&gt; object.
193 /// <returns>The result of the work item</returns> 339 /// its GetResult() returns a TResult object</returns>
194 /// On timeout throws WorkItemTimeoutException 340 IWorkItemResult<TResult> QueueWorkItem<T, TResult>(Func<T, TResult> func, T arg);
195 object GetResult(
196 TimeSpan timeout,
197 bool exitContext,
198 out Exception e);
199 341
200 /// <summary> 342 /// <summary>
201 /// Get the result of the work item. 343 /// Queue a work item.
202 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
203 /// </summary> 344 /// </summary>
204 /// <param name="millisecondsTimeout">Timeout in milliseconds, or -1 for infinite</param> 345 /// <returns>Returns a IWorkItemResult&lt;TResult&gt; object.
205 /// <param name="exitContext"> 346 /// its GetResult() returns a TResult object</returns>
206 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false. 347 IWorkItemResult<TResult> QueueWorkItem<T1, T2, TResult>(Func<T1, T2, TResult> func, T1 arg1, T2 arg2);
207 /// </param>
208 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the blocking if needed</param>
209 /// <param name="e">Filled with the exception if one was thrown</param>
210 /// <returns>The result of the work item</returns>
211 /// On timeout throws WorkItemTimeoutException
212 /// On cancel throws WorkItemCancelException
213 object GetResult(
214 int millisecondsTimeout,
215 bool exitContext,
216 WaitHandle cancelWaitHandle,
217 out Exception e);
218 348
219 /// <summary> 349 /// <summary>
220 /// Get the result of the work item. 350 /// Queue a work item.
221 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
222 /// </summary> 351 /// </summary>
223 /// <returns>The result of the work item</returns> 352 /// <returns>Returns a IWorkItemResult&lt;TResult&gt; object.
224 /// <param name="e">Filled with the exception if one was thrown</param> 353 /// its GetResult() returns a TResult object</returns>
225 /// On timeout throws WorkItemTimeoutException 354 IWorkItemResult<TResult> QueueWorkItem<T1, T2, T3, TResult>(Func<T1, T2, T3, TResult> func, T1 arg1, T2 arg2, T3 arg3);
226 /// On cancel throws WorkItemCancelException
227 object GetResult(
228 TimeSpan timeout,
229 bool exitContext,
230 WaitHandle cancelWaitHandle,
231 out Exception e);
232 355
233 /// <summary> 356 /// <summary>
234 /// Gets an indication whether the asynchronous operation has completed. 357 /// Queue a work item.
235 /// </summary> 358 /// </summary>
236 bool IsCompleted { get; } 359 /// <returns>Returns a IWorkItemResult&lt;TResult&gt; object.
360 /// its GetResult() returns a TResult object</returns>
361 IWorkItemResult<TResult> QueueWorkItem<T1, T2, T3, T4, TResult>(Func<T1, T2, T3, T4, TResult> func, T1 arg1, T2 arg2, T3 arg3, T4 arg4);
362
363 #endregion
364 }
365
366 #endregion
237 367
368 #region CallToPostExecute enumerator
369
370 [Flags]
371 public enum CallToPostExecute
372 {
238 /// <summary> 373 /// <summary>
239 /// Gets an indication whether the asynchronous operation has been canceled. 374 /// Never call to the PostExecute call back
240 /// </summary> 375 /// </summary>
241 bool IsCanceled { get; } 376 Never = 0x00,
242 377
243 /// <summary> 378 /// <summary>
244 /// Gets a user-defined object that qualifies or contains information about an asynchronous operation. 379 /// Call to the PostExecute only when the work item is cancelled
245 /// </summary> 380 /// </summary>
246 object State { get; } 381 WhenWorkItemCanceled = 0x01,
247 382
248 /// <summary> 383 /// <summary>
249 /// Cancel the work item if it didn't start running yet. 384 /// Call to the PostExecute only when the work item is not cancelled
250 /// </summary> 385 /// </summary>
251 /// <returns>Returns true on success or false if the work item is in progress or already completed</returns> 386 WhenWorkItemNotCanceled = 0x02,
252 bool Cancel();
253 387
254 /// <summary> 388 /// <summary>
255 /// Get the work item's priority 389 /// Always call to the PostExecute
256 /// </summary> 390 /// </summary>
257 WorkItemPriority WorkItemPriority { get; } 391 Always = WhenWorkItemCanceled | WhenWorkItemNotCanceled,
392 }
393
394 #endregion
258 395
396 #region IWorkItemResult interface
397
398 /// <summary>
399 /// The common interface of IWorkItemResult and IWorkItemResult&lt;T&gt;
400 /// </summary>
401 public interface IWaitableResult
402 {
259 /// <summary> 403 /// <summary>
260 /// Return the result, same as GetResult() 404 /// This method intent is for internal use.
261 /// </summary> 405 /// </summary>
262 object Result { get; } 406 /// <returns></returns>
407 IWorkItemResult GetWorkItemResult();
263 408
264 /// <summary> 409 /// <summary>
265 /// Returns the exception if occured otherwise returns null. 410 /// This method intent is for internal use.
266 /// </summary> 411 /// </summary>
267 object Exception { get; } 412 /// <returns></returns>
413 IWorkItemResult<TResult> GetWorkItemResultT<TResult>();
268 } 414 }
269 415
416 /// <summary>
417 /// IWorkItemResult interface.
418 /// Created when a WorkItemCallback work item is queued.
419 /// </summary>
420 public interface IWorkItemResult : IWorkItemResult<object>
421 {
422 }
423
424 /// <summary>
425 /// IWorkItemResult&lt;TResult&gt; interface.
426 /// Created when a Func&lt;TResult&gt; work item is queued.
427 /// </summary>
428 public interface IWorkItemResult<TResult> : IWaitableResult
429 {
430 /// <summary>
431 /// Get the result of the work item.
432 /// If the work item didn't run yet then the caller waits.
433 /// </summary>
434 /// <returns>The result of the work item</returns>
435 TResult GetResult();
436
437 /// <summary>
438 /// Get the result of the work item.
439 /// If the work item didn't run yet then the caller waits until timeout.
440 /// </summary>
441 /// <returns>The result of the work item</returns>
442 /// On timeout throws WorkItemTimeoutException
443 TResult GetResult(
444 int millisecondsTimeout,
445 bool exitContext);
446
447 /// <summary>
448 /// Get the result of the work item.
449 /// If the work item didn't run yet then the caller waits until timeout.
450 /// </summary>
451 /// <returns>The result of the work item</returns>
452 /// On timeout throws WorkItemTimeoutException
453 TResult GetResult(
454 TimeSpan timeout,
455 bool exitContext);
456
457 /// <summary>
458 /// Get the result of the work item.
459 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
460 /// </summary>
461 /// <param name="millisecondsTimeout">Timeout in milliseconds, or -1 for infinite</param>
462 /// <param name="exitContext">
463 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
464 /// </param>
465 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the blocking if needed</param>
466 /// <returns>The result of the work item</returns>
467 /// On timeout throws WorkItemTimeoutException
468 /// On cancel throws WorkItemCancelException
469 TResult GetResult(
470 int millisecondsTimeout,
471 bool exitContext,
472 WaitHandle cancelWaitHandle);
473
474 /// <summary>
475 /// Get the result of the work item.
476 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
477 /// </summary>
478 /// <returns>The result of the work item</returns>
479 /// On timeout throws WorkItemTimeoutException
480 /// On cancel throws WorkItemCancelException
481 TResult GetResult(
482 TimeSpan timeout,
483 bool exitContext,
484 WaitHandle cancelWaitHandle);
485
486 /// <summary>
487 /// Get the result of the work item.
488 /// If the work item didn't run yet then the caller waits.
489 /// </summary>
490 /// <param name="e">Filled with the exception if one was thrown</param>
491 /// <returns>The result of the work item</returns>
492 TResult GetResult(out Exception e);
493
494 /// <summary>
495 /// Get the result of the work item.
496 /// If the work item didn't run yet then the caller waits until timeout.
497 /// </summary>
498 /// <param name="millisecondsTimeout"></param>
499 /// <param name="exitContext"></param>
500 /// <param name="e">Filled with the exception if one was thrown</param>
501 /// <returns>The result of the work item</returns>
502 /// On timeout throws WorkItemTimeoutException
503 TResult GetResult(
504 int millisecondsTimeout,
505 bool exitContext,
506 out Exception e);
507
508 /// <summary>
509 /// Get the result of the work item.
510 /// If the work item didn't run yet then the caller waits until timeout.
511 /// </summary>
512 /// <param name="exitContext"></param>
513 /// <param name="e">Filled with the exception if one was thrown</param>
514 /// <param name="timeout"></param>
515 /// <returns>The result of the work item</returns>
516 /// On timeout throws WorkItemTimeoutException
517 TResult GetResult(
518 TimeSpan timeout,
519 bool exitContext,
520 out Exception e);
521
522 /// <summary>
523 /// Get the result of the work item.
524 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
525 /// </summary>
526 /// <param name="millisecondsTimeout">Timeout in milliseconds, or -1 for infinite</param>
527 /// <param name="exitContext">
528 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
529 /// </param>
530 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the blocking if needed</param>
531 /// <param name="e">Filled with the exception if one was thrown</param>
532 /// <returns>The result of the work item</returns>
533 /// On timeout throws WorkItemTimeoutException
534 /// On cancel throws WorkItemCancelException
535 TResult GetResult(
536 int millisecondsTimeout,
537 bool exitContext,
538 WaitHandle cancelWaitHandle,
539 out Exception e);
540
541 /// <summary>
542 /// Get the result of the work item.
543 /// If the work item didn't run yet then the caller waits until timeout or until the cancelWaitHandle is signaled.
544 /// </summary>
545 /// <returns>The result of the work item</returns>
546 /// <param name="cancelWaitHandle"></param>
547 /// <param name="e">Filled with the exception if one was thrown</param>
548 /// <param name="timeout"></param>
549 /// <param name="exitContext"></param>
550 /// On timeout throws WorkItemTimeoutException
551 /// On cancel throws WorkItemCancelException
552 TResult GetResult(
553 TimeSpan timeout,
554 bool exitContext,
555 WaitHandle cancelWaitHandle,
556 out Exception e);
557
558 /// <summary>
559 /// Gets an indication whether the asynchronous operation has completed.
560 /// </summary>
561 bool IsCompleted { get; }
562
563 /// <summary>
564 /// Gets an indication whether the asynchronous operation has been canceled.
565 /// </summary>
566 bool IsCanceled { get; }
567
568 /// <summary>
569 /// Gets the user-defined object that contains context data
570 /// for the work item method.
571 /// </summary>
572 object State { get; }
573
574 /// <summary>
575 /// Same as Cancel(false).
576 /// </summary>
577 bool Cancel();
578
579 /// <summary>
580 /// Cancel the work item execution.
581 /// If the work item is in the queue then it won't execute
582 /// If the work item is completed, it will remain completed
583 /// If the work item is in progress then the user can check the SmartThreadPool.IsWorkItemCanceled
584 /// property to check if the work item has been cancelled. If the abortExecution is set to true then
585 /// the Smart Thread Pool will send an AbortException to the running thread to stop the execution
586 /// of the work item. When an in progress work item is canceled its GetResult will throw WorkItemCancelException.
587 /// If the work item is already cancelled it will remain cancelled
588 /// </summary>
589 /// <param name="abortExecution">When true send an AbortException to the executing thread.</param>
590 /// <returns>Returns true if the work item was not completed, otherwise false.</returns>
591 bool Cancel(bool abortExecution);
592
593 /// <summary>
594 /// Get the work item's priority
595 /// </summary>
596 WorkItemPriority WorkItemPriority { get; }
597
598 /// <summary>
599 /// Return the result, same as GetResult()
600 /// </summary>
601 TResult Result { get; }
602
603 /// <summary>
604 /// Returns the exception if occured otherwise returns null.
605 /// </summary>
606 object Exception { get; }
607 }
608
609 #endregion
610
611 #region .NET 3.5
612
613 // All these delegate are built-in .NET 3.5
614 // Comment/Remove them when compiling to .NET 3.5 to avoid ambiguity.
615
616 public delegate void Action();
617 public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
618 public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
619 public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
620
621 public delegate TResult Func<TResult>();
622 public delegate TResult Func<T, TResult>(T arg1);
623 public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
624 public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
625 public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
626
270 #endregion 627 #endregion
271} 628}
diff --git a/ThirdParty/SmartThreadPool/InternalInterfaces.cs b/ThirdParty/SmartThreadPool/InternalInterfaces.cs
new file mode 100644
index 0000000..0072e10
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/InternalInterfaces.cs
@@ -0,0 +1,27 @@
1
2namespace Amib.Threading.Internal
3{
4 /// <summary>
5 /// An internal delegate to call when the WorkItem starts or completes
6 /// </summary>
7 internal delegate void WorkItemStateCallback(WorkItem workItem);
8
9 internal interface IInternalWorkItemResult
10 {
11 event WorkItemStateCallback OnWorkItemStarted;
12 event WorkItemStateCallback OnWorkItemCompleted;
13 }
14
15 internal interface IInternalWaitableResult
16 {
17 /// <summary>
18 /// This method is intent for internal use.
19 /// </summary>
20 IWorkItemResult GetWorkItemResult();
21 }
22
23 public interface IHasWorkItemPriority
24 {
25 WorkItemPriority WorkItemPriority { get; }
26 }
27}
diff --git a/ThirdParty/SmartThreadPool/PriorityQueue.cs b/ThirdParty/SmartThreadPool/PriorityQueue.cs
index 63d5e84..409c879 100644
--- a/ThirdParty/SmartThreadPool/PriorityQueue.cs
+++ b/ThirdParty/SmartThreadPool/PriorityQueue.cs
@@ -1,240 +1,239 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
5using System.Collections; 2using System.Collections;
3using System.Collections.Generic;
6using System.Diagnostics; 4using System.Diagnostics;
7 5
8namespace Amib.Threading.Internal 6namespace Amib.Threading.Internal
9{ 7{
10 #region PriorityQueue class 8 #region PriorityQueue class
11 9
12 /// <summary> 10 /// <summary>
13 /// PriorityQueue class 11 /// PriorityQueue class
14 /// This class is not thread safe because we use external lock 12 /// This class is not thread safe because we use external lock
15 /// </summary> 13 /// </summary>
16 public sealed class PriorityQueue : IEnumerable 14 public sealed class PriorityQueue : IEnumerable
17 { 15 {
18 #region Private members 16 #region Private members
19 17
20 /// <summary> 18 /// <summary>
21 /// The number of queues, there is one for each type of priority 19 /// The number of queues, there is one for each type of priority
22 /// </summary> 20 /// </summary>
23 private const int _queuesCount = WorkItemPriority.Highest-WorkItemPriority.Lowest+1; 21 private const int _queuesCount = WorkItemPriority.Highest-WorkItemPriority.Lowest+1;
24 22
25 /// <summary> 23 /// <summary>
26 /// Work items queues. There is one for each type of priority 24 /// Work items queues. There is one for each type of priority
27 /// </summary> 25 /// </summary>
28 private Queue [] _queues = new Queue[_queuesCount]; 26 private readonly LinkedList<IHasWorkItemPriority>[] _queues = new LinkedList<IHasWorkItemPriority>[_queuesCount];
29 27
30 /// <summary> 28 /// <summary>
31 /// The total number of work items within the queues 29 /// The total number of work items within the queues
32 /// </summary> 30 /// </summary>
33 private int _workItemsCount = 0; 31 private int _workItemsCount;
34 32
35 /// <summary> 33 /// <summary>
36 /// Use with IEnumerable interface 34 /// Use with IEnumerable interface
37 /// </summary> 35 /// </summary>
38 private int _version = 0; 36 private int _version;
39 37
40 #endregion 38 #endregion
41 39
42 #region Contructor 40 #region Contructor
43 41
44 public PriorityQueue() 42 public PriorityQueue()
45 { 43 {
46 for(int i = 0; i < _queues.Length; ++i) 44 for(int i = 0; i < _queues.Length; ++i)
47 { 45 {
48 _queues[i] = new Queue(); 46 _queues[i] = new LinkedList<IHasWorkItemPriority>();
49 } 47 }
50 } 48 }
51 49
52 #endregion 50 #endregion
53 51
54 #region Methods 52 #region Methods
55 53
56 /// <summary> 54 /// <summary>
57 /// Enqueue a work item. 55 /// Enqueue a work item.
58 /// </summary> 56 /// </summary>
59 /// <param name="workItem">A work item</param> 57 /// <param name="workItem">A work item</param>
60 public void Enqueue(IHasWorkItemPriority workItem) 58 public void Enqueue(IHasWorkItemPriority workItem)
61 { 59 {
62 Debug.Assert(null != workItem); 60 Debug.Assert(null != workItem);
63 61
64 int queueIndex = _queuesCount-(int)workItem.WorkItemPriority-1; 62 int queueIndex = _queuesCount-(int)workItem.WorkItemPriority-1;
65 Debug.Assert(queueIndex >= 0); 63 Debug.Assert(queueIndex >= 0);
66 Debug.Assert(queueIndex < _queuesCount); 64 Debug.Assert(queueIndex < _queuesCount);
67 65
68 _queues[queueIndex].Enqueue(workItem); 66 _queues[queueIndex].AddLast(workItem);
69 ++_workItemsCount; 67 ++_workItemsCount;
70 ++_version; 68 ++_version;
71 } 69 }
72 70
73 /// <summary> 71 /// <summary>
74 /// Dequeque a work item. 72 /// Dequeque a work item.
75 /// </summary> 73 /// </summary>
76 /// <returns>Returns the next work item</returns> 74 /// <returns>Returns the next work item</returns>
77 public IHasWorkItemPriority Dequeue() 75 public IHasWorkItemPriority Dequeue()
78 { 76 {
79 IHasWorkItemPriority workItem = null; 77 IHasWorkItemPriority workItem = null;
80 78
81 if(_workItemsCount > 0) 79 if(_workItemsCount > 0)
82 { 80 {
83 int queueIndex = GetNextNonEmptyQueue(-1); 81 int queueIndex = GetNextNonEmptyQueue(-1);
84 Debug.Assert(queueIndex >= 0); 82 Debug.Assert(queueIndex >= 0);
85 workItem = _queues[queueIndex].Dequeue() as IHasWorkItemPriority; 83 workItem = _queues[queueIndex].First.Value;
86 Debug.Assert(null != workItem); 84 _queues[queueIndex].RemoveFirst();
87 --_workItemsCount; 85 Debug.Assert(null != workItem);
88 ++_version; 86 --_workItemsCount;
89 } 87 ++_version;
90 88 }
91 return workItem; 89
92 } 90 return workItem;
93 91 }
94 /// <summary> 92
95 /// Find the next non empty queue starting at queue queueIndex+1 93 /// <summary>
96 /// </summary> 94 /// Find the next non empty queue starting at queue queueIndex+1
97 /// <param name="queueIndex">The index-1 to start from</param> 95 /// </summary>
98 /// <returns> 96 /// <param name="queueIndex">The index-1 to start from</param>
99 /// The index of the next non empty queue or -1 if all the queues are empty 97 /// <returns>
100 /// </returns> 98 /// The index of the next non empty queue or -1 if all the queues are empty
101 private int GetNextNonEmptyQueue(int queueIndex) 99 /// </returns>
102 { 100 private int GetNextNonEmptyQueue(int queueIndex)
103 for(int i = queueIndex+1; i < _queuesCount; ++i) 101 {
104 { 102 for(int i = queueIndex+1; i < _queuesCount; ++i)
105 if(_queues[i].Count > 0) 103 {
106 { 104 if(_queues[i].Count > 0)
107 return i; 105 {
108 } 106 return i;
109 } 107 }
110 return -1; 108 }
111 } 109 return -1;
112 110 }
113 /// <summary> 111
114 /// The number of work items 112 /// <summary>
115 /// </summary> 113 /// The number of work items
116 public int Count 114 /// </summary>
117 { 115 public int Count
118 get 116 {
119 { 117 get
120 return _workItemsCount; 118 {
121 } 119 return _workItemsCount;
122 } 120 }
123 121 }
124 /// <summary> 122
125 /// Clear all the work items 123 /// <summary>
126 /// </summary> 124 /// Clear all the work items
127 public void Clear() 125 /// </summary>
128 { 126 public void Clear()
129 if (_workItemsCount > 0) 127 {
130 { 128 if (_workItemsCount > 0)
131 foreach(Queue queue in _queues) 129 {
132 { 130 foreach(LinkedList<IHasWorkItemPriority> queue in _queues)
133 queue.Clear(); 131 {
134 } 132 queue.Clear();
135 _workItemsCount = 0; 133 }
136 ++_version; 134 _workItemsCount = 0;
137 } 135 ++_version;
138 } 136 }
139 137 }
140 #endregion 138
141 139 #endregion
142 #region IEnumerable Members 140
143 141 #region IEnumerable Members
144 /// <summary> 142
145 /// Returns an enumerator to iterate over the work items 143 /// <summary>
146 /// </summary> 144 /// Returns an enumerator to iterate over the work items
147 /// <returns>Returns an enumerator</returns> 145 /// </summary>
148 public IEnumerator GetEnumerator() 146 /// <returns>Returns an enumerator</returns>
149 { 147 public IEnumerator GetEnumerator()
150 return new PriorityQueueEnumerator(this); 148 {
151 } 149 return new PriorityQueueEnumerator(this);
152 150 }
153 #endregion 151
154 152 #endregion
155 #region PriorityQueueEnumerator 153
156 154 #region PriorityQueueEnumerator
157 /// <summary> 155
158 /// The class the implements the enumerator 156 /// <summary>
159 /// </summary> 157 /// The class the implements the enumerator
160 private class PriorityQueueEnumerator : IEnumerator 158 /// </summary>
161 { 159 private class PriorityQueueEnumerator : IEnumerator
162 private PriorityQueue _priorityQueue; 160 {
163 private int _version; 161 private readonly PriorityQueue _priorityQueue;
164 private int _queueIndex; 162 private int _version;
165 private IEnumerator _enumerator; 163 private int _queueIndex;
166 164 private IEnumerator _enumerator;
167 public PriorityQueueEnumerator(PriorityQueue priorityQueue) 165
168 { 166 public PriorityQueueEnumerator(PriorityQueue priorityQueue)
169 _priorityQueue = priorityQueue; 167 {
170 _version = _priorityQueue._version; 168 _priorityQueue = priorityQueue;
171 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(-1); 169 _version = _priorityQueue._version;
172 if (_queueIndex >= 0) 170 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(-1);
173 { 171 if (_queueIndex >= 0)
174 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator(); 172 {
175 } 173 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator();
176 else 174 }
177 { 175 else
178 _enumerator = null; 176 {
179 } 177 _enumerator = null;
180 } 178 }
181 179 }
182 #region IEnumerator Members 180
183 181 #region IEnumerator Members
184 public void Reset() 182
185 { 183 public void Reset()
186 _version = _priorityQueue._version; 184 {
187 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(-1); 185 _version = _priorityQueue._version;
188 if (_queueIndex >= 0) 186 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(-1);
189 { 187 if (_queueIndex >= 0)
190 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator(); 188 {
191 } 189 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator();
192 else 190 }
193 { 191 else
194 _enumerator = null; 192 {
195 } 193 _enumerator = null;
196 } 194 }
197 195 }
198 public object Current 196
199 { 197 public object Current
200 get 198 {
201 { 199 get
202 Debug.Assert(null != _enumerator); 200 {
203 return _enumerator.Current; 201 Debug.Assert(null != _enumerator);
204 } 202 return _enumerator.Current;
205 } 203 }
206 204 }
207 public bool MoveNext() 205
208 { 206 public bool MoveNext()
209 if (null == _enumerator) 207 {
210 { 208 if (null == _enumerator)
211 return false; 209 {
212 } 210 return false;
213 211 }
214 if(_version != _priorityQueue._version) 212
215 { 213 if(_version != _priorityQueue._version)
216 throw new InvalidOperationException("The collection has been modified"); 214 {
217 215 throw new InvalidOperationException("The collection has been modified");
218 } 216
219 if (!_enumerator.MoveNext()) 217 }
220 { 218 if (!_enumerator.MoveNext())
221 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(_queueIndex); 219 {
222 if(-1 == _queueIndex) 220 _queueIndex = _priorityQueue.GetNextNonEmptyQueue(_queueIndex);
223 { 221 if(-1 == _queueIndex)
224 return false; 222 {
225 } 223 return false;
226 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator(); 224 }
227 _enumerator.MoveNext(); 225 _enumerator = _priorityQueue._queues[_queueIndex].GetEnumerator();
228 return true; 226 _enumerator.MoveNext();
229 } 227 return true;
230 return true; 228 }
231 } 229 return true;
232 230 }
233 #endregion 231
234 } 232 #endregion
235 233 }
236 #endregion 234
237 } 235 #endregion
238 236 }
239 #endregion 237
238 #endregion
240} 239}
diff --git a/ThirdParty/SmartThreadPool/Properties/AssemblyInfo.cs b/ThirdParty/SmartThreadPool/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..4728c1f
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/Properties/AssemblyInfo.cs
@@ -0,0 +1,23 @@
1using System.Reflection;
2using System.Runtime.CompilerServices;
3using System.Runtime.InteropServices;
4
5[assembly: AssemblyTitle("Amib.Threading")]
6[assembly: AssemblyDescription("Smart Thread Pool")]
7[assembly: AssemblyConfiguration("")]
8[assembly: AssemblyCompany("")]
9[assembly: AssemblyProduct("Amib.Threading")]
10[assembly: AssemblyCopyright("")]
11[assembly: AssemblyTrademark("")]
12[assembly: AssemblyCulture("")]
13[assembly: ComVisible(false)]
14[assembly: Guid("c764a3de-c4f8-434d-85b5-a09830d1e44f")]
15[assembly: AssemblyVersion("2.2.3.0")]
16
17#if (_PUBLISH)
18[assembly: InternalsVisibleTo("STPTests,PublicKey=00240000048000009400000006020000002400005253413100040000010001004fe3d39add741ba7c8d52cd1eb0d94c7d79060ad956cbaff0e51c1dce94db10356b261778bc1ac3114b3218434da6fcd8416dd5507653809598f7d2afc422099ce4f6b7b0477f18e6c57c727ef2a7ab6ee56e6b4589fe44cb0e25f2875a3c65ab0383ee33c4dd93023f7ce1218bebc8b7a9a1dac878938f5c4f45ea74b6bd8ad")]
19#else
20[assembly: InternalsVisibleTo("STPTests")]
21#endif
22
23
diff --git a/ThirdParty/SmartThreadPool/SLExt.cs b/ThirdParty/SmartThreadPool/SLExt.cs
new file mode 100644
index 0000000..23a60bc
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/SLExt.cs
@@ -0,0 +1,16 @@
1#if _SILVERLIGHT
2
3using System.Threading;
4
5namespace Amib.Threading
6{
7 public enum ThreadPriority
8 {
9 Lowest,
10 BelowNormal,
11 Normal,
12 AboveNormal,
13 Highest,
14 }
15}
16#endif
diff --git a/ThirdParty/SmartThreadPool/STPEventWaitHandle.cs b/ThirdParty/SmartThreadPool/STPEventWaitHandle.cs
new file mode 100644
index 0000000..9b17f69
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/STPEventWaitHandle.cs
@@ -0,0 +1,62 @@
1#if !(_WINDOWS_CE)
2
3using System;
4using System.Threading;
5
6namespace Amib.Threading.Internal
7{
8#if _WINDOWS || WINDOWS_PHONE
9 internal static class STPEventWaitHandle
10 {
11 public const int WaitTimeout = Timeout.Infinite;
12
13 internal static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
14 {
15 return WaitHandle.WaitAll(waitHandles, millisecondsTimeout);
16 }
17
18 internal static int WaitAny(WaitHandle[] waitHandles)
19 {
20 return WaitHandle.WaitAny(waitHandles);
21 }
22
23 internal static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
24 {
25 return WaitHandle.WaitAny(waitHandles, millisecondsTimeout);
26 }
27
28 internal static bool WaitOne(WaitHandle waitHandle, int millisecondsTimeout, bool exitContext)
29 {
30 return waitHandle.WaitOne(millisecondsTimeout);
31 }
32 }
33#else
34 internal static class STPEventWaitHandle
35 {
36 public const int WaitTimeout = Timeout.Infinite;
37
38 internal static bool WaitAll(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
39 {
40 return WaitHandle.WaitAll(waitHandles, millisecondsTimeout, exitContext);
41 }
42
43 internal static int WaitAny(WaitHandle[] waitHandles)
44 {
45 return WaitHandle.WaitAny(waitHandles);
46 }
47
48 internal static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext)
49 {
50 return WaitHandle.WaitAny(waitHandles, millisecondsTimeout, exitContext);
51 }
52
53 internal static bool WaitOne(WaitHandle waitHandle, int millisecondsTimeout, bool exitContext)
54 {
55 return waitHandle.WaitOne(millisecondsTimeout, exitContext);
56 }
57 }
58#endif
59
60}
61
62#endif \ No newline at end of file
diff --git a/ThirdParty/SmartThreadPool/STPPerformanceCounter.cs b/ThirdParty/SmartThreadPool/STPPerformanceCounter.cs
index 077cf17..0663d1d 100644
--- a/ThirdParty/SmartThreadPool/STPPerformanceCounter.cs
+++ b/ThirdParty/SmartThreadPool/STPPerformanceCounter.cs
@@ -1,354 +1,448 @@
1using System; 1using System;
2using System.Diagnostics; 2using System.Diagnostics;
3using System.Threading;
4
5namespace Amib.Threading
6{
7 public interface ISTPPerformanceCountersReader
8 {
9 long InUseThreads { get; }
10 long ActiveThreads { get; }
11 long WorkItemsQueued { get; }
12 long WorkItemsProcessed { get; }
13 }
14}
3 15
4namespace Amib.Threading.Internal 16namespace Amib.Threading.Internal
5{ 17{
6 internal enum STPPerformanceCounterType 18 internal interface ISTPInstancePerformanceCounters : IDisposable
7 { 19 {
8 // Fields 20 void Close();
9 ActiveThreads = 0, 21 void SampleThreads(long activeThreads, long inUseThreads);
10 InUseThreads = 1, 22 void SampleWorkItems(long workItemsQueued, long workItemsProcessed);
11 OverheadThreads = 2, 23 void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime);
12 OverheadThreadsPercent = 3, 24 void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime);
13 OverheadThreadsPercentBase = 4, 25 }
26#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
14 27
15 WorkItems = 5, 28 internal enum STPPerformanceCounterType
16 WorkItemsInQueue = 6, 29 {
17 WorkItemsProcessed = 7, 30 // Fields
31 ActiveThreads = 0,
32 InUseThreads = 1,
33 OverheadThreads = 2,
34 OverheadThreadsPercent = 3,
35 OverheadThreadsPercentBase = 4,
18 36
19 WorkItemsQueuedPerSecond = 8, 37 WorkItems = 5,
20 WorkItemsProcessedPerSecond = 9, 38 WorkItemsInQueue = 6,
39 WorkItemsProcessed = 7,
21 40
22 AvgWorkItemWaitTime = 10, 41 WorkItemsQueuedPerSecond = 8,
23 AvgWorkItemWaitTimeBase = 11, 42 WorkItemsProcessedPerSecond = 9,
24 43
25 AvgWorkItemProcessTime = 12, 44 AvgWorkItemWaitTime = 10,
26 AvgWorkItemProcessTimeBase = 13, 45 AvgWorkItemWaitTimeBase = 11,
27 46
28 WorkItemsGroups = 14, 47 AvgWorkItemProcessTime = 12,
48 AvgWorkItemProcessTimeBase = 13,
29 49
30 LastCounter = 14, 50 WorkItemsGroups = 14,
31 }
32
33 51
34 /// <summary> 52 LastCounter = 14,
35 /// Summary description for STPPerformanceCounter. 53 }
36 /// </summary> 54
37 internal class STPPerformanceCounter
38 {
39 // Fields
40 private PerformanceCounterType _pcType;
41 protected string _counterHelp;
42 protected string _counterName;
43
44 // Methods
45 public STPPerformanceCounter(
46 string counterName,
47 string counterHelp,
48 PerformanceCounterType pcType)
49 {
50 this._counterName = counterName;
51 this._counterHelp = counterHelp;
52 this._pcType = pcType;
53 }
54
55 public void AddCounterToCollection(CounterCreationDataCollection counterData)
56 {
57 CounterCreationData counterCreationData = new CounterCreationData(
58 _counterName,
59 _counterHelp,
60 _pcType);
61 55
62 counterData.Add(counterCreationData); 56 /// <summary>
63 } 57 /// Summary description for STPPerformanceCounter.
58 /// </summary>
59 internal class STPPerformanceCounter
60 {
61 // Fields
62 private readonly PerformanceCounterType _pcType;
63 protected string _counterHelp;
64 protected string _counterName;
65
66 // Methods
67 public STPPerformanceCounter(
68 string counterName,
69 string counterHelp,
70 PerformanceCounterType pcType)
71 {
72 _counterName = counterName;
73 _counterHelp = counterHelp;
74 _pcType = pcType;
75 }
76
77 public void AddCounterToCollection(CounterCreationDataCollection counterData)
78 {
79 CounterCreationData counterCreationData = new CounterCreationData(
80 _counterName,
81 _counterHelp,
82 _pcType);
83
84 counterData.Add(counterCreationData);
85 }
86
87 // Properties
88 public string Name
89 {
90 get
91 {
92 return _counterName;
93 }
94 }
95 }
96
97 internal class STPPerformanceCounters
98 {
99 // Fields
100 internal STPPerformanceCounter[] _stpPerformanceCounters;
101 private static readonly STPPerformanceCounters _instance;
102 internal const string _stpCategoryHelp = "SmartThreadPool performance counters";
103 internal const string _stpCategoryName = "SmartThreadPool";
104
105 // Methods
106 static STPPerformanceCounters()
107 {
108 _instance = new STPPerformanceCounters();
109 }
110
111 private STPPerformanceCounters()
112 {
113 STPPerformanceCounter[] stpPerformanceCounters = new STPPerformanceCounter[]
114 {
115 new STPPerformanceCounter("Active threads", "The current number of available in the thread pool.", PerformanceCounterType.NumberOfItems32),
116 new STPPerformanceCounter("In use threads", "The current number of threads that execute a work item.", PerformanceCounterType.NumberOfItems32),
117 new STPPerformanceCounter("Overhead threads", "The current number of threads that are active, but are not in use.", PerformanceCounterType.NumberOfItems32),
118 new STPPerformanceCounter("% overhead threads", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawFraction),
119 new STPPerformanceCounter("% overhead threads base", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawBase),
120
121 new STPPerformanceCounter("Work Items", "The number of work items in the Smart Thread Pool. Both queued and processed.", PerformanceCounterType.NumberOfItems32),
122 new STPPerformanceCounter("Work Items in queue", "The current number of work items in the queue", PerformanceCounterType.NumberOfItems32),
123 new STPPerformanceCounter("Work Items processed", "The number of work items already processed", PerformanceCounterType.NumberOfItems32),
124
125 new STPPerformanceCounter("Work Items queued/sec", "The number of work items queued per second", PerformanceCounterType.RateOfCountsPerSecond32),
126 new STPPerformanceCounter("Work Items processed/sec", "The number of work items processed per second", PerformanceCounterType.RateOfCountsPerSecond32),
127
128 new STPPerformanceCounter("Avg. Work Item wait time/sec", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageCount64),
129 new STPPerformanceCounter("Avg. Work Item wait time base", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageBase),
130
131 new STPPerformanceCounter("Avg. Work Item process time/sec", "The average time it takes to process a work item.", PerformanceCounterType.AverageCount64),
132 new STPPerformanceCounter("Avg. Work Item process time base", "The average time it takes to process a work item.", PerformanceCounterType.AverageBase),
133
134 new STPPerformanceCounter("Work Items Groups", "The current number of work item groups associated with the Smart Thread Pool.", PerformanceCounterType.NumberOfItems32),
135 };
136
137 _stpPerformanceCounters = stpPerformanceCounters;
138 SetupCategory();
139 }
140
141 private void SetupCategory()
142 {
143 if (!PerformanceCounterCategory.Exists(_stpCategoryName))
144 {
145 CounterCreationDataCollection counters = new CounterCreationDataCollection();
146
147 for (int i = 0; i < _stpPerformanceCounters.Length; i++)
148 {
149 _stpPerformanceCounters[i].AddCounterToCollection(counters);
150 }
151
152 PerformanceCounterCategory.Create(
153 _stpCategoryName,
154 _stpCategoryHelp,
155 PerformanceCounterCategoryType.MultiInstance,
156 counters);
157
158 }
159 }
64 160
65 // Properties 161 // Properties
66 public string Name 162 public static STPPerformanceCounters Instance
163 {
164 get
165 {
166 return _instance;
167 }
168 }
169 }
170
171 internal class STPInstancePerformanceCounter : IDisposable
172 {
173 // Fields
174 private bool _isDisposed;
175 private PerformanceCounter _pcs;
176
177 // Methods
178 protected STPInstancePerformanceCounter()
179 {
180 _isDisposed = false;
181 }
182
183 public STPInstancePerformanceCounter(
184 string instance,
185 STPPerformanceCounterType spcType) : this()
186 {
187 STPPerformanceCounters counters = STPPerformanceCounters.Instance;
188 _pcs = new PerformanceCounter(
189 STPPerformanceCounters._stpCategoryName,
190 counters._stpPerformanceCounters[(int) spcType].Name,
191 instance,
192 false);
193 _pcs.RawValue = _pcs.RawValue;
194 }
195
196
197 public void Close()
198 {
199 if (_pcs != null)
200 {
201 _pcs.RemoveInstance();
202 _pcs.Close();
203 _pcs = null;
204 }
205 }
206
207 public void Dispose()
208 {
209 Dispose(true);
210 }
211
212 public virtual void Dispose(bool disposing)
67 { 213 {
68 get 214 if (!_isDisposed)
69 { 215 {
70 return _counterName; 216 if (disposing)
217 {
218 Close();
219 }
71 } 220 }
72 } 221 _isDisposed = true;
73 }
74
75 internal class STPPerformanceCounters
76 {
77 // Fields
78 internal STPPerformanceCounter[] _stpPerformanceCounters;
79 private static STPPerformanceCounters _instance;
80 internal const string _stpCategoryHelp = "SmartThreadPool performance counters";
81 internal const string _stpCategoryName = "SmartThreadPool";
82
83 // Methods
84 static STPPerformanceCounters()
85 {
86 _instance = new STPPerformanceCounters();
87 } 222 }
88 223
89 private STPPerformanceCounters() 224 public virtual void Increment()
90 { 225 {
91 STPPerformanceCounter[] stpPerformanceCounters = new STPPerformanceCounter[] 226 _pcs.Increment();
92 { 227 }
93 new STPPerformanceCounter("Active threads", "The current number of available in the thread pool.", PerformanceCounterType.NumberOfItems32), 228
94 new STPPerformanceCounter("In use threads", "The current number of threads that execute a work item.", PerformanceCounterType.NumberOfItems32), 229 public virtual void IncrementBy(long val)
95 new STPPerformanceCounter("Overhead threads", "The current number of threads that are active, but are not in use.", PerformanceCounterType.NumberOfItems32), 230 {
96 new STPPerformanceCounter("% overhead threads", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawFraction), 231 _pcs.IncrementBy(val);
97 new STPPerformanceCounter("% overhead threads base", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawBase), 232 }
98 233
99 new STPPerformanceCounter("Work Items", "The number of work items in the Smart Thread Pool. Both queued and processed.", PerformanceCounterType.NumberOfItems32), 234 public virtual void Set(long val)
100 new STPPerformanceCounter("Work Items in queue", "The current number of work items in the queue", PerformanceCounterType.NumberOfItems32), 235 {
101 new STPPerformanceCounter("Work Items processed", "The number of work items already processed", PerformanceCounterType.NumberOfItems32), 236 _pcs.RawValue = val;
102 237 }
103 new STPPerformanceCounter("Work Items queued/sec", "The number of work items queued per second", PerformanceCounterType.RateOfCountsPerSecond32), 238 }
104 new STPPerformanceCounter("Work Items processed/sec", "The number of work items processed per second", PerformanceCounterType.RateOfCountsPerSecond32), 239
105 240 internal class STPInstanceNullPerformanceCounter : STPInstancePerformanceCounter
106 new STPPerformanceCounter("Avg. Work Item wait time/sec", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageCount64), 241 {
107 new STPPerformanceCounter("Avg. Work Item wait time base", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageBase), 242 // Methods
243 public override void Increment() {}
244 public override void IncrementBy(long value) {}
245 public override void Set(long val) {}
246 }
247
248
249
250 internal class STPInstancePerformanceCounters : ISTPInstancePerformanceCounters
251 {
252 private bool _isDisposed;
253 // Fields
254 private STPInstancePerformanceCounter[] _pcs;
255 private static readonly STPInstancePerformanceCounter _stpInstanceNullPerformanceCounter;
256
257 // Methods
258 static STPInstancePerformanceCounters()
259 {
260 _stpInstanceNullPerformanceCounter = new STPInstanceNullPerformanceCounter();
261 }
262
263 public STPInstancePerformanceCounters(string instance)
264 {
265 _isDisposed = false;
266 _pcs = new STPInstancePerformanceCounter[(int)STPPerformanceCounterType.LastCounter];
267
268 // Call the STPPerformanceCounters.Instance so the static constructor will
269 // intialize the STPPerformanceCounters singleton.
270 STPPerformanceCounters.Instance.GetHashCode();
271
272 for (int i = 0; i < _pcs.Length; i++)
273 {
274 if (instance != null)
275 {
276 _pcs[i] = new STPInstancePerformanceCounter(
277 instance,
278 (STPPerformanceCounterType) i);
279 }
280 else
281 {
282 _pcs[i] = _stpInstanceNullPerformanceCounter;
283 }
284 }
285 }
286
108 287
109 new STPPerformanceCounter("Avg. Work Item process time/sec", "The average time it takes to process a work item.", PerformanceCounterType.AverageCount64), 288 public void Close()
110 new STPPerformanceCounter("Avg. Work Item process time base", "The average time it takes to process a work item.", PerformanceCounterType.AverageBase), 289 {
290 if (null != _pcs)
291 {
292 for (int i = 0; i < _pcs.Length; i++)
293 {
294 if (null != _pcs[i])
295 {
296 _pcs[i].Dispose();
297 }
298 }
299 _pcs = null;
300 }
301 }
111 302
112 new STPPerformanceCounter("Work Items Groups", "The current number of work item groups associated with the Smart Thread Pool.", PerformanceCounterType.NumberOfItems32), 303 public void Dispose()
113 }; 304 {
305 Dispose(true);
306 }
114 307
115 _stpPerformanceCounters = stpPerformanceCounters; 308 public virtual void Dispose(bool disposing)
116 SetupCategory();
117 }
118
119 private void SetupCategory()
120 { 309 {
121 if (!PerformanceCounterCategory.Exists(_stpCategoryName)) 310 if (!_isDisposed)
122 { 311 {
123 CounterCreationDataCollection counters = new CounterCreationDataCollection(); 312 if (disposing)
124
125 for (int i = 0; i < _stpPerformanceCounters.Length; i++)
126 { 313 {
127 _stpPerformanceCounters[i].AddCounterToCollection(counters); 314 Close();
128 } 315 }
129
130
131 // *********** Remark for .NET 2.0 ***********
132 // If you are here, it means you got the warning that this overload
133 // of the method is deprecated in .NET 2.0. To use the correct
134 // method overload, uncomment the third argument of
135 // the method.
136 #pragma warning disable 0618
137 PerformanceCounterCategory.Create(
138 _stpCategoryName,
139 _stpCategoryHelp,
140 //PerformanceCounterCategoryType.MultiInstance,
141 counters);
142 #pragma warning restore 0618
143 } 316 }
317 _isDisposed = true;
144 } 318 }
145 319
146 // Properties 320 private STPInstancePerformanceCounter GetCounter(STPPerformanceCounterType spcType)
147 public static STPPerformanceCounters Instance 321 {
148 { 322 return _pcs[(int) spcType];
149 get 323 }
150 { 324
151 return _instance; 325 public void SampleThreads(long activeThreads, long inUseThreads)
152 } 326 {
153 } 327 GetCounter(STPPerformanceCounterType.ActiveThreads).Set(activeThreads);
154 } 328 GetCounter(STPPerformanceCounterType.InUseThreads).Set(inUseThreads);
329 GetCounter(STPPerformanceCounterType.OverheadThreads).Set(activeThreads-inUseThreads);
330
331 GetCounter(STPPerformanceCounterType.OverheadThreadsPercentBase).Set(activeThreads-inUseThreads);
332 GetCounter(STPPerformanceCounterType.OverheadThreadsPercent).Set(inUseThreads);
333 }
334
335 public void SampleWorkItems(long workItemsQueued, long workItemsProcessed)
336 {
337 GetCounter(STPPerformanceCounterType.WorkItems).Set(workItemsQueued+workItemsProcessed);
338 GetCounter(STPPerformanceCounterType.WorkItemsInQueue).Set(workItemsQueued);
339 GetCounter(STPPerformanceCounterType.WorkItemsProcessed).Set(workItemsProcessed);
340
341 GetCounter(STPPerformanceCounterType.WorkItemsQueuedPerSecond).Set(workItemsQueued);
342 GetCounter(STPPerformanceCounterType.WorkItemsProcessedPerSecond).Set(workItemsProcessed);
343 }
344
345 public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime)
346 {
347 GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTime).IncrementBy((long)workItemWaitTime.TotalMilliseconds);
348 GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTimeBase).Increment();
349 }
350
351 public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime)
352 {
353 GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTime).IncrementBy((long)workItemProcessTime.TotalMilliseconds);
354 GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTimeBase).Increment();
355 }
356 }
357#endif
155 358
156 internal class STPInstancePerformanceCounter : IDisposable 359 internal class NullSTPInstancePerformanceCounters : ISTPInstancePerformanceCounters, ISTPPerformanceCountersReader
157 { 360 {
158 // Fields 361 private static readonly NullSTPInstancePerformanceCounters _instance = new NullSTPInstancePerformanceCounters();
159 private PerformanceCounter _pcs;
160 362
161 // Methods 363 public static NullSTPInstancePerformanceCounters Instance
162 protected STPInstancePerformanceCounter() 364 {
163 { 365 get { return _instance; }
164 } 366 }
165 367
166 public STPInstancePerformanceCounter( 368 public void Close() {}
167 string instance, 369 public void Dispose() {}
168 STPPerformanceCounterType spcType) 370
371 public void SampleThreads(long activeThreads, long inUseThreads) {}
372 public void SampleWorkItems(long workItemsQueued, long workItemsProcessed) {}
373 public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime) {}
374 public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime) {}
375 public long InUseThreads
169 { 376 {
170 STPPerformanceCounters counters = STPPerformanceCounters.Instance; 377 get { return 0; }
171 _pcs = new PerformanceCounter(
172 STPPerformanceCounters._stpCategoryName,
173 counters._stpPerformanceCounters[(int) spcType].Name,
174 instance,
175 false);
176 _pcs.RawValue = _pcs.RawValue;
177 } 378 }
178 379
179 ~STPInstancePerformanceCounter() 380 public long ActiveThreads
180 { 381 {
181 Close(); 382 get { return 0; }
182 } 383 }
183 384
184 public void Close() 385 public long WorkItemsQueued
185 {
186 if (_pcs != null)
187 {
188 _pcs.RemoveInstance();
189 _pcs.Close();
190 _pcs = null;
191 }
192 }
193
194 public void Dispose()
195 { 386 {
196 Close(); 387 get { return 0; }
197 GC.SuppressFinalize(this);
198 }
199
200 public virtual void Increment()
201 {
202 _pcs.Increment();
203 }
204
205 public virtual void IncrementBy(long val)
206 {
207 _pcs.IncrementBy(val);
208 } 388 }
209 389
210 public virtual void Set(long val) 390 public long WorkItemsProcessed
211 { 391 {
212 _pcs.RawValue = val; 392 get { return 0; }
213 } 393 }
214 } 394 }
215 395
216 internal class STPInstanceNullPerformanceCounter : STPInstancePerformanceCounter 396 internal class LocalSTPInstancePerformanceCounters : ISTPInstancePerformanceCounters, ISTPPerformanceCountersReader
217 { 397 {
218 // Methods 398 public void Close() { }
219 public STPInstanceNullPerformanceCounter() {} 399 public void Dispose() { }
220 public override void Increment() {}
221 public override void IncrementBy(long value) {}
222 public override void Set(long val) {}
223 }
224
225 internal interface ISTPInstancePerformanceCounters : IDisposable
226 {
227 void Close();
228 void SampleThreads(long activeThreads, long inUseThreads);
229 void SampleWorkItems(long workItemsQueued, long workItemsProcessed);
230 void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime);
231 void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime);
232 }
233 400
401 private long _activeThreads;
402 private long _inUseThreads;
403 private long _workItemsQueued;
404 private long _workItemsProcessed;
234 405
235 internal class STPInstancePerformanceCounters : ISTPInstancePerformanceCounters, IDisposable 406 public long InUseThreads
236 {
237 // Fields
238 private STPInstancePerformanceCounter[] _pcs;
239 private static STPInstancePerformanceCounter _stpInstanceNullPerformanceCounter;
240
241 // Methods
242 static STPInstancePerformanceCounters()
243 { 407 {
244 _stpInstanceNullPerformanceCounter = new STPInstanceNullPerformanceCounter(); 408 get { return _inUseThreads; }
245 }
246
247 public STPInstancePerformanceCounters(string instance)
248 {
249 _pcs = new STPInstancePerformanceCounter[(int)STPPerformanceCounterType.LastCounter];
250 // STPPerformanceCounters counters = STPPerformanceCounters.Instance;
251 for (int i = 0; i < _pcs.Length; i++)
252 {
253 if (instance != null)
254 {
255 _pcs[i] = new STPInstancePerformanceCounter(
256 instance,
257 (STPPerformanceCounterType) i);
258 }
259 else
260 {
261 _pcs[i] = _stpInstanceNullPerformanceCounter;
262 }
263 }
264 } 409 }
265
266 410
267 public void Close() 411 public long ActiveThreads
268 { 412 {
269 if (null != _pcs) 413 get { return _activeThreads; }
270 {
271 for (int i = 0; i < _pcs.Length; i++)
272 {
273 if (null != _pcs[i])
274 {
275 _pcs[i].Close();
276 }
277 }
278 _pcs = null;
279 }
280 } 414 }
281 415
282 ~STPInstancePerformanceCounters() 416 public long WorkItemsQueued
283 { 417 {
284 Close(); 418 get { return _workItemsQueued; }
285 } 419 }
286 420
287 public void Dispose() 421 public long WorkItemsProcessed
288 {
289 Close();
290 GC.SuppressFinalize(this);
291 }
292
293 private STPInstancePerformanceCounter GetCounter(STPPerformanceCounterType spcType)
294 { 422 {
295 return _pcs[(int) spcType]; 423 get { return _workItemsProcessed; }
296 } 424 }
297 425
298 public void SampleThreads(long activeThreads, long inUseThreads) 426 public void SampleThreads(long activeThreads, long inUseThreads)
299 { 427 {
300 GetCounter(STPPerformanceCounterType.ActiveThreads).Set(activeThreads); 428 _activeThreads = activeThreads;
301 GetCounter(STPPerformanceCounterType.InUseThreads).Set(inUseThreads); 429 _inUseThreads = inUseThreads;
302 GetCounter(STPPerformanceCounterType.OverheadThreads).Set(activeThreads-inUseThreads);
303
304 GetCounter(STPPerformanceCounterType.OverheadThreadsPercentBase).Set(activeThreads-inUseThreads);
305 GetCounter(STPPerformanceCounterType.OverheadThreadsPercent).Set(inUseThreads);
306 } 430 }
307 431
308 public void SampleWorkItems(long workItemsQueued, long workItemsProcessed) 432 public void SampleWorkItems(long workItemsQueued, long workItemsProcessed)
309 { 433 {
310 GetCounter(STPPerformanceCounterType.WorkItems).Set(workItemsQueued+workItemsProcessed); 434 _workItemsQueued = workItemsQueued;
311 GetCounter(STPPerformanceCounterType.WorkItemsInQueue).Set(workItemsQueued); 435 _workItemsProcessed = workItemsProcessed;
312 GetCounter(STPPerformanceCounterType.WorkItemsProcessed).Set(workItemsProcessed);
313
314 GetCounter(STPPerformanceCounterType.WorkItemsQueuedPerSecond).Set(workItemsQueued);
315 GetCounter(STPPerformanceCounterType.WorkItemsProcessedPerSecond).Set(workItemsProcessed);
316 } 436 }
317 437
318 public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime) 438 public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime)
319 { 439 {
320 GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTime).IncrementBy((long)workItemWaitTime.TotalMilliseconds); 440 // Not supported
321 GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTimeBase).Increment();
322 } 441 }
323 442
324 public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime) 443 public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime)
325 { 444 {
326 GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTime).IncrementBy((long)workItemProcessTime.TotalMilliseconds); 445 // Not supported
327 GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTimeBase).Increment();
328 }
329 }
330
331 internal class NullSTPInstancePerformanceCounters : ISTPInstancePerformanceCounters, IDisposable
332 {
333 static NullSTPInstancePerformanceCounters()
334 {
335 } 446 }
336
337 private static NullSTPInstancePerformanceCounters _instance = new NullSTPInstancePerformanceCounters(null);
338
339 public static NullSTPInstancePerformanceCounters Instance
340 {
341 get { return _instance; }
342 }
343
344 public NullSTPInstancePerformanceCounters(string instance) {}
345 public void Close() {}
346 public void Dispose() {}
347
348 public void SampleThreads(long activeThreads, long inUseThreads) {}
349 public void SampleWorkItems(long workItemsQueued, long workItemsProcessed) {}
350 public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime) {}
351 public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime) {}
352 } 447 }
353
354} 448}
diff --git a/ThirdParty/SmartThreadPool/STPStartInfo.cs b/ThirdParty/SmartThreadPool/STPStartInfo.cs
index fa9ceb4..96fa094 100644
--- a/ThirdParty/SmartThreadPool/STPStartInfo.cs
+++ b/ThirdParty/SmartThreadPool/STPStartInfo.cs
@@ -1,113 +1,212 @@
1// Ami Bar 1using System;
2// amibar@gmail.com
3
4using System.Threading; 2using System.Threading;
5 3
6namespace Amib.Threading 4namespace Amib.Threading
7{ 5{
8 /// <summary> 6 /// <summary>
9 /// Summary description for STPStartInfo. 7 /// Summary description for STPStartInfo.
10 /// </summary> 8 /// </summary>
11 public class STPStartInfo : WIGStartInfo 9 public class STPStartInfo : WIGStartInfo
12 { 10 {
13 /// <summary> 11 private int _idleTimeout = SmartThreadPool.DefaultIdleTimeout;
14 /// Idle timeout in milliseconds. 12 private int _minWorkerThreads = SmartThreadPool.DefaultMinWorkerThreads;
15 /// If a thread is idle for _idleTimeout milliseconds then 13 private int _maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
16 /// it may quit. 14#if !(WINDOWS_PHONE)
17 /// </summary> 15 private ThreadPriority _threadPriority = SmartThreadPool.DefaultThreadPriority;
18 private int _idleTimeout; 16#endif
19 17 private string _performanceCounterInstanceName = SmartThreadPool.DefaultPerformanceCounterInstanceName;
20 /// <summary> 18 private bool _areThreadsBackground = SmartThreadPool.DefaultAreThreadsBackground;
21 /// The lower limit of threads in the pool. 19 private bool _enableLocalPerformanceCounters;
22 /// </summary> 20 private string _threadPoolName = SmartThreadPool.DefaultThreadPoolName;
23 private int _minWorkerThreads; 21 private int? _maxStackSize = SmartThreadPool.DefaultMaxStackSize;
24 22
25 /// <summary> 23 public STPStartInfo()
26 /// The upper limit of threads in the pool.
27 /// </summary>
28 private int _maxWorkerThreads;
29
30 /// <summary>
31 /// The priority of the threads in the pool
32 /// </summary>
33 private ThreadPriority _threadPriority;
34
35 /// <summary>
36 /// The thread pool name. Threads will get names depending on this.
37 /// </summary>
38 private string _threadPoolName;
39
40 /// <summary>
41 /// If this field is not null then the performance counters are enabled
42 /// and use the string as the name of the instance.
43 /// </summary>
44 private string _pcInstanceName;
45
46 private int _stackSize;
47
48 public STPStartInfo() : base()
49 { 24 {
25 _performanceCounterInstanceName = SmartThreadPool.DefaultPerformanceCounterInstanceName;
26#if !(WINDOWS_PHONE)
27 _threadPriority = SmartThreadPool.DefaultThreadPriority;
28#endif
29 _maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
50 _idleTimeout = SmartThreadPool.DefaultIdleTimeout; 30 _idleTimeout = SmartThreadPool.DefaultIdleTimeout;
51 _minWorkerThreads = SmartThreadPool.DefaultMinWorkerThreads; 31 _minWorkerThreads = SmartThreadPool.DefaultMinWorkerThreads;
52 _maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
53 _threadPriority = SmartThreadPool.DefaultThreadPriority;
54 _threadPoolName = SmartThreadPool.DefaultThreadPoolName;
55 _pcInstanceName = SmartThreadPool.DefaultPerformanceCounterInstanceName;
56 _stackSize = SmartThreadPool.DefaultStackSize;
57 } 32 }
58 33
59 public STPStartInfo(STPStartInfo stpStartInfo) : base(stpStartInfo) 34 public STPStartInfo(STPStartInfo stpStartInfo)
35 : base(stpStartInfo)
60 { 36 {
61 _idleTimeout = stpStartInfo._idleTimeout; 37 _idleTimeout = stpStartInfo.IdleTimeout;
62 _minWorkerThreads = stpStartInfo._minWorkerThreads; 38 _minWorkerThreads = stpStartInfo.MinWorkerThreads;
63 _maxWorkerThreads = stpStartInfo._maxWorkerThreads; 39 _maxWorkerThreads = stpStartInfo.MaxWorkerThreads;
64 _threadPriority = stpStartInfo._threadPriority; 40#if !(WINDOWS_PHONE)
41 _threadPriority = stpStartInfo.ThreadPriority;
42#endif
43 _performanceCounterInstanceName = stpStartInfo.PerformanceCounterInstanceName;
44 _enableLocalPerformanceCounters = stpStartInfo._enableLocalPerformanceCounters;
65 _threadPoolName = stpStartInfo._threadPoolName; 45 _threadPoolName = stpStartInfo._threadPoolName;
66 _pcInstanceName = stpStartInfo._pcInstanceName; 46 _areThreadsBackground = stpStartInfo.AreThreadsBackground;
67 _stackSize = stpStartInfo._stackSize; 47#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
48 _apartmentState = stpStartInfo._apartmentState;
49#endif
68 } 50 }
69 51
70 public int IdleTimeout 52 /// <summary>
71 { 53 /// Get/Set the idle timeout in milliseconds.
72 get { return _idleTimeout; } 54 /// If a thread is idle (starved) longer than IdleTimeout then it may quit.
73 set { _idleTimeout = value; } 55 /// </summary>
56 public virtual int IdleTimeout
57 {
58 get { return _idleTimeout; }
59 set
60 {
61 ThrowIfReadOnly();
62 _idleTimeout = value;
63 }
64 }
65
66
67 /// <summary>
68 /// Get/Set the lower limit of threads in the pool.
69 /// </summary>
70 public virtual int MinWorkerThreads
71 {
72 get { return _minWorkerThreads; }
73 set
74 {
75 ThrowIfReadOnly();
76 _minWorkerThreads = value;
77 }
78 }
79
80
81 /// <summary>
82 /// Get/Set the upper limit of threads in the pool.
83 /// </summary>
84 public virtual int MaxWorkerThreads
85 {
86 get { return _maxWorkerThreads; }
87 set
88 {
89 ThrowIfReadOnly();
90 _maxWorkerThreads = value;
91 }
92 }
93
94#if !(WINDOWS_PHONE)
95 /// <summary>
96 /// Get/Set the scheduling priority of the threads in the pool.
97 /// The Os handles the scheduling.
98 /// </summary>
99 public virtual ThreadPriority ThreadPriority
100 {
101 get { return _threadPriority; }
102 set
103 {
104 ThrowIfReadOnly();
105 _threadPriority = value;
106 }
107 }
108#endif
109 /// <summary>
110 /// Get/Set the thread pool name. Threads will get names depending on this.
111 /// </summary>
112 public virtual string ThreadPoolName {
113 get { return _threadPoolName; }
114 set
115 {
116 ThrowIfReadOnly ();
117 _threadPoolName = value;
118 }
74 } 119 }
75 120
76 public int MinWorkerThreads 121 /// <summary>
77 { 122 /// Get/Set the performance counter instance name of this SmartThreadPool
78 get { return _minWorkerThreads; } 123 /// The default is null which indicate not to use performance counters at all.
79 set { _minWorkerThreads = value; } 124 /// </summary>
80 } 125 public virtual string PerformanceCounterInstanceName
126 {
127 get { return _performanceCounterInstanceName; }
128 set
129 {
130 ThrowIfReadOnly();
131 _performanceCounterInstanceName = value;
132 }
133 }
81 134
82 public int MaxWorkerThreads 135 /// <summary>
83 { 136 /// Enable/Disable the local performance counter.
84 get { return _maxWorkerThreads; } 137 /// This enables the user to get some performance information about the SmartThreadPool
85 set { _maxWorkerThreads = value; } 138 /// without using Windows performance counters. (Useful on WindowsCE, Silverlight, etc.)
86 } 139 /// The default is false.
140 /// </summary>
141 public virtual bool EnableLocalPerformanceCounters
142 {
143 get { return _enableLocalPerformanceCounters; }
144 set
145 {
146 ThrowIfReadOnly();
147 _enableLocalPerformanceCounters = value;
148 }
149 }
87 150
88 public ThreadPriority ThreadPriority 151 /// <summary>
152 /// Get/Set backgroundness of thread in thread pool.
153 /// </summary>
154 public virtual bool AreThreadsBackground
155 {
156 get { return _areThreadsBackground; }
157 set
158 {
159 ThrowIfReadOnly ();
160 _areThreadsBackground = value;
161 }
162 }
163
164 /// <summary>
165 /// Get a readonly version of this STPStartInfo.
166 /// </summary>
167 /// <returns>Returns a readonly reference to this STPStartInfo</returns>
168 public new STPStartInfo AsReadOnly()
89 { 169 {
90 get { return _threadPriority; } 170 return new STPStartInfo(this) { _readOnly = true };
91 set { _threadPriority = value; }
92 } 171 }
93 172
94 public virtual string ThreadPoolName 173#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
95 {
96 get { return _threadPoolName; }
97 set { _threadPoolName = value; }
98 }
99 174
175 private ApartmentState _apartmentState = SmartThreadPool.DefaultApartmentState;
100 176
101 public string PerformanceCounterInstanceName 177 /// <summary>
178 /// Get/Set the apartment state of threads in the thread pool
179 /// </summary>
180 public ApartmentState ApartmentState
102 { 181 {
103 get { return _pcInstanceName; } 182 get { return _apartmentState; }
104 set { _pcInstanceName = value; } 183 set
105 } 184 {
106 185 ThrowIfReadOnly();
107 public int StackSize 186 _apartmentState = value;
187 }
188 }
189
190#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
191
192 /// <summary>
193 /// Get/Set the max stack size of threads in the thread pool
194 /// </summary>
195 public int? MaxStackSize
108 { 196 {
109 get { return _stackSize; } 197 get { return _maxStackSize; }
110 set { _stackSize = value; } 198 set
199 {
200 ThrowIfReadOnly();
201 if (value.HasValue && value.Value < 0)
202 {
203 throw new ArgumentOutOfRangeException("value", "Value must be greater than 0.");
204 }
205 _maxStackSize = value;
206 }
111 } 207 }
208#endif
209
210#endif
112 } 211 }
113} 212}
diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.ThreadEntry.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.ThreadEntry.cs
new file mode 100644
index 0000000..d9502bb
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/SmartThreadPool.ThreadEntry.cs
@@ -0,0 +1,60 @@
1
2using System;
3using Amib.Threading.Internal;
4
5namespace Amib.Threading
6{
7 public partial class SmartThreadPool
8 {
9 #region ThreadEntry class
10
11 internal class ThreadEntry
12 {
13 /// <summary>
14 /// The thread creation time
15 /// The value is stored as UTC value.
16 /// </summary>
17 private readonly DateTime _creationTime;
18
19 /// <summary>
20 /// The last time this thread has been running
21 /// It is updated by IAmAlive() method
22 /// The value is stored as UTC value.
23 /// </summary>
24 private DateTime _lastAliveTime;
25
26 /// <summary>
27 /// A reference from each thread in the thread pool to its SmartThreadPool
28 /// object container.
29 /// With this variable a thread can know whatever it belongs to a
30 /// SmartThreadPool.
31 /// </summary>
32 private readonly SmartThreadPool _associatedSmartThreadPool;
33
34 /// <summary>
35 /// A reference to the current work item a thread from the thread pool
36 /// is executing.
37 /// </summary>
38 public WorkItem CurrentWorkItem { get; set; }
39
40 public ThreadEntry(SmartThreadPool stp)
41 {
42 _associatedSmartThreadPool = stp;
43 _creationTime = DateTime.UtcNow;
44 _lastAliveTime = DateTime.MinValue;
45 }
46
47 public SmartThreadPool AssociatedSmartThreadPool
48 {
49 get { return _associatedSmartThreadPool; }
50 }
51
52 public void IAmAlive()
53 {
54 _lastAliveTime = DateTime.UtcNow;
55 }
56 }
57
58 #endregion
59 }
60} \ No newline at end of file
diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.cs
index 2c061d7..a4f4ce5 100644
--- a/ThirdParty/SmartThreadPool/SmartThreadPool.cs
+++ b/ThirdParty/SmartThreadPool/SmartThreadPool.cs
@@ -1,61 +1,106 @@
1// Ami Bar 1#region Release History
2// amibar@gmail.com 2
3// 3// Smart Thread Pool
4// Smart thread pool in C#.
5// 7 Aug 2004 - Initial release 4// 7 Aug 2004 - Initial release
5//
6// 14 Sep 2004 - Bug fixes 6// 14 Sep 2004 - Bug fixes
7//
7// 15 Oct 2004 - Added new features 8// 15 Oct 2004 - Added new features
8// - Work items return result. 9// - Work items return result.
9// - Support waiting synchronization for multiple work items. 10// - Support waiting synchronization for multiple work items.
10// - Work items can be cancelled. 11// - Work items can be cancelled.
11// - Passage of the caller thread’s context to the thread in the pool. 12// - Passage of the caller thread’s context to the thread in the pool.
12// - Minimal usage of WIN32 handles. 13// - Minimal usage of WIN32 handles.
13// - Minor bug fixes. 14// - Minor bug fixes.
15//
14// 26 Dec 2004 - Changes: 16// 26 Dec 2004 - Changes:
15// - Removed static constructors. 17// - Removed static constructors.
16// - Added finalizers. 18// - Added finalizers.
17// - Changed Exceptions so they are serializable. 19// - Changed Exceptions so they are serializable.
18// - Fixed the bug in one of the SmartThreadPool constructors. 20// - Fixed the bug in one of the SmartThreadPool constructors.
19// - Changed the SmartThreadPool.WaitAll() so it will support any number of waiters. 21// - Changed the SmartThreadPool.WaitAll() so it will support any number of waiters.
20// The SmartThreadPool.WaitAny() is still limited by the .NET Framework. 22// The SmartThreadPool.WaitAny() is still limited by the .NET Framework.
21// - Added PostExecute with options on which cases to call it. 23// - Added PostExecute with options on which cases to call it.
22// - Added option to dispose of the state objects. 24// - Added option to dispose of the state objects.
23// - Added a WaitForIdle() method that waits until the work items queue is empty. 25// - Added a WaitForIdle() method that waits until the work items queue is empty.
24// - Added an STPStartInfo class for the initialization of the thread pool. 26// - Added an STPStartInfo class for the initialization of the thread pool.
25// - Changed exception handling so if a work item throws an exception it 27// - Changed exception handling so if a work item throws an exception it
26// is rethrown at GetResult(), rather then firing an UnhandledException event. 28// is rethrown at GetResult(), rather then firing an UnhandledException event.
27// Note that PostExecute exception are always ignored. 29// Note that PostExecute exception are always ignored.
30//
28// 25 Mar 2005 - Changes: 31// 25 Mar 2005 - Changes:
29// - Fixed lost of work items bug 32// - Fixed lost of work items bug
33//
30// 3 Jul 2005: Changes. 34// 3 Jul 2005: Changes.
31// - Fixed bug where Enqueue() throws an exception because PopWaiter() returned null, hardly reconstructed. 35// - Fixed bug where Enqueue() throws an exception because PopWaiter() returned null, hardly reconstructed.
36//
32// 16 Aug 2005: Changes. 37// 16 Aug 2005: Changes.
33// - Fixed bug where the InUseThreads becomes negative when canceling work items. 38// - Fixed bug where the InUseThreads becomes negative when canceling work items.
34// 39//
35// 31 Jan 2006 - Changes: 40// 31 Jan 2006 - Changes:
36// - Added work items priority 41// - Added work items priority
37// - Removed support of chained delegates in callbacks and post executes (nobody really use this) 42// - Removed support of chained delegates in callbacks and post executes (nobody really use this)
38// - Added work items groups 43// - Added work items groups
39// - Added work items groups idle event 44// - Added work items groups idle event
40// - Changed SmartThreadPool.WaitAll() behavior so when it gets empty array 45// - Changed SmartThreadPool.WaitAll() behavior so when it gets empty array
41// it returns true rather then throwing an exception. 46// it returns true rather then throwing an exception.
42// - Added option to start the STP and the WIG as suspended 47// - Added option to start the STP and the WIG as suspended
43// - Exception behavior changed, the real exception is returned by an 48// - Exception behavior changed, the real exception is returned by an
44// inner exception 49// inner exception
45// - Added option to keep the Http context of the caller thread. (Thanks to Steven T.) 50// - Added option to keep the Http context of the caller thread. (Thanks to Steven T.)
46// - Added performance counters 51// - Added performance counters
47// - Added priority to the threads in the pool 52// - Added priority to the threads in the pool
48// 53//
49// 13 Feb 2006 - Changes: 54// 13 Feb 2006 - Changes:
50// - Added a call to the dispose of the Performance Counter so 55// - Added a call to the dispose of the Performance Counter so
51// their won't be a Performance Counter leak. 56// their won't be a Performance Counter leak.
52// - Added exception catch in case the Performance Counters cannot 57// - Added exception catch in case the Performance Counters cannot
53// be created. 58// be created.
59//
60// 17 May 2008 - Changes:
61// - Changed the dispose behavior and removed the Finalizers.
62// - Enabled the change of the MaxThreads and MinThreads at run time.
63// - Enabled the change of the Concurrency of a IWorkItemsGroup at run
64// time If the IWorkItemsGroup is a SmartThreadPool then the Concurrency
65// refers to the MaxThreads.
66// - Improved the cancel behavior.
67// - Added events for thread creation and termination.
68// - Fixed the HttpContext context capture.
69// - Changed internal collections so they use generic collections
70// - Added IsIdle flag to the SmartThreadPool and IWorkItemsGroup
71// - Added support for WinCE
72// - Added support for Action<T> and Func<T>
73//
74// 07 April 2009 - Changes:
75// - Added support for Silverlight and Mono
76// - Added Join, Choice, and Pipe to SmartThreadPool.
77// - Added local performance counters (for Mono, Silverlight, and WindowsCE)
78// - Changed duration measures from DateTime.Now to Stopwatch.
79// - Queues changed from System.Collections.Queue to System.Collections.Generic.LinkedList<T>.
80//
81// 21 December 2009 - Changes:
82// - Added work item timeout (passive)
83//
84// 20 August 2012 - Changes:
85// - Added set name to threads
86// - Fixed the WorkItemsQueue.Dequeue.
87// Replaced while (!Monitor.TryEnter(this)); with lock(this) { ... }
88// - Fixed SmartThreadPool.Pipe
89// - Added IsBackground option to threads
90// - Added ApartmentState to threads
91// - Fixed thread creation when queuing many work items at the same time.
92//
93// 24 August 2012 - Changes:
94// - Enabled cancel abort after cancel. See: http://smartthreadpool.codeplex.com/discussions/345937 by alecswan
95// - Added option to set MaxStackSize of threads
96
97#endregion
54 98
55using System; 99using System;
56using System.Security; 100using System.Security;
57using System.Threading; 101using System.Threading;
58using System.Collections; 102using System.Collections;
103using System.Collections.Generic;
59using System.Diagnostics; 104using System.Diagnostics;
60using System.Runtime.CompilerServices; 105using System.Runtime.CompilerServices;
61 106
@@ -63,1210 +108,1503 @@ using Amib.Threading.Internal;
63 108
64namespace Amib.Threading 109namespace Amib.Threading
65{ 110{
66 #region SmartThreadPool class 111 #region SmartThreadPool class
67 /// <summary> 112 /// <summary>
68 /// Smart thread pool class. 113 /// Smart thread pool class.
69 /// </summary> 114 /// </summary>
70 public class SmartThreadPool : IWorkItemsGroup, IDisposable 115 public partial class SmartThreadPool : WorkItemsGroupBase, IDisposable
71 { 116 {
72 #region Default Constants 117 #region Public Default Constants
73 118
74 /// <summary> 119 /// <summary>
75 /// Default minimum number of threads the thread pool contains. (0) 120 /// Default minimum number of threads the thread pool contains. (0)
76 /// </summary> 121 /// </summary>
77 public const int DefaultMinWorkerThreads = 0; 122 public const int DefaultMinWorkerThreads = 0;
78 123
79 /// <summary> 124 /// <summary>
80 /// Default maximum number of threads the thread pool contains. (25) 125 /// Default maximum number of threads the thread pool contains. (25)
81 /// </summary> 126 /// </summary>
82 public const int DefaultMaxWorkerThreads = 25; 127 public const int DefaultMaxWorkerThreads = 25;
83 128
84 /// <summary> 129 /// <summary>
85 /// Default idle timeout in milliseconds. (One minute) 130 /// Default idle timeout in milliseconds. (One minute)
131 /// </summary>
132 public const int DefaultIdleTimeout = 60*1000; // One minute
133
134 /// <summary>
135 /// Indicate to copy the security context of the caller and then use it in the call. (false)
136 /// </summary>
137 public const bool DefaultUseCallerCallContext = false;
138
139 /// <summary>
140 /// Indicate to copy the HTTP context of the caller and then use it in the call. (false)
141 /// </summary>
142 public const bool DefaultUseCallerHttpContext = false;
143
144 /// <summary>
145 /// Indicate to dispose of the state objects if they support the IDispose interface. (false)
146 /// </summary>
147 public const bool DefaultDisposeOfStateObjects = false;
148
149 /// <summary>
150 /// The default option to run the post execute (CallToPostExecute.Always)
151 /// </summary>
152 public const CallToPostExecute DefaultCallToPostExecute = CallToPostExecute.Always;
153
154 /// <summary>
155 /// The default post execute method to run. (None)
156 /// When null it means not to call it.
157 /// </summary>
158 public static readonly PostExecuteWorkItemCallback DefaultPostExecuteWorkItemCallback;
159
160 /// <summary>
161 /// The default work item priority (WorkItemPriority.Normal)
162 /// </summary>
163 public const WorkItemPriority DefaultWorkItemPriority = WorkItemPriority.Normal;
164
165 /// <summary>
166 /// The default is to work on work items as soon as they arrive
167 /// and not to wait for the start. (false)
168 /// </summary>
169 public const bool DefaultStartSuspended = false;
170
171 /// <summary>
172 /// The default name to use for the performance counters instance. (null)
173 /// </summary>
174 public static readonly string DefaultPerformanceCounterInstanceName;
175
176#if !(WINDOWS_PHONE)
177
178 /// <summary>
179 /// The default thread priority (ThreadPriority.Normal)
180 /// </summary>
181 public const ThreadPriority DefaultThreadPriority = ThreadPriority.Normal;
182#endif
183 /// <summary>
184 /// The default thread pool name. (SmartThreadPool)
86 /// </summary> 185 /// </summary>
87 public const int DefaultIdleTimeout = 60*1000; // One minute 186 public const string DefaultThreadPoolName = "SmartThreadPool";
88 187
89 /// <summary> 188 /// <summary>
90 /// Indicate to copy the security context of the caller and then use it in the call. (false) 189 /// The default Max Stack Size. (SmartThreadPool)
91 /// </summary> 190 /// </summary>
92 public const bool DefaultUseCallerCallContext = false; 191 public static readonly int? DefaultMaxStackSize = null;
93 192
94 /// <summary> 193 /// <summary>
95 /// Indicate to copy the HTTP context of the caller and then use it in the call. (false) 194 /// The default fill state with params. (false)
195 /// It is relevant only to QueueWorkItem of Action&lt;...&gt;/Func&lt;...&gt;
96 /// </summary> 196 /// </summary>
97 public const bool DefaultUseCallerHttpContext = false; 197 public const bool DefaultFillStateWithArgs = false;
98 198
99 /// <summary> 199 /// <summary>
100 /// Indicate to dispose of the state objects if they support the IDispose interface. (false) 200 /// The default thread backgroundness. (true)
101 /// </summary> 201 /// </summary>
102 public const bool DefaultDisposeOfStateObjects = false; 202 public const bool DefaultAreThreadsBackground = true;
103 203
204#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
104 /// <summary> 205 /// <summary>
105 /// The default option to run the post execute 206 /// The default apartment state of a thread in the thread pool.
207 /// The default is ApartmentState.Unknown which means the STP will not
208 /// set the apartment of the thread. It will use the .NET default.
106 /// </summary> 209 /// </summary>
107 public const CallToPostExecute DefaultCallToPostExecute = CallToPostExecute.Always; 210 public const ApartmentState DefaultApartmentState = ApartmentState.Unknown;
211#endif
108 212
109 /// <summary> 213 #endregion
110 /// The default post execute method to run.
111 /// When null it means not to call it.
112 /// </summary>
113 public static readonly PostExecuteWorkItemCallback DefaultPostExecuteWorkItemCallback = null;
114 214
115 /// <summary> 215 #region Member Variables
116 /// The default work item priority
117 /// </summary>
118 public const WorkItemPriority DefaultWorkItemPriority = WorkItemPriority.Normal;
119 216
120 /// <summary> 217 /// <summary>
121 /// The default is to work on work items as soon as they arrive 218 /// Dictionary of all the threads in the thread pool.
122 /// and not to wait for the start. 219 /// </summary>
123 /// </summary> 220 private readonly SynchronizedDictionary<Thread, ThreadEntry> _workerThreads = new SynchronizedDictionary<Thread, ThreadEntry>();
124 public const bool DefaultStartSuspended = false;
125 221
126 /// <summary> 222 /// <summary>
127 /// The default is not to use the performance counters 223 /// Queue of work items.
128 /// </summary> 224 /// </summary>
129 public static readonly string DefaultPerformanceCounterInstanceName = null; 225 private readonly WorkItemsQueue _workItemsQueue = new WorkItemsQueue();
130 226
131 public static readonly int DefaultStackSize = 0; 227 /// <summary>
228 /// Count the work items handled.
229 /// Used by the performance counter.
230 /// </summary>
231 private int _workItemsProcessed;
132 232
133 /// <summary> 233 /// <summary>
134 /// The default thread priority 234 /// Number of threads that currently work (not idle).
135 /// </summary> 235 /// </summary>
136 public const ThreadPriority DefaultThreadPriority = ThreadPriority.Normal; 236 private int _inUseWorkerThreads;
137 237
138 /// <summary> 238 /// <summary>
139 /// The default thread pool name 239 /// Stores a copy of the original STPStartInfo.
240 /// It is used to change the MinThread and MaxThreads
140 /// </summary> 241 /// </summary>
141 public const string DefaultThreadPoolName = "SmartThreadPool"; 242 private STPStartInfo _stpStartInfo;
142 243
143 #endregion 244 /// <summary>
245 /// Total number of work items that are stored in the work items queue
246 /// plus the work items that the threads in the pool are working on.
247 /// </summary>
248 private int _currentWorkItemsCount;
144 249
145 #region Member Variables 250 /// <summary>
251 /// Signaled when the thread pool is idle, i.e. no thread is busy
252 /// and the work items queue is empty
253 /// </summary>
254 //private ManualResetEvent _isIdleWaitHandle = new ManualResetEvent(true);
255 private ManualResetEvent _isIdleWaitHandle = EventWaitHandleFactory.CreateManualResetEvent(true);
146 256
147 /// <summary> 257 /// <summary>
148 /// Contains the name of this instance of SmartThreadPool. 258 /// An event to signal all the threads to quit immediately.
149 /// Can be changed by the user. 259 /// </summary>
150 /// </summary> 260 //private ManualResetEvent _shuttingDownEvent = new ManualResetEvent(false);
151 private string _name = DefaultThreadPoolName; 261 private ManualResetEvent _shuttingDownEvent = EventWaitHandleFactory.CreateManualResetEvent(false);
152 262
153 /// <summary> 263 /// <summary>
154 /// Hashtable of all the threads in the thread pool. 264 /// A flag to indicate if the Smart Thread Pool is now suspended.
155 /// </summary> 265 /// </summary>
156 private Hashtable _workerThreads = Hashtable.Synchronized(new Hashtable()); 266 private bool _isSuspended;
157 267
158 /// <summary> 268 /// <summary>
159 /// Queue of work items. 269 /// A flag to indicate the threads to quit.
160 /// </summary> 270 /// </summary>
161 private WorkItemsQueue _workItemsQueue = new WorkItemsQueue(); 271 private bool _shutdown;
162 272
163 /// <summary> 273 /// <summary>
164 /// Count the work items handled. 274 /// Counts the threads created in the pool.
165 /// Used by the performance counter. 275 /// It is used to name the threads.
166 /// </summary> 276 /// </summary>
167 private long _workItemsProcessed = 0; 277 private int _threadCounter;
168 278
169 /// <summary> 279 /// <summary>
170 /// Number of threads that currently work (not idle). 280 /// Indicate that the SmartThreadPool has been disposed
171 /// </summary> 281 /// </summary>
172 private int _inUseWorkerThreads = 0; 282 private bool _isDisposed;
173 283
174 /// <summary> 284 /// <summary>
175 /// Start information to use. 285 /// Holds all the WorkItemsGroup instaces that have at least one
176 /// It is simpler than providing many constructors. 286 /// work item int the SmartThreadPool
177 /// </summary> 287 /// This variable is used in case of Shutdown
178 private STPStartInfo _stpStartInfo = new STPStartInfo(); 288 /// </summary>
289 private readonly SynchronizedDictionary<IWorkItemsGroup, IWorkItemsGroup> _workItemsGroups = new SynchronizedDictionary<IWorkItemsGroup, IWorkItemsGroup>();
179 290
180 /// <summary> 291 /// <summary>
181 /// Total number of work items that are stored in the work items queue 292 /// A common object for all the work items int the STP
182 /// plus the work items that the threads in the pool are working on. 293 /// so we can mark them to cancel in O(1)
183 /// </summary> 294 /// </summary>
184 private int _currentWorkItemsCount = 0; 295 private CanceledWorkItemsGroup _canceledSmartThreadPool = new CanceledWorkItemsGroup();
185 296
186 /// <summary> 297 /// <summary>
187 /// Signaled when the thread pool is idle, i.e. no thread is busy 298 /// Windows STP performance counters
188 /// and the work items queue is empty
189 /// </summary> 299 /// </summary>
190 private ManualResetEvent _isIdleWaitHandle = new ManualResetEvent(true); 300 private ISTPInstancePerformanceCounters _windowsPCs = NullSTPInstancePerformanceCounters.Instance;
191 301
192 /// <summary> 302 /// <summary>
193 /// An event to signal all the threads to quit immediately. 303 /// Local STP performance counters
194 /// </summary> 304 /// </summary>
195 private ManualResetEvent _shuttingDownEvent = new ManualResetEvent(false); 305 private ISTPInstancePerformanceCounters _localPCs = NullSTPInstancePerformanceCounters.Instance;
196 306
197 /// <summary>
198 /// A flag to indicate the threads to quit.
199 /// </summary>
200 private bool _shutdown = false;
201 307
202 /// <summary> 308#if (WINDOWS_PHONE)
203 /// Counts the threads created in the pool. 309 private static readonly Dictionary<int, ThreadEntry> _threadEntries = new Dictionary<int, ThreadEntry>();
204 /// It is used to name the threads. 310#elif (_WINDOWS_CE)
205 /// </summary> 311 private static LocalDataStoreSlot _threadEntrySlot = Thread.AllocateDataSlot();
206 private int _threadCounter = 0; 312#else
313 [ThreadStatic]
314 private static ThreadEntry _threadEntry;
207 315
208 /// <summary> 316#endif
209 /// Indicate that the SmartThreadPool has been disposed
210 /// </summary>
211 private bool _isDisposed = false;
212 317
213 /// <summary> 318 /// <summary>
214 /// Event to send that the thread pool is idle 319 /// An event to call after a thread is created, but before
320 /// it's first use.
215 /// </summary> 321 /// </summary>
216 private event EventHandler _stpIdle; 322 private event ThreadInitializationHandler _onThreadInitialization;
217 323
218 /// <summary> 324 /// <summary>
219 /// On idle event 325 /// An event to call when a thread is about to exit, after
326 /// it is no longer belong to the pool.
220 /// </summary> 327 /// </summary>
221 //private event WorkItemsGroupIdleHandler _onIdle; 328 private event ThreadTerminationHandler _onThreadTermination;
222 329
223 /// <summary> 330 #endregion
224 /// Holds all the WorkItemsGroup instaces that have at least one
225 /// work item int the SmartThreadPool
226 /// This variable is used in case of Shutdown
227 /// </summary>
228 private Hashtable _workItemsGroups = Hashtable.Synchronized(new Hashtable());
229 331
230 /// <summary> 332 #region Per thread properties
231 /// A reference from each thread in the thread pool to its SmartThreadPool
232 /// object container.
233 /// With this variable a thread can know whatever it belongs to a
234 /// SmartThreadPool.
235 /// </summary>
236 [ThreadStatic]
237 private static SmartThreadPool _smartThreadPool;
238 333
239 /// <summary> 334 /// <summary>
240 /// A reference to the current work item a thread from the thread pool 335 /// A reference to the current work item a thread from the thread pool
241 /// is executing. 336 /// is executing.
242 /// </summary> 337 /// </summary>
243 [ThreadStatic] 338 internal static ThreadEntry CurrentThreadEntry
244 private static WorkItem _currentWorkItem; 339 {
245 340#if (WINDOWS_PHONE)
246 /// <summary> 341 get
247 /// STP performance counters 342 {
248 /// </summary> 343 lock(_threadEntries)
249 private ISTPInstancePerformanceCounters _pcs = NullSTPInstancePerformanceCounters.Instance; 344 {
250 345 ThreadEntry threadEntry;
346 if (_threadEntries.TryGetValue(Thread.CurrentThread.ManagedThreadId, out threadEntry))
347 {
348 return threadEntry;
349 }
350 }
351 return null;
352 }
353 set
354 {
355 lock(_threadEntries)
356 {
357 _threadEntries[Thread.CurrentThread.ManagedThreadId] = value;
358 }
359 }
360#elif (_WINDOWS_CE)
361 get
362 {
363 //Thread.CurrentThread.ManagedThreadId
364 return Thread.GetData(_threadEntrySlot) as ThreadEntry;
365 }
366 set
367 {
368 Thread.SetData(_threadEntrySlot, value);
369 }
370#else
371 get
372 {
373 return _threadEntry;
374 }
375 set
376 {
377 _threadEntry = value;
378 }
379#endif
380 }
251 #endregion 381 #endregion
252 382
253 #region Construction and Finalization 383 #region Construction and Finalization
254 384
255 /// <summary> 385 /// <summary>
256 /// Constructor 386 /// Constructor
257 /// </summary> 387 /// </summary>
258 public SmartThreadPool() 388 public SmartThreadPool()
259 { 389 {
390 _stpStartInfo = new STPStartInfo();
260 Initialize(); 391 Initialize();
261 } 392 }
262 393
263 /// <summary> 394 /// <summary>
264 /// Constructor 395 /// Constructor
265 /// </summary> 396 /// </summary>
266 /// <param name="idleTimeout">Idle timeout in milliseconds</param> 397 /// <param name="idleTimeout">Idle timeout in milliseconds</param>
267 public SmartThreadPool(int idleTimeout) 398 public SmartThreadPool(int idleTimeout)
268 { 399 {
269 _stpStartInfo.IdleTimeout = idleTimeout; 400 _stpStartInfo = new STPStartInfo
270 Initialize(); 401 {
271 } 402 IdleTimeout = idleTimeout,
403 };
404 Initialize();
405 }
406
407 /// <summary>
408 /// Constructor
409 /// </summary>
410 /// <param name="idleTimeout">Idle timeout in milliseconds</param>
411 /// <param name="maxWorkerThreads">Upper limit of threads in the pool</param>
412 public SmartThreadPool(
413 int idleTimeout,
414 int maxWorkerThreads)
415 {
416 _stpStartInfo = new STPStartInfo
417 {
418 IdleTimeout = idleTimeout,
419 MaxWorkerThreads = maxWorkerThreads,
420 };
421 Initialize();
422 }
423
424 /// <summary>
425 /// Constructor
426 /// </summary>
427 /// <param name="idleTimeout">Idle timeout in milliseconds</param>
428 /// <param name="maxWorkerThreads">Upper limit of threads in the pool</param>
429 /// <param name="minWorkerThreads">Lower limit of threads in the pool</param>
430 public SmartThreadPool(
431 int idleTimeout,
432 int maxWorkerThreads,
433 int minWorkerThreads)
434 {
435 _stpStartInfo = new STPStartInfo
436 {
437 IdleTimeout = idleTimeout,
438 MaxWorkerThreads = maxWorkerThreads,
439 MinWorkerThreads = minWorkerThreads,
440 };
441 Initialize();
442 }
272 443
273 /// <summary> 444 /// <summary>
274 /// Constructor 445 /// Constructor
275 /// </summary> 446 /// </summary>
276 /// <param name="idleTimeout">Idle timeout in milliseconds</param> 447 /// <param name="stpStartInfo">A SmartThreadPool configuration that overrides the default behavior</param>
277 /// <param name="maxWorkerThreads">Upper limit of threads in the pool</param> 448 public SmartThreadPool(STPStartInfo stpStartInfo)
278 public SmartThreadPool( 449 {
279 int idleTimeout, 450 _stpStartInfo = new STPStartInfo(stpStartInfo);
280 int maxWorkerThreads) 451 Initialize();
281 { 452 }
282 _stpStartInfo.IdleTimeout = idleTimeout;
283 _stpStartInfo.MaxWorkerThreads = maxWorkerThreads;
284 Initialize();
285 }
286 453
287 /// <summary> 454 private void Initialize()
288 /// Constructor 455 {
289 /// </summary> 456 Name = _stpStartInfo.ThreadPoolName;
290 /// <param name="idleTimeout">Idle timeout in milliseconds</param> 457 ValidateSTPStartInfo();
291 /// <param name="maxWorkerThreads">Upper limit of threads in the pool</param>
292 /// <param name="minWorkerThreads">Lower limit of threads in the pool</param>
293 public SmartThreadPool(
294 int idleTimeout,
295 int maxWorkerThreads,
296 int minWorkerThreads)
297 {
298 _stpStartInfo.IdleTimeout = idleTimeout;
299 _stpStartInfo.MaxWorkerThreads = maxWorkerThreads;
300 _stpStartInfo.MinWorkerThreads = minWorkerThreads;
301 Initialize();
302 }
303 458
304 /// <summary> 459 // _stpStartInfoRW stores a read/write copy of the STPStartInfo.
305 /// Constructor 460 // Actually only MaxWorkerThreads and MinWorkerThreads are overwritten
306 /// </summary>
307 public SmartThreadPool(STPStartInfo stpStartInfo)
308 {
309 _stpStartInfo = new STPStartInfo(stpStartInfo);
310 Initialize();
311 }
312 461
313 private void Initialize() 462 _isSuspended = _stpStartInfo.StartSuspended;
314 {
315 Name = _stpStartInfo.ThreadPoolName;
316 ValidateSTPStartInfo();
317 463
464#if (_WINDOWS_CE) || (_SILVERLIGHT) || (_MONO) || (WINDOWS_PHONE)
465 if (null != _stpStartInfo.PerformanceCounterInstanceName)
466 {
467 throw new NotSupportedException("Performance counters are not implemented for Compact Framework/Silverlight/Mono, instead use StpStartInfo.EnableLocalPerformanceCounters");
468 }
469#else
318 if (null != _stpStartInfo.PerformanceCounterInstanceName) 470 if (null != _stpStartInfo.PerformanceCounterInstanceName)
319 { 471 {
320 try 472 try
321 { 473 {
322 _pcs = new STPInstancePerformanceCounters(_stpStartInfo.PerformanceCounterInstanceName); 474 _windowsPCs = new STPInstancePerformanceCounters(_stpStartInfo.PerformanceCounterInstanceName);
323 } 475 }
324 catch(Exception e) 476 catch (Exception e)
325 { 477 {
326 Debug.WriteLine("Unable to create Performance Counters: " + e.ToString()); 478 Debug.WriteLine("Unable to create Performance Counters: " + e);
327 _pcs = NullSTPInstancePerformanceCounters.Instance; 479 _windowsPCs = NullSTPInstancePerformanceCounters.Instance;
328 } 480 }
329 } 481 }
482#endif
330 483
331 StartOptimalNumberOfThreads(); 484 if (_stpStartInfo.EnableLocalPerformanceCounters)
332 }
333
334 private void StartOptimalNumberOfThreads()
335 {
336 int threadsCount = Math.Max(_workItemsQueue.Count, _stpStartInfo.MinWorkerThreads);
337 threadsCount = Math.Min(threadsCount, _stpStartInfo.MaxWorkerThreads);
338 StartThreads(threadsCount);
339 }
340
341 private void ValidateSTPStartInfo()
342 {
343 if (_stpStartInfo.MinWorkerThreads < 0)
344 {
345 throw new ArgumentOutOfRangeException(
346 "MinWorkerThreads", "MinWorkerThreads cannot be negative");
347 }
348
349 if (_stpStartInfo.MaxWorkerThreads <= 0)
350 { 485 {
351 throw new ArgumentOutOfRangeException( 486 _localPCs = new LocalSTPInstancePerformanceCounters();
352 "MaxWorkerThreads", "MaxWorkerThreads must be greater than zero");
353 } 487 }
354 488
355 if (_stpStartInfo.MinWorkerThreads > _stpStartInfo.MaxWorkerThreads) 489 // If the STP is not started suspended then start the threads.
490 if (!_isSuspended)
356 { 491 {
357 throw new ArgumentOutOfRangeException( 492 StartOptimalNumberOfThreads();
358 "MinWorkerThreads, maxWorkerThreads",
359 "MaxWorkerThreads must be greater or equal to MinWorkerThreads");
360 } 493 }
361 } 494 }
362 495
363 private void ValidateCallback(Delegate callback) 496 private void StartOptimalNumberOfThreads()
364 { 497 {
365 if(callback.GetInvocationList().Length > 1) 498 int threadsCount = Math.Max(_workItemsQueue.Count, _stpStartInfo.MinWorkerThreads);
499 threadsCount = Math.Min(threadsCount, _stpStartInfo.MaxWorkerThreads);
500 threadsCount -= _workerThreads.Count;
501 if (threadsCount > 0)
366 { 502 {
367 throw new NotSupportedException("SmartThreadPool doesn't support delegates chains"); 503 StartThreads(threadsCount);
368 } 504 }
369 } 505 }
370 506
371 #endregion 507 private void ValidateSTPStartInfo()
508 {
509 if (_stpStartInfo.MinWorkerThreads < 0)
510 {
511 throw new ArgumentOutOfRangeException(
512 "MinWorkerThreads", "MinWorkerThreads cannot be negative");
513 }
372 514
373 #region Thread Processing 515 if (_stpStartInfo.MaxWorkerThreads <= 0)
516 {
517 throw new ArgumentOutOfRangeException(
518 "MaxWorkerThreads", "MaxWorkerThreads must be greater than zero");
519 }
374 520
375 /// <summary> 521 if (_stpStartInfo.MinWorkerThreads > _stpStartInfo.MaxWorkerThreads)
376 /// Waits on the queue for a work item, shutdown, or timeout. 522 {
377 /// </summary> 523 throw new ArgumentOutOfRangeException(
378 /// <returns> 524 "MinWorkerThreads, maxWorkerThreads",
379 /// Returns the WaitingCallback or null in case of timeout or shutdown. 525 "MaxWorkerThreads must be greater or equal to MinWorkerThreads");
380 /// </returns> 526 }
381 private WorkItem Dequeue() 527 }
382 { 528
383 WorkItem workItem = 529 private static void ValidateCallback(Delegate callback)
530 {
531 if(callback.GetInvocationList().Length > 1)
532 {
533 throw new NotSupportedException("SmartThreadPool doesn't support delegates chains");
534 }
535 }
536
537 #endregion
538
539 #region Thread Processing
540
541 /// <summary>
542 /// Waits on the queue for a work item, shutdown, or timeout.
543 /// </summary>
544 /// <returns>
545 /// Returns the WaitingCallback or null in case of timeout or shutdown.
546 /// </returns>
547 private WorkItem Dequeue()
548 {
549 WorkItem workItem =
384 _workItemsQueue.DequeueWorkItem(_stpStartInfo.IdleTimeout, _shuttingDownEvent); 550 _workItemsQueue.DequeueWorkItem(_stpStartInfo.IdleTimeout, _shuttingDownEvent);
385 551
386 return workItem; 552 return workItem;
387 } 553 }
388 554
389 /// <summary> 555 /// <summary>
390 /// Put a new work item in the queue 556 /// Put a new work item in the queue
391 /// </summary> 557 /// </summary>
392 /// <param name="workItem">A work item to queue</param> 558 /// <param name="workItem">A work item to queue</param>
393 private void Enqueue(WorkItem workItem) 559 internal override void Enqueue(WorkItem workItem)
394 { 560 {
395 Enqueue(workItem, true); 561 // Make sure the workItem is not null
396 } 562 Debug.Assert(null != workItem);
397 563
398 /// <summary> 564 IncrementWorkItemsCount();
399 /// Put a new work item in the queue 565
400 /// </summary> 566 workItem.CanceledSmartThreadPool = _canceledSmartThreadPool;
401 /// <param name="workItem">A work item to queue</param> 567 _workItemsQueue.EnqueueWorkItem(workItem);
402 internal void Enqueue(WorkItem workItem, bool incrementWorkItems) 568 workItem.WorkItemIsQueued();
403 { 569
404 // Make sure the workItem is not null 570 // If all the threads are busy then try to create a new one
405 Debug.Assert(null != workItem); 571 if (_currentWorkItemsCount > _workerThreads.Count)
406 572 {
407 if (incrementWorkItems) 573 StartThreads(1);
408 { 574 }
409 IncrementWorkItemsCount(); 575 }
410 } 576
411 577 private void IncrementWorkItemsCount()
412 _workItemsQueue.EnqueueWorkItem(workItem); 578 {
413 workItem.WorkItemIsQueued(); 579 _windowsPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
414 580 _localPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
415 // If all the threads are busy then try to create a new one 581
416 if ((InUseThreads + WaitingCallbacks) > _workerThreads.Count) 582 int count = Interlocked.Increment(ref _currentWorkItemsCount);
417 { 583 //Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString());
418 StartThreads(1); 584 if (count == 1)
419 } 585 {
420 } 586 IsIdle = false;
421
422 private void IncrementWorkItemsCount()
423 {
424 _pcs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
425
426 int count = Interlocked.Increment(ref _currentWorkItemsCount);
427 //Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString());
428 if (count == 1)
429 {
430 //Trace.WriteLine("STP is NOT idle");
431 _isIdleWaitHandle.Reset(); 587 _isIdleWaitHandle.Reset();
432 } 588 }
433 } 589 }
434
435 private void DecrementWorkItemsCount()
436 {
437 ++_workItemsProcessed;
438
439 // The counter counts even if the work item was cancelled
440 _pcs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
441 590
591 private void DecrementWorkItemsCount()
592 {
442 int count = Interlocked.Decrement(ref _currentWorkItemsCount); 593 int count = Interlocked.Decrement(ref _currentWorkItemsCount);
443 //Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString()); 594 //Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString());
444 if (count == 0) 595 if (count == 0)
445 { 596 {
446 //Trace.WriteLine("STP is idle"); 597 IsIdle = true;
447 _isIdleWaitHandle.Set(); 598 _isIdleWaitHandle.Set();
448 } 599 }
449 }
450 600
451 internal void RegisterWorkItemsGroup(IWorkItemsGroup workItemsGroup) 601 Interlocked.Increment(ref _workItemsProcessed);
452 {
453 _workItemsGroups[workItemsGroup] = workItemsGroup;
454 }
455
456 internal void UnregisterWorkItemsGroup(IWorkItemsGroup workItemsGroup)
457 {
458 if (_workItemsGroups.Contains(workItemsGroup))
459 {
460 _workItemsGroups.Remove(workItemsGroup);
461 }
462 }
463 602
464 /// <summary> 603 if (!_shutdown)
465 /// Inform that the current thread is about to quit or quiting.
466 /// The same thread may call this method more than once.
467 /// </summary>
468 private void InformCompleted()
469 {
470 // There is no need to lock the two methods together
471 // since only the current thread removes itself
472 // and the _workerThreads is a synchronized hashtable
473 if (_workerThreads.Contains(Thread.CurrentThread))
474 { 604 {
475 _workerThreads.Remove(Thread.CurrentThread); 605 // The counter counts even if the work item was cancelled
476 _pcs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads); 606 _windowsPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
607 _localPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
477 } 608 }
478 }
479 609
480 /// <summary> 610 }
481 /// Starts new threads 611
482 /// </summary> 612 internal void RegisterWorkItemsGroup(IWorkItemsGroup workItemsGroup)
483 /// <param name="threadsCount">The number of threads to start</param> 613 {
484 private void StartThreads(int threadsCount) 614 _workItemsGroups[workItemsGroup] = workItemsGroup;
485 { 615 }
486 if (_stpStartInfo.StartSuspended) 616
487 { 617 internal void UnregisterWorkItemsGroup(IWorkItemsGroup workItemsGroup)
488 return; 618 {
489 } 619 if (_workItemsGroups.Contains(workItemsGroup))
620 {
621 _workItemsGroups.Remove(workItemsGroup);
622 }
623 }
624
625 /// <summary>
626 /// Inform that the current thread is about to quit or quiting.
627 /// The same thread may call this method more than once.
628 /// </summary>
629 private void InformCompleted()
630 {
631 // There is no need to lock the two methods together
632 // since only the current thread removes itself
633 // and the _workerThreads is a synchronized dictionary
634 if (_workerThreads.Contains(Thread.CurrentThread))
635 {
636 _workerThreads.Remove(Thread.CurrentThread);
637 _windowsPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
638 _localPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
639 }
640 }
641
642 /// <summary>
643 /// Starts new threads
644 /// </summary>
645 /// <param name="threadsCount">The number of threads to start</param>
646 private void StartThreads(int threadsCount)
647 {
648 if (_isSuspended)
649 {
650 return;
651 }
652
653 lock(_workerThreads.SyncRoot)
654 {
655 // Don't start threads on shut down
656 if (_shutdown)
657 {
658 return;
659 }
660
661 for(int i = 0; i < threadsCount; ++i)
662 {
663 // Don't create more threads then the upper limit
664 if (_workerThreads.Count >= _stpStartInfo.MaxWorkerThreads)
665 {
666 return;
667 }
490 668
491 lock(_workerThreads.SyncRoot) 669 // Create a new thread
492 {
493 // Don't start threads on shut down
494 if (_shutdown)
495 {
496 return;
497 }
498 670
499 for(int i = 0; i < threadsCount; ++i) 671#if (_SILVERLIGHT) || (WINDOWS_PHONE)
500 { 672 Thread workerThread = new Thread(ProcessQueuedItems);
501 // Don't create more threads then the upper limit 673#else
502 if (_workerThreads.Count >= _stpStartInfo.MaxWorkerThreads) 674 Thread workerThread =
675 _stpStartInfo.MaxStackSize.HasValue
676 ? new Thread(ProcessQueuedItems, _stpStartInfo.MaxStackSize.Value)
677 : new Thread(ProcessQueuedItems);
678#endif
679 // Configure the new thread and start it
680 workerThread.Name = "STP " + Name + " Thread #" + _threadCounter;
681 workerThread.IsBackground = _stpStartInfo.AreThreadsBackground;
682
683#if !(_SILVERLIGHT) && !(_WINDOWS_CE) && !(WINDOWS_PHONE)
684 if (_stpStartInfo.ApartmentState != ApartmentState.Unknown)
503 { 685 {
504 return; 686 workerThread.SetApartmentState(_stpStartInfo.ApartmentState);
505 } 687 }
688#endif
506 689
507 // Create a new thread 690#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
508 Thread workerThread;
509 if (_stpStartInfo.StackSize > 0)
510 workerThread = new Thread(ProcessQueuedItems, _stpStartInfo.StackSize);
511 else
512 workerThread = new Thread(ProcessQueuedItems);
513
514 // Configure the new thread and start it
515 workerThread.Name = "STP " + Name + " Thread #" + _threadCounter;
516 workerThread.IsBackground = true;
517 workerThread.Priority = _stpStartInfo.ThreadPriority; 691 workerThread.Priority = _stpStartInfo.ThreadPriority;
692#endif
518 workerThread.Start(); 693 workerThread.Start();
519 ++_threadCounter; 694 ++_threadCounter;
520 695
521 // Add the new thread to the hashtable and update its creation 696 // Add it to the dictionary and update its creation time.
522 // time. 697 _workerThreads[workerThread] = new ThreadEntry(this);
523 _workerThreads[workerThread] = DateTime.Now; 698
524 _pcs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads); 699 _windowsPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
525 } 700 _localPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
526 } 701 }
527 } 702 }
528 703 }
529 /// <summary> 704
530 /// A worker thread method that processes work items from the work items queue. 705 /// <summary>
531 /// </summary> 706 /// A worker thread method that processes work items from the work items queue.
532 private void ProcessQueuedItems() 707 /// </summary>
533 { 708 private void ProcessQueuedItems()
534 // Initialize the _smartThreadPool variable 709 {
535 _smartThreadPool = this; 710 // Keep the entry of the dictionary as thread's variable to avoid the synchronization locks
536 711 // of the dictionary.
537 try 712 CurrentThreadEntry = _workerThreads[Thread.CurrentThread];
538 { 713
539 bool bInUseWorkerThreadsWasIncremented = false; 714 FireOnThreadInitialization();
540 715
541 // Process until shutdown. 716 try
542 while(!_shutdown) 717 {
543 { 718 bool bInUseWorkerThreadsWasIncremented = false;
544 719
545 // Wait for a work item, shutdown, or timeout 720 // Process until shutdown.
546 WorkItem workItem = Dequeue(); 721 while(!_shutdown)
547 722 {
548 // On timeout or shut down. 723 // Update the last time this thread was seen alive.
549 if (null == workItem) 724 // It's good for debugging.
725 CurrentThreadEntry.IAmAlive();
726
727 // The following block handles the when the MaxWorkerThreads has been
728 // incremented by the user at run-time.
729 // Double lock for quit.
730 if (_workerThreads.Count > _stpStartInfo.MaxWorkerThreads)
550 { 731 {
551 // Double lock for quit. 732 lock (_workerThreads.SyncRoot)
552 if (_workerThreads.Count > _stpStartInfo.MinWorkerThreads)
553 { 733 {
554 lock(_workerThreads.SyncRoot) 734 if (_workerThreads.Count > _stpStartInfo.MaxWorkerThreads)
555 { 735 {
556 // Update the last time this thread was seen alive. 736 // Inform that the thread is quiting and then quit.
557 // It's good for debugging. 737 // This method must be called within this lock or else
558 _workerThreads[Thread.CurrentThread] = DateTime.Now; 738 // more threads will quit and the thread pool will go
559 739 // below the lower limit.
560 if (_workerThreads.Count > _stpStartInfo.MinWorkerThreads) 740 InformCompleted();
561 { 741 break;
562 // Inform that the thread is quiting and then quit.
563 // This method must be called within this lock or else
564 // more threads will quit and the thread pool will go
565 // below the lower limit.
566 InformCompleted();
567 break;
568 }
569 } 742 }
570 } 743 }
571 } 744 }
572 745
573 // If we didn't quit then skip to the next iteration. 746 // Wait for a work item, shutdown, or timeout
574 if (null == workItem) 747 WorkItem workItem = Dequeue();
575 {
576 continue;
577 }
578
579 try
580 {
581 // Initialize the value to false
582 bInUseWorkerThreadsWasIncremented = false;
583
584 // Change the state of the work item to 'in progress' if possible.
585 // We do it here so if the work item has been canceled we won't
586 // increment the _inUseWorkerThreads.
587 // The cancel mechanism doesn't delete items from the queue,
588 // it marks the work item as canceled, and when the work item
589 // is dequeued, we just skip it.
590 // If the post execute of work item is set to always or to
591 // call when the work item is canceled then the StartingWorkItem()
592 // will return true, so the post execute can run.
593 if (!workItem.StartingWorkItem())
594 {
595 continue;
596 }
597 748
598 // Execute the callback. Make sure to accurately 749 // Update the last time this thread was seen alive.
599 // record how many callbacks are currently executing. 750 // It's good for debugging.
600 int inUseWorkerThreads = Interlocked.Increment(ref _inUseWorkerThreads); 751 CurrentThreadEntry.IAmAlive();
601 _pcs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
602 752
603 // Mark that the _inUseWorkerThreads incremented, so in the finally{} 753 // On timeout or shut down.
604 // statement we will decrement it correctly. 754 if (null == workItem)
605 bInUseWorkerThreadsWasIncremented = true; 755 {
606 756 // Double lock for quit.
607 // Set the _currentWorkItem to the current work item 757 if (_workerThreads.Count > _stpStartInfo.MinWorkerThreads)
608 _currentWorkItem = workItem; 758 {
609 759 lock(_workerThreads.SyncRoot)
610 lock(workItem) 760 {
611 { 761 if (_workerThreads.Count > _stpStartInfo.MinWorkerThreads)
612 workItem.currentThread = Thread.CurrentThread; 762 {
613 } 763 // Inform that the thread is quiting and then quit.
614 764 // This method must be called within this lock or else
615 ExecuteWorkItem(workItem); 765 // more threads will quit and the thread pool will go
616 766 // below the lower limit.
617 lock(workItem) 767 InformCompleted();
618 { 768 break;
619 workItem.currentThread = null; 769 }
620 } 770 }
621 771 }
622 } 772 }
623 catch(ThreadAbortException ex) 773
624 { 774 // If we didn't quit then skip to the next iteration.
625 lock(workItem) 775 if (null == workItem)
626 { 776 {
627 workItem.currentThread = null; 777 continue;
628 } 778 }
629 ex.GetHashCode(); 779
630 Thread.ResetAbort(); 780 try
631 } 781 {
632 catch(Exception ex) 782 // Initialize the value to false
633 { 783 bInUseWorkerThreadsWasIncremented = false;
784
785 // Set the Current Work Item of the thread.
786 // Store the Current Work Item before the workItem.StartingWorkItem() is called,
787 // so WorkItem.Cancel can work when the work item is between InQueue and InProgress
788 // states.
789 // If the work item has been cancelled BEFORE the workItem.StartingWorkItem()
790 // (work item is in InQueue state) then workItem.StartingWorkItem() will return false.
791 // If the work item has been cancelled AFTER the workItem.StartingWorkItem() then
792 // (work item is in InProgress state) then the thread will be aborted
793 CurrentThreadEntry.CurrentWorkItem = workItem;
794
795 // Change the state of the work item to 'in progress' if possible.
796 // We do it here so if the work item has been canceled we won't
797 // increment the _inUseWorkerThreads.
798 // The cancel mechanism doesn't delete items from the queue,
799 // it marks the work item as canceled, and when the work item
800 // is dequeued, we just skip it.
801 // If the post execute of work item is set to always or to
802 // call when the work item is canceled then the StartingWorkItem()
803 // will return true, so the post execute can run.
804 if (!workItem.StartingWorkItem())
805 {
806 continue;
807 }
808
809 // Execute the callback. Make sure to accurately
810 // record how many callbacks are currently executing.
811 int inUseWorkerThreads = Interlocked.Increment(ref _inUseWorkerThreads);
812 _windowsPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
813 _localPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
814
815 // Mark that the _inUseWorkerThreads incremented, so in the finally{}
816 // statement we will decrement it correctly.
817 bInUseWorkerThreadsWasIncremented = true;
818
819 workItem.FireWorkItemStarted();
820
821 ExecuteWorkItem(workItem);
822 }
823 catch(Exception ex)
824 {
634 ex.GetHashCode(); 825 ex.GetHashCode();
635 // Do nothing 826 // Do nothing
636 } 827 }
637 finally 828 finally
638 { 829 {
639 lock(workItem) 830 workItem.DisposeOfState();
640 { 831
641 workItem.currentThread = null; 832 // Set the CurrentWorkItem to null, since we
642 } 833 // no longer run user's code.
643 834 CurrentThreadEntry.CurrentWorkItem = null;
644 if (null != workItem) 835
645 { 836 // Decrement the _inUseWorkerThreads only if we had
646 workItem.DisposeOfState(); 837 // incremented it. Note the cancelled work items don't
647 } 838 // increment _inUseWorkerThreads.
648 839 if (bInUseWorkerThreadsWasIncremented)
649 // Set the _currentWorkItem to null, since we 840 {
650 // no longer run user's code. 841 int inUseWorkerThreads = Interlocked.Decrement(ref _inUseWorkerThreads);
651 _currentWorkItem = null; 842 _windowsPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
652 843 _localPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
653 // Decrement the _inUseWorkerThreads only if we had 844 }
654 // incremented it. Note the cancelled work items don't 845
655 // increment _inUseWorkerThreads. 846 // Notify that the work item has been completed.
656 if (bInUseWorkerThreadsWasIncremented) 847 // WorkItemsGroup may enqueue their next work item.
657 { 848 workItem.FireWorkItemCompleted();
658 int inUseWorkerThreads = Interlocked.Decrement(ref _inUseWorkerThreads); 849
659 _pcs.SampleThreads(_workerThreads.Count, inUseWorkerThreads); 850 // Decrement the number of work items here so the idle
660 } 851 // ManualResetEvent won't fluctuate.
661 852 DecrementWorkItemsCount();
662 // Notify that the work item has been completed. 853 }
663 // WorkItemsGroup may enqueue their next work item. 854 }
664 workItem.FireWorkItemCompleted(); 855 }
665 856 catch(ThreadAbortException tae)
666 // Decrement the number of work items here so the idle 857 {
667 // ManualResetEvent won't fluctuate.
668 DecrementWorkItemsCount();
669 }
670 }
671 }
672 catch(ThreadAbortException tae)
673 {
674 tae.GetHashCode(); 858 tae.GetHashCode();
675 // Handle the abort exception gracfully. 859 // Handle the abort exception gracfully.
676 Thread.ResetAbort(); 860#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
677 } 861 Thread.ResetAbort();
678 catch(Exception e) 862#endif
679 {
680 Debug.Assert(null != e);
681 }
682 finally
683 {
684 InformCompleted();
685 }
686 }
687
688 private void ExecuteWorkItem(WorkItem workItem)
689 {
690 _pcs.SampleWorkItemsWaitTime(workItem.WaitingTime);
691 try
692 {
693 workItem.Execute();
694 }
695 catch
696 {
697 throw;
698 } 863 }
699 finally 864 catch(Exception e)
865 {
866 Debug.Assert(null != e);
867 }
868 finally
869 {
870 InformCompleted();
871 FireOnThreadTermination();
872 }
873 }
874
875 private void ExecuteWorkItem(WorkItem workItem)
876 {
877 _windowsPCs.SampleWorkItemsWaitTime(workItem.WaitingTime);
878 _localPCs.SampleWorkItemsWaitTime(workItem.WaitingTime);
879 try
880 {
881 workItem.Execute();
882 }
883 finally
884 {
885 _windowsPCs.SampleWorkItemsProcessTime(workItem.ProcessTime);
886 _localPCs.SampleWorkItemsProcessTime(workItem.ProcessTime);
887 }
888 }
889
890
891 #endregion
892
893 #region Public Methods
894
895 private void ValidateWaitForIdle()
896 {
897 if (null != CurrentThreadEntry && CurrentThreadEntry.AssociatedSmartThreadPool == this)
898 {
899 throw new NotSupportedException(
900 "WaitForIdle cannot be called from a thread on its SmartThreadPool, it causes a deadlock");
901 }
902 }
903
904 internal static void ValidateWorkItemsGroupWaitForIdle(IWorkItemsGroup workItemsGroup)
905 {
906 if (null == CurrentThreadEntry)
700 { 907 {
701 _pcs.SampleWorkItemsProcessTime(workItem.ProcessTime); 908 return;
702 } 909 }
703 }
704
705
706 #endregion
707 910
708 #region Public Methods 911 WorkItem workItem = CurrentThreadEntry.CurrentWorkItem;
709 912 ValidateWorkItemsGroupWaitForIdleImpl(workItemsGroup, workItem);
710 /// <summary> 913 if ((null != workItemsGroup) &&
711 /// Queue a work item 914 (null != workItem) &&
915 CurrentThreadEntry.CurrentWorkItem.WasQueuedBy(workItemsGroup))
916 {
917 throw new NotSupportedException("WaitForIdle cannot be called from a thread on its SmartThreadPool, it causes a deadlock");
918 }
919 }
920
921 [MethodImpl(MethodImplOptions.NoInlining)]
922 private static void ValidateWorkItemsGroupWaitForIdleImpl(IWorkItemsGroup workItemsGroup, WorkItem workItem)
923 {
924 if ((null != workItemsGroup) &&
925 (null != workItem) &&
926 workItem.WasQueuedBy(workItemsGroup))
927 {
928 throw new NotSupportedException("WaitForIdle cannot be called from a thread on its SmartThreadPool, it causes a deadlock");
929 }
930 }
931
932 /// <summary>
933 /// Force the SmartThreadPool to shutdown
934 /// </summary>
935 public void Shutdown()
936 {
937 Shutdown(true, 0);
938 }
939
940 /// <summary>
941 /// Force the SmartThreadPool to shutdown with timeout
712 /// </summary> 942 /// </summary>
713 /// <param name="callback">A callback to execute</param> 943 public void Shutdown(bool forceAbort, TimeSpan timeout)
714 /// <returns>Returns a work item result</returns> 944 {
715 public IWorkItemResult QueueWorkItem(WorkItemCallback callback) 945 Shutdown(forceAbort, (int)timeout.TotalMilliseconds);
716 { 946 }
717 ValidateNotDisposed(); 947
718 ValidateCallback(callback); 948 /// <summary>
719 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback); 949 /// Empties the queue of work items and abort the threads in the pool.
720 Enqueue(workItem); 950 /// </summary>
721 return workItem.GetWorkItemResult(); 951 public void Shutdown(bool forceAbort, int millisecondsTimeout)
722 } 952 {
953 ValidateNotDisposed();
954
955 ISTPInstancePerformanceCounters pcs = _windowsPCs;
956
957 if (NullSTPInstancePerformanceCounters.Instance != _windowsPCs)
958 {
959 // Set the _pcs to "null" to stop updating the performance
960 // counters
961 _windowsPCs = NullSTPInstancePerformanceCounters.Instance;
962
963 pcs.Dispose();
964 }
965
966 Thread [] threads;
967 lock(_workerThreads.SyncRoot)
968 {
969 // Shutdown the work items queue
970 _workItemsQueue.Dispose();
971
972 // Signal the threads to exit
973 _shutdown = true;
974 _shuttingDownEvent.Set();
975
976 // Make a copy of the threads' references in the pool
977 threads = new Thread [_workerThreads.Count];
978 _workerThreads.Keys.CopyTo(threads, 0);
979 }
980
981 int millisecondsLeft = millisecondsTimeout;
982 Stopwatch stopwatch = Stopwatch.StartNew();
983 //DateTime start = DateTime.UtcNow;
984 bool waitInfinitely = (Timeout.Infinite == millisecondsTimeout);
985 bool timeout = false;
986
987 // Each iteration we update the time left for the timeout.
988 foreach(Thread thread in threads)
989 {
990 // Join don't work with negative numbers
991 if (!waitInfinitely && (millisecondsLeft < 0))
992 {
993 timeout = true;
994 break;
995 }
996
997 // Wait for the thread to terminate
998 bool success = thread.Join(millisecondsLeft);
999 if(!success)
1000 {
1001 timeout = true;
1002 break;
1003 }
1004
1005 if(!waitInfinitely)
1006 {
1007 // Update the time left to wait
1008 //TimeSpan ts = DateTime.UtcNow - start;
1009 millisecondsLeft = millisecondsTimeout - (int)stopwatch.ElapsedMilliseconds;
1010 }
1011 }
1012
1013 if (timeout && forceAbort)
1014 {
1015 // Abort the threads in the pool
1016 foreach(Thread thread in threads)
1017 {
1018
1019 if ((thread != null)
1020#if !(_WINDOWS_CE)
1021 && thread.IsAlive
1022#endif
1023 )
1024 {
1025 try
1026 {
1027 thread.Abort(); // Shutdown
1028 }
1029 catch(SecurityException e)
1030 {
1031 e.GetHashCode();
1032 }
1033 catch(ThreadStateException ex)
1034 {
1035 ex.GetHashCode();
1036 // In case the thread has been terminated
1037 // after the check if it is alive.
1038 }
1039 }
1040 }
1041 }
1042 }
1043
1044 /// <summary>
1045 /// Wait for all work items to complete
1046 /// </summary>
1047 /// <param name="waitableResults">Array of work item result objects</param>
1048 /// <returns>
1049 /// true when every work item in workItemResults has completed; otherwise false.
1050 /// </returns>
1051 public static bool WaitAll(
1052 IWaitableResult [] waitableResults)
1053 {
1054 return WaitAll(waitableResults, Timeout.Infinite, true);
1055 }
1056
1057 /// <summary>
1058 /// Wait for all work items to complete
1059 /// </summary>
1060 /// <param name="waitableResults">Array of work item result objects</param>
1061 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param>
1062 /// <param name="exitContext">
1063 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1064 /// </param>
1065 /// <returns>
1066 /// true when every work item in workItemResults has completed; otherwise false.
1067 /// </returns>
1068 public static bool WaitAll(
1069 IWaitableResult [] waitableResults,
1070 TimeSpan timeout,
1071 bool exitContext)
1072 {
1073 return WaitAll(waitableResults, (int)timeout.TotalMilliseconds, exitContext);
1074 }
1075
1076 /// <summary>
1077 /// Wait for all work items to complete
1078 /// </summary>
1079 /// <param name="waitableResults">Array of work item result objects</param>
1080 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param>
1081 /// <param name="exitContext">
1082 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1083 /// </param>
1084 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1085 /// <returns>
1086 /// true when every work item in workItemResults has completed; otherwise false.
1087 /// </returns>
1088 public static bool WaitAll(
1089 IWaitableResult[] waitableResults,
1090 TimeSpan timeout,
1091 bool exitContext,
1092 WaitHandle cancelWaitHandle)
1093 {
1094 return WaitAll(waitableResults, (int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle);
1095 }
1096
1097 /// <summary>
1098 /// Wait for all work items to complete
1099 /// </summary>
1100 /// <param name="waitableResults">Array of work item result objects</param>
1101 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1102 /// <param name="exitContext">
1103 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1104 /// </param>
1105 /// <returns>
1106 /// true when every work item in workItemResults has completed; otherwise false.
1107 /// </returns>
1108 public static bool WaitAll(
1109 IWaitableResult [] waitableResults,
1110 int millisecondsTimeout,
1111 bool exitContext)
1112 {
1113 return WorkItem.WaitAll(waitableResults, millisecondsTimeout, exitContext, null);
1114 }
1115
1116 /// <summary>
1117 /// Wait for all work items to complete
1118 /// </summary>
1119 /// <param name="waitableResults">Array of work item result objects</param>
1120 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1121 /// <param name="exitContext">
1122 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1123 /// </param>
1124 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1125 /// <returns>
1126 /// true when every work item in workItemResults has completed; otherwise false.
1127 /// </returns>
1128 public static bool WaitAll(
1129 IWaitableResult[] waitableResults,
1130 int millisecondsTimeout,
1131 bool exitContext,
1132 WaitHandle cancelWaitHandle)
1133 {
1134 return WorkItem.WaitAll(waitableResults, millisecondsTimeout, exitContext, cancelWaitHandle);
1135 }
1136
1137
1138 /// <summary>
1139 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1140 /// </summary>
1141 /// <param name="waitableResults">Array of work item result objects</param>
1142 /// <returns>
1143 /// The array index of the work item result that satisfied the wait, or WaitTimeout if any of the work items has been canceled.
1144 /// </returns>
1145 public static int WaitAny(
1146 IWaitableResult [] waitableResults)
1147 {
1148 return WaitAny(waitableResults, Timeout.Infinite, true);
1149 }
1150
1151 /// <summary>
1152 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1153 /// </summary>
1154 /// <param name="waitableResults">Array of work item result objects</param>
1155 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param>
1156 /// <param name="exitContext">
1157 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1158 /// </param>
1159 /// <returns>
1160 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1161 /// </returns>
1162 public static int WaitAny(
1163 IWaitableResult[] waitableResults,
1164 TimeSpan timeout,
1165 bool exitContext)
1166 {
1167 return WaitAny(waitableResults, (int)timeout.TotalMilliseconds, exitContext);
1168 }
1169
1170 /// <summary>
1171 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1172 /// </summary>
1173 /// <param name="waitableResults">Array of work item result objects</param>
1174 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param>
1175 /// <param name="exitContext">
1176 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1177 /// </param>
1178 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1179 /// <returns>
1180 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1181 /// </returns>
1182 public static int WaitAny(
1183 IWaitableResult [] waitableResults,
1184 TimeSpan timeout,
1185 bool exitContext,
1186 WaitHandle cancelWaitHandle)
1187 {
1188 return WaitAny(waitableResults, (int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle);
1189 }
1190
1191 /// <summary>
1192 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1193 /// </summary>
1194 /// <param name="waitableResults">Array of work item result objects</param>
1195 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1196 /// <param name="exitContext">
1197 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1198 /// </param>
1199 /// <returns>
1200 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1201 /// </returns>
1202 public static int WaitAny(
1203 IWaitableResult [] waitableResults,
1204 int millisecondsTimeout,
1205 bool exitContext)
1206 {
1207 return WorkItem.WaitAny(waitableResults, millisecondsTimeout, exitContext, null);
1208 }
1209
1210 /// <summary>
1211 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1212 /// </summary>
1213 /// <param name="waitableResults">Array of work item result objects</param>
1214 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1215 /// <param name="exitContext">
1216 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1217 /// </param>
1218 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1219 /// <returns>
1220 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1221 /// </returns>
1222 public static int WaitAny(
1223 IWaitableResult [] waitableResults,
1224 int millisecondsTimeout,
1225 bool exitContext,
1226 WaitHandle cancelWaitHandle)
1227 {
1228 return WorkItem.WaitAny(waitableResults, millisecondsTimeout, exitContext, cancelWaitHandle);
1229 }
1230
1231 /// <summary>
1232 /// Creates a new WorkItemsGroup.
1233 /// </summary>
1234 /// <param name="concurrency">The number of work items that can be run concurrently</param>
1235 /// <returns>A reference to the WorkItemsGroup</returns>
1236 public IWorkItemsGroup CreateWorkItemsGroup(int concurrency)
1237 {
1238 IWorkItemsGroup workItemsGroup = new WorkItemsGroup(this, concurrency, _stpStartInfo);
1239 return workItemsGroup;
1240 }
723 1241
724 /// <summary> 1242 /// <summary>
725 /// Queue a work item 1243 /// Creates a new WorkItemsGroup.
726 /// </summary> 1244 /// </summary>
727 /// <param name="callback">A callback to execute</param> 1245 /// <param name="concurrency">The number of work items that can be run concurrently</param>
728 /// <param name="workItemPriority">The priority of the work item</param> 1246 /// <param name="wigStartInfo">A WorkItemsGroup configuration that overrides the default behavior</param>
729 /// <returns>Returns a work item result</returns> 1247 /// <returns>A reference to the WorkItemsGroup</returns>
730 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority) 1248 public IWorkItemsGroup CreateWorkItemsGroup(int concurrency, WIGStartInfo wigStartInfo)
731 { 1249 {
732 ValidateNotDisposed(); 1250 IWorkItemsGroup workItemsGroup = new WorkItemsGroup(this, concurrency, wigStartInfo);
733 ValidateCallback(callback); 1251 return workItemsGroup;
734 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, workItemPriority); 1252 }
735 Enqueue(workItem);
736 return workItem.GetWorkItemResult();
737 }
738 1253
739 /// <summary> 1254 #region Fire Thread's Events
740 /// Queue a work item
741 /// </summary>
742 /// <param name="workItemInfo">Work item info</param>
743 /// <param name="callback">A callback to execute</param>
744 /// <returns>Returns a work item result</returns>
745 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback)
746 {
747 ValidateNotDisposed();
748 ValidateCallback(callback);
749 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, workItemInfo, callback);
750 Enqueue(workItem);
751 return workItem.GetWorkItemResult();
752 }
753 1255
754 /// <summary> 1256 private void FireOnThreadInitialization()
755 /// Queue a work item
756 /// </summary>
757 /// <param name="callback">A callback to execute</param>
758 /// <param name="state">
759 /// The context object of the work item. Used for passing arguments to the work item.
760 /// </param>
761 /// <returns>Returns a work item result</returns>
762 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state)
763 { 1257 {
764 ValidateNotDisposed(); 1258 if (null != _onThreadInitialization)
765 ValidateCallback(callback); 1259 {
766 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state); 1260 foreach (ThreadInitializationHandler tih in _onThreadInitialization.GetInvocationList())
767 Enqueue(workItem); 1261 {
768 return workItem.GetWorkItemResult(); 1262 try
1263 {
1264 tih();
1265 }
1266 catch (Exception e)
1267 {
1268 e.GetHashCode();
1269 Debug.Assert(false);
1270 throw;
1271 }
1272 }
1273 }
769 } 1274 }
770 1275
771 /// <summary> 1276 private void FireOnThreadTermination()
772 /// Queue a work item
773 /// </summary>
774 /// <param name="callback">A callback to execute</param>
775 /// <param name="state">
776 /// The context object of the work item. Used for passing arguments to the work item.
777 /// </param>
778 /// <param name="workItemPriority">The work item priority</param>
779 /// <returns>Returns a work item result</returns>
780 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority)
781 { 1277 {
782 ValidateNotDisposed(); 1278 if (null != _onThreadTermination)
783 ValidateCallback(callback); 1279 {
784 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state, workItemPriority); 1280 foreach (ThreadTerminationHandler tth in _onThreadTermination.GetInvocationList())
785 Enqueue(workItem); 1281 {
786 return workItem.GetWorkItemResult(); 1282 try
1283 {
1284 tth();
1285 }
1286 catch (Exception e)
1287 {
1288 e.GetHashCode();
1289 Debug.Assert(false);
1290 throw;
1291 }
1292 }
1293 }
787 } 1294 }
788 1295
789 /// <summary> 1296 #endregion
790 /// Queue a work item
791 /// </summary>
792 /// <param name="workItemInfo">Work item information</param>
793 /// <param name="callback">A callback to execute</param>
794 /// <param name="state">
795 /// The context object of the work item. Used for passing arguments to the work item.
796 /// </param>
797 /// <returns>Returns a work item result</returns>
798 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state)
799 {
800 ValidateNotDisposed();
801 ValidateCallback(callback);
802 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, workItemInfo, callback, state);
803 Enqueue(workItem);
804 return workItem.GetWorkItemResult();
805 }
806 1297
807 /// <summary> 1298 /// <summary>
808 /// Queue a work item 1299 /// This event is fired when a thread is created.
1300 /// Use it to initialize a thread before the work items use it.
809 /// </summary> 1301 /// </summary>
810 /// <param name="callback">A callback to execute</param> 1302 public event ThreadInitializationHandler OnThreadInitialization
811 /// <param name="state">
812 /// The context object of the work item. Used for passing arguments to the work item.
813 /// </param>
814 /// <param name="postExecuteWorkItemCallback">
815 /// A delegate to call after the callback completion
816 /// </param>
817 /// <returns>Returns a work item result</returns>
818 public IWorkItemResult QueueWorkItem(
819 WorkItemCallback callback,
820 object state,
821 PostExecuteWorkItemCallback postExecuteWorkItemCallback)
822 { 1303 {
823 ValidateNotDisposed(); 1304 add { _onThreadInitialization += value; }
824 ValidateCallback(callback); 1305 remove { _onThreadInitialization -= value; }
825 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state, postExecuteWorkItemCallback);
826 Enqueue(workItem);
827 return workItem.GetWorkItemResult();
828 } 1306 }
829 1307
830 /// <summary> 1308 /// <summary>
831 /// Queue a work item 1309 /// This event is fired when a thread is terminating.
1310 /// Use it for cleanup.
832 /// </summary> 1311 /// </summary>
833 /// <param name="callback">A callback to execute</param> 1312 public event ThreadTerminationHandler OnThreadTermination
834 /// <param name="state">
835 /// The context object of the work item. Used for passing arguments to the work item.
836 /// </param>
837 /// <param name="postExecuteWorkItemCallback">
838 /// A delegate to call after the callback completion
839 /// </param>
840 /// <param name="workItemPriority">The work item priority</param>
841 /// <returns>Returns a work item result</returns>
842 public IWorkItemResult QueueWorkItem(
843 WorkItemCallback callback,
844 object state,
845 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
846 WorkItemPriority workItemPriority)
847 { 1313 {
848 ValidateNotDisposed(); 1314 add { _onThreadTermination += value; }
849 ValidateCallback(callback); 1315 remove { _onThreadTermination -= value; }
850 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state, postExecuteWorkItemCallback, workItemPriority);
851 Enqueue(workItem);
852 return workItem.GetWorkItemResult();
853 } 1316 }
854 1317
855 /// <summary>
856 /// Queue a work item
857 /// </summary>
858 /// <param name="callback">A callback to execute</param>
859 /// <param name="state">
860 /// The context object of the work item. Used for passing arguments to the work item.
861 /// </param>
862 /// <param name="postExecuteWorkItemCallback">
863 /// A delegate to call after the callback completion
864 /// </param>
865 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
866 /// <returns>Returns a work item result</returns>
867 public IWorkItemResult QueueWorkItem(
868 WorkItemCallback callback,
869 object state,
870 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
871 CallToPostExecute callToPostExecute)
872 {
873 ValidateNotDisposed();
874 ValidateCallback(callback);
875 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute);
876 Enqueue(workItem);
877 return workItem.GetWorkItemResult();
878 }
879 1318
880 /// <summary> 1319 internal void CancelAbortWorkItemsGroup(WorkItemsGroup wig)
881 /// Queue a work item
882 /// </summary>
883 /// <param name="callback">A callback to execute</param>
884 /// <param name="state">
885 /// The context object of the work item. Used for passing arguments to the work item.
886 /// </param>
887 /// <param name="postExecuteWorkItemCallback">
888 /// A delegate to call after the callback completion
889 /// </param>
890 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
891 /// <param name="workItemPriority">The work item priority</param>
892 /// <returns>Returns a work item result</returns>
893 public IWorkItemResult QueueWorkItem(
894 WorkItemCallback callback,
895 object state,
896 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
897 CallToPostExecute callToPostExecute,
898 WorkItemPriority workItemPriority)
899 { 1320 {
900 ValidateNotDisposed(); 1321 foreach (ThreadEntry threadEntry in _workerThreads.Values)
901 ValidateCallback(callback); 1322 {
902 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _stpStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute, workItemPriority); 1323 WorkItem workItem = threadEntry.CurrentWorkItem;
903 Enqueue(workItem); 1324 if (null != workItem &&
904 return workItem.GetWorkItemResult(); 1325 workItem.WasQueuedBy(wig) &&
1326 !workItem.IsCanceled)
1327 {
1328 threadEntry.CurrentWorkItem.GetWorkItemResult().Cancel(true);
1329 }
1330 }
905 } 1331 }
906 1332
907 /// <summary> 1333
908 /// Wait for the thread pool to be idle
909 /// </summary>
910 public void WaitForIdle()
911 {
912 WaitForIdle(Timeout.Infinite);
913 }
914 1334
915 /// <summary> 1335 #endregion
916 /// Wait for the thread pool to be idle
917 /// </summary>
918 public bool WaitForIdle(TimeSpan timeout)
919 {
920 return WaitForIdle((int)timeout.TotalMilliseconds);
921 }
922 1336
923 /// <summary> 1337 #region Properties
924 /// Wait for the thread pool to be idle
925 /// </summary>
926 public bool WaitForIdle(int millisecondsTimeout)
927 {
928 ValidateWaitForIdle();
929 return _isIdleWaitHandle.WaitOne(millisecondsTimeout, false);
930 }
931 1338
932 private void ValidateWaitForIdle() 1339 /// <summary>
933 { 1340 /// Get/Set the lower limit of threads in the pool.
934 if(_smartThreadPool == this) 1341 /// </summary>
1342 public int MinThreads
1343 {
1344 get
1345 {
1346 ValidateNotDisposed();
1347 return _stpStartInfo.MinWorkerThreads;
1348 }
1349 set
935 { 1350 {
936 throw new NotSupportedException( 1351 Debug.Assert(value >= 0);
937 "WaitForIdle cannot be called from a thread on its SmartThreadPool, it will cause may cause a deadlock"); 1352 Debug.Assert(value <= _stpStartInfo.MaxWorkerThreads);
1353 if (_stpStartInfo.MaxWorkerThreads < value)
1354 {
1355 _stpStartInfo.MaxWorkerThreads = value;
1356 }
1357 _stpStartInfo.MinWorkerThreads = value;
1358 StartOptimalNumberOfThreads();
938 } 1359 }
939 } 1360 }
1361
1362 /// <summary>
1363 /// Get/Set the upper limit of threads in the pool.
1364 /// </summary>
1365 public int MaxThreads
1366 {
1367 get
1368 {
1369 ValidateNotDisposed();
1370 return _stpStartInfo.MaxWorkerThreads;
1371 }
940 1372
941 internal void ValidateWorkItemsGroupWaitForIdle(IWorkItemsGroup workItemsGroup) 1373 set
1374 {
1375 Debug.Assert(value > 0);
1376 Debug.Assert(value >= _stpStartInfo.MinWorkerThreads);
1377 if (_stpStartInfo.MinWorkerThreads > value)
1378 {
1379 _stpStartInfo.MinWorkerThreads = value;
1380 }
1381 _stpStartInfo.MaxWorkerThreads = value;
1382 StartOptimalNumberOfThreads();
1383 }
1384 }
1385 /// <summary>
1386 /// Get the number of threads in the thread pool.
1387 /// Should be between the lower and the upper limits.
1388 /// </summary>
1389 public int ActiveThreads
1390 {
1391 get
1392 {
1393 ValidateNotDisposed();
1394 return _workerThreads.Count;
1395 }
1396 }
1397
1398 /// <summary>
1399 /// Get the number of busy (not idle) threads in the thread pool.
1400 /// </summary>
1401 public int InUseThreads
1402 {
1403 get
1404 {
1405 ValidateNotDisposed();
1406 return _inUseWorkerThreads;
1407 }
1408 }
1409
1410 /// <summary>
1411 /// Returns true if the current running work item has been cancelled.
1412 /// Must be used within the work item's callback method.
1413 /// The work item should sample this value in order to know if it
1414 /// needs to quit before its completion.
1415 /// </summary>
1416 public static bool IsWorkItemCanceled
942 { 1417 {
943 ValidateWorkItemsGroupWaitForIdleImpl(workItemsGroup, SmartThreadPool._currentWorkItem); 1418 get
944 if ((null != workItemsGroup) &&
945 (null != SmartThreadPool._currentWorkItem) &&
946 SmartThreadPool._currentWorkItem.WasQueuedBy(workItemsGroup))
947 { 1419 {
948 throw new NotSupportedException("WaitForIdle cannot be called from a thread on its SmartThreadPool, it will cause may cause a deadlock"); 1420 return CurrentThreadEntry.CurrentWorkItem.IsCanceled;
949 } 1421 }
950 } 1422 }
951 1423
952 [MethodImpl(MethodImplOptions.NoInlining)] 1424 /// <summary>
953 private void ValidateWorkItemsGroupWaitForIdleImpl(IWorkItemsGroup workItemsGroup, WorkItem workItem) 1425 /// Checks if the work item has been cancelled, and if yes then abort the thread.
1426 /// Can be used with Cancel and timeout
1427 /// </summary>
1428 public static void AbortOnWorkItemCancel()
954 { 1429 {
955 if ((null != workItemsGroup) && 1430 if (IsWorkItemCanceled)
956 (null != workItem) &&
957 workItem.WasQueuedBy(workItemsGroup))
958 { 1431 {
959 throw new NotSupportedException("WaitForIdle cannot be called from a thread on its SmartThreadPool, it will cause may cause a deadlock"); 1432 Thread.CurrentThread.Abort();
960 } 1433 }
961 } 1434 }
962 1435
963
964
965 /// <summary> 1436 /// <summary>
966 /// Force the SmartThreadPool to shutdown 1437 /// Thread Pool start information (readonly)
967 /// </summary> 1438 /// </summary>
968 public void Shutdown() 1439 public STPStartInfo STPStartInfo
969 { 1440 {
970 Shutdown(true, 0); 1441 get
1442 {
1443 return _stpStartInfo.AsReadOnly();
1444 }
971 } 1445 }
972 1446
973 public void Shutdown(bool forceAbort, TimeSpan timeout) 1447 public bool IsShuttingdown
974 { 1448 {
975 Shutdown(forceAbort, (int)timeout.TotalMilliseconds); 1449 get { return _shutdown; }
976 } 1450 }
977 1451
978 /// <summary> 1452 /// <summary>
979 /// Empties the queue of work items and abort the threads in the pool. 1453 /// Return the local calculated performance counters
1454 /// Available only if STPStartInfo.EnableLocalPerformanceCounters is true.
980 /// </summary> 1455 /// </summary>
981 public void Shutdown(bool forceAbort, int millisecondsTimeout) 1456 public ISTPPerformanceCountersReader PerformanceCountersReader
982 { 1457 {
983 ValidateNotDisposed(); 1458 get { return (ISTPPerformanceCountersReader)_localPCs; }
984 1459 }
985 ISTPInstancePerformanceCounters pcs = _pcs;
986
987 if (NullSTPInstancePerformanceCounters.Instance != _pcs)
988 {
989 _pcs.Dispose();
990 // Set the _pcs to "null" to stop updating the performance
991 // counters
992 _pcs = NullSTPInstancePerformanceCounters.Instance;
993 }
994
995 Thread [] threads = null;
996 lock(_workerThreads.SyncRoot)
997 {
998 // Shutdown the work items queue
999 _workItemsQueue.Dispose();
1000
1001 // Signal the threads to exit
1002 _shutdown = true;
1003 _shuttingDownEvent.Set();
1004 1460
1005 // Make a copy of the threads' references in the pool 1461 #endregion
1006 threads = new Thread [_workerThreads.Count];
1007 _workerThreads.Keys.CopyTo(threads, 0);
1008 }
1009 1462
1010 int millisecondsLeft = millisecondsTimeout; 1463 #region IDisposable Members
1011 DateTime start = DateTime.Now;
1012 bool waitInfinitely = (Timeout.Infinite == millisecondsTimeout);
1013 bool timeout = false;
1014 1464
1015 // Each iteration we update the time left for the timeout. 1465 public void Dispose()
1016 foreach(Thread thread in threads) 1466 {
1467 if (!_isDisposed)
1017 { 1468 {
1018 // Join don't work with negative numbers 1469 if (!_shutdown)
1019 if (!waitInfinitely && (millisecondsLeft < 0))
1020 { 1470 {
1021 timeout = true; 1471 Shutdown();
1022 break;
1023 } 1472 }
1024 1473
1025 // Wait for the thread to terminate 1474 if (null != _shuttingDownEvent)
1026 bool success = thread.Join(millisecondsLeft);
1027 if(!success)
1028 { 1475 {
1029 timeout = true; 1476 _shuttingDownEvent.Close();
1030 break; 1477 _shuttingDownEvent = null;
1031 } 1478 }
1032 1479 _workerThreads.Clear();
1033 if(!waitInfinitely) 1480
1481 if (null != _isIdleWaitHandle)
1034 { 1482 {
1035 // Update the time left to wait 1483 _isIdleWaitHandle.Close();
1036 TimeSpan ts = DateTime.Now - start; 1484 _isIdleWaitHandle = null;
1037 millisecondsLeft = millisecondsTimeout - (int)ts.TotalMilliseconds;
1038 } 1485 }
1039 }
1040 1486
1041 if (timeout && forceAbort) 1487 _isDisposed = true;
1042 {
1043 // Abort the threads in the pool
1044 foreach(Thread thread in threads)
1045 {
1046 if ((thread != null) && thread.IsAlive)
1047 {
1048 try
1049 {
1050 thread.Abort("Shutdown");
1051 }
1052 catch(SecurityException e)
1053 {
1054 e.GetHashCode();
1055 }
1056 catch(ThreadStateException ex)
1057 {
1058 ex.GetHashCode();
1059 // In case the thread has been terminated
1060 // after the check if it is alive.
1061 }
1062 }
1063 }
1064 } 1488 }
1065
1066 // Dispose of the performance counters
1067 pcs.Dispose();
1068 } 1489 }
1069 1490
1070 /// <summary> 1491 private void ValidateNotDisposed()
1071 /// Wait for all work items to complete
1072 /// </summary>
1073 /// <param name="workItemResults">Array of work item result objects</param>
1074 /// <returns>
1075 /// true when every work item in workItemResults has completed; otherwise false.
1076 /// </returns>
1077 public static bool WaitAll(
1078 IWorkItemResult [] workItemResults)
1079 { 1492 {
1080 return WaitAll(workItemResults, Timeout.Infinite, true); 1493 if(_isDisposed)
1494 {
1495 throw new ObjectDisposedException(GetType().ToString(), "The SmartThreadPool has been shutdown");
1496 }
1081 } 1497 }
1498 #endregion
1499
1500 #region WorkItemsGroupBase Overrides
1082 1501
1083 /// <summary> 1502 /// <summary>
1084 /// Wait for all work items to complete 1503 /// Get/Set the maximum number of work items that execute cocurrency on the thread pool
1085 /// </summary> 1504 /// </summary>
1086 /// <param name="workItemResults">Array of work item result objects</param> 1505 public override int Concurrency
1087 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param> 1506 {
1088 /// <param name="exitContext"> 1507 get { return MaxThreads; }
1089 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false. 1508 set { MaxThreads = value; }
1090 /// </param> 1509 }
1091 /// <returns> 1510
1092 /// true when every work item in workItemResults has completed; otherwise false. 1511 /// <summary>
1093 /// </returns> 1512 /// Get the number of work items in the queue.
1094 public static bool WaitAll( 1513 /// </summary>
1095 IWorkItemResult [] workItemResults, 1514 public override int WaitingCallbacks
1096 TimeSpan timeout, 1515 {
1097 bool exitContext) 1516 get
1098 { 1517 {
1099 return WaitAll(workItemResults, (int)timeout.TotalMilliseconds, exitContext); 1518 ValidateNotDisposed();
1100 } 1519 return _workItemsQueue.Count;
1520 }
1521 }
1101 1522
1102 /// <summary> 1523 /// <summary>
1103 /// Wait for all work items to complete 1524 /// Get an array with all the state objects of the currently running items.
1525 /// The array represents a snap shot and impact performance.
1104 /// </summary> 1526 /// </summary>
1105 /// <param name="workItemResults">Array of work item result objects</param> 1527 public override object[] GetStates()
1106 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param>
1107 /// <param name="exitContext">
1108 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1109 /// </param>
1110 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1111 /// <returns>
1112 /// true when every work item in workItemResults has completed; otherwise false.
1113 /// </returns>
1114 public static bool WaitAll(
1115 IWorkItemResult [] workItemResults,
1116 TimeSpan timeout,
1117 bool exitContext,
1118 WaitHandle cancelWaitHandle)
1119 { 1528 {
1120 return WaitAll(workItemResults, (int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle); 1529 object[] states = _workItemsQueue.GetStates();
1530 return states;
1121 } 1531 }
1122 1532
1123 /// <summary> 1533 /// <summary>
1124 /// Wait for all work items to complete 1534 /// WorkItemsGroup start information (readonly)
1125 /// </summary> 1535 /// </summary>
1126 /// <param name="workItemResults">Array of work item result objects</param> 1536 public override WIGStartInfo WIGStartInfo
1127 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1128 /// <param name="exitContext">
1129 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1130 /// </param>
1131 /// <returns>
1132 /// true when every work item in workItemResults has completed; otherwise false.
1133 /// </returns>
1134 public static bool WaitAll(
1135 IWorkItemResult [] workItemResults,
1136 int millisecondsTimeout,
1137 bool exitContext)
1138 { 1537 {
1139 return WorkItem.WaitAll(workItemResults, millisecondsTimeout, exitContext, null); 1538 get { return _stpStartInfo.AsReadOnly(); }
1140 } 1539 }
1141 1540
1142 /// <summary> 1541 /// <summary>
1143 /// Wait for all work items to complete 1542 /// Start the thread pool if it was started suspended.
1543 /// If it is already running, this method is ignored.
1144 /// </summary> 1544 /// </summary>
1145 /// <param name="workItemResults">Array of work item result objects</param> 1545 public override void Start()
1146 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1147 /// <param name="exitContext">
1148 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1149 /// </param>
1150 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1151 /// <returns>
1152 /// true when every work item in workItemResults has completed; otherwise false.
1153 /// </returns>
1154 public static bool WaitAll(
1155 IWorkItemResult [] workItemResults,
1156 int millisecondsTimeout,
1157 bool exitContext,
1158 WaitHandle cancelWaitHandle)
1159 { 1546 {
1160 return WorkItem.WaitAll(workItemResults, millisecondsTimeout, exitContext, cancelWaitHandle); 1547 if (!_isSuspended)
1161 } 1548 {
1549 return;
1550 }
1551 _isSuspended = false;
1162 1552
1553 ICollection workItemsGroups = _workItemsGroups.Values;
1554 foreach (WorkItemsGroup workItemsGroup in workItemsGroups)
1555 {
1556 workItemsGroup.OnSTPIsStarting();
1557 }
1163 1558
1164 /// <summary> 1559 StartOptimalNumberOfThreads();
1165 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
1166 /// </summary>
1167 /// <param name="workItemResults">Array of work item result objects</param>
1168 /// <returns>
1169 /// The array index of the work item result that satisfied the wait, or WaitTimeout if any of the work items has been canceled.
1170 /// </returns>
1171 public static int WaitAny(
1172 IWorkItemResult [] workItemResults)
1173 {
1174 return WaitAny(workItemResults, Timeout.Infinite, true);
1175 } 1560 }
1176 1561
1177 /// <summary> 1562 /// <summary>
1178 /// Waits for any of the work items in the specified array to complete, cancel, or timeout 1563 /// Cancel all work items using thread abortion
1179 /// </summary> 1564 /// </summary>
1180 /// <param name="workItemResults">Array of work item result objects</param> 1565 /// <param name="abortExecution">True to stop work items by raising ThreadAbortException</param>
1181 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param> 1566 public override void Cancel(bool abortExecution)
1182 /// <param name="exitContext">
1183 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1184 /// </param>
1185 /// <returns>
1186 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1187 /// </returns>
1188 public static int WaitAny(
1189 IWorkItemResult [] workItemResults,
1190 TimeSpan timeout,
1191 bool exitContext)
1192 { 1567 {
1193 return WaitAny(workItemResults, (int)timeout.TotalMilliseconds, exitContext); 1568 _canceledSmartThreadPool.IsCanceled = true;
1194 } 1569 _canceledSmartThreadPool = new CanceledWorkItemsGroup();
1195 1570
1196 /// <summary> 1571 ICollection workItemsGroups = _workItemsGroups.Values;
1197 /// Waits for any of the work items in the specified array to complete, cancel, or timeout 1572 foreach (WorkItemsGroup workItemsGroup in workItemsGroups)
1198 /// </summary> 1573 {
1199 /// <param name="workItemResults">Array of work item result objects</param> 1574 workItemsGroup.Cancel(abortExecution);
1200 /// <param name="timeout">The number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely. </param> 1575 }
1201 /// <param name="exitContext"> 1576
1202 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false. 1577 if (abortExecution)
1203 /// </param> 1578 {
1204 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param> 1579 foreach (ThreadEntry threadEntry in _workerThreads.Values)
1205 /// <returns> 1580 {
1206 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled. 1581 WorkItem workItem = threadEntry.CurrentWorkItem;
1207 /// </returns> 1582 if (null != workItem &&
1208 public static int WaitAny( 1583 threadEntry.AssociatedSmartThreadPool == this &&
1209 IWorkItemResult [] workItemResults, 1584 !workItem.IsCanceled)
1210 TimeSpan timeout, 1585 {
1211 bool exitContext, 1586 threadEntry.CurrentWorkItem.GetWorkItemResult().Cancel(true);
1212 WaitHandle cancelWaitHandle) 1587 }
1213 { 1588 }
1214 return WaitAny(workItemResults, (int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle); 1589 }
1215 } 1590 }
1216 1591
1217 /// <summary> 1592 /// <summary>
1218 /// Waits for any of the work items in the specified array to complete, cancel, or timeout 1593 /// Wait for the thread pool to be idle
1219 /// </summary> 1594 /// </summary>
1220 /// <param name="workItemResults">Array of work item result objects</param> 1595 public override bool WaitForIdle(int millisecondsTimeout)
1221 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1222 /// <param name="exitContext">
1223 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1224 /// </param>
1225 /// <returns>
1226 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1227 /// </returns>
1228 public static int WaitAny(
1229 IWorkItemResult [] workItemResults,
1230 int millisecondsTimeout,
1231 bool exitContext)
1232 { 1596 {
1233 return WorkItem.WaitAny(workItemResults, millisecondsTimeout, exitContext, null); 1597 ValidateWaitForIdle();
1598 return STPEventWaitHandle.WaitOne(_isIdleWaitHandle, millisecondsTimeout, false);
1234 } 1599 }
1235 1600
1236 /// <summary> 1601 /// <summary>
1237 /// Waits for any of the work items in the specified array to complete, cancel, or timeout 1602 /// This event is fired when all work items are completed.
1603 /// (When IsIdle changes to true)
1604 /// This event only work on WorkItemsGroup. On SmartThreadPool
1605 /// it throws the NotImplementedException.
1238 /// </summary> 1606 /// </summary>
1239 /// <param name="workItemResults">Array of work item result objects</param> 1607 public override event WorkItemsGroupIdleHandler OnIdle
1240 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
1241 /// <param name="exitContext">
1242 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
1243 /// </param>
1244 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
1245 /// <returns>
1246 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
1247 /// </returns>
1248 public static int WaitAny(
1249 IWorkItemResult [] workItemResults,
1250 int millisecondsTimeout,
1251 bool exitContext,
1252 WaitHandle cancelWaitHandle)
1253 {
1254 return WorkItem.WaitAny(workItemResults, millisecondsTimeout, exitContext, cancelWaitHandle);
1255 }
1256
1257 public IWorkItemsGroup CreateWorkItemsGroup(int concurrency)
1258 {
1259 IWorkItemsGroup workItemsGroup = new WorkItemsGroup(this, concurrency, _stpStartInfo);
1260 return workItemsGroup;
1261 }
1262
1263 public IWorkItemsGroup CreateWorkItemsGroup(int concurrency, WIGStartInfo wigStartInfo)
1264 {
1265 IWorkItemsGroup workItemsGroup = new WorkItemsGroup(this, concurrency, wigStartInfo);
1266 return workItemsGroup;
1267 }
1268
1269 public event WorkItemsGroupIdleHandler OnIdle
1270 { 1608 {
1271 add 1609 add
1272 { 1610 {
@@ -1280,166 +1618,115 @@ namespace Amib.Threading
1280 } 1618 }
1281 } 1619 }
1282 1620
1283 public void Cancel() 1621 internal override void PreQueueWorkItem()
1284 {
1285 ICollection workItemsGroups = _workItemsGroups.Values;
1286 foreach(WorkItemsGroup workItemsGroup in workItemsGroups)
1287 {
1288 workItemsGroup.Cancel();
1289 }
1290 }
1291
1292 public void Start()
1293 { 1622 {
1294 lock (this) 1623 ValidateNotDisposed();
1295 {
1296 if (!this._stpStartInfo.StartSuspended)
1297 {
1298 return;
1299 }
1300 _stpStartInfo.StartSuspended = false;
1301 }
1302
1303 ICollection workItemsGroups = _workItemsGroups.Values;
1304 foreach(WorkItemsGroup workItemsGroup in workItemsGroups)
1305 {
1306 workItemsGroup.OnSTPIsStarting();
1307 }
1308
1309 StartOptimalNumberOfThreads();
1310 } 1624 }
1311 1625
1312 #endregion 1626 #endregion
1313 1627
1314 #region Properties 1628 #region Join, Choice, Pipe, etc.
1315
1316 /// <summary>
1317 /// Get/Set the name of the SmartThreadPool instance
1318 /// </summary>
1319 public string Name
1320 {
1321 get
1322 {
1323 return _name;
1324 }
1325
1326 set
1327 {
1328 _name = value;
1329 }
1330 }
1331 1629
1332 /// <summary> 1630 /// <summary>
1333 /// Get the lower limit of threads in the pool. 1631 /// Executes all actions in parallel.
1632 /// Returns when they all finish.
1334 /// </summary> 1633 /// </summary>
1335 public int MinThreads 1634 /// <param name="actions">Actions to execute</param>
1336 { 1635 public void Join(IEnumerable<Action> actions)
1337 get 1636 {
1637 WIGStartInfo wigStartInfo = new WIGStartInfo { StartSuspended = true };
1638 IWorkItemsGroup workItemsGroup = CreateWorkItemsGroup(int.MaxValue, wigStartInfo);
1639 foreach (Action action in actions)
1338 { 1640 {
1339 ValidateNotDisposed(); 1641 workItemsGroup.QueueWorkItem(action);
1340 return _stpStartInfo.MinWorkerThreads;
1341 } 1642 }
1643 workItemsGroup.Start();
1644 workItemsGroup.WaitForIdle();
1342 } 1645 }
1343 1646
1344 /// <summary> 1647 /// <summary>
1345 /// Get the upper limit of threads in the pool. 1648 /// Executes all actions in parallel.
1346 /// </summary> 1649 /// Returns when they all finish.
1347 public int MaxThreads
1348 {
1349 get
1350 {
1351 ValidateNotDisposed();
1352 return _stpStartInfo.MaxWorkerThreads;
1353 }
1354 }
1355 /// <summary>
1356 /// Get the number of threads in the thread pool.
1357 /// Should be between the lower and the upper limits.
1358 /// </summary> 1650 /// </summary>
1359 public int ActiveThreads 1651 /// <param name="actions">Actions to execute</param>
1360 { 1652 public void Join(params Action[] actions)
1361 get 1653 {
1362 { 1654 Join((IEnumerable<Action>)actions);
1363 ValidateNotDisposed();
1364 return _workerThreads.Count;
1365 }
1366 } 1655 }
1367 1656
1368 /// <summary> 1657 private class ChoiceIndex
1369 /// Get the number of busy (not idle) threads in the thread pool. 1658 {
1370 /// </summary> 1659 public int _index = -1;
1371 public int InUseThreads
1372 {
1373 get
1374 {
1375 ValidateNotDisposed();
1376 return _inUseWorkerThreads;
1377 }
1378 } 1660 }
1379 1661
1380 /// <summary> 1662 /// <summary>
1381 /// Get the number of work items in the queue. 1663 /// Executes all actions in parallel
1664 /// Returns when the first one completes
1382 /// </summary> 1665 /// </summary>
1383 public int WaitingCallbacks 1666 /// <param name="actions">Actions to execute</param>
1384 { 1667 public int Choice(IEnumerable<Action> actions)
1385 get 1668 {
1386 { 1669 WIGStartInfo wigStartInfo = new WIGStartInfo { StartSuspended = true };
1387 ValidateNotDisposed(); 1670 IWorkItemsGroup workItemsGroup = CreateWorkItemsGroup(int.MaxValue, wigStartInfo);
1388 return _workItemsQueue.Count;
1389 }
1390 }
1391 1671
1672 ManualResetEvent anActionCompleted = new ManualResetEvent(false);
1392 1673
1393 public event EventHandler Idle 1674 ChoiceIndex choiceIndex = new ChoiceIndex();
1394 { 1675
1395 add 1676 int i = 0;
1677 foreach (Action action in actions)
1396 { 1678 {
1397 _stpIdle += value; 1679 Action act = action;
1680 int value = i;
1681 workItemsGroup.QueueWorkItem(() => { act(); Interlocked.CompareExchange(ref choiceIndex._index, value, -1); anActionCompleted.Set(); });
1682 ++i;
1398 } 1683 }
1684 workItemsGroup.Start();
1685 anActionCompleted.WaitOne();
1399 1686
1400 remove 1687 return choiceIndex._index;
1401 {
1402 _stpIdle -= value;
1403 }
1404 } 1688 }
1405 1689
1406 #endregion 1690 /// <summary>
1407 1691 /// Executes all actions in parallel
1408 #region IDisposable Members 1692 /// Returns when the first one completes
1409 1693 /// </summary>
1410// ~SmartThreadPool() 1694 /// <param name="actions">Actions to execute</param>
1411// { 1695 public int Choice(params Action[] actions)
1412// Dispose(); 1696 {
1413// } 1697 return Choice((IEnumerable<Action>)actions);
1698 }
1414 1699
1415 public void Dispose() 1700 /// <summary>
1701 /// Executes actions in sequence asynchronously.
1702 /// Returns immediately.
1703 /// </summary>
1704 /// <param name="pipeState">A state context that passes </param>
1705 /// <param name="actions">Actions to execute in the order they should run</param>
1706 public void Pipe<T>(T pipeState, IEnumerable<Action<T>> actions)
1416 { 1707 {
1417 if (!_isDisposed) 1708 WIGStartInfo wigStartInfo = new WIGStartInfo { StartSuspended = true };
1709 IWorkItemsGroup workItemsGroup = CreateWorkItemsGroup(1, wigStartInfo);
1710 foreach (Action<T> action in actions)
1418 { 1711 {
1419 if (!_shutdown) 1712 Action<T> act = action;
1420 { 1713 workItemsGroup.QueueWorkItem(() => act(pipeState));
1421 Shutdown();
1422 }
1423
1424 if (null != _shuttingDownEvent)
1425 {
1426 _shuttingDownEvent.Close();
1427 _shuttingDownEvent = null;
1428 }
1429 _workerThreads.Clear();
1430 _isDisposed = true;
1431 GC.SuppressFinalize(this);
1432 } 1714 }
1715 workItemsGroup.Start();
1716 workItemsGroup.WaitForIdle();
1433 } 1717 }
1434 1718
1435 private void ValidateNotDisposed() 1719 /// <summary>
1720 /// Executes actions in sequence asynchronously.
1721 /// Returns immediately.
1722 /// </summary>
1723 /// <param name="pipeState"></param>
1724 /// <param name="actions">Actions to execute in the order they should run</param>
1725 public void Pipe<T>(T pipeState, params Action<T>[] actions)
1436 { 1726 {
1437 if(_isDisposed) 1727 Pipe(pipeState, (IEnumerable<Action<T>>)actions);
1438 {
1439 throw new ObjectDisposedException(GetType().ToString(), "The SmartThreadPool has been shutdown");
1440 }
1441 } 1728 }
1442 #endregion 1729 #endregion
1443 } 1730 }
1444 #endregion 1731 #endregion
1445} 1732}
diff --git a/ThirdParty/SmartThreadPool/SynchronizedDictionary.cs b/ThirdParty/SmartThreadPool/SynchronizedDictionary.cs
new file mode 100644
index 0000000..0cce19f
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/SynchronizedDictionary.cs
@@ -0,0 +1,89 @@
1using System.Collections.Generic;
2
3namespace Amib.Threading.Internal
4{
5 internal class SynchronizedDictionary<TKey, TValue>
6 {
7 private readonly Dictionary<TKey, TValue> _dictionary;
8 private readonly object _lock;
9
10 public SynchronizedDictionary()
11 {
12 _lock = new object();
13 _dictionary = new Dictionary<TKey, TValue>();
14 }
15
16 public int Count
17 {
18 get { return _dictionary.Count; }
19 }
20
21 public bool Contains(TKey key)
22 {
23 lock (_lock)
24 {
25 return _dictionary.ContainsKey(key);
26 }
27 }
28
29 public void Remove(TKey key)
30 {
31 lock (_lock)
32 {
33 _dictionary.Remove(key);
34 }
35 }
36
37 public object SyncRoot
38 {
39 get { return _lock; }
40 }
41
42 public TValue this[TKey key]
43 {
44 get
45 {
46 lock (_lock)
47 {
48 return _dictionary[key];
49 }
50 }
51 set
52 {
53 lock (_lock)
54 {
55 _dictionary[key] = value;
56 }
57 }
58 }
59
60 public Dictionary<TKey, TValue>.KeyCollection Keys
61 {
62 get
63 {
64 lock (_lock)
65 {
66 return _dictionary.Keys;
67 }
68 }
69 }
70
71 public Dictionary<TKey, TValue>.ValueCollection Values
72 {
73 get
74 {
75 lock (_lock)
76 {
77 return _dictionary.Values;
78 }
79 }
80 }
81 public void Clear()
82 {
83 lock (_lock)
84 {
85 _dictionary.Clear();
86 }
87 }
88 }
89}
diff --git a/ThirdParty/SmartThreadPool/WIGStartInfo.cs b/ThirdParty/SmartThreadPool/WIGStartInfo.cs
index 150317f..8af195b 100644
--- a/ThirdParty/SmartThreadPool/WIGStartInfo.cs
+++ b/ThirdParty/SmartThreadPool/WIGStartInfo.cs
@@ -1,99 +1,171 @@
1// Ami Bar 1using System;
2// amibar@gmail.com
3 2
4namespace Amib.Threading 3namespace Amib.Threading
5{ 4{
6 /// <summary> 5 /// <summary>
7 /// Summary description for WIGStartInfo. 6 /// Summary description for WIGStartInfo.
8 /// </summary> 7 /// </summary>
9 public class WIGStartInfo 8 public class WIGStartInfo
10 { 9 {
11 /// <summary>
12 /// Use the caller's security context
13 /// </summary>
14 private bool _useCallerCallContext; 10 private bool _useCallerCallContext;
15
16 /// <summary>
17 /// Use the caller's HTTP context
18 /// </summary>
19 private bool _useCallerHttpContext; 11 private bool _useCallerHttpContext;
20
21 /// <summary>
22 /// Dispose of the state object of a work item
23 /// </summary>
24 private bool _disposeOfStateObjects; 12 private bool _disposeOfStateObjects;
25
26 /// <summary>
27 /// The option to run the post execute
28 /// </summary>
29 private CallToPostExecute _callToPostExecute; 13 private CallToPostExecute _callToPostExecute;
30
31 /// <summary>
32 /// A post execute callback to call when none is provided in
33 /// the QueueWorkItem method.
34 /// </summary>
35 private PostExecuteWorkItemCallback _postExecuteWorkItemCallback; 14 private PostExecuteWorkItemCallback _postExecuteWorkItemCallback;
36
37 /// <summary>
38 /// Indicate the WorkItemsGroup to suspend the handling of the work items
39 /// until the Start() method is called.
40 /// </summary>
41 private bool _startSuspended; 15 private bool _startSuspended;
16 private WorkItemPriority _workItemPriority;
17 private bool _fillStateWithArgs;
42 18
43 public WIGStartInfo() 19 protected bool _readOnly;
20
21 public WIGStartInfo()
44 { 22 {
45 _useCallerCallContext = SmartThreadPool.DefaultUseCallerCallContext; 23 _fillStateWithArgs = SmartThreadPool.DefaultFillStateWithArgs;
46 _useCallerHttpContext = SmartThreadPool.DefaultUseCallerHttpContext; 24 _workItemPriority = SmartThreadPool.DefaultWorkItemPriority;
47 _disposeOfStateObjects = SmartThreadPool.DefaultDisposeOfStateObjects;
48 _callToPostExecute = SmartThreadPool.DefaultCallToPostExecute;
49 _postExecuteWorkItemCallback = SmartThreadPool.DefaultPostExecuteWorkItemCallback;
50 _startSuspended = SmartThreadPool.DefaultStartSuspended; 25 _startSuspended = SmartThreadPool.DefaultStartSuspended;
26 _postExecuteWorkItemCallback = SmartThreadPool.DefaultPostExecuteWorkItemCallback;
27 _callToPostExecute = SmartThreadPool.DefaultCallToPostExecute;
28 _disposeOfStateObjects = SmartThreadPool.DefaultDisposeOfStateObjects;
29 _useCallerHttpContext = SmartThreadPool.DefaultUseCallerHttpContext;
30 _useCallerCallContext = SmartThreadPool.DefaultUseCallerCallContext;
51 } 31 }
52 32
53 public WIGStartInfo(WIGStartInfo wigStartInfo) 33 public WIGStartInfo(WIGStartInfo wigStartInfo)
54 { 34 {
55 _useCallerCallContext = wigStartInfo._useCallerCallContext; 35 _useCallerCallContext = wigStartInfo.UseCallerCallContext;
56 _useCallerHttpContext = wigStartInfo._useCallerHttpContext; 36 _useCallerHttpContext = wigStartInfo.UseCallerHttpContext;
57 _disposeOfStateObjects = wigStartInfo._disposeOfStateObjects; 37 _disposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
58 _callToPostExecute = wigStartInfo._callToPostExecute; 38 _callToPostExecute = wigStartInfo.CallToPostExecute;
59 _postExecuteWorkItemCallback = wigStartInfo._postExecuteWorkItemCallback; 39 _postExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback;
60 _startSuspended = wigStartInfo._startSuspended; 40 _workItemPriority = wigStartInfo.WorkItemPriority;
41 _startSuspended = wigStartInfo.StartSuspended;
42 _fillStateWithArgs = wigStartInfo.FillStateWithArgs;
61 } 43 }
62 44
63 public bool UseCallerCallContext 45 protected void ThrowIfReadOnly()
64 { 46 {
65 get { return _useCallerCallContext; } 47 if (_readOnly)
66 set { _useCallerCallContext = value; } 48 {
49 throw new NotSupportedException("This is a readonly instance and set is not supported");
50 }
67 } 51 }
68 52
69 public bool UseCallerHttpContext 53 /// <summary>
70 { 54 /// Get/Set if to use the caller's security context
71 get { return _useCallerHttpContext; } 55 /// </summary>
72 set { _useCallerHttpContext = value; } 56 public virtual bool UseCallerCallContext
73 } 57 {
58 get { return _useCallerCallContext; }
59 set
60 {
61 ThrowIfReadOnly();
62 _useCallerCallContext = value;
63 }
64 }
74 65
75 public bool DisposeOfStateObjects
76 {
77 get { return _disposeOfStateObjects; }
78 set { _disposeOfStateObjects = value; }
79 }
80 66
81 public CallToPostExecute CallToPostExecute 67 /// <summary>
82 { 68 /// Get/Set if to use the caller's HTTP context
83 get { return _callToPostExecute; } 69 /// </summary>
84 set { _callToPostExecute = value; } 70 public virtual bool UseCallerHttpContext
85 } 71 {
72 get { return _useCallerHttpContext; }
73 set
74 {
75 ThrowIfReadOnly();
76 _useCallerHttpContext = value;
77 }
78 }
86 79
87 public PostExecuteWorkItemCallback PostExecuteWorkItemCallback
88 {
89 get { return _postExecuteWorkItemCallback; }
90 set { _postExecuteWorkItemCallback = value; }
91 }
92 80
93 public bool StartSuspended 81 /// <summary>
94 { 82 /// Get/Set if to dispose of the state object of a work item
95 get { return _startSuspended; } 83 /// </summary>
96 set { _startSuspended = value; } 84 public virtual bool DisposeOfStateObjects
97 } 85 {
86 get { return _disposeOfStateObjects; }
87 set
88 {
89 ThrowIfReadOnly();
90 _disposeOfStateObjects = value;
91 }
92 }
93
94
95 /// <summary>
96 /// Get/Set the run the post execute options
97 /// </summary>
98 public virtual CallToPostExecute CallToPostExecute
99 {
100 get { return _callToPostExecute; }
101 set
102 {
103 ThrowIfReadOnly();
104 _callToPostExecute = value;
105 }
106 }
107
108
109 /// <summary>
110 /// Get/Set the default post execute callback
111 /// </summary>
112 public virtual PostExecuteWorkItemCallback PostExecuteWorkItemCallback
113 {
114 get { return _postExecuteWorkItemCallback; }
115 set
116 {
117 ThrowIfReadOnly();
118 _postExecuteWorkItemCallback = value;
119 }
120 }
121
122
123 /// <summary>
124 /// Get/Set if the work items execution should be suspended until the Start()
125 /// method is called.
126 /// </summary>
127 public virtual bool StartSuspended
128 {
129 get { return _startSuspended; }
130 set
131 {
132 ThrowIfReadOnly();
133 _startSuspended = value;
134 }
135 }
136
137
138 /// <summary>
139 /// Get/Set the default priority that a work item gets when it is enqueued
140 /// </summary>
141 public virtual WorkItemPriority WorkItemPriority
142 {
143 get { return _workItemPriority; }
144 set { _workItemPriority = value; }
145 }
146
147 /// <summary>
148 /// Get/Set the if QueueWorkItem of Action&lt;...&gt;/Func&lt;...&gt; fill the
149 /// arguments as an object array into the state of the work item.
150 /// The arguments can be access later by IWorkItemResult.State.
151 /// </summary>
152 public virtual bool FillStateWithArgs
153 {
154 get { return _fillStateWithArgs; }
155 set
156 {
157 ThrowIfReadOnly();
158 _fillStateWithArgs = value;
159 }
160 }
161
162 /// <summary>
163 /// Get a readonly version of this WIGStartInfo
164 /// </summary>
165 /// <returns>Returns a readonly reference to this WIGStartInfoRO</returns>
166 public WIGStartInfo AsReadOnly()
167 {
168 return new WIGStartInfo(this) { _readOnly = true };
169 }
98 } 170 }
99} 171}
diff --git a/ThirdParty/SmartThreadPool/WorkItem.WorkItemResult.cs b/ThirdParty/SmartThreadPool/WorkItem.WorkItemResult.cs
new file mode 100644
index 0000000..435a14b
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/WorkItem.WorkItemResult.cs
@@ -0,0 +1,190 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Threading;
5
6namespace Amib.Threading.Internal
7{
8 public partial class WorkItem
9 {
10 #region WorkItemResult class
11
12 private class WorkItemResult : IWorkItemResult, IInternalWorkItemResult, IInternalWaitableResult
13 {
14 /// <summary>
15 /// A back reference to the work item
16 /// </summary>
17 private readonly WorkItem _workItem;
18
19 public WorkItemResult(WorkItem workItem)
20 {
21 _workItem = workItem;
22 }
23
24 internal WorkItem GetWorkItem()
25 {
26 return _workItem;
27 }
28
29 #region IWorkItemResult Members
30
31 public bool IsCompleted
32 {
33 get
34 {
35 return _workItem.IsCompleted;
36 }
37 }
38
39 public bool IsCanceled
40 {
41 get
42 {
43 return _workItem.IsCanceled;
44 }
45 }
46
47 public object GetResult()
48 {
49 return _workItem.GetResult(Timeout.Infinite, true, null);
50 }
51
52 public object GetResult(int millisecondsTimeout, bool exitContext)
53 {
54 return _workItem.GetResult(millisecondsTimeout, exitContext, null);
55 }
56
57 public object GetResult(TimeSpan timeout, bool exitContext)
58 {
59 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, null);
60 }
61
62 public object GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle)
63 {
64 return _workItem.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle);
65 }
66
67 public object GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle)
68 {
69 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle);
70 }
71
72 public object GetResult(out Exception e)
73 {
74 return _workItem.GetResult(Timeout.Infinite, true, null, out e);
75 }
76
77 public object GetResult(int millisecondsTimeout, bool exitContext, out Exception e)
78 {
79 return _workItem.GetResult(millisecondsTimeout, exitContext, null, out e);
80 }
81
82 public object GetResult(TimeSpan timeout, bool exitContext, out Exception e)
83 {
84 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, null, out e);
85 }
86
87 public object GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
88 {
89 return _workItem.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle, out e);
90 }
91
92 public object GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
93 {
94 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle, out e);
95 }
96
97 public bool Cancel()
98 {
99 return Cancel(false);
100 }
101
102 public bool Cancel(bool abortExecution)
103 {
104 return _workItem.Cancel(abortExecution);
105 }
106
107 public object State
108 {
109 get
110 {
111 return _workItem._state;
112 }
113 }
114
115 public WorkItemPriority WorkItemPriority
116 {
117 get
118 {
119 return _workItem._workItemInfo.WorkItemPriority;
120 }
121 }
122
123 /// <summary>
124 /// Return the result, same as GetResult()
125 /// </summary>
126 public object Result
127 {
128 get { return GetResult(); }
129 }
130
131 /// <summary>
132 /// Returns the exception if occured otherwise returns null.
133 /// This value is valid only after the work item completed,
134 /// before that it is always null.
135 /// </summary>
136 public object Exception
137 {
138 get { return _workItem._exception; }
139 }
140
141 #endregion
142
143 #region IInternalWorkItemResult Members
144
145 public event WorkItemStateCallback OnWorkItemStarted
146 {
147 add
148 {
149 _workItem.OnWorkItemStarted += value;
150 }
151 remove
152 {
153 _workItem.OnWorkItemStarted -= value;
154 }
155 }
156
157
158 public event WorkItemStateCallback OnWorkItemCompleted
159 {
160 add
161 {
162 _workItem.OnWorkItemCompleted += value;
163 }
164 remove
165 {
166 _workItem.OnWorkItemCompleted -= value;
167 }
168 }
169
170 #endregion
171
172 #region IInternalWorkItemResult Members
173
174 public IWorkItemResult GetWorkItemResult()
175 {
176 return this;
177 }
178
179 public IWorkItemResult<TResult> GetWorkItemResultT<TResult>()
180 {
181 return new WorkItemResultTWrapper<TResult>(this);
182 }
183
184 #endregion
185 }
186
187 #endregion
188
189 }
190}
diff --git a/ThirdParty/SmartThreadPool/WorkItem.cs b/ThirdParty/SmartThreadPool/WorkItem.cs
index d0c0524..185f10c 100644
--- a/ThirdParty/SmartThreadPool/WorkItem.cs
+++ b/ThirdParty/SmartThreadPool/WorkItem.cs
@@ -1,58 +1,13 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
5using System.Threading; 2using System.Threading;
6using System.Diagnostics; 3using System.Diagnostics;
7 4
8namespace Amib.Threading.Internal 5namespace Amib.Threading.Internal
9{ 6{
10 #region WorkItem Delegate
11
12 /// <summary>
13 /// An internal delegate to call when the WorkItem starts or completes
14 /// </summary>
15 internal delegate void WorkItemStateCallback(WorkItem workItem);
16
17 #endregion
18
19 #region IInternalWorkItemResult interface
20
21 public class CanceledWorkItemsGroup
22 {
23 public readonly static CanceledWorkItemsGroup NotCanceledWorkItemsGroup = new CanceledWorkItemsGroup();
24
25 private bool _isCanceled = false;
26 public bool IsCanceled
27 {
28 get { return _isCanceled; }
29 set { _isCanceled = value; }
30 }
31 }
32
33 internal interface IInternalWorkItemResult
34 {
35 event WorkItemStateCallback OnWorkItemStarted;
36 event WorkItemStateCallback OnWorkItemCompleted;
37 }
38
39 #endregion
40
41 #region IWorkItem interface
42
43 public interface IWorkItem
44 {
45
46 }
47
48 #endregion
49
50 #region WorkItem class
51
52 /// <summary> 7 /// <summary>
53 /// Holds a callback delegate and the state for that delegate. 8 /// Holds a callback delegate and the state for that delegate.
54 /// </summary> 9 /// </summary>
55 public class WorkItem : IHasWorkItemPriority, IWorkItem 10 public partial class WorkItem : IHasWorkItemPriority
56 { 11 {
57 #region WorkItemState enum 12 #region WorkItemState enum
58 13
@@ -61,33 +16,57 @@ namespace Amib.Threading.Internal
61 /// </summary> 16 /// </summary>
62 private enum WorkItemState 17 private enum WorkItemState
63 { 18 {
64 InQueue, 19 InQueue = 0, // Nexts: InProgress, Canceled
65 InProgress, 20 InProgress = 1, // Nexts: Completed, Canceled
66 Completed, 21 Completed = 2, // Stays Completed
67 Canceled, 22 Canceled = 3, // Stays Canceled
68 } 23 }
69 24
70 #endregion 25 private static bool IsValidStatesTransition(WorkItemState currentState, WorkItemState nextState)
26 {
27 bool valid = false;
28
29 switch (currentState)
30 {
31 case WorkItemState.InQueue:
32 valid = (WorkItemState.InProgress == nextState) || (WorkItemState.Canceled == nextState);
33 break;
34 case WorkItemState.InProgress:
35 valid = (WorkItemState.Completed == nextState) || (WorkItemState.Canceled == nextState);
36 break;
37 case WorkItemState.Completed:
38 case WorkItemState.Canceled:
39 // Cannot be changed
40 break;
41 default:
42 // Unknown state
43 Debug.Assert(false);
44 break;
45 }
71 46
72 #region Member Variables 47 return valid;
48 }
73 49
74 public Thread currentThread; 50 #endregion
51
52 #region Fields
75 53
76 /// <summary> 54 /// <summary>
77 /// Callback delegate for the callback. 55 /// Callback delegate for the callback.
78 /// </summary> 56 /// </summary>
79 private WorkItemCallback _callback; 57 private readonly WorkItemCallback _callback;
80 58
81 /// <summary> 59 /// <summary>
82 /// State with which to call the callback delegate. 60 /// State with which to call the callback delegate.
83 /// </summary> 61 /// </summary>
84 private object _state; 62 private object _state;
85 63
64#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
86 /// <summary> 65 /// <summary>
87 /// Stores the caller's context 66 /// Stores the caller's context
88 /// </summary> 67 /// </summary>
89 private CallerThreadContext _callerContext; 68 private readonly CallerThreadContext _callerContext;
90 69#endif
91 /// <summary> 70 /// <summary>
92 /// Holds the result of the mehtod 71 /// Holds the result of the mehtod
93 /// </summary> 72 /// </summary>
@@ -117,12 +96,12 @@ namespace Amib.Threading.Internal
117 /// <summary> 96 /// <summary>
118 /// Represents the result state of the work item 97 /// Represents the result state of the work item
119 /// </summary> 98 /// </summary>
120 private WorkItemResult _workItemResult; 99 private readonly WorkItemResult _workItemResult;
121 100
122 /// <summary> 101 /// <summary>
123 /// Work item info 102 /// Work item info
124 /// </summary> 103 /// </summary>
125 private WorkItemInfo _workItemInfo; 104 private readonly WorkItemInfo _workItemInfo;
126 105
127 /// <summary> 106 /// <summary>
128 /// Called when the WorkItem starts 107 /// Called when the WorkItem starts
@@ -141,30 +120,41 @@ namespace Amib.Threading.Internal
141 private CanceledWorkItemsGroup _canceledWorkItemsGroup = CanceledWorkItemsGroup.NotCanceledWorkItemsGroup; 120 private CanceledWorkItemsGroup _canceledWorkItemsGroup = CanceledWorkItemsGroup.NotCanceledWorkItemsGroup;
142 121
143 /// <summary> 122 /// <summary>
123 /// A reference to an object that indicates whatever the
124 /// SmartThreadPool has been canceled
125 /// </summary>
126 private CanceledWorkItemsGroup _canceledSmartThreadPool = CanceledWorkItemsGroup.NotCanceledWorkItemsGroup;
127
128 /// <summary>
144 /// The work item group this work item belong to. 129 /// The work item group this work item belong to.
145 ///
146 /// </summary> 130 /// </summary>
147 private IWorkItemsGroup _workItemsGroup; 131 private readonly IWorkItemsGroup _workItemsGroup;
148 132
149 #region Performance Counter fields 133 /// <summary>
134 /// The thread that executes this workitem.
135 /// This field is available for the period when the work item is executed, before and after it is null.
136 /// </summary>
137 private Thread _executingThread;
150 138
151 /// <summary> 139 /// <summary>
152 /// The time when the work items is queued. 140 /// The absulote time when the work item will be timeout
153 /// Used with the performance counter.
154 /// </summary> 141 /// </summary>
155 private DateTime _queuedTime; 142 private long _expirationTime;
143
144 #region Performance Counter fields
145
146
147
156 148
157 /// <summary> 149 /// <summary>
158 /// The time when the work items starts its execution. 150 /// Stores how long the work item waited on the stp queue
159 /// Used with the performance counter.
160 /// </summary> 151 /// </summary>
161 private DateTime _beginProcessTime; 152 private Stopwatch _waitingOnQueueStopwatch;
162 153
163 /// <summary> 154 /// <summary>
164 /// The time when the work items ends its execution. 155 /// Stores how much time it took the work item to execute after it went out of the queue
165 /// Used with the performance counter.
166 /// </summary> 156 /// </summary>
167 private DateTime _endProcessTime; 157 private Stopwatch _processingStopwatch;
168 158
169 #endregion 159 #endregion
170 160
@@ -174,17 +164,25 @@ namespace Amib.Threading.Internal
174 164
175 public TimeSpan WaitingTime 165 public TimeSpan WaitingTime
176 { 166 {
177 get 167 get
178 { 168 {
179 return (_beginProcessTime - _queuedTime); 169 return _waitingOnQueueStopwatch.Elapsed;
180 } 170 }
181 } 171 }
182 172
183 public TimeSpan ProcessTime 173 public TimeSpan ProcessTime
184 { 174 {
185 get 175 get
176 {
177 return _processingStopwatch.Elapsed;
178 }
179 }
180
181 internal WorkItemInfo WorkItemInfo
182 {
183 get
186 { 184 {
187 return (_endProcessTime - _beginProcessTime); 185 return _workItemInfo;
188 } 186 }
189 } 187 }
190 188
@@ -195,6 +193,8 @@ namespace Amib.Threading.Internal
195 /// <summary> 193 /// <summary>
196 /// Initialize the callback holding object. 194 /// Initialize the callback holding object.
197 /// </summary> 195 /// </summary>
196 /// <param name="workItemsGroup">The workItemGroup of the workitem</param>
197 /// <param name="workItemInfo">The WorkItemInfo of te workitem</param>
198 /// <param name="callback">Callback delegate for the callback.</param> 198 /// <param name="callback">Callback delegate for the callback.</param>
199 /// <param name="state">State with which to call the callback delegate.</param> 199 /// <param name="state">State with which to call the callback delegate.</param>
200 /// 200 ///
@@ -203,16 +203,18 @@ namespace Amib.Threading.Internal
203 public WorkItem( 203 public WorkItem(
204 IWorkItemsGroup workItemsGroup, 204 IWorkItemsGroup workItemsGroup,
205 WorkItemInfo workItemInfo, 205 WorkItemInfo workItemInfo,
206 WorkItemCallback callback, 206 WorkItemCallback callback,
207 object state) 207 object state)
208 { 208 {
209 _workItemsGroup = workItemsGroup; 209 _workItemsGroup = workItemsGroup;
210 _workItemInfo = workItemInfo; 210 _workItemInfo = workItemInfo;
211 211
212#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
212 if (_workItemInfo.UseCallerCallContext || _workItemInfo.UseCallerHttpContext) 213 if (_workItemInfo.UseCallerCallContext || _workItemInfo.UseCallerHttpContext)
213 { 214 {
214 _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext, _workItemInfo.UseCallerHttpContext); 215 _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext, _workItemInfo.UseCallerHttpContext);
215 } 216 }
217#endif
216 218
217 _callback = callback; 219 _callback = callback;
218 _state = state; 220 _state = state;
@@ -222,9 +224,18 @@ namespace Amib.Threading.Internal
222 224
223 internal void Initialize() 225 internal void Initialize()
224 { 226 {
227 // The _workItemState is changed directly instead of using the SetWorkItemState
228 // method since we don't want to go throught IsValidStateTransition.
225 _workItemState = WorkItemState.InQueue; 229 _workItemState = WorkItemState.InQueue;
230
226 _workItemCompleted = null; 231 _workItemCompleted = null;
227 _workItemCompletedRefCount = 0; 232 _workItemCompletedRefCount = 0;
233 _waitingOnQueueStopwatch = new Stopwatch();
234 _processingStopwatch = new Stopwatch();
235 _expirationTime =
236 _workItemInfo.Timeout > 0 ?
237 DateTime.UtcNow.Ticks + _workItemInfo.Timeout * TimeSpan.TicksPerMillisecond :
238 long.MaxValue;
228 } 239 }
229 240
230 internal bool WasQueuedBy(IWorkItemsGroup workItemsGroup) 241 internal bool WasQueuedBy(IWorkItemsGroup workItemsGroup)
@@ -237,17 +248,16 @@ namespace Amib.Threading.Internal
237 248
238 #region Methods 249 #region Methods
239 250
240 public CanceledWorkItemsGroup CanceledWorkItemsGroup 251 internal CanceledWorkItemsGroup CanceledWorkItemsGroup
241 { 252 {
242 get 253 get { return _canceledWorkItemsGroup; }
243 { 254 set { _canceledWorkItemsGroup = value; }
244 return _canceledWorkItemsGroup; 255 }
245 }
246 256
247 set 257 internal CanceledWorkItemsGroup CanceledSmartThreadPool
248 { 258 {
249 _canceledWorkItemsGroup = value; 259 get { return _canceledSmartThreadPool; }
250 } 260 set { _canceledSmartThreadPool = value; }
251 } 261 }
252 262
253 /// <summary> 263 /// <summary>
@@ -259,9 +269,10 @@ namespace Amib.Threading.Internal
259 /// </returns> 269 /// </returns>
260 public bool StartingWorkItem() 270 public bool StartingWorkItem()
261 { 271 {
262 _beginProcessTime = DateTime.Now; 272 _waitingOnQueueStopwatch.Stop();
273 _processingStopwatch.Start();
263 274
264 lock(this) 275 lock (this)
265 { 276 {
266 if (IsCanceled) 277 if (IsCanceled)
267 { 278 {
@@ -277,6 +288,9 @@ namespace Amib.Threading.Internal
277 288
278 Debug.Assert(WorkItemState.InQueue == GetWorkItemState()); 289 Debug.Assert(WorkItemState.InQueue == GetWorkItemState());
279 290
291 // No need for a lock yet, only after the state has changed to InProgress
292 _executingThread = Thread.CurrentThread;
293
280 SetWorkItemState(WorkItemState.InProgress); 294 SetWorkItemState(WorkItemState.InProgress);
281 } 295 }
282 296
@@ -291,7 +305,7 @@ namespace Amib.Threading.Internal
291 CallToPostExecute currentCallToPostExecute = 0; 305 CallToPostExecute currentCallToPostExecute = 0;
292 306
293 // Execute the work item if we are in the correct state 307 // Execute the work item if we are in the correct state
294 switch(GetWorkItemState()) 308 switch (GetWorkItemState())
295 { 309 {
296 case WorkItemState.InProgress: 310 case WorkItemState.InProgress:
297 currentCallToPostExecute |= CallToPostExecute.WhenWorkItemNotCanceled; 311 currentCallToPostExecute |= CallToPostExecute.WhenWorkItemNotCanceled;
@@ -311,7 +325,7 @@ namespace Amib.Threading.Internal
311 PostExecute(); 325 PostExecute();
312 } 326 }
313 327
314 _endProcessTime = DateTime.Now; 328 _processingStopwatch.Stop();
315 } 329 }
316 330
317 internal void FireWorkItemCompleted() 331 internal void FireWorkItemCompleted()
@@ -323,8 +337,21 @@ namespace Amib.Threading.Internal
323 _workItemCompletedEvent(this); 337 _workItemCompletedEvent(this);
324 } 338 }
325 } 339 }
326 catch // Ignore exceptions 340 catch // Suppress exceptions
327 {} 341 { }
342 }
343
344 internal void FireWorkItemStarted()
345 {
346 try
347 {
348 if (null != _workItemStartedEvent)
349 {
350 _workItemStartedEvent(this);
351 }
352 }
353 catch // Suppress exceptions
354 { }
328 } 355 }
329 356
330 /// <summary> 357 /// <summary>
@@ -332,32 +359,70 @@ namespace Amib.Threading.Internal
332 /// </summary> 359 /// </summary>
333 private void ExecuteWorkItem() 360 private void ExecuteWorkItem()
334 { 361 {
362
363#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
335 CallerThreadContext ctc = null; 364 CallerThreadContext ctc = null;
336 if (null != _callerContext) 365 if (null != _callerContext)
337 { 366 {
338 ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext, _callerContext.CapturedHttpContext); 367 ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext, _callerContext.CapturedHttpContext);
339 CallerThreadContext.Apply(_callerContext); 368 CallerThreadContext.Apply(_callerContext);
340 } 369 }
370#endif
341 371
342 Exception exception = null; 372 Exception exception = null;
343 object result = null; 373 object result = null;
344 374
345 try 375 try
346 { 376 {
347 result = _callback(_state); 377 try
378 {
379 result = _callback(_state);
380 }
381 catch (Exception e)
382 {
383 // Save the exception so we can rethrow it later
384 exception = e;
385 }
386
387 // Remove the value of the execution thread, so it will be impossible to cancel the work item,
388 // since it is already completed.
389 // Cancelling a work item that already completed may cause the abortion of the next work item!!!
390 Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
391
392 if (null == executionThread)
393 {
394 // Oops! we are going to be aborted..., Wait here so we can catch the ThreadAbortException
395 Thread.Sleep(60 * 1000);
396
397 // If after 1 minute this thread was not aborted then let it continue working.
398 }
348 } 399 }
349 catch (Exception e) 400 // We must treat the ThreadAbortException or else it will be stored in the exception variable
401 catch (ThreadAbortException tae)
350 { 402 {
351 // Save the exception so we can rethrow it later 403 tae.GetHashCode();
352 exception = e; 404 // Check if the work item was cancelled
405 // If we got a ThreadAbortException and the STP is not shutting down, it means the
406 // work items was cancelled.
407 if (!SmartThreadPool.CurrentThreadEntry.AssociatedSmartThreadPool.IsShuttingdown)
408 {
409#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
410 Thread.ResetAbort();
411#endif
412 }
353 } 413 }
354 414
415#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
355 if (null != _callerContext) 416 if (null != _callerContext)
356 { 417 {
357 CallerThreadContext.Apply(ctc); 418 CallerThreadContext.Apply(ctc);
358 } 419 }
420#endif
359 421
360 SetResult(result, exception); 422 if (!SmartThreadPool.IsWorkItemCanceled)
423 {
424 SetResult(result, exception);
425 }
361 } 426 }
362 427
363 /// <summary> 428 /// <summary>
@@ -369,9 +434,9 @@ namespace Amib.Threading.Internal
369 { 434 {
370 try 435 try
371 { 436 {
372 _workItemInfo.PostExecuteWorkItemCallback(this._workItemResult); 437 _workItemInfo.PostExecuteWorkItemCallback(_workItemResult);
373 } 438 }
374 catch (Exception e) 439 catch (Exception e)
375 { 440 {
376 Debug.Assert(null != e); 441 Debug.Assert(null != e);
377 } 442 }
@@ -382,6 +447,8 @@ namespace Amib.Threading.Internal
382 /// Set the result of the work item to return 447 /// Set the result of the work item to return
383 /// </summary> 448 /// </summary>
384 /// <param name="result">The result of the work item</param> 449 /// <param name="result">The result of the work item</param>
450 /// <param name="exception">The exception that was throw while the workitem executed, null
451 /// if there was no exception.</param>
385 internal void SetResult(object result, Exception exception) 452 internal void SetResult(object result, Exception exception)
386 { 453 {
387 _result = result; 454 _result = result;
@@ -401,48 +468,48 @@ namespace Amib.Threading.Internal
401 /// <summary> 468 /// <summary>
402 /// Wait for all work items to complete 469 /// Wait for all work items to complete
403 /// </summary> 470 /// </summary>
404 /// <param name="workItemResults">Array of work item result objects</param> 471 /// <param name="waitableResults">Array of work item result objects</param>
405 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param> 472 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
406 /// <param name="exitContext"> 473 /// <param name="exitContext">
407 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false. 474 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
408 /// </param> 475 /// </param>
409 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param> 476 /// <param name="cancelWaitHandle">A cancel wait handle to interrupt the wait if needed</param>
410 /// <returns> 477 /// <returns>
411 /// true when every work item in workItemResults has completed; otherwise false. 478 /// true when every work item in waitableResults has completed; otherwise false.
412 /// </returns> 479 /// </returns>
413 internal static bool WaitAll( 480 internal static bool WaitAll(
414 IWorkItemResult [] workItemResults, 481 IWaitableResult[] waitableResults,
415 int millisecondsTimeout, 482 int millisecondsTimeout,
416 bool exitContext, 483 bool exitContext,
417 WaitHandle cancelWaitHandle) 484 WaitHandle cancelWaitHandle)
418 { 485 {
419 if (0 == workItemResults.Length) 486 if (0 == waitableResults.Length)
420 { 487 {
421 return true; 488 return true;
422 } 489 }
423 490
424 bool success; 491 bool success;
425 WaitHandle [] waitHandles = new WaitHandle[workItemResults.Length];; 492 WaitHandle[] waitHandles = new WaitHandle[waitableResults.Length];
426 GetWaitHandles(workItemResults, waitHandles); 493 GetWaitHandles(waitableResults, waitHandles);
427 494
428 if ((null == cancelWaitHandle) && (waitHandles.Length <= 64)) 495 if ((null == cancelWaitHandle) && (waitHandles.Length <= 64))
429 { 496 {
430 success = WaitHandle.WaitAll(waitHandles, millisecondsTimeout, exitContext); 497 success = STPEventWaitHandle.WaitAll(waitHandles, millisecondsTimeout, exitContext);
431 } 498 }
432 else 499 else
433 { 500 {
434 success = true; 501 success = true;
435 int millisecondsLeft = millisecondsTimeout; 502 int millisecondsLeft = millisecondsTimeout;
436 DateTime start = DateTime.Now; 503 Stopwatch stopwatch = Stopwatch.StartNew();
437 504
438 WaitHandle [] whs; 505 WaitHandle[] whs;
439 if (null != cancelWaitHandle) 506 if (null != cancelWaitHandle)
440 { 507 {
441 whs = new WaitHandle [] { null, cancelWaitHandle }; 508 whs = new WaitHandle[] { null, cancelWaitHandle };
442 } 509 }
443 else 510 else
444 { 511 {
445 whs = new WaitHandle [] { null }; 512 whs = new WaitHandle[] { null };
446 } 513 }
447 514
448 bool waitInfinitely = (Timeout.Infinite == millisecondsTimeout); 515 bool waitInfinitely = (Timeout.Infinite == millisecondsTimeout);
@@ -450,7 +517,7 @@ namespace Amib.Threading.Internal
450 // We cannot use WaitHandle.WaitAll directly, because the cancelWaitHandle 517 // We cannot use WaitHandle.WaitAll directly, because the cancelWaitHandle
451 // won't affect it. 518 // won't affect it.
452 // Each iteration we update the time left for the timeout. 519 // Each iteration we update the time left for the timeout.
453 for(int i = 0; i < workItemResults.Length; ++i) 520 for (int i = 0; i < waitableResults.Length; ++i)
454 { 521 {
455 // WaitAny don't work with negative numbers 522 // WaitAny don't work with negative numbers
456 if (!waitInfinitely && (millisecondsLeft < 0)) 523 if (!waitInfinitely && (millisecondsLeft < 0))
@@ -460,23 +527,22 @@ namespace Amib.Threading.Internal
460 } 527 }
461 528
462 whs[0] = waitHandles[i]; 529 whs[0] = waitHandles[i];
463 int result = WaitHandle.WaitAny(whs, millisecondsLeft, exitContext); 530 int result = STPEventWaitHandle.WaitAny(whs, millisecondsLeft, exitContext);
464 if((result > 0) || (WaitHandle.WaitTimeout == result)) 531 if ((result > 0) || (STPEventWaitHandle.WaitTimeout == result))
465 { 532 {
466 success = false; 533 success = false;
467 break; 534 break;
468 } 535 }
469 536
470 if(!waitInfinitely) 537 if (!waitInfinitely)
471 { 538 {
472 // Update the time left to wait 539 // Update the time left to wait
473 TimeSpan ts = DateTime.Now - start; 540 millisecondsLeft = millisecondsTimeout - (int)stopwatch.ElapsedMilliseconds;
474 millisecondsLeft = millisecondsTimeout - (int)ts.TotalMilliseconds;
475 } 541 }
476 } 542 }
477 } 543 }
478 // Release the wait handles 544 // Release the wait handles
479 ReleaseWaitHandles(workItemResults); 545 ReleaseWaitHandles(waitableResults);
480 546
481 return success; 547 return success;
482 } 548 }
@@ -484,7 +550,7 @@ namespace Amib.Threading.Internal
484 /// <summary> 550 /// <summary>
485 /// Waits for any of the work items in the specified array to complete, cancel, or timeout 551 /// Waits for any of the work items in the specified array to complete, cancel, or timeout
486 /// </summary> 552 /// </summary>
487 /// <param name="workItemResults">Array of work item result objects</param> 553 /// <param name="waitableResults">Array of work item result objects</param>
488 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param> 554 /// <param name="millisecondsTimeout">The number of milliseconds to wait, or Timeout.Infinite (-1) to wait indefinitely.</param>
489 /// <param name="exitContext"> 555 /// <param name="exitContext">
490 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false. 556 /// true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it; otherwise, false.
@@ -493,38 +559,38 @@ namespace Amib.Threading.Internal
493 /// <returns> 559 /// <returns>
494 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled. 560 /// The array index of the work item result that satisfied the wait, or WaitTimeout if no work item result satisfied the wait and a time interval equivalent to millisecondsTimeout has passed or the work item has been canceled.
495 /// </returns> 561 /// </returns>
496 internal static int WaitAny( 562 internal static int WaitAny(
497 IWorkItemResult [] workItemResults, 563 IWaitableResult[] waitableResults,
498 int millisecondsTimeout, 564 int millisecondsTimeout,
499 bool exitContext, 565 bool exitContext,
500 WaitHandle cancelWaitHandle) 566 WaitHandle cancelWaitHandle)
501 { 567 {
502 WaitHandle [] waitHandles = null; 568 WaitHandle[] waitHandles;
503 569
504 if (null != cancelWaitHandle) 570 if (null != cancelWaitHandle)
505 { 571 {
506 waitHandles = new WaitHandle[workItemResults.Length+1]; 572 waitHandles = new WaitHandle[waitableResults.Length + 1];
507 GetWaitHandles(workItemResults, waitHandles); 573 GetWaitHandles(waitableResults, waitHandles);
508 waitHandles[workItemResults.Length] = cancelWaitHandle; 574 waitHandles[waitableResults.Length] = cancelWaitHandle;
509 } 575 }
510 else 576 else
511 { 577 {
512 waitHandles = new WaitHandle[workItemResults.Length]; 578 waitHandles = new WaitHandle[waitableResults.Length];
513 GetWaitHandles(workItemResults, waitHandles); 579 GetWaitHandles(waitableResults, waitHandles);
514 } 580 }
515 581
516 int result = WaitHandle.WaitAny(waitHandles, millisecondsTimeout, exitContext); 582 int result = STPEventWaitHandle.WaitAny(waitHandles, millisecondsTimeout, exitContext);
517 583
518 // Treat cancel as timeout 584 // Treat cancel as timeout
519 if (null != cancelWaitHandle) 585 if (null != cancelWaitHandle)
520 { 586 {
521 if (result == workItemResults.Length) 587 if (result == waitableResults.Length)
522 { 588 {
523 result = WaitHandle.WaitTimeout; 589 result = STPEventWaitHandle.WaitTimeout;
524 } 590 }
525 } 591 }
526 592
527 ReleaseWaitHandles(workItemResults); 593 ReleaseWaitHandles(waitableResults);
528 594
529 return result; 595 return result;
530 } 596 }
@@ -532,16 +598,16 @@ namespace Amib.Threading.Internal
532 /// <summary> 598 /// <summary>
533 /// Fill an array of wait handles with the work items wait handles. 599 /// Fill an array of wait handles with the work items wait handles.
534 /// </summary> 600 /// </summary>
535 /// <param name="workItemResults">An array of work item results</param> 601 /// <param name="waitableResults">An array of work item results</param>
536 /// <param name="waitHandles">An array of wait handles to fill</param> 602 /// <param name="waitHandles">An array of wait handles to fill</param>
537 private static void GetWaitHandles( 603 private static void GetWaitHandles(
538 IWorkItemResult [] workItemResults, 604 IWaitableResult[] waitableResults,
539 WaitHandle [] waitHandles) 605 WaitHandle[] waitHandles)
540 { 606 {
541 for(int i = 0; i < workItemResults.Length; ++i) 607 for (int i = 0; i < waitableResults.Length; ++i)
542 { 608 {
543 WorkItemResult wir = workItemResults[i] as WorkItemResult; 609 WorkItemResult wir = waitableResults[i].GetWorkItemResult() as WorkItemResult;
544 Debug.Assert(null != wir, "All workItemResults must be WorkItemResult objects"); 610 Debug.Assert(null != wir, "All waitableResults must be WorkItemResult objects");
545 611
546 waitHandles[i] = wir.GetWorkItem().GetWaitHandle(); 612 waitHandles[i] = wir.GetWorkItem().GetWaitHandle();
547 } 613 }
@@ -550,40 +616,64 @@ namespace Amib.Threading.Internal
550 /// <summary> 616 /// <summary>
551 /// Release the work items' wait handles 617 /// Release the work items' wait handles
552 /// </summary> 618 /// </summary>
553 /// <param name="workItemResults">An array of work item results</param> 619 /// <param name="waitableResults">An array of work item results</param>
554 private static void ReleaseWaitHandles(IWorkItemResult [] workItemResults) 620 private static void ReleaseWaitHandles(IWaitableResult[] waitableResults)
555 { 621 {
556 for(int i = 0; i < workItemResults.Length; ++i) 622 for (int i = 0; i < waitableResults.Length; ++i)
557 { 623 {
558 WorkItemResult wir = workItemResults[i] as WorkItemResult; 624 WorkItemResult wir = (WorkItemResult)waitableResults[i].GetWorkItemResult();
559 625
560 wir.GetWorkItem().ReleaseWaitHandle(); 626 wir.GetWorkItem().ReleaseWaitHandle();
561 } 627 }
562 } 628 }
563 629
564
565 #endregion 630 #endregion
566 631
567 #region Private Members 632 #region Private Members
568 633
569 private WorkItemState GetWorkItemState() 634 private WorkItemState GetWorkItemState()
570 { 635 {
571 if (_canceledWorkItemsGroup.IsCanceled) 636 lock (this)
572 { 637 {
573 return WorkItemState.Canceled; 638 if (WorkItemState.Completed == _workItemState)
574 } 639 {
575 return _workItemState; 640 return _workItemState;
641 }
642
643 long nowTicks = DateTime.UtcNow.Ticks;
576 644
645 if (WorkItemState.Canceled != _workItemState && nowTicks > _expirationTime)
646 {
647 _workItemState = WorkItemState.Canceled;
648 }
649
650 if (WorkItemState.InProgress == _workItemState)
651 {
652 return _workItemState;
653 }
654
655 if (CanceledSmartThreadPool.IsCanceled || CanceledWorkItemsGroup.IsCanceled)
656 {
657 return WorkItemState.Canceled;
658 }
659
660 return _workItemState;
661 }
577 } 662 }
663
664
578 /// <summary> 665 /// <summary>
579 /// Sets the work item's state 666 /// Sets the work item's state
580 /// </summary> 667 /// </summary>
581 /// <param name="workItemState">The state to set the work item to</param> 668 /// <param name="workItemState">The state to set the work item to</param>
582 private void SetWorkItemState(WorkItemState workItemState) 669 private void SetWorkItemState(WorkItemState workItemState)
583 { 670 {
584 lock(this) 671 lock (this)
585 { 672 {
586 _workItemState = workItemState; 673 if (IsValidStatesTransition(_workItemState, workItemState))
674 {
675 _workItemState = workItemState;
676 }
587 } 677 }
588 } 678 }
589 679
@@ -594,7 +684,7 @@ namespace Amib.Threading.Internal
594 private void SignalComplete(bool canceled) 684 private void SignalComplete(bool canceled)
595 { 685 {
596 SetWorkItemState(canceled ? WorkItemState.Canceled : WorkItemState.Completed); 686 SetWorkItemState(canceled ? WorkItemState.Canceled : WorkItemState.Completed);
597 lock(this) 687 lock (this)
598 { 688 {
599 // If someone is waiting then signal. 689 // If someone is waiting then signal.
600 if (null != _workItemCompleted) 690 if (null != _workItemCompleted)
@@ -606,40 +696,93 @@ namespace Amib.Threading.Internal
606 696
607 internal void WorkItemIsQueued() 697 internal void WorkItemIsQueued()
608 { 698 {
609 _queuedTime = DateTime.Now; 699 _waitingOnQueueStopwatch.Start();
610 } 700 }
611 701
612 #endregion 702 #endregion
613 703
614 #region Members exposed by WorkItemResult 704 #region Members exposed by WorkItemResult
615 705
616 /// <summary> 706 /// <summary>
617 /// Cancel the work item if it didn't start running yet. 707 /// Cancel the work item if it didn't start running yet.
618 /// </summary> 708 /// </summary>
619 /// <returns>Returns true on success or false if the work item is in progress or already completed</returns> 709 /// <returns>Returns true on success or false if the work item is in progress or already completed</returns>
620 private bool Cancel() 710 private bool Cancel(bool abortExecution)
621 { 711 {
622 lock(this) 712#if (_WINDOWS_CE)
713 if(abortExecution)
714 {
715 throw new ArgumentOutOfRangeException("abortExecution", "WindowsCE doesn't support this feature");
716 }
717#endif
718 bool success = false;
719 bool signalComplete = false;
720
721 lock (this)
623 { 722 {
624 switch(GetWorkItemState()) 723 switch (GetWorkItemState())
625 { 724 {
626 case WorkItemState.Canceled: 725 case WorkItemState.Canceled:
627 //Debug.WriteLine("Work item already canceled"); 726 //Debug.WriteLine("Work item already canceled");
628 return true; 727 if (abortExecution)
728 {
729 Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
730 if (null != executionThread)
731 {
732 executionThread.Abort(); // "Cancel"
733 // No need to signalComplete, because we already cancelled this work item
734 // so it already signaled its completion.
735 //signalComplete = true;
736 }
737 }
738 success = true;
739 break;
629 case WorkItemState.Completed: 740 case WorkItemState.Completed:
630 case WorkItemState.InProgress:
631 //Debug.WriteLine("Work item cannot be canceled"); 741 //Debug.WriteLine("Work item cannot be canceled");
632 return false; 742 break;
743 case WorkItemState.InProgress:
744 if (abortExecution)
745 {
746 Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
747 if (null != executionThread)
748 {
749 executionThread.Abort(); // "Cancel"
750 success = true;
751 signalComplete = true;
752 }
753 }
754 else
755 {
756 // **************************
757 // Stock SmartThreadPool 2.2.3 sets these to true and relies on the thread to check the
758 // WorkItem cancellation status. However, OpenSimulator uses a different mechanism to notify
759 // scripts of co-operative termination and the abort code also relies on this method
760 // returning false in order to implement a small wait.
761 //
762 // Therefore, as was the case previously with STP, we will not signal successful cancellation
763 // here. It's possible that OpenSimulator code could be changed in the future to remove
764 // the need for this change.
765 // **************************
766 success = false;
767 signalComplete = false;
768 }
769 break;
633 case WorkItemState.InQueue: 770 case WorkItemState.InQueue:
634 // Signal to the wait for completion that the work 771 // Signal to the wait for completion that the work
635 // item has been completed (canceled). There is no 772 // item has been completed (canceled). There is no
636 // reason to wait for it to get out of the queue 773 // reason to wait for it to get out of the queue
637 SignalComplete(true); 774 signalComplete = true;
638 //Debug.WriteLine("Work item canceled"); 775 //Debug.WriteLine("Work item canceled");
639 return true; 776 success = true;
777 break;
778 }
779
780 if (signalComplete)
781 {
782 SignalComplete(true);
640 } 783 }
641 } 784 }
642 return false; 785 return success;
643 } 786 }
644 787
645 /// <summary> 788 /// <summary>
@@ -653,7 +796,7 @@ namespace Amib.Threading.Internal
653 bool exitContext, 796 bool exitContext,
654 WaitHandle cancelWaitHandle) 797 WaitHandle cancelWaitHandle)
655 { 798 {
656 Exception e = null; 799 Exception e;
657 object result = GetResult(millisecondsTimeout, exitContext, cancelWaitHandle, out e); 800 object result = GetResult(millisecondsTimeout, exitContext, cancelWaitHandle, out e);
658 if (null != e) 801 if (null != e)
659 { 802 {
@@ -694,7 +837,7 @@ namespace Amib.Threading.Internal
694 { 837 {
695 WaitHandle wh = GetWaitHandle(); 838 WaitHandle wh = GetWaitHandle();
696 839
697 bool timeout = !wh.WaitOne(millisecondsTimeout, exitContext); 840 bool timeout = !STPEventWaitHandle.WaitOne(wh, millisecondsTimeout, exitContext);
698 841
699 ReleaseWaitHandle(); 842 ReleaseWaitHandle();
700 843
@@ -706,10 +849,10 @@ namespace Amib.Threading.Internal
706 else 849 else
707 { 850 {
708 WaitHandle wh = GetWaitHandle(); 851 WaitHandle wh = GetWaitHandle();
709 int result = WaitHandle.WaitAny(new WaitHandle[] { wh, cancelWaitHandle }); 852 int result = STPEventWaitHandle.WaitAny(new WaitHandle[] { wh, cancelWaitHandle });
710 ReleaseWaitHandle(); 853 ReleaseWaitHandle();
711 854
712 switch(result) 855 switch (result)
713 { 856 {
714 case 0: 857 case 0:
715 // The work item signaled 858 // The work item signaled
@@ -717,7 +860,7 @@ namespace Amib.Threading.Internal
717 // work item (not the get result) 860 // work item (not the get result)
718 break; 861 break;
719 case 1: 862 case 1:
720 case WaitHandle.WaitTimeout: 863 case STPEventWaitHandle.WaitTimeout:
721 throw new WorkItemTimeoutException("Work item timeout"); 864 throw new WorkItemTimeoutException("Work item timeout");
722 default: 865 default:
723 Debug.Assert(false); 866 Debug.Assert(false);
@@ -745,11 +888,11 @@ namespace Amib.Threading.Internal
745 /// </summary> 888 /// </summary>
746 private WaitHandle GetWaitHandle() 889 private WaitHandle GetWaitHandle()
747 { 890 {
748 lock(this) 891 lock (this)
749 { 892 {
750 if (null == _workItemCompleted) 893 if (null == _workItemCompleted)
751 { 894 {
752 _workItemCompleted = new ManualResetEvent(IsCompleted); 895 _workItemCompleted = EventWaitHandleFactory.CreateManualResetEvent(IsCompleted);
753 } 896 }
754 ++_workItemCompletedRefCount; 897 ++_workItemCompletedRefCount;
755 } 898 }
@@ -758,7 +901,7 @@ namespace Amib.Threading.Internal
758 901
759 private void ReleaseWaitHandle() 902 private void ReleaseWaitHandle()
760 { 903 {
761 lock(this) 904 lock (this)
762 { 905 {
763 if (null != _workItemCompleted) 906 if (null != _workItemCompleted)
764 { 907 {
@@ -779,10 +922,10 @@ namespace Amib.Threading.Internal
779 { 922 {
780 get 923 get
781 { 924 {
782 lock(this) 925 lock (this)
783 { 926 {
784 WorkItemState workItemState = GetWorkItemState(); 927 WorkItemState workItemState = GetWorkItemState();
785 return ((workItemState == WorkItemState.Completed) || 928 return ((workItemState == WorkItemState.Completed) ||
786 (workItemState == WorkItemState.Canceled)); 929 (workItemState == WorkItemState.Canceled));
787 } 930 }
788 } 931 }
@@ -795,7 +938,7 @@ namespace Amib.Threading.Internal
795 { 938 {
796 get 939 get
797 { 940 {
798 lock(this) 941 lock (this)
799 { 942 {
800 return (GetWorkItemState() == WorkItemState.Canceled); 943 return (GetWorkItemState() == WorkItemState.Canceled);
801 } 944 }
@@ -843,172 +986,6 @@ namespace Amib.Threading.Internal
843 } 986 }
844 } 987 }
845 988
846
847 #region WorkItemResult class
848
849 private class WorkItemResult : IWorkItemResult, IInternalWorkItemResult
850 {
851 /// <summary>
852 /// A back reference to the work item
853 /// </summary>
854 private WorkItem _workItem;
855
856 public WorkItemResult(WorkItem workItem)
857 {
858 _workItem = workItem;
859 }
860
861 internal WorkItem GetWorkItem()
862 {
863 return _workItem;
864 }
865
866 #region IWorkItemResult Members
867
868 public bool IsCompleted
869 {
870 get
871 {
872 return _workItem.IsCompleted;
873 }
874 }
875
876 public void Abort()
877 {
878 _workItem.Abort();
879 }
880
881 public bool IsCanceled
882 {
883 get
884 {
885 return _workItem.IsCanceled;
886 }
887 }
888
889 public object GetResult()
890 {
891 return _workItem.GetResult(Timeout.Infinite, true, null);
892 }
893
894 public object GetResult(int millisecondsTimeout, bool exitContext)
895 {
896 return _workItem.GetResult(millisecondsTimeout, exitContext, null);
897 }
898
899 public object GetResult(TimeSpan timeout, bool exitContext)
900 {
901 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, null);
902 }
903
904 public object GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle)
905 {
906 return _workItem.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle);
907 }
908
909 public object GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle)
910 {
911 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle);
912 }
913
914 public object GetResult(out Exception e)
915 {
916 return _workItem.GetResult(Timeout.Infinite, true, null, out e);
917 }
918
919 public object GetResult(int millisecondsTimeout, bool exitContext, out Exception e)
920 {
921 return _workItem.GetResult(millisecondsTimeout, exitContext, null, out e);
922 }
923
924 public object GetResult(TimeSpan timeout, bool exitContext, out Exception e)
925 {
926 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, null, out e);
927 }
928
929 public object GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
930 {
931 return _workItem.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle, out e);
932 }
933
934 public object GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
935 {
936 return _workItem.GetResult((int)timeout.TotalMilliseconds, exitContext, cancelWaitHandle, out e);
937 }
938
939 public bool Cancel()
940 {
941 return _workItem.Cancel();
942 }
943
944 public object State
945 {
946 get
947 {
948 return _workItem._state;
949 }
950 }
951
952 public WorkItemPriority WorkItemPriority
953 {
954 get
955 {
956 return _workItem._workItemInfo.WorkItemPriority;
957 }
958 }
959
960 /// <summary>
961 /// Return the result, same as GetResult()
962 /// </summary>
963 public object Result
964 {
965 get { return GetResult(); }
966 }
967
968 /// <summary>
969 /// Returns the exception if occured otherwise returns null.
970 /// This value is valid only after the work item completed,
971 /// before that it is always null.
972 /// </summary>
973 public object Exception
974 {
975 get { return _workItem._exception; }
976 }
977
978 #endregion
979
980 #region IInternalWorkItemResult Members
981
982 public event WorkItemStateCallback OnWorkItemStarted
983 {
984 add
985 {
986 _workItem.OnWorkItemStarted += value;
987 }
988 remove
989 {
990 _workItem.OnWorkItemStarted -= value;
991 }
992 }
993
994
995 public event WorkItemStateCallback OnWorkItemCompleted
996 {
997 add
998 {
999 _workItem.OnWorkItemCompleted += value;
1000 }
1001 remove
1002 {
1003 _workItem.OnWorkItemCompleted -= value;
1004 }
1005 }
1006
1007 #endregion
1008 }
1009
1010 #endregion
1011
1012 public void DisposeOfState() 989 public void DisposeOfState()
1013 { 990 {
1014 if (_workItemInfo.DisposeOfStateObjects) 991 if (_workItemInfo.DisposeOfStateObjects)
@@ -1021,15 +998,5 @@ namespace Amib.Threading.Internal
1021 } 998 }
1022 } 999 }
1023 } 1000 }
1024
1025 public void Abort()
1026 {
1027 lock (this)
1028 {
1029 if(currentThread != null)
1030 currentThread.Abort();
1031 }
1032 }
1033 } 1001 }
1034 #endregion
1035} 1002}
diff --git a/ThirdParty/SmartThreadPool/WorkItemFactory.cs b/ThirdParty/SmartThreadPool/WorkItemFactory.cs
index dfcb54f..16ccd81 100644
--- a/ThirdParty/SmartThreadPool/WorkItemFactory.cs
+++ b/ThirdParty/SmartThreadPool/WorkItemFactory.cs
@@ -1,148 +1,152 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
5 2
6namespace Amib.Threading.Internal 3namespace Amib.Threading.Internal
7{ 4{
8 #region WorkItemFactory class 5 #region WorkItemFactory class
9 6
10 public class WorkItemFactory 7 public class WorkItemFactory
11 { 8 {
12 /// <summary> 9 /// <summary>
13 /// Create a new work item 10 /// Create a new work item
14 /// </summary> 11 /// </summary>
12 /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
13 /// <param name="wigStartInfo">Work item group start information</param>
14 /// <param name="callback">A callback to execute</param>
15 /// <returns>Returns a work item</returns>
16 public static WorkItem CreateWorkItem(
17 IWorkItemsGroup workItemsGroup,
18 WIGStartInfo wigStartInfo,
19 WorkItemCallback callback)
20 {
21 return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null);
22 }
23
24 /// <summary>
25 /// Create a new work item
26 /// </summary>
27 /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
15 /// <param name="wigStartInfo">Work item group start information</param> 28 /// <param name="wigStartInfo">Work item group start information</param>
16 /// <param name="callback">A callback to execute</param> 29 /// <param name="callback">A callback to execute</param>
17 /// <returns>Returns a work item</returns> 30 /// <param name="workItemPriority">The priority of the work item</param>
18 public static WorkItem CreateWorkItem( 31 /// <returns>Returns a work item</returns>
19 IWorkItemsGroup workItemsGroup, 32 public static WorkItem CreateWorkItem(
20 WIGStartInfo wigStartInfo, 33 IWorkItemsGroup workItemsGroup,
21 WorkItemCallback callback) 34 WIGStartInfo wigStartInfo,
22 { 35 WorkItemCallback callback,
23 return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null); 36 WorkItemPriority workItemPriority)
24 } 37 {
25 38 return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null, workItemPriority);
26 /// <summary> 39 }
27 /// Create a new work item 40
28 /// </summary> 41 /// <summary>
29 /// <param name="wigStartInfo">Work item group start information</param> 42 /// Create a new work item
30 /// <param name="callback">A callback to execute</param> 43 /// </summary>
31 /// <param name="workItemPriority">The priority of the work item</param> 44 /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
32 /// <returns>Returns a work item</returns>
33 public static WorkItem CreateWorkItem(
34 IWorkItemsGroup workItemsGroup,
35 WIGStartInfo wigStartInfo,
36 WorkItemCallback callback,
37 WorkItemPriority workItemPriority)
38 {
39 return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null, workItemPriority);
40 }
41
42 /// <summary>
43 /// Create a new work item
44 /// </summary>
45 /// <param name="wigStartInfo">Work item group start information</param> 45 /// <param name="wigStartInfo">Work item group start information</param>
46 /// <param name="workItemInfo">Work item info</param> 46 /// <param name="workItemInfo">Work item info</param>
47 /// <param name="callback">A callback to execute</param> 47 /// <param name="callback">A callback to execute</param>
48 /// <returns>Returns a work item</returns> 48 /// <returns>Returns a work item</returns>
49 public static WorkItem CreateWorkItem( 49 public static WorkItem CreateWorkItem(
50 IWorkItemsGroup workItemsGroup, 50 IWorkItemsGroup workItemsGroup,
51 WIGStartInfo wigStartInfo, 51 WIGStartInfo wigStartInfo,
52 WorkItemInfo workItemInfo, 52 WorkItemInfo workItemInfo,
53 WorkItemCallback callback) 53 WorkItemCallback callback)
54 { 54 {
55 return CreateWorkItem( 55 return CreateWorkItem(
56 workItemsGroup, 56 workItemsGroup,
57 wigStartInfo, 57 wigStartInfo,
58 workItemInfo, 58 workItemInfo,
59 callback, 59 callback,
60 null); 60 null);
61 } 61 }
62 62
63 /// <summary> 63 /// <summary>
64 /// Create a new work item 64 /// Create a new work item
65 /// </summary> 65 /// </summary>
66 /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
66 /// <param name="wigStartInfo">Work item group start information</param> 67 /// <param name="wigStartInfo">Work item group start information</param>
67 /// <param name="callback">A callback to execute</param> 68 /// <param name="callback">A callback to execute</param>
68 /// <param name="state"> 69 /// <param name="state">
69 /// The context object of the work item. Used for passing arguments to the work item. 70 /// The context object of the work item. Used for passing arguments to the work item.
70 /// </param> 71 /// </param>
71 /// <returns>Returns a work item</returns> 72 /// <returns>Returns a work item</returns>
72 public static WorkItem CreateWorkItem( 73 public static WorkItem CreateWorkItem(
73 IWorkItemsGroup workItemsGroup, 74 IWorkItemsGroup workItemsGroup,
74 WIGStartInfo wigStartInfo, 75 WIGStartInfo wigStartInfo,
75 WorkItemCallback callback, 76 WorkItemCallback callback,
76 object state) 77 object state)
77 { 78 {
78 ValidateCallback(callback); 79 ValidateCallback(callback);
79 80
80 WorkItemInfo workItemInfo = new WorkItemInfo(); 81 WorkItemInfo workItemInfo = new WorkItemInfo();
81 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 82 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
82 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 83 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
83 workItemInfo.PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback; 84 workItemInfo.PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback;
84 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute; 85 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
85 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 86 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
86 87 workItemInfo.WorkItemPriority = wigStartInfo.WorkItemPriority;
87 WorkItem workItem = new WorkItem( 88
88 workItemsGroup, 89 WorkItem workItem = new WorkItem(
89 workItemInfo, 90 workItemsGroup,
90 callback, 91 workItemInfo,
91 state); 92 callback,
92 return workItem; 93 state);
93 } 94 return workItem;
94 95 }
95 /// <summary> 96
96 /// Create a new work item 97 /// <summary>
97 /// </summary> 98 /// Create a new work item
98 /// <param name="wigStartInfo">Work item group start information</param> 99 /// </summary>
99 /// <param name="callback">A callback to execute</param> 100 /// <param name="workItemsGroup">The work items group</param>
100 /// <param name="state"> 101 /// <param name="wigStartInfo">Work item group start information</param>
101 /// The context object of the work item. Used for passing arguments to the work item. 102 /// <param name="callback">A callback to execute</param>
102 /// </param> 103 /// <param name="state">
103 /// <param name="workItemPriority">The work item priority</param> 104 /// The context object of the work item. Used for passing arguments to the work item.
104 /// <returns>Returns a work item</returns> 105 /// </param>
105 public static WorkItem CreateWorkItem( 106 /// <param name="workItemPriority">The work item priority</param>
106 IWorkItemsGroup workItemsGroup, 107 /// <returns>Returns a work item</returns>
107 WIGStartInfo wigStartInfo, 108 public static WorkItem CreateWorkItem(
108 WorkItemCallback callback, 109 IWorkItemsGroup workItemsGroup,
109 object state, 110 WIGStartInfo wigStartInfo,
110 WorkItemPriority workItemPriority) 111 WorkItemCallback callback,
111 { 112 object state,
112 ValidateCallback(callback); 113 WorkItemPriority workItemPriority)
113 114 {
114 WorkItemInfo workItemInfo = new WorkItemInfo(); 115 ValidateCallback(callback);
115 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 116
116 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 117 WorkItemInfo workItemInfo = new WorkItemInfo();
117 workItemInfo.PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback; 118 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
118 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute; 119 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
119 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 120 workItemInfo.PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback;
120 workItemInfo.WorkItemPriority = workItemPriority; 121 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
121 122 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
122 WorkItem workItem = new WorkItem( 123 workItemInfo.WorkItemPriority = workItemPriority;
123 workItemsGroup, 124
124 workItemInfo, 125 WorkItem workItem = new WorkItem(
125 callback, 126 workItemsGroup,
126 state); 127 workItemInfo,
127 128 callback,
128 return workItem; 129 state);
129 } 130
130 131 return workItem;
131 /// <summary> 132 }
132 /// Create a new work item 133
133 /// </summary> 134 /// <summary>
134 /// <param name="wigStartInfo">Work item group start information</param> 135 /// Create a new work item
135 /// <param name="workItemInfo">Work item information</param> 136 /// </summary>
136 /// <param name="callback">A callback to execute</param> 137 /// <param name="workItemsGroup">The work items group</param>
137 /// <param name="state"> 138 /// <param name="wigStartInfo">Work item group start information</param>
138 /// The context object of the work item. Used for passing arguments to the work item. 139 /// <param name="workItemInfo">Work item information</param>
139 /// </param> 140 /// <param name="callback">A callback to execute</param>
140 /// <returns>Returns a work item</returns> 141 /// <param name="state">
142 /// The context object of the work item. Used for passing arguments to the work item.
143 /// </param>
144 /// <returns>Returns a work item</returns>
141 public static WorkItem CreateWorkItem( 145 public static WorkItem CreateWorkItem(
142 IWorkItemsGroup workItemsGroup, 146 IWorkItemsGroup workItemsGroup,
143 WIGStartInfo wigStartInfo, 147 WIGStartInfo wigStartInfo,
144 WorkItemInfo workItemInfo, 148 WorkItemInfo workItemInfo,
145 WorkItemCallback callback, 149 WorkItemCallback callback,
146 object state) 150 object state)
147 { 151 {
148 ValidateCallback(callback); 152 ValidateCallback(callback);
@@ -151,183 +155,189 @@ namespace Amib.Threading.Internal
151 WorkItem workItem = new WorkItem( 155 WorkItem workItem = new WorkItem(
152 workItemsGroup, 156 workItemsGroup,
153 new WorkItemInfo(workItemInfo), 157 new WorkItemInfo(workItemInfo),
154 callback, 158 callback,
155 state); 159 state);
156 160
157 return workItem; 161 return workItem;
158 } 162 }
159 163
160 /// <summary> 164 /// <summary>
161 /// Create a new work item 165 /// Create a new work item
162 /// </summary> 166 /// </summary>
163 /// <param name="wigStartInfo">Work item group start information</param> 167 /// <param name="workItemsGroup">The work items group</param>
164 /// <param name="callback">A callback to execute</param> 168 /// <param name="wigStartInfo">Work item group start information</param>
165 /// <param name="state"> 169 /// <param name="callback">A callback to execute</param>
166 /// The context object of the work item. Used for passing arguments to the work item. 170 /// <param name="state">
167 /// </param> 171 /// The context object of the work item. Used for passing arguments to the work item.
168 /// <param name="postExecuteWorkItemCallback"> 172 /// </param>
169 /// A delegate to call after the callback completion 173 /// <param name="postExecuteWorkItemCallback">
170 /// </param> 174 /// A delegate to call after the callback completion
171 /// <returns>Returns a work item</returns> 175 /// </param>
172 public static WorkItem CreateWorkItem( 176 /// <returns>Returns a work item</returns>
173 IWorkItemsGroup workItemsGroup, 177 public static WorkItem CreateWorkItem(
174 WIGStartInfo wigStartInfo, 178 IWorkItemsGroup workItemsGroup,
175 WorkItemCallback callback, 179 WIGStartInfo wigStartInfo,
176 object state, 180 WorkItemCallback callback,
177 PostExecuteWorkItemCallback postExecuteWorkItemCallback) 181 object state,
178 { 182 PostExecuteWorkItemCallback postExecuteWorkItemCallback)
179 ValidateCallback(callback); 183 {
180 ValidateCallback(postExecuteWorkItemCallback); 184 ValidateCallback(callback);
181 185 ValidateCallback(postExecuteWorkItemCallback);
182 WorkItemInfo workItemInfo = new WorkItemInfo(); 186
183 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 187 WorkItemInfo workItemInfo = new WorkItemInfo();
184 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 188 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
185 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback; 189 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
186 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute; 190 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
187 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 191 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
188 192 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
189 WorkItem workItem = new WorkItem( 193 workItemInfo.WorkItemPriority = wigStartInfo.WorkItemPriority;
190 workItemsGroup, 194
191 workItemInfo, 195 WorkItem workItem = new WorkItem(
192 callback, 196 workItemsGroup,
193 state); 197 workItemInfo,
194 198 callback,
195 return workItem; 199 state);
196 } 200
197 201 return workItem;
198 /// <summary> 202 }
199 /// Create a new work item 203
200 /// </summary> 204 /// <summary>
201 /// <param name="wigStartInfo">Work item group start information</param> 205 /// Create a new work item
202 /// <param name="callback">A callback to execute</param> 206 /// </summary>
203 /// <param name="state"> 207 /// <param name="workItemsGroup">The work items group</param>
204 /// The context object of the work item. Used for passing arguments to the work item. 208 /// <param name="wigStartInfo">Work item group start information</param>
205 /// </param> 209 /// <param name="callback">A callback to execute</param>
206 /// <param name="postExecuteWorkItemCallback"> 210 /// <param name="state">
207 /// A delegate to call after the callback completion 211 /// The context object of the work item. Used for passing arguments to the work item.
208 /// </param> 212 /// </param>
209 /// <param name="workItemPriority">The work item priority</param> 213 /// <param name="postExecuteWorkItemCallback">
210 /// <returns>Returns a work item</returns> 214 /// A delegate to call after the callback completion
211 public static WorkItem CreateWorkItem( 215 /// </param>
212 IWorkItemsGroup workItemsGroup, 216 /// <param name="workItemPriority">The work item priority</param>
213 WIGStartInfo wigStartInfo, 217 /// <returns>Returns a work item</returns>
214 WorkItemCallback callback, 218 public static WorkItem CreateWorkItem(
215 object state, 219 IWorkItemsGroup workItemsGroup,
216 PostExecuteWorkItemCallback postExecuteWorkItemCallback, 220 WIGStartInfo wigStartInfo,
217 WorkItemPriority workItemPriority) 221 WorkItemCallback callback,
218 { 222 object state,
219 ValidateCallback(callback); 223 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
220 ValidateCallback(postExecuteWorkItemCallback); 224 WorkItemPriority workItemPriority)
221 225 {
222 WorkItemInfo workItemInfo = new WorkItemInfo(); 226 ValidateCallback(callback);
223 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 227 ValidateCallback(postExecuteWorkItemCallback);
224 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 228
225 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback; 229 WorkItemInfo workItemInfo = new WorkItemInfo();
226 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute; 230 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
227 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 231 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
228 workItemInfo.WorkItemPriority = workItemPriority; 232 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
229 233 workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
230 WorkItem workItem = new WorkItem( 234 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
231 workItemsGroup, 235 workItemInfo.WorkItemPriority = workItemPriority;
232 workItemInfo, 236
233 callback, 237 WorkItem workItem = new WorkItem(
234 state); 238 workItemsGroup,
235 239 workItemInfo,
236 return workItem; 240 callback,
237 } 241 state);
238 242
239 /// <summary> 243 return workItem;
240 /// Create a new work item 244 }
241 /// </summary> 245
242 /// <param name="wigStartInfo">Work item group start information</param> 246 /// <summary>
243 /// <param name="callback">A callback to execute</param> 247 /// Create a new work item
244 /// <param name="state"> 248 /// </summary>
245 /// The context object of the work item. Used for passing arguments to the work item. 249 /// <param name="workItemsGroup">The work items group</param>
246 /// </param> 250 /// <param name="wigStartInfo">Work item group start information</param>
247 /// <param name="postExecuteWorkItemCallback"> 251 /// <param name="callback">A callback to execute</param>
248 /// A delegate to call after the callback completion 252 /// <param name="state">
249 /// </param> 253 /// The context object of the work item. Used for passing arguments to the work item.
250 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param> 254 /// </param>
251 /// <returns>Returns a work item</returns> 255 /// <param name="postExecuteWorkItemCallback">
252 public static WorkItem CreateWorkItem( 256 /// A delegate to call after the callback completion
253 IWorkItemsGroup workItemsGroup, 257 /// </param>
254 WIGStartInfo wigStartInfo, 258 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
255 WorkItemCallback callback, 259 /// <returns>Returns a work item</returns>
256 object state, 260 public static WorkItem CreateWorkItem(
257 PostExecuteWorkItemCallback postExecuteWorkItemCallback, 261 IWorkItemsGroup workItemsGroup,
258 CallToPostExecute callToPostExecute) 262 WIGStartInfo wigStartInfo,
259 { 263 WorkItemCallback callback,
260 ValidateCallback(callback); 264 object state,
261 ValidateCallback(postExecuteWorkItemCallback); 265 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
262 266 CallToPostExecute callToPostExecute)
263 WorkItemInfo workItemInfo = new WorkItemInfo(); 267 {
264 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 268 ValidateCallback(callback);
265 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 269 ValidateCallback(postExecuteWorkItemCallback);
266 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback; 270
267 workItemInfo.CallToPostExecute = callToPostExecute; 271 WorkItemInfo workItemInfo = new WorkItemInfo();
268 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 272 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
269 273 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
270 WorkItem workItem = new WorkItem( 274 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
271 workItemsGroup, 275 workItemInfo.CallToPostExecute = callToPostExecute;
272 workItemInfo, 276 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
273 callback, 277 workItemInfo.WorkItemPriority = wigStartInfo.WorkItemPriority;
274 state); 278
275 279 WorkItem workItem = new WorkItem(
276 return workItem; 280 workItemsGroup,
277 } 281 workItemInfo,
278 282 callback,
279 /// <summary> 283 state);
280 /// Create a new work item 284
281 /// </summary> 285 return workItem;
282 /// <param name="wigStartInfo">Work item group start information</param> 286 }
283 /// <param name="callback">A callback to execute</param> 287
284 /// <param name="state"> 288 /// <summary>
285 /// The context object of the work item. Used for passing arguments to the work item. 289 /// Create a new work item
286 /// </param> 290 /// </summary>
287 /// <param name="postExecuteWorkItemCallback"> 291 /// <param name="workItemsGroup">The work items group</param>
288 /// A delegate to call after the callback completion 292 /// <param name="wigStartInfo">Work item group start information</param>
289 /// </param> 293 /// <param name="callback">A callback to execute</param>
290 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param> 294 /// <param name="state">
291 /// <param name="workItemPriority">The work item priority</param> 295 /// The context object of the work item. Used for passing arguments to the work item.
292 /// <returns>Returns a work item</returns> 296 /// </param>
293 public static WorkItem CreateWorkItem( 297 /// <param name="postExecuteWorkItemCallback">
294 IWorkItemsGroup workItemsGroup, 298 /// A delegate to call after the callback completion
295 WIGStartInfo wigStartInfo, 299 /// </param>
296 WorkItemCallback callback, 300 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
297 object state, 301 /// <param name="workItemPriority">The work item priority</param>
298 PostExecuteWorkItemCallback postExecuteWorkItemCallback, 302 /// <returns>Returns a work item</returns>
299 CallToPostExecute callToPostExecute, 303 public static WorkItem CreateWorkItem(
300 WorkItemPriority workItemPriority) 304 IWorkItemsGroup workItemsGroup,
301 { 305 WIGStartInfo wigStartInfo,
302 306 WorkItemCallback callback,
303 ValidateCallback(callback); 307 object state,
304 ValidateCallback(postExecuteWorkItemCallback); 308 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
305 309 CallToPostExecute callToPostExecute,
306 WorkItemInfo workItemInfo = new WorkItemInfo(); 310 WorkItemPriority workItemPriority)
307 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext; 311 {
308 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext; 312
309 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback; 313 ValidateCallback(callback);
310 workItemInfo.CallToPostExecute = callToPostExecute; 314 ValidateCallback(postExecuteWorkItemCallback);
311 workItemInfo.WorkItemPriority = workItemPriority; 315
312 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects; 316 WorkItemInfo workItemInfo = new WorkItemInfo();
313 317 workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
314 WorkItem workItem = new WorkItem( 318 workItemInfo.UseCallerHttpContext = wigStartInfo.UseCallerHttpContext;
315 workItemsGroup, 319 workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
316 workItemInfo, 320 workItemInfo.CallToPostExecute = callToPostExecute;
317 callback, 321 workItemInfo.WorkItemPriority = workItemPriority;
318 state); 322 workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
319 323
320 return workItem; 324 WorkItem workItem = new WorkItem(
321 } 325 workItemsGroup,
322 326 workItemInfo,
323 private static void ValidateCallback(Delegate callback) 327 callback,
324 { 328 state);
325 if(callback.GetInvocationList().Length > 1) 329
326 { 330 return workItem;
327 throw new NotSupportedException("SmartThreadPool doesn't support delegates chains"); 331 }
328 } 332
329 } 333 private static void ValidateCallback(Delegate callback)
330 } 334 {
331 335 if (callback != null && callback.GetInvocationList().Length > 1)
332 #endregion 336 {
337 throw new NotSupportedException("SmartThreadPool doesn't support delegates chains");
338 }
339 }
340 }
341
342 #endregion
333} 343}
diff --git a/ThirdParty/SmartThreadPool/WorkItemInfo.cs b/ThirdParty/SmartThreadPool/WorkItemInfo.cs
index c259339..0d7fc85 100644
--- a/ThirdParty/SmartThreadPool/WorkItemInfo.cs
+++ b/ThirdParty/SmartThreadPool/WorkItemInfo.cs
@@ -1,102 +1,69 @@
1// Ami Bar
2// amibar@gmail.com
3
4namespace Amib.Threading 1namespace Amib.Threading
5{ 2{
6 #region WorkItemInfo class 3 #region WorkItemInfo class
7
8 /// <summary>
9 /// Summary description for WorkItemInfo.
10 /// </summary>
11 public class WorkItemInfo
12 {
13 /// <summary>
14 /// Use the caller's security context
15 /// </summary>
16 private bool _useCallerCallContext;
17
18 /// <summary>
19 /// Use the caller's security context
20 /// </summary>
21 private bool _useCallerHttpContext;
22
23 /// <summary>
24 /// Dispose of the state object of a work item
25 /// </summary>
26 private bool _disposeOfStateObjects;
27
28 /// <summary>
29 /// The option to run the post execute
30 /// </summary>
31 private CallToPostExecute _callToPostExecute;
32 4
33 /// <summary> 5 /// <summary>
34 /// A post execute callback to call when none is provided in 6 /// Summary description for WorkItemInfo.
35 /// the QueueWorkItem method. 7 /// </summary>
36 /// </summary> 8 public class WorkItemInfo
37 private PostExecuteWorkItemCallback _postExecuteWorkItemCallback; 9 {
38 10 public WorkItemInfo()
39 /// <summary> 11 {
40 /// The priority of the work item 12 UseCallerCallContext = SmartThreadPool.DefaultUseCallerCallContext;
41 /// </summary> 13 UseCallerHttpContext = SmartThreadPool.DefaultUseCallerHttpContext;
42 private WorkItemPriority _workItemPriority; 14 DisposeOfStateObjects = SmartThreadPool.DefaultDisposeOfStateObjects;
15 CallToPostExecute = SmartThreadPool.DefaultCallToPostExecute;
16 PostExecuteWorkItemCallback = SmartThreadPool.DefaultPostExecuteWorkItemCallback;
17 WorkItemPriority = SmartThreadPool.DefaultWorkItemPriority;
18 }
43 19
44 public WorkItemInfo() 20 public WorkItemInfo(WorkItemInfo workItemInfo)
45 { 21 {
46 _useCallerCallContext = SmartThreadPool.DefaultUseCallerCallContext; 22 UseCallerCallContext = workItemInfo.UseCallerCallContext;
47 _useCallerHttpContext = SmartThreadPool.DefaultUseCallerHttpContext; 23 UseCallerHttpContext = workItemInfo.UseCallerHttpContext;
48 _disposeOfStateObjects = SmartThreadPool.DefaultDisposeOfStateObjects; 24 DisposeOfStateObjects = workItemInfo.DisposeOfStateObjects;
49 _callToPostExecute = SmartThreadPool.DefaultCallToPostExecute; 25 CallToPostExecute = workItemInfo.CallToPostExecute;
50 _postExecuteWorkItemCallback = SmartThreadPool.DefaultPostExecuteWorkItemCallback; 26 PostExecuteWorkItemCallback = workItemInfo.PostExecuteWorkItemCallback;
51 _workItemPriority = SmartThreadPool.DefaultWorkItemPriority; 27 WorkItemPriority = workItemInfo.WorkItemPriority;
52 } 28 Timeout = workItemInfo.Timeout;
29 }
53 30
54 public WorkItemInfo(WorkItemInfo workItemInfo) 31 /// <summary>
55 { 32 /// Get/Set if to use the caller's security context
56 _useCallerCallContext = workItemInfo._useCallerCallContext; 33 /// </summary>
57 _useCallerHttpContext = workItemInfo._useCallerHttpContext; 34 public bool UseCallerCallContext { get; set; }
58 _disposeOfStateObjects = workItemInfo._disposeOfStateObjects;
59 _callToPostExecute = workItemInfo._callToPostExecute;
60 _postExecuteWorkItemCallback = workItemInfo._postExecuteWorkItemCallback;
61 _workItemPriority = workItemInfo._workItemPriority;
62 }
63 35
64 public bool UseCallerCallContext 36 /// <summary>
65 { 37 /// Get/Set if to use the caller's HTTP context
66 get { return _useCallerCallContext; } 38 /// </summary>
67 set { _useCallerCallContext = value; } 39 public bool UseCallerHttpContext { get; set; }
68 }
69 40
70 public bool UseCallerHttpContext 41 /// <summary>
71 { 42 /// Get/Set if to dispose of the state object of a work item
72 get { return _useCallerHttpContext; } 43 /// </summary>
73 set { _useCallerHttpContext = value; } 44 public bool DisposeOfStateObjects { get; set; }
74 }
75 45
76 public bool DisposeOfStateObjects 46 /// <summary>
77 { 47 /// Get/Set the run the post execute options
78 get { return _disposeOfStateObjects; } 48 /// </summary>
79 set { _disposeOfStateObjects = value; } 49 public CallToPostExecute CallToPostExecute { get; set; }
80 }
81 50
82 public CallToPostExecute CallToPostExecute 51 /// <summary>
83 { 52 /// Get/Set the post execute callback
84 get { return _callToPostExecute; } 53 /// </summary>
85 set { _callToPostExecute = value; } 54 public PostExecuteWorkItemCallback PostExecuteWorkItemCallback { get; set; }
86 }
87 55
88 public PostExecuteWorkItemCallback PostExecuteWorkItemCallback 56 /// <summary>
89 { 57 /// Get/Set the work item's priority
90 get { return _postExecuteWorkItemCallback; } 58 /// </summary>
91 set { _postExecuteWorkItemCallback = value; } 59 public WorkItemPriority WorkItemPriority { get; set; }
92 }
93 60
94 public WorkItemPriority WorkItemPriority 61 /// <summary>
95 { 62 /// Get/Set the work item's timout in milliseconds.
96 get { return _workItemPriority; } 63 /// This is a passive timout. When the timout expires the work item won't be actively aborted!
97 set { _workItemPriority = value; } 64 /// </summary>
98 } 65 public long Timeout { get; set; }
99 } 66 }
100 67
101 #endregion 68 #endregion
102} 69}
diff --git a/ThirdParty/SmartThreadPool/WorkItemResultTWrapper.cs b/ThirdParty/SmartThreadPool/WorkItemResultTWrapper.cs
new file mode 100644
index 0000000..d1eff95
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/WorkItemResultTWrapper.cs
@@ -0,0 +1,128 @@
1using System;
2using System.Threading;
3
4namespace Amib.Threading.Internal
5{
6 #region WorkItemResultTWrapper class
7
8 internal class WorkItemResultTWrapper<TResult> : IWorkItemResult<TResult>, IInternalWaitableResult
9 {
10 private readonly IWorkItemResult _workItemResult;
11
12 public WorkItemResultTWrapper(IWorkItemResult workItemResult)
13 {
14 _workItemResult = workItemResult;
15 }
16
17 #region IWorkItemResult<TResult> Members
18
19 public TResult GetResult()
20 {
21 return (TResult)_workItemResult.GetResult();
22 }
23
24 public TResult GetResult(int millisecondsTimeout, bool exitContext)
25 {
26 return (TResult)_workItemResult.GetResult(millisecondsTimeout, exitContext);
27 }
28
29 public TResult GetResult(TimeSpan timeout, bool exitContext)
30 {
31 return (TResult)_workItemResult.GetResult(timeout, exitContext);
32 }
33
34 public TResult GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle)
35 {
36 return (TResult)_workItemResult.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle);
37 }
38
39 public TResult GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle)
40 {
41 return (TResult)_workItemResult.GetResult(timeout, exitContext, cancelWaitHandle);
42 }
43
44 public TResult GetResult(out Exception e)
45 {
46 return (TResult)_workItemResult.GetResult(out e);
47 }
48
49 public TResult GetResult(int millisecondsTimeout, bool exitContext, out Exception e)
50 {
51 return (TResult)_workItemResult.GetResult(millisecondsTimeout, exitContext, out e);
52 }
53
54 public TResult GetResult(TimeSpan timeout, bool exitContext, out Exception e)
55 {
56 return (TResult)_workItemResult.GetResult(timeout, exitContext, out e);
57 }
58
59 public TResult GetResult(int millisecondsTimeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
60 {
61 return (TResult)_workItemResult.GetResult(millisecondsTimeout, exitContext, cancelWaitHandle, out e);
62 }
63
64 public TResult GetResult(TimeSpan timeout, bool exitContext, WaitHandle cancelWaitHandle, out Exception e)
65 {
66 return (TResult)_workItemResult.GetResult(timeout, exitContext, cancelWaitHandle, out e);
67 }
68
69 public bool IsCompleted
70 {
71 get { return _workItemResult.IsCompleted; }
72 }
73
74 public bool IsCanceled
75 {
76 get { return _workItemResult.IsCanceled; }
77 }
78
79 public object State
80 {
81 get { return _workItemResult.State; }
82 }
83
84 public bool Cancel()
85 {
86 return _workItemResult.Cancel();
87 }
88
89 public bool Cancel(bool abortExecution)
90 {
91 return _workItemResult.Cancel(abortExecution);
92 }
93
94 public WorkItemPriority WorkItemPriority
95 {
96 get { return _workItemResult.WorkItemPriority; }
97 }
98
99 public TResult Result
100 {
101 get { return (TResult)_workItemResult.Result; }
102 }
103
104 public object Exception
105 {
106 get { return (TResult)_workItemResult.Exception; }
107 }
108
109 #region IInternalWorkItemResult Members
110
111 public IWorkItemResult GetWorkItemResult()
112 {
113 return _workItemResult.GetWorkItemResult();
114 }
115
116 public IWorkItemResult<TRes> GetWorkItemResultT<TRes>()
117 {
118 return (IWorkItemResult<TRes>)this;
119 }
120
121 #endregion
122
123 #endregion
124 }
125
126 #endregion
127
128}
diff --git a/ThirdParty/SmartThreadPool/WorkItemsGroup.cs b/ThirdParty/SmartThreadPool/WorkItemsGroup.cs
index 01ac8dd..d9d34ac 100644
--- a/ThirdParty/SmartThreadPool/WorkItemsGroup.cs
+++ b/ThirdParty/SmartThreadPool/WorkItemsGroup.cs
@@ -1,6 +1,3 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
5using System.Threading; 2using System.Threading;
6using System.Runtime.CompilerServices; 3using System.Runtime.CompilerServices;
@@ -8,505 +5,357 @@ using System.Diagnostics;
8 5
9namespace Amib.Threading.Internal 6namespace Amib.Threading.Internal
10{ 7{
11 #region WorkItemsGroup class
12
13 /// <summary>
14 /// Summary description for WorkItemsGroup.
15 /// </summary>
16 public class WorkItemsGroup : IWorkItemsGroup
17 {
18 #region Private members
19
20 private object _lock = new object();
21 /// <summary>
22 /// Contains the name of this instance of SmartThreadPool.
23 /// Can be changed by the user.
24 /// </summary>
25 private string _name = "WorkItemsGroup";
26
27 /// <summary>
28 /// A reference to the SmartThreadPool instance that created this
29 /// WorkItemsGroup.
30 /// </summary>
31 private SmartThreadPool _stp;
32
33 /// <summary>
34 /// The OnIdle event
35 /// </summary>
36 private event WorkItemsGroupIdleHandler _onIdle;
37 8
38 /// <summary> 9 #region WorkItemsGroup class
39 /// Defines how many work items of this WorkItemsGroup can run at once.
40 /// </summary>
41 private int _concurrency;
42 10
43 /// <summary> 11 /// <summary>
44 /// Priority queue to hold work items before they are passed 12 /// Summary description for WorkItemsGroup.
45 /// to the SmartThreadPool. 13 /// </summary>
46 /// </summary> 14 public class WorkItemsGroup : WorkItemsGroupBase
47 private PriorityQueue _workItemsQueue; 15 {
16 #region Private members
48 17
49 /// <summary> 18 private readonly object _lock = new object();
50 /// Indicate how many work items are waiting in the SmartThreadPool
51 /// queue.
52 /// This value is used to apply the concurrency.
53 /// </summary>
54 private int _workItemsInStpQueue;
55 19
56 /// <summary> 20 /// <summary>
57 /// Indicate how many work items are currently running in the SmartThreadPool. 21 /// A reference to the SmartThreadPool instance that created this
58 /// This value is used with the Cancel, to calculate if we can send new 22 /// WorkItemsGroup.
59 /// work items to the STP. 23 /// </summary>
60 /// </summary> 24 private readonly SmartThreadPool _stp;
61 private int _workItemsExecutingInStp = 0;
62 25
63 /// <summary> 26 /// <summary>
64 /// WorkItemsGroup start information 27 /// The OnIdle event
65 /// </summary> 28 /// </summary>
66 private WIGStartInfo _workItemsGroupStartInfo; 29 private event WorkItemsGroupIdleHandler _onIdle;
67 30
68 /// <summary> 31 /// <summary>
69 /// Signaled when all of the WorkItemsGroup's work item completed. 32 /// A flag to indicate if the Work Items Group is now suspended.
70 /// </summary> 33 /// </summary>
71 private ManualResetEvent _isIdleWaitHandle = new ManualResetEvent(true); 34 private bool _isSuspended;
72 35
73 /// <summary> 36 /// <summary>
74 /// A common object for all the work items that this work items group 37 /// Defines how many work items of this WorkItemsGroup can run at once.
75 /// generate so we can mark them to cancel in O(1) 38 /// </summary>
76 /// </summary> 39 private int _concurrency;
77 private CanceledWorkItemsGroup _canceledWorkItemsGroup = new CanceledWorkItemsGroup(); 40
78 41 /// <summary>
79 #endregion 42 /// Priority queue to hold work items before they are passed
80 43 /// to the SmartThreadPool.
81 #region Construction 44 /// </summary>
82 45 private readonly PriorityQueue _workItemsQueue;
83 public WorkItemsGroup( 46
84 SmartThreadPool stp, 47 /// <summary>
85 int concurrency, 48 /// Indicate how many work items are waiting in the SmartThreadPool
86 WIGStartInfo wigStartInfo) 49 /// queue.
50 /// This value is used to apply the concurrency.
51 /// </summary>
52 private int _workItemsInStpQueue;
53
54 /// <summary>
55 /// Indicate how many work items are currently running in the SmartThreadPool.
56 /// This value is used with the Cancel, to calculate if we can send new
57 /// work items to the STP.
58 /// </summary>
59 private int _workItemsExecutingInStp = 0;
60
61 /// <summary>
62 /// WorkItemsGroup start information
63 /// </summary>
64 private readonly WIGStartInfo _workItemsGroupStartInfo;
65
66 /// <summary>
67 /// Signaled when all of the WorkItemsGroup's work item completed.
68 /// </summary>
69 //private readonly ManualResetEvent _isIdleWaitHandle = new ManualResetEvent(true);
70 private readonly ManualResetEvent _isIdleWaitHandle = EventWaitHandleFactory.CreateManualResetEvent(true);
71
72 /// <summary>
73 /// A common object for all the work items that this work items group
74 /// generate so we can mark them to cancel in O(1)
75 /// </summary>
76 private CanceledWorkItemsGroup _canceledWorkItemsGroup = new CanceledWorkItemsGroup();
77
78 #endregion
79
80 #region Construction
81
82 public WorkItemsGroup(
83 SmartThreadPool stp,
84 int concurrency,
85 WIGStartInfo wigStartInfo)
86 {
87 if (concurrency <= 0)
88 {
89 throw new ArgumentOutOfRangeException(
90 "concurrency",
91#if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE)
92 concurrency,
93#endif
94 "concurrency must be greater than zero");
95 }
96 _stp = stp;
97 _concurrency = concurrency;
98 _workItemsGroupStartInfo = new WIGStartInfo(wigStartInfo).AsReadOnly();
99 _workItemsQueue = new PriorityQueue();
100 Name = "WorkItemsGroup";
101
102 // The _workItemsInStpQueue gets the number of currently executing work items,
103 // because once a work item is executing, it cannot be cancelled.
104 _workItemsInStpQueue = _workItemsExecutingInStp;
105
106 _isSuspended = _workItemsGroupStartInfo.StartSuspended;
107 }
108
109 #endregion
110
111 #region WorkItemsGroupBase Overrides
112
113 public override int Concurrency
87 { 114 {
88 if (concurrency <= 0) 115 get { return _concurrency; }
89 {
90 throw new ArgumentOutOfRangeException("concurrency", concurrency, "concurrency must be greater than zero");
91 }
92 _stp = stp;
93 _concurrency = concurrency;
94 _workItemsGroupStartInfo = new WIGStartInfo(wigStartInfo);
95 _workItemsQueue = new PriorityQueue();
96
97 // The _workItemsInStpQueue gets the number of currently executing work items,
98 // because once a work item is executing, it cannot be cancelled.
99 _workItemsInStpQueue = _workItemsExecutingInStp;
100 }
101
102 #endregion
103
104 #region IWorkItemsGroup implementation
105
106 /// <summary>
107 /// Get/Set the name of the SmartThreadPool instance
108 /// </summary>
109 public string Name
110 {
111 get
112 {
113 return _name;
114 }
115
116 set 116 set
117 { 117 {
118 _name = value; 118 Debug.Assert(value > 0);
119 }
120 }
121
122 /// <summary>
123 /// Queue a work item
124 /// </summary>
125 /// <param name="callback">A callback to execute</param>
126 /// <returns>Returns a work item result</returns>
127 public IWorkItemResult QueueWorkItem(WorkItemCallback callback)
128 {
129 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback);
130 EnqueueToSTPNextWorkItem(workItem);
131 return workItem.GetWorkItemResult();
132 }
133 119
134 /// <summary> 120 int diff = value - _concurrency;
135 /// Queue a work item 121 _concurrency = value;
136 /// </summary> 122 if (diff > 0)
137 /// <param name="callback">A callback to execute</param> 123 {
138 /// <param name="workItemPriority">The priority of the work item</param> 124 EnqueueToSTPNextNWorkItem(diff);
139 /// <returns>Returns a work item result</returns> 125 }
140 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority) 126 }
141 {
142 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, workItemPriority);
143 EnqueueToSTPNextWorkItem(workItem);
144 return workItem.GetWorkItemResult();
145 }
146
147 /// <summary>
148 /// Queue a work item
149 /// </summary>
150 /// <param name="workItemInfo">Work item info</param>
151 /// <param name="callback">A callback to execute</param>
152 /// <returns>Returns a work item result</returns>
153 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback)
154 {
155 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, workItemInfo, callback);
156 EnqueueToSTPNextWorkItem(workItem);
157 return workItem.GetWorkItemResult();
158 }
159
160 /// <summary>
161 /// Queue a work item
162 /// </summary>
163 /// <param name="callback">A callback to execute</param>
164 /// <param name="state">
165 /// The context object of the work item. Used for passing arguments to the work item.
166 /// </param>
167 /// <returns>Returns a work item result</returns>
168 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state)
169 {
170 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state);
171 EnqueueToSTPNextWorkItem(workItem);
172 return workItem.GetWorkItemResult();
173 }
174
175 /// <summary>
176 /// Queue a work item
177 /// </summary>
178 /// <param name="callback">A callback to execute</param>
179 /// <param name="state">
180 /// The context object of the work item. Used for passing arguments to the work item.
181 /// </param>
182 /// <param name="workItemPriority">The work item priority</param>
183 /// <returns>Returns a work item result</returns>
184 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority)
185 {
186 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state, workItemPriority);
187 EnqueueToSTPNextWorkItem(workItem);
188 return workItem.GetWorkItemResult();
189 }
190
191 /// <summary>
192 /// Queue a work item
193 /// </summary>
194 /// <param name="workItemInfo">Work item information</param>
195 /// <param name="callback">A callback to execute</param>
196 /// <param name="state">
197 /// The context object of the work item. Used for passing arguments to the work item.
198 /// </param>
199 /// <returns>Returns a work item result</returns>
200 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state)
201 {
202 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, workItemInfo, callback, state);
203 EnqueueToSTPNextWorkItem(workItem);
204 return workItem.GetWorkItemResult();
205 }
206
207 /// <summary>
208 /// Queue a work item
209 /// </summary>
210 /// <param name="callback">A callback to execute</param>
211 /// <param name="state">
212 /// The context object of the work item. Used for passing arguments to the work item.
213 /// </param>
214 /// <param name="postExecuteWorkItemCallback">
215 /// A delegate to call after the callback completion
216 /// </param>
217 /// <returns>Returns a work item result</returns>
218 public IWorkItemResult QueueWorkItem(
219 WorkItemCallback callback,
220 object state,
221 PostExecuteWorkItemCallback postExecuteWorkItemCallback)
222 {
223 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state, postExecuteWorkItemCallback);
224 EnqueueToSTPNextWorkItem(workItem);
225 return workItem.GetWorkItemResult();
226 }
227
228 /// <summary>
229 /// Queue a work item
230 /// </summary>
231 /// <param name="callback">A callback to execute</param>
232 /// <param name="state">
233 /// The context object of the work item. Used for passing arguments to the work item.
234 /// </param>
235 /// <param name="postExecuteWorkItemCallback">
236 /// A delegate to call after the callback completion
237 /// </param>
238 /// <param name="workItemPriority">The work item priority</param>
239 /// <returns>Returns a work item result</returns>
240 public IWorkItemResult QueueWorkItem(
241 WorkItemCallback callback,
242 object state,
243 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
244 WorkItemPriority workItemPriority)
245 {
246 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state, postExecuteWorkItemCallback, workItemPriority);
247 EnqueueToSTPNextWorkItem(workItem);
248 return workItem.GetWorkItemResult();
249 }
250
251 /// <summary>
252 /// Queue a work item
253 /// </summary>
254 /// <param name="callback">A callback to execute</param>
255 /// <param name="state">
256 /// The context object of the work item. Used for passing arguments to the work item.
257 /// </param>
258 /// <param name="postExecuteWorkItemCallback">
259 /// A delegate to call after the callback completion
260 /// </param>
261 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
262 /// <returns>Returns a work item result</returns>
263 public IWorkItemResult QueueWorkItem(
264 WorkItemCallback callback,
265 object state,
266 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
267 CallToPostExecute callToPostExecute)
268 {
269 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute);
270 EnqueueToSTPNextWorkItem(workItem);
271 return workItem.GetWorkItemResult();
272 } 127 }
273 128
274 /// <summary> 129 public override int WaitingCallbacks
275 /// Queue a work item
276 /// </summary>
277 /// <param name="callback">A callback to execute</param>
278 /// <param name="state">
279 /// The context object of the work item. Used for passing arguments to the work item.
280 /// </param>
281 /// <param name="postExecuteWorkItemCallback">
282 /// A delegate to call after the callback completion
283 /// </param>
284 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
285 /// <param name="workItemPriority">The work item priority</param>
286 /// <returns>Returns a work item result</returns>
287 public IWorkItemResult QueueWorkItem(
288 WorkItemCallback callback,
289 object state,
290 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
291 CallToPostExecute callToPostExecute,
292 WorkItemPriority workItemPriority)
293 { 130 {
294 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, _workItemsGroupStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute, workItemPriority); 131 get { return _workItemsQueue.Count; }
295 EnqueueToSTPNextWorkItem(workItem);
296 return workItem.GetWorkItemResult();
297 } 132 }
298 133
299 /// <summary> 134 public override object[] GetStates()
300 /// Wait for the thread pool to be idle
301 /// </summary>
302 public void WaitForIdle()
303 { 135 {
304 WaitForIdle(Timeout.Infinite); 136 lock (_lock)
137 {
138 object[] states = new object[_workItemsQueue.Count];
139 int i = 0;
140 foreach (WorkItem workItem in _workItemsQueue)
141 {
142 states[i] = workItem.GetWorkItemResult().State;
143 ++i;
144 }
145 return states;
146 }
305 } 147 }
306 148
307 /// <summary> 149 /// <summary>
308 /// Wait for the thread pool to be idle 150 /// WorkItemsGroup start information
309 /// </summary> 151 /// </summary>
310 public bool WaitForIdle(TimeSpan timeout) 152 public override WIGStartInfo WIGStartInfo
311 { 153 {
312 return WaitForIdle((int)timeout.TotalMilliseconds); 154 get { return _workItemsGroupStartInfo; }
313 } 155 }
314 156
315 /// <summary> 157 /// <summary>
158 /// Start the Work Items Group if it was started suspended
159 /// </summary>
160 public override void Start()
161 {
162 // If the Work Items Group already started then quit
163 if (!_isSuspended)
164 {
165 return;
166 }
167 _isSuspended = false;
168
169 EnqueueToSTPNextNWorkItem(Math.Min(_workItemsQueue.Count, _concurrency));
170 }
171
172 public override void Cancel(bool abortExecution)
173 {
174 lock (_lock)
175 {
176 _canceledWorkItemsGroup.IsCanceled = true;
177 _workItemsQueue.Clear();
178 _workItemsInStpQueue = 0;
179 _canceledWorkItemsGroup = new CanceledWorkItemsGroup();
180 }
181
182 if (abortExecution)
183 {
184 _stp.CancelAbortWorkItemsGroup(this);
185 }
186 }
187
188 /// <summary>
316 /// Wait for the thread pool to be idle 189 /// Wait for the thread pool to be idle
317 /// </summary> 190 /// </summary>
318 public bool WaitForIdle(int millisecondsTimeout) 191 public override bool WaitForIdle(int millisecondsTimeout)
319 { 192 {
320 _stp.ValidateWorkItemsGroupWaitForIdle(this); 193 SmartThreadPool.ValidateWorkItemsGroupWaitForIdle(this);
321 return _isIdleWaitHandle.WaitOne(millisecondsTimeout, false); 194 return STPEventWaitHandle.WaitOne(_isIdleWaitHandle, millisecondsTimeout, false);
322 } 195 }
323 196
324 public int WaitingCallbacks 197 public override event WorkItemsGroupIdleHandler OnIdle
325 { 198 {
326 get 199 add { _onIdle += value; }
327 { 200 remove { _onIdle -= value; }
328 return _workItemsQueue.Count; 201 }
329 }
330 }
331 202
332 public event WorkItemsGroupIdleHandler OnIdle 203 #endregion
333 {
334 add
335 {
336 _onIdle += value;
337 }
338 remove
339 {
340 _onIdle -= value;
341 }
342 }
343 204
344 public void Cancel() 205 #region Private methods
345 {
346 lock(_lock)
347 {
348 _canceledWorkItemsGroup.IsCanceled = true;
349 _workItemsQueue.Clear();
350 _workItemsInStpQueue = 0;
351 _canceledWorkItemsGroup = new CanceledWorkItemsGroup();
352 }
353 }
354 206
355 public void Start() 207 private void RegisterToWorkItemCompletion(IWorkItemResult wir)
356 { 208 {
357 lock (this) 209 IInternalWorkItemResult iwir = (IInternalWorkItemResult)wir;
358 { 210 iwir.OnWorkItemStarted += OnWorkItemStartedCallback;
359 if (!_workItemsGroupStartInfo.StartSuspended) 211 iwir.OnWorkItemCompleted += OnWorkItemCompletedCallback;
360 { 212 }
361 return;
362 }
363 _workItemsGroupStartInfo.StartSuspended = false;
364 }
365
366 for(int i = 0; i < _concurrency; ++i)
367 {
368 EnqueueToSTPNextWorkItem(null, false);
369 }
370 }
371
372 #endregion
373 213
374 #region Private methods 214 public void OnSTPIsStarting()
375 215 {
376 private void RegisterToWorkItemCompletion(IWorkItemResult wir) 216 if (_isSuspended)
377 {
378 IInternalWorkItemResult iwir = wir as IInternalWorkItemResult;
379 iwir.OnWorkItemStarted += new WorkItemStateCallback(OnWorkItemStartedCallback);
380 iwir.OnWorkItemCompleted += new WorkItemStateCallback(OnWorkItemCompletedCallback);
381 }
382
383 public void OnSTPIsStarting()
384 {
385 lock (this)
386 {
387 if (_workItemsGroupStartInfo.StartSuspended)
388 {
389 return;
390 }
391 }
392
393 for(int i = 0; i < _concurrency; ++i)
394 {
395 EnqueueToSTPNextWorkItem(null, false);
396 }
397 }
398
399 private object FireOnIdle(object state)
400 {
401 FireOnIdleImpl(_onIdle);
402 return null;
403 }
404
405 [MethodImpl(MethodImplOptions.NoInlining)]
406 private void FireOnIdleImpl(WorkItemsGroupIdleHandler onIdle)
407 {
408 if(null == onIdle)
409 { 217 {
410 return; 218 return;
411 } 219 }
220
221 EnqueueToSTPNextNWorkItem(_concurrency);
222 }
412 223
413 Delegate[] delegates = onIdle.GetInvocationList(); 224 public void EnqueueToSTPNextNWorkItem(int count)
414 foreach(WorkItemsGroupIdleHandler eh in delegates)
415 {
416 try
417 {
418 eh(this);
419 }
420 // Ignore exceptions
421 catch{}
422 }
423 }
424
425 private void OnWorkItemStartedCallback(WorkItem workItem)
426 { 225 {
427 lock(_lock) 226 for (int i = 0; i < count; ++i)
428 { 227 {
429 ++_workItemsExecutingInStp; 228 EnqueueToSTPNextWorkItem(null, false);
430 } 229 }
431 } 230 }
432 231
433 private void OnWorkItemCompletedCallback(WorkItem workItem) 232 private object FireOnIdle(object state)
434 { 233 {
435 EnqueueToSTPNextWorkItem(null, true); 234 FireOnIdleImpl(_onIdle);
436 } 235 return null;
437 236 }
438 private void EnqueueToSTPNextWorkItem(WorkItem workItem) 237
238 [MethodImpl(MethodImplOptions.NoInlining)]
239 private void FireOnIdleImpl(WorkItemsGroupIdleHandler onIdle)
240 {
241 if(null == onIdle)
242 {
243 return;
244 }
245
246 Delegate[] delegates = onIdle.GetInvocationList();
247 foreach(WorkItemsGroupIdleHandler eh in delegates)
248 {
249 try
250 {
251 eh(this);
252 }
253 catch { } // Suppress exceptions
254 }
255 }
256
257 private void OnWorkItemStartedCallback(WorkItem workItem)
258 {
259 lock(_lock)
260 {
261 ++_workItemsExecutingInStp;
262 }
263 }
264
265 private void OnWorkItemCompletedCallback(WorkItem workItem)
266 {
267 EnqueueToSTPNextWorkItem(null, true);
268 }
269
270 internal override void Enqueue(WorkItem workItem)
439 { 271 {
440 EnqueueToSTPNextWorkItem(workItem, false); 272 EnqueueToSTPNextWorkItem(workItem);
441 } 273 }
442 274
443 private void EnqueueToSTPNextWorkItem(WorkItem workItem, bool decrementWorkItemsInStpQueue) 275 private void EnqueueToSTPNextWorkItem(WorkItem workItem)
444 { 276 {
445 lock(_lock) 277 EnqueueToSTPNextWorkItem(workItem, false);
446 { 278 }
447 // Got here from OnWorkItemCompletedCallback() 279
448 if (decrementWorkItemsInStpQueue) 280 private void EnqueueToSTPNextWorkItem(WorkItem workItem, bool decrementWorkItemsInStpQueue)
449 { 281 {
450 --_workItemsInStpQueue; 282 lock(_lock)
451 283 {
452 if(_workItemsInStpQueue < 0) 284 // Got here from OnWorkItemCompletedCallback()
453 { 285 if (decrementWorkItemsInStpQueue)
454 _workItemsInStpQueue = 0; 286 {
455 } 287 --_workItemsInStpQueue;
456 288
457 --_workItemsExecutingInStp; 289 if(_workItemsInStpQueue < 0)
458 290 {
459 if(_workItemsExecutingInStp < 0) 291 _workItemsInStpQueue = 0;
460 { 292 }
461 _workItemsExecutingInStp = 0; 293
462 } 294 --_workItemsExecutingInStp;
463 } 295
464 296 if(_workItemsExecutingInStp < 0)
465 // If the work item is not null then enqueue it 297 {
466 if (null != workItem) 298 _workItemsExecutingInStp = 0;
467 { 299 }
468 workItem.CanceledWorkItemsGroup = _canceledWorkItemsGroup; 300 }
469 301
470 RegisterToWorkItemCompletion(workItem.GetWorkItemResult()); 302 // If the work item is not null then enqueue it
471 _workItemsQueue.Enqueue(workItem); 303 if (null != workItem)
472 //_stp.IncrementWorkItemsCount(); 304 {
473 305 workItem.CanceledWorkItemsGroup = _canceledWorkItemsGroup;
474 if ((1 == _workItemsQueue.Count) && 306
475 (0 == _workItemsInStpQueue)) 307 RegisterToWorkItemCompletion(workItem.GetWorkItemResult());
476 { 308 _workItemsQueue.Enqueue(workItem);
477 _stp.RegisterWorkItemsGroup(this); 309 //_stp.IncrementWorkItemsCount();
478 Trace.WriteLine("WorkItemsGroup " + Name + " is NOT idle"); 310
311 if ((1 == _workItemsQueue.Count) &&
312 (0 == _workItemsInStpQueue))
313 {
314 _stp.RegisterWorkItemsGroup(this);
315 IsIdle = false;
479 _isIdleWaitHandle.Reset(); 316 _isIdleWaitHandle.Reset();
480 } 317 }
481 } 318 }
482 319
483 // If the work items queue of the group is empty than quit 320 // If the work items queue of the group is empty than quit
484 if (0 == _workItemsQueue.Count) 321 if (0 == _workItemsQueue.Count)
485 { 322 {
486 if (0 == _workItemsInStpQueue) 323 if (0 == _workItemsInStpQueue)
487 { 324 {
488 _stp.UnregisterWorkItemsGroup(this); 325 _stp.UnregisterWorkItemsGroup(this);
489 Trace.WriteLine("WorkItemsGroup " + Name + " is idle"); 326 IsIdle = true;
490 _isIdleWaitHandle.Set(); 327 _isIdleWaitHandle.Set();
491 _stp.QueueWorkItem(new WorkItemCallback(this.FireOnIdle)); 328 if (decrementWorkItemsInStpQueue && _onIdle != null && _onIdle.GetInvocationList().Length > 0)
492 } 329 {
493 return; 330 _stp.QueueWorkItem(new WorkItemCallback(FireOnIdle));
494 } 331 }
495 332 }
496 if (!_workItemsGroupStartInfo.StartSuspended) 333 return;
497 { 334 }
498 if (_workItemsInStpQueue < _concurrency) 335
499 { 336 if (!_isSuspended)
500 WorkItem nextWorkItem = _workItemsQueue.Dequeue() as WorkItem; 337 {
501 _stp.Enqueue(nextWorkItem, true); 338 if (_workItemsInStpQueue < _concurrency)
502 ++_workItemsInStpQueue; 339 {
503 } 340 WorkItem nextWorkItem = _workItemsQueue.Dequeue() as WorkItem;
504 } 341 try
505 } 342 {
506 } 343 _stp.Enqueue(nextWorkItem);
507 344 }
508 #endregion 345 catch (ObjectDisposedException e)
346 {
347 e.GetHashCode();
348 // The STP has been shutdown
349 }
350
351 ++_workItemsInStpQueue;
352 }
353 }
354 }
355 }
356
357 #endregion
509 } 358 }
510 359
511 #endregion 360 #endregion
512} 361}
diff --git a/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs b/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs
new file mode 100644
index 0000000..27fae5e
--- /dev/null
+++ b/ThirdParty/SmartThreadPool/WorkItemsGroupBase.cs
@@ -0,0 +1,471 @@
1using System;
2using System.Threading;
3
4namespace Amib.Threading.Internal
5{
6 public abstract class WorkItemsGroupBase : IWorkItemsGroup
7 {
8 #region Private Fields
9
10 /// <summary>
11 /// Contains the name of this instance of SmartThreadPool.
12 /// Can be changed by the user.
13 /// </summary>
14 private string _name = "WorkItemsGroupBase";
15
16 public WorkItemsGroupBase()
17 {
18 IsIdle = true;
19 }
20
21 #endregion
22
23 #region IWorkItemsGroup Members
24
25 #region Public Methods
26
27 /// <summary>
28 /// Get/Set the name of the SmartThreadPool/WorkItemsGroup instance
29 /// </summary>
30 public string Name
31 {
32 get { return _name; }
33 set { _name = value; }
34 }
35
36 #endregion
37
38 #region Abstract Methods
39
40 public abstract int Concurrency { get; set; }
41 public abstract int WaitingCallbacks { get; }
42 public abstract object[] GetStates();
43 public abstract WIGStartInfo WIGStartInfo { get; }
44 public abstract void Start();
45 public abstract void Cancel(bool abortExecution);
46 public abstract bool WaitForIdle(int millisecondsTimeout);
47 public abstract event WorkItemsGroupIdleHandler OnIdle;
48
49 internal abstract void Enqueue(WorkItem workItem);
50 internal virtual void PreQueueWorkItem() { }
51
52 #endregion
53
54 #region Common Base Methods
55
56 /// <summary>
57 /// Cancel all the work items.
58 /// Same as Cancel(false)
59 /// </summary>
60 public virtual void Cancel()
61 {
62 Cancel(false);
63 }
64
65 /// <summary>
66 /// Wait for the SmartThreadPool/WorkItemsGroup to be idle
67 /// </summary>
68 public void WaitForIdle()
69 {
70 WaitForIdle(Timeout.Infinite);
71 }
72
73 /// <summary>
74 /// Wait for the SmartThreadPool/WorkItemsGroup to be idle
75 /// </summary>
76 public bool WaitForIdle(TimeSpan timeout)
77 {
78 return WaitForIdle((int)timeout.TotalMilliseconds);
79 }
80
81 /// <summary>
82 /// IsIdle is true when there are no work items running or queued.
83 /// </summary>
84 public bool IsIdle { get; protected set; }
85
86 #endregion
87
88 #region QueueWorkItem
89
90 /// <summary>
91 /// Queue a work item
92 /// </summary>
93 /// <param name="callback">A callback to execute</param>
94 /// <returns>Returns a work item result</returns>
95 public IWorkItemResult QueueWorkItem(WorkItemCallback callback)
96 {
97 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback);
98 Enqueue(workItem);
99 return workItem.GetWorkItemResult();
100 }
101
102 /// <summary>
103 /// Queue a work item
104 /// </summary>
105 /// <param name="callback">A callback to execute</param>
106 /// <param name="workItemPriority">The priority of the work item</param>
107 /// <returns>Returns a work item result</returns>
108 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority)
109 {
110 PreQueueWorkItem();
111 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, workItemPriority);
112 Enqueue(workItem);
113 return workItem.GetWorkItemResult();
114 }
115
116 /// <summary>
117 /// Queue a work item
118 /// </summary>
119 /// <param name="workItemInfo">Work item info</param>
120 /// <param name="callback">A callback to execute</param>
121 /// <returns>Returns a work item result</returns>
122 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback)
123 {
124 PreQueueWorkItem();
125 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback);
126 Enqueue(workItem);
127 return workItem.GetWorkItemResult();
128 }
129
130 /// <summary>
131 /// Queue a work item
132 /// </summary>
133 /// <param name="callback">A callback to execute</param>
134 /// <param name="state">
135 /// The context object of the work item. Used for passing arguments to the work item.
136 /// </param>
137 /// <returns>Returns a work item result</returns>
138 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state)
139 {
140 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state);
141 Enqueue(workItem);
142 return workItem.GetWorkItemResult();
143 }
144
145 /// <summary>
146 /// Queue a work item
147 /// </summary>
148 /// <param name="callback">A callback to execute</param>
149 /// <param name="state">
150 /// The context object of the work item. Used for passing arguments to the work item.
151 /// </param>
152 /// <param name="workItemPriority">The work item priority</param>
153 /// <returns>Returns a work item result</returns>
154 public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority)
155 {
156 PreQueueWorkItem();
157 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, workItemPriority);
158 Enqueue(workItem);
159 return workItem.GetWorkItemResult();
160 }
161
162 /// <summary>
163 /// Queue a work item
164 /// </summary>
165 /// <param name="workItemInfo">Work item information</param>
166 /// <param name="callback">A callback to execute</param>
167 /// <param name="state">
168 /// The context object of the work item. Used for passing arguments to the work item.
169 /// </param>
170 /// <returns>Returns a work item result</returns>
171 public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state)
172 {
173 PreQueueWorkItem();
174 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback, state);
175 Enqueue(workItem);
176 return workItem.GetWorkItemResult();
177 }
178
179 /// <summary>
180 /// Queue a work item
181 /// </summary>
182 /// <param name="callback">A callback to execute</param>
183 /// <param name="state">
184 /// The context object of the work item. Used for passing arguments to the work item.
185 /// </param>
186 /// <param name="postExecuteWorkItemCallback">
187 /// A delegate to call after the callback completion
188 /// </param>
189 /// <returns>Returns a work item result</returns>
190 public IWorkItemResult QueueWorkItem(
191 WorkItemCallback callback,
192 object state,
193 PostExecuteWorkItemCallback postExecuteWorkItemCallback)
194 {
195 PreQueueWorkItem();
196 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback);
197 Enqueue(workItem);
198 return workItem.GetWorkItemResult();
199 }
200
201 /// <summary>
202 /// Queue a work item
203 /// </summary>
204 /// <param name="callback">A callback to execute</param>
205 /// <param name="state">
206 /// The context object of the work item. Used for passing arguments to the work item.
207 /// </param>
208 /// <param name="postExecuteWorkItemCallback">
209 /// A delegate to call after the callback completion
210 /// </param>
211 /// <param name="workItemPriority">The work item priority</param>
212 /// <returns>Returns a work item result</returns>
213 public IWorkItemResult QueueWorkItem(
214 WorkItemCallback callback,
215 object state,
216 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
217 WorkItemPriority workItemPriority)
218 {
219 PreQueueWorkItem();
220 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, workItemPriority);
221 Enqueue(workItem);
222 return workItem.GetWorkItemResult();
223 }
224
225 /// <summary>
226 /// Queue a work item
227 /// </summary>
228 /// <param name="callback">A callback to execute</param>
229 /// <param name="state">
230 /// The context object of the work item. Used for passing arguments to the work item.
231 /// </param>
232 /// <param name="postExecuteWorkItemCallback">
233 /// A delegate to call after the callback completion
234 /// </param>
235 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
236 /// <returns>Returns a work item result</returns>
237 public IWorkItemResult QueueWorkItem(
238 WorkItemCallback callback,
239 object state,
240 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
241 CallToPostExecute callToPostExecute)
242 {
243 PreQueueWorkItem();
244 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute);
245 Enqueue(workItem);
246 return workItem.GetWorkItemResult();
247 }
248
249 /// <summary>
250 /// Queue a work item
251 /// </summary>
252 /// <param name="callback">A callback to execute</param>
253 /// <param name="state">
254 /// The context object of the work item. Used for passing arguments to the work item.
255 /// </param>
256 /// <param name="postExecuteWorkItemCallback">
257 /// A delegate to call after the callback completion
258 /// </param>
259 /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
260 /// <param name="workItemPriority">The work item priority</param>
261 /// <returns>Returns a work item result</returns>
262 public IWorkItemResult QueueWorkItem(
263 WorkItemCallback callback,
264 object state,
265 PostExecuteWorkItemCallback postExecuteWorkItemCallback,
266 CallToPostExecute callToPostExecute,
267 WorkItemPriority workItemPriority)
268 {
269 PreQueueWorkItem();
270 WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute, workItemPriority);
271 Enqueue(workItem);
272 return workItem.GetWorkItemResult();
273 }
274
275 #endregion
276
277 #region QueueWorkItem(Action<...>)
278
279 public IWorkItemResult QueueWorkItem(Action action)
280 {
281 return QueueWorkItem (action, SmartThreadPool.DefaultWorkItemPriority);
282 }
283
284 public IWorkItemResult QueueWorkItem (Action action, WorkItemPriority priority)
285 {
286 PreQueueWorkItem ();
287 WorkItem workItem = WorkItemFactory.CreateWorkItem (
288 this,
289 WIGStartInfo,
290 delegate
291 {
292 action.Invoke ();
293 return null;
294 }, priority);
295 Enqueue (workItem);
296 return workItem.GetWorkItemResult ();
297 }
298
299 public IWorkItemResult QueueWorkItem<T>(Action<T> action, T arg)
300 {
301 return QueueWorkItem<T> (action, arg, SmartThreadPool.DefaultWorkItemPriority);
302 }
303
304 public IWorkItemResult QueueWorkItem<T> (Action<T> action, T arg, WorkItemPriority priority)
305 {
306 PreQueueWorkItem ();
307 WorkItem workItem = WorkItemFactory.CreateWorkItem (
308 this,
309 WIGStartInfo,
310 state =>
311 {
312 action.Invoke (arg);
313 return null;
314 },
315 WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null, priority);
316 Enqueue (workItem);
317 return workItem.GetWorkItemResult ();
318 }
319
320 public IWorkItemResult QueueWorkItem<T1, T2>(Action<T1, T2> action, T1 arg1, T2 arg2)
321 {
322 return QueueWorkItem<T1, T2> (action, arg1, arg2, SmartThreadPool.DefaultWorkItemPriority);
323 }
324
325 public IWorkItemResult QueueWorkItem<T1, T2> (Action<T1, T2> action, T1 arg1, T2 arg2, WorkItemPriority priority)
326 {
327 PreQueueWorkItem ();
328 WorkItem workItem = WorkItemFactory.CreateWorkItem (
329 this,
330 WIGStartInfo,
331 state =>
332 {
333 action.Invoke (arg1, arg2);
334 return null;
335 },
336 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null, priority);
337 Enqueue (workItem);
338 return workItem.GetWorkItemResult ();
339 }
340
341 public IWorkItemResult QueueWorkItem<T1, T2, T3>(Action<T1, T2, T3> action, T1 arg1, T2 arg2, T3 arg3)
342 {
343 return QueueWorkItem<T1, T2, T3> (action, arg1, arg2, arg3, SmartThreadPool.DefaultWorkItemPriority);
344 ;
345 }
346
347 public IWorkItemResult QueueWorkItem<T1, T2, T3> (Action<T1, T2, T3> action, T1 arg1, T2 arg2, T3 arg3, WorkItemPriority priority)
348 {
349 PreQueueWorkItem ();
350 WorkItem workItem = WorkItemFactory.CreateWorkItem (
351 this,
352 WIGStartInfo,
353 state =>
354 {
355 action.Invoke (arg1, arg2, arg3);
356 return null;
357 },
358 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null, priority);
359 Enqueue (workItem);
360 return workItem.GetWorkItemResult ();
361 }
362
363 public IWorkItemResult QueueWorkItem<T1, T2, T3, T4>(
364 Action<T1, T2, T3, T4> action, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
365 {
366 return QueueWorkItem<T1, T2, T3, T4> (action, arg1, arg2, arg3, arg4,
367 SmartThreadPool.DefaultWorkItemPriority);
368 }
369
370 public IWorkItemResult QueueWorkItem<T1, T2, T3, T4> (
371 Action<T1, T2, T3, T4> action, T1 arg1, T2 arg2, T3 arg3, T4 arg4, WorkItemPriority priority)
372 {
373 PreQueueWorkItem ();
374 WorkItem workItem = WorkItemFactory.CreateWorkItem (
375 this,
376 WIGStartInfo,
377 state =>
378 {
379 action.Invoke (arg1, arg2, arg3, arg4);
380 return null;
381 },
382 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null, priority);
383 Enqueue (workItem);
384 return workItem.GetWorkItemResult ();
385 }
386
387 #endregion
388
389 #region QueueWorkItem(Func<...>)
390
391 public IWorkItemResult<TResult> QueueWorkItem<TResult>(Func<TResult> func)
392 {
393 PreQueueWorkItem();
394 WorkItem workItem = WorkItemFactory.CreateWorkItem(
395 this,
396 WIGStartInfo,
397 state =>
398 {
399 return func.Invoke();
400 });
401 Enqueue(workItem);
402 return new WorkItemResultTWrapper<TResult>(workItem.GetWorkItemResult());
403 }
404
405 public IWorkItemResult<TResult> QueueWorkItem<T, TResult>(Func<T, TResult> func, T arg)
406 {
407 PreQueueWorkItem();
408 WorkItem workItem = WorkItemFactory.CreateWorkItem(
409 this,
410 WIGStartInfo,
411 state =>
412 {
413 return func.Invoke(arg);
414 },
415 WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null);
416 Enqueue(workItem);
417 return new WorkItemResultTWrapper<TResult>(workItem.GetWorkItemResult());
418 }
419
420 public IWorkItemResult<TResult> QueueWorkItem<T1, T2, TResult>(Func<T1, T2, TResult> func, T1 arg1, T2 arg2)
421 {
422 PreQueueWorkItem();
423 WorkItem workItem = WorkItemFactory.CreateWorkItem(
424 this,
425 WIGStartInfo,
426 state =>
427 {
428 return func.Invoke(arg1, arg2);
429 },
430 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null);
431 Enqueue(workItem);
432 return new WorkItemResultTWrapper<TResult>(workItem.GetWorkItemResult());
433 }
434
435 public IWorkItemResult<TResult> QueueWorkItem<T1, T2, T3, TResult>(
436 Func<T1, T2, T3, TResult> func, T1 arg1, T2 arg2, T3 arg3)
437 {
438 PreQueueWorkItem();
439 WorkItem workItem = WorkItemFactory.CreateWorkItem(
440 this,
441 WIGStartInfo,
442 state =>
443 {
444 return func.Invoke(arg1, arg2, arg3);
445 },
446 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null);
447 Enqueue(workItem);
448 return new WorkItemResultTWrapper<TResult>(workItem.GetWorkItemResult());
449 }
450
451 public IWorkItemResult<TResult> QueueWorkItem<T1, T2, T3, T4, TResult>(
452 Func<T1, T2, T3, T4, TResult> func, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
453 {
454 PreQueueWorkItem();
455 WorkItem workItem = WorkItemFactory.CreateWorkItem(
456 this,
457 WIGStartInfo,
458 state =>
459 {
460 return func.Invoke(arg1, arg2, arg3, arg4);
461 },
462 WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null);
463 Enqueue(workItem);
464 return new WorkItemResultTWrapper<TResult>(workItem.GetWorkItemResult());
465 }
466
467 #endregion
468
469 #endregion
470 }
471} \ No newline at end of file
diff --git a/ThirdParty/SmartThreadPool/WorkItemsQueue.cs b/ThirdParty/SmartThreadPool/WorkItemsQueue.cs
index af5af07..e0bc916 100644
--- a/ThirdParty/SmartThreadPool/WorkItemsQueue.cs
+++ b/ThirdParty/SmartThreadPool/WorkItemsQueue.cs
@@ -1,109 +1,151 @@
1// Ami Bar
2// amibar@gmail.com
3
4using System; 1using System;
2using System.Collections.Generic;
5using System.Threading; 3using System.Threading;
6 4
7namespace Amib.Threading.Internal 5namespace Amib.Threading.Internal
8{ 6{
9 #region WorkItemsQueue class 7 #region WorkItemsQueue class
10 8
11 /// <summary> 9 /// <summary>
12 /// WorkItemsQueue class. 10 /// WorkItemsQueue class.
13 /// </summary> 11 /// </summary>
14 public class WorkItemsQueue : IDisposable 12 public class WorkItemsQueue : IDisposable
15 { 13 {
16 #region Member variables 14 #region Member variables
17 15
18 /// <summary> 16 /// <summary>
19 /// Waiters queue (implemented as stack). 17 /// Waiters queue (implemented as stack).
20 /// </summary> 18 /// </summary>
21 private WaiterEntry _headWaiterEntry = new WaiterEntry(); 19 private readonly WaiterEntry _headWaiterEntry = new WaiterEntry();
22 20
23 /// <summary> 21 /// <summary>
24 /// Waiters count 22 /// Waiters count
25 /// </summary> 23 /// </summary>
26 private int _waitersCount = 0; 24 private int _waitersCount = 0;
27 25
28 /// <summary> 26 /// <summary>
29 /// Work items queue 27 /// Work items queue
30 /// </summary> 28 /// </summary>
31 private PriorityQueue _workItems = new PriorityQueue(); 29 private readonly PriorityQueue _workItems = new PriorityQueue();
32 30
33 /// <summary> 31 /// <summary>
34 /// Indicate that work items are allowed to be queued 32 /// Indicate that work items are allowed to be queued
35 /// </summary> 33 /// </summary>
36 private bool _isWorkItemsQueueActive = true; 34 private bool _isWorkItemsQueueActive = true;
37 35
38 /// <summary>
39 /// Each thread in the thread pool keeps its own waiter entry.
40 /// </summary>
41 [ThreadStatic]
42 private static WaiterEntry _waiterEntry;
43 36
44 /// <summary> 37#if (WINDOWS_PHONE)
45 /// A flag that indicates if the WorkItemsQueue has been disposed. 38 private static readonly Dictionary<int, WaiterEntry> _waiterEntries = new Dictionary<int, WaiterEntry>();
46 /// </summary> 39#elif (_WINDOWS_CE)
47 private bool _isDisposed = false; 40 private static LocalDataStoreSlot _waiterEntrySlot = Thread.AllocateDataSlot();
41#else
48 42
49 #endregion 43 [ThreadStatic]
44 private static WaiterEntry _waiterEntry;
45#endif
50 46
51 #region Public properties
52 47
53 /// <summary> 48 /// <summary>
54 /// Returns the current number of work items in the queue 49 /// Each thread in the thread pool keeps its own waiter entry.
55 /// </summary> 50 /// </summary>
56 public int Count 51 private static WaiterEntry CurrentWaiterEntry
57 { 52 {
53#if (WINDOWS_PHONE)
58 get 54 get
59 { 55 {
60 lock(this) 56 lock (_waiterEntries)
61 { 57 {
62 ValidateNotDisposed(); 58 WaiterEntry waiterEntry;
63 return _workItems.Count; 59 if (_waiterEntries.TryGetValue(Thread.CurrentThread.ManagedThreadId, out waiterEntry))
60 {
61 return waiterEntry;
62 }
64 } 63 }
64 return null;
65 } 65 }
66 } 66 set
67
68 /// <summary>
69 /// Returns the current number of waiters
70 /// </summary>
71 public int WaitersCount
72 {
73 get
74 { 67 {
75 lock(this) 68 lock (_waiterEntries)
76 { 69 {
77 ValidateNotDisposed(); 70 _waiterEntries[Thread.CurrentThread.ManagedThreadId] = value;
78 return _waitersCount;
79 } 71 }
80 } 72 }
73#elif (_WINDOWS_CE)
74 get
75 {
76 return Thread.GetData(_waiterEntrySlot) as WaiterEntry;
77 }
78 set
79 {
80 Thread.SetData(_waiterEntrySlot, value);
81 }
82#else
83 get
84 {
85 return _waiterEntry;
86 }
87 set
88 {
89 _waiterEntry = value;
90 }
91#endif
81 } 92 }
82 93
94 /// <summary>
95 /// A flag that indicates if the WorkItemsQueue has been disposed.
96 /// </summary>
97 private bool _isDisposed = false;
83 98
84 #endregion 99 #endregion
85 100
86 #region Public methods 101 #region Public properties
87 102
88 /// <summary> 103 /// <summary>
89 /// Enqueue a work item to the queue. 104 /// Returns the current number of work items in the queue
90 /// </summary> 105 /// </summary>
91 public bool EnqueueWorkItem(WorkItem workItem) 106 public int Count
92 { 107 {
93 // A work item cannot be null, since null is used in the 108 get
94 // WaitForWorkItem() method to indicate timeout or cancel 109 {
95 if (null == workItem) 110 return _workItems.Count;
96 { 111 }
97 throw new ArgumentNullException("workItem" , "workItem cannot be null"); 112 }
98 } 113
114 /// <summary>
115 /// Returns the current number of waiters
116 /// </summary>
117 public int WaitersCount
118 {
119 get
120 {
121 return _waitersCount;
122 }
123 }
99 124
100 bool enqueue = true;
101 125
102 // First check if there is a waiter waiting for work item. During 126 #endregion
103 // the check, timed out waiters are ignored. If there is no 127
104 // waiter then the work item is queued. 128 #region Public methods
105 lock(this) 129
106 { 130 /// <summary>
131 /// Enqueue a work item to the queue.
132 /// </summary>
133 public bool EnqueueWorkItem(WorkItem workItem)
134 {
135 // A work item cannot be null, since null is used in the
136 // WaitForWorkItem() method to indicate timeout or cancel
137 if (null == workItem)
138 {
139 throw new ArgumentNullException("workItem" , "workItem cannot be null");
140 }
141
142 bool enqueue = true;
143
144 // First check if there is a waiter waiting for work item. During
145 // the check, timed out waiters are ignored. If there is no
146 // waiter then the work item is queued.
147 lock(this)
148 {
107 ValidateNotDisposed(); 149 ValidateNotDisposed();
108 150
109 if (!_isWorkItemsQueueActive) 151 if (!_isWorkItemsQueueActive)
@@ -111,56 +153,55 @@ namespace Amib.Threading.Internal
111 return false; 153 return false;
112 } 154 }
113 155
114 while(_waitersCount > 0) 156 while(_waitersCount > 0)
115 { 157 {
116 // Dequeue a waiter. 158 // Dequeue a waiter.
117 WaiterEntry waiterEntry = PopWaiter(); 159 WaiterEntry waiterEntry = PopWaiter();
118 160
119 // Signal the waiter. On success break the loop 161 // Signal the waiter. On success break the loop
120 if (waiterEntry.Signal(workItem)) 162 if (waiterEntry.Signal(workItem))
121 { 163 {
122 enqueue = false; 164 enqueue = false;
123 break; 165 break;
124 } 166 }
125 } 167 }
126 168
127 if (enqueue) 169 if (enqueue)
128 { 170 {
129 // Enqueue the work item 171 // Enqueue the work item
130 _workItems.Enqueue(workItem); 172 _workItems.Enqueue(workItem);
131 } 173 }
132 } 174 }
133 return true; 175 return true;
134 } 176 }
135 177
136 178
137 /// <summary> 179 /// <summary>
138 /// Waits for a work item or exits on timeout or cancel 180 /// Waits for a work item or exits on timeout or cancel
139 /// </summary> 181 /// </summary>
140 /// <param name="millisecondsTimeout">Timeout in milliseconds</param> 182 /// <param name="millisecondsTimeout">Timeout in milliseconds</param>
141 /// <param name="cancelEvent">Cancel wait handle</param> 183 /// <param name="cancelEvent">Cancel wait handle</param>
142 /// <returns>Returns true if the resource was granted</returns> 184 /// <returns>Returns true if the resource was granted</returns>
143 public WorkItem DequeueWorkItem( 185 public WorkItem DequeueWorkItem(
144 int millisecondsTimeout, 186 int millisecondsTimeout,
145 WaitHandle cancelEvent) 187 WaitHandle cancelEvent)
146 { 188 {
147 /// This method cause the caller to wait for a work item. 189 // This method cause the caller to wait for a work item.
148 /// If there is at least one waiting work item then the 190 // If there is at least one waiting work item then the
149 /// method returns immidiately with true. 191 // method returns immidiately with it.
150 /// 192 //
151 /// If there are no waiting work items then the caller 193 // If there are no waiting work items then the caller
152 /// is queued between other waiters for a work item to arrive. 194 // is queued between other waiters for a work item to arrive.
153 /// 195 //
154 /// If a work item didn't come within millisecondsTimeout or 196 // If a work item didn't come within millisecondsTimeout or
155 /// the user canceled the wait by signaling the cancelEvent 197 // the user canceled the wait by signaling the cancelEvent
156 /// then the method returns false to indicate that the caller 198 // then the method returns null to indicate that the caller
157 /// didn't get a work item. 199 // didn't get a work item.
158 200
159 WaiterEntry waiterEntry = null; 201 WaiterEntry waiterEntry;
160 WorkItem workItem = null; 202 WorkItem workItem = null;
161 203 lock (this)
162 lock(this) 204 {
163 {
164 ValidateNotDisposed(); 205 ValidateNotDisposed();
165 206
166 // If there are waiting work items then take one and return. 207 // If there are waiting work items then take one and return.
@@ -169,80 +210,79 @@ namespace Amib.Threading.Internal
169 workItem = _workItems.Dequeue() as WorkItem; 210 workItem = _workItems.Dequeue() as WorkItem;
170 return workItem; 211 return workItem;
171 } 212 }
172 // No waiting work items ...
173 else
174 {
175 // Get the wait entry for the waiters queue
176 waiterEntry = GetThreadWaiterEntry();
177
178 // Put the waiter with the other waiters
179 PushWaiter(waiterEntry);
180 }
181 }
182
183 // Prepare array of wait handle for the WaitHandle.WaitAny()
184 WaitHandle [] waitHandles = new WaitHandle [] {
185 waiterEntry.WaitHandle,
186 cancelEvent };
187
188 // Wait for an available resource, cancel event, or timeout.
189 213
190 // During the wait we are supposes to exit the synchronization 214 // No waiting work items ...
191 // domain. (Placing true as the third argument of the WaitAny()) 215
192 // It just doesn't work, I don't know why, so I have lock(this) 216 // Get the waiter entry for the waiters queue
193 // statments insted of one. 217 waiterEntry = GetThreadWaiterEntry();
194 218
195 int index = WaitHandle.WaitAny( 219 // Put the waiter with the other waiters
196 waitHandles, 220 PushWaiter(waiterEntry);
197 millisecondsTimeout, 221 }
198 true); 222
199 223 // Prepare array of wait handle for the WaitHandle.WaitAny()
200 lock(this) 224 WaitHandle [] waitHandles = new WaitHandle[] {
201 { 225 waiterEntry.WaitHandle,
202 // success is true if it got a work item. 226 cancelEvent };
203 bool success = (0 == index); 227
204 228 // Wait for an available resource, cancel event, or timeout.
205 // The timeout variable is used only for readability. 229
206 // (We treat cancel as timeout) 230 // During the wait we are supposes to exit the synchronization
207 bool timeout = !success; 231 // domain. (Placing true as the third argument of the WaitAny())
208 232 // It just doesn't work, I don't know why, so I have two lock(this)
209 // On timeout update the waiterEntry that it is timed out 233 // statments instead of one.
210 if (timeout) 234
211 { 235 int index = STPEventWaitHandle.WaitAny(
212 // The Timeout() fails if the waiter has already been signaled 236 waitHandles,
213 timeout = waiterEntry.Timeout(); 237 millisecondsTimeout,
214 238 true);
215 // On timeout remove the waiter from the queue. 239
216 // Note that the complexity is O(1). 240 lock(this)
217 if(timeout) 241 {
218 { 242 // success is true if it got a work item.
219 RemoveWaiter(waiterEntry, false); 243 bool success = (0 == index);
220 } 244
221 245 // The timeout variable is used only for readability.
222 // Again readability 246 // (We treat cancel as timeout)
223 success = !timeout; 247 bool timeout = !success;
224 } 248
225 249 // On timeout update the waiterEntry that it is timed out
226 // On success return the work item 250 if (timeout)
227 if (success) 251 {
228 { 252 // The Timeout() fails if the waiter has already been signaled
229 workItem = waiterEntry.WorkItem; 253 timeout = waiterEntry.Timeout();
230 254
231 if (null == workItem) 255 // On timeout remove the waiter from the queue.
232 { 256 // Note that the complexity is O(1).
233 workItem = _workItems.Dequeue() as WorkItem; 257 if(timeout)
234 } 258 {
235 } 259 RemoveWaiter(waiterEntry, false);
236 } 260 }
237 // On failure return null. 261
238 return workItem; 262 // Again readability
239 } 263 success = !timeout;
264 }
265
266 // On success return the work item
267 if (success)
268 {
269 workItem = waiterEntry.WorkItem;
270
271 if (null == workItem)
272 {
273 workItem = _workItems.Dequeue() as WorkItem;
274 }
275 }
276 }
277 // On failure return null.
278 return workItem;
279 }
240 280
241 /// <summary> 281 /// <summary>
242 /// Cleanup the work items queue, hence no more work 282 /// Cleanup the work items queue, hence no more work
243 /// items are allowed to be queue 283 /// items are allowed to be queue
244 /// </summary> 284 /// </summary>
245 protected virtual void Cleanup() 285 private void Cleanup()
246 { 286 {
247 lock(this) 287 lock(this)
248 { 288 {
@@ -271,301 +311,312 @@ namespace Amib.Threading.Internal
271 // Tell the waiters that they were timed out. 311 // Tell the waiters that they were timed out.
272 // It won't signal them to exit, but to ignore their 312 // It won't signal them to exit, but to ignore their
273 // next work item. 313 // next work item.
274 while(_waitersCount > 0) 314 while(_waitersCount > 0)
275 { 315 {
276 WaiterEntry waiterEntry = PopWaiter(); 316 WaiterEntry waiterEntry = PopWaiter();
277 waiterEntry.Timeout(); 317 waiterEntry.Timeout();
278 } 318 }
279 } 319 }
280 } 320 }
281 321
282 #endregion 322 public object[] GetStates()
283
284 #region Private methods
285
286 /// <summary>
287 /// Returns the WaiterEntry of the current thread
288 /// </summary>
289 /// <returns></returns>
290 /// In order to avoid creation and destuction of WaiterEntry
291 /// objects each thread has its own WaiterEntry object.
292 private WaiterEntry GetThreadWaiterEntry()
293 { 323 {
294 if (null == _waiterEntry) 324 lock (this)
295 { 325 {
296 _waiterEntry = new WaiterEntry(); 326 object[] states = new object[_workItems.Count];
327 int i = 0;
328 foreach (WorkItem workItem in _workItems)
329 {
330 states[i] = workItem.GetWorkItemResult().State;
331 ++i;
332 }
333 return states;
297 } 334 }
298 _waiterEntry.Reset();
299 return _waiterEntry;
300 } 335 }
301 336
302 #region Waiters stack methods 337 #endregion
303 338
304 /// <summary> 339 #region Private methods
305 /// Push a new waiter into the waiter's stack 340
306 /// </summary> 341 /// <summary>
307 /// <param name="newWaiterEntry">A waiter to put in the stack</param> 342 /// Returns the WaiterEntry of the current thread
308 public void PushWaiter(WaiterEntry newWaiterEntry) 343 /// </summary>
309 { 344 /// <returns></returns>
310 // Remove the waiter if it is already in the stack and 345 /// In order to avoid creation and destuction of WaiterEntry
311 // update waiter's count as needed 346 /// objects each thread has its own WaiterEntry object.
312 RemoveWaiter(newWaiterEntry, false); 347 private static WaiterEntry GetThreadWaiterEntry()
313 348 {
314 // If the stack is empty then newWaiterEntry is the new head of the stack 349 if (null == CurrentWaiterEntry)
315 if (null == _headWaiterEntry._nextWaiterEntry) 350 {
316 { 351 CurrentWaiterEntry = new WaiterEntry();
317 _headWaiterEntry._nextWaiterEntry = newWaiterEntry; 352 }
318 newWaiterEntry._prevWaiterEntry = _headWaiterEntry; 353 CurrentWaiterEntry.Reset();
319 354 return CurrentWaiterEntry;
320 } 355 }
321 // If the stack is not empty then put newWaiterEntry as the new head 356
322 // of the stack. 357 #region Waiters stack methods
323 else 358
324 { 359 /// <summary>
325 // Save the old first waiter entry 360 /// Push a new waiter into the waiter's stack
326 WaiterEntry oldFirstWaiterEntry = _headWaiterEntry._nextWaiterEntry; 361 /// </summary>
362 /// <param name="newWaiterEntry">A waiter to put in the stack</param>
363 public void PushWaiter(WaiterEntry newWaiterEntry)
364 {
365 // Remove the waiter if it is already in the stack and
366 // update waiter's count as needed
367 RemoveWaiter(newWaiterEntry, false);
368
369 // If the stack is empty then newWaiterEntry is the new head of the stack
370 if (null == _headWaiterEntry._nextWaiterEntry)
371 {
372 _headWaiterEntry._nextWaiterEntry = newWaiterEntry;
373 newWaiterEntry._prevWaiterEntry = _headWaiterEntry;
374
375 }
376 // If the stack is not empty then put newWaiterEntry as the new head
377 // of the stack.
378 else
379 {
380 // Save the old first waiter entry
381 WaiterEntry oldFirstWaiterEntry = _headWaiterEntry._nextWaiterEntry;
327 382
328 // Update the links 383 // Update the links
329 _headWaiterEntry._nextWaiterEntry = newWaiterEntry; 384 _headWaiterEntry._nextWaiterEntry = newWaiterEntry;
330 newWaiterEntry._nextWaiterEntry = oldFirstWaiterEntry; 385 newWaiterEntry._nextWaiterEntry = oldFirstWaiterEntry;
331 newWaiterEntry._prevWaiterEntry = _headWaiterEntry; 386 newWaiterEntry._prevWaiterEntry = _headWaiterEntry;
332 oldFirstWaiterEntry._prevWaiterEntry = newWaiterEntry; 387 oldFirstWaiterEntry._prevWaiterEntry = newWaiterEntry;
333 } 388 }
334 389
335 // Increment the number of waiters 390 // Increment the number of waiters
336 ++_waitersCount; 391 ++_waitersCount;
337 } 392 }
338 393
339 /// <summary> 394 /// <summary>
340 /// Pop a waiter from the waiter's stack 395 /// Pop a waiter from the waiter's stack
341 /// </summary> 396 /// </summary>
342 /// <returns>Returns the first waiter in the stack</returns> 397 /// <returns>Returns the first waiter in the stack</returns>
343 private WaiterEntry PopWaiter() 398 private WaiterEntry PopWaiter()
344 { 399 {
345 // Store the current stack head 400 // Store the current stack head
346 WaiterEntry oldFirstWaiterEntry = _headWaiterEntry._nextWaiterEntry; 401 WaiterEntry oldFirstWaiterEntry = _headWaiterEntry._nextWaiterEntry;
347 402
348 // Store the new stack head 403 // Store the new stack head
349 WaiterEntry newHeadWaiterEntry = oldFirstWaiterEntry._nextWaiterEntry; 404 WaiterEntry newHeadWaiterEntry = oldFirstWaiterEntry._nextWaiterEntry;
350 405
351 // Update the old stack head list links and decrement the number 406 // Update the old stack head list links and decrement the number
352 // waiters. 407 // waiters.
353 RemoveWaiter(oldFirstWaiterEntry, true); 408 RemoveWaiter(oldFirstWaiterEntry, true);
354 409
355 // Update the new stack head 410 // Update the new stack head
356 _headWaiterEntry._nextWaiterEntry = newHeadWaiterEntry; 411 _headWaiterEntry._nextWaiterEntry = newHeadWaiterEntry;
357 if (null != newHeadWaiterEntry) 412 if (null != newHeadWaiterEntry)
358 { 413 {
359 newHeadWaiterEntry._prevWaiterEntry = _headWaiterEntry; 414 newHeadWaiterEntry._prevWaiterEntry = _headWaiterEntry;
360 } 415 }
361 416
362 // Return the old stack head 417 // Return the old stack head
363 return oldFirstWaiterEntry; 418 return oldFirstWaiterEntry;
364 } 419 }
365 420
366 /// <summary> 421 /// <summary>
367 /// Remove a waiter from the stack 422 /// Remove a waiter from the stack
368 /// </summary> 423 /// </summary>
369 /// <param name="waiterEntry">A waiter entry to remove</param> 424 /// <param name="waiterEntry">A waiter entry to remove</param>
370 /// <param name="popDecrement">If true the waiter count is always decremented</param> 425 /// <param name="popDecrement">If true the waiter count is always decremented</param>
371 private void RemoveWaiter(WaiterEntry waiterEntry, bool popDecrement) 426 private void RemoveWaiter(WaiterEntry waiterEntry, bool popDecrement)
372 { 427 {
373 // Store the prev entry in the list 428 // Store the prev entry in the list
374 WaiterEntry prevWaiterEntry = waiterEntry._prevWaiterEntry; 429 WaiterEntry prevWaiterEntry = waiterEntry._prevWaiterEntry;
375 430
376 // Store the next entry in the list 431 // Store the next entry in the list
377 WaiterEntry nextWaiterEntry = waiterEntry._nextWaiterEntry; 432 WaiterEntry nextWaiterEntry = waiterEntry._nextWaiterEntry;
378 433
379 // A flag to indicate if we need to decrement the waiters count. 434 // A flag to indicate if we need to decrement the waiters count.
380 // If we got here from PopWaiter then we must decrement. 435 // If we got here from PopWaiter then we must decrement.
381 // If we got here from PushWaiter then we decrement only if 436 // If we got here from PushWaiter then we decrement only if
382 // the waiter was already in the stack. 437 // the waiter was already in the stack.
383 bool decrementCounter = popDecrement; 438 bool decrementCounter = popDecrement;
384 439
385 // Null the waiter's entry links 440 // Null the waiter's entry links
386 waiterEntry._prevWaiterEntry = null; 441 waiterEntry._prevWaiterEntry = null;
387 waiterEntry._nextWaiterEntry = null; 442 waiterEntry._nextWaiterEntry = null;
388 443
389 // If the waiter entry had a prev link then update it. 444 // If the waiter entry had a prev link then update it.
390 // It also means that the waiter is already in the list and we 445 // It also means that the waiter is already in the list and we
391 // need to decrement the waiters count. 446 // need to decrement the waiters count.
392 if (null != prevWaiterEntry) 447 if (null != prevWaiterEntry)
393 { 448 {
394 prevWaiterEntry._nextWaiterEntry = nextWaiterEntry; 449 prevWaiterEntry._nextWaiterEntry = nextWaiterEntry;
395 decrementCounter = true; 450 decrementCounter = true;
396 } 451 }
397 452
398 // If the waiter entry had a next link then update it. 453 // If the waiter entry had a next link then update it.
399 // It also means that the waiter is already in the list and we 454 // It also means that the waiter is already in the list and we
400 // need to decrement the waiters count. 455 // need to decrement the waiters count.
401 if (null != nextWaiterEntry) 456 if (null != nextWaiterEntry)
402 { 457 {
403 nextWaiterEntry._prevWaiterEntry = prevWaiterEntry; 458 nextWaiterEntry._prevWaiterEntry = prevWaiterEntry;
404 decrementCounter = true; 459 decrementCounter = true;
405 } 460 }
406 461
407 // Decrement the waiters count if needed 462 // Decrement the waiters count if needed
408 if (decrementCounter) 463 if (decrementCounter)
409 { 464 {
410 --_waitersCount; 465 --_waitersCount;
411 } 466 }
412 } 467 }
413 468
414 #endregion 469 #endregion
415 470
416 #endregion 471 #endregion
417 472
418 #region WaiterEntry class 473 #region WaiterEntry class
419 474
420 // A waiter entry in the _waiters queue. 475 // A waiter entry in the _waiters queue.
421 public class WaiterEntry : IDisposable 476 public sealed class WaiterEntry : IDisposable
422 { 477 {
423 #region Member variables 478 #region Member variables
424 479
425 /// <summary> 480 /// <summary>
426 /// Event to signal the waiter that it got the work item. 481 /// Event to signal the waiter that it got the work item.
427 /// </summary> 482 /// </summary>
428 private AutoResetEvent _waitHandle = new AutoResetEvent(false); 483 //private AutoResetEvent _waitHandle = new AutoResetEvent(false);
429 484 private AutoResetEvent _waitHandle = EventWaitHandleFactory.CreateAutoResetEvent();
430 /// <summary> 485
431 /// Flag to know if this waiter already quited from the queue 486 /// <summary>
432 /// because of a timeout. 487 /// Flag to know if this waiter already quited from the queue
433 /// </summary> 488 /// because of a timeout.
434 private bool _isTimedout = false; 489 /// </summary>
435 490 private bool _isTimedout = false;
436 /// <summary> 491
437 /// Flag to know if the waiter was signaled and got a work item. 492 /// <summary>
438 /// </summary> 493 /// Flag to know if the waiter was signaled and got a work item.
439 private bool _isSignaled = false; 494 /// </summary>
495 private bool _isSignaled = false;
440 496
441 /// <summary> 497 /// <summary>
442 /// A work item that passed directly to the waiter withou going 498 /// A work item that passed directly to the waiter withou going
443 /// through the queue 499 /// through the queue
444 /// </summary> 500 /// </summary>
445 private WorkItem _workItem = null; 501 private WorkItem _workItem = null;
446 502
447 private bool _isDisposed = false; 503 private bool _isDisposed = false;
448 504
449 // Linked list members 505 // Linked list members
450 internal WaiterEntry _nextWaiterEntry = null; 506 internal WaiterEntry _nextWaiterEntry = null;
451 internal WaiterEntry _prevWaiterEntry = null; 507 internal WaiterEntry _prevWaiterEntry = null;
452 508
453 #endregion 509 #endregion
454 510
455 #region Construction 511 #region Construction
456 512
457 public WaiterEntry() 513 public WaiterEntry()
458 { 514 {
459 Reset(); 515 Reset();
460 } 516 }
461 517
462 #endregion 518 #endregion
463 519
464 #region Public methods 520 #region Public methods
465 521
466 public WaitHandle WaitHandle 522 public WaitHandle WaitHandle
467 { 523 {
468 get { return _waitHandle; } 524 get { return _waitHandle; }
469 } 525 }
470 526
471 public WorkItem WorkItem 527 public WorkItem WorkItem
472 { 528 {
473 get 529 get
474 { 530 {
475 lock(this) 531 return _workItem;
476 { 532 }
477 return _workItem; 533 }
478 } 534
479 } 535 /// <summary>
480 } 536 /// Signal the waiter that it got a work item.
481 537 /// </summary>
482 /// <summary> 538 /// <returns>Return true on success</returns>
483 /// Signal the waiter that it got a work item. 539 /// The method fails if Timeout() preceded its call
484 /// </summary> 540 public bool Signal(WorkItem workItem)
485 /// <returns>Return true on success</returns> 541 {
486 /// The method fails if Timeout() preceded its call 542 lock(this)
487 public bool Signal(WorkItem workItem) 543 {
488 { 544 if (!_isTimedout)
489 lock(this) 545 {
490 { 546 _workItem = workItem;
491 if (!_isTimedout) 547 _isSignaled = true;
492 { 548 _waitHandle.Set();
493 _workItem = workItem; 549 return true;
494 _isSignaled = true; 550 }
495 _waitHandle.Set(); 551 }
496 return true; 552 return false;
497 } 553 }
498 } 554
499 return false; 555 /// <summary>
500 } 556 /// Mark the wait entry that it has been timed out
501 557 /// </summary>
502 /// <summary> 558 /// <returns>Return true on success</returns>
503 /// Mark the wait entry that it has been timed out 559 /// The method fails if Signal() preceded its call
504 /// </summary> 560 public bool Timeout()
505 /// <returns>Return true on success</returns> 561 {
506 /// The method fails if Signal() preceded its call 562 lock(this)
507 public bool Timeout() 563 {
508 { 564 // Time out can happen only if the waiter wasn't marked as
509 lock(this) 565 // signaled
566 if (!_isSignaled)
567 {
568 // We don't remove the waiter from the queue, the DequeueWorkItem
569 // method skips _waiters that were timed out.
570 _isTimedout = true;
571 return true;
572 }
573 }
574 return false;
575 }
576
577 /// <summary>
578 /// Reset the wait entry so it can be used again
579 /// </summary>
580 public void Reset()
581 {
582 _workItem = null;
583 _isTimedout = false;
584 _isSignaled = false;
585 _waitHandle.Reset();
586 }
587
588 /// <summary>
589 /// Free resources
590 /// </summary>
591 public void Close()
592 {
593 if (null != _waitHandle)
594 {
595 _waitHandle.Close();
596 _waitHandle = null;
597 }
598 }
599
600 #endregion
601
602 #region IDisposable Members
603
604 public void Dispose()
605 {
606 lock (this)
510 { 607 {
511 // Time out can happen only if the waiter wasn't marked as 608 if (!_isDisposed)
512 // signaled
513 if (!_isSignaled)
514 { 609 {
515 // We don't remove the waiter from the queue, the DequeueWorkItem 610 Close();
516 // method skips _waiters that were timed out.
517 _isTimedout = true;
518 return true;
519 } 611 }
520 }
521 return false;
522 }
523
524 /// <summary>
525 /// Reset the wait entry so it can be used again
526 /// </summary>
527 public void Reset()
528 {
529 _workItem = null;
530 _isTimedout = false;
531 _isSignaled = false;
532 _waitHandle.Reset();
533 }
534
535 /// <summary>
536 /// Free resources
537 /// </summary>
538 public void Close()
539 {
540 if (null != _waitHandle)
541 {
542 _waitHandle.Close();
543 _waitHandle = null;
544 }
545 }
546
547 #endregion
548
549 #region IDisposable Members
550
551 public void Dispose()
552 {
553 if (!_isDisposed)
554 {
555 Close();
556 _isDisposed = true; 612 _isDisposed = true;
557 } 613 }
558 } 614 }
559 615
560 ~WaiterEntry() 616 #endregion
561 { 617 }
562 Dispose();
563 }
564 618
565 #endregion 619 #endregion
566 }
567
568 #endregion
569 620
570 #region IDisposable Members 621 #region IDisposable Members
571 622
@@ -574,14 +625,8 @@ namespace Amib.Threading.Internal
574 if (!_isDisposed) 625 if (!_isDisposed)
575 { 626 {
576 Cleanup(); 627 Cleanup();
577 _isDisposed = true;
578 GC.SuppressFinalize(this);
579 } 628 }
580 } 629 _isDisposed = true;
581
582 ~WorkItemsQueue()
583 {
584 Cleanup();
585 } 630 }
586 631
587 private void ValidateNotDisposed() 632 private void ValidateNotDisposed()
@@ -595,6 +640,6 @@ namespace Amib.Threading.Internal
595 #endregion 640 #endregion
596 } 641 }
597 642
598 #endregion 643 #endregion
599} 644}
600 645
diff --git a/bin/BulletXNA.dll b/bin/BulletXNA.dll
index bfaac4f..b3ddc32 100644
--- a/bin/BulletXNA.dll
+++ b/bin/BulletXNA.dll
Binary files differ
diff --git a/bin/BulletXNA.pdb b/bin/BulletXNA.pdb
index ecab22f..ed3baad 100644
--- a/bin/BulletXNA.pdb
+++ b/bin/BulletXNA.pdb
Binary files differ
diff --git a/bin/OpenMetaverse.Http.XML b/bin/OpenMetaverse.Http.XML
deleted file mode 100644
index 23173ae..0000000
--- a/bin/OpenMetaverse.Http.XML
+++ /dev/null
@@ -1,57 +0,0 @@
1<?xml version="1.0"?>
2<doc>
3 <assembly>
4 <name>OpenMetaverse.Http</name>
5 </assembly>
6 <members>
7 <member name="F:OpenMetaverse.Http.EventQueueServer.CONNECTION_TIMEOUT">
8 <summary>The number of milliseconds to wait before the connection times out
9 and an empty response is sent to the client. This value should be higher
10 than BATCH_WAIT_INTERVAL for the timeout to function properly</summary>
11 </member>
12 <member name="F:OpenMetaverse.Http.EventQueueServer.BATCH_WAIT_INTERVAL">
13 <summary>This interval defines the amount of time to wait, in milliseconds,
14 for new events to show up on the queue before sending a response to the
15 client and completing the HTTP request. The interval also specifies the
16 maximum time that can pass before the queue shuts down after Stop() or the
17 class destructor is called</summary>
18 </member>
19 <member name="F:OpenMetaverse.Http.EventQueueServer.MAX_EVENTS_PER_RESPONSE">
20 <summary>Since multiple events can be batched together and sent in the same
21 response, this prevents the event queue thread from infinitely dequeueing
22 events and never sending a response if there is a constant stream of new
23 events</summary>
24 </member>
25 <member name="T:OpenMetaverse.Http.Logger">
26 <summary>
27 Singleton logging class for the entire library
28 </summary>
29 </member>
30 <member name="F:OpenMetaverse.Http.Logger.Log">
31 <summary>log4net logging engine</summary>
32 </member>
33 <member name="F:OpenMetaverse.Http.log4netLogWriter.Instance">
34 <summary>
35 Singleton instance of this class
36 </summary>
37 </member>
38 <member name="T:OpenMetaverse.Http.CapsRequestCallback">
39 <summary>
40 Delegate for handling incoming HTTP requests through a capability
41 </summary>
42 <param name="context">Client context</param>
43 <param name="request">HTTP request</param>
44 <param name="response">HTTP response</param>
45 <param name="state">User-defined state object</param>
46 </member>
47 <member name="F:OpenMetaverse.Http.EventQueueClient.REQUEST_TIMEOUT">
48 <summary>=</summary>
49 </member>
50 <member name="F:OpenMetaverse.Http.EventQueueClient._errorCount">
51 <summary>Number of times we've received an unknown CAPS exception in series.</summary>
52 </member>
53 <member name="F:OpenMetaverse.Http.EventQueueClient._random">
54 <summary>For exponential backoff on error.</summary>
55 </member>
56 </members>
57</doc>
diff --git a/bin/OpenMetaverse.Rendering.Meshmerizer.dll b/bin/OpenMetaverse.Rendering.Meshmerizer.dll
index 30b9c7b..100916c 100755
--- a/bin/OpenMetaverse.Rendering.Meshmerizer.dll
+++ b/bin/OpenMetaverse.Rendering.Meshmerizer.dll
Binary files differ
diff --git a/bin/OpenMetaverse.StructuredData.XML b/bin/OpenMetaverse.StructuredData.XML
index d6c31df..789ad5b 100644
--- a/bin/OpenMetaverse.StructuredData.XML
+++ b/bin/OpenMetaverse.StructuredData.XML
@@ -1,63 +1,55 @@
1<?xml version="1.0"?> 1<?xml version="1.0"?>
2<doc> 2<doc>
3 <assembly> 3 <assembly>
4 <name>/home/root/libomv-0.9.1-source/bin/OpenMetaverse.StructuredData</name> 4 <name>OpenMetaverse.StructuredData</name>
5 </assembly> 5 </assembly>
6 <members> 6 <members>
7 <member name="T:OpenMetaverse.StructuredData.OSDType"> 7 <member name="T:OpenMetaverse.StructuredData.OSDType">
8 <summary> 8 <summary>
9
9 </summary> 10 </summary>
10 </member> 11 </member>
11 <member name="F:OpenMetaverse.StructuredData.OSDType.Unknown"> 12 <member name="F:OpenMetaverse.StructuredData.OSDType.Unknown">
12 <summary> 13 <summary></summary>
13 </summary>
14 </member> 14 </member>
15 <member name="F:OpenMetaverse.StructuredData.OSDType.Boolean"> 15 <member name="F:OpenMetaverse.StructuredData.OSDType.Boolean">
16 <summary> 16 <summary></summary>
17 </summary>
18 </member> 17 </member>
19 <member name="F:OpenMetaverse.StructuredData.OSDType.Integer"> 18 <member name="F:OpenMetaverse.StructuredData.OSDType.Integer">
20 <summary> 19 <summary></summary>
21 </summary>
22 </member> 20 </member>
23 <member name="F:OpenMetaverse.StructuredData.OSDType.Real"> 21 <member name="F:OpenMetaverse.StructuredData.OSDType.Real">
24 <summary> 22 <summary></summary>
25 </summary>
26 </member> 23 </member>
27 <member name="F:OpenMetaverse.StructuredData.OSDType.String"> 24 <member name="F:OpenMetaverse.StructuredData.OSDType.String">
28 <summary> 25 <summary></summary>
29 </summary>
30 </member> 26 </member>
31 <member name="F:OpenMetaverse.StructuredData.OSDType.UUID"> 27 <member name="F:OpenMetaverse.StructuredData.OSDType.UUID">
32 <summary> 28 <summary></summary>
33 </summary>
34 </member> 29 </member>
35 <member name="F:OpenMetaverse.StructuredData.OSDType.Date"> 30 <member name="F:OpenMetaverse.StructuredData.OSDType.Date">
36 <summary> 31 <summary></summary>
37 </summary>
38 </member> 32 </member>
39 <member name="F:OpenMetaverse.StructuredData.OSDType.URI"> 33 <member name="F:OpenMetaverse.StructuredData.OSDType.URI">
40 <summary> 34 <summary></summary>
41 </summary>
42 </member> 35 </member>
43 <member name="F:OpenMetaverse.StructuredData.OSDType.Binary"> 36 <member name="F:OpenMetaverse.StructuredData.OSDType.Binary">
44 <summary> 37 <summary></summary>
45 </summary>
46 </member> 38 </member>
47 <member name="F:OpenMetaverse.StructuredData.OSDType.Map"> 39 <member name="F:OpenMetaverse.StructuredData.OSDType.Map">
48 <summary> 40 <summary></summary>
49 </summary>
50 </member> 41 </member>
51 <member name="F:OpenMetaverse.StructuredData.OSDType.Array"> 42 <member name="F:OpenMetaverse.StructuredData.OSDType.Array">
52 <summary> 43 <summary></summary>
53 </summary>
54 </member> 44 </member>
55 <member name="T:OpenMetaverse.StructuredData.OSDException"> 45 <member name="T:OpenMetaverse.StructuredData.OSDException">
56 <summary> 46 <summary>
47
57 </summary> 48 </summary>
58 </member> 49 </member>
59 <member name="T:OpenMetaverse.StructuredData.OSD"> 50 <member name="T:OpenMetaverse.StructuredData.OSD">
60 <summary> 51 <summary>
52
61 </summary> 53 </summary>
62 </member> 54 </member>
63 <member name="M:OpenMetaverse.StructuredData.OSD.SerializeMembers(System.Object)"> 55 <member name="M:OpenMetaverse.StructuredData.OSD.SerializeMembers(System.Object)">
@@ -81,50 +73,63 @@
81 </member> 73 </member>
82 <member name="T:OpenMetaverse.StructuredData.OSDBoolean"> 74 <member name="T:OpenMetaverse.StructuredData.OSDBoolean">
83 <summary> 75 <summary>
76
84 </summary> 77 </summary>
85 </member> 78 </member>
86 <member name="T:OpenMetaverse.StructuredData.OSDInteger"> 79 <member name="T:OpenMetaverse.StructuredData.OSDInteger">
87 <summary> 80 <summary>
81
88 </summary> 82 </summary>
89 </member> 83 </member>
90 <member name="T:OpenMetaverse.StructuredData.OSDReal"> 84 <member name="T:OpenMetaverse.StructuredData.OSDReal">
91 <summary> 85 <summary>
86
92 </summary> 87 </summary>
93 </member> 88 </member>
94 <member name="T:OpenMetaverse.StructuredData.OSDString"> 89 <member name="T:OpenMetaverse.StructuredData.OSDString">
95 <summary> 90 <summary>
91
96 </summary> 92 </summary>
97 </member> 93 </member>
98 <member name="T:OpenMetaverse.StructuredData.OSDUUID"> 94 <member name="T:OpenMetaverse.StructuredData.OSDUUID">
99 <summary> 95 <summary>
96
100 </summary> 97 </summary>
101 </member> 98 </member>
102 <member name="T:OpenMetaverse.StructuredData.OSDDate"> 99 <member name="T:OpenMetaverse.StructuredData.OSDDate">
103 <summary> 100 <summary>
101
104 </summary> 102 </summary>
105 </member> 103 </member>
106 <member name="T:OpenMetaverse.StructuredData.OSDUri"> 104 <member name="T:OpenMetaverse.StructuredData.OSDUri">
107 <summary> 105 <summary>
106
108 </summary> 107 </summary>
109 </member> 108 </member>
110 <member name="T:OpenMetaverse.StructuredData.OSDBinary"> 109 <member name="T:OpenMetaverse.StructuredData.OSDBinary">
111 <summary> 110 <summary>
111
112 </summary> 112 </summary>
113 </member> 113 </member>
114 <member name="T:OpenMetaverse.StructuredData.OSDMap"> 114 <member name="T:OpenMetaverse.StructuredData.OSDMap">
115 <summary> 115 <summary>
116
116 </summary> 117 </summary>
117 </member> 118 </member>
118 <member name="T:OpenMetaverse.StructuredData.OSDArray"> 119 <member name="T:OpenMetaverse.StructuredData.OSDArray">
119 <summary> 120 <summary>
121
120 </summary> 122 </summary>
121 </member> 123 </member>
122 <member name="T:OpenMetaverse.StructuredData.OSDParser"> 124 <member name="T:OpenMetaverse.StructuredData.OSDParser">
123 <summary> 125 <summary>
126
124 </summary> 127 </summary>
125 <summary> 128 <summary>
129
126 </summary> 130 </summary>
127 <summary> 131 <summary>
132
128 </summary> 133 </summary>
129 </member> 134 </member>
130 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDBinary(System.Byte[])"> 135 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDBinary(System.Byte[])">
@@ -153,8 +158,7 @@
153 Serializes OSD to binary format 158 Serializes OSD to binary format
154 </summary> 159 </summary>
155 <param name="osd">OSD to serialize</param> 160 <param name="osd">OSD to serialize</param>
156 <param name="prependHeader"> 161 <param name="prependHeader"></param>
157 </param>
158 <returns>Serialized data</returns> 162 <returns>Serialized data</returns>
159 </member> 163 </member>
160 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDBinaryStream(OpenMetaverse.StructuredData.OSD)"> 164 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDBinaryStream(OpenMetaverse.StructuredData.OSD)">
@@ -169,209 +173,177 @@
169 Serializes OSD to binary format 173 Serializes OSD to binary format
170 </summary> 174 </summary>
171 <param name="data">OSD to serialize</param> 175 <param name="data">OSD to serialize</param>
172 <param name="prependHeader"> 176 <param name="prependHeader"></param>
173 </param>
174 <returns>Serialized data</returns> 177 <returns>Serialized data</returns>
175 </member> 178 </member>
176 <member name="M:OpenMetaverse.StructuredData.OSDParser.SkipWhiteSpace(System.IO.Stream)"> 179 <member name="M:OpenMetaverse.StructuredData.OSDParser.SkipWhiteSpace(System.IO.Stream)">
177 <summary> 180 <summary>
181
178 </summary> 182 </summary>
179 <param name="stream"> 183 <param name="stream"></param>
180 </param>
181 </member> 184 </member>
182 <member name="M:OpenMetaverse.StructuredData.OSDParser.FindByte(System.IO.Stream,System.Byte)"> 185 <member name="M:OpenMetaverse.StructuredData.OSDParser.FindByte(System.IO.Stream,System.Byte)">
183 <summary> 186 <summary>
187
184 </summary> 188 </summary>
185 <param name="stream"> 189 <param name="stream"></param>
186 </param> 190 <param name="toFind"></param>
187 <param name="toFind"> 191 <returns></returns>
188 </param>
189 <returns>
190 </returns>
191 </member> 192 </member>
192 <member name="M:OpenMetaverse.StructuredData.OSDParser.FindString(System.IO.Stream,System.String)"> 193 <member name="M:OpenMetaverse.StructuredData.OSDParser.FindString(System.IO.Stream,System.String)">
193 <summary> 194 <summary>
195
194 </summary> 196 </summary>
195 <param name="stream"> 197 <param name="stream"></param>
196 </param> 198 <param name="toFind"></param>
197 <param name="toFind"> 199 <returns></returns>
198 </param>
199 <returns>
200 </returns>
201 </member> 200 </member>
202 <member name="M:OpenMetaverse.StructuredData.OSDParser.ConsumeBytes(System.IO.Stream,System.Int32)"> 201 <member name="M:OpenMetaverse.StructuredData.OSDParser.ConsumeBytes(System.IO.Stream,System.Int32)">
203 <summary> 202 <summary>
203
204 </summary> 204 </summary>
205 <param name="stream"> 205 <param name="stream"></param>
206 </param> 206 <param name="consumeBytes"></param>
207 <param name="consumeBytes"> 207 <returns></returns>
208 </param>
209 <returns>
210 </returns>
211 </member> 208 </member>
212 <member name="M:OpenMetaverse.StructuredData.OSDParser.NetworkToHostInt(System.Byte[])"> 209 <member name="M:OpenMetaverse.StructuredData.OSDParser.NetworkToHostInt(System.Byte[])">
213 <summary> 210 <summary>
211
214 </summary> 212 </summary>
215 <param name="binaryNetEnd"> 213 <param name="binaryNetEnd"></param>
216 </param> 214 <returns></returns>
217 <returns>
218 </returns>
219 </member> 215 </member>
220 <member name="M:OpenMetaverse.StructuredData.OSDParser.NetworkToHostDouble(System.Byte[])"> 216 <member name="M:OpenMetaverse.StructuredData.OSDParser.NetworkToHostDouble(System.Byte[])">
221 <summary> 217 <summary>
218
222 </summary> 219 </summary>
223 <param name="binaryNetEnd"> 220 <param name="binaryNetEnd"></param>
224 </param> 221 <returns></returns>
225 <returns>
226 </returns>
227 </member> 222 </member>
228 <member name="M:OpenMetaverse.StructuredData.OSDParser.HostToNetworkIntBytes(System.Int32)"> 223 <member name="M:OpenMetaverse.StructuredData.OSDParser.HostToNetworkIntBytes(System.Int32)">
229 <summary> 224 <summary>
225
230 </summary> 226 </summary>
231 <param name="intHostEnd"> 227 <param name="intHostEnd"></param>
232 </param> 228 <returns></returns>
233 <returns>
234 </returns>
235 </member> 229 </member>
236 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDNotationElement(System.IO.StringReader)"> 230 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.Byte[])">
237 <summary> 231 <summary>
232
238 </summary> 233 </summary>
239 <param name="reader"> 234 <param name="xmlData"></param>
240 </param> 235 <returns></returns>
241 <returns>
242 </returns>
243 </member> 236 </member>
244 <member name="M:OpenMetaverse.StructuredData.OSDParser.PeekAndSkipWhitespace(System.IO.StringReader)"> 237 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.String)">
245 <summary> 238 <summary>
239
246 </summary> 240 </summary>
247 <param name="reader"> 241 <param name="xmlData"></param>
248 </param> 242 <returns></returns>
249 <returns>
250 </returns>
251 </member> 243 </member>
252 <member name="M:OpenMetaverse.StructuredData.OSDParser.ReadAndSkipWhitespace(System.IO.StringReader)"> 244 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.Xml.XmlTextReader)">
253 <summary> 245 <summary>
246
254 </summary> 247 </summary>
255 <param name="reader"> 248 <param name="xmlData"></param>
256 </param> 249 <returns></returns>
257 <returns>
258 </returns>
259 </member> 250 </member>
260 <member name="M:OpenMetaverse.StructuredData.OSDParser.GetLengthInBrackets(System.IO.StringReader)"> 251 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlBytes(OpenMetaverse.StructuredData.OSD)">
261 <summary> 252 <summary>
253
262 </summary> 254 </summary>
263 <param name="reader"> 255 <param name="data"></param>
264 </param> 256 <returns></returns>
265 <returns>
266 </returns>
267 </member> 257 </member>
268 <member name="M:OpenMetaverse.StructuredData.OSDParser.GetStringDelimitedBy(System.IO.StringReader,System.Char)"> 258 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlString(OpenMetaverse.StructuredData.OSD)">
269 <summary> 259 <summary>
260
270 </summary> 261 </summary>
271 <param name="reader"> 262 <param name="data"></param>
272 </param> 263 <returns></returns>
273 <param name="delimiter">
274 </param>
275 <returns>
276 </returns>
277 </member> 264 </member>
278 <member name="M:OpenMetaverse.StructuredData.OSDParser.BufferCharactersEqual(System.IO.StringReader,System.Char[],System.Int32)"> 265 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlElement(System.Xml.XmlTextWriter,OpenMetaverse.StructuredData.OSD)">
279 <summary> 266 <summary>
267
280 </summary> 268 </summary>
281 <param name="reader"> 269 <param name="writer"></param>
282 </param> 270 <param name="data"></param>
283 <param name="buffer">
284 </param>
285 <param name="offset">
286 </param>
287 <returns>
288 </returns>
289 </member> 271 </member>
290 <member name="M:OpenMetaverse.StructuredData.OSDParser.UnescapeCharacter(System.String,System.Char)"> 272 <member name="M:OpenMetaverse.StructuredData.OSDParser.TryValidateLLSDXml(System.Xml.XmlTextReader,System.String@)">
291 <summary> 273 <summary>
274
292 </summary> 275 </summary>
293 <param name="s"> 276 <param name="xmlData"></param>
294 </param> 277 <param name="error"></param>
295 <param name="c"> 278 <returns></returns>
296 </param>
297 <returns>
298 </returns>
299 </member> 279 </member>
300 <member name="M:OpenMetaverse.StructuredData.OSDParser.EscapeCharacter(System.String,System.Char)"> 280 <member name="M:OpenMetaverse.StructuredData.OSDParser.ParseLLSDXmlElement(System.Xml.XmlTextReader)">
301 <summary> 281 <summary>
282
302 </summary> 283 </summary>
303 <param name="s"> 284 <param name="reader"></param>
304 </param> 285 <returns></returns>
305 <param name="c">
306 </param>
307 <returns>
308 </returns>
309 </member> 286 </member>
310 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.Byte[])"> 287 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDNotationElement(System.IO.StringReader)">
311 <summary> 288 <summary>
289
312 </summary> 290 </summary>
313 <param name="xmlData"> 291 <param name="reader"></param>
314 </param> 292 <returns></returns>
315 <returns>
316 </returns>
317 </member> 293 </member>
318 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.String)"> 294 <member name="M:OpenMetaverse.StructuredData.OSDParser.PeekAndSkipWhitespace(System.IO.StringReader)">
319 <summary> 295 <summary>
296
320 </summary> 297 </summary>
321 <param name="xmlData"> 298 <param name="reader"></param>
322 </param> 299 <returns></returns>
323 <returns>
324 </returns>
325 </member> 300 </member>
326 <member name="M:OpenMetaverse.StructuredData.OSDParser.DeserializeLLSDXml(System.Xml.XmlTextReader)"> 301 <member name="M:OpenMetaverse.StructuredData.OSDParser.ReadAndSkipWhitespace(System.IO.StringReader)">
327 <summary> 302 <summary>
303
328 </summary> 304 </summary>
329 <param name="xmlData"> 305 <param name="reader"></param>
330 </param> 306 <returns></returns>
331 <returns>
332 </returns>
333 </member> 307 </member>
334 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlBytes(OpenMetaverse.StructuredData.OSD)"> 308 <member name="M:OpenMetaverse.StructuredData.OSDParser.GetLengthInBrackets(System.IO.StringReader)">
335 <summary> 309 <summary>
310
336 </summary> 311 </summary>
337 <param name="data"> 312 <param name="reader"></param>
338 </param> 313 <returns></returns>
339 <returns>
340 </returns>
341 </member> 314 </member>
342 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlString(OpenMetaverse.StructuredData.OSD)"> 315 <member name="M:OpenMetaverse.StructuredData.OSDParser.GetStringDelimitedBy(System.IO.StringReader,System.Char)">
343 <summary> 316 <summary>
317
344 </summary> 318 </summary>
345 <param name="data"> 319 <param name="reader"></param>
346 </param> 320 <param name="delimiter"></param>
347 <returns> 321 <returns></returns>
348 </returns>
349 </member> 322 </member>
350 <member name="M:OpenMetaverse.StructuredData.OSDParser.SerializeLLSDXmlElement(System.Xml.XmlTextWriter,OpenMetaverse.StructuredData.OSD)"> 323 <member name="M:OpenMetaverse.StructuredData.OSDParser.BufferCharactersEqual(System.IO.StringReader,System.Char[],System.Int32)">
351 <summary> 324 <summary>
325
352 </summary> 326 </summary>
353 <param name="writer"> 327 <param name="reader"></param>
354 </param> 328 <param name="buffer"></param>
355 <param name="data"> 329 <param name="offset"></param>
356 </param> 330 <returns></returns>
357 </member> 331 </member>
358 <member name="M:OpenMetaverse.StructuredData.OSDParser.TryValidateLLSDXml(System.Xml.XmlTextReader,System.String@)"> 332 <member name="M:OpenMetaverse.StructuredData.OSDParser.UnescapeCharacter(System.String,System.Char)">
359 <summary> 333 <summary>
334
360 </summary> 335 </summary>
361 <param name="xmlData"> 336 <param name="s"></param>
362 </param> 337 <param name="c"></param>
363 <param name="error"> 338 <returns></returns>
364 </param>
365 <returns>
366 </returns>
367 </member> 339 </member>
368 <member name="M:OpenMetaverse.StructuredData.OSDParser.ParseLLSDXmlElement(System.Xml.XmlTextReader)"> 340 <member name="M:OpenMetaverse.StructuredData.OSDParser.EscapeCharacter(System.String,System.Char)">
369 <summary> 341 <summary>
342
370 </summary> 343 </summary>
371 <param name="reader"> 344 <param name="s"></param>
372 </param> 345 <param name="c"></param>
373 <returns> 346 <returns></returns>
374 </returns>
375 </member> 347 </member>
376 </members> 348 </members>
377</doc> 349</doc>
diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll
index c7216ce..bb16ed0 100755
--- a/bin/OpenMetaverse.StructuredData.dll
+++ b/bin/OpenMetaverse.StructuredData.dll
Binary files differ
diff --git a/bin/OpenMetaverse.XML b/bin/OpenMetaverse.XML
index 81cc005..457cbe1 100644
--- a/bin/OpenMetaverse.XML
+++ b/bin/OpenMetaverse.XML
@@ -1,1829 +1,3048 @@
1<?xml version="1.0"?> 1<?xml version="1.0"?>
2<doc> 2<doc>
3 <assembly> 3 <assembly>
4 <name>/home/root/libomv-0.9.1-source/bin/OpenMetaverse</name> 4 <name>OpenMetaverse</name>
5 </assembly> 5 </assembly>
6 <members> 6 <members>
7 <member name="T:OpenMetaverse.ScriptPermission"> 7 <member name="M:OpenMetaverse.Voice.VoiceGateway.StartDaemon(System.String,System.String)">
8 <summary> 8 <summary>
9 Permission request flags, asked when a script wants to control an Avatar 9 Starts a thread that keeps the daemon running
10 </summary> 10 </summary>
11 <param name="path"></param>
12 <param name="args"></param>
11 </member> 13 </member>
12 <member name="F:OpenMetaverse.ScriptPermission.None"> 14 <member name="M:OpenMetaverse.Voice.VoiceGateway.StopDaemon">
13 <summary>Placeholder for empty values, shouldn't ever see this</summary>
14 </member>
15 <member name="F:OpenMetaverse.ScriptPermission.Debit">
16 <summary>Script wants ability to take money from you</summary>
17 </member>
18 <member name="F:OpenMetaverse.ScriptPermission.TakeControls">
19 <summary>Script wants to take camera controls for you</summary>
20 </member>
21 <member name="F:OpenMetaverse.ScriptPermission.RemapControls">
22 <summary>Script wants to remap avatars controls</summary>
23 </member>
24 <member name="F:OpenMetaverse.ScriptPermission.TriggerAnimation">
25 <summary>Script wants to trigger avatar animations</summary>
26 <remarks>This function is not implemented on the grid</remarks>
27 </member>
28 <member name="F:OpenMetaverse.ScriptPermission.Attach">
29 <summary>Script wants to attach or detach the prim or primset to your avatar</summary>
30 </member>
31 <member name="F:OpenMetaverse.ScriptPermission.ReleaseOwnership">
32 <summary>Script wants permission to release ownership</summary>
33 <remarks>This function is not implemented on the grid
34 The concept of "public" objects does not exist anymore.</remarks>
35 </member>
36 <member name="F:OpenMetaverse.ScriptPermission.ChangeLinks">
37 <summary>Script wants ability to link/delink with other prims</summary>
38 </member>
39 <member name="F:OpenMetaverse.ScriptPermission.ChangeJoints">
40 <summary>Script wants permission to change joints</summary>
41 <remarks>This function is not implemented on the grid</remarks>
42 </member>
43 <member name="F:OpenMetaverse.ScriptPermission.ChangePermissions">
44 <summary>Script wants permissions to change permissions</summary>
45 <remarks>This function is not implemented on the grid</remarks>
46 </member>
47 <member name="F:OpenMetaverse.ScriptPermission.TrackCamera">
48 <summary>Script wants to track avatars camera position and rotation </summary>
49 </member>
50 <member name="F:OpenMetaverse.ScriptPermission.ControlCamera">
51 <summary>Script wants to control your camera</summary>
52 </member>
53 <member name="T:OpenMetaverse.InstantMessageDialog">
54 <summary> 15 <summary>
55 Special commands used in Instant Messages 16 Stops the daemon and the thread keeping it running
56 </summary> 17 </summary>
57 </member> 18 </member>
58 <member name="F:OpenMetaverse.InstantMessageDialog.MessageFromAgent"> 19 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectToDaemon(System.String,System.Int32)">
59 <summary>Indicates a regular IM from another agent</summary>
60 </member>
61 <member name="F:OpenMetaverse.InstantMessageDialog.MessageBox">
62 <summary>Simple notification box with an OK button</summary>
63 </member>
64 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitation">
65 <summary>You've been invited to join a group.</summary>
66 </member>
67 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryOffered">
68 <summary>Inventory offer</summary>
69 </member>
70 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryAccepted">
71 <summary>Accepted inventory offer</summary>
72 </member>
73 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryDeclined">
74 <summary>Declined inventory offer</summary>
75 </member>
76 <member name="F:OpenMetaverse.InstantMessageDialog.GroupVote">
77 <summary>Group vote</summary>
78 </member>
79 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryOffered">
80 <summary>An object is offering its inventory</summary>
81 </member>
82 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryAccepted">
83 <summary>Accept an inventory offer from an object</summary>
84 </member>
85 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryDeclined">
86 <summary>Decline an inventory offer from an object</summary>
87 </member>
88 <member name="F:OpenMetaverse.InstantMessageDialog.NewUserDefault">
89 <summary>Unknown</summary>
90 </member>
91 <member name="F:OpenMetaverse.InstantMessageDialog.SessionAdd">
92 <summary>Start a session, or add users to a session</summary>
93 </member>
94 <member name="F:OpenMetaverse.InstantMessageDialog.SessionOfflineAdd">
95 <summary>Start a session, but don't prune offline users</summary>
96 </member>
97 <member name="F:OpenMetaverse.InstantMessageDialog.SessionGroupStart">
98 <summary>Start a session with your group</summary>
99 </member>
100 <member name="F:OpenMetaverse.InstantMessageDialog.SessionCardlessStart">
101 <summary>Start a session without a calling card (finder or objects)</summary>
102 </member>
103 <member name="F:OpenMetaverse.InstantMessageDialog.SessionSend">
104 <summary>Send a message to a session</summary>
105 </member>
106 <member name="F:OpenMetaverse.InstantMessageDialog.SessionDrop">
107 <summary>Leave a session</summary>
108 </member>
109 <member name="F:OpenMetaverse.InstantMessageDialog.MessageFromObject">
110 <summary>Indicates that the IM is from an object</summary>
111 </member>
112 <member name="F:OpenMetaverse.InstantMessageDialog.BusyAutoResponse">
113 <summary>Sent an IM to a busy user, this is the auto response</summary>
114 </member>
115 <member name="F:OpenMetaverse.InstantMessageDialog.ConsoleAndChatHistory">
116 <summary>Shows the message in the console and chat history</summary>
117 </member>
118 <member name="F:OpenMetaverse.InstantMessageDialog.RequestTeleport">
119 <summary>Send a teleport lure</summary>
120 </member>
121 <member name="F:OpenMetaverse.InstantMessageDialog.AcceptTeleport">
122 <summary>Response sent to the agent which inititiated a teleport invitation</summary>
123 </member>
124 <member name="F:OpenMetaverse.InstantMessageDialog.DenyTeleport">
125 <summary>Response sent to the agent which inititiated a teleport invitation</summary>
126 </member>
127 <member name="F:OpenMetaverse.InstantMessageDialog.GodLikeRequestTeleport">
128 <summary>Only useful if you have Linden permissions</summary>
129 </member>
130 <member name="F:OpenMetaverse.InstantMessageDialog.CurrentlyUnused">
131 <summary>A placeholder type for future expansion, currently not
132 used</summary>
133 </member>
134 <member name="F:OpenMetaverse.InstantMessageDialog.GotoUrl">
135 <summary>IM to tell the user to go to an URL</summary>
136 </member>
137 <member name="F:OpenMetaverse.InstantMessageDialog.Session911Start">
138 <summary>IM for help</summary>
139 </member>
140 <member name="F:OpenMetaverse.InstantMessageDialog.Lure911">
141 <summary>IM sent automatically on call for help, sends a lure
142 to each Helper reached</summary>
143 </member>
144 <member name="F:OpenMetaverse.InstantMessageDialog.FromTaskAsAlert">
145 <summary>Like an IM but won't go to email</summary>
146 </member>
147 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNotice">
148 <summary>IM from a group officer to all group members</summary>
149 </member>
150 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeInventoryAccepted">
151 <summary>Unknown</summary>
152 </member>
153 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeInventoryDeclined">
154 <summary>Unknown</summary>
155 </member>
156 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitationAccept">
157 <summary>Accept a group invitation</summary>
158 </member>
159 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitationDecline">
160 <summary>Decline a group invitation</summary>
161 </member>
162 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeRequested">
163 <summary>Unknown</summary>
164 </member>
165 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipOffered">
166 <summary>An avatar is offering you friendship</summary>
167 </member>
168 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipAccepted">
169 <summary>An avatar has accepted your friendship offer</summary>
170 </member>
171 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipDeclined">
172 <summary>An avatar has declined your friendship offer</summary>
173 </member>
174 <member name="F:OpenMetaverse.InstantMessageDialog.StartTyping">
175 <summary>Indicates that a user has started typing</summary>
176 </member>
177 <member name="F:OpenMetaverse.InstantMessageDialog.StopTyping">
178 <summary>Indicates that a user has stopped typing</summary>
179 </member>
180 <member name="T:OpenMetaverse.InstantMessageOnline">
181 <summary> 20 <summary>
182 Flag in Instant Messages, whether the IM should be delivered to 21
183 offline avatars as well
184 </summary> 22 </summary>
23 <param name="address"></param>
24 <param name="port"></param>
25 <returns></returns>
185 </member> 26 </member>
186 <member name="F:OpenMetaverse.InstantMessageOnline.Online"> 27 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxGetCaptureDevices">
187 <summary>Only deliver to online avatars</summary>
188 </member>
189 <member name="F:OpenMetaverse.InstantMessageOnline.Offline">
190 <summary>If the avatar is offline the message will be held until
191 they login next, and possibly forwarded to their e-mail account</summary>
192 </member>
193 <member name="T:OpenMetaverse.ChatType">
194 <summary> 28 <summary>
195 Conversion type to denote Chat Packet types in an easier-to-understand format 29 This is used to get a list of audio devices that can be used for capture (input) of voice.
196 </summary> 30 </summary>
31 <returns></returns>
197 </member> 32 </member>
198 <member name="F:OpenMetaverse.ChatType.Whisper"> 33 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxGetRenderDevices">
199 <summary>Whisper (5m radius)</summary>
200 </member>
201 <member name="F:OpenMetaverse.ChatType.Normal">
202 <summary>Normal chat (10/20m radius), what the official viewer typically sends</summary>
203 </member>
204 <member name="F:OpenMetaverse.ChatType.Shout">
205 <summary>Shouting! (100m radius)</summary>
206 </member>
207 <member name="F:OpenMetaverse.ChatType.StartTyping">
208 <summary>Event message when an Avatar has begun to type</summary>
209 </member>
210 <member name="F:OpenMetaverse.ChatType.StopTyping">
211 <summary>Event message when an Avatar has stopped typing</summary>
212 </member>
213 <member name="F:OpenMetaverse.ChatType.Debug">
214 <summary>Send the message to the debug channel</summary>
215 </member>
216 <member name="F:OpenMetaverse.ChatType.OwnerSay">
217 <summary>Event message when an object uses llOwnerSay</summary>
218 </member>
219 <member name="F:OpenMetaverse.ChatType.RegionSay">
220 <summary>Special value to support llRegionSay, never sent to the client</summary>
221 </member>
222 <member name="T:OpenMetaverse.ChatSourceType">
223 <summary> 34 <summary>
224 Identifies the source of a chat message 35 This is used to get a list of audio devices that can be used for render (playback) of voice.
225 </summary> 36 </summary>
226 </member> 37 </member>
227 <member name="F:OpenMetaverse.ChatSourceType.System"> 38 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetRenderDevice(System.String)">
228 <summary>Chat from the grid or simulator</summary>
229 </member>
230 <member name="F:OpenMetaverse.ChatSourceType.Agent">
231 <summary>Chat from another avatar</summary>
232 </member>
233 <member name="F:OpenMetaverse.ChatSourceType.Object">
234 <summary>Chat from an object</summary>
235 </member>
236 <member name="T:OpenMetaverse.ChatAudibleLevel">
237 <summary> 39 <summary>
40 This command is used to select the render device.
238 </summary> 41 </summary>
42 <param name="RenderDeviceSpecifier">The name of the device as returned by the Aux.GetRenderDevices command.</param>
239 </member> 43 </member>
240 <member name="F:OpenMetaverse.ChatAudibleLevel.Not"> 44 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetCaptureDevice(System.String)">
241 <summary> 45 <summary>
46 This command is used to select the capture device.
242 </summary> 47 </summary>
48 <param name="CaptureDeviceSpecifier">The name of the device as returned by the Aux.GetCaptureDevices command.</param>
243 </member> 49 </member>
244 <member name="F:OpenMetaverse.ChatAudibleLevel.Barely"> 50 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxCaptureAudioStart(System.Int32)">
245 <summary> 51 <summary>
52 This command is used to start the audio capture process which will cause
53 AuxAudioProperty Events to be raised. These events can be used to display a
54 microphone VU meter for the currently selected capture device. This command
55 should not be issued if the user is on a call.
246 </summary> 56 </summary>
57 <param name="Duration">(unused but required)</param>
58 <returns></returns>
247 </member> 59 </member>
248 <member name="F:OpenMetaverse.ChatAudibleLevel.Fully"> 60 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxCaptureAudioStop">
249 <summary> 61 <summary>
62 This command is used to stop the audio capture process.
250 </summary> 63 </summary>
64 <returns></returns>
251 </member> 65 </member>
252 <member name="T:OpenMetaverse.EffectType"> 66 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetMicLevel(System.Int32)">
253 <summary> 67 <summary>
254 Effect type used in ViewerEffect packets 68 This command is used to set the mic volume while in the audio tuning process.
69 Once an acceptable mic level is attained, the application must issue a
70 connector set mic volume command to have that level be used while on voice
71 calls.
255 </summary> 72 </summary>
73 <param name="Level">the microphone volume (-100 to 100 inclusive)</param>
74 <returns></returns>
256 </member> 75 </member>
257 <member name="F:OpenMetaverse.EffectType.Text"> 76 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetSpeakerLevel(System.Int32)">
258 <summary> 77 <summary>
78 This command is used to set the speaker volume while in the audio tuning
79 process. Once an acceptable speaker level is attained, the application must
80 issue a connector set speaker volume command to have that level be used while
81 on voice calls.
259 </summary> 82 </summary>
83 <param name="Level">the speaker volume (-100 to 100 inclusive)</param>
84 <returns></returns>
260 </member> 85 </member>
261 <member name="F:OpenMetaverse.EffectType.Icon"> 86 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionCreate(System.String,System.String,System.String,System.String,System.Boolean,System.Boolean,System.String)">
262 <summary> 87 <summary>
88 Create a Session
89 Sessions typically represent a connection to a media session with one or more
90 participants. This is used to generate an ‘outbound’ call to another user or
91 channel. The specifics depend on the media types involved. A session handle is
92 required to control the local user functions within the session (or remote
93 users if the current account has rights to do so). Currently creating a
94 session automatically connects to the audio media, there is no need to call
95 Session.Connect at this time, this is reserved for future use.
263 </summary> 96 </summary>
97 <param name="AccountHandle">Handle returned from successful Connector ‘create’ request</param>
98 <param name="URI">This is the URI of the terminating point of the session (ie who/what is being called)</param>
99 <param name="Name">This is the display name of the entity being called (user or channel)</param>
100 <param name="Password">Only needs to be supplied when the target URI is password protected</param>
101 <param name="PasswordHashAlgorithm">This indicates the format of the password as passed in. This can either be
102 “ClearText†or “SHA1UserNameâ€. If this element does not exist, it is assumed to be “ClearTextâ€. If it is
103 “SHA1UserNameâ€, the password as passed in is the SHA1 hash of the password and username concatenated together,
104 then base64 encoded, with the final “=†character stripped off.</param>
105 <param name="JoinAudio"></param>
106 <param name="JoinText"></param>
107 <returns></returns>
264 </member> 108 </member>
265 <member name="F:OpenMetaverse.EffectType.Connector"> 109 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionConnect(System.String,System.String)">
266 <summary> 110 <summary>
111 Used to accept a call
267 </summary> 112 </summary>
113 <param name="SessionHandle">SessionHandle such as received from SessionNewEvent</param>
114 <param name="AudioMedia">"default"</param>
115 <returns></returns>
268 </member> 116 </member>
269 <member name="F:OpenMetaverse.EffectType.FlexibleObject"> 117 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionRenderAudioStart(System.String,System.Boolean)">
270 <summary> 118 <summary>
119 This command is used to start the audio render process, which will then play
120 the passed in file through the selected audio render device. This command
121 should not be issued if the user is on a call.
271 </summary> 122 </summary>
123 <param name="SoundFilePath">The fully qualified path to the sound file.</param>
124 <param name="Loop">True if the file is to be played continuously and false if it is should be played once.</param>
125 <returns></returns>
272 </member> 126 </member>
273 <member name="F:OpenMetaverse.EffectType.AnimalControls"> 127 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionRenderAudioStop(System.String)">
274 <summary> 128 <summary>
129 This command is used to stop the audio render process.
275 </summary> 130 </summary>
131 <param name="SoundFilePath">The fully qualified path to the sound file issued in the start render command.</param>
132 <returns></returns>
276 </member> 133 </member>
277 <member name="F:OpenMetaverse.EffectType.AnimationObject"> 134 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionTerminate(System.String)">
278 <summary> 135 <summary>
136 This is used to ‘end’ an established session (i.e. hang-up or disconnect).
279 </summary> 137 </summary>
138 <param name="SessionHandle">Handle returned from successful Session ‘create’ request or a SessionNewEvent</param>
139 <returns></returns>
280 </member> 140 </member>
281 <member name="F:OpenMetaverse.EffectType.Cloth"> 141 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionSet3DPosition(System.String,OpenMetaverse.Voice.VoicePosition,OpenMetaverse.Voice.VoicePosition)">
282 <summary> 142 <summary>
143 Set the combined speaking and listening position in 3D space.
283 </summary> 144 </summary>
145 <param name="SessionHandle">Handle returned from successful Session ‘create’ request or a SessionNewEvent</param>
146 <param name="SpeakerPosition">Speaking position</param>
147 <param name="ListenerPosition">Listening position</param>
148 <returns></returns>
284 </member> 149 </member>
285 <member name="F:OpenMetaverse.EffectType.Beam"> 150 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionSetParticipantVolumeForMe(System.String,System.String,System.Int32)">
286 <summary>Project a beam from a source to a destination, such as
287 the one used when editing an object</summary>
288 </member>
289 <member name="F:OpenMetaverse.EffectType.Glow">
290 <summary> 151 <summary>
152 Set User Volume for a particular user. Does not affect how other users hear that user.
291 </summary> 153 </summary>
154 <param name="SessionHandle">Handle returned from successful Session ‘create’ request or a SessionNewEvent</param>
155 <param name="ParticipantURI"></param>
156 <param name="Volume">The level of the audio, a number between -100 and 100 where 0 represents ‘normal’ speaking volume</param>
157 <returns></returns>
292 </member> 158 </member>
293 <member name="F:OpenMetaverse.EffectType.Point"> 159 <member name="M:OpenMetaverse.Voice.VoiceGateway.Start">
294 <summary> 160 <summary>
161 Start up the Voice service.
295 </summary> 162 </summary>
296 </member> 163 </member>
297 <member name="F:OpenMetaverse.EffectType.Trail"> 164 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnVoiceResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceResponseEventArgs)">
298 <summary> 165 <summary>
166 Handle miscellaneous request status
299 </summary> 167 </summary>
168 <param name="sender"></param>
169 <param name="e"></param>
170 ///<remarks>If something goes wrong, we log it.</remarks>
300 </member> 171 </member>
301 <member name="F:OpenMetaverse.EffectType.Sphere"> 172 <member name="M:OpenMetaverse.Voice.VoiceGateway.Dispose">
302 <summary>Create a swirl of particles around an object</summary>
303 </member>
304 <member name="F:OpenMetaverse.EffectType.Spiral">
305 <summary> 173 <summary>
174 Cleanup oject resources
306 </summary> 175 </summary>
307 </member> 176 </member>
308 <member name="F:OpenMetaverse.EffectType.Edit"> 177 <member name="M:OpenMetaverse.Voice.VoiceGateway.Network_EventQueueRunning(System.Object,OpenMetaverse.EventQueueRunningEventArgs)">
309 <summary> 178 <summary>
179 Request voice cap when changing regions
310 </summary> 180 </summary>
311 </member> 181 </member>
312 <member name="F:OpenMetaverse.EffectType.LookAt"> 182 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnSessionStateChangeEvent(System.Object,OpenMetaverse.Voice.VoiceGateway.SessionStateChangeEventArgs)">
313 <summary>Cause an avatar to look at an object</summary>
314 </member>
315 <member name="F:OpenMetaverse.EffectType.PointAt">
316 <summary>Cause an avatar to point at an object</summary>
317 </member>
318 <member name="T:OpenMetaverse.LookAtType">
319 <summary> 183 <summary>
320 The action an avatar is doing when looking at something, used in 184 Handle a change in session state
321 ViewerEffect packets for the LookAt effect
322 </summary> 185 </summary>
323 </member> 186 </member>
324 <member name="F:OpenMetaverse.LookAtType.None"> 187 <member name="M:OpenMetaverse.Voice.VoiceGateway.CloseSession(System.String)">
325 <summary> 188 <summary>
189 Close a voice session
326 </summary> 190 </summary>
191 <param name="sessionHandle"></param>
327 </member> 192 </member>
328 <member name="F:OpenMetaverse.LookAtType.Idle"> 193 <member name="M:OpenMetaverse.Voice.VoiceGateway.FindSession(System.String,System.Boolean)">
329 <summary> 194 <summary>
195 Locate a Session context from its handle
330 </summary> 196 </summary>
197 <remarks>Creates the session context if it does not exist.</remarks>
331 </member> 198 </member>
332 <member name="F:OpenMetaverse.LookAtType.AutoListen"> 199 <member name="M:OpenMetaverse.Voice.VoiceGateway.cClient_OnComplete(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)">
333 <summary> 200 <summary>
201 Handle completion of main voice cap request.
334 </summary> 202 </summary>
203 <param name="client"></param>
204 <param name="result"></param>
205 <param name="error"></param>
335 </member> 206 </member>
336 <member name="F:OpenMetaverse.LookAtType.FreeLook"> 207 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnDaemonRunning">
337 <summary> 208 <summary>
209 Daemon has started so connect to it.
338 </summary> 210 </summary>
339 </member> 211 </member>
340 <member name="F:OpenMetaverse.LookAtType.Respond"> 212 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnDaemonConnected">
341 <summary> 213 <summary>
214 The daemon TCP connection is open.
342 </summary> 215 </summary>
343 </member> 216 </member>
344 <member name="F:OpenMetaverse.LookAtType.Hover"> 217 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnConnectorCreateResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceConnectorEventArgs)">
345 <summary> 218 <summary>
219 Handle creation of the Connector.
346 </summary> 220 </summary>
347 </member> 221 </member>
348 <member name="F:OpenMetaverse.LookAtType.Conversation"> 222 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnAuxGetRenderDevicesResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceDevicesEventArgs)">
349 <summary>Deprecated</summary>
350 </member>
351 <member name="F:OpenMetaverse.LookAtType.Select">
352 <summary> 223 <summary>
224 Handle response to audio output device query
353 </summary> 225 </summary>
354 </member> 226 </member>
355 <member name="F:OpenMetaverse.LookAtType.Focus"> 227 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnAuxGetCaptureDevicesResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceDevicesEventArgs)">
356 <summary> 228 <summary>
229 Handle response to audio input device query
357 </summary> 230 </summary>
358 </member> 231 </member>
359 <member name="F:OpenMetaverse.LookAtType.Mouselook"> 232 <member name="M:OpenMetaverse.Voice.VoiceGateway.ParcelChanged">
233 <summary>
234 Set voice channel for new parcel
235 </summary>
236
237 </member>
238 <member name="M:OpenMetaverse.Voice.VoiceGateway.RequestParcelInfo(System.Uri)">
360 <summary> 239 <summary>
240 Request info from a parcel capability Uri.
361 </summary> 241 </summary>
242 <param name="cap"></param>
362 </member> 243 </member>
363 <member name="F:OpenMetaverse.LookAtType.Clear"> 244 <member name="M:OpenMetaverse.Voice.VoiceGateway.pCap_OnComplete(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)">
364 <summary> 245 <summary>
246 Receive parcel voice cap
365 </summary> 247 </summary>
248 <param name="client"></param>
249 <param name="result"></param>
250 <param name="error"></param>
366 </member> 251 </member>
367 <member name="T:OpenMetaverse.PointAtType"> 252 <member name="M:OpenMetaverse.Voice.VoiceGateway.UpdatePosition(OpenMetaverse.AgentManager)">
368 <summary> 253 <summary>
369 The action an avatar is doing when pointing at something, used in 254 Tell Vivox where we are standing
370 ViewerEffect packets for the PointAt effect
371 </summary> 255 </summary>
256 <remarks>This has to be called when we move or turn.</remarks>
372 </member> 257 </member>
373 <member name="F:OpenMetaverse.PointAtType.None"> 258 <member name="M:OpenMetaverse.Voice.VoiceGateway.PosUpdating(System.Boolean)">
374 <summary> 259 <summary>
260 Start and stop updating out position.
375 </summary> 261 </summary>
262 <param name="go"></param>
376 </member> 263 </member>
377 <member name="F:OpenMetaverse.PointAtType.Select"> 264 <member name="M:OpenMetaverse.Voice.VoiceGateway.AccountLogin(System.String,System.String,System.String,System.String,System.String,System.Int32,System.Boolean)">
378 <summary> 265 <summary>
266 This is used to login a specific user account(s). It may only be called after
267 Connector initialization has completed successfully
379 </summary> 268 </summary>
269 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
270 <param name="AccountName">User's account name</param>
271 <param name="AccountPassword">User's account password</param>
272 <param name="AudioSessionAnswerMode">Values may be “AutoAnswer†or “VerifyAnswerâ€</param>
273 <param name="AccountURI">""</param>
274 <param name="ParticipantPropertyFrequency">This is an integer that specifies how often
275 the daemon will send participant property events while in a channel. If this is not set
276 the default will be “on state changeâ€, which means that the events will be sent when
277 the participant starts talking, stops talking, is muted, is unmuted.
278 The valid values are:
279 0 – Never
280 5 – 10 times per second
281 10 – 5 times per second
282 50 – 1 time per second
283 100 – on participant state change (this is the default)</param>
284 <param name="EnableBuddiesAndPresence">false</param>
285 <returns></returns>
380 </member> 286 </member>
381 <member name="F:OpenMetaverse.PointAtType.Grab"> 287 <member name="M:OpenMetaverse.Voice.VoiceGateway.AccountLogout(System.String)">
382 <summary> 288 <summary>
289 This is used to logout a user session. It should only be called with a valid AccountHandle.
383 </summary> 290 </summary>
291 <param name="AccountHandle">Handle returned from successful Connector ‘login’ request</param>
292 <returns></returns>
384 </member> 293 </member>
385 <member name="F:OpenMetaverse.PointAtType.Clear"> 294 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorCreate(System.String,System.String,System.UInt16,System.UInt16,OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings)">
386 <summary> 295 <summary>
296 This is used to initialize and stop the Connector as a whole. The Connector
297 Create call must be completed successfully before any other requests are made
298 (typically during application initialization). The shutdown should be called
299 when the application is shutting down to gracefully release resources
387 </summary> 300 </summary>
301 <param name="ClientName">A string value indicting the Application name</param>
302 <param name="AccountManagementServer">URL for the management server</param>
303 <param name="Logging">LoggingSettings</param>
304 <param name="MaximumPort"></param>
305 <param name="MinimumPort"></param>
388 </member> 306 </member>
389 <member name="T:OpenMetaverse.MoneyTransactionType"> 307 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorInitiateShutdown(System.String)">
390 <summary> 308 <summary>
391 Money transaction types 309 Shutdown Connector -- Should be called when the application is shutting down
310 to gracefully release resources
392 </summary> 311 </summary>
312 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
393 </member> 313 </member>
394 <member name="F:OpenMetaverse.MoneyTransactionType.None"> 314 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorMuteLocalMic(System.String,System.Boolean)">
395 <summary> 315 <summary>
316 Mute or unmute the microphone
396 </summary> 317 </summary>
318 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
319 <param name="Mute">true (mute) or false (unmute)</param>
397 </member> 320 </member>
398 <member name="F:OpenMetaverse.MoneyTransactionType.FailSimulatorTimeout"> 321 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorMuteLocalSpeaker(System.String,System.Boolean)">
399 <summary> 322 <summary>
323 Mute or unmute the speaker
400 </summary> 324 </summary>
325 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
326 <param name="Mute">true (mute) or false (unmute)</param>
401 </member> 327 </member>
402 <member name="F:OpenMetaverse.MoneyTransactionType.FailDataserverTimeout"> 328 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorSetLocalMicVolume(System.String,System.Int32)">
403 <summary> 329 <summary>
330 Set microphone volume
404 </summary> 331 </summary>
332 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
333 <param name="Value">The level of the audio, a number between -100 and 100 where
334 0 represents ‘normal’ speaking volume</param>
405 </member> 335 </member>
406 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectClaim"> 336 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorSetLocalSpeakerVolume(System.String,System.Int32)">
407 <summary> 337 <summary>
338 Set local speaker volume
408 </summary> 339 </summary>
340 <param name="ConnectorHandle">Handle returned from successful Connector ‘create’ request</param>
341 <param name="Value">The level of the audio, a number between -100 and 100 where
342 0 represents ‘normal’ speaking volume</param>
409 </member> 343 </member>
410 <member name="F:OpenMetaverse.MoneyTransactionType.LandClaim"> 344 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnVoiceResponse">
411 <summary> 345 <summary>
346 Event for most mundane request reposnses.
412 </summary> 347 </summary>
413 </member> 348 </member>
414 <member name="F:OpenMetaverse.MoneyTransactionType.GroupCreate"> 349 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnConnectorCreateResponse">
350 <summary>Response to Connector.Create request</summary>
351 </member>
352 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxGetCaptureDevicesResponse">
353 <summary>Response to Aux.GetCaptureDevices request</summary>
354 </member>
355 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxGetRenderDevicesResponse">
356 <summary>Response to Aux.GetRenderDevices request</summary>
357 </member>
358 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxAudioPropertiesEvent">
359 <summary>Audio Properties Events are sent after audio capture is started.
360 These events are used to display a microphone VU meter</summary>
361 </member>
362 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAccountLoginResponse">
363 <summary>Response to Account.Login request</summary>
364 </member>
365 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAccountLoginStateChangeEvent">
366 <summary>This event message is sent whenever the login state of the
367 particular Account has transitioned from one value to another</summary>
368 </member>
369 <member name="P:OpenMetaverse.Voice.VoiceGateway.CaptureDevices">
415 <summary> 370 <summary>
371 List of audio input devices
416 </summary> 372 </summary>
417 </member> 373 </member>
418 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicClaim"> 374 <member name="P:OpenMetaverse.Voice.VoiceGateway.PlaybackDevices">
419 <summary> 375 <summary>
376 List of audio output devices
420 </summary> 377 </summary>
421 </member> 378 </member>
422 <member name="F:OpenMetaverse.MoneyTransactionType.GroupJoin"> 379 <member name="P:OpenMetaverse.Voice.VoiceGateway.TestMode">
423 <summary> 380 <summary>
381 Set audio test mode
424 </summary> 382 </summary>
425 </member> 383 </member>
426 <member name="F:OpenMetaverse.MoneyTransactionType.TeleportCharge"> 384 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.Enabled">
385 <summary>Enable logging</summary>
386 </member>
387 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.Folder">
388 <summary>The folder where any logs will be created</summary>
389 </member>
390 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.FileNamePrefix">
391 <summary>This will be prepended to beginning of each log file</summary>
392 </member>
393 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.FileNameSuffix">
394 <summary>The suffix or extension to be appended to each log file</summary>
395 </member>
396 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.LogLevel">
427 <summary> 397 <summary>
398 0: NONE - No logging
399 1: ERROR - Log errors only
400 2: WARNING - Log errors and warnings
401 3: INFO - Log errors, warnings and info
402 4: DEBUG - Log errors, warnings, info and debug
428 </summary> 403 </summary>
429 </member> 404 </member>
430 <member name="F:OpenMetaverse.MoneyTransactionType.UploadCharge"> 405 <member name="M:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.#ctor">
431 <summary> 406 <summary>
407 Constructor for default logging settings
432 </summary> 408 </summary>
433 </member> 409 </member>
434 <member name="F:OpenMetaverse.MoneyTransactionType.LandAuction"> 410 <member name="T:OpenMetaverse.Voice.VoiceGateway.AudioPropertiesEventArgs">
411 Audio Properties Events are sent after audio capture is started. These events are used to display a microphone VU meter
412 </member>
413 <member name="T:OpenMetaverse.LoginStatus">
435 <summary> 414 <summary>
415
436 </summary> 416 </summary>
437 </member> 417 </member>
438 <member name="F:OpenMetaverse.MoneyTransactionType.ClassifiedCharge"> 418 <member name="F:OpenMetaverse.LoginStatus.Failed">
419 <summary></summary>
420 </member>
421 <member name="F:OpenMetaverse.LoginStatus.None">
422 <summary></summary>
423 </member>
424 <member name="F:OpenMetaverse.LoginStatus.ConnectingToLogin">
425 <summary></summary>
426 </member>
427 <member name="F:OpenMetaverse.LoginStatus.ReadingResponse">
428 <summary></summary>
429 </member>
430 <member name="F:OpenMetaverse.LoginStatus.ConnectingToSim">
431 <summary></summary>
432 </member>
433 <member name="F:OpenMetaverse.LoginStatus.Redirecting">
434 <summary></summary>
435 </member>
436 <member name="F:OpenMetaverse.LoginStatus.Success">
437 <summary></summary>
438 </member>
439 <member name="T:OpenMetaverse.LastExecStatus">
439 <summary> 440 <summary>
441 Status of the last application run.
442 Used for error reporting to the grid login service for statistical purposes.
440 </summary> 443 </summary>
441 </member> 444 </member>
442 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectTax"> 445 <member name="F:OpenMetaverse.LastExecStatus.Normal">
446 <summary> Application exited normally </summary>
447 </member>
448 <member name="F:OpenMetaverse.LastExecStatus.Froze">
449 <summary> Application froze </summary>
450 </member>
451 <member name="F:OpenMetaverse.LastExecStatus.ForcedCrash">
452 <summary> Application detected error and exited abnormally </summary>
453 </member>
454 <member name="F:OpenMetaverse.LastExecStatus.OtherCrash">
455 <summary> Other crash </summary>
456 </member>
457 <member name="F:OpenMetaverse.LastExecStatus.LogoutFroze">
458 <summary> Application froze during logout </summary>
459 </member>
460 <member name="F:OpenMetaverse.LastExecStatus.LogoutCrash">
461 <summary> Application crashed during logout </summary>
462 </member>
463 <member name="T:OpenMetaverse.LoginParams">
443 <summary> 464 <summary>
465 Login Request Parameters
444 </summary> 466 </summary>
445 </member> 467 </member>
446 <member name="F:OpenMetaverse.MoneyTransactionType.LandTax"> 468 <member name="F:OpenMetaverse.LoginParams.URI">
469 <summary>The URL of the Login Server</summary>
470 </member>
471 <member name="F:OpenMetaverse.LoginParams.Timeout">
472 <summary>The number of milliseconds to wait before a login is considered
473 failed due to timeout</summary>
474 </member>
475 <member name="F:OpenMetaverse.LoginParams.MethodName">
476 <summary>The request method</summary>
477 <remarks>login_to_simulator is currently the only supported method</remarks>
478 </member>
479 <member name="F:OpenMetaverse.LoginParams.FirstName">
480 <summary>The Agents First name</summary>
481 </member>
482 <member name="F:OpenMetaverse.LoginParams.LastName">
483 <summary>The Agents Last name</summary>
484 </member>
485 <member name="F:OpenMetaverse.LoginParams.Password">
486 <summary>A md5 hashed password</summary>
487 <remarks>plaintext password will be automatically hashed</remarks>
488 </member>
489 <member name="F:OpenMetaverse.LoginParams.Start">
490 <summary>The agents starting location once logged in</summary>
491 <remarks>Either "last", "home", or a string encoded URI
492 containing the simulator name and x/y/z coordinates e.g: uri:hooper&amp;128&amp;152&amp;17</remarks>
493 </member>
494 <member name="F:OpenMetaverse.LoginParams.Channel">
495 <summary>A string containing the client software channel information</summary>
496 <example>Second Life Release</example>
497 </member>
498 <member name="F:OpenMetaverse.LoginParams.Version">
499 <summary>The client software version information</summary>
500 <remarks>The official viewer uses: Second Life Release n.n.n.n
501 where n is replaced with the current version of the viewer</remarks>
502 </member>
503 <member name="F:OpenMetaverse.LoginParams.Platform">
504 <summary>A string containing the platform information the agent is running on</summary>
505 </member>
506 <member name="F:OpenMetaverse.LoginParams.MAC">
507 <summary>A string hash of the network cards Mac Address</summary>
508 </member>
509 <member name="F:OpenMetaverse.LoginParams.ViewerDigest">
510 <summary>Unknown or deprecated</summary>
511 </member>
512 <member name="F:OpenMetaverse.LoginParams.ID0">
513 <summary>A string hash of the first disk drives ID used to identify this clients uniqueness</summary>
514 </member>
515 <member name="F:OpenMetaverse.LoginParams.UserAgent">
516 <summary>A string containing the viewers Software, this is not directly sent to the login server but
517 instead is used to generate the Version string</summary>
518 </member>
519 <member name="F:OpenMetaverse.LoginParams.Author">
520 <summary>A string representing the software creator. This is not directly sent to the login server but
521 is used by the library to generate the Version information</summary>
522 </member>
523 <member name="F:OpenMetaverse.LoginParams.AgreeToTos">
524 <summary>If true, this agent agrees to the Terms of Service of the grid its connecting to</summary>
525 </member>
526 <member name="F:OpenMetaverse.LoginParams.ReadCritical">
527 <summary>Unknown</summary>
528 </member>
529 <member name="F:OpenMetaverse.LoginParams.LastExecEvent">
530 <summary>Status of the last application run sent to the grid login server for statistical purposes</summary>
531 </member>
532 <member name="F:OpenMetaverse.LoginParams.Options">
533 <summary>An array of string sent to the login server to enable various options</summary>
534 </member>
535 <member name="F:OpenMetaverse.LoginParams.LoginID">
536 <summary>A randomly generated ID to distinguish between login attempts. This value is only used
537 internally in the library and is never sent over the wire</summary>
538 </member>
539 <member name="M:OpenMetaverse.LoginParams.#ctor">
447 <summary> 540 <summary>
541 Default constuctor, initializes sane default values
448 </summary> 542 </summary>
449 </member> 543 </member>
450 <member name="F:OpenMetaverse.MoneyTransactionType.LightTax"> 544 <member name="M:OpenMetaverse.LoginParams.#ctor(OpenMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String)">
451 <summary> 545 <summary>
546 Instantiates new LoginParams object and fills in the values
452 </summary> 547 </summary>
548 <param name="client">Instance of GridClient to read settings from</param>
549 <param name="firstName">Login first name</param>
550 <param name="lastName">Login last name</param>
551 <param name="password">Password</param>
552 <param name="channel">Login channnel (application name)</param>
553 <param name="version">Client version, should be application name + version number</param>
453 </member> 554 </member>
454 <member name="F:OpenMetaverse.MoneyTransactionType.ParcelDirFee"> 555 <member name="M:OpenMetaverse.LoginParams.#ctor(OpenMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String,System.String)">
455 <summary> 556 <summary>
557 Instantiates new LoginParams object and fills in the values
456 </summary> 558 </summary>
559 <param name="client">Instance of GridClient to read settings from</param>
560 <param name="firstName">Login first name</param>
561 <param name="lastName">Login last name</param>
562 <param name="password">Password</param>
563 <param name="channel">Login channnel (application name)</param>
564 <param name="version">Client version, should be application name + version number</param>
565 <param name="loginURI">URI of the login server</param>
457 </member> 566 </member>
458 <member name="F:OpenMetaverse.MoneyTransactionType.GroupTax"> 567 <member name="T:OpenMetaverse.LoginResponseData">
459 <summary> 568 <summary>
569 The decoded data returned from the login server after a successful login
460 </summary> 570 </summary>
461 </member> 571 </member>
462 <member name="F:OpenMetaverse.MoneyTransactionType.ClassifiedRenew"> 572 <member name="F:OpenMetaverse.LoginResponseData.Login">
573 <summary>true, false, indeterminate</summary>
574 </member>
575 <member name="F:OpenMetaverse.LoginResponseData.Message">
576 <summary>Login message of the day</summary>
577 </member>
578 <member name="F:OpenMetaverse.LoginResponseData.AgentAccess">
579 <summary>M or PG, also agent_region_access and agent_access_max</summary>
580 </member>
581 <member name="M:OpenMetaverse.LoginResponseData.Parse(OpenMetaverse.StructuredData.OSDMap)">
463 <summary> 582 <summary>
583 Parse LLSD Login Reply Data
464 </summary> 584 </summary>
585 <param name="reply">An <seealso cref="T:OpenMetaverse.StructuredData.OSDMap"/>
586 contaning the login response data</param>
587 <remarks>XML-RPC logins do not require this as XML-RPC.NET
588 automatically populates the struct properly using attributes</remarks>
465 </member> 589 </member>
466 <member name="F:OpenMetaverse.MoneyTransactionType.GiveInventory"> 590 <member name="T:OpenMetaverse.NetworkManager">
467 <summary> 591 <summary>
592 Login Routines
468 </summary> 593 </summary>
469 </member>
470 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectSale">
471 <summary> 594 <summary>
595 NetworkManager is responsible for managing the network layer of
596 OpenMetaverse. It tracks all the server connections, serializes
597 outgoing traffic and deserializes incoming traffic, and provides
598 instances of delegates for network-related events.
472 </summary> 599 </summary>
473 </member> 600 </member>
474 <member name="F:OpenMetaverse.MoneyTransactionType.Gift"> 601 <member name="F:OpenMetaverse.NetworkManager.m_LoginProgress">
602 <summary>The event subscribers, null of no subscribers</summary>
603 </member>
604 <member name="M:OpenMetaverse.NetworkManager.OnLoginProgress(OpenMetaverse.LoginProgressEventArgs)">
605 <summary>Raises the LoginProgress Event</summary>
606 <param name="e">A LoginProgressEventArgs object containing
607 the data sent from the simulator</param>
608 </member>
609 <member name="F:OpenMetaverse.NetworkManager.m_LoginProgressLock">
610 <summary>Thread sync lock object</summary>
611 </member>
612 <member name="F:OpenMetaverse.NetworkManager.LoginSeedCapability">
613 <summary>Seed CAPS URL returned from the login server</summary>
614 </member>
615 <member name="F:OpenMetaverse.NetworkManager.MaxAgentGroups">
616 <summary>Maximum number of groups an agent can belong to, -1 for unlimited</summary>
617 </member>
618 <member name="F:OpenMetaverse.NetworkManager.AgentAppearanceServiceURL">
619 <summary>Server side baking service URL</summary>
620 </member>
621 <member name="F:OpenMetaverse.NetworkManager.UDPBlacklist">
622 <summary>A list of packets obtained during the login process which
623 networkmanager will log but not process</summary>
624 </member>
625 <member name="M:OpenMetaverse.NetworkManager.DefaultLoginParams(System.String,System.String,System.String,System.String,System.String)">
475 <summary> 626 <summary>
627 Generate sane default values for a login request
476 </summary> 628 </summary>
629 <param name="firstName">Account first name</param>
630 <param name="lastName">Account last name</param>
631 <param name="password">Account password</param>
632 <param name="channel">Client application name (channel)</param>
633 <param name="version">Client application name + version</param>
634 <returns>A populated <seealso cref="T:OpenMetaverse.LoginParams"/> struct containing
635 sane defaults</returns>
477 </member> 636 </member>
478 <member name="F:OpenMetaverse.MoneyTransactionType.LandSale"> 637 <member name="M:OpenMetaverse.NetworkManager.Login(System.String,System.String,System.String,System.String,System.String)">
479 <summary> 638 <summary>
639 Simplified login that takes the most common and required fields
480 </summary> 640 </summary>
641 <param name="firstName">Account first name</param>
642 <param name="lastName">Account last name</param>
643 <param name="password">Account password</param>
644 <param name="channel">Client application name (channel)</param>
645 <param name="version">Client application name + version</param>
646 <returns>Whether the login was successful or not. On failure the
647 LoginErrorKey string will contain the error code and LoginMessage
648 will contain a description of the error</returns>
481 </member> 649 </member>
482 <member name="F:OpenMetaverse.MoneyTransactionType.ReferBonus"> 650 <member name="M:OpenMetaverse.NetworkManager.Login(System.String,System.String,System.String,System.String,System.String,System.String)">
483 <summary> 651 <summary>
652 Simplified login that takes the most common fields along with a
653 starting location URI, and can accept an MD5 string instead of a
654 plaintext password
484 </summary> 655 </summary>
656 <param name="firstName">Account first name</param>
657 <param name="lastName">Account last name</param>
658 <param name="password">Account password or MD5 hash of the password
659 such as $1$1682a1e45e9f957dcdf0bb56eb43319c</param>
660 <param name="channel">Client application name (channel)</param>
661 <param name="start">Starting location URI that can be built with
662 StartLocation()</param>
663 <param name="version">Client application name + version</param>
664 <returns>Whether the login was successful or not. On failure the
665 LoginErrorKey string will contain the error code and LoginMessage
666 will contain a description of the error</returns>
485 </member> 667 </member>
486 <member name="F:OpenMetaverse.MoneyTransactionType.InventorySale"> 668 <member name="M:OpenMetaverse.NetworkManager.Login(OpenMetaverse.LoginParams)">
487 <summary> 669 <summary>
670 Login that takes a struct of all the values that will be passed to
671 the login server
488 </summary> 672 </summary>
673 <param name="loginParams">The values that will be passed to the login
674 server, all fields must be set even if they are String.Empty</param>
675 <returns>Whether the login was successful or not. On failure the
676 LoginErrorKey string will contain the error code and LoginMessage
677 will contain a description of the error</returns>
489 </member> 678 </member>
490 <member name="F:OpenMetaverse.MoneyTransactionType.RefundPurchase"> 679 <member name="M:OpenMetaverse.NetworkManager.StartLocation(System.String,System.Int32,System.Int32,System.Int32)">
491 <summary> 680 <summary>
681 Build a start location URI for passing to the Login function
492 </summary> 682 </summary>
683 <param name="sim">Name of the simulator to start in</param>
684 <param name="x">X coordinate to start at</param>
685 <param name="y">Y coordinate to start at</param>
686 <param name="z">Z coordinate to start at</param>
687 <returns>String with a URI that can be used to login to a specified
688 location</returns>
493 </member> 689 </member>
494 <member name="F:OpenMetaverse.MoneyTransactionType.LandPassSale"> 690 <member name="M:OpenMetaverse.NetworkManager.RemoteLoginHandler(OpenMetaverse.LoginResponseData,OpenMetaverse.LoginParams)">
495 <summary> 691 <summary>
692 LoginParams and the initial login XmlRpcRequest were made on a remote machine.
693 This method now initializes libomv with the results.
496 </summary> 694 </summary>
497 </member> 695 </member>
498 <member name="F:OpenMetaverse.MoneyTransactionType.DwellBonus"> 696 <member name="M:OpenMetaverse.NetworkManager.LoginReplyXmlRpcHandler(Nwc.XmlRpc.XmlRpcResponse,OpenMetaverse.LoginParams)">
499 <summary> 697 <summary>
698 Handles response from XML-RPC login replies
500 </summary> 699 </summary>
501 </member> 700 </member>
502 <member name="F:OpenMetaverse.MoneyTransactionType.PayObject"> 701 <member name="M:OpenMetaverse.NetworkManager.LoginReplyXmlRpcHandler(OpenMetaverse.LoginResponseData,OpenMetaverse.LoginParams)">
503 <summary> 702 <summary>
703 Handles response from XML-RPC login replies with already parsed LoginResponseData
504 </summary> 704 </summary>
505 </member> 705 </member>
506 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPays"> 706 <member name="M:OpenMetaverse.NetworkManager.LoginReplyLLSDHandler(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)">
507 <summary> 707 <summary>
708 Handle response from LLSD login replies
508 </summary> 709 </summary>
710 <param name="client"></param>
711 <param name="result"></param>
712 <param name="error"></param>
509 </member> 713 </member>
510 <member name="F:OpenMetaverse.MoneyTransactionType.GroupLandDeed"> 714 <member name="M:OpenMetaverse.NetworkManager.GetPlatform">
511 <summary> 715 <summary>
716 Get current OS
512 </summary> 717 </summary>
718 <returns>Either "Win" or "Linux"</returns>
513 </member> 719 </member>
514 <member name="F:OpenMetaverse.MoneyTransactionType.GroupObjectDeed"> 720 <member name="M:OpenMetaverse.NetworkManager.GetMAC">
515 <summary> 721 <summary>
722 Get clients default Mac Address
516 </summary> 723 </summary>
724 <returns>A string containing the first found Mac Address</returns>
517 </member> 725 </member>
518 <member name="F:OpenMetaverse.MoneyTransactionType.GroupLiability"> 726 <member name="F:OpenMetaverse.NetworkManager.m_PacketSent">
727 <summary>The event subscribers, null of no subscribers</summary>
728 </member>
729 <member name="M:OpenMetaverse.NetworkManager.OnPacketSent(OpenMetaverse.PacketSentEventArgs)">
730 <summary>Raises the PacketSent Event</summary>
731 <param name="e">A PacketSentEventArgs object containing
732 the data sent from the simulator</param>
733 </member>
734 <member name="F:OpenMetaverse.NetworkManager.m_PacketSentLock">
735 <summary>Thread sync lock object</summary>
736 </member>
737 <member name="F:OpenMetaverse.NetworkManager.m_LoggedOut">
738 <summary>The event subscribers, null of no subscribers</summary>
739 </member>
740 <member name="M:OpenMetaverse.NetworkManager.OnLoggedOut(OpenMetaverse.LoggedOutEventArgs)">
741 <summary>Raises the LoggedOut Event</summary>
742 <param name="e">A LoggedOutEventArgs object containing
743 the data sent from the simulator</param>
744 </member>
745 <member name="F:OpenMetaverse.NetworkManager.m_LoggedOutLock">
746 <summary>Thread sync lock object</summary>
747 </member>
748 <member name="F:OpenMetaverse.NetworkManager.m_SimConnecting">
749 <summary>The event subscribers, null of no subscribers</summary>
750 </member>
751 <member name="M:OpenMetaverse.NetworkManager.OnSimConnecting(OpenMetaverse.SimConnectingEventArgs)">
752 <summary>Raises the SimConnecting Event</summary>
753 <param name="e">A SimConnectingEventArgs object containing
754 the data sent from the simulator</param>
755 </member>
756 <member name="F:OpenMetaverse.NetworkManager.m_SimConnectingLock">
757 <summary>Thread sync lock object</summary>
758 </member>
759 <member name="F:OpenMetaverse.NetworkManager.m_SimConnected">
760 <summary>The event subscribers, null of no subscribers</summary>
761 </member>
762 <member name="M:OpenMetaverse.NetworkManager.OnSimConnected(OpenMetaverse.SimConnectedEventArgs)">
763 <summary>Raises the SimConnected Event</summary>
764 <param name="e">A SimConnectedEventArgs object containing
765 the data sent from the simulator</param>
766 </member>
767 <member name="F:OpenMetaverse.NetworkManager.m_SimConnectedLock">
768 <summary>Thread sync lock object</summary>
769 </member>
770 <member name="F:OpenMetaverse.NetworkManager.m_SimDisconnected">
771 <summary>The event subscribers, null of no subscribers</summary>
772 </member>
773 <member name="M:OpenMetaverse.NetworkManager.OnSimDisconnected(OpenMetaverse.SimDisconnectedEventArgs)">
774 <summary>Raises the SimDisconnected Event</summary>
775 <param name="e">A SimDisconnectedEventArgs object containing
776 the data sent from the simulator</param>
777 </member>
778 <member name="F:OpenMetaverse.NetworkManager.m_SimDisconnectedLock">
779 <summary>Thread sync lock object</summary>
780 </member>
781 <member name="F:OpenMetaverse.NetworkManager.m_Disconnected">
782 <summary>The event subscribers, null of no subscribers</summary>
783 </member>
784 <member name="M:OpenMetaverse.NetworkManager.OnDisconnected(OpenMetaverse.DisconnectedEventArgs)">
785 <summary>Raises the Disconnected Event</summary>
786 <param name="e">A DisconnectedEventArgs object containing
787 the data sent from the simulator</param>
788 </member>
789 <member name="F:OpenMetaverse.NetworkManager.m_DisconnectedLock">
790 <summary>Thread sync lock object</summary>
791 </member>
792 <member name="F:OpenMetaverse.NetworkManager.m_SimChanged">
793 <summary>The event subscribers, null of no subscribers</summary>
794 </member>
795 <member name="M:OpenMetaverse.NetworkManager.OnSimChanged(OpenMetaverse.SimChangedEventArgs)">
796 <summary>Raises the SimChanged Event</summary>
797 <param name="e">A SimChangedEventArgs object containing
798 the data sent from the simulator</param>
799 </member>
800 <member name="F:OpenMetaverse.NetworkManager.m_SimChangedLock">
801 <summary>Thread sync lock object</summary>
802 </member>
803 <member name="F:OpenMetaverse.NetworkManager.m_EventQueueRunning">
804 <summary>The event subscribers, null of no subscribers</summary>
805 </member>
806 <member name="M:OpenMetaverse.NetworkManager.OnEventQueueRunning(OpenMetaverse.EventQueueRunningEventArgs)">
807 <summary>Raises the EventQueueRunning Event</summary>
808 <param name="e">A EventQueueRunningEventArgs object containing
809 the data sent from the simulator</param>
810 </member>
811 <member name="F:OpenMetaverse.NetworkManager.m_EventQueueRunningLock">
812 <summary>Thread sync lock object</summary>
813 </member>
814 <member name="F:OpenMetaverse.NetworkManager.Simulators">
815 <summary>All of the simulators we are currently connected to</summary>
816 </member>
817 <member name="F:OpenMetaverse.NetworkManager.CapsEvents">
818 <summary>Handlers for incoming capability events</summary>
819 </member>
820 <member name="F:OpenMetaverse.NetworkManager.PacketEvents">
821 <summary>Handlers for incoming packets</summary>
822 </member>
823 <member name="F:OpenMetaverse.NetworkManager.PacketInbox">
824 <summary>Incoming packets that are awaiting handling</summary>
825 </member>
826 <member name="F:OpenMetaverse.NetworkManager.PacketOutbox">
827 <summary>Outgoing packets that are awaiting handling</summary>
828 </member>
829 <member name="M:OpenMetaverse.NetworkManager.#ctor(OpenMetaverse.GridClient)">
519 <summary> 830 <summary>
831 Default constructor
520 </summary> 832 </summary>
833 <param name="client">Reference to the GridClient object</param>
521 </member> 834 </member>
522 <member name="F:OpenMetaverse.MoneyTransactionType.GroupDividend"> 835 <member name="M:OpenMetaverse.NetworkManager.RegisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})">
523 <summary> 836 <summary>
837 Register an event handler for a packet. This is a low level event
838 interface and should only be used if you are doing something not
839 supported in the library
524 </summary> 840 </summary>
841 <param name="type">Packet type to trigger events for</param>
842 <param name="callback">Callback to fire when a packet of this type
843 is received</param>
525 </member> 844 </member>
526 <member name="F:OpenMetaverse.MoneyTransactionType.GroupMembershipDues"> 845 <member name="M:OpenMetaverse.NetworkManager.RegisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs},System.Boolean)">
527 <summary> 846 <summary>
847 Register an event handler for a packet. This is a low level event
848 interface and should only be used if you are doing something not
849 supported in the library
528 </summary> 850 </summary>
851 <param name="type">Packet type to trigger events for</param>
852 <param name="callback">Callback to fire when a packet of this type
853 is received</param>
854 <param name="isAsync">True if the callback should be ran
855 asynchronously. Only set this to false (synchronous for callbacks
856 that will always complete quickly)</param>
857 <remarks>If any callback for a packet type is marked as
858 asynchronous, all callbacks for that packet type will be fired
859 asynchronously</remarks>
529 </member> 860 </member>
530 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectRelease"> 861 <member name="M:OpenMetaverse.NetworkManager.UnregisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})">
531 <summary> 862 <summary>
863 Unregister an event handler for a packet. This is a low level event
864 interface and should only be used if you are doing something not
865 supported in the library
532 </summary> 866 </summary>
867 <param name="type">Packet type this callback is registered with</param>
868 <param name="callback">Callback to stop firing events for</param>
533 </member> 869 </member>
534 <member name="F:OpenMetaverse.MoneyTransactionType.LandRelease"> 870 <member name="M:OpenMetaverse.NetworkManager.RegisterEventCallback(System.String,OpenMetaverse.Caps.EventQueueCallback)">
535 <summary> 871 <summary>
872 Register a CAPS event handler. This is a low level event interface
873 and should only be used if you are doing something not supported in
874 the library
536 </summary> 875 </summary>
876 <param name="capsEvent">Name of the CAPS event to register a handler for</param>
877 <param name="callback">Callback to fire when a CAPS event is received</param>
537 </member> 878 </member>
538 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectDelete"> 879 <member name="M:OpenMetaverse.NetworkManager.UnregisterEventCallback(System.String,OpenMetaverse.Caps.EventQueueCallback)">
539 <summary> 880 <summary>
881 Unregister a CAPS event handler. This is a low level event interface
882 and should only be used if you are doing something not supported in
883 the library
540 </summary> 884 </summary>
885 <param name="capsEvent">Name of the CAPS event this callback is
886 registered with</param>
887 <param name="callback">Callback to stop firing events for</param>
541 </member> 888 </member>
542 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicDecay"> 889 <member name="M:OpenMetaverse.NetworkManager.SendPacket(OpenMetaverse.Packets.Packet)">
543 <summary> 890 <summary>
891 Send a packet to the simulator the avatar is currently occupying
544 </summary> 892 </summary>
893 <param name="packet">Packet to send</param>
545 </member> 894 </member>
546 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicDelete"> 895 <member name="M:OpenMetaverse.NetworkManager.SendPacket(OpenMetaverse.Packets.Packet,OpenMetaverse.Simulator)">
547 <summary> 896 <summary>
897 Send a packet to a specified simulator
548 </summary> 898 </summary>
899 <param name="packet">Packet to send</param>
900 <param name="simulator">Simulator to send the packet to</param>
549 </member> 901 </member>
550 <member name="F:OpenMetaverse.MoneyTransactionType.LindenAdjustment"> 902 <member name="M:OpenMetaverse.NetworkManager.Connect(System.Net.IPAddress,System.UInt16,System.UInt64,System.Boolean,System.String)">
551 <summary> 903 <summary>
904 Connect to a simulator
552 </summary> 905 </summary>
906 <param name="ip">IP address to connect to</param>
907 <param name="port">Port to connect to</param>
908 <param name="handle">Handle for this simulator, to identify its
909 location in the grid</param>
910 <param name="setDefault">Whether to set CurrentSim to this new
911 connection, use this if the avatar is moving in to this simulator</param>
912 <param name="seedcaps">URL of the capabilities server to use for
913 this sim connection</param>
914 <returns>A Simulator object on success, otherwise null</returns>
553 </member> 915 </member>
554 <member name="F:OpenMetaverse.MoneyTransactionType.LindenGrant"> 916 <member name="M:OpenMetaverse.NetworkManager.Connect(System.Net.IPEndPoint,System.UInt64,System.Boolean,System.String)">
555 <summary> 917 <summary>
918 Connect to a simulator
556 </summary> 919 </summary>
920 <param name="endPoint">IP address and port to connect to</param>
921 <param name="handle">Handle for this simulator, to identify its
922 location in the grid</param>
923 <param name="setDefault">Whether to set CurrentSim to this new
924 connection, use this if the avatar is moving in to this simulator</param>
925 <param name="seedcaps">URL of the capabilities server to use for
926 this sim connection</param>
927 <returns>A Simulator object on success, otherwise null</returns>
557 </member> 928 </member>
558 <member name="F:OpenMetaverse.MoneyTransactionType.LindenPenalty"> 929 <member name="M:OpenMetaverse.NetworkManager.Logout">
559 <summary> 930 <summary>
931 Initiate a blocking logout request. This will return when the logout
932 handshake has completed or when <code>Settings.LOGOUT_TIMEOUT</code>
933 has expired and the network layer is manually shut down
560 </summary> 934 </summary>
561 </member> 935 </member>
562 <member name="F:OpenMetaverse.MoneyTransactionType.EventFee"> 936 <member name="M:OpenMetaverse.NetworkManager.RequestLogout">
563 <summary> 937 <summary>
938 Initiate the logout process. Check if logout succeeded with the
939 <code>OnLogoutReply</code> event, and if this does not fire the
940 <code>Shutdown()</code> function needs to be manually called
564 </summary> 941 </summary>
565 </member> 942 </member>
566 <member name="F:OpenMetaverse.MoneyTransactionType.EventPrize"> 943 <member name="M:OpenMetaverse.NetworkManager.DisconnectSim(OpenMetaverse.Simulator,System.Boolean)">
567 <summary> 944 <summary>
945 Close a connection to the given simulator
568 </summary> 946 </summary>
947 <param name="simulator"></param>
948 <param name="sendCloseCircuit"></param>
569 </member> 949 </member>
570 <member name="F:OpenMetaverse.MoneyTransactionType.StipendBasic"> 950 <member name="M:OpenMetaverse.NetworkManager.Shutdown(OpenMetaverse.NetworkManager.DisconnectType)">
571 <summary> 951 <summary>
952 Shutdown will disconnect all the sims except for the current sim
953 first, and then kill the connection to CurrentSim. This should only
954 be called if the logout process times out on <code>RequestLogout</code>
572 </summary> 955 </summary>
956 <param name="type">Type of shutdown</param>
573 </member> 957 </member>
574 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDeveloper"> 958 <member name="M:OpenMetaverse.NetworkManager.Shutdown(OpenMetaverse.NetworkManager.DisconnectType,System.String)">
575 <summary> 959 <summary>
960 Shutdown will disconnect all the sims except for the current sim
961 first, and then kill the connection to CurrentSim. This should only
962 be called if the logout process times out on <code>RequestLogout</code>
576 </summary> 963 </summary>
964 <param name="type">Type of shutdown</param>
965 <param name="message">Shutdown message</param>
577 </member> 966 </member>
578 <member name="F:OpenMetaverse.MoneyTransactionType.StipendAlways"> 967 <member name="M:OpenMetaverse.NetworkManager.FindSimulator(System.Net.IPEndPoint)">
579 <summary> 968 <summary>
969 Searches through the list of currently connected simulators to find
970 one attached to the given IPEndPoint
580 </summary> 971 </summary>
972 <param name="endPoint">IPEndPoint of the Simulator to search for</param>
973 <returns>A Simulator reference on success, otherwise null</returns>
581 </member> 974 </member>
582 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDaily"> 975 <member name="M:OpenMetaverse.NetworkManager.RaiseConnectedEvent(OpenMetaverse.Simulator)">
583 <summary> 976 <summary>
977 Fire an event when an event queue connects for capabilities
584 </summary> 978 </summary>
979 <param name="simulator">Simulator the event queue is attached to</param>
585 </member> 980 </member>
586 <member name="F:OpenMetaverse.MoneyTransactionType.StipendRating"> 981 <member name="M:OpenMetaverse.NetworkManager.LogoutReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
982 <summary>Process an incoming packet and raise the appropriate events</summary>
983 <param name="sender">The sender</param>
984 <param name="e">The EventArgs object containing the packet data</param>
985 </member>
986 <member name="M:OpenMetaverse.NetworkManager.StartPingCheckHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
987 <summary>Process an incoming packet and raise the appropriate events</summary>
988 <param name="sender">The sender</param>
989 <param name="e">The EventArgs object containing the packet data</param>
990 </member>
991 <member name="M:OpenMetaverse.NetworkManager.CompletePingCheckHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
992 <summary>Process an incoming packet and raise the appropriate events</summary>
993 <param name="sender">The sender</param>
994 <param name="e">The EventArgs object containing the packet data</param>
995 </member>
996 <member name="M:OpenMetaverse.NetworkManager.SimStatsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
997 <summary>Process an incoming packet and raise the appropriate events</summary>
998 <param name="sender">The sender</param>
999 <param name="e">The EventArgs object containing the packet data</param>
1000 </member>
1001 <member name="M:OpenMetaverse.NetworkManager.RegionHandshakeHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1002 <summary>Process an incoming packet and raise the appropriate events</summary>
1003 <param name="sender">The sender</param>
1004 <param name="e">The EventArgs object containing the packet data</param>
1005 </member>
1006 <member name="M:OpenMetaverse.NetworkManager.DisableSimulatorHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1007 <summary>Process an incoming packet and raise the appropriate events</summary>
1008 <param name="sender">The sender</param>
1009 <param name="e">The EventArgs object containing the packet data</param>
1010 </member>
1011 <member name="M:OpenMetaverse.NetworkManager.KickUserHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1012 <summary>Process an incoming packet and raise the appropriate events</summary>
1013 <param name="sender">The sender</param>
1014 <param name="e">The EventArgs object containing the packet data</param>
1015 </member>
1016 <member name="E:OpenMetaverse.NetworkManager.LoginProgress">
1017 <summary>Raised when the simulator sends us data containing
1018 ...</summary>
1019 </member>
1020 <member name="E:OpenMetaverse.NetworkManager.OnLoginResponse">
1021 <summary>Called when a reply is received from the login server, the
1022 login sequence will block until this event returns</summary>
1023 </member>
1024 <member name="P:OpenMetaverse.NetworkManager.LoginStatusCode">
1025 <summary>Current state of logging in</summary>
1026 </member>
1027 <member name="P:OpenMetaverse.NetworkManager.LoginErrorKey">
1028 <summary>Upon login failure, contains a short string key for the
1029 type of login error that occurred</summary>
1030 </member>
1031 <member name="P:OpenMetaverse.NetworkManager.RawLoginReply">
1032 <summary>The raw XML-RPC reply from the login server, exactly as it
1033 was received (minus the HTTP header)</summary>
1034 </member>
1035 <member name="P:OpenMetaverse.NetworkManager.LoginMessage">
1036 <summary>During login this contains a descriptive version of
1037 LoginStatusCode. After a successful login this will contain the
1038 message of the day, and after a failed login a descriptive error
1039 message will be returned</summary>
1040 </member>
1041 <member name="E:OpenMetaverse.NetworkManager.PacketSent">
1042 <summary>Raised when the simulator sends us data containing
1043 ...</summary>
1044 </member>
1045 <member name="E:OpenMetaverse.NetworkManager.LoggedOut">
1046 <summary>Raised when the simulator sends us data containing
1047 ...</summary>
1048 </member>
1049 <member name="E:OpenMetaverse.NetworkManager.SimConnecting">
1050 <summary>Raised when the simulator sends us data containing
1051 ...</summary>
1052 </member>
1053 <member name="E:OpenMetaverse.NetworkManager.SimConnected">
1054 <summary>Raised when the simulator sends us data containing
1055 ...</summary>
1056 </member>
1057 <member name="E:OpenMetaverse.NetworkManager.SimDisconnected">
1058 <summary>Raised when the simulator sends us data containing
1059 ...</summary>
1060 </member>
1061 <member name="E:OpenMetaverse.NetworkManager.Disconnected">
1062 <summary>Raised when the simulator sends us data containing
1063 ...</summary>
1064 </member>
1065 <member name="E:OpenMetaverse.NetworkManager.SimChanged">
1066 <summary>Raised when the simulator sends us data containing
1067 ...</summary>
1068 </member>
1069 <member name="E:OpenMetaverse.NetworkManager.EventQueueRunning">
1070 <summary>Raised when the simulator sends us data containing
1071 ...</summary>
1072 </member>
1073 <member name="P:OpenMetaverse.NetworkManager.CircuitCode">
1074 <summary>Unique identifier associated with our connections to
1075 simulators</summary>
1076 </member>
1077 <member name="P:OpenMetaverse.NetworkManager.CurrentSim">
1078 <summary>The simulator that the logged in avatar is currently
1079 occupying</summary>
1080 </member>
1081 <member name="P:OpenMetaverse.NetworkManager.Connected">
1082 <summary>Shows whether the network layer is logged in to the
1083 grid or not</summary>
1084 </member>
1085 <member name="P:OpenMetaverse.NetworkManager.InboxCount">
1086 <summary>Number of packets in the incoming queue</summary>
1087 </member>
1088 <member name="P:OpenMetaverse.NetworkManager.OutboxCount">
1089 <summary>Number of packets in the outgoing queue</summary>
1090 </member>
1091 <member name="T:OpenMetaverse.NetworkManager.LoginResponseCallback">
587 <summary> 1092 <summary>
1093
588 </summary> 1094 </summary>
1095 <param name="loginSuccess"></param>
1096 <param name="redirect"></param>
1097 <param name="replyData"></param>
1098 <param name="message"></param>
1099 <param name="reason"></param>
589 </member> 1100 </member>
590 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDelta"> 1101 <member name="T:OpenMetaverse.NetworkManager.DisconnectType">
591 <summary> 1102 <summary>
1103 Explains why a simulator or the grid disconnected from us
592 </summary> 1104 </summary>
593 </member> 1105 </member>
594 <member name="T:OpenMetaverse.TransactionFlags"> 1106 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.ClientInitiated">
1107 <summary>The client requested the logout or simulator disconnect</summary>
1108 </member>
1109 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.ServerInitiated">
1110 <summary>The server notified us that it is disconnecting</summary>
1111 </member>
1112 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.NetworkTimeout">
1113 <summary>Either a socket was closed or network traffic timed out</summary>
1114 </member>
1115 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.SimShutdown">
1116 <summary>The last active simulator shut down</summary>
1117 </member>
1118 <member name="T:OpenMetaverse.NetworkManager.IncomingPacket">
595 <summary> 1119 <summary>
1120 Holds a simulator reference and a decoded packet, these structs are put in
1121 the packet inbox for event handling
596 </summary> 1122 </summary>
597 </member> 1123 </member>
598 <member name="F:OpenMetaverse.TransactionFlags.None"> 1124 <member name="F:OpenMetaverse.NetworkManager.IncomingPacket.Simulator">
1125 <summary>Reference to the simulator that this packet came from</summary>
1126 </member>
1127 <member name="F:OpenMetaverse.NetworkManager.IncomingPacket.Packet">
1128 <summary>Packet that needs to be processed</summary>
1129 </member>
1130 <member name="T:OpenMetaverse.NetworkManager.OutgoingPacket">
599 <summary> 1131 <summary>
1132 Holds a simulator reference and a serialized packet, these structs are put in
1133 the packet outbox for sending
600 </summary> 1134 </summary>
601 </member> 1135 </member>
602 <member name="F:OpenMetaverse.TransactionFlags.SourceGroup"> 1136 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Simulator">
1137 <summary>Reference to the simulator this packet is destined for</summary>
1138 </member>
1139 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Buffer">
1140 <summary>Packet that needs to be sent</summary>
1141 </member>
1142 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.SequenceNumber">
1143 <summary>Sequence number of the wrapped packet</summary>
1144 </member>
1145 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.ResendCount">
1146 <summary>Number of times this packet has been resent</summary>
1147 </member>
1148 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.TickCount">
1149 <summary>Environment.TickCount when this packet was last sent over the wire</summary>
1150 </member>
1151 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Type">
1152 <summary>Type of the packet</summary>
1153 </member>
1154 <member name="T:OpenMetaverse.PacketEventDictionary">
603 <summary> 1155 <summary>
1156 Registers, unregisters, and fires events generated by incoming packets
604 </summary> 1157 </summary>
605 </member> 1158 </member>
606 <member name="F:OpenMetaverse.TransactionFlags.DestGroup"> 1159 <member name="F:OpenMetaverse.PacketEventDictionary.Client">
1160 <summary>Reference to the GridClient object</summary>
1161 </member>
1162 <member name="M:OpenMetaverse.PacketEventDictionary.#ctor(OpenMetaverse.GridClient)">
607 <summary> 1163 <summary>
1164 Default constructor
608 </summary> 1165 </summary>
1166 <param name="client"></param>
609 </member> 1167 </member>
610 <member name="F:OpenMetaverse.TransactionFlags.OwnerGroup"> 1168 <member name="M:OpenMetaverse.PacketEventDictionary.RegisterEvent(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs},System.Boolean)">
611 <summary> 1169 <summary>
1170 Register an event handler
612 </summary> 1171 </summary>
1172 <remarks>Use PacketType.Default to fire this event on every
1173 incoming packet</remarks>
1174 <param name="packetType">Packet type to register the handler for</param>
1175 <param name="eventHandler">Callback to be fired</param>
1176 <param name="isAsync">True if this callback should be ran
1177 asynchronously, false to run it synchronous</param>
613 </member> 1178 </member>
614 <member name="F:OpenMetaverse.TransactionFlags.SimultaneousContribution"> 1179 <member name="M:OpenMetaverse.PacketEventDictionary.UnregisterEvent(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})">
615 <summary> 1180 <summary>
1181 Unregister an event handler
616 </summary> 1182 </summary>
1183 <param name="packetType">Packet type to unregister the handler for</param>
1184 <param name="eventHandler">Callback to be unregistered</param>
617 </member> 1185 </member>
618 <member name="F:OpenMetaverse.TransactionFlags.ContributionRemoval"> 1186 <member name="M:OpenMetaverse.PacketEventDictionary.RaiseEvent(OpenMetaverse.Packets.PacketType,OpenMetaverse.Packets.Packet,OpenMetaverse.Simulator)">
619 <summary> 1187 <summary>
1188 Fire the events registered for this packet type
620 </summary> 1189 </summary>
1190 <param name="packetType">Incoming packet type</param>
1191 <param name="packet">Incoming packet</param>
1192 <param name="simulator">Simulator this packet was received from</param>
621 </member> 1193 </member>
622 <member name="T:OpenMetaverse.MeanCollisionType"> 1194 <member name="T:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper">
623 <summary> 1195 <summary>
1196 Object that is passed to worker threads in the ThreadPool for
1197 firing packet callbacks
624 </summary> 1198 </summary>
625 </member> 1199 </member>
626 <member name="F:OpenMetaverse.MeanCollisionType.None"> 1200 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Callback">
1201 <summary>Callback to fire for this packet</summary>
1202 </member>
1203 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Simulator">
1204 <summary>Reference to the simulator that this packet came from</summary>
1205 </member>
1206 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Packet">
1207 <summary>The packet that needs to be processed</summary>
1208 </member>
1209 <member name="T:OpenMetaverse.CapsEventDictionary">
627 <summary> 1210 <summary>
1211 Registers, unregisters, and fires events generated by the Capabilities
1212 event queue
628 </summary> 1213 </summary>
629 </member> 1214 </member>
630 <member name="F:OpenMetaverse.MeanCollisionType.Bump"> 1215 <member name="F:OpenMetaverse.CapsEventDictionary.Client">
1216 <summary>Reference to the GridClient object</summary>
1217 </member>
1218 <member name="M:OpenMetaverse.CapsEventDictionary.#ctor(OpenMetaverse.GridClient)">
631 <summary> 1219 <summary>
1220 Default constructor
632 </summary> 1221 </summary>
1222 <param name="client">Reference to the GridClient object</param>
633 </member> 1223 </member>
634 <member name="F:OpenMetaverse.MeanCollisionType.LLPushObject"> 1224 <member name="M:OpenMetaverse.CapsEventDictionary.RegisterEvent(System.String,OpenMetaverse.Caps.EventQueueCallback)">
635 <summary> 1225 <summary>
1226 Register an new event handler for a capabilities event sent via the EventQueue
636 </summary> 1227 </summary>
1228 <remarks>Use String.Empty to fire this event on every CAPS event</remarks>
1229 <param name="capsEvent">Capability event name to register the
1230 handler for</param>
1231 <param name="eventHandler">Callback to fire</param>
637 </member> 1232 </member>
638 <member name="F:OpenMetaverse.MeanCollisionType.SelectedObjectCollide"> 1233 <member name="M:OpenMetaverse.CapsEventDictionary.UnregisterEvent(System.String,OpenMetaverse.Caps.EventQueueCallback)">
639 <summary> 1234 <summary>
1235 Unregister a previously registered capabilities handler
640 </summary> 1236 </summary>
1237 <param name="capsEvent">Capability event name unregister the
1238 handler for</param>
1239 <param name="eventHandler">Callback to unregister</param>
641 </member> 1240 </member>
642 <member name="F:OpenMetaverse.MeanCollisionType.ScriptedObjectCollide"> 1241 <member name="M:OpenMetaverse.CapsEventDictionary.RaiseEvent(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
643 <summary> 1242 <summary>
1243 Fire the events registered for this event type synchronously
644 </summary> 1244 </summary>
1245 <param name="capsEvent">Capability name</param>
1246 <param name="message">Decoded event body</param>
1247 <param name="simulator">Reference to the simulator that
1248 generated this event</param>
645 </member> 1249 </member>
646 <member name="F:OpenMetaverse.MeanCollisionType.PhysicalObjectCollide"> 1250 <member name="M:OpenMetaverse.CapsEventDictionary.BeginRaiseEvent(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
647 <summary> 1251 <summary>
1252 Fire the events registered for this event type asynchronously
648 </summary> 1253 </summary>
1254 <param name="capsEvent">Capability name</param>
1255 <param name="message">Decoded event body</param>
1256 <param name="simulator">Reference to the simulator that
1257 generated this event</param>
649 </member> 1258 </member>
650 <member name="T:OpenMetaverse.ScriptControlChange"> 1259 <member name="T:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper">
651 <summary> 1260 <summary>
652 Flags sent when a script takes or releases a control 1261 Object that is passed to worker threads in the ThreadPool for
1262 firing CAPS callbacks
653 </summary> 1263 </summary>
654 <remarks>NOTE: (need to verify) These might be a subset of the ControlFlags enum in Movement,</remarks>
655 </member> 1264 </member>
656 <member name="F:OpenMetaverse.ScriptControlChange.None"> 1265 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Callback">
657 <summary>No Flags set</summary> 1266 <summary>Callback to fire for this packet</summary>
658 </member> 1267 </member>
659 <member name="F:OpenMetaverse.ScriptControlChange.Forward"> 1268 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.CapsEvent">
660 <summary>Forward (W or up Arrow)</summary> 1269 <summary>Name of the CAPS event</summary>
661 </member> 1270 </member>
662 <member name="F:OpenMetaverse.ScriptControlChange.Back"> 1271 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Message">
663 <summary>Back (S or down arrow)</summary> 1272 <summary>Strongly typed decoded data</summary>
664 </member> 1273 </member>
665 <member name="F:OpenMetaverse.ScriptControlChange.Left"> 1274 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Simulator">
666 <summary>Move left (shift+A or left arrow)</summary> 1275 <summary>Reference to the simulator that generated this event</summary>
667 </member> 1276 </member>
668 <member name="F:OpenMetaverse.ScriptControlChange.Right"> 1277 <member name="T:OpenMetaverse.DownloadRequest">
669 <summary>Move right (shift+D or right arrow)</summary> 1278 <summary>
1279 Represends individual HTTP Download request
1280 </summary>
670 </member> 1281 </member>
671 <member name="F:OpenMetaverse.ScriptControlChange.Up"> 1282 <member name="F:OpenMetaverse.DownloadRequest.Address">
672 <summary>Up (E or PgUp)</summary> 1283 <summary>URI of the item to fetch</summary>
673 </member> 1284 </member>
674 <member name="F:OpenMetaverse.ScriptControlChange.Down"> 1285 <member name="F:OpenMetaverse.DownloadRequest.MillisecondsTimeout">
675 <summary>Down (C or PgDown)</summary> 1286 <summary>Timout specified in milliseconds</summary>
676 </member> 1287 </member>
677 <member name="F:OpenMetaverse.ScriptControlChange.RotateLeft"> 1288 <member name="F:OpenMetaverse.DownloadRequest.DownloadProgressCallback">
678 <summary>Rotate left (A or left arrow)</summary> 1289 <summary>Download progress callback</summary>
679 </member> 1290 </member>
680 <member name="F:OpenMetaverse.ScriptControlChange.RotateRight"> 1291 <member name="F:OpenMetaverse.DownloadRequest.CompletedCallback">
681 <summary>Rotate right (D or right arrow)</summary> 1292 <summary>Download completed callback</summary>
682 </member> 1293 </member>
683 <member name="F:OpenMetaverse.ScriptControlChange.LeftButton"> 1294 <member name="F:OpenMetaverse.DownloadRequest.ContentType">
684 <summary>Left Mouse Button</summary> 1295 <summary>Accept the following content type</summary>
685 </member> 1296 </member>
686 <member name="F:OpenMetaverse.ScriptControlChange.MouseLookLeftButton"> 1297 <member name="F:OpenMetaverse.DownloadRequest.Retries">
687 <summary>Left Mouse button in MouseLook</summary> 1298 <summary>How many times will this request be retried</summary>
688 </member> 1299 </member>
689 <member name="T:OpenMetaverse.AgentFlags"> 1300 <member name="F:OpenMetaverse.DownloadRequest.Attempt">
1301 <summary>Current fetch attempt</summary>
1302 </member>
1303 <member name="M:OpenMetaverse.DownloadRequest.#ctor">
1304 <summary>Default constructor</summary>
1305 </member>
1306 <member name="M:OpenMetaverse.DownloadRequest.#ctor(System.Uri,System.Int32,System.String,OpenMetaverse.Http.CapsBase.DownloadProgressEventHandler,OpenMetaverse.Http.CapsBase.RequestCompletedEventHandler)">
1307 <summary>Constructor</summary>
1308 </member>
1309 <member name="T:OpenMetaverse.DownloadManager">
690 <summary> 1310 <summary>
691 Currently only used to hide your group title 1311 Manages async HTTP downloads with a limit on maximum
1312 concurrent downloads
692 </summary> 1313 </summary>
693 </member> 1314 </member>
694 <member name="F:OpenMetaverse.AgentFlags.None"> 1315 <member name="M:OpenMetaverse.DownloadManager.#ctor">
695 <summary>No flags set</summary> 1316 <summary>Default constructor</summary>
696 </member> 1317 </member>
697 <member name="F:OpenMetaverse.AgentFlags.HideTitle"> 1318 <member name="M:OpenMetaverse.DownloadManager.Dispose">
698 <summary>Hide your group title</summary> 1319 <summary>Cleanup method</summary>
699 </member> 1320 </member>
700 <member name="T:OpenMetaverse.AgentState"> 1321 <member name="M:OpenMetaverse.DownloadManager.SetupRequest(System.Uri,System.String)">
1322 <summary>Setup http download request</summary>
1323 </member>
1324 <member name="M:OpenMetaverse.DownloadManager.EnqueuePending">
1325 <summary>Check the queue for pending work</summary>
1326 </member>
1327 <member name="M:OpenMetaverse.DownloadManager.QueueDownlad(OpenMetaverse.DownloadRequest)">
1328 <summary>Enqueue a new HTPP download</summary>
1329 </member>
1330 <member name="P:OpenMetaverse.DownloadManager.ParallelDownloads">
1331 <summary>Maximum number of parallel downloads from a single endpoint</summary>
1332 </member>
1333 <member name="P:OpenMetaverse.DownloadManager.ClientCert">
1334 <summary>Client certificate</summary>
1335 </member>
1336 <member name="T:OpenMetaverse.BinBVHAnimationReader">
701 <summary> 1337 <summary>
702 Action state of the avatar, which can currently be typing and 1338 Reads in a byte array of an Animation Asset created by the SecondLife(tm) client.
703 editing
704 </summary> 1339 </summary>
705 </member> 1340 </member>
706 <member name="F:OpenMetaverse.AgentState.None"> 1341 <member name="F:OpenMetaverse.BinBVHAnimationReader.rotationkeys">
707 <summary> 1342 <summary>
1343 Rotation Keyframe count (used internally)
708 </summary> 1344 </summary>
709 </member> 1345 </member>
710 <member name="F:OpenMetaverse.AgentState.Typing"> 1346 <member name="F:OpenMetaverse.BinBVHAnimationReader.positionkeys">
711 <summary> 1347 <summary>
1348 Position Keyframe count (used internally)
712 </summary> 1349 </summary>
713 </member> 1350 </member>
714 <member name="F:OpenMetaverse.AgentState.Editing"> 1351 <member name="F:OpenMetaverse.BinBVHAnimationReader.Priority">
715 <summary> 1352 <summary>
1353 Animation Priority
716 </summary> 1354 </summary>
717 </member> 1355 </member>
718 <member name="T:OpenMetaverse.TeleportStatus"> 1356 <member name="F:OpenMetaverse.BinBVHAnimationReader.Length">
719 <summary> 1357 <summary>
720 Current teleport status 1358 The animation length in seconds.
721 </summary> 1359 </summary>
722 </member> 1360 </member>
723 <member name="F:OpenMetaverse.TeleportStatus.None"> 1361 <member name="F:OpenMetaverse.BinBVHAnimationReader.ExpressionName">
724 <summary>Unknown status</summary>
725 </member>
726 <member name="F:OpenMetaverse.TeleportStatus.Start">
727 <summary>Teleport initialized</summary>
728 </member>
729 <member name="F:OpenMetaverse.TeleportStatus.Progress">
730 <summary>Teleport in progress</summary>
731 </member>
732 <member name="F:OpenMetaverse.TeleportStatus.Failed">
733 <summary>Teleport failed</summary>
734 </member>
735 <member name="F:OpenMetaverse.TeleportStatus.Finished">
736 <summary>Teleport completed</summary>
737 </member>
738 <member name="F:OpenMetaverse.TeleportStatus.Cancelled">
739 <summary>Teleport cancelled</summary>
740 </member>
741 <member name="T:OpenMetaverse.TeleportFlags">
742 <summary> 1362 <summary>
1363 Expression set in the client. Null if [None] is selected
743 </summary> 1364 </summary>
744 </member> 1365 </member>
745 <member name="F:OpenMetaverse.TeleportFlags.Default"> 1366 <member name="F:OpenMetaverse.BinBVHAnimationReader.InPoint">
746 <summary>No flags set, or teleport failed</summary>
747 </member>
748 <member name="F:OpenMetaverse.TeleportFlags.SetHomeToTarget">
749 <summary>Set when newbie leaves help island for first time</summary>
750 </member>
751 <member name="F:OpenMetaverse.TeleportFlags.SetLastToTarget">
752 <summary> 1367 <summary>
1368 The time in seconds to start the animation
753 </summary> 1369 </summary>
754 </member> 1370 </member>
755 <member name="F:OpenMetaverse.TeleportFlags.ViaLure"> 1371 <member name="F:OpenMetaverse.BinBVHAnimationReader.OutPoint">
756 <summary>Via Lure</summary> 1372 <summary>
757 </member> 1373 The time in seconds to end the animation
758 <member name="F:OpenMetaverse.TeleportFlags.ViaLandmark"> 1374 </summary>
759 <summary>Via Landmark</summary>
760 </member>
761 <member name="F:OpenMetaverse.TeleportFlags.ViaLocation">
762 <summary>Via Location</summary>
763 </member>
764 <member name="F:OpenMetaverse.TeleportFlags.ViaHome">
765 <summary>Via Home</summary>
766 </member> 1375 </member>
767 <member name="F:OpenMetaverse.TeleportFlags.ViaTelehub"> 1376 <member name="F:OpenMetaverse.BinBVHAnimationReader.Loop">
768 <summary>Via Telehub</summary> 1377 <summary>
1378 Loop the animation
1379 </summary>
769 </member> 1380 </member>
770 <member name="F:OpenMetaverse.TeleportFlags.ViaLogin"> 1381 <member name="F:OpenMetaverse.BinBVHAnimationReader.EaseInTime">
771 <summary>Via Login</summary> 1382 <summary>
1383 Meta data. Ease in Seconds.
1384 </summary>
772 </member> 1385 </member>
773 <member name="F:OpenMetaverse.TeleportFlags.ViaGodlikeLure"> 1386 <member name="F:OpenMetaverse.BinBVHAnimationReader.EaseOutTime">
774 <summary>Linden Summoned</summary> 1387 <summary>
1388 Meta data. Ease out seconds.
1389 </summary>
775 </member> 1390 </member>
776 <member name="F:OpenMetaverse.TeleportFlags.Godlike"> 1391 <member name="F:OpenMetaverse.BinBVHAnimationReader.HandPose">
777 <summary>Linden Forced me</summary> 1392 <summary>
1393 Meta Data for the Hand Pose
1394 </summary>
778 </member> 1395 </member>
779 <member name="F:OpenMetaverse.TeleportFlags.NineOneOne"> 1396 <member name="F:OpenMetaverse.BinBVHAnimationReader.JointCount">
780 <summary> 1397 <summary>
1398 Number of joints defined in the animation
781 </summary> 1399 </summary>
782 </member> 1400 </member>
783 <member name="F:OpenMetaverse.TeleportFlags.DisableCancel"> 1401 <member name="F:OpenMetaverse.BinBVHAnimationReader.joints">
784 <summary>Agent Teleported Home via Script</summary> 1402 <summary>
1403 Contains an array of joints
1404 </summary>
785 </member> 1405 </member>
786 <member name="F:OpenMetaverse.TeleportFlags.ViaRegionID"> 1406 <member name="M:OpenMetaverse.BinBVHAnimationReader.#ctor(System.Byte[])">
787 <summary> 1407 <summary>
1408 Searialize an animation asset into it's joints/keyframes/meta data
788 </summary> 1409 </summary>
1410 <param name="animationdata"></param>
789 </member> 1411 </member>
790 <member name="F:OpenMetaverse.TeleportFlags.IsFlying"> 1412 <member name="M:OpenMetaverse.BinBVHAnimationReader.ReadBytesUntilNull(System.Byte[],System.Int32@)">
791 <summary> 1413 <summary>
1414 Variable length strings seem to be null terminated in the animation asset.. but..
1415 use with caution, home grown.
1416 advances the index.
792 </summary> 1417 </summary>
1418 <param name="data">The animation asset byte array</param>
1419 <param name="i">The offset to start reading</param>
1420 <returns>a string</returns>
793 </member> 1421 </member>
794 <member name="F:OpenMetaverse.TeleportFlags.ResetHome"> 1422 <member name="M:OpenMetaverse.BinBVHAnimationReader.readJoint(System.Byte[],System.Int32@)">
795 <summary> 1423 <summary>
1424 Read in a Joint from an animation asset byte array
1425 Variable length Joint fields, yay!
1426 Advances the index
796 </summary> 1427 </summary>
1428 <param name="data">animation asset byte array</param>
1429 <param name="i">Byte Offset of the start of the joint</param>
1430 <returns>The Joint data serialized into the binBVHJoint structure</returns>
797 </member> 1431 </member>
798 <member name="F:OpenMetaverse.TeleportFlags.ForceRedirect"> 1432 <member name="M:OpenMetaverse.BinBVHAnimationReader.readKeys(System.Byte[],System.Int32@,System.Int32,System.Single,System.Single)">
799 <summary>forced to new location for example when avatar is banned or ejected</summary> 1433 <summary>
1434 Read Keyframes of a certain type
1435 advance i
1436 </summary>
1437 <param name="data">Animation Byte array</param>
1438 <param name="i">Offset in the Byte Array. Will be advanced</param>
1439 <param name="keycount">Number of Keyframes</param>
1440 <param name="min">Scaling Min to pass to the Uint16ToFloat method</param>
1441 <param name="max">Scaling Max to pass to the Uint16ToFloat method</param>
1442 <returns></returns>
1443 </member>
1444 <member name="M:OpenMetaverse.BinBVHAnimationReader.Equals(System.Object)">
1445 <summary>
1446 Determines whether the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>.
1447 </summary>
1448 <returns>
1449 true if the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>; otherwise, false.
1450 </returns>
1451 <param name="obj">The <see cref="T:System.Object"/> to compare with the current <see cref="T:System.Object"/>.
1452 </param><exception cref="T:System.NullReferenceException">The <paramref name="obj"/> parameter is null.
1453 </exception><filterpriority>2</filterpriority>
1454 </member>
1455 <member name="M:OpenMetaverse.BinBVHAnimationReader.GetHashCode">
1456 <summary>
1457 Serves as a hash function for a particular type.
1458 </summary>
1459 <returns>
1460 A hash code for the current <see cref="T:System.Object"/>.
1461 </returns>
1462 <filterpriority>2</filterpriority>
800 </member> 1463 </member>
801 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaLure"> 1464 <member name="T:OpenMetaverse.binBVHJoint">
802 <summary>Teleport Finished via a Lure</summary> 1465 <summary>
1466 A Joint and it's associated meta data and keyframes
1467 </summary>
803 </member> 1468 </member>
804 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaNewSim"> 1469 <member name="M:OpenMetaverse.binBVHJoint.Equals(System.Object)">
805 <summary>Finished, Sim Changed</summary> 1470 <summary>
1471 Indicates whether this instance and a specified object are equal.
1472 </summary>
1473 <returns>
1474 true if <paramref name="obj"/> and this instance are the same type and represent the same value; otherwise, false.
1475 </returns>
1476 <param name="obj">Another object to compare to.
1477 </param><filterpriority>2</filterpriority>
1478 </member>
1479 <member name="M:OpenMetaverse.binBVHJoint.GetHashCode">
1480 <summary>
1481 Returns the hash code for this instance.
1482 </summary>
1483 <returns>
1484 A 32-bit signed integer that is the hash code for this instance.
1485 </returns>
1486 <filterpriority>2</filterpriority>
806 </member> 1487 </member>
807 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaSameSim"> 1488 <member name="F:OpenMetaverse.binBVHJoint.Name">
808 <summary>Finished, Same Sim</summary> 1489 <summary>
1490 Name of the Joint. Matches the avatar_skeleton.xml in client distros
1491 </summary>
809 </member> 1492 </member>
810 <member name="T:OpenMetaverse.TeleportLureFlags"> 1493 <member name="F:OpenMetaverse.binBVHJoint.Priority">
811 <summary> 1494 <summary>
1495 Joint Animation Override? Was the same as the Priority in testing..
812 </summary> 1496 </summary>
813 </member> 1497 </member>
814 <member name="F:OpenMetaverse.TeleportLureFlags.NormalLure"> 1498 <member name="F:OpenMetaverse.binBVHJoint.rotationkeys">
815 <summary> 1499 <summary>
1500 Array of Rotation Keyframes in order from earliest to latest
816 </summary> 1501 </summary>
817 </member> 1502 </member>
818 <member name="F:OpenMetaverse.TeleportLureFlags.GodlikeLure"> 1503 <member name="F:OpenMetaverse.binBVHJoint.positionkeys">
819 <summary> 1504 <summary>
1505 Array of Position Keyframes in order from earliest to latest
1506 This seems to only be for the Pelvis?
820 </summary> 1507 </summary>
821 </member> 1508 </member>
822 <member name="F:OpenMetaverse.TeleportLureFlags.GodlikePursuit"> 1509 <member name="F:OpenMetaverse.binBVHJoint.Tag">
823 <summary> 1510 <summary>
1511 Custom application data that can be attached to a joint
824 </summary> 1512 </summary>
825 </member> 1513 </member>
826 <member name="T:OpenMetaverse.ScriptSensorTypeFlags"> 1514 <member name="T:OpenMetaverse.binBVHJointKey">
827 <summary> 1515 <summary>
1516 A Joint Keyframe. This is either a position or a rotation.
828 </summary> 1517 </summary>
829 </member> 1518 </member>
830 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Agent"> 1519 <member name="F:OpenMetaverse.binBVHJointKey.key_element">
831 <summary> 1520 <summary>
1521 Either a Vector3 position or a Vector3 Euler rotation
832 </summary> 1522 </summary>
833 </member> 1523 </member>
834 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Active"> 1524 <member name="T:OpenMetaverse.HandPose">
835 <summary> 1525 <summary>
1526 Poses set in the animation metadata for the hands.
836 </summary> 1527 </summary>
837 </member> 1528 </member>
838 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Passive"> 1529 <member name="T:OpenMetaverse.AgentDisplayName">
1530 <summary> Information about agents display name </summary>
1531 </member>
1532 <member name="F:OpenMetaverse.AgentDisplayName.ID">
1533 <summary> Agent UUID </summary>
1534 </member>
1535 <member name="F:OpenMetaverse.AgentDisplayName.UserName">
1536 <summary> Username </summary>
1537 </member>
1538 <member name="F:OpenMetaverse.AgentDisplayName.DisplayName">
1539 <summary> Display name </summary>
1540 </member>
1541 <member name="F:OpenMetaverse.AgentDisplayName.LegacyFirstName">
1542 <summary> First name (legacy) </summary>
1543 </member>
1544 <member name="F:OpenMetaverse.AgentDisplayName.LegacyLastName">
1545 <summary> Last name (legacy) </summary>
1546 </member>
1547 <member name="F:OpenMetaverse.AgentDisplayName.IsDefaultDisplayName">
1548 <summary> Is display name default display name </summary>
1549 </member>
1550 <member name="F:OpenMetaverse.AgentDisplayName.NextUpdate">
1551 <summary> Cache display name until </summary>
1552 </member>
1553 <member name="F:OpenMetaverse.AgentDisplayName.Updated">
1554 <summary> Last updated timestamp </summary>
1555 </member>
1556 <member name="M:OpenMetaverse.AgentDisplayName.FromOSD(OpenMetaverse.StructuredData.OSD)">
839 <summary> 1557 <summary>
1558 Creates AgentDisplayName object from OSD
840 </summary> 1559 </summary>
1560 <param name="data">Incoming OSD data</param>
1561 <returns>AgentDisplayName object</returns>
841 </member> 1562 </member>
842 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Scripted"> 1563 <member name="M:OpenMetaverse.AgentDisplayName.GetOSD">
843 <summary> 1564 <summary>
1565 Return object as OSD map
844 </summary> 1566 </summary>
1567 <returns>OSD containing agent's display name data</returns>
845 </member> 1568 </member>
846 <member name="T:OpenMetaverse.MuteType"> 1569 <member name="P:OpenMetaverse.AgentDisplayName.LegacyFullName">
1570 <summary> Full name (legacy) </summary>
1571 </member>
1572 <member name="T:OpenMetaverse.AvatarGroup">
847 <summary> 1573 <summary>
848 Type of mute entry 1574 Holds group information for Avatars such as those you might find in a profile
849 </summary> 1575 </summary>
850 </member> 1576 </member>
851 <member name="F:OpenMetaverse.MuteType.ByName"> 1577 <member name="F:OpenMetaverse.AvatarGroup.AcceptNotices">
852 <summary>Object muted by name</summary> 1578 <summary>true of Avatar accepts group notices</summary>
853 </member> 1579 </member>
854 <member name="F:OpenMetaverse.MuteType.Resident"> 1580 <member name="F:OpenMetaverse.AvatarGroup.GroupID">
855 <summary>Muted residet</summary> 1581 <summary>Groups Key</summary>
856 </member> 1582 </member>
857 <member name="F:OpenMetaverse.MuteType.Object"> 1583 <member name="F:OpenMetaverse.AvatarGroup.GroupInsigniaID">
858 <summary>Object muted by UUID</summary> 1584 <summary>Texture Key for groups insignia</summary>
859 </member> 1585 </member>
860 <member name="F:OpenMetaverse.MuteType.Group"> 1586 <member name="F:OpenMetaverse.AvatarGroup.GroupName">
861 <summary>Muted group</summary> 1587 <summary>Name of the group</summary>
862 </member> 1588 </member>
863 <member name="F:OpenMetaverse.MuteType.External"> 1589 <member name="F:OpenMetaverse.AvatarGroup.GroupPowers">
864 <summary>Muted external entry</summary> 1590 <summary>Powers avatar has in the group</summary>
865 </member> 1591 </member>
866 <member name="T:OpenMetaverse.MuteFlags"> 1592 <member name="F:OpenMetaverse.AvatarGroup.GroupTitle">
867 <summary> 1593 <summary>Avatars Currently selected title</summary>
868 Flags of mute entry
869 </summary>
870 </member> 1594 </member>
871 <member name="F:OpenMetaverse.MuteFlags.Default"> 1595 <member name="F:OpenMetaverse.AvatarGroup.ListInProfile">
872 <summary>No exceptions</summary> 1596 <summary>true of Avatar has chosen to list this in their profile</summary>
873 </member> 1597 </member>
874 <member name="F:OpenMetaverse.MuteFlags.TextChat"> 1598 <member name="T:OpenMetaverse.Animation">
875 <summary>Don't mute text chat</summary> 1599 <summary>
1600 Contains an animation currently being played by an agent
1601 </summary>
876 </member> 1602 </member>
877 <member name="F:OpenMetaverse.MuteFlags.VoiceChat"> 1603 <member name="F:OpenMetaverse.Animation.AnimationID">
878 <summary>Don't mute voice chat</summary> 1604 <summary>The ID of the animation asset</summary>
879 </member> 1605 </member>
880 <member name="F:OpenMetaverse.MuteFlags.Particles"> 1606 <member name="F:OpenMetaverse.Animation.AnimationSequence">
881 <summary>Don't mute particles</summary> 1607 <summary>A number to indicate start order of currently playing animations</summary>
1608 <remarks>On Linden Grids this number is unique per region, with OpenSim it is per client</remarks>
882 </member> 1609 </member>
883 <member name="F:OpenMetaverse.MuteFlags.ObjectSounds"> 1610 <member name="F:OpenMetaverse.Animation.AnimationSourceObjectID">
884 <summary>Don't mute sounds</summary> 1611 <summary></summary>
885 </member> 1612 </member>
886 <member name="F:OpenMetaverse.MuteFlags.All"> 1613 <member name="T:OpenMetaverse.ProfilePick">
887 <summary>Don't mute</summary> 1614 <summary>
1615 Holds group information on an individual profile pick
1616 </summary>
888 </member> 1617 </member>
889 <member name="T:OpenMetaverse.InstantMessage"> 1618 <member name="T:OpenMetaverse.AvatarManager">
890 <summary> 1619 <summary>
891 Instant Message 1620 Retrieve friend status notifications, and retrieve avatar names and
1621 profiles
892 </summary> 1622 </summary>
893 </member> 1623 </member>
894 <member name="F:OpenMetaverse.InstantMessage.FromAgentID"> 1624 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAnimation">
895 <summary>Key of sender</summary> 1625 <summary>The event subscribers, null of no subscribers</summary>
896 </member> 1626 </member>
897 <member name="F:OpenMetaverse.InstantMessage.FromAgentName"> 1627 <member name="M:OpenMetaverse.AvatarManager.OnAvatarAnimation(OpenMetaverse.AvatarAnimationEventArgs)">
898 <summary>Name of sender</summary> 1628 <summary>Raises the AvatarAnimation Event</summary>
1629 <param name="e">An AvatarAnimationEventArgs object containing
1630 the data sent from the simulator</param>
899 </member> 1631 </member>
900 <member name="F:OpenMetaverse.InstantMessage.ToAgentID"> 1632 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAnimationLock">
901 <summary>Key of destination avatar</summary> 1633 <summary>Thread sync lock object</summary>
902 </member> 1634 </member>
903 <member name="F:OpenMetaverse.InstantMessage.ParentEstateID"> 1635 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAppearance">
904 <summary>ID of originating estate</summary> 1636 <summary>The event subscribers, null of no subscribers</summary>
905 </member> 1637 </member>
906 <member name="F:OpenMetaverse.InstantMessage.RegionID"> 1638 <member name="M:OpenMetaverse.AvatarManager.OnAvatarAppearance(OpenMetaverse.AvatarAppearanceEventArgs)">
907 <summary>Key of originating region</summary> 1639 <summary>Raises the AvatarAppearance Event</summary>
1640 <param name="e">A AvatarAppearanceEventArgs object containing
1641 the data sent from the simulator</param>
908 </member> 1642 </member>
909 <member name="F:OpenMetaverse.InstantMessage.Position"> 1643 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAppearanceLock">
910 <summary>Coordinates in originating region</summary> 1644 <summary>Thread sync lock object</summary>
911 </member> 1645 </member>
912 <member name="F:OpenMetaverse.InstantMessage.Dialog"> 1646 <member name="F:OpenMetaverse.AvatarManager.m_UUIDNameReply">
913 <summary>Instant message type</summary> 1647 <summary>The event subscribers, null of no subscribers</summary>
914 </member> 1648 </member>
915 <member name="F:OpenMetaverse.InstantMessage.GroupIM"> 1649 <member name="M:OpenMetaverse.AvatarManager.OnUUIDNameReply(OpenMetaverse.UUIDNameReplyEventArgs)">
916 <summary>Group IM session toggle</summary> 1650 <summary>Raises the UUIDNameReply Event</summary>
1651 <param name="e">A UUIDNameReplyEventArgs object containing
1652 the data sent from the simulator</param>
917 </member> 1653 </member>
918 <member name="F:OpenMetaverse.InstantMessage.IMSessionID"> 1654 <member name="F:OpenMetaverse.AvatarManager.m_UUIDNameReplyLock">
919 <summary>Key of IM session, for Group Messages, the groups UUID</summary> 1655 <summary>Thread sync lock object</summary>
920 </member> 1656 </member>
921 <member name="F:OpenMetaverse.InstantMessage.Timestamp"> 1657 <member name="F:OpenMetaverse.AvatarManager.m_AvatarInterestsReply">
922 <summary>Timestamp of the instant message</summary> 1658 <summary>The event subscribers, null of no subscribers</summary>
923 </member> 1659 </member>
924 <member name="F:OpenMetaverse.InstantMessage.Message"> 1660 <member name="M:OpenMetaverse.AvatarManager.OnAvatarInterestsReply(OpenMetaverse.AvatarInterestsReplyEventArgs)">
925 <summary>Instant message text</summary> 1661 <summary>Raises the AvatarInterestsReply Event</summary>
1662 <param name="e">A AvatarInterestsReplyEventArgs object containing
1663 the data sent from the simulator</param>
926 </member> 1664 </member>
927 <member name="F:OpenMetaverse.InstantMessage.Offline"> 1665 <member name="F:OpenMetaverse.AvatarManager.m_AvatarInterestsReplyLock">
928 <summary>Whether this message is held for offline avatars</summary> 1666 <summary>Thread sync lock object</summary>
929 </member> 1667 </member>
930 <member name="F:OpenMetaverse.InstantMessage.BinaryBucket"> 1668 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPropertiesReply">
931 <summary>Context specific packed data</summary> 1669 <summary>The event subscribers, null of no subscribers</summary>
932 </member> 1670 </member>
933 <member name="M:OpenMetaverse.InstantMessage.ToString"> 1671 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPropertiesReply(OpenMetaverse.AvatarPropertiesReplyEventArgs)">
934 <summary>Print the struct data as a string</summary> 1672 <summary>Raises the AvatarPropertiesReply Event</summary>
935 <returns>A string containing the field name, and field value</returns> 1673 <param name="e">A AvatarPropertiesReplyEventArgs object containing
1674 the data sent from the simulator</param>
936 </member> 1675 </member>
937 <member name="T:OpenMetaverse.MuteEntry"> 1676 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPropertiesReplyLock">
938 <summary>Represents muted object or resident</summary> 1677 <summary>Thread sync lock object</summary>
939 </member> 1678 </member>
940 <member name="F:OpenMetaverse.MuteEntry.Type"> 1679 <member name="F:OpenMetaverse.AvatarManager.m_AvatarGroupsReply">
941 <summary>Type of the mute entry</summary> 1680 <summary>The event subscribers, null of no subscribers</summary>
942 </member> 1681 </member>
943 <member name="F:OpenMetaverse.MuteEntry.ID"> 1682 <member name="M:OpenMetaverse.AvatarManager.OnAvatarGroupsReply(OpenMetaverse.AvatarGroupsReplyEventArgs)">
944 <summary>UUID of the mute etnry</summary> 1683 <summary>Raises the AvatarGroupsReply Event</summary>
1684 <param name="e">A AvatarGroupsReplyEventArgs object containing
1685 the data sent from the simulator</param>
945 </member> 1686 </member>
946 <member name="F:OpenMetaverse.MuteEntry.Name"> 1687 <member name="F:OpenMetaverse.AvatarManager.m_AvatarGroupsReplyLock">
947 <summary>Mute entry name</summary> 1688 <summary>Thread sync lock object</summary>
948 </member> 1689 </member>
949 <member name="F:OpenMetaverse.MuteEntry.Flags"> 1690 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPickerReply">
950 <summary>Mute flags</summary> 1691 <summary>The event subscribers, null of no subscribers</summary>
951 </member> 1692 </member>
952 <member name="T:OpenMetaverse.TransactionInfo"> 1693 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPickerReply(OpenMetaverse.AvatarPickerReplyEventArgs)">
953 <summary>Transaction detail sent with MoneyBalanceReply message</summary> 1694 <summary>Raises the AvatarPickerReply Event</summary>
1695 <param name="e">A AvatarPickerReplyEventArgs object containing
1696 the data sent from the simulator</param>
954 </member> 1697 </member>
955 <member name="F:OpenMetaverse.TransactionInfo.TransactionType"> 1698 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPickerReplyLock">
956 <summary>Type of the transaction</summary> 1699 <summary>Thread sync lock object</summary>
957 </member> 1700 </member>
958 <member name="F:OpenMetaverse.TransactionInfo.SourceID"> 1701 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectPointAt">
959 <summary>UUID of the transaction source</summary> 1702 <summary>The event subscribers, null of no subscribers</summary>
960 </member> 1703 </member>
961 <member name="F:OpenMetaverse.TransactionInfo.IsSourceGroup"> 1704 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffectPointAt(OpenMetaverse.ViewerEffectPointAtEventArgs)">
962 <summary>Is the transaction source a group</summary> 1705 <summary>Raises the ViewerEffectPointAt Event</summary>
1706 <param name="e">A ViewerEffectPointAtEventArgs object containing
1707 the data sent from the simulator</param>
963 </member> 1708 </member>
964 <member name="F:OpenMetaverse.TransactionInfo.DestID"> 1709 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectPointAtLock">
965 <summary>UUID of the transaction destination</summary> 1710 <summary>Thread sync lock object</summary>
966 </member> 1711 </member>
967 <member name="F:OpenMetaverse.TransactionInfo.IsDestGroup"> 1712 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLookAt">
968 <summary>Is transaction destination a group</summary> 1713 <summary>The event subscribers, null of no subscribers</summary>
969 </member> 1714 </member>
970 <member name="F:OpenMetaverse.TransactionInfo.Amount"> 1715 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffectLookAt(OpenMetaverse.ViewerEffectLookAtEventArgs)">
971 <summary>Transaction amount</summary> 1716 <summary>Raises the ViewerEffectLookAt Event</summary>
1717 <param name="e">A ViewerEffectLookAtEventArgs object containing
1718 the data sent from the simulator</param>
972 </member> 1719 </member>
973 <member name="F:OpenMetaverse.TransactionInfo.ItemDescription"> 1720 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLookAtLock">
974 <summary>Transaction description</summary> 1721 <summary>Thread sync lock object</summary>
975 </member> 1722 </member>
976 <member name="T:OpenMetaverse.AgentManager"> 1723 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffect">
977 <summary> 1724 <summary>The event subscribers, null of no subscribers</summary>
978 Manager class for our own avatar
979 </summary>
980 </member> 1725 </member>
981 <member name="M:OpenMetaverse.AgentManager.#ctor(OpenMetaverse.GridClient)"> 1726 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffect(OpenMetaverse.ViewerEffectEventArgs)">
982 <summary> 1727 <summary>Raises the ViewerEffect Event</summary>
983 Constructor, setup callbacks for packets related to our avatar 1728 <param name="e">A ViewerEffectEventArgs object containing
984 </summary> 1729 the data sent from the simulator</param>
985 <param name="client">A reference to the <seealso cref="T:OpenMetaverse.GridClient" /> Class</param>
986 </member> 1730 </member>
987 <member name="T:OpenMetaverse.AgentManager.AgentMovement"> 1731 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLock">
988 <summary> 1732 <summary>Thread sync lock object</summary>
989 Agent movement and camera control
990 Agent movement is controlled by setting specific <seealso cref="T:AgentManager.ControlFlags" />
991 After the control flags are set, An AgentUpdate is required to update the simulator of the specified flags
992 This is most easily accomplished by setting one or more of the AgentMovement properties
993 Movement of an avatar is always based on a compass direction, for example AtPos will move the
994 agent from West to East or forward on the X Axis, AtNeg will of course move agent from
995 East to West or backward on the X Axis, LeftPos will be South to North or forward on the Y Axis
996 The Z axis is Up, finer grained control of movements can be done using the Nudge properties
997 </summary>
998 </member> 1733 </member>
999 <member name="M:OpenMetaverse.AgentManager.AgentMovement.#ctor(OpenMetaverse.GridClient)"> 1734 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPicksReply">
1000 <summary>Default constructor</summary> 1735 <summary>The event subscribers, null of no subscribers</summary>
1001 </member> 1736 </member>
1002 <member name="T:OpenMetaverse.AgentManager.AgentMovement.AgentCamera"> 1737 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPicksReply(OpenMetaverse.AvatarPicksReplyEventArgs)">
1003 <summary> 1738 <summary>Raises the AvatarPicksReply Event</summary>
1004 Camera controls for the agent, mostly a thin wrapper around 1739 <param name="e">A AvatarPicksReplyEventArgs object containing
1005 CoordinateFrame. This class is only responsible for state 1740 the data sent from the simulator</param>
1006 tracking and math, it does not send any packets
1007 </summary>
1008 </member> 1741 </member>
1009 <member name="M:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.#ctor"> 1742 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPicksReplyLock">
1010 <summary> 1743 <summary>Thread sync lock object</summary>
1011 Default constructor
1012 </summary>
1013 </member> 1744 </member>
1014 <member name="F:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Far"> 1745 <member name="F:OpenMetaverse.AvatarManager.m_PickInfoReply">
1015 <summary> 1746 <summary>The event subscribers, null of no subscribers</summary>
1016 </summary>
1017 </member> 1747 </member>
1018 <member name="F:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Frame"> 1748 <member name="M:OpenMetaverse.AvatarManager.OnPickInfoReply(OpenMetaverse.PickInfoReplyEventArgs)">
1019 <summary>The camera is a local frame of reference inside of 1749 <summary>Raises the PickInfoReply Event</summary>
1020 the larger grid space. This is where the math happens</summary> 1750 <param name="e">A PickInfoReplyEventArgs object containing
1751 the data sent from the simulator</param>
1021 </member> 1752 </member>
1022 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Position"> 1753 <member name="F:OpenMetaverse.AvatarManager.m_PickInfoReplyLock">
1023 <summary> 1754 <summary>Thread sync lock object</summary>
1024 </summary>
1025 </member> 1755 </member>
1026 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.AtAxis"> 1756 <member name="F:OpenMetaverse.AvatarManager.m_AvatarClassifiedReply">
1027 <summary> 1757 <summary>The event subscribers, null of no subscribers</summary>
1028 </summary>
1029 </member> 1758 </member>
1030 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.LeftAxis"> 1759 <member name="M:OpenMetaverse.AvatarManager.OnAvatarClassifiedReply(OpenMetaverse.AvatarClassifiedReplyEventArgs)">
1031 <summary> 1760 <summary>Raises the AvatarClassifiedReply Event</summary>
1032 </summary> 1761 <param name="e">A AvatarClassifiedReplyEventArgs object containing
1762 the data sent from the simulator</param>
1033 </member> 1763 </member>
1034 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.UpAxis"> 1764 <member name="F:OpenMetaverse.AvatarManager.m_AvatarClassifiedReplyLock">
1035 <summary> 1765 <summary>Thread sync lock object</summary>
1036 </summary>
1037 </member> 1766 </member>
1038 <member name="F:OpenMetaverse.AgentManager.AgentMovement.Camera"> 1767 <member name="F:OpenMetaverse.AvatarManager.m_ClassifiedInfoReply">
1039 <summary>Agent camera controls</summary> 1768 <summary>The event subscribers, null of no subscribers</summary>
1040 </member> 1769 </member>
1041 <member name="F:OpenMetaverse.AgentManager.AgentMovement.Flags"> 1770 <member name="M:OpenMetaverse.AvatarManager.OnClassifiedInfoReply(OpenMetaverse.ClassifiedInfoReplyEventArgs)">
1042 <summary>Currently only used for hiding your group title</summary> 1771 <summary>Raises the ClassifiedInfoReply Event</summary>
1772 <param name="e">A ClassifiedInfoReplyEventArgs object containing
1773 the data sent from the simulator</param>
1043 </member> 1774 </member>
1044 <member name="F:OpenMetaverse.AgentManager.AgentMovement.State"> 1775 <member name="F:OpenMetaverse.AvatarManager.m_ClassifiedInfoReplyLock">
1045 <summary>Action state of the avatar, which can currently be 1776 <summary>Thread sync lock object</summary>
1046 typing and editing</summary>
1047 </member> 1777 </member>
1048 <member name="F:OpenMetaverse.AgentManager.AgentMovement.BodyRotation"> 1778 <member name="F:OpenMetaverse.AvatarManager.m_DisplayNameUpdate">
1049 <summary> 1779 <summary>The event subscribers, null of no subscribers</summary>
1050 </summary>
1051 </member> 1780 </member>
1052 <member name="F:OpenMetaverse.AgentManager.AgentMovement.HeadRotation"> 1781 <member name="M:OpenMetaverse.AvatarManager.OnDisplayNameUpdate(OpenMetaverse.DisplayNameUpdateEventArgs)">
1053 <summary> 1782 <summary>Raises the DisplayNameUpdate Event</summary>
1054 </summary> 1783 <param name="e">A DisplayNameUpdateEventArgs object containing
1784 the data sent from the simulator</param>
1055 </member> 1785 </member>
1056 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastBodyRotation"> 1786 <member name="F:OpenMetaverse.AvatarManager.m_DisplayNameUpdateLock">
1057 <summary> 1787 <summary>Thread sync lock object</summary>
1058 </summary>
1059 </member> 1788 </member>
1060 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastHeadRotation"> 1789 <member name="M:OpenMetaverse.AvatarManager.#ctor(OpenMetaverse.GridClient)">
1061 <summary> 1790 <summary>
1791 Represents other avatars
1062 </summary> 1792 </summary>
1793 <param name="client"></param>
1063 </member> 1794 </member>
1064 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraCenter"> 1795 <member name="M:OpenMetaverse.AvatarManager.RequestTrackAgent(OpenMetaverse.UUID)">
1796 <summary>Tracks the specified avatar on your map</summary>
1797 <param name="preyID">Avatar ID to track</param>
1798 </member>
1799 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarName(OpenMetaverse.UUID)">
1065 <summary> 1800 <summary>
1801 Request a single avatar name
1066 </summary> 1802 </summary>
1803 <param name="id">The avatar key to retrieve a name for</param>
1067 </member> 1804 </member>
1068 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraXAxis"> 1805 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarNames(System.Collections.Generic.List{OpenMetaverse.UUID})">
1069 <summary> 1806 <summary>
1807 Request a list of avatar names
1070 </summary> 1808 </summary>
1809 <param name="ids">The avatar keys to retrieve names for</param>
1071 </member> 1810 </member>
1072 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraYAxis"> 1811 <member name="M:OpenMetaverse.AvatarManager.DisplayNamesAvailable">
1073 <summary> 1812 <summary>
1813 Check if Display Names functionality is available
1074 </summary> 1814 </summary>
1815 <returns>True if Display name functionality is available</returns>
1075 </member> 1816 </member>
1076 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraZAxis"> 1817 <member name="M:OpenMetaverse.AvatarManager.GetDisplayNames(System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.AvatarManager.DisplayNamesCallback)">
1077 <summary> 1818 <summary>
1819 Request retrieval of display names (max 90 names per request)
1078 </summary> 1820 </summary>
1821 <param name="ids">List of UUIDs to lookup</param>
1822 <param name="callback">Callback to report result of the operation</param>
1079 </member> 1823 </member>
1080 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastFar"> 1824 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarProperties(OpenMetaverse.UUID)">
1081 <summary> 1825 <summary>
1826 Start a request for Avatar Properties
1082 </summary> 1827 </summary>
1828 <param name="avatarid"></param>
1083 </member> 1829 </member>
1084 <member name="F:OpenMetaverse.AgentManager.AgentMovement.updateTimer"> 1830 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarNameSearch(System.String,OpenMetaverse.UUID)">
1085 <summary>Timer for sending AgentUpdate packets</summary>
1086 </member>
1087 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AtPos">
1088 <summary>Move agent positive along the X axis</summary>
1089 </member>
1090 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AtNeg">
1091 <summary>Move agent negative along the X axis</summary>
1092 </member>
1093 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LeftPos">
1094 <summary>Move agent positive along the Y axis</summary>
1095 </member>
1096 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LeftNeg">
1097 <summary>Move agent negative along the Y axis</summary>
1098 </member>
1099 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpPos">
1100 <summary>Move agent positive along the Z axis</summary>
1101 </member>
1102 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpNeg">
1103 <summary>Move agent negative along the Z axis</summary>
1104 </member>
1105 <member name="P:OpenMetaverse.AgentManager.AgentMovement.PitchPos">
1106 <summary> 1831 <summary>
1832 Search for an avatar (first name, last name)
1107 </summary> 1833 </summary>
1834 <param name="name">The name to search for</param>
1835 <param name="queryID">An ID to associate with this query</param>
1108 </member> 1836 </member>
1109 <member name="P:OpenMetaverse.AgentManager.AgentMovement.PitchNeg"> 1837 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarPicks(OpenMetaverse.UUID)">
1110 <summary> 1838 <summary>
1839 Start a request for Avatar Picks
1111 </summary> 1840 </summary>
1841 <param name="avatarid">UUID of the avatar</param>
1112 </member> 1842 </member>
1113 <member name="P:OpenMetaverse.AgentManager.AgentMovement.YawPos"> 1843 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarClassified(OpenMetaverse.UUID)">
1114 <summary> 1844 <summary>
1845 Start a request for Avatar Classifieds
1115 </summary> 1846 </summary>
1847 <param name="avatarid">UUID of the avatar</param>
1116 </member> 1848 </member>
1117 <member name="P:OpenMetaverse.AgentManager.AgentMovement.YawNeg"> 1849 <member name="M:OpenMetaverse.AvatarManager.RequestPickInfo(OpenMetaverse.UUID,OpenMetaverse.UUID)">
1118 <summary> 1850 <summary>
1851 Start a request for details of a specific profile pick
1119 </summary> 1852 </summary>
1853 <param name="avatarid">UUID of the avatar</param>
1854 <param name="pickid">UUID of the profile pick</param>
1120 </member> 1855 </member>
1121 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastAt"> 1856 <member name="M:OpenMetaverse.AvatarManager.RequestClassifiedInfo(OpenMetaverse.UUID,OpenMetaverse.UUID)">
1122 <summary> 1857 <summary>
1858 Start a request for details of a specific profile classified
1123 </summary> 1859 </summary>
1860 <param name="avatarid">UUID of the avatar</param>
1861 <param name="classifiedid">UUID of the profile classified</param>
1124 </member> 1862 </member>
1125 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastLeft"> 1863 <member name="M:OpenMetaverse.AvatarManager.UUIDNameReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1864 <summary>Process an incoming packet and raise the appropriate events</summary>
1865 <param name="sender">The sender</param>
1866 <param name="e">The EventArgs object containing the packet data</param>
1867 </member>
1868 <member name="M:OpenMetaverse.AvatarManager.AvatarAnimationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1869 <summary>Process an incoming packet and raise the appropriate events</summary>
1870 <param name="sender">The sender</param>
1871 <param name="e">The EventArgs object containing the packet data</param>
1872 </member>
1873 <member name="M:OpenMetaverse.AvatarManager.AvatarAppearanceHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1874 <summary>Process an incoming packet and raise the appropriate events</summary>
1875 <param name="sender">The sender</param>
1876 <param name="e">The EventArgs object containing the packet data</param>
1877 </member>
1878 <member name="M:OpenMetaverse.AvatarManager.AvatarPropertiesHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1879 <summary>Process an incoming packet and raise the appropriate events</summary>
1880 <param name="sender">The sender</param>
1881 <param name="e">The EventArgs object containing the packet data</param>
1882 </member>
1883 <member name="M:OpenMetaverse.AvatarManager.AvatarInterestsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1884 <summary>Process an incoming packet and raise the appropriate events</summary>
1885 <param name="sender">The sender</param>
1886 <param name="e">The EventArgs object containing the packet data</param>
1887 </member>
1888 <member name="M:OpenMetaverse.AvatarManager.DisplayNameUpdateMessageHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
1126 <summary> 1889 <summary>
1890 EQ Message fired when someone nearby changes their display name
1127 </summary> 1891 </summary>
1892 <param name="capsKey">The message key</param>
1893 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
1894 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> which originated the packet</param>
1128 </member> 1895 </member>
1129 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastUp"> 1896 <member name="M:OpenMetaverse.AvatarManager.AvatarGroupsReplyMessageHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
1130 <summary> 1897 <summary>
1898 Crossed region handler for message that comes across the EventQueue. Sent to an agent
1899 when the agent crosses a sim border into a new region.
1131 </summary> 1900 </summary>
1901 <param name="capsKey">The message key</param>
1902 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
1903 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> which originated the packet</param>
1132 </member> 1904 </member>
1133 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Fly"> 1905 <member name="M:OpenMetaverse.AvatarManager.AvatarGroupsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1134 <summary>Causes simulator to make agent fly</summary> 1906 <summary>Process an incoming packet and raise the appropriate events</summary>
1135 </member> 1907 <param name="sender">The sender</param>
1136 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Stop"> 1908 <param name="e">The EventArgs object containing the packet data</param>
1137 <summary>Stop movement</summary>
1138 </member>
1139 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FinishAnim">
1140 <summary>Finish animation</summary>
1141 </member> 1909 </member>
1142 <member name="P:OpenMetaverse.AgentManager.AgentMovement.StandUp"> 1910 <member name="M:OpenMetaverse.AvatarManager.AvatarPickerReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1143 <summary>Stand up from a sit</summary> 1911 <summary>Process an incoming packet and raise the appropriate events</summary>
1912 <param name="sender">The sender</param>
1913 <param name="e">The EventArgs object containing the packet data</param>
1144 </member> 1914 </member>
1145 <member name="P:OpenMetaverse.AgentManager.AgentMovement.SitOnGround"> 1915 <member name="M:OpenMetaverse.AvatarManager.ViewerEffectHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1146 <summary>Tells simulator to sit agent on ground</summary> 1916 <summary>Process an incoming packet and raise the appropriate events</summary>
1917 <param name="sender">The sender</param>
1918 <param name="e">The EventArgs object containing the packet data</param>
1147 </member> 1919 </member>
1148 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Mouselook"> 1920 <member name="M:OpenMetaverse.AvatarManager.AvatarPicksReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1149 <summary>Place agent into mouselook mode</summary> 1921 <summary>Process an incoming packet and raise the appropriate events</summary>
1922 <param name="sender">The sender</param>
1923 <param name="e">The EventArgs object containing the packet data</param>
1150 </member> 1924 </member>
1151 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeAtPos"> 1925 <member name="M:OpenMetaverse.AvatarManager.PickInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1152 <summary>Nudge agent positive along the X axis</summary> 1926 <summary>Process an incoming packet and raise the appropriate events</summary>
1927 <param name="sender">The sender</param>
1928 <param name="e">The EventArgs object containing the packet data</param>
1153 </member> 1929 </member>
1154 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeAtNeg"> 1930 <member name="M:OpenMetaverse.AvatarManager.AvatarClassifiedReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1155 <summary>Nudge agent negative along the X axis</summary> 1931 <summary>Process an incoming packet and raise the appropriate events</summary>
1932 <param name="sender">The sender</param>
1933 <param name="e">The EventArgs object containing the packet data</param>
1156 </member> 1934 </member>
1157 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeLeftPos"> 1935 <member name="M:OpenMetaverse.AvatarManager.ClassifiedInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1158 <summary>Nudge agent positive along the Y axis</summary> 1936 <summary>Process an incoming packet and raise the appropriate events</summary>
1937 <param name="sender">The sender</param>
1938 <param name="e">The EventArgs object containing the packet data</param>
1159 </member> 1939 </member>
1160 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeLeftNeg"> 1940 <member name="E:OpenMetaverse.AvatarManager.AvatarAnimation">
1161 <summary>Nudge agent negative along the Y axis</summary> 1941 <summary>Raised when the simulator sends us data containing
1942 an agents animation playlist</summary>
1162 </member> 1943 </member>
1163 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeUpPos"> 1944 <member name="E:OpenMetaverse.AvatarManager.AvatarAppearance">
1164 <summary>Nudge agent positive along the Z axis</summary> 1945 <summary>Raised when the simulator sends us data containing
1946 the appearance information for an agent</summary>
1165 </member> 1947 </member>
1166 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeUpNeg"> 1948 <member name="E:OpenMetaverse.AvatarManager.UUIDNameReply">
1167 <summary>Nudge agent negative along the Z axis</summary> 1949 <summary>Raised when the simulator sends us data containing
1950 agent names/id values</summary>
1168 </member> 1951 </member>
1169 <member name="P:OpenMetaverse.AgentManager.AgentMovement.TurnLeft"> 1952 <member name="E:OpenMetaverse.AvatarManager.AvatarInterestsReply">
1170 <summary> 1953 <summary>Raised when the simulator sends us data containing
1171 </summary> 1954 the interests listed in an agents profile</summary>
1172 </member> 1955 </member>
1173 <member name="P:OpenMetaverse.AgentManager.AgentMovement.TurnRight"> 1956 <member name="E:OpenMetaverse.AvatarManager.AvatarPropertiesReply">
1174 <summary> 1957 <summary>Raised when the simulator sends us data containing
1175 </summary> 1958 profile property information for an agent</summary>
1176 </member> 1959 </member>
1177 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Away"> 1960 <member name="E:OpenMetaverse.AvatarManager.AvatarGroupsReply">
1178 <summary>Tell simulator to mark agent as away</summary> 1961 <summary>Raised when the simulator sends us data containing
1962 the group membership an agent is a member of</summary>
1179 </member> 1963 </member>
1180 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LButtonDown"> 1964 <member name="E:OpenMetaverse.AvatarManager.AvatarPickerReply">
1181 <summary> 1965 <summary>Raised when the simulator sends us data containing
1182 </summary> 1966 name/id pair</summary>
1183 </member> 1967 </member>
1184 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LButtonUp"> 1968 <member name="E:OpenMetaverse.AvatarManager.ViewerEffectPointAt">
1185 <summary> 1969 <summary>Raised when the simulator sends us data containing
1186 </summary> 1970 the objects and effect when an agent is pointing at</summary>
1187 </member> 1971 </member>
1188 <member name="P:OpenMetaverse.AgentManager.AgentMovement.MLButtonDown"> 1972 <member name="E:OpenMetaverse.AvatarManager.ViewerEffectLookAt">
1189 <summary> 1973 <summary>Raised when the simulator sends us data containing
1190 </summary> 1974 the objects and effect when an agent is looking at</summary>
1191 </member> 1975 </member>
1192 <member name="P:OpenMetaverse.AgentManager.AgentMovement.MLButtonUp"> 1976 <member name="E:OpenMetaverse.AvatarManager.ViewerEffect">
1193 <summary> 1977 <summary>Raised when the simulator sends us data containing
1194 </summary> 1978 an agents viewer effect information</summary>
1195 </member> 1979 </member>
1196 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AlwaysRun"> 1980 <member name="E:OpenMetaverse.AvatarManager.AvatarPicksReply">
1197 <summary> 1981 <summary>Raised when the simulator sends us data containing
1198 Returns "always run" value, or changes it by sending a SetAlwaysRunPacket 1982 the top picks from an agents profile</summary>
1199 </summary>
1200 </member> 1983 </member>
1201 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentControls"> 1984 <member name="E:OpenMetaverse.AvatarManager.PickInfoReply">
1202 <summary>The current value of the agent control flags</summary> 1985 <summary>Raised when the simulator sends us data containing
1986 the Pick details</summary>
1203 </member> 1987 </member>
1204 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpdateInterval"> 1988 <member name="E:OpenMetaverse.AvatarManager.AvatarClassifiedReply">
1205 <summary>Gets or sets the interval in milliseconds at which 1989 <summary>Raised when the simulator sends us data containing
1206 AgentUpdate packets are sent to the current simulator. Setting 1990 the classified ads an agent has placed</summary>
1207 this to a non-zero value will also enable the packet sending if
1208 it was previously off, and setting it to zero will disable</summary>
1209 </member> 1991 </member>
1210 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpdateEnabled"> 1992 <member name="E:OpenMetaverse.AvatarManager.ClassifiedInfoReply">
1211 <summary>Gets or sets whether AgentUpdate packets are sent to 1993 <summary>Raised when the simulator sends us data containing
1212 the current simulator</summary> 1994 the details of a classified ad</summary>
1213 </member> 1995 </member>
1214 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AutoResetControls"> 1996 <member name="E:OpenMetaverse.AvatarManager.DisplayNameUpdate">
1215 <summary>Reset movement controls every time we send an update</summary> 1997 <summary>Raised when the simulator sends us data containing
1998 the details of display name change</summary>
1216 </member> 1999 </member>
1217 <member name="M:OpenMetaverse.AgentManager.AgentMovement.UpdateFromHeading(System.Double,System.Boolean)"> 2000 <member name="T:OpenMetaverse.AvatarManager.DisplayNamesCallback">
1218 <summary> 2001 <summary>
1219 Send an AgentUpdate with the camera set at the current agent 2002 Callback giving results when fetching display names
1220 position and pointing towards the heading specified
1221 </summary> 2003 </summary>
1222 <param name="heading">Camera rotation in radians</param> 2004 <param name="success">If the request was successful</param>
1223 <param name="reliable">Whether to send the AgentUpdate reliable 2005 <param name="names">Array of display names</param>
1224 or not</param> 2006 <param name="badIDs">Array of UUIDs that could not be fetched</param>
1225 </member> 2007 </member>
1226 <member name="M:OpenMetaverse.AgentManager.AgentMovement.TurnToward(OpenMetaverse.Vector3)"> 2008 <member name="T:OpenMetaverse.AvatarAnimationEventArgs">
1227 <summary> 2009 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAnimation"/> event</summary>
1228 Rotates the avatar body and camera toward a target position. 2010 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAnimation"/> event occurs when the simulator sends
1229 This will also anchor the camera position on the avatar 2011 the animation playlist for an agent</remarks>
1230 </summary> 2012 <example>
1231 <param name="target">Region coordinates to turn toward</param> 2013 The following code example uses the <see cref="P:OpenMetaverse.AvatarAnimationEventArgs.AvatarID"/> and <see cref="P:OpenMetaverse.AvatarAnimationEventArgs.Animations"/>
2014 properties to display the animation playlist of an avatar on the <see cref="T:System.Console"/> window.
2015 <code>
2016 // subscribe to the event
2017 Client.Avatars.AvatarAnimation += Avatars_AvatarAnimation;
2018
2019 private void Avatars_AvatarAnimation(object sender, AvatarAnimationEventArgs e)
2020 {
2021 // create a dictionary of "known" animations from the Animations class using System.Reflection
2022 Dictionary&lt;UUID, string&gt; systemAnimations = new Dictionary&lt;UUID, string&gt;();
2023 Type type = typeof(Animations);
2024 System.Reflection.FieldInfo[] fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
2025 foreach (System.Reflection.FieldInfo field in fields)
2026 {
2027 systemAnimations.Add((UUID)field.GetValue(type), field.Name);
2028 }
2029
2030 // find out which animations being played are known animations and which are assets
2031 foreach (Animation animation in e.Animations)
2032 {
2033 if (systemAnimations.ContainsKey(animation.AnimationID))
2034 {
2035 Console.WriteLine("{0} is playing {1} ({2}) sequence {3}", e.AvatarID,
2036 systemAnimations[animation.AnimationID], animation.AnimationSequence);
2037 }
2038 else
2039 {
2040 Console.WriteLine("{0} is playing {1} (Asset) sequence {2}", e.AvatarID,
2041 animation.AnimationID, animation.AnimationSequence);
2042 }
2043 }
2044 }
2045 </code>
2046 </example>
1232 </member> 2047 </member>
1233 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate"> 2048 <member name="M:OpenMetaverse.AvatarAnimationEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.Animation})">
1234 <summary> 2049 <summary>
1235 Send new AgentUpdate packet to update our current camera 2050 Construct a new instance of the AvatarAnimationEventArgs class
1236 position and rotation
1237 </summary> 2051 </summary>
2052 <param name="avatarID">The ID of the agent</param>
2053 <param name="anims">The list of animations to start</param>
1238 </member> 2054 </member>
1239 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate(System.Boolean)"> 2055 <member name="P:OpenMetaverse.AvatarAnimationEventArgs.AvatarID">
1240 <summary> 2056 <summary>Get the ID of the agent</summary>
1241 Send new AgentUpdate packet to update our current camera
1242 position and rotation
1243 </summary>
1244 <param name="reliable">Whether to require server acknowledgement
1245 of this packet</param>
1246 </member> 2057 </member>
1247 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate(System.Boolean,OpenMetaverse.Simulator)"> 2058 <member name="P:OpenMetaverse.AvatarAnimationEventArgs.Animations">
1248 <summary> 2059 <summary>Get the list of animations to start</summary>
1249 Send new AgentUpdate packet to update our current camera
1250 position and rotation
1251 </summary>
1252 <param name="reliable">Whether to require server acknowledgement
1253 of this packet</param>
1254 <param name="simulator">Simulator to send the update to</param>
1255 </member> 2060 </member>
1256 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendManualUpdate(OpenMetaverse.AgentManager.ControlFlags,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Quaternion,System.Single,OpenMetaverse.AgentFlags,OpenMetaverse.AgentState,System.Boolean)"> 2061 <member name="T:OpenMetaverse.AvatarAppearanceEventArgs">
1257 <summary> 2062 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance"/> event</summary>
1258 Builds an AgentUpdate packet entirely from parameters. This 2063 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance"/> event occurs when the simulator sends
1259 will not touch the state of Self.Movement or 2064 the appearance data for an avatar</remarks>
1260 Self.Movement.Camera in any way 2065 <example>
1261 </summary> 2066 The following code example uses the <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID"/> and <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams"/>
1262 <param name="controlFlags"> 2067 properties to display the selected shape of an avatar on the <see cref="T:System.Console"/> window.
1263 </param> 2068 <code>
1264 <param name="position"> 2069 // subscribe to the event
1265 </param> 2070 Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance;
1266 <param name="forwardAxis"> 2071
1267 </param> 2072 // handle the data when the event is raised
1268 <param name="leftAxis"> 2073 void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e)
1269 </param> 2074 {
1270 <param name="upAxis"> 2075 Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] &gt; 0) : "male" ? "female")
1271 </param> 2076 }
1272 <param name="bodyRotation"> 2077 </code>
1273 </param> 2078 </example>
1274 <param name="headRotation">
1275 </param>
1276 <param name="farClip">
1277 </param>
1278 <param name="reliable">
1279 </param>
1280 <param name="flags">
1281 </param>
1282 <param name="state">
1283 </param>
1284 </member> 2079 </member>
1285 <member name="T:OpenMetaverse.AgentManager.ControlFlags"> 2080 <member name="M:OpenMetaverse.AvatarAppearanceEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean,OpenMetaverse.Primitive.TextureEntryFace,OpenMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,OpenMetaverse.AppearanceFlags)">
1286 <summary> 2081 <summary>
1287 Used to specify movement actions for your agent 2082 Construct a new instance of the AvatarAppearanceEventArgs class
1288 </summary> 2083 </summary>
2084 <param name="sim">The simulator request was from</param>
2085 <param name="avatarID">The ID of the agent</param>
2086 <param name="isTrial">true of the agent is a trial account</param>
2087 <param name="defaultTexture">The default agent texture</param>
2088 <param name="faceTextures">The agents appearance layer textures</param>
2089 <param name="visualParams">The <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams"/> for the agent</param>
1289 </member> 2090 </member>
1290 <member name="F:OpenMetaverse.AgentManager.ControlFlags.NONE"> 2091 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.Simulator">
1291 <summary>Empty flag</summary> 2092 <summary>Get the Simulator this request is from of the agent</summary>
1292 </member> 2093 </member>
1293 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AT_POS"> 2094 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID">
1294 <summary>Move Forward (SL Keybinding: W/Up Arrow)</summary> 2095 <summary>Get the ID of the agent</summary>
1295 </member> 2096 </member>
1296 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG"> 2097 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.IsTrial">
1297 <summary>Move Backward (SL Keybinding: S/Down Arrow)</summary> 2098 <summary>true if the agent is a trial account</summary>
1298 </member> 2099 </member>
1299 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS"> 2100 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.DefaultTexture">
1300 <summary>Move Left (SL Keybinding: Shift-(A/Left Arrow))</summary> 2101 <summary>Get the default agent texture</summary>
1301 </member> 2102 </member>
1302 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG"> 2103 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.FaceTextures">
1303 <summary>Move Right (SL Keybinding: Shift-(D/Right Arrow))</summary> 2104 <summary>Get the agents appearance layer textures</summary>
1304 </member> 2105 </member>
1305 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_UP_POS"> 2106 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams">
1306 <summary>Not Flying: Jump/Flying: Move Up (SL Keybinding: E)</summary> 2107 <summary>Get the <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams"/> for the agent</summary>
1307 </member> 2108 </member>
1308 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG"> 2109 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.AppearanceVersion">
1309 <summary>Not Flying: Croutch/Flying: Move Down (SL Keybinding: C)</summary> 2110 <summary>Version of the appearance system used.
2111 Value greater than 0 indicates that server side baking is used</summary>
1310 </member> 2112 </member>
1311 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS"> 2113 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.COFVersion">
1312 <summary>Unused</summary> 2114 <summary>Version of the Current Outfit Folder the appearance is based on</summary>
1313 </member> 2115 </member>
1314 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG"> 2116 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.AppearanceFlags">
1315 <summary>Unused</summary> 2117 <summary>Appearance flags, introduced with server side baking, currently unused</summary>
1316 </member> 2118 </member>
1317 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS"> 2119 <member name="T:OpenMetaverse.AvatarInterestsReplyEventArgs">
1318 <summary>Unused</summary> 2120 <summary>Represents the interests from the profile of an agent</summary>
1319 </member> 2121 </member>
1320 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG"> 2122 <member name="P:OpenMetaverse.AvatarInterestsReplyEventArgs.AvatarID">
1321 <summary>Unused</summary> 2123 <summary>Get the ID of the agent</summary>
1322 </member> 2124 </member>
1323 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT"> 2125 <member name="T:OpenMetaverse.AvatarPropertiesReplyEventArgs">
1324 <summary>ORed with AGENT_CONTROL_AT_* if the keyboard is being used</summary> 2126 <summary>The properties of an agent</summary>
1325 </member> 2127 </member>
1326 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT"> 2128 <member name="P:OpenMetaverse.AvatarPropertiesReplyEventArgs.AvatarID">
1327 <summary>ORed with AGENT_CONTROL_LEFT_* if the keyboard is being used</summary> 2129 <summary>Get the ID of the agent</summary>
1328 </member> 2130 </member>
1329 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP"> 2131 <member name="P:OpenMetaverse.AvatarGroupsReplyEventArgs.AvatarID">
1330 <summary>ORed with AGENT_CONTROL_UP_* if the keyboard is being used</summary> 2132 <summary>Get the ID of the agent</summary>
1331 </member> 2133 </member>
1332 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FLY"> 2134 <member name="P:OpenMetaverse.AvatarPicksReplyEventArgs.AvatarID">
1333 <summary>Fly</summary> 2135 <summary>Get the ID of the agent</summary>
1334 </member> 2136 </member>
1335 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_STOP"> 2137 <member name="P:OpenMetaverse.AvatarClassifiedReplyEventArgs.AvatarID">
2138 <summary>Get the ID of the avatar</summary>
2139 </member>
2140 <member name="T:OpenMetaverse.DisplayNameUpdateEventArgs">
1336 <summary> 2141 <summary>
2142 Event args class for display name notification messages
1337 </summary> 2143 </summary>
1338 </member> 2144 </member>
1339 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM"> 2145 <member name="T:OpenMetaverse.Assets.AssetPrim">
1340 <summary>Finish our current animation</summary> 2146 <summary>
2147 A linkset asset, containing a parent primitive and zero or more children
2148 </summary>
1341 </member> 2149 </member>
1342 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP"> 2150 <member name="T:OpenMetaverse.Assets.Asset">
1343 <summary>Stand up from the ground or a prim seat</summary> 2151 <summary>
2152 Base class for all Asset types
2153 </summary>
1344 </member> 2154 </member>
1345 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND"> 2155 <member name="F:OpenMetaverse.Assets.Asset.AssetData">
1346 <summary>Sit on the ground at our current location</summary> 2156 <summary>A byte array containing the raw asset data</summary>
1347 </member> 2157 </member>
1348 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK"> 2158 <member name="F:OpenMetaverse.Assets.Asset.Temporary">
1349 <summary>Whether mouselook is currently enabled</summary> 2159 <summary>True if the asset it only stored on the server temporarily</summary>
1350 </member> 2160 </member>
1351 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS"> 2161 <member name="F:OpenMetaverse.Assets.Asset._AssetID">
1352 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2162 <summary>A unique ID</summary>
1353 </member> 2163 </member>
1354 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG"> 2164 <member name="M:OpenMetaverse.Assets.Asset.#ctor">
1355 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2165 <summary>
2166 Construct a new Asset object
2167 </summary>
1356 </member> 2168 </member>
1357 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS"> 2169 <member name="M:OpenMetaverse.Assets.Asset.#ctor(OpenMetaverse.UUID,System.Byte[])">
1358 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2170 <summary>
2171 Construct a new Asset object
2172 </summary>
2173 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
2174 <param name="assetData">A byte array containing the raw asset data</param>
1359 </member> 2175 </member>
1360 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG"> 2176 <member name="M:OpenMetaverse.Assets.Asset.Encode">
1361 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2177 <summary>
2178 Regenerates the <code>AssetData</code> byte array from the properties
2179 of the derived class.
2180 </summary>
1362 </member> 2181 </member>
1363 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS"> 2182 <member name="M:OpenMetaverse.Assets.Asset.Decode">
1364 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2183 <summary>
2184 Decodes the AssetData, placing it in appropriate properties of the derived
2185 class.
2186 </summary>
2187 <returns>True if the asset decoding succeeded, otherwise false</returns>
1365 </member> 2188 </member>
1366 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG"> 2189 <member name="P:OpenMetaverse.Assets.Asset.AssetID">
1367 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary> 2190 <summary>The assets unique ID</summary>
1368 </member> 2191 </member>
1369 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT"> 2192 <member name="P:OpenMetaverse.Assets.Asset.AssetType">
1370 <summary> 2193 <summary>
2194 The "type" of asset, Notecard, Animation, etc
1371 </summary> 2195 </summary>
1372 </member> 2196 </member>
1373 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT"> 2197 <member name="M:OpenMetaverse.Assets.AssetPrim.#ctor">
2198 <summary>Initializes a new instance of an AssetPrim object</summary>
2199 </member>
2200 <member name="M:OpenMetaverse.Assets.AssetPrim.#ctor(OpenMetaverse.UUID,System.Byte[])">
1374 <summary> 2201 <summary>
2202 Initializes a new instance of an AssetPrim object
1375 </summary> 2203 </summary>
2204 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
2205 <param name="assetData">A byte array containing the raw asset data</param>
1376 </member> 2206 </member>
1377 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AWAY"> 2207 <member name="M:OpenMetaverse.Assets.AssetPrim.Encode">
1378 <summary>Set when the avatar is idled or set to away. Note that the away animation is 2208 <summary>
1379 activated separately from setting this flag</summary> 2209
2210 </summary>
1380 </member> 2211 </member>
1381 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN"> 2212 <member name="M:OpenMetaverse.Assets.AssetPrim.Decode">
1382 <summary> 2213 <summary>
2214
1383 </summary> 2215 </summary>
2216 <returns></returns>
1384 </member> 2217 </member>
1385 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP"> 2218 <member name="P:OpenMetaverse.Assets.AssetPrim.AssetType">
2219 <summary>Override the base classes AssetType</summary>
2220 </member>
2221 <member name="T:OpenMetaverse.Assets.AssetPrim.ProfileShape">
1386 <summary> 2222 <summary>
2223 Only used internally for XML serialization/deserialization
1387 </summary> 2224 </summary>
1388 </member> 2225 </member>
1389 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN"> 2226 <member name="T:OpenMetaverse.Assets.PrimObject">
1390 <summary> 2227 <summary>
2228 The deserialized form of a single primitive in a linkset asset
1391 </summary> 2229 </summary>
1392 </member> 2230 </member>
1393 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP"> 2231 <member name="T:OpenMetaverse.EstateTask">
2232 <summary>Describes tasks returned in LandStatReply</summary>
2233 </member>
2234 <member name="T:OpenMetaverse.EstateTools">
1394 <summary> 2235 <summary>
2236 Estate level administration and utilities
1395 </summary> 2237 </summary>
1396 </member> 2238 </member>
1397 <member name="T:OpenMetaverse.AgentManager.AttachmentResourcesCallback"> 2239 <member name="F:OpenMetaverse.EstateTools.GroundTextures">
2240 <summary>Textures for each of the four terrain height levels</summary>
2241 </member>
2242 <member name="F:OpenMetaverse.EstateTools.GroundTextureLimits">
2243 <summary>Upper/lower texture boundaries for each corner of the sim</summary>
2244 </member>
2245 <member name="M:OpenMetaverse.EstateTools.#ctor(OpenMetaverse.GridClient)">
1398 <summary> 2246 <summary>
1399 Called once attachment resource usage information has been collected 2247 Constructor for EstateTools class
1400 </summary> 2248 </summary>
1401 <param name="success">Indicates if operation was successfull</param> 2249 <param name="client"></param>
1402 <param name="info">Attachment resource usage information</param>
1403 </member> 2250 </member>
1404 <member name="F:OpenMetaverse.AgentManager.m_Chat"> 2251 <member name="F:OpenMetaverse.EstateTools.m_TopCollidersReply">
1405 <summary>The event subscribers. null if no subcribers</summary> 2252 <summary>The event subscribers. null if no subcribers</summary>
1406 </member> 2253 </member>
1407 <member name="F:OpenMetaverse.AgentManager.m_ChatLock"> 2254 <member name="M:OpenMetaverse.EstateTools.OnTopCollidersReply(OpenMetaverse.TopCollidersReplyEventArgs)">
2255 <summary>Raises the TopCollidersReply event</summary>
2256 <param name="e">A TopCollidersReplyEventArgs object containing the
2257 data returned from the data server</param>
2258 </member>
2259 <member name="F:OpenMetaverse.EstateTools.m_TopCollidersReply_Lock">
1408 <summary>Thread sync lock object</summary> 2260 <summary>Thread sync lock object</summary>
1409 </member> 2261 </member>
1410 <member name="F:OpenMetaverse.AgentManager.m_ScriptDialog"> 2262 <member name="F:OpenMetaverse.EstateTools.m_TopScriptsReply">
1411 <summary>The event subscribers. null if no subcribers</summary> 2263 <summary>The event subscribers. null if no subcribers</summary>
1412 </member> 2264 </member>
1413 <member name="F:OpenMetaverse.AgentManager.m_ScriptDialogLock"> 2265 <member name="M:OpenMetaverse.EstateTools.OnTopScriptsReply(OpenMetaverse.TopScriptsReplyEventArgs)">
2266 <summary>Raises the TopScriptsReply event</summary>
2267 <param name="e">A TopScriptsReplyEventArgs object containing the
2268 data returned from the data server</param>
2269 </member>
2270 <member name="F:OpenMetaverse.EstateTools.m_TopScriptsReply_Lock">
1414 <summary>Thread sync lock object</summary> 2271 <summary>Thread sync lock object</summary>
1415 </member> 2272 </member>
1416 <member name="F:OpenMetaverse.AgentManager.m_ScriptQuestion"> 2273 <member name="F:OpenMetaverse.EstateTools.m_EstateUsersReply">
1417 <summary>The event subscribers. null if no subcribers</summary> 2274 <summary>The event subscribers. null if no subcribers</summary>
1418 </member> 2275 </member>
1419 <member name="F:OpenMetaverse.AgentManager.m_ScriptQuestionLock"> 2276 <member name="M:OpenMetaverse.EstateTools.OnEstateUsersReply(OpenMetaverse.EstateUsersReplyEventArgs)">
2277 <summary>Raises the EstateUsersReply event</summary>
2278 <param name="e">A EstateUsersReplyEventArgs object containing the
2279 data returned from the data server</param>
2280 </member>
2281 <member name="F:OpenMetaverse.EstateTools.m_EstateUsersReply_Lock">
1420 <summary>Thread sync lock object</summary> 2282 <summary>Thread sync lock object</summary>
1421 </member> 2283 </member>
1422 <member name="F:OpenMetaverse.AgentManager.m_LoadURL"> 2284 <member name="F:OpenMetaverse.EstateTools.m_EstateGroupsReply">
1423 <summary>The event subscribers. null if no subcribers</summary> 2285 <summary>The event subscribers. null if no subcribers</summary>
1424 </member> 2286 </member>
1425 <member name="F:OpenMetaverse.AgentManager.m_LoadUrlLock"> 2287 <member name="M:OpenMetaverse.EstateTools.OnEstateGroupsReply(OpenMetaverse.EstateGroupsReplyEventArgs)">
2288 <summary>Raises the EstateGroupsReply event</summary>
2289 <param name="e">A EstateGroupsReplyEventArgs object containing the
2290 data returned from the data server</param>
2291 </member>
2292 <member name="F:OpenMetaverse.EstateTools.m_EstateGroupsReply_Lock">
1426 <summary>Thread sync lock object</summary> 2293 <summary>Thread sync lock object</summary>
1427 </member> 2294 </member>
1428 <member name="F:OpenMetaverse.AgentManager.m_Balance"> 2295 <member name="F:OpenMetaverse.EstateTools.m_EstateManagersReply">
1429 <summary>The event subscribers. null if no subcribers</summary> 2296 <summary>The event subscribers. null if no subcribers</summary>
1430 </member> 2297 </member>
1431 <member name="F:OpenMetaverse.AgentManager.m_BalanceLock"> 2298 <member name="M:OpenMetaverse.EstateTools.OnEstateManagersReply(OpenMetaverse.EstateManagersReplyEventArgs)">
2299 <summary>Raises the EstateManagersReply event</summary>
2300 <param name="e">A EstateManagersReplyEventArgs object containing the
2301 data returned from the data server</param>
2302 </member>
2303 <member name="F:OpenMetaverse.EstateTools.m_EstateManagersReply_Lock">
1432 <summary>Thread sync lock object</summary> 2304 <summary>Thread sync lock object</summary>
1433 </member> 2305 </member>
1434 <member name="F:OpenMetaverse.AgentManager.m_MoneyBalance"> 2306 <member name="F:OpenMetaverse.EstateTools.m_EstateBansReply">
1435 <summary>The event subscribers. null if no subcribers</summary> 2307 <summary>The event subscribers. null if no subcribers</summary>
1436 </member> 2308 </member>
1437 <member name="F:OpenMetaverse.AgentManager.m_MoneyBalanceReplyLock"> 2309 <member name="M:OpenMetaverse.EstateTools.OnEstateBansReply(OpenMetaverse.EstateBansReplyEventArgs)">
2310 <summary>Raises the EstateBansReply event</summary>
2311 <param name="e">A EstateBansReplyEventArgs object containing the
2312 data returned from the data server</param>
2313 </member>
2314 <member name="F:OpenMetaverse.EstateTools.m_EstateBansReply_Lock">
1438 <summary>Thread sync lock object</summary> 2315 <summary>Thread sync lock object</summary>
1439 </member> 2316 </member>
1440 <member name="F:OpenMetaverse.AgentManager.m_InstantMessage"> 2317 <member name="F:OpenMetaverse.EstateTools.m_EstateCovenantReply">
1441 <summary>The event subscribers. null if no subcribers</summary> 2318 <summary>The event subscribers. null if no subcribers</summary>
1442 </member> 2319 </member>
1443 <member name="F:OpenMetaverse.AgentManager.m_InstantMessageLock"> 2320 <member name="M:OpenMetaverse.EstateTools.OnEstateCovenantReply(OpenMetaverse.EstateCovenantReplyEventArgs)">
2321 <summary>Raises the EstateCovenantReply event</summary>
2322 <param name="e">A EstateCovenantReplyEventArgs object containing the
2323 data returned from the data server</param>
2324 </member>
2325 <member name="F:OpenMetaverse.EstateTools.m_EstateCovenantReply_Lock">
1444 <summary>Thread sync lock object</summary> 2326 <summary>Thread sync lock object</summary>
1445 </member> 2327 </member>
1446 <member name="F:OpenMetaverse.AgentManager.m_Teleport"> 2328 <member name="F:OpenMetaverse.EstateTools.m_EstateUpdateInfoReply">
1447 <summary>The event subscribers. null if no subcribers</summary> 2329 <summary>The event subscribers. null if no subcribers</summary>
1448 </member> 2330 </member>
1449 <member name="F:OpenMetaverse.AgentManager.m_TeleportLock"> 2331 <member name="M:OpenMetaverse.EstateTools.OnEstateUpdateInfoReply(OpenMetaverse.EstateUpdateInfoReplyEventArgs)">
2332 <summary>Raises the EstateUpdateInfoReply event</summary>
2333 <param name="e">A EstateUpdateInfoReplyEventArgs object containing the
2334 data returned from the data server</param>
2335 </member>
2336 <member name="F:OpenMetaverse.EstateTools.m_EstateUpdateInfoReply_Lock">
1450 <summary>Thread sync lock object</summary> 2337 <summary>Thread sync lock object</summary>
1451 </member> 2338 </member>
1452 <member name="F:OpenMetaverse.AgentManager.m_AgentData"> 2339 <member name="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)">
1453 <summary>The event subscribers. null if no subcribers</summary> 2340 <summary>
2341 Requests estate information such as top scripts and colliders
2342 </summary>
2343 <param name="parcelLocalID"></param>
2344 <param name="reportType"></param>
2345 <param name="requestFlags"></param>
2346 <param name="filter"></param>
1454 </member> 2347 </member>
1455 <member name="F:OpenMetaverse.AgentManager.m_AgentDataLock"> 2348 <member name="M:OpenMetaverse.EstateTools.RequestInfo">
1456 <summary>Thread sync lock object</summary> 2349 <summary>Requests estate settings, including estate manager and access/ban lists</summary>
1457 </member> 2350 </member>
1458 <member name="F:OpenMetaverse.AgentManager.m_AnimationsChanged"> 2351 <member name="M:OpenMetaverse.EstateTools.RequestTopScripts">
1459 <summary>The event subscribers. null if no subcribers</summary> 2352 <summary>Requests the "Top Scripts" list for the current region</summary>
1460 </member> 2353 </member>
1461 <member name="F:OpenMetaverse.AgentManager.m_AnimationsChangedLock"> 2354 <member name="M:OpenMetaverse.EstateTools.RequestTopColliders">
1462 <summary>Thread sync lock object</summary> 2355 <summary>Requests the "Top Colliders" list for the current region</summary>
1463 </member> 2356 </member>
1464 <member name="F:OpenMetaverse.AgentManager.m_MeanCollision"> 2357 <member name="M:OpenMetaverse.EstateTools.SetTerrainVariables(System.Single,System.Single,System.Single,System.Boolean,System.Boolean,System.Single)">
1465 <summary>The event subscribers. null if no subcribers</summary> 2358 <summary>
2359 Set several estate specific configuration variables
2360 </summary>
2361 <param name="WaterHeight">The Height of the waterlevel over the entire estate. Defaults to 20</param>
2362 <param name="TerrainRaiseLimit">The maximum height change allowed above the baked terrain. Defaults to 4</param>
2363 <param name="TerrainLowerLimit">The minimum height change allowed below the baked terrain. Defaults to -4</param>
2364 <param name="UseEstateSun">true to use</param>
2365 <param name="FixedSun">if True forces the sun position to the position in SunPosition</param>
2366 <param name="SunPosition">The current position of the sun on the estate, or when FixedSun is true the static position
2367 the sun will remain. <remarks>6.0 = Sunrise, 30.0 = Sunset</remarks></param>
1466 </member> 2368 </member>
1467 <member name="F:OpenMetaverse.AgentManager.m_MeanCollisionLock"> 2369 <member name="M:OpenMetaverse.EstateTools.SimWideReturn(OpenMetaverse.UUID,OpenMetaverse.EstateTools.EstateReturnFlags,System.Boolean)">
1468 <summary>Thread sync lock object</summary> 2370 <summary>
2371 Request return of objects owned by specified avatar
2372 </summary>
2373 <param name="Target">The Agents <see cref="T:OpenMetaverse.UUID"/> owning the primitives to return</param>
2374 <param name="flag">specify the coverage and type of objects to be included in the return</param>
2375 <param name="EstateWide">true to perform return on entire estate</param>
1469 </member> 2376 </member>
1470 <member name="F:OpenMetaverse.AgentManager.m_RegionCrossed"> 2377 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessage(System.String,System.String)">
1471 <summary>The event subscribers. null if no subcribers</summary> 2378 <summary></summary>
2379 <param name="method"></param>
2380 <param name="param"></param>
1472 </member> 2381 </member>
1473 <member name="F:OpenMetaverse.AgentManager.m_RegionCrossedLock"> 2382 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessage(System.String,System.Collections.Generic.List{System.String})">
1474 <summary>Thread sync lock object</summary> 2383 <summary>
2384 Used for setting and retrieving various estate panel settings
2385 </summary>
2386 <param name="method">EstateOwnerMessage Method field</param>
2387 <param name="listParams">List of parameters to include</param>
1475 </member> 2388 </member>
1476 <member name="F:OpenMetaverse.AgentManager.m_GroupChatJoined"> 2389 <member name="M:OpenMetaverse.EstateTools.KickUser(OpenMetaverse.UUID)">
1477 <summary>The event subscribers. null if no subcribers</summary> 2390 <summary>
2391 Kick an avatar from an estate
2392 </summary>
2393 <param name="userID">Key of Agent to remove</param>
1478 </member> 2394 </member>
1479 <member name="F:OpenMetaverse.AgentManager.m_GroupChatJoinedLock"> 2395 <member name="M:OpenMetaverse.EstateTools.BanUser(OpenMetaverse.UUID,System.Boolean)">
1480 <summary>Thread sync lock object</summary> 2396 <summary>
2397 Ban an avatar from an estate</summary>
2398 <param name="userID">Key of Agent to remove</param>
2399 <param name="allEstates">Ban user from this estate and all others owned by the estate owner</param>
1481 </member> 2400 </member>
1482 <member name="F:OpenMetaverse.AgentManager.m_AlertMessage"> 2401 <member name="M:OpenMetaverse.EstateTools.UnbanUser(OpenMetaverse.UUID,System.Boolean)">
1483 <summary>The event subscribers. null if no subcribers</summary> 2402 <summary>Unban an avatar from an estate</summary>
2403 <param name="userID">Key of Agent to remove</param>
2404 /// <param name="allEstates">Unban user from this estate and all others owned by the estate owner</param>
1484 </member> 2405 </member>
1485 <member name="F:OpenMetaverse.AgentManager.m_AlertMessageLock"> 2406 <member name="M:OpenMetaverse.EstateTools.EstateMessage(System.String)">
1486 <summary>Thread sync lock object</summary> 2407 <summary>
2408 Send a message dialog to everyone in an entire estate
2409 </summary>
2410 <param name="message">Message to send all users in the estate</param>
1487 </member> 2411 </member>
1488 <member name="F:OpenMetaverse.AgentManager.m_ScriptControl"> 2412 <member name="M:OpenMetaverse.EstateTools.SimulatorMessage(System.String)">
1489 <summary>The event subscribers. null if no subcribers</summary> 2413 <summary>
2414 Send a message dialog to everyone in a simulator
2415 </summary>
2416 <param name="message">Message to send all users in the simulator</param>
1490 </member> 2417 </member>
1491 <member name="F:OpenMetaverse.AgentManager.m_ScriptControlLock"> 2418 <member name="M:OpenMetaverse.EstateTools.TeleportHomeUser(OpenMetaverse.UUID)">
1492 <summary>Thread sync lock object</summary> 2419 <summary>
2420 Send an avatar back to their home location
2421 </summary>
2422 <param name="pest">Key of avatar to send home</param>
1493 </member> 2423 </member>
1494 <member name="F:OpenMetaverse.AgentManager.m_CameraConstraint"> 2424 <member name="M:OpenMetaverse.EstateTools.RestartRegion">
1495 <summary>The event subscribers. null if no subcribers</summary> 2425 <summary>
2426 Begin the region restart process
2427 </summary>
1496 </member> 2428 </member>
1497 <member name="F:OpenMetaverse.AgentManager.m_CameraConstraintLock"> 2429 <member name="M:OpenMetaverse.EstateTools.CancelRestart">
1498 <summary>Thread sync lock object</summary> 2430 <summary>
2431 Cancels a region restart
2432 </summary>
1499 </member> 2433 </member>
1500 <member name="F:OpenMetaverse.AgentManager.m_ScriptSensorReply"> 2434 <member name="M:OpenMetaverse.EstateTools.SetRegionInfo(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Single,System.Single,System.Boolean)">
1501 <summary>The event subscribers. null if no subcribers</summary> 2435 <summary>Estate panel "Region" tab settings</summary>
1502 </member> 2436 </member>
1503 <member name="F:OpenMetaverse.AgentManager.m_ScriptSensorReplyLock"> 2437 <member name="M:OpenMetaverse.EstateTools.SetRegionDebug(System.Boolean,System.Boolean,System.Boolean)">
1504 <summary>Thread sync lock object</summary> 2438 <summary>Estate panel "Debug" tab settings</summary>
1505 </member> 2439 </member>
1506 <member name="F:OpenMetaverse.AgentManager.m_AvatarSitResponse"> 2440 <member name="M:OpenMetaverse.EstateTools.SetRegionTerrain(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
1507 <summary>The event subscribers. null if no subcribers</summary> 2441 <summary>Used for setting the region's terrain textures for its four height levels</summary>
2442 <param name="low"></param>
2443 <param name="midLow"></param>
2444 <param name="midHigh"></param>
2445 <param name="high"></param>
1508 </member> 2446 </member>
1509 <member name="F:OpenMetaverse.AgentManager.m_AvatarSitResponseLock"> 2447 <member name="M:OpenMetaverse.EstateTools.SetRegionTerrainHeights(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)">
1510 <summary>Thread sync lock object</summary> 2448 <summary>Used for setting sim terrain texture heights</summary>
1511 </member> 2449 </member>
1512 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberAdded"> 2450 <member name="M:OpenMetaverse.EstateTools.RequestCovenant">
1513 <summary>The event subscribers. null if no subcribers</summary> 2451 <summary>Requests the estate covenant</summary>
1514 </member> 2452 </member>
1515 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberAddedLock"> 2453 <member name="M:OpenMetaverse.EstateTools.UploadTerrain(System.Byte[],System.String)">
1516 <summary>Thread sync lock object</summary> 2454 <summary>
2455 Upload a terrain RAW file
2456 </summary>
2457 <param name="fileData">A byte array containing the encoded terrain data</param>
2458 <param name="fileName">The name of the file being uploaded</param>
2459 <returns>The Id of the transfer request</returns>
1517 </member> 2460 </member>
1518 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberLeft"> 2461 <member name="M:OpenMetaverse.EstateTools.TeleportHomeAllUsers">
1519 <summary>The event subscribers. null if no subcribers</summary> 2462 <summary>
2463 Teleports all users home in current Estate
2464 </summary>
1520 </member> 2465 </member>
1521 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberLeftLock"> 2466 <member name="M:OpenMetaverse.EstateTools.RemoveEstateManager(OpenMetaverse.UUID,System.Boolean)">
1522 <summary>Thread sync lock object</summary> 2467 <summary>
2468 Remove estate manager</summary>
2469 <param name="userID">Key of Agent to Remove</param>
2470 <param name="allEstates">removes manager to this estate and all others owned by the estate owner</param>
1523 </member> 2471 </member>
1524 <member name="F:OpenMetaverse.AgentManager.m_SetDisplayNameReply"> 2472 <member name="M:OpenMetaverse.EstateTools.AddEstateManager(OpenMetaverse.UUID,System.Boolean)">
1525 <summary>The event subscribers, null of no subscribers</summary> 2473 <summary>
2474 Add estate manager</summary>
2475 <param name="userID">Key of Agent to Add</param>
2476 <param name="allEstates">Add agent as manager to this estate and all others owned by the estate owner</param>
1526 </member> 2477 </member>
1527 <member name="F:OpenMetaverse.AgentManager.m_SetDisplayNameReplyLock"> 2478 <member name="M:OpenMetaverse.EstateTools.AddAllowedUser(OpenMetaverse.UUID,System.Boolean)">
1528 <summary>Thread sync lock object</summary> 2479 <summary>
2480 Add's an agent to the estate Allowed list</summary>
2481 <param name="userID">Key of Agent to Add</param>
2482 <param name="allEstates">Add agent as an allowed reisdent to All estates if true</param>
1529 </member> 2483 </member>
1530 <member name="F:OpenMetaverse.AgentManager.m_MuteListUpdated"> 2484 <member name="M:OpenMetaverse.EstateTools.RemoveAllowedUser(OpenMetaverse.UUID,System.Boolean)">
1531 <summary>The event subscribers. null if no subcribers</summary> 2485 <summary>
2486 Removes an agent from the estate Allowed list</summary>
2487 <param name="userID">Key of Agent to Remove</param>
2488 <param name="allEstates">Removes agent as an allowed reisdent from All estates if true</param>
1532 </member> 2489 </member>
1533 <member name="F:OpenMetaverse.AgentManager.m_MuteListUpdatedLock"> 2490 <member name="M:OpenMetaverse.EstateTools.AddAllowedGroup(OpenMetaverse.UUID,System.Boolean)">
1534 <summary>Thread sync lock object</summary> 2491
2492 <summary>
2493 Add's a group to the estate Allowed list</summary>
2494 <param name="groupID">Key of Group to Add</param>
2495 <param name="allEstates">Add Group as an allowed group to All estates if true</param>
1535 </member> 2496 </member>
1536 <member name="F:OpenMetaverse.AgentManager.Client"> 2497 <member name="M:OpenMetaverse.EstateTools.RemoveAllowedGroup(OpenMetaverse.UUID,System.Boolean)">
1537 <summary>Reference to the GridClient instance</summary> 2498
2499 <summary>
2500 Removes a group from the estate Allowed list</summary>
2501 <param name="groupID">Key of Group to Remove</param>
2502 <param name="allEstates">Removes Group as an allowed Group from All estates if true</param>
1538 </member> 2503 </member>
1539 <member name="F:OpenMetaverse.AgentManager.Movement"> 2504 <member name="M:OpenMetaverse.EstateTools.EstateCovenantReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1540 <summary>Used for movement and camera tracking</summary> 2505 <summary>Process an incoming packet and raise the appropriate events</summary>
2506 <param name="sender">The sender</param>
2507 <param name="e">The EventArgs object containing the packet data</param>
1541 </member> 2508 </member>
1542 <member name="F:OpenMetaverse.AgentManager.SignaledAnimations"> 2509 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessageHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1543 <summary>Currently playing animations for the agent. Can be used to 2510 <summary>Process an incoming packet and raise the appropriate events</summary>
1544 check the current movement status such as walking, hovering, aiming, 2511 <param name="sender">The sender</param>
1545 etc. by checking against system animations found in the Animations class</summary> 2512 <param name="e">The EventArgs object containing the packet data</param>
1546 </member> 2513 </member>
1547 <member name="F:OpenMetaverse.AgentManager.GroupChatSessions"> 2514 <member name="M:OpenMetaverse.EstateTools.LandStatReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
1548 <summary>Dictionary containing current Group Chat sessions and members</summary> 2515 <summary>Process an incoming packet and raise the appropriate events</summary>
2516 <param name="sender">The sender</param>
2517 <param name="e">The EventArgs object containing the packet data</param>
1549 </member> 2518 </member>
1550 <member name="F:OpenMetaverse.AgentManager.MuteList"> 2519 <member name="E:OpenMetaverse.EstateTools.TopCollidersReply">
1551 <summary>Dictionary containing mute list keyead on mute name and key</summary> 2520 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1552 </member> 2521 </member>
1553 <member name="E:OpenMetaverse.AgentManager.ChatFromSimulator"> 2522 <member name="E:OpenMetaverse.EstateTools.TopScriptsReply">
1554 <summary>Raised when a scripted object or agent within range sends a public message</summary> 2523 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1555 </member> 2524 </member>
1556 <member name="E:OpenMetaverse.AgentManager.ScriptDialog"> 2525 <member name="E:OpenMetaverse.EstateTools.EstateUsersReply">
1557 <summary>Raised when a scripted object sends a dialog box containing possible 2526 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1558 options an agent can respond to</summary>
1559 </member> 2527 </member>
1560 <member name="E:OpenMetaverse.AgentManager.ScriptQuestion"> 2528 <member name="E:OpenMetaverse.EstateTools.EstateGroupsReply">
1561 <summary>Raised when an object requests a change in the permissions an agent has permitted</summary> 2529 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1562 </member> 2530 </member>
1563 <member name="E:OpenMetaverse.AgentManager.LoadURL"> 2531 <member name="E:OpenMetaverse.EstateTools.EstateManagersReply">
1564 <summary>Raised when a script requests an agent open the specified URL</summary> 2532 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1565 </member> 2533 </member>
1566 <member name="E:OpenMetaverse.AgentManager.MoneyBalance"> 2534 <member name="E:OpenMetaverse.EstateTools.EstateBansReply">
1567 <summary>Raised when an agents currency balance is updated</summary> 2535 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1568 </member> 2536 </member>
1569 <member name="E:OpenMetaverse.AgentManager.MoneyBalanceReply"> 2537 <member name="E:OpenMetaverse.EstateTools.EstateCovenantReply">
1570 <summary>Raised when a transaction occurs involving currency such as a land purchase</summary> 2538 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1571 </member> 2539 </member>
1572 <member name="E:OpenMetaverse.AgentManager.IM"> 2540 <member name="E:OpenMetaverse.EstateTools.EstateUpdateInfoReply">
1573 <summary>Raised when an ImprovedInstantMessage packet is recieved from the simulator, this is used for everything from 2541 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"/> request.</summary>
1574 private messaging to friendship offers. The Dialog field defines what type of message has arrived</summary>
1575 </member> 2542 </member>
1576 <member name="E:OpenMetaverse.AgentManager.TeleportProgress"> 2543 <member name="T:OpenMetaverse.EstateTools.LandStatReportType">
1577 <summary>Raised when an agent has requested a teleport to another location, or when responding to a lure. Raised multiple times 2544 <summary>Used in the ReportType field of a LandStatRequest</summary>
1578 for each teleport indicating the progress of the request</summary>
1579 </member> 2545 </member>
1580 <member name="E:OpenMetaverse.AgentManager.AgentDataReply"> 2546 <member name="T:OpenMetaverse.EstateTools.EstateAccessDelta">
1581 <summary>Raised when a simulator sends agent specific information for our avatar.</summary> 2547 <summary>Used by EstateOwnerMessage packets</summary>
1582 </member> 2548 </member>
1583 <member name="E:OpenMetaverse.AgentManager.AnimationsChanged"> 2549 <member name="T:OpenMetaverse.EstateTools.EstateAccessReplyDelta">
1584 <summary>Raised when our agents animation playlist changes</summary> 2550 <summary>Used by EstateOwnerMessage packets</summary>
1585 </member> 2551 </member>
1586 <member name="E:OpenMetaverse.AgentManager.MeanCollision"> 2552 <member name="T:OpenMetaverse.EstateTools.EstateReturnFlags">
1587 <summary>Raised when an object or avatar forcefully collides with our agent</summary> 2553 <summary>
2554
2555 </summary>
1588 </member> 2556 </member>
1589 <member name="E:OpenMetaverse.AgentManager.RegionCrossed"> 2557 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.None">
1590 <summary>Raised when our agent crosses a region border into another region</summary> 2558 <summary>No flags set</summary>
1591 </member> 2559 </member>
1592 <member name="E:OpenMetaverse.AgentManager.GroupChatJoined"> 2560 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnScripted">
1593 <summary>Raised when our agent succeeds or fails to join a group chat session</summary> 2561 <summary>Only return targets scripted objects</summary>
1594 </member> 2562 </member>
1595 <member name="E:OpenMetaverse.AgentManager.AlertMessage"> 2563 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnOnOthersLand">
1596 <summary>Raised when a simulator sends an urgent message usually indication the recent failure of 2564 <summary>Only return targets objects if on others land</summary>
1597 another action we have attempted to take such as an attempt to enter a parcel where we are denied access</summary>
1598 </member> 2565 </member>
1599 <member name="E:OpenMetaverse.AgentManager.ScriptControlChange"> 2566 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnScriptedAndOnOthers">
1600 <summary>Raised when a script attempts to take or release specified controls for our agent</summary> 2567 <summary>Returns target's scripted objects and objects on other parcels</summary>
1601 </member> 2568 </member>
1602 <member name="E:OpenMetaverse.AgentManager.CameraConstraint"> 2569 <member name="T:OpenMetaverse.EstateTools.GroundTextureSettings">
1603 <summary>Raised when the simulator detects our agent is trying to view something 2570 <summary>Ground texture settings for each corner of the region</summary>
1604 beyond its limits</summary>
1605 </member> 2571 </member>
1606 <member name="E:OpenMetaverse.AgentManager.ScriptSensorReply"> 2572 <member name="T:OpenMetaverse.EstateTools.GroundTextureHeight">
1607 <summary>Raised when a script sensor reply is received from a simulator</summary> 2573 <summary>Used by GroundTextureHeightSettings</summary>
1608 </member> 2574 </member>
1609 <member name="E:OpenMetaverse.AgentManager.AvatarSitResponse"> 2575 <member name="T:OpenMetaverse.EstateTools.GroundTextureHeightSettings">
1610 <summary>Raised in response to a <see cref="M:OpenMetaverse.AgentManager.RequestSit(OpenMetaverse.UUID,OpenMetaverse.Vector3)" /> request</summary> 2576 <summary>The high and low texture thresholds for each corner of the sim</summary>
1611 </member> 2577 </member>
1612 <member name="E:OpenMetaverse.AgentManager.ChatSessionMemberAdded"> 2578 <member name="T:OpenMetaverse.TopCollidersReplyEventArgs">
1613 <summary>Raised when an avatar enters a group chat session we are participating in</summary> 2579 <summary>Raised on LandStatReply when the report type is for "top colliders"</summary>
1614 </member> 2580 </member>
1615 <member name="E:OpenMetaverse.AgentManager.ChatSessionMemberLeft"> 2581 <member name="M:OpenMetaverse.TopCollidersReplyEventArgs.#ctor(System.Int32,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.EstateTask})">
1616 <summary>Raised when an agent exits a group chat session we are participating in</summary> 2582 <summary>Construct a new instance of the TopCollidersReplyEventArgs class</summary>
2583 <param name="objectCount">The number of returned items in LandStatReply</param>
2584 <param name="tasks">Dictionary of Object UUIDs to tasks returned in LandStatReply</param>
1617 </member> 2585 </member>
1618 <member name="E:OpenMetaverse.AgentManager.SetDisplayNameReply"> 2586 <member name="P:OpenMetaverse.TopCollidersReplyEventArgs.ObjectCount">
1619 <summary>Raised when the simulator sends us data containing 2587 <summary>
1620 the details of display name change</summary> 2588 The number of returned items in LandStatReply
2589 </summary>
1621 </member> 2590 </member>
1622 <member name="E:OpenMetaverse.AgentManager.MuteListUpdated"> 2591 <member name="P:OpenMetaverse.TopCollidersReplyEventArgs.Tasks">
1623 <summary>Raised when a scripted object or agent within range sends a public message</summary> 2592 <summary>
2593 A Dictionary of Object UUIDs to tasks returned in LandStatReply
2594 </summary>
1624 </member> 2595 </member>
1625 <member name="P:OpenMetaverse.AgentManager.AgentID"> 2596 <member name="T:OpenMetaverse.TopScriptsReplyEventArgs">
1626 <summary>Your (client) avatars <see cref="T:OpenMetaverse.UUID" /></summary> 2597 <summary>Raised on LandStatReply when the report type is for "top Scripts"</summary>
1627 <remarks>"client", "agent", and "avatar" all represent the same thing</remarks>
1628 </member> 2598 </member>
1629 <member name="P:OpenMetaverse.AgentManager.SessionID"> 2599 <member name="M:OpenMetaverse.TopScriptsReplyEventArgs.#ctor(System.Int32,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.EstateTask})">
1630 <summary>Temporary <seealso cref="T:OpenMetaverse.UUID" /> assigned to this session, used for 2600 <summary>Construct a new instance of the TopScriptsReplyEventArgs class</summary>
1631 verifying our identity in packets</summary> 2601 <param name="objectCount">The number of returned items in LandStatReply</param>
2602 <param name="tasks">Dictionary of Object UUIDs to tasks returned in LandStatReply</param>
1632 </member> 2603 </member>
1633 <member name="P:OpenMetaverse.AgentManager.SecureSessionID"> 2604 <member name="P:OpenMetaverse.TopScriptsReplyEventArgs.ObjectCount">
1634 <summary>Shared secret <seealso cref="T:OpenMetaverse.UUID" /> that is never sent over the wire</summary> 2605 <summary>
2606 The number of scripts returned in LandStatReply
2607 </summary>
1635 </member> 2608 </member>
1636 <member name="P:OpenMetaverse.AgentManager.LocalID"> 2609 <member name="P:OpenMetaverse.TopScriptsReplyEventArgs.Tasks">
1637 <summary>Your (client) avatar ID, local to the current region/sim</summary> 2610 <summary>
2611 A Dictionary of Object UUIDs to tasks returned in LandStatReply
2612 </summary>
1638 </member> 2613 </member>
1639 <member name="P:OpenMetaverse.AgentManager.StartLocation"> 2614 <member name="T:OpenMetaverse.EstateBansReplyEventArgs">
1640 <summary>Where the avatar started at login. Can be "last", "home" 2615 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
1641 or a login <seealso cref="T:OpenMetaverse.URI" /></summary>
1642 </member> 2616 </member>
1643 <member name="P:OpenMetaverse.AgentManager.AgentAccess"> 2617 <member name="M:OpenMetaverse.EstateBansReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
1644 <summary>The access level of this agent, usually M or PG</summary> 2618 <summary>Construct a new instance of the EstateBansReplyEventArgs class</summary>
2619 <param name="estateID">The estate's identifier on the grid</param>
2620 <param name="count">The number of returned items in LandStatReply</param>
2621 <param name="banned">User UUIDs banned</param>
1645 </member> 2622 </member>
1646 <member name="P:OpenMetaverse.AgentManager.CollisionPlane"> 2623 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.EstateID">
1647 <summary>The CollisionPlane of Agent</summary> 2624 <summary>
2625 The identifier of the estate
2626 </summary>
1648 </member> 2627 </member>
1649 <member name="P:OpenMetaverse.AgentManager.Velocity"> 2628 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.Count">
1650 <summary>An <seealso cref="T:OpenMetaverse.Vector3" /> representing the velocity of our agent</summary> 2629 <summary>
2630 The number of returned itmes
2631 </summary>
1651 </member> 2632 </member>
1652 <member name="P:OpenMetaverse.AgentManager.Acceleration"> 2633 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.Banned">
1653 <summary>An <seealso cref="T:OpenMetaverse.Vector3" /> representing the acceleration of our agent</summary> 2634 <summary>
2635 List of UUIDs of Banned Users
2636 </summary>
1654 </member> 2637 </member>
1655 <member name="P:OpenMetaverse.AgentManager.AngularVelocity"> 2638 <member name="T:OpenMetaverse.EstateUsersReplyEventArgs">
1656 <summary>A <seealso cref="T:OpenMetaverse.Vector3" /> which specifies the angular speed, and axis about which an Avatar is rotating.</summary> 2639 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
1657 </member> 2640 </member>
1658 <member name="P:OpenMetaverse.AgentManager.HomePosition"> 2641 <member name="M:OpenMetaverse.EstateUsersReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
1659 <summary>Position avatar client will goto when login to 'home' or during 2642 <summary>Construct a new instance of the EstateUsersReplyEventArgs class</summary>
1660 teleport request to 'home' region.</summary> 2643 <param name="estateID">The estate's identifier on the grid</param>
2644 <param name="count">The number of users</param>
2645 <param name="allowedUsers">Allowed users UUIDs</param>
1661 </member> 2646 </member>
1662 <member name="P:OpenMetaverse.AgentManager.HomeLookAt"> 2647 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.EstateID">
1663 <summary>LookAt point saved/restored with HomePosition</summary> 2648 <summary>
2649 The identifier of the estate
2650 </summary>
1664 </member> 2651 </member>
1665 <member name="P:OpenMetaverse.AgentManager.FirstName"> 2652 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.Count">
1666 <summary>Avatar First Name (i.e. Philip)</summary> 2653 <summary>
2654 The number of returned items
2655 </summary>
1667 </member> 2656 </member>
1668 <member name="P:OpenMetaverse.AgentManager.LastName"> 2657 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.AllowedUsers">
1669 <summary>Avatar Last Name (i.e. Linden)</summary> 2658 <summary>
2659 List of UUIDs of Allowed Users
2660 </summary>
1670 </member> 2661 </member>
1671 <member name="P:OpenMetaverse.AgentManager.Name"> 2662 <member name="T:OpenMetaverse.EstateGroupsReplyEventArgs">
1672 <summary>Avatar Full Name (i.e. Philip Linden)</summary> 2663 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
1673 </member> 2664 </member>
1674 <member name="P:OpenMetaverse.AgentManager.Health"> 2665 <member name="M:OpenMetaverse.EstateGroupsReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
1675 <summary>Gets the health of the agent</summary> 2666 <summary>Construct a new instance of the EstateGroupsReplyEventArgs class</summary>
2667 <param name="estateID">The estate's identifier on the grid</param>
2668 <param name="count">The number of Groups</param>
2669 <param name="allowedGroups">Allowed Groups UUIDs</param>
1676 </member> 2670 </member>
1677 <member name="P:OpenMetaverse.AgentManager.Balance"> 2671 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.EstateID">
1678 <summary>Gets the current balance of the agent</summary> 2672 <summary>
2673 The identifier of the estate
2674 </summary>
1679 </member> 2675 </member>
1680 <member name="P:OpenMetaverse.AgentManager.SittingOn"> 2676 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.Count">
1681 <summary>Gets the local ID of the prim the agent is sitting on, 2677 <summary>
1682 zero if the avatar is not currently sitting</summary> 2678 The number of returned items
2679 </summary>
1683 </member> 2680 </member>
1684 <member name="P:OpenMetaverse.AgentManager.ActiveGroup"> 2681 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.AllowedGroups">
1685 <summary>Gets the <seealso cref="T:OpenMetaverse.UUID" /> of the agents active group.</summary> 2682 <summary>
2683 List of UUIDs of Allowed Groups
2684 </summary>
1686 </member> 2685 </member>
1687 <member name="P:OpenMetaverse.AgentManager.ActiveGroupPowers"> 2686 <member name="T:OpenMetaverse.EstateManagersReplyEventArgs">
1688 <summary>Gets the Agents powers in the currently active group</summary> 2687 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
1689 </member> 2688 </member>
1690 <member name="P:OpenMetaverse.AgentManager.TeleportMessage"> 2689 <member name="M:OpenMetaverse.EstateManagersReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
1691 <summary>Current status message for teleporting</summary> 2690 <summary>Construct a new instance of the EstateManagersReplyEventArgs class</summary>
2691 <param name="estateID">The estate's identifier on the grid</param>
2692 <param name="count">The number of Managers</param>
2693 <param name="managers"> Managers UUIDs</param>
1692 </member> 2694 </member>
1693 <member name="P:OpenMetaverse.AgentManager.RelativePosition"> 2695 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.EstateID">
1694 <summary>Current position of the agent as a relative offset from 2696 <summary>
1695 the simulator, or the parent object if we are sitting on something</summary> 2697 The identifier of the estate
2698 </summary>
1696 </member> 2699 </member>
1697 <member name="P:OpenMetaverse.AgentManager.RelativeRotation"> 2700 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.Count">
1698 <summary>Current rotation of the agent as a relative rotation from 2701 <summary>
1699 the simulator, or the parent object if we are sitting on something</summary> 2702 The number of returned items
2703 </summary>
1700 </member> 2704 </member>
1701 <member name="P:OpenMetaverse.AgentManager.SimPosition"> 2705 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.Managers">
1702 <summary>Current position of the agent in the simulator</summary> 2706 <summary>
2707 List of UUIDs of the Estate's Managers
2708 </summary>
1703 </member> 2709 </member>
1704 <member name="P:OpenMetaverse.AgentManager.SimRotation"> 2710 <member name="T:OpenMetaverse.EstateCovenantReplyEventArgs">
2711 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
2712 </member>
2713 <member name="M:OpenMetaverse.EstateCovenantReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Int64,System.String,OpenMetaverse.UUID)">
2714 <summary>Construct a new instance of the EstateCovenantReplyEventArgs class</summary>
2715 <param name="covenantID">The Covenant ID</param>
2716 <param name="timestamp">The timestamp</param>
2717 <param name="estateName">The estate's name</param>
2718 <param name="estateOwnerID">The Estate Owner's ID (can be a GroupID)</param>
2719 </member>
2720 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.CovenantID">
1705 <summary> 2721 <summary>
1706 A <seealso cref="T:OpenMetaverse.Quaternion" /> representing the agents current rotation 2722 The Covenant
1707 </summary> 2723 </summary>
1708 </member> 2724 </member>
1709 <member name="P:OpenMetaverse.AgentManager.GlobalPosition"> 2725 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.Timestamp">
1710 <summary>Returns the global grid position of the avatar</summary> 2726 <summary>
2727 The timestamp
2728 </summary>
2729 </member>
2730 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.EstateName">
2731 <summary>
2732 The Estate name
2733 </summary>
2734 </member>
2735 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.EstateOwnerID">
2736 <summary>
2737 The Estate Owner's ID (can be a GroupID)
2738 </summary>
2739 </member>
2740 <member name="T:OpenMetaverse.EstateUpdateInfoReplyEventArgs">
2741 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
2742 </member>
2743 <member name="M:OpenMetaverse.EstateUpdateInfoReplyEventArgs.#ctor(System.String,OpenMetaverse.UUID,System.UInt32,System.Boolean)">
2744 <summary>Construct a new instance of the EstateUpdateInfoReplyEventArgs class</summary>
2745 <param name="estateName">The estate's name</param>
2746 <param name="estateOwner">The Estate Owners ID (can be a GroupID)</param>
2747 <param name="estateID">The estate's identifier on the grid</param>
2748 <param name="denyNoPaymentInfo"></param>
2749 </member>
2750 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateName">
2751 <summary>
2752 The estate's name
2753 </summary>
2754 </member>
2755 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateOwner">
2756 <summary>
2757 The Estate Owner's ID (can be a GroupID)
2758 </summary>
2759 </member>
2760 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateID">
2761 <summary>
2762 The identifier of the estate on the grid
2763 </summary>
2764 </member>
2765 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.DenyNoPaymentInfo">
2766 <summary></summary>
2767 </member>
2768 <member name="T:OpenMetaverse.AgentManager">
2769 <summary>
2770 Manager class for our own avatar
2771 </summary>
2772 </member>
2773 <member name="F:OpenMetaverse.AgentManager.m_Chat">
2774 <summary>The event subscribers. null if no subcribers</summary>
1711 </member> 2775 </member>
1712 <member name="M:OpenMetaverse.AgentManager.OnChat(OpenMetaverse.ChatEventArgs)"> 2776 <member name="M:OpenMetaverse.AgentManager.OnChat(OpenMetaverse.ChatEventArgs)">
1713 <summary>Raises the ChatFromSimulator event</summary> 2777 <summary>Raises the ChatFromSimulator event</summary>
1714 <param name="e">A ChatEventArgs object containing the 2778 <param name="e">A ChatEventArgs object containing the
1715 data returned from the data server</param> 2779 data returned from the data server</param>
1716 </member> 2780 </member>
2781 <member name="F:OpenMetaverse.AgentManager.m_ChatLock">
2782 <summary>Thread sync lock object</summary>
2783 </member>
2784 <member name="F:OpenMetaverse.AgentManager.m_ScriptDialog">
2785 <summary>The event subscribers. null if no subcribers</summary>
2786 </member>
1717 <member name="M:OpenMetaverse.AgentManager.OnScriptDialog(OpenMetaverse.ScriptDialogEventArgs)"> 2787 <member name="M:OpenMetaverse.AgentManager.OnScriptDialog(OpenMetaverse.ScriptDialogEventArgs)">
1718 <summary>Raises the ScriptDialog event</summary> 2788 <summary>Raises the ScriptDialog event</summary>
1719 <param name="e">A SctriptDialogEventArgs object containing the 2789 <param name="e">A SctriptDialogEventArgs object containing the
1720 data returned from the data server</param> 2790 data returned from the data server</param>
1721 </member> 2791 </member>
2792 <member name="F:OpenMetaverse.AgentManager.m_ScriptDialogLock">
2793 <summary>Thread sync lock object</summary>
2794 </member>
2795 <member name="F:OpenMetaverse.AgentManager.m_ScriptQuestion">
2796 <summary>The event subscribers. null if no subcribers</summary>
2797 </member>
1722 <member name="M:OpenMetaverse.AgentManager.OnScriptQuestion(OpenMetaverse.ScriptQuestionEventArgs)"> 2798 <member name="M:OpenMetaverse.AgentManager.OnScriptQuestion(OpenMetaverse.ScriptQuestionEventArgs)">
1723 <summary>Raises the ScriptQuestion event</summary> 2799 <summary>Raises the ScriptQuestion event</summary>
1724 <param name="e">A ScriptQuestionEventArgs object containing the 2800 <param name="e">A ScriptQuestionEventArgs object containing the
1725 data returned from the data server</param> 2801 data returned from the data server</param>
1726 </member> 2802 </member>
2803 <member name="F:OpenMetaverse.AgentManager.m_ScriptQuestionLock">
2804 <summary>Thread sync lock object</summary>
2805 </member>
2806 <member name="F:OpenMetaverse.AgentManager.m_LoadURL">
2807 <summary>The event subscribers. null if no subcribers</summary>
2808 </member>
1727 <member name="M:OpenMetaverse.AgentManager.OnLoadURL(OpenMetaverse.LoadUrlEventArgs)"> 2809 <member name="M:OpenMetaverse.AgentManager.OnLoadURL(OpenMetaverse.LoadUrlEventArgs)">
1728 <summary>Raises the LoadURL event</summary> 2810 <summary>Raises the LoadURL event</summary>
1729 <param name="e">A LoadUrlEventArgs object containing the 2811 <param name="e">A LoadUrlEventArgs object containing the
1730 data returned from the data server</param> 2812 data returned from the data server</param>
1731 </member> 2813 </member>
2814 <member name="F:OpenMetaverse.AgentManager.m_LoadUrlLock">
2815 <summary>Thread sync lock object</summary>
2816 </member>
2817 <member name="F:OpenMetaverse.AgentManager.m_Balance">
2818 <summary>The event subscribers. null if no subcribers</summary>
2819 </member>
1732 <member name="M:OpenMetaverse.AgentManager.OnBalance(OpenMetaverse.BalanceEventArgs)"> 2820 <member name="M:OpenMetaverse.AgentManager.OnBalance(OpenMetaverse.BalanceEventArgs)">
1733 <summary>Raises the MoneyBalance event</summary> 2821 <summary>Raises the MoneyBalance event</summary>
1734 <param name="e">A BalanceEventArgs object containing the 2822 <param name="e">A BalanceEventArgs object containing the
1735 data returned from the data server</param> 2823 data returned from the data server</param>
1736 </member> 2824 </member>
2825 <member name="F:OpenMetaverse.AgentManager.m_BalanceLock">
2826 <summary>Thread sync lock object</summary>
2827 </member>
2828 <member name="F:OpenMetaverse.AgentManager.m_MoneyBalance">
2829 <summary>The event subscribers. null if no subcribers</summary>
2830 </member>
1737 <member name="M:OpenMetaverse.AgentManager.OnMoneyBalanceReply(OpenMetaverse.MoneyBalanceReplyEventArgs)"> 2831 <member name="M:OpenMetaverse.AgentManager.OnMoneyBalanceReply(OpenMetaverse.MoneyBalanceReplyEventArgs)">
1738 <summary>Raises the MoneyBalanceReply event</summary> 2832 <summary>Raises the MoneyBalanceReply event</summary>
1739 <param name="e">A MoneyBalanceReplyEventArgs object containing the 2833 <param name="e">A MoneyBalanceReplyEventArgs object containing the
1740 data returned from the data server</param> 2834 data returned from the data server</param>
1741 </member> 2835 </member>
2836 <member name="F:OpenMetaverse.AgentManager.m_MoneyBalanceReplyLock">
2837 <summary>Thread sync lock object</summary>
2838 </member>
2839 <member name="F:OpenMetaverse.AgentManager.m_InstantMessage">
2840 <summary>The event subscribers. null if no subcribers</summary>
2841 </member>
1742 <member name="M:OpenMetaverse.AgentManager.OnInstantMessage(OpenMetaverse.InstantMessageEventArgs)"> 2842 <member name="M:OpenMetaverse.AgentManager.OnInstantMessage(OpenMetaverse.InstantMessageEventArgs)">
1743 <summary>Raises the IM event</summary> 2843 <summary>Raises the IM event</summary>
1744 <param name="e">A InstantMessageEventArgs object containing the 2844 <param name="e">A InstantMessageEventArgs object containing the
1745 data returned from the data server</param> 2845 data returned from the data server</param>
1746 </member> 2846 </member>
2847 <member name="F:OpenMetaverse.AgentManager.m_InstantMessageLock">
2848 <summary>Thread sync lock object</summary>
2849 </member>
2850 <member name="F:OpenMetaverse.AgentManager.m_Teleport">
2851 <summary>The event subscribers. null if no subcribers</summary>
2852 </member>
1747 <member name="M:OpenMetaverse.AgentManager.OnTeleport(OpenMetaverse.TeleportEventArgs)"> 2853 <member name="M:OpenMetaverse.AgentManager.OnTeleport(OpenMetaverse.TeleportEventArgs)">
1748 <summary>Raises the TeleportProgress event</summary> 2854 <summary>Raises the TeleportProgress event</summary>
1749 <param name="e">A TeleportEventArgs object containing the 2855 <param name="e">A TeleportEventArgs object containing the
1750 data returned from the data server</param> 2856 data returned from the data server</param>
1751 </member> 2857 </member>
2858 <member name="F:OpenMetaverse.AgentManager.m_TeleportLock">
2859 <summary>Thread sync lock object</summary>
2860 </member>
2861 <member name="F:OpenMetaverse.AgentManager.m_AgentData">
2862 <summary>The event subscribers. null if no subcribers</summary>
2863 </member>
1752 <member name="M:OpenMetaverse.AgentManager.OnAgentData(OpenMetaverse.AgentDataReplyEventArgs)"> 2864 <member name="M:OpenMetaverse.AgentManager.OnAgentData(OpenMetaverse.AgentDataReplyEventArgs)">
1753 <summary>Raises the AgentDataReply event</summary> 2865 <summary>Raises the AgentDataReply event</summary>
1754 <param name="e">A AgentDataReplyEventArgs object containing the 2866 <param name="e">A AgentDataReplyEventArgs object containing the
1755 data returned from the data server</param> 2867 data returned from the data server</param>
1756 </member> 2868 </member>
2869 <member name="F:OpenMetaverse.AgentManager.m_AgentDataLock">
2870 <summary>Thread sync lock object</summary>
2871 </member>
2872 <member name="F:OpenMetaverse.AgentManager.m_AnimationsChanged">
2873 <summary>The event subscribers. null if no subcribers</summary>
2874 </member>
1757 <member name="M:OpenMetaverse.AgentManager.OnAnimationsChanged(OpenMetaverse.AnimationsChangedEventArgs)"> 2875 <member name="M:OpenMetaverse.AgentManager.OnAnimationsChanged(OpenMetaverse.AnimationsChangedEventArgs)">
1758 <summary>Raises the AnimationsChanged event</summary> 2876 <summary>Raises the AnimationsChanged event</summary>
1759 <param name="e">A AnimationsChangedEventArgs object containing the 2877 <param name="e">A AnimationsChangedEventArgs object containing the
1760 data returned from the data server</param> 2878 data returned from the data server</param>
1761 </member> 2879 </member>
2880 <member name="F:OpenMetaverse.AgentManager.m_AnimationsChangedLock">
2881 <summary>Thread sync lock object</summary>
2882 </member>
2883 <member name="F:OpenMetaverse.AgentManager.m_MeanCollision">
2884 <summary>The event subscribers. null if no subcribers</summary>
2885 </member>
1762 <member name="M:OpenMetaverse.AgentManager.OnMeanCollision(OpenMetaverse.MeanCollisionEventArgs)"> 2886 <member name="M:OpenMetaverse.AgentManager.OnMeanCollision(OpenMetaverse.MeanCollisionEventArgs)">
1763 <summary>Raises the MeanCollision event</summary> 2887 <summary>Raises the MeanCollision event</summary>
1764 <param name="e">A MeanCollisionEventArgs object containing the 2888 <param name="e">A MeanCollisionEventArgs object containing the
1765 data returned from the data server</param> 2889 data returned from the data server</param>
1766 </member> 2890 </member>
2891 <member name="F:OpenMetaverse.AgentManager.m_MeanCollisionLock">
2892 <summary>Thread sync lock object</summary>
2893 </member>
2894 <member name="F:OpenMetaverse.AgentManager.m_RegionCrossed">
2895 <summary>The event subscribers. null if no subcribers</summary>
2896 </member>
1767 <member name="M:OpenMetaverse.AgentManager.OnRegionCrossed(OpenMetaverse.RegionCrossedEventArgs)"> 2897 <member name="M:OpenMetaverse.AgentManager.OnRegionCrossed(OpenMetaverse.RegionCrossedEventArgs)">
1768 <summary>Raises the RegionCrossed event</summary> 2898 <summary>Raises the RegionCrossed event</summary>
1769 <param name="e">A RegionCrossedEventArgs object containing the 2899 <param name="e">A RegionCrossedEventArgs object containing the
1770 data returned from the data server</param> 2900 data returned from the data server</param>
1771 </member> 2901 </member>
2902 <member name="F:OpenMetaverse.AgentManager.m_RegionCrossedLock">
2903 <summary>Thread sync lock object</summary>
2904 </member>
2905 <member name="F:OpenMetaverse.AgentManager.m_GroupChatJoined">
2906 <summary>The event subscribers. null if no subcribers</summary>
2907 </member>
1772 <member name="M:OpenMetaverse.AgentManager.OnGroupChatJoined(OpenMetaverse.GroupChatJoinedEventArgs)"> 2908 <member name="M:OpenMetaverse.AgentManager.OnGroupChatJoined(OpenMetaverse.GroupChatJoinedEventArgs)">
1773 <summary>Raises the GroupChatJoined event</summary> 2909 <summary>Raises the GroupChatJoined event</summary>
1774 <param name="e">A GroupChatJoinedEventArgs object containing the 2910 <param name="e">A GroupChatJoinedEventArgs object containing the
1775 data returned from the data server</param> 2911 data returned from the data server</param>
1776 </member> 2912 </member>
2913 <member name="F:OpenMetaverse.AgentManager.m_GroupChatJoinedLock">
2914 <summary>Thread sync lock object</summary>
2915 </member>
2916 <member name="F:OpenMetaverse.AgentManager.m_AlertMessage">
2917 <summary>The event subscribers. null if no subcribers</summary>
2918 </member>
1777 <member name="M:OpenMetaverse.AgentManager.OnAlertMessage(OpenMetaverse.AlertMessageEventArgs)"> 2919 <member name="M:OpenMetaverse.AgentManager.OnAlertMessage(OpenMetaverse.AlertMessageEventArgs)">
1778 <summary>Raises the AlertMessage event</summary> 2920 <summary>Raises the AlertMessage event</summary>
1779 <param name="e">A AlertMessageEventArgs object containing the 2921 <param name="e">A AlertMessageEventArgs object containing the
1780 data returned from the data server</param> 2922 data returned from the data server</param>
1781 </member> 2923 </member>
2924 <member name="F:OpenMetaverse.AgentManager.m_AlertMessageLock">
2925 <summary>Thread sync lock object</summary>
2926 </member>
2927 <member name="F:OpenMetaverse.AgentManager.m_ScriptControl">
2928 <summary>The event subscribers. null if no subcribers</summary>
2929 </member>
1782 <member name="M:OpenMetaverse.AgentManager.OnScriptControlChange(OpenMetaverse.ScriptControlEventArgs)"> 2930 <member name="M:OpenMetaverse.AgentManager.OnScriptControlChange(OpenMetaverse.ScriptControlEventArgs)">
1783 <summary>Raises the ScriptControlChange event</summary> 2931 <summary>Raises the ScriptControlChange event</summary>
1784 <param name="e">A ScriptControlEventArgs object containing the 2932 <param name="e">A ScriptControlEventArgs object containing the
1785 data returned from the data server</param> 2933 data returned from the data server</param>
1786 </member> 2934 </member>
2935 <member name="F:OpenMetaverse.AgentManager.m_ScriptControlLock">
2936 <summary>Thread sync lock object</summary>
2937 </member>
2938 <member name="F:OpenMetaverse.AgentManager.m_CameraConstraint">
2939 <summary>The event subscribers. null if no subcribers</summary>
2940 </member>
1787 <member name="M:OpenMetaverse.AgentManager.OnCameraConstraint(OpenMetaverse.CameraConstraintEventArgs)"> 2941 <member name="M:OpenMetaverse.AgentManager.OnCameraConstraint(OpenMetaverse.CameraConstraintEventArgs)">
1788 <summary>Raises the CameraConstraint event</summary> 2942 <summary>Raises the CameraConstraint event</summary>
1789 <param name="e">A CameraConstraintEventArgs object containing the 2943 <param name="e">A CameraConstraintEventArgs object containing the
1790 data returned from the data server</param> 2944 data returned from the data server</param>
1791 </member> 2945 </member>
2946 <member name="F:OpenMetaverse.AgentManager.m_CameraConstraintLock">
2947 <summary>Thread sync lock object</summary>
2948 </member>
2949 <member name="F:OpenMetaverse.AgentManager.m_ScriptSensorReply">
2950 <summary>The event subscribers. null if no subcribers</summary>
2951 </member>
1792 <member name="M:OpenMetaverse.AgentManager.OnScriptSensorReply(OpenMetaverse.ScriptSensorReplyEventArgs)"> 2952 <member name="M:OpenMetaverse.AgentManager.OnScriptSensorReply(OpenMetaverse.ScriptSensorReplyEventArgs)">
1793 <summary>Raises the ScriptSensorReply event</summary> 2953 <summary>Raises the ScriptSensorReply event</summary>
1794 <param name="e">A ScriptSensorReplyEventArgs object containing the 2954 <param name="e">A ScriptSensorReplyEventArgs object containing the
1795 data returned from the data server</param> 2955 data returned from the data server</param>
1796 </member> 2956 </member>
2957 <member name="F:OpenMetaverse.AgentManager.m_ScriptSensorReplyLock">
2958 <summary>Thread sync lock object</summary>
2959 </member>
2960 <member name="F:OpenMetaverse.AgentManager.m_AvatarSitResponse">
2961 <summary>The event subscribers. null if no subcribers</summary>
2962 </member>
1797 <member name="M:OpenMetaverse.AgentManager.OnAvatarSitResponse(OpenMetaverse.AvatarSitResponseEventArgs)"> 2963 <member name="M:OpenMetaverse.AgentManager.OnAvatarSitResponse(OpenMetaverse.AvatarSitResponseEventArgs)">
1798 <summary>Raises the AvatarSitResponse event</summary> 2964 <summary>Raises the AvatarSitResponse event</summary>
1799 <param name="e">A AvatarSitResponseEventArgs object containing the 2965 <param name="e">A AvatarSitResponseEventArgs object containing the
1800 data returned from the data server</param> 2966 data returned from the data server</param>
1801 </member> 2967 </member>
2968 <member name="F:OpenMetaverse.AgentManager.m_AvatarSitResponseLock">
2969 <summary>Thread sync lock object</summary>
2970 </member>
2971 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberAdded">
2972 <summary>The event subscribers. null if no subcribers</summary>
2973 </member>
1802 <member name="M:OpenMetaverse.AgentManager.OnChatSessionMemberAdded(OpenMetaverse.ChatSessionMemberAddedEventArgs)"> 2974 <member name="M:OpenMetaverse.AgentManager.OnChatSessionMemberAdded(OpenMetaverse.ChatSessionMemberAddedEventArgs)">
1803 <summary>Raises the ChatSessionMemberAdded event</summary> 2975 <summary>Raises the ChatSessionMemberAdded event</summary>
1804 <param name="e">A ChatSessionMemberAddedEventArgs object containing the 2976 <param name="e">A ChatSessionMemberAddedEventArgs object containing the
1805 data returned from the data server</param> 2977 data returned from the data server</param>
1806 </member> 2978 </member>
2979 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberAddedLock">
2980 <summary>Thread sync lock object</summary>
2981 </member>
2982 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberLeft">
2983 <summary>The event subscribers. null if no subcribers</summary>
2984 </member>
1807 <member name="M:OpenMetaverse.AgentManager.OnChatSessionMemberLeft(OpenMetaverse.ChatSessionMemberLeftEventArgs)"> 2985 <member name="M:OpenMetaverse.AgentManager.OnChatSessionMemberLeft(OpenMetaverse.ChatSessionMemberLeftEventArgs)">
1808 <summary>Raises the ChatSessionMemberLeft event</summary> 2986 <summary>Raises the ChatSessionMemberLeft event</summary>
1809 <param name="e">A ChatSessionMemberLeftEventArgs object containing the 2987 <param name="e">A ChatSessionMemberLeftEventArgs object containing the
1810 data returned from the data server</param> 2988 data returned from the data server</param>
1811 </member> 2989 </member>
2990 <member name="F:OpenMetaverse.AgentManager.m_ChatSessionMemberLeftLock">
2991 <summary>Thread sync lock object</summary>
2992 </member>
2993 <member name="F:OpenMetaverse.AgentManager.m_SetDisplayNameReply">
2994 <summary>The event subscribers, null of no subscribers</summary>
2995 </member>
1812 <member name="M:OpenMetaverse.AgentManager.OnSetDisplayNameReply(OpenMetaverse.SetDisplayNameReplyEventArgs)"> 2996 <member name="M:OpenMetaverse.AgentManager.OnSetDisplayNameReply(OpenMetaverse.SetDisplayNameReplyEventArgs)">
1813 <summary>Raises the SetDisplayNameReply Event</summary> 2997 <summary>Raises the SetDisplayNameReply Event</summary>
1814 <param name="e">A SetDisplayNameReplyEventArgs object containing 2998 <param name="e">A SetDisplayNameReplyEventArgs object containing
1815 the data sent from the simulator</param> 2999 the data sent from the simulator</param>
3000 </member>
3001 <member name="F:OpenMetaverse.AgentManager.m_SetDisplayNameReplyLock">
3002 <summary>Thread sync lock object</summary>
3003 </member>
3004 <member name="F:OpenMetaverse.AgentManager.m_MuteListUpdated">
3005 <summary>The event subscribers. null if no subcribers</summary>
1816 </member> 3006 </member>
1817 <member name="M:OpenMetaverse.AgentManager.OnMuteListUpdated(System.EventArgs)"> 3007 <member name="M:OpenMetaverse.AgentManager.OnMuteListUpdated(System.EventArgs)">
1818 <summary>Raises the MuteListUpdated event</summary> 3008 <summary>Raises the MuteListUpdated event</summary>
1819 <param name="e">A EventArgs object containing the 3009 <param name="e">A EventArgs object containing the
1820 data returned from the data server</param> 3010 data returned from the data server</param>
1821 </member> 3011 </member>
3012 <member name="F:OpenMetaverse.AgentManager.m_MuteListUpdatedLock">
3013 <summary>Thread sync lock object</summary>
3014 </member>
3015 <member name="F:OpenMetaverse.AgentManager.Client">
3016 <summary>Reference to the GridClient instance</summary>
3017 </member>
3018 <member name="F:OpenMetaverse.AgentManager.Movement">
3019 <summary>Used for movement and camera tracking</summary>
3020 </member>
3021 <member name="F:OpenMetaverse.AgentManager.SignaledAnimations">
3022 <summary>Currently playing animations for the agent. Can be used to
3023 check the current movement status such as walking, hovering, aiming,
3024 etc. by checking against system animations found in the Animations class</summary>
3025 </member>
3026 <member name="F:OpenMetaverse.AgentManager.GroupChatSessions">
3027 <summary>Dictionary containing current Group Chat sessions and members</summary>
3028 </member>
3029 <member name="F:OpenMetaverse.AgentManager.MuteList">
3030 <summary>Dictionary containing mute list keyead on mute name and key</summary>
3031 </member>
3032 <member name="F:OpenMetaverse.AgentManager.AgentStateStatus">
3033 <summary>Various abilities and preferences sent by the grid</summary>
3034 </member>
3035 <member name="M:OpenMetaverse.AgentManager.#ctor(OpenMetaverse.GridClient)">
3036 <summary>
3037 Constructor, setup callbacks for packets related to our avatar
3038 </summary>
3039 <param name="client">A reference to the <seealso cref="T:OpenMetaverse.GridClient"/> Class</param>
3040 </member>
1822 <member name="M:OpenMetaverse.AgentManager.Chat(System.String,System.Int32,OpenMetaverse.ChatType)"> 3041 <member name="M:OpenMetaverse.AgentManager.Chat(System.String,System.Int32,OpenMetaverse.ChatType)">
1823 <summary> 3042 <summary>
1824 Send a text message from the Agent to the Simulator 3043 Send a text message from the Agent to the Simulator
1825 </summary> 3044 </summary>
1826 <param name="message">A <see cref="T:System.String" /> containing the message</param> 3045 <param name="message">A <see cref="T:System.String"/> containing the message</param>
1827 <param name="channel">The channel to send the message on, 0 is the public channel. Channels above 0 3046 <param name="channel">The channel to send the message on, 0 is the public channel. Channels above 0
1828 can be used however only scripts listening on the specified channel will see the message</param> 3047 can be used however only scripts listening on the specified channel will see the message</param>
1829 <param name="type">Denotes the type of message being sent, shout, whisper, etc.</param> 3048 <param name="type">Denotes the type of message being sent, shout, whisper, etc.</param>
@@ -1837,15 +3056,15 @@
1837 <summary> 3056 <summary>
1838 Send an Instant Message to another Avatar 3057 Send an Instant Message to another Avatar
1839 </summary> 3058 </summary>
1840 <param name="target">The recipients <see cref="T:OpenMetaverse.UUID" /></param> 3059 <param name="target">The recipients <see cref="T:OpenMetaverse.UUID"/></param>
1841 <param name="message">A <see cref="T:System.String" /> containing the message to send</param> 3060 <param name="message">A <see cref="T:System.String"/> containing the message to send</param>
1842 </member> 3061 </member>
1843 <member name="M:OpenMetaverse.AgentManager.InstantMessage(OpenMetaverse.UUID,System.String,OpenMetaverse.UUID)"> 3062 <member name="M:OpenMetaverse.AgentManager.InstantMessage(OpenMetaverse.UUID,System.String,OpenMetaverse.UUID)">
1844 <summary> 3063 <summary>
1845 Send an Instant Message to an existing group chat or conference chat 3064 Send an Instant Message to an existing group chat or conference chat
1846 </summary> 3065 </summary>
1847 <param name="target">The recipients <see cref="T:OpenMetaverse.UUID" /></param> 3066 <param name="target">The recipients <see cref="T:OpenMetaverse.UUID"/></param>
1848 <param name="message">A <see cref="T:System.String" /> containing the message to send</param> 3067 <param name="message">A <see cref="T:System.String"/> containing the message to send</param>
1849 <param name="imSessionID">IM session ID (to differentiate between IM windows)</param> 3068 <param name="imSessionID">IM session ID (to differentiate between IM windows)</param>
1850 </member> 3069 </member>
1851 <member name="M:OpenMetaverse.AgentManager.InstantMessage(System.String,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID[])"> 3070 <member name="M:OpenMetaverse.AgentManager.InstantMessage(System.String,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID[])">
@@ -1877,8 +3096,7 @@
1877 <summary> 3096 <summary>
1878 Send an Instant Message to a group 3097 Send an Instant Message to a group
1879 </summary> 3098 </summary>
1880 <param name="groupID"> 3099 <param name="groupID"><seealso cref="T:OpenMetaverse.UUID"/> of the group to send message to</param>
1881 <seealso cref="T:OpenMetaverse.UUID" /> of the group to send message to</param>
1882 <param name="message">Text Message being sent.</param> 3100 <param name="message">Text Message being sent.</param>
1883 </member> 3101 </member>
1884 <member name="M:OpenMetaverse.AgentManager.InstantMessageGroup(System.String,OpenMetaverse.UUID,System.String)"> 3102 <member name="M:OpenMetaverse.AgentManager.InstantMessageGroup(System.String,OpenMetaverse.UUID,System.String)">
@@ -1886,96 +3104,84 @@
1886 Send an Instant Message to a group the agent is a member of 3104 Send an Instant Message to a group the agent is a member of
1887 </summary> 3105 </summary>
1888 <param name="fromName">The name this IM will show up as being from</param> 3106 <param name="fromName">The name this IM will show up as being from</param>
1889 <param name="groupID"> 3107 <param name="groupID"><seealso cref="T:OpenMetaverse.UUID"/> of the group to send message to</param>
1890 <seealso cref="T:OpenMetaverse.UUID" /> of the group to send message to</param>
1891 <param name="message">Text message being sent</param> 3108 <param name="message">Text message being sent</param>
1892 </member> 3109 </member>
1893 <member name="M:OpenMetaverse.AgentManager.RequestJoinGroupChat(OpenMetaverse.UUID)"> 3110 <member name="M:OpenMetaverse.AgentManager.RequestJoinGroupChat(OpenMetaverse.UUID)">
1894 <summary> 3111 <summary>
1895 Send a request to join a group chat session 3112 Send a request to join a group chat session
1896 </summary> 3113 </summary>
1897 <param name="groupID"> 3114 <param name="groupID"><seealso cref="T:OpenMetaverse.UUID"/> of Group to leave</param>
1898 <seealso cref="T:OpenMetaverse.UUID" /> of Group to leave</param>
1899 </member> 3115 </member>
1900 <member name="M:OpenMetaverse.AgentManager.RequestLeaveGroupChat(OpenMetaverse.UUID)"> 3116 <member name="M:OpenMetaverse.AgentManager.RequestLeaveGroupChat(OpenMetaverse.UUID)">
1901 <summary> 3117 <summary>
1902 Exit a group chat session. This will stop further Group chat messages 3118 Exit a group chat session. This will stop further Group chat messages
1903 from being sent until session is rejoined. 3119 from being sent until session is rejoined.
1904 </summary> 3120 </summary>
1905 <param name="groupID"> 3121 <param name="groupID"><seealso cref="T:OpenMetaverse.UUID"/> of Group chat session to leave</param>
1906 <seealso cref="T:OpenMetaverse.UUID" /> of Group chat session to leave</param>
1907 </member> 3122 </member>
1908 <member name="M:OpenMetaverse.AgentManager.ReplyToScriptDialog(System.Int32,System.Int32,System.String,OpenMetaverse.UUID)"> 3123 <member name="M:OpenMetaverse.AgentManager.ReplyToScriptDialog(System.Int32,System.Int32,System.String,OpenMetaverse.UUID)">
1909 <summary> 3124 <summary>
1910 Reply to script dialog questions. 3125 Reply to script dialog questions.
1911 </summary> 3126 </summary>
1912 <param name="channel">Channel initial request came on</param> 3127 <param name="channel">Channel initial request came on</param>
1913 <param name="buttonIndex">Index of button you're "clicking"</param> 3128 <param name="buttonIndex">Index of button you're "clicking"</param>
1914 <param name="buttonlabel">Label of button you're "clicking"</param> 3129 <param name="buttonlabel">Label of button you're "clicking"</param>
1915 <param name="objectID"> 3130 <param name="objectID"><seealso cref="T:OpenMetaverse.UUID"/> of Object that sent the dialog request</param>
1916 <seealso cref="T:OpenMetaverse.UUID" /> of Object that sent the dialog request</param> 3131 <seealso cref="M:OpenMetaverse.AgentManager.OnScriptDialog(OpenMetaverse.ScriptDialogEventArgs)"/>
1917 <seealso cref="M:OpenMetaverse.AgentManager.OnScriptDialog(OpenMetaverse.ScriptDialogEventArgs)" />
1918 </member> 3132 </member>
1919 <member name="M:OpenMetaverse.AgentManager.ChatterBoxAcceptInvite(OpenMetaverse.UUID)"> 3133 <member name="M:OpenMetaverse.AgentManager.ChatterBoxAcceptInvite(OpenMetaverse.UUID)">
1920 <summary> 3134 <summary>
1921 Accept invite for to a chatterbox session 3135 Accept invite for to a chatterbox session
1922 </summary> 3136 </summary>
1923 <param name="session_id"> 3137 <param name="session_id"><seealso cref="T:OpenMetaverse.UUID"/> of session to accept invite to</param>
1924 <seealso cref="T:OpenMetaverse.UUID" /> of session to accept invite to</param>
1925 </member> 3138 </member>
1926 <member name="M:OpenMetaverse.AgentManager.StartIMConference(System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.UUID)"> 3139 <member name="M:OpenMetaverse.AgentManager.StartIMConference(System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.UUID)">
1927 <summary> 3140 <summary>
1928 Start a friends conference 3141 Start a friends conference
1929 </summary> 3142 </summary>
1930 <param name="participants"> 3143 <param name="participants"><seealso cref="T:OpenMetaverse.UUID"/> List of UUIDs to start a conference with</param>
1931 <seealso cref="T:OpenMetaverse.UUID" /> List of UUIDs to start a conference with</param> 3144 <param name="tmp_session_id">the temportary session ID returned in the <see cref="!:OnJoinedGroupChat"/> callback&gt;</param>
1932 <param name="tmp_session_id">the temportary session ID returned in the <see cref="!:OnJoinedGroupChat" /> callback&gt;</param>
1933 </member> 3145 </member>
1934 <member name="M:OpenMetaverse.AgentManager.PointAtEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.PointAtType,OpenMetaverse.UUID)"> 3146 <member name="M:OpenMetaverse.AgentManager.PointAtEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.PointAtType,OpenMetaverse.UUID)">
1935 <summary> 3147 <summary>
1936 Start a particle stream between an agent and an object 3148 Start a particle stream between an agent and an object
1937 </summary> 3149 </summary>
1938 <param name="sourceAvatar"> 3150 <param name="sourceAvatar"><seealso cref="T:OpenMetaverse.UUID"/> Key of the source agent</param>
1939 <seealso cref="T:OpenMetaverse.UUID" /> Key of the source agent</param> 3151 <param name="targetObject"><seealso cref="T:OpenMetaverse.UUID"/> Key of the target object</param>
1940 <param name="targetObject"> 3152 <param name="globalOffset"></param>
1941 <seealso cref="T:OpenMetaverse.UUID" /> Key of the target object</param> 3153 <param name="type">The type from the <seealso cref="T:PointAtType"/> enum</param>
1942 <param name="globalOffset"> 3154 <param name="effectID">A unique <seealso cref="T:OpenMetaverse.UUID"/> for this effect</param>
1943 </param>
1944 <param name="type">The type from the <seealso cref="T:PointAtType" /> enum</param>
1945 <param name="effectID">A unique <seealso cref="T:OpenMetaverse.UUID" /> for this effect</param>
1946 </member> 3155 </member>
1947 <member name="M:OpenMetaverse.AgentManager.LookAtEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.LookAtType,OpenMetaverse.UUID)"> 3156 <member name="M:OpenMetaverse.AgentManager.LookAtEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.LookAtType,OpenMetaverse.UUID)">
1948 <summary> 3157 <summary>
1949 Start a particle stream between an agent and an object 3158 Start a particle stream between an agent and an object
1950 </summary> 3159 </summary>
1951 <param name="sourceAvatar"> 3160 <param name="sourceAvatar"><seealso cref="T:OpenMetaverse.UUID"/> Key of the source agent</param>
1952 <seealso cref="T:OpenMetaverse.UUID" /> Key of the source agent</param> 3161 <param name="targetObject"><seealso cref="T:OpenMetaverse.UUID"/> Key of the target object</param>
1953 <param name="targetObject"> 3162 <param name="globalOffset">A <seealso cref="T:OpenMetaverse.Vector3d"/> representing the beams offset from the source</param>
1954 <seealso cref="T:OpenMetaverse.UUID" /> Key of the target object</param> 3163 <param name="type">A <seealso cref="T:PointAtType"/> which sets the avatars lookat animation</param>
1955 <param name="globalOffset">A <seealso cref="T:OpenMetaverse.Vector3d" /> representing the beams offset from the source</param> 3164 <param name="effectID"><seealso cref="T:OpenMetaverse.UUID"/> of the Effect</param>
1956 <param name="type">A <seealso cref="T:PointAtType" /> which sets the avatars lookat animation</param>
1957 <param name="effectID">
1958 <seealso cref="T:OpenMetaverse.UUID" /> of the Effect</param>
1959 </member> 3165 </member>
1960 <member name="M:OpenMetaverse.AgentManager.BeamEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.Color4,System.Single,OpenMetaverse.UUID)"> 3166 <member name="M:OpenMetaverse.AgentManager.BeamEffect(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3d,OpenMetaverse.Color4,System.Single,OpenMetaverse.UUID)">
1961 <summary> 3167 <summary>
1962 Create a particle beam between an avatar and an primitive 3168 Create a particle beam between an avatar and an primitive
1963 </summary> 3169 </summary>
1964 <param name="sourceAvatar">The ID of source avatar</param> 3170 <param name="sourceAvatar">The ID of source avatar</param>
1965 <param name="targetObject">The ID of the target primitive</param> 3171 <param name="targetObject">The ID of the target primitive</param>
1966 <param name="globalOffset">global offset</param> 3172 <param name="globalOffset">global offset</param>
1967 <param name="color">A <see cref="T:OpenMetaverse.Color4" /> object containing the combined red, green, blue and alpha 3173 <param name="color">A <see cref="T:OpenMetaverse.Color4"/> object containing the combined red, green, blue and alpha
1968 color values of particle beam</param> 3174 color values of particle beam</param>
1969 <param name="duration">a float representing the duration the parcicle beam will last</param> 3175 <param name="duration">a float representing the duration the parcicle beam will last</param>
1970 <param name="effectID">A Unique ID for the beam</param> 3176 <param name="effectID">A Unique ID for the beam</param>
1971 <seealso cref="T:OpenMetaverse.Packets.ViewerEffectPacket" /> 3177 <seealso cref="T:OpenMetaverse.Packets.ViewerEffectPacket"/>
1972 </member> 3178 </member>
1973 <member name="M:OpenMetaverse.AgentManager.SphereEffect(OpenMetaverse.Vector3d,OpenMetaverse.Color4,System.Single,OpenMetaverse.UUID)"> 3179 <member name="M:OpenMetaverse.AgentManager.SphereEffect(OpenMetaverse.Vector3d,OpenMetaverse.Color4,System.Single,OpenMetaverse.UUID)">
1974 <summary> 3180 <summary>
1975 Create a particle swirl around a target position using a <seealso cref="T:OpenMetaverse.Packets.ViewerEffectPacket" /> packet 3181 Create a particle swirl around a target position using a <seealso cref="T:OpenMetaverse.Packets.ViewerEffectPacket"/> packet
1976 </summary> 3182 </summary>
1977 <param name="globalOffset">global offset</param> 3183 <param name="globalOffset">global offset</param>
1978 <param name="color">A <see cref="T:OpenMetaverse.Color4" /> object containing the combined red, green, blue and alpha 3184 <param name="color">A <see cref="T:OpenMetaverse.Color4"/> object containing the combined red, green, blue and alpha
1979 color values of particle beam</param> 3185 color values of particle beam</param>
1980 <param name="duration">a float representing the duration the parcicle beam will last</param> 3186 <param name="duration">a float representing the duration the parcicle beam will last</param>
1981 <param name="effectID">A Unique ID for the beam</param> 3187 <param name="effectID">A Unique ID for the beam</param>
@@ -1984,13 +3190,12 @@
1984 <summary> 3190 <summary>
1985 Sends a request to sit on the specified object 3191 Sends a request to sit on the specified object
1986 </summary> 3192 </summary>
1987 <param name="targetID"> 3193 <param name="targetID"><seealso cref="T:OpenMetaverse.UUID"/> of the object to sit on</param>
1988 <seealso cref="T:OpenMetaverse.UUID" /> of the object to sit on</param>
1989 <param name="offset">Sit at offset</param> 3194 <param name="offset">Sit at offset</param>
1990 </member> 3195 </member>
1991 <member name="M:OpenMetaverse.AgentManager.Sit"> 3196 <member name="M:OpenMetaverse.AgentManager.Sit">
1992 <summary> 3197 <summary>
1993 Follows a call to <seealso cref="M:OpenMetaverse.AgentManager.RequestSit(OpenMetaverse.UUID,OpenMetaverse.Vector3)" /> to actually sit on the object 3198 Follows a call to <seealso cref="M:OpenMetaverse.AgentManager.RequestSit(OpenMetaverse.UUID,OpenMetaverse.Vector3)"/> to actually sit on the object
1994 </summary> 3199 </summary>
1995 </member> 3200 </member>
1996 <member name="M:OpenMetaverse.AgentManager.Stand"> 3201 <member name="M:OpenMetaverse.AgentManager.Stand">
@@ -2057,15 +3262,14 @@
2057 Grabs an object 3262 Grabs an object
2058 </summary> 3263 </summary>
2059 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param> 3264 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param>
2060 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives" /> 3265 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives"/>
2061 </member> 3266 </member>
2062 <member name="M:OpenMetaverse.AgentManager.Grab(System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 3267 <member name="M:OpenMetaverse.AgentManager.Grab(System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
2063 <summary> 3268 <summary>
2064 Overload: Grab a simulated object 3269 Overload: Grab a simulated object
2065 </summary> 3270 </summary>
2066 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param> 3271 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param>
2067 <param name="grabOffset"> 3272 <param name="grabOffset"></param>
2068 </param>
2069 <param name="uvCoord">The texture coordinates to grab</param> 3273 <param name="uvCoord">The texture coordinates to grab</param>
2070 <param name="stCoord">The surface coordinates to grab</param> 3274 <param name="stCoord">The surface coordinates to grab</param>
2071 <param name="faceIndex">The face of the position to grab</param> 3275 <param name="faceIndex">The face of the position to grab</param>
@@ -2078,19 +3282,16 @@
2078 <summary> 3282 <summary>
2079 Drag an object 3283 Drag an object
2080 </summary> 3284 </summary>
2081 <param name="objectID"> 3285 <param name="objectID"><seealso cref="T:OpenMetaverse.UUID"/> of the object to drag</param>
2082 <seealso cref="T:OpenMetaverse.UUID" /> of the object to drag</param>
2083 <param name="grabPosition">Drag target in region coordinates</param> 3286 <param name="grabPosition">Drag target in region coordinates</param>
2084 </member> 3287 </member>
2085 <member name="M:OpenMetaverse.AgentManager.GrabUpdate(OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 3288 <member name="M:OpenMetaverse.AgentManager.GrabUpdate(OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
2086 <summary> 3289 <summary>
2087 Overload: Drag an object 3290 Overload: Drag an object
2088 </summary> 3291 </summary>
2089 <param name="objectID"> 3292 <param name="objectID"><seealso cref="T:OpenMetaverse.UUID"/> of the object to drag</param>
2090 <seealso cref="T:OpenMetaverse.UUID" /> of the object to drag</param>
2091 <param name="grabPosition">Drag target in region coordinates</param> 3293 <param name="grabPosition">Drag target in region coordinates</param>
2092 <param name="grabOffset"> 3294 <param name="grabOffset"></param>
2093 </param>
2094 <param name="uvCoord">The texture coordinates to grab</param> 3295 <param name="uvCoord">The texture coordinates to grab</param>
2095 <param name="stCoord">The surface coordinates to grab</param> 3296 <param name="stCoord">The surface coordinates to grab</param>
2096 <param name="faceIndex">The face of the position to grab</param> 3297 <param name="faceIndex">The face of the position to grab</param>
@@ -2104,9 +3305,9 @@
2104 Release a grabbed object 3305 Release a grabbed object
2105 </summary> 3306 </summary>
2106 <param name="objectLocalID">The Objects Simulator Local ID</param> 3307 <param name="objectLocalID">The Objects Simulator Local ID</param>
2107 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives" /> 3308 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives"/>
2108 <seealso cref="M:OpenMetaverse.AgentManager.Grab(System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)" /> 3309 <seealso cref="M:OpenMetaverse.AgentManager.Grab(System.UInt32)"/>
2109 <seealso cref="M:OpenMetaverse.AgentManager.GrabUpdate(OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)" /> 3310 <seealso cref="M:OpenMetaverse.AgentManager.GrabUpdate(OpenMetaverse.UUID,OpenMetaverse.Vector3)"/>
2110 </member> 3311 </member>
2111 <member name="M:OpenMetaverse.AgentManager.DeGrab(System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 3312 <member name="M:OpenMetaverse.AgentManager.DeGrab(System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
2112 <summary> 3313 <summary>
@@ -2126,7 +3327,7 @@
2126 Touches an object 3327 Touches an object
2127 </summary> 3328 </summary>
2128 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param> 3329 <param name="objectLocalID">an unsigned integer of the objects ID within the simulator</param>
2129 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives" /> 3330 <seealso cref="F:OpenMetaverse.Simulator.ObjectsPrimitives"/>
2130 </member> 3331 </member>
2131 <member name="M:OpenMetaverse.AgentManager.RequestBalance"> 3332 <member name="M:OpenMetaverse.AgentManager.RequestBalance">
2132 <summary> 3333 <summary>
@@ -2153,7 +3354,7 @@
2153 <summary> 3354 <summary>
2154 Give L$ to an object 3355 Give L$ to an object
2155 </summary> 3356 </summary>
2156 <param name="target">object <seealso cref="T:OpenMetaverse.UUID" /> to give money to</param> 3357 <param name="target">object <seealso cref="T:OpenMetaverse.UUID"/> to give money to</param>
2157 <param name="amount">amount of L$ to give</param> 3358 <param name="amount">amount of L$ to give</param>
2158 <param name="objectName">name of object</param> 3359 <param name="objectName">name of object</param>
2159 </member> 3360 </member>
@@ -2161,14 +3362,14 @@
2161 <summary> 3362 <summary>
2162 Give L$ to a group 3363 Give L$ to a group
2163 </summary> 3364 </summary>
2164 <param name="target">group <seealso cref="T:OpenMetaverse.UUID" /> to give money to</param> 3365 <param name="target">group <seealso cref="T:OpenMetaverse.UUID"/> to give money to</param>
2165 <param name="amount">amount of L$ to give</param> 3366 <param name="amount">amount of L$ to give</param>
2166 </member> 3367 </member>
2167 <member name="M:OpenMetaverse.AgentManager.GiveGroupMoney(OpenMetaverse.UUID,System.Int32,System.String)"> 3368 <member name="M:OpenMetaverse.AgentManager.GiveGroupMoney(OpenMetaverse.UUID,System.Int32,System.String)">
2168 <summary> 3369 <summary>
2169 Give L$ to a group 3370 Give L$ to a group
2170 </summary> 3371 </summary>
2171 <param name="target">group <seealso cref="T:OpenMetaverse.UUID" /> to give money to</param> 3372 <param name="target">group <seealso cref="T:OpenMetaverse.UUID"/> to give money to</param>
2172 <param name="amount">amount of L$ to give</param> 3373 <param name="amount">amount of L$ to give</param>
2173 <param name="description">description of transaction</param> 3374 <param name="description">description of transaction</param>
2174 </member> 3375 </member>
@@ -2198,33 +3399,33 @@
2198 <summary> 3399 <summary>
2199 Plays a gesture 3400 Plays a gesture
2200 </summary> 3401 </summary>
2201 <param name="gestureID">Asset <seealso cref="T:OpenMetaverse.UUID" /> of the gesture</param> 3402 <param name="gestureID">Asset <seealso cref="T:OpenMetaverse.UUID"/> of the gesture</param>
2202 </member> 3403 </member>
2203 <member name="M:OpenMetaverse.AgentManager.ActivateGesture(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 3404 <member name="M:OpenMetaverse.AgentManager.ActivateGesture(OpenMetaverse.UUID,OpenMetaverse.UUID)">
2204 <summary> 3405 <summary>
2205 Mark gesture active 3406 Mark gesture active
2206 </summary> 3407 </summary>
2207 <param name="invID">Inventory <seealso cref="T:OpenMetaverse.UUID" /> of the gesture</param> 3408 <param name="invID">Inventory <seealso cref="T:OpenMetaverse.UUID"/> of the gesture</param>
2208 <param name="assetID">Asset <seealso cref="T:OpenMetaverse.UUID" /> of the gesture</param> 3409 <param name="assetID">Asset <seealso cref="T:OpenMetaverse.UUID"/> of the gesture</param>
2209 </member> 3410 </member>
2210 <member name="M:OpenMetaverse.AgentManager.DeactivateGesture(OpenMetaverse.UUID)"> 3411 <member name="M:OpenMetaverse.AgentManager.DeactivateGesture(OpenMetaverse.UUID)">
2211 <summary> 3412 <summary>
2212 Mark gesture inactive 3413 Mark gesture inactive
2213 </summary> 3414 </summary>
2214 <param name="invID">Inventory <seealso cref="T:OpenMetaverse.UUID" /> of the gesture</param> 3415 <param name="invID">Inventory <seealso cref="T:OpenMetaverse.UUID"/> of the gesture</param>
2215 </member> 3416 </member>
2216 <member name="M:OpenMetaverse.AgentManager.AnimationStart(OpenMetaverse.UUID,System.Boolean)"> 3417 <member name="M:OpenMetaverse.AgentManager.AnimationStart(OpenMetaverse.UUID,System.Boolean)">
2217 <summary> 3418 <summary>
2218 Send an AgentAnimation packet that toggles a single animation on 3419 Send an AgentAnimation packet that toggles a single animation on
2219 </summary> 3420 </summary>
2220 <param name="animation">The <seealso cref="T:OpenMetaverse.UUID" /> of the animation to start playing</param> 3421 <param name="animation">The <seealso cref="T:OpenMetaverse.UUID"/> of the animation to start playing</param>
2221 <param name="reliable">Whether to ensure delivery of this packet or not</param> 3422 <param name="reliable">Whether to ensure delivery of this packet or not</param>
2222 </member> 3423 </member>
2223 <member name="M:OpenMetaverse.AgentManager.AnimationStop(OpenMetaverse.UUID,System.Boolean)"> 3424 <member name="M:OpenMetaverse.AgentManager.AnimationStop(OpenMetaverse.UUID,System.Boolean)">
2224 <summary> 3425 <summary>
2225 Send an AgentAnimation packet that toggles a single animation off 3426 Send an AgentAnimation packet that toggles a single animation off
2226 </summary> 3427 </summary>
2227 <param name="animation">The <seealso cref="T:OpenMetaverse.UUID" /> of a 3428 <param name="animation">The <seealso cref="T:OpenMetaverse.UUID"/> of a
2228 currently playing animation to stop playing</param> 3429 currently playing animation to stop playing</param>
2229 <param name="reliable">Whether to ensure delivery of this packet or not</param> 3430 <param name="reliable">Whether to ensure delivery of this packet or not</param>
2230 </member> 3431 </member>
@@ -2232,7 +3433,7 @@
2232 <summary> 3433 <summary>
2233 Send an AgentAnimation packet that will toggle animations on or off 3434 Send an AgentAnimation packet that will toggle animations on or off
2234 </summary> 3435 </summary>
2235 <param name="animations">A list of animation <seealso cref="T:OpenMetaverse.UUID" />s, and whether to 3436 <param name="animations">A list of animation <seealso cref="T:OpenMetaverse.UUID"/>s, and whether to
2236 turn that animation on or off</param> 3437 turn that animation on or off</param>
2237 <param name="reliable">Whether to ensure delivery of this packet or not</param> 3438 <param name="reliable">Whether to ensure delivery of this packet or not</param>
2238 </member> 3439 </member>
@@ -2246,8 +3447,7 @@
2246 <summary> 3447 <summary>
2247 Teleport agent to a landmark 3448 Teleport agent to a landmark
2248 </summary> 3449 </summary>
2249 <param name="landmark"> 3450 <param name="landmark"><seealso cref="T:OpenMetaverse.UUID"/> of the landmark to teleport agent to</param>
2250 <seealso cref="T:OpenMetaverse.UUID" /> of the landmark to teleport agent to</param>
2251 <returns>true on success, false on failure</returns> 3451 <returns>true on success, false on failure</returns>
2252 </member> 3452 </member>
2253 <member name="M:OpenMetaverse.AgentManager.Teleport(System.String,OpenMetaverse.Vector3)"> 3453 <member name="M:OpenMetaverse.AgentManager.Teleport(System.String,OpenMetaverse.Vector3)">
@@ -2276,8 +3476,7 @@
2276 Teleport agent to another region 3476 Teleport agent to another region
2277 </summary> 3477 </summary>
2278 <param name="regionHandle">handle of region to teleport agent to</param> 3478 <param name="regionHandle">handle of region to teleport agent to</param>
2279 <param name="position"> 3479 <param name="position"><seealso cref="T:OpenMetaverse.Vector3"/> position in destination sim to teleport to</param>
2280 <seealso cref="T:OpenMetaverse.Vector3" /> position in destination sim to teleport to</param>
2281 <returns>true on success, false on failure</returns> 3480 <returns>true on success, false on failure</returns>
2282 <remarks>This call is blocking</remarks> 3481 <remarks>This call is blocking</remarks>
2283 </member> 3482 </member>
@@ -2286,10 +3485,8 @@
2286 Teleport agent to another region 3485 Teleport agent to another region
2287 </summary> 3486 </summary>
2288 <param name="regionHandle">handle of region to teleport agent to</param> 3487 <param name="regionHandle">handle of region to teleport agent to</param>
2289 <param name="position"> 3488 <param name="position"><seealso cref="T:OpenMetaverse.Vector3"/> position in destination sim to teleport to</param>
2290 <seealso cref="T:OpenMetaverse.Vector3" /> position in destination sim to teleport to</param> 3489 <param name="lookAt"><seealso cref="T:OpenMetaverse.Vector3"/> direction in destination sim agent will look at</param>
2291 <param name="lookAt">
2292 <seealso cref="T:OpenMetaverse.Vector3" /> direction in destination sim agent will look at</param>
2293 <returns>true on success, false on failure</returns> 3490 <returns>true on success, false on failure</returns>
2294 <remarks>This call is blocking</remarks> 3491 <remarks>This call is blocking</remarks>
2295 </member> 3492 </member>
@@ -2298,62 +3495,56 @@
2298 Request teleport to a another simulator 3495 Request teleport to a another simulator
2299 </summary> 3496 </summary>
2300 <param name="regionHandle">handle of region to teleport agent to</param> 3497 <param name="regionHandle">handle of region to teleport agent to</param>
2301 <param name="position"> 3498 <param name="position"><seealso cref="T:OpenMetaverse.Vector3"/> position in destination sim to teleport to</param>
2302 <seealso cref="T:OpenMetaverse.Vector3" /> position in destination sim to teleport to</param>
2303 </member> 3499 </member>
2304 <member name="M:OpenMetaverse.AgentManager.RequestTeleport(System.UInt64,OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 3500 <member name="M:OpenMetaverse.AgentManager.RequestTeleport(System.UInt64,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
2305 <summary> 3501 <summary>
2306 Request teleport to a another simulator 3502 Request teleport to a another simulator
2307 </summary> 3503 </summary>
2308 <param name="regionHandle">handle of region to teleport agent to</param> 3504 <param name="regionHandle">handle of region to teleport agent to</param>
2309 <param name="position"> 3505 <param name="position"><seealso cref="T:OpenMetaverse.Vector3"/> position in destination sim to teleport to</param>
2310 <seealso cref="T:OpenMetaverse.Vector3" /> position in destination sim to teleport to</param> 3506 <param name="lookAt"><seealso cref="T:OpenMetaverse.Vector3"/> direction in destination sim agent will look at</param>
2311 <param name="lookAt">
2312 <seealso cref="T:OpenMetaverse.Vector3" /> direction in destination sim agent will look at</param>
2313 </member> 3507 </member>
2314 <member name="M:OpenMetaverse.AgentManager.RequestTeleport(OpenMetaverse.UUID)"> 3508 <member name="M:OpenMetaverse.AgentManager.RequestTeleport(OpenMetaverse.UUID)">
2315 <summary> 3509 <summary>
2316 Teleport agent to a landmark 3510 Teleport agent to a landmark
2317 </summary> 3511 </summary>
2318 <param name="landmark"> 3512 <param name="landmark"><seealso cref="T:OpenMetaverse.UUID"/> of the landmark to teleport agent to</param>
2319 <seealso cref="T:OpenMetaverse.UUID" /> of the landmark to teleport agent to</param>
2320 </member> 3513 </member>
2321 <member name="M:OpenMetaverse.AgentManager.SendTeleportLure(OpenMetaverse.UUID)"> 3514 <member name="M:OpenMetaverse.AgentManager.SendTeleportLure(OpenMetaverse.UUID)">
2322 <summary> 3515 <summary>
2323 Send a teleport lure to another avatar with default "Join me in ..." invitation message 3516 Send a teleport lure to another avatar with default "Join me in ..." invitation message
2324 </summary> 3517 </summary>
2325 <param name="targetID">target avatars <seealso cref="T:OpenMetaverse.UUID" /> to lure</param> 3518 <param name="targetID">target avatars <seealso cref="T:OpenMetaverse.UUID"/> to lure</param>
2326 </member> 3519 </member>
2327 <member name="M:OpenMetaverse.AgentManager.SendTeleportLure(OpenMetaverse.UUID,System.String)"> 3520 <member name="M:OpenMetaverse.AgentManager.SendTeleportLure(OpenMetaverse.UUID,System.String)">
2328 <summary> 3521 <summary>
2329 Send a teleport lure to another avatar with custom invitation message 3522 Send a teleport lure to another avatar with custom invitation message
2330 </summary> 3523 </summary>
2331 <param name="targetID">target avatars <seealso cref="T:OpenMetaverse.UUID" /> to lure</param> 3524 <param name="targetID">target avatars <seealso cref="T:OpenMetaverse.UUID"/> to lure</param>
2332 <param name="message">custom message to send with invitation</param> 3525 <param name="message">custom message to send with invitation</param>
2333 </member> 3526 </member>
2334 <member name="M:OpenMetaverse.AgentManager.TeleportLureRespond(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)"> 3527 <member name="M:OpenMetaverse.AgentManager.TeleportLureRespond(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)">
2335 <summary> 3528 <summary>
2336 Respond to a teleport lure by either accepting it and initiating 3529 Respond to a teleport lure by either accepting it and initiating
2337 the teleport, or denying it 3530 the teleport, or denying it
2338 </summary> 3531 </summary>
2339 <param name="requesterID"> 3532 <param name="requesterID"><seealso cref="T:OpenMetaverse.UUID"/> of the avatar sending the lure</param>
2340 <seealso cref="T:OpenMetaverse.UUID" /> of the avatar sending the lure</param> 3533 <param name="sessionID">IM session <seealso cref="T:OpenMetaverse.UUID"/> of the incoming lure request</param>
2341 <param name="sessionID">IM session <seealso cref="T:OpenMetaverse.UUID" /> of the incoming lure request</param>
2342 <param name="accept">true to accept the lure, false to decline it</param> 3534 <param name="accept">true to accept the lure, false to decline it</param>
2343 </member> 3535 </member>
2344 <member name="M:OpenMetaverse.AgentManager.UpdateProfile(OpenMetaverse.Avatar.AvatarProperties)"> 3536 <member name="M:OpenMetaverse.AgentManager.UpdateProfile(OpenMetaverse.Avatar.AvatarProperties)">
2345 <summary> 3537 <summary>
2346 Update agent profile 3538 Update agent profile
2347 </summary> 3539 </summary>
2348 <param name="profile"> 3540 <param name="profile"><seealso cref="T:OpenMetaverse.Avatar.AvatarProperties"/> struct containing updated
2349 <seealso cref="T:OpenMetaverse.Avatar.AvatarProperties" /> struct containing updated
2350 profile information</param> 3541 profile information</param>
2351 </member> 3542 </member>
2352 <member name="M:OpenMetaverse.AgentManager.UpdateInterests(OpenMetaverse.Avatar.Interests)"> 3543 <member name="M:OpenMetaverse.AgentManager.UpdateInterests(OpenMetaverse.Avatar.Interests)">
2353 <summary> 3544 <summary>
2354 Update agents profile interests 3545 Update agents profile interests
2355 </summary> 3546 </summary>
2356 <param name="interests">selection of interests from <seealso cref="T:OpenMetaverse.Avatar.Interests" /> struct</param> 3547 <param name="interests">selection of interests from <seealso cref="T:OpenMetaverse.Avatar.Interests"/> struct</param>
2357 </member> 3548 </member>
2358 <member name="M:OpenMetaverse.AgentManager.SetHeightWidth(System.UInt16,System.UInt16)"> 3549 <member name="M:OpenMetaverse.AgentManager.SetHeightWidth(System.UInt16,System.UInt16)">
2359 <summary> 3550 <summary>
@@ -2396,7 +3587,7 @@
2396 <summary> 3587 <summary>
2397 Sets home location to agents current position 3588 Sets home location to agents current position
2398 </summary> 3589 </summary>
2399 <remarks>will fire an AlertMessage (<seealso cref="E:OpenMetaverse.AgentManager.OnAlertMessage" />) with 3590 <remarks>will fire an AlertMessage (<seealso cref="E:OpenMetaverse.AgentManager.OnAlertMessage"/>) with
2400 success or failure message</remarks> 3591 success or failure message</remarks>
2401 </member> 3592 </member>
2402 <member name="M:OpenMetaverse.AgentManager.CompleteAgentMovement(OpenMetaverse.Simulator)"> 3593 <member name="M:OpenMetaverse.AgentManager.CompleteAgentMovement(OpenMetaverse.Simulator)">
@@ -2404,21 +3595,16 @@
2404 Move an agent in to a simulator. This packet is the last packet 3595 Move an agent in to a simulator. This packet is the last packet
2405 needed to complete the transition in to a new simulator 3596 needed to complete the transition in to a new simulator
2406 </summary> 3597 </summary>
2407 <param name="simulator"> 3598 <param name="simulator"><seealso cref="T:OpenMetaverse.Simulator"/> Object</param>
2408 <seealso cref="T:OpenMetaverse.Simulator" /> Object</param>
2409 </member> 3599 </member>
2410 <member name="M:OpenMetaverse.AgentManager.ScriptQuestionReply(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.ScriptPermission)"> 3600 <member name="M:OpenMetaverse.AgentManager.ScriptQuestionReply(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.ScriptPermission)">
2411 <summary> 3601 <summary>
2412 Reply to script permissions request 3602 Reply to script permissions request
2413 </summary> 3603 </summary>
2414 <param name="simulator"> 3604 <param name="simulator"><seealso cref="T:OpenMetaverse.Simulator"/> Object</param>
2415 <seealso cref="T:OpenMetaverse.Simulator" /> Object</param> 3605 <param name="itemID"><seealso cref="T:OpenMetaverse.UUID"/> of the itemID requesting permissions</param>
2416 <param name="itemID"> 3606 <param name="taskID"><seealso cref="T:OpenMetaverse.UUID"/> of the taskID requesting permissions</param>
2417 <seealso cref="T:OpenMetaverse.UUID" /> of the itemID requesting permissions</param> 3607 <param name="permissions"><seealso cref="T:OpenMetaverse.ScriptPermission"/> list of permissions to allow</param>
2418 <param name="taskID">
2419 <seealso cref="T:OpenMetaverse.UUID" /> of the taskID requesting permissions</param>
2420 <param name="permissions">
2421 <seealso cref="T:OpenMetaverse.ScriptPermission" /> list of permissions to allow</param>
2422 </member> 3608 </member>
2423 <member name="M:OpenMetaverse.AgentManager.GroupInviteRespond(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)"> 3609 <member name="M:OpenMetaverse.AgentManager.GroupInviteRespond(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)">
2424 <summary> 3610 <summary>
@@ -2519,8 +3705,8 @@
2519 </member> 3705 </member>
2520 <member name="M:OpenMetaverse.AgentManager.ChatHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 3706 <member name="M:OpenMetaverse.AgentManager.ChatHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
2521 <summary> 3707 <summary>
2522 Take an incoming Chat packet, auto-parse, and if OnChat is defined call 3708 Take an incoming Chat packet, auto-parse, and if OnChat is defined call
2523 that with the appropriate arguments. 3709 that with the appropriate arguments.
2524 </summary> 3710 </summary>
2525 <param name="sender">The sender</param> 3711 <param name="sender">The sender</param>
2526 <param name="e">The EventArgs object containing the packet data</param> 3712 <param name="e">The EventArgs object containing the packet data</param>
@@ -2582,7 +3768,7 @@
2582 </summary> 3768 </summary>
2583 <param name="capsKey">The message key</param> 3769 <param name="capsKey">The message key</param>
2584 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param> 3770 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
2585 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> which originated the packet</param> 3771 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> which originated the packet</param>
2586 </member> 3772 </member>
2587 <member name="M:OpenMetaverse.AgentManager.TeleportFailedEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 3773 <member name="M:OpenMetaverse.AgentManager.TeleportFailedEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
2588 <summary> 3774 <summary>
@@ -2622,7 +3808,7 @@
2622 </summary> 3808 </summary>
2623 <param name="capsKey">The message key</param> 3809 <param name="capsKey">The message key</param>
2624 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param> 3810 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
2625 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> which originated the packet</param> 3811 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> which originated the packet</param>
2626 </member> 3812 </member>
2627 <member name="M:OpenMetaverse.AgentManager.CrossedRegionHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 3813 <member name="M:OpenMetaverse.AgentManager.CrossedRegionHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
2628 <summary>Process an incoming packet and raise the appropriate events</summary> 3814 <summary>Process an incoming packet and raise the appropriate events</summary>
@@ -2636,28 +3822,23 @@
2636 </summary> 3822 </summary>
2637 <param name="capsKey">The capability Key</param> 3823 <param name="capsKey">The capability Key</param>
2638 <param name="message">IMessage object containing decoded data from OSD</param> 3824 <param name="message">IMessage object containing decoded data from OSD</param>
2639 <param name="simulator"> 3825 <param name="simulator"></param>
2640 </param>
2641 </member> 3826 </member>
2642 <member name="M:OpenMetaverse.AgentManager.ChatterBoxSessionStartReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 3827 <member name="M:OpenMetaverse.AgentManager.ChatterBoxSessionStartReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
2643 <summary> 3828 <summary>
2644 Response from request to join a group chat 3829 Response from request to join a group chat
2645 </summary> 3830 </summary>
2646 <param name="capsKey"> 3831 <param name="capsKey"></param>
2647 </param>
2648 <param name="message">IMessage object containing decoded data from OSD</param> 3832 <param name="message">IMessage object containing decoded data from OSD</param>
2649 <param name="simulator"> 3833 <param name="simulator"></param>
2650 </param>
2651 </member> 3834 </member>
2652 <member name="M:OpenMetaverse.AgentManager.ChatterBoxSessionAgentListUpdatesEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 3835 <member name="M:OpenMetaverse.AgentManager.ChatterBoxSessionAgentListUpdatesEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
2653 <summary> 3836 <summary>
2654 Someone joined or left group chat 3837 Someone joined or left group chat
2655 </summary> 3838 </summary>
2656 <param name="capsKey"> 3839 <param name="capsKey"></param>
2657 </param>
2658 <param name="message">IMessage object containing decoded data from OSD</param> 3840 <param name="message">IMessage object containing decoded data from OSD</param>
2659 <param name="simulator"> 3841 <param name="simulator"></param>
2660 </param>
2661 </member> 3842 </member>
2662 <member name="M:OpenMetaverse.AgentManager.ChatterBoxInvitationEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 3843 <member name="M:OpenMetaverse.AgentManager.ChatterBoxInvitationEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
2663 <summary> 3844 <summary>
@@ -2671,8 +3852,8 @@
2671 <summary> 3852 <summary>
2672 Moderate a chat session 3853 Moderate a chat session
2673 </summary> 3854 </summary>
2674 <param name="sessionID">the <see cref="T:OpenMetaverse.UUID" /> of the session to moderate, for group chats this will be the groups UUID</param> 3855 <param name="sessionID">the <see cref="T:OpenMetaverse.UUID"/> of the session to moderate, for group chats this will be the groups UUID</param>
2675 <param name="memberID">the <see cref="T:OpenMetaverse.UUID" /> of the avatar to moderate</param> 3856 <param name="memberID">the <see cref="T:OpenMetaverse.UUID"/> of the avatar to moderate</param>
2676 <param name="key">Either "voice" to moderate users voice, or "text" to moderate users text session</param> 3857 <param name="key">Either "voice" to moderate users voice, or "text" to moderate users text session</param>
2677 <param name="moderate">true to moderate (silence user), false to allow avatar to speak</param> 3858 <param name="moderate">true to moderate (silence user), false to allow avatar to speak</param>
2678 </member> 3859 </member>
@@ -2696,3348 +3877,4598 @@
2696 <param name="sender">The sender</param> 3877 <param name="sender">The sender</param>
2697 <param name="e">The EventArgs object containing the packet data</param> 3878 <param name="e">The EventArgs object containing the packet data</param>
2698 </member> 3879 </member>
2699 <member name="T:OpenMetaverse.ChatEventArgs"> 3880 <member name="E:OpenMetaverse.AgentManager.ChatFromSimulator">
3881 <summary>Raised when a scripted object or agent within range sends a public message</summary>
3882 </member>
3883 <member name="E:OpenMetaverse.AgentManager.ScriptDialog">
3884 <summary>Raised when a scripted object sends a dialog box containing possible
3885 options an agent can respond to</summary>
3886 </member>
3887 <member name="E:OpenMetaverse.AgentManager.ScriptQuestion">
3888 <summary>Raised when an object requests a change in the permissions an agent has permitted</summary>
3889 </member>
3890 <member name="E:OpenMetaverse.AgentManager.LoadURL">
3891 <summary>Raised when a script requests an agent open the specified URL</summary>
3892 </member>
3893 <member name="E:OpenMetaverse.AgentManager.MoneyBalance">
3894 <summary>Raised when an agents currency balance is updated</summary>
3895 </member>
3896 <member name="E:OpenMetaverse.AgentManager.MoneyBalanceReply">
3897 <summary>Raised when a transaction occurs involving currency such as a land purchase</summary>
3898 </member>
3899 <member name="E:OpenMetaverse.AgentManager.IM">
3900 <summary>Raised when an ImprovedInstantMessage packet is recieved from the simulator, this is used for everything from
3901 private messaging to friendship offers. The Dialog field defines what type of message has arrived</summary>
3902 </member>
3903 <member name="E:OpenMetaverse.AgentManager.TeleportProgress">
3904 <summary>Raised when an agent has requested a teleport to another location, or when responding to a lure. Raised multiple times
3905 for each teleport indicating the progress of the request</summary>
3906 </member>
3907 <member name="E:OpenMetaverse.AgentManager.AgentDataReply">
3908 <summary>Raised when a simulator sends agent specific information for our avatar.</summary>
3909 </member>
3910 <member name="E:OpenMetaverse.AgentManager.AnimationsChanged">
3911 <summary>Raised when our agents animation playlist changes</summary>
3912 </member>
3913 <member name="E:OpenMetaverse.AgentManager.MeanCollision">
3914 <summary>Raised when an object or avatar forcefully collides with our agent</summary>
3915 </member>
3916 <member name="E:OpenMetaverse.AgentManager.RegionCrossed">
3917 <summary>Raised when our agent crosses a region border into another region</summary>
3918 </member>
3919 <member name="E:OpenMetaverse.AgentManager.GroupChatJoined">
3920 <summary>Raised when our agent succeeds or fails to join a group chat session</summary>
3921 </member>
3922 <member name="E:OpenMetaverse.AgentManager.AlertMessage">
3923 <summary>Raised when a simulator sends an urgent message usually indication the recent failure of
3924 another action we have attempted to take such as an attempt to enter a parcel where we are denied access</summary>
3925 </member>
3926 <member name="E:OpenMetaverse.AgentManager.ScriptControlChange">
3927 <summary>Raised when a script attempts to take or release specified controls for our agent</summary>
3928 </member>
3929 <member name="E:OpenMetaverse.AgentManager.CameraConstraint">
3930 <summary>Raised when the simulator detects our agent is trying to view something
3931 beyond its limits</summary>
3932 </member>
3933 <member name="E:OpenMetaverse.AgentManager.ScriptSensorReply">
3934 <summary>Raised when a script sensor reply is received from a simulator</summary>
3935 </member>
3936 <member name="E:OpenMetaverse.AgentManager.AvatarSitResponse">
3937 <summary>Raised in response to a <see cref="M:OpenMetaverse.AgentManager.RequestSit(OpenMetaverse.UUID,OpenMetaverse.Vector3)"/> request</summary>
3938 </member>
3939 <member name="E:OpenMetaverse.AgentManager.ChatSessionMemberAdded">
3940 <summary>Raised when an avatar enters a group chat session we are participating in</summary>
3941 </member>
3942 <member name="E:OpenMetaverse.AgentManager.ChatSessionMemberLeft">
3943 <summary>Raised when an agent exits a group chat session we are participating in</summary>
3944 </member>
3945 <member name="E:OpenMetaverse.AgentManager.SetDisplayNameReply">
3946 <summary>Raised when the simulator sends us data containing
3947 the details of display name change</summary>
3948 </member>
3949 <member name="E:OpenMetaverse.AgentManager.MuteListUpdated">
3950 <summary>Raised when a scripted object or agent within range sends a public message</summary>
3951 </member>
3952 <member name="P:OpenMetaverse.AgentManager.AgentID">
3953 <summary>Your (client) avatars <see cref="T:OpenMetaverse.UUID"/></summary>
3954 <remarks>"client", "agent", and "avatar" all represent the same thing</remarks>
3955 </member>
3956 <member name="P:OpenMetaverse.AgentManager.SessionID">
3957 <summary>Temporary <seealso cref="T:OpenMetaverse.UUID"/> assigned to this session, used for
3958 verifying our identity in packets</summary>
3959 </member>
3960 <member name="P:OpenMetaverse.AgentManager.SecureSessionID">
3961 <summary>Shared secret <seealso cref="T:OpenMetaverse.UUID"/> that is never sent over the wire</summary>
3962 </member>
3963 <member name="P:OpenMetaverse.AgentManager.LocalID">
3964 <summary>Your (client) avatar ID, local to the current region/sim</summary>
3965 </member>
3966 <member name="P:OpenMetaverse.AgentManager.StartLocation">
3967 <summary>Where the avatar started at login. Can be "last", "home"
3968 or a login <seealso cref="T:OpenMetaverse.URI"/></summary>
3969 </member>
3970 <member name="P:OpenMetaverse.AgentManager.AgentAccess">
3971 <summary>The access level of this agent, usually M or PG</summary>
3972 </member>
3973 <member name="P:OpenMetaverse.AgentManager.CollisionPlane">
3974 <summary>The CollisionPlane of Agent</summary>
3975 </member>
3976 <member name="P:OpenMetaverse.AgentManager.Velocity">
3977 <summary>An <seealso cref="T:OpenMetaverse.Vector3"/> representing the velocity of our agent</summary>
3978 </member>
3979 <member name="P:OpenMetaverse.AgentManager.Acceleration">
3980 <summary>An <seealso cref="T:OpenMetaverse.Vector3"/> representing the acceleration of our agent</summary>
3981 </member>
3982 <member name="P:OpenMetaverse.AgentManager.AngularVelocity">
3983 <summary>A <seealso cref="T:OpenMetaverse.Vector3"/> which specifies the angular speed, and axis about which an Avatar is rotating.</summary>
3984 </member>
3985 <member name="P:OpenMetaverse.AgentManager.HomePosition">
3986 <summary>Position avatar client will goto when login to 'home' or during
3987 teleport request to 'home' region.</summary>
3988 </member>
3989 <member name="P:OpenMetaverse.AgentManager.HomeLookAt">
3990 <summary>LookAt point saved/restored with HomePosition</summary>
3991 </member>
3992 <member name="P:OpenMetaverse.AgentManager.FirstName">
3993 <summary>Avatar First Name (i.e. Philip)</summary>
3994 </member>
3995 <member name="P:OpenMetaverse.AgentManager.LastName">
3996 <summary>Avatar Last Name (i.e. Linden)</summary>
3997 </member>
3998 <member name="P:OpenMetaverse.AgentManager.Name">
3999 <summary>Avatar Full Name (i.e. Philip Linden)</summary>
4000 </member>
4001 <member name="P:OpenMetaverse.AgentManager.Health">
4002 <summary>Gets the health of the agent</summary>
4003 </member>
4004 <member name="P:OpenMetaverse.AgentManager.Balance">
4005 <summary>Gets the current balance of the agent</summary>
4006 </member>
4007 <member name="P:OpenMetaverse.AgentManager.SittingOn">
4008 <summary>Gets the local ID of the prim the agent is sitting on,
4009 zero if the avatar is not currently sitting</summary>
4010 </member>
4011 <member name="P:OpenMetaverse.AgentManager.ActiveGroup">
4012 <summary>Gets the <seealso cref="T:OpenMetaverse.UUID"/> of the agents active group.</summary>
4013 </member>
4014 <member name="P:OpenMetaverse.AgentManager.ActiveGroupPowers">
4015 <summary>Gets the Agents powers in the currently active group</summary>
4016 </member>
4017 <member name="P:OpenMetaverse.AgentManager.TeleportMessage">
4018 <summary>Current status message for teleporting</summary>
4019 </member>
4020 <member name="P:OpenMetaverse.AgentManager.RelativePosition">
4021 <summary>Current position of the agent as a relative offset from
4022 the simulator, or the parent object if we are sitting on something</summary>
4023 </member>
4024 <member name="P:OpenMetaverse.AgentManager.RelativeRotation">
4025 <summary>Current rotation of the agent as a relative rotation from
4026 the simulator, or the parent object if we are sitting on something</summary>
4027 </member>
4028 <member name="P:OpenMetaverse.AgentManager.SimPosition">
4029 <summary>Current position of the agent in the simulator</summary>
4030 </member>
4031 <member name="P:OpenMetaverse.AgentManager.SimRotation">
2700 <summary> 4032 <summary>
4033 A <seealso cref="T:OpenMetaverse.Quaternion"/> representing the agents current rotation
2701 </summary> 4034 </summary>
2702 </member> 4035 </member>
2703 <member name="M:OpenMetaverse.ChatEventArgs.#ctor(OpenMetaverse.Simulator,System.String,OpenMetaverse.ChatAudibleLevel,OpenMetaverse.ChatType,OpenMetaverse.ChatSourceType,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3)"> 4036 <member name="P:OpenMetaverse.AgentManager.GlobalPosition">
4037 <summary>Returns the global grid position of the avatar</summary>
4038 </member>
4039 <member name="T:OpenMetaverse.AgentManager.ControlFlags">
2704 <summary> 4040 <summary>
2705 Construct a new instance of the ChatEventArgs object 4041 Used to specify movement actions for your agent
2706 </summary> 4042 </summary>
2707 <param name="simulator">Sim from which the message originates</param>
2708 <param name="message">The message sent</param>
2709 <param name="audible">The audible level of the message</param>
2710 <param name="type">The type of message sent: whisper, shout, etc</param>
2711 <param name="sourceType">The source type of the message sender</param>
2712 <param name="fromName">The name of the agent or object sending the message</param>
2713 <param name="sourceId">The ID of the agent or object sending the message</param>
2714 <param name="ownerid">The ID of the object owner, or the agent ID sending the message</param>
2715 <param name="position">The position of the agent or object sending the message</param>
2716 </member> 4043 </member>
2717 <member name="P:OpenMetaverse.ChatEventArgs.Simulator"> 4044 <member name="F:OpenMetaverse.AgentManager.ControlFlags.NONE">
2718 <summary>Get the simulator sending the message</summary> 4045 <summary>Empty flag</summary>
2719 </member> 4046 </member>
2720 <member name="P:OpenMetaverse.ChatEventArgs.Message"> 4047 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AT_POS">
2721 <summary>Get the message sent</summary> 4048 <summary>Move Forward (SL Keybinding: W/Up Arrow)</summary>
2722 </member> 4049 </member>
2723 <member name="P:OpenMetaverse.ChatEventArgs.AudibleLevel"> 4050 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG">
2724 <summary>Get the audible level of the message</summary> 4051 <summary>Move Backward (SL Keybinding: S/Down Arrow)</summary>
2725 </member> 4052 </member>
2726 <member name="P:OpenMetaverse.ChatEventArgs.Type"> 4053 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS">
2727 <summary>Get the type of message sent: whisper, shout, etc</summary> 4054 <summary>Move Left (SL Keybinding: Shift-(A/Left Arrow))</summary>
2728 </member> 4055 </member>
2729 <member name="P:OpenMetaverse.ChatEventArgs.SourceType"> 4056 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG">
2730 <summary>Get the source type of the message sender</summary> 4057 <summary>Move Right (SL Keybinding: Shift-(D/Right Arrow))</summary>
2731 </member> 4058 </member>
2732 <member name="P:OpenMetaverse.ChatEventArgs.FromName"> 4059 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_UP_POS">
2733 <summary>Get the name of the agent or object sending the message</summary> 4060 <summary>Not Flying: Jump/Flying: Move Up (SL Keybinding: E)</summary>
2734 </member> 4061 </member>
2735 <member name="P:OpenMetaverse.ChatEventArgs.SourceID"> 4062 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG">
2736 <summary>Get the ID of the agent or object sending the message</summary> 4063 <summary>Not Flying: Croutch/Flying: Move Down (SL Keybinding: C)</summary>
2737 </member> 4064 </member>
2738 <member name="P:OpenMetaverse.ChatEventArgs.OwnerID"> 4065 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_PITCH_POS">
2739 <summary>Get the ID of the object owner, or the agent ID sending the message</summary> 4066 <summary>Unused</summary>
2740 </member> 4067 </member>
2741 <member name="P:OpenMetaverse.ChatEventArgs.Position"> 4068 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_PITCH_NEG">
2742 <summary>Get the position of the agent or object sending the message</summary> 4069 <summary>Unused</summary>
2743 </member> 4070 </member>
2744 <member name="T:OpenMetaverse.ScriptDialogEventArgs"> 4071 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS">
2745 <summary>Contains the data sent when a primitive opens a dialog with this agent</summary> 4072 <summary>Unused</summary>
2746 </member> 4073 </member>
2747 <member name="M:OpenMetaverse.ScriptDialogEventArgs.#ctor(System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,System.Int32,System.Collections.Generic.List{System.String},OpenMetaverse.UUID)"> 4074 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG">
2748 <summary> 4075 <summary>Unused</summary>
2749 Construct a new instance of the ScriptDialogEventArgs
2750 </summary>
2751 <param name="message">The dialog message</param>
2752 <param name="objectName">The name of the object that sent the dialog request</param>
2753 <param name="imageID">The ID of the image to be displayed</param>
2754 <param name="objectID">The ID of the primitive sending the dialog</param>
2755 <param name="firstName">The first name of the senders owner</param>
2756 <param name="lastName">The last name of the senders owner</param>
2757 <param name="chatChannel">The communication channel the dialog was sent on</param>
2758 <param name="buttons">The string labels containing the options presented in this dialog</param>
2759 <param name="ownerID">UUID of the scritped object owner</param>
2760 </member> 4076 </member>
2761 <member name="P:OpenMetaverse.ScriptDialogEventArgs.Message"> 4077 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_AT">
2762 <summary>Get the dialog message</summary> 4078 <summary>ORed with AGENT_CONTROL_AT_* if the keyboard is being used</summary>
2763 </member> 4079 </member>
2764 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ObjectName"> 4080 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_LEFT">
2765 <summary>Get the name of the object that sent the dialog request</summary> 4081 <summary>ORed with AGENT_CONTROL_LEFT_* if the keyboard is being used</summary>
2766 </member> 4082 </member>
2767 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ImageID"> 4083 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FAST_UP">
2768 <summary>Get the ID of the image to be displayed</summary> 4084 <summary>ORed with AGENT_CONTROL_UP_* if the keyboard is being used</summary>
2769 </member> 4085 </member>
2770 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ObjectID"> 4086 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FLY">
2771 <summary>Get the ID of the primitive sending the dialog</summary> 4087 <summary>Fly</summary>
2772 </member> 4088 </member>
2773 <member name="P:OpenMetaverse.ScriptDialogEventArgs.FirstName"> 4089 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_STOP">
2774 <summary>Get the first name of the senders owner</summary> 4090 <summary></summary>
2775 </member> 4091 </member>
2776 <member name="P:OpenMetaverse.ScriptDialogEventArgs.LastName"> 4092 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM">
2777 <summary>Get the last name of the senders owner</summary> 4093 <summary>Finish our current animation</summary>
2778 </member> 4094 </member>
2779 <member name="P:OpenMetaverse.ScriptDialogEventArgs.Channel"> 4095 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP">
2780 <summary>Get the communication channel the dialog was sent on, responses 4096 <summary>Stand up from the ground or a prim seat</summary>
2781 should also send responses on this same channel</summary>
2782 </member> 4097 </member>
2783 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ButtonLabels"> 4098 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND">
2784 <summary>Get the string labels containing the options presented in this dialog</summary> 4099 <summary>Sit on the ground at our current location</summary>
2785 </member> 4100 </member>
2786 <member name="P:OpenMetaverse.ScriptDialogEventArgs.OwnerID"> 4101 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK">
2787 <summary>UUID of the scritped object owner</summary> 4102 <summary>Whether mouselook is currently enabled</summary>
2788 </member> 4103 </member>
2789 <member name="T:OpenMetaverse.ScriptQuestionEventArgs"> 4104 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS">
2790 <summary>Contains the data sent when a primitive requests debit or other permissions 4105 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2791 requesting a YES or NO answer</summary>
2792 </member> 4106 </member>
2793 <member name="M:OpenMetaverse.ScriptQuestionEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.ScriptPermission)"> 4107 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG">
2794 <summary> 4108 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2795 Construct a new instance of the ScriptQuestionEventArgs
2796 </summary>
2797 <param name="simulator">The simulator containing the object sending the request</param>
2798 <param name="taskID">The ID of the script making the request</param>
2799 <param name="itemID">The ID of the primitive containing the script making the request</param>
2800 <param name="objectName">The name of the primitive making the request</param>
2801 <param name="objectOwner">The name of the owner of the object making the request</param>
2802 <param name="questions">The permissions being requested</param>
2803 </member> 4109 </member>
2804 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.Simulator"> 4110 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS">
2805 <summary>Get the simulator containing the object sending the request</summary> 4111 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2806 </member> 4112 </member>
2807 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.TaskID"> 4113 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG">
2808 <summary>Get the ID of the script making the request</summary> 4114 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2809 </member> 4115 </member>
2810 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ItemID"> 4116 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS">
2811 <summary>Get the ID of the primitive containing the script making the request</summary> 4117 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2812 </member> 4118 </member>
2813 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ObjectName"> 4119 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG">
2814 <summary>Get the name of the primitive making the request</summary> 4120 <summary>Legacy, used if a key was pressed for less than a certain amount of time</summary>
2815 </member> 4121 </member>
2816 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ObjectOwnerName"> 4122 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT">
2817 <summary>Get the name of the owner of the object making the request</summary> 4123 <summary></summary>
2818 </member> 4124 </member>
2819 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.Questions"> 4125 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT">
2820 <summary>Get the permissions being requested</summary> 4126 <summary></summary>
2821 </member> 4127 </member>
2822 <member name="T:OpenMetaverse.LoadUrlEventArgs"> 4128 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_AWAY">
2823 <summary>Contains the data sent when a primitive sends a request 4129 <summary>Set when the avatar is idled or set to away. Note that the away animation is
2824 to an agent to open the specified URL</summary> 4130 activated separately from setting this flag</summary>
2825 </member> 4131 </member>
2826 <member name="M:OpenMetaverse.LoadUrlEventArgs.#ctor(System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.String,System.String)"> 4132 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN">
2827 <summary> 4133 <summary></summary>
2828 Construct a new instance of the LoadUrlEventArgs
2829 </summary>
2830 <param name="objectName">The name of the object sending the request</param>
2831 <param name="objectID">The ID of the object sending the request</param>
2832 <param name="ownerID">The ID of the owner of the object sending the request</param>
2833 <param name="ownerIsGroup">True if the object is owned by a group</param>
2834 <param name="message">The message sent with the request</param>
2835 <param name="URL">The URL the object sent</param>
2836 </member> 4134 </member>
2837 <member name="P:OpenMetaverse.LoadUrlEventArgs.ObjectName"> 4135 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP">
2838 <summary>Get the name of the object sending the request</summary> 4136 <summary></summary>
2839 </member> 4137 </member>
2840 <member name="P:OpenMetaverse.LoadUrlEventArgs.ObjectID"> 4138 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN">
2841 <summary>Get the ID of the object sending the request</summary> 4139 <summary></summary>
2842 </member> 4140 </member>
2843 <member name="P:OpenMetaverse.LoadUrlEventArgs.OwnerID"> 4141 <member name="F:OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP">
2844 <summary>Get the ID of the owner of the object sending the request</summary> 4142 <summary></summary>
2845 </member> 4143 </member>
2846 <member name="P:OpenMetaverse.LoadUrlEventArgs.OwnerIsGroup"> 4144 <member name="T:OpenMetaverse.AgentManager.AgentMovement">
2847 <summary>True if the object is owned by a group</summary> 4145 <summary>
4146 Agent movement and camera control
4147
4148 Agent movement is controlled by setting specific <seealso cref="T:AgentManager.ControlFlags"/>
4149 After the control flags are set, An AgentUpdate is required to update the simulator of the specified flags
4150 This is most easily accomplished by setting one or more of the AgentMovement properties
4151
4152 Movement of an avatar is always based on a compass direction, for example AtPos will move the
4153 agent from West to East or forward on the X Axis, AtNeg will of course move agent from
4154 East to West or backward on the X Axis, LeftPos will be South to North or forward on the Y Axis
4155 The Z axis is Up, finer grained control of movements can be done using the Nudge properties
4156 </summary>
2848 </member> 4157 </member>
2849 <member name="P:OpenMetaverse.LoadUrlEventArgs.Message"> 4158 <member name="F:OpenMetaverse.AgentManager.AgentMovement.Camera">
2850 <summary>Get the message sent with the request</summary> 4159 <summary>Agent camera controls</summary>
2851 </member> 4160 </member>
2852 <member name="P:OpenMetaverse.LoadUrlEventArgs.URL"> 4161 <member name="F:OpenMetaverse.AgentManager.AgentMovement.Flags">
2853 <summary>Get the URL the object sent</summary> 4162 <summary>Currently only used for hiding your group title</summary>
2854 </member> 4163 </member>
2855 <member name="T:OpenMetaverse.InstantMessageEventArgs"> 4164 <member name="F:OpenMetaverse.AgentManager.AgentMovement.State">
2856 <summary>The date received from an ImprovedInstantMessage</summary> 4165 <summary>Action state of the avatar, which can currently be
4166 typing and editing</summary>
2857 </member> 4167 </member>
2858 <member name="M:OpenMetaverse.InstantMessageEventArgs.#ctor(OpenMetaverse.InstantMessage,OpenMetaverse.Simulator)"> 4168 <member name="F:OpenMetaverse.AgentManager.AgentMovement.BodyRotation">
4169 <summary></summary>
4170 </member>
4171 <member name="F:OpenMetaverse.AgentManager.AgentMovement.HeadRotation">
4172 <summary></summary>
4173 </member>
4174 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastBodyRotation">
4175 <summary></summary>
4176 </member>
4177 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastHeadRotation">
4178 <summary></summary>
4179 </member>
4180 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraCenter">
4181 <summary></summary>
4182 </member>
4183 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraXAxis">
4184 <summary></summary>
4185 </member>
4186 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraYAxis">
4187 <summary></summary>
4188 </member>
4189 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastCameraZAxis">
4190 <summary></summary>
4191 </member>
4192 <member name="F:OpenMetaverse.AgentManager.AgentMovement.LastFar">
4193 <summary></summary>
4194 </member>
4195 <member name="F:OpenMetaverse.AgentManager.AgentMovement.updateTimer">
4196 <summary>Timer for sending AgentUpdate packets</summary>
4197 </member>
4198 <member name="M:OpenMetaverse.AgentManager.AgentMovement.#ctor(OpenMetaverse.GridClient)">
4199 <summary>Default constructor</summary>
4200 </member>
4201 <member name="M:OpenMetaverse.AgentManager.AgentMovement.UpdateFromHeading(System.Double,System.Boolean)">
2859 <summary> 4202 <summary>
2860 Construct a new instance of the InstantMessageEventArgs object 4203 Send an AgentUpdate with the camera set at the current agent
4204 position and pointing towards the heading specified
2861 </summary> 4205 </summary>
2862 <param name="im">the InstantMessage object</param> 4206 <param name="heading">Camera rotation in radians</param>
2863 <param name="simulator">the simulator where the InstantMessage origniated</param> 4207 <param name="reliable">Whether to send the AgentUpdate reliable
4208 or not</param>
2864 </member> 4209 </member>
2865 <member name="P:OpenMetaverse.InstantMessageEventArgs.IM"> 4210 <member name="M:OpenMetaverse.AgentManager.AgentMovement.TurnToward(OpenMetaverse.Vector3)">
2866 <summary>Get the InstantMessage object</summary> 4211 <summary>
4212 Rotates the avatar body and camera toward a target position.
4213 This will also anchor the camera position on the avatar
4214 </summary>
4215 <param name="target">Region coordinates to turn toward</param>
2867 </member> 4216 </member>
2868 <member name="P:OpenMetaverse.InstantMessageEventArgs.Simulator"> 4217 <member name="M:OpenMetaverse.AgentManager.AgentMovement.TurnToward(OpenMetaverse.Vector3,System.Boolean)">
2869 <summary>Get the simulator where the InstantMessage origniated</summary> 4218 <summary>
4219 Rotates the avatar body and camera toward a target position.
4220 This will also anchor the camera position on the avatar
4221 </summary>
4222 <param name="target">Region coordinates to turn toward</param>
4223 <param name="sendUpdate">whether to send update or not</param>
2870 </member> 4224 </member>
2871 <member name="T:OpenMetaverse.BalanceEventArgs"> 4225 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate">
2872 <summary>Contains the currency balance</summary> 4226 <summary>
4227 Send new AgentUpdate packet to update our current camera
4228 position and rotation
4229 </summary>
2873 </member> 4230 </member>
2874 <member name="M:OpenMetaverse.BalanceEventArgs.#ctor(System.Int32)"> 4231 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate(System.Boolean)">
2875 <summary> 4232 <summary>
2876 Construct a new BalanceEventArgs object 4233 Send new AgentUpdate packet to update our current camera
4234 position and rotation
2877 </summary> 4235 </summary>
2878 <param name="balance">The currenct balance</param> 4236 <param name="reliable">Whether to require server acknowledgement
4237 of this packet</param>
2879 </member> 4238 </member>
2880 <member name="P:OpenMetaverse.BalanceEventArgs.Balance"> 4239 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendUpdate(System.Boolean,OpenMetaverse.Simulator)">
2881 <summary> 4240 <summary>
2882 Get the currenct balance 4241 Send new AgentUpdate packet to update our current camera
4242 position and rotation
2883 </summary> 4243 </summary>
4244 <param name="reliable">Whether to require server acknowledgement
4245 of this packet</param>
4246 <param name="simulator">Simulator to send the update to</param>
2884 </member> 4247 </member>
2885 <member name="T:OpenMetaverse.MoneyBalanceReplyEventArgs"> 4248 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SendManualUpdate(OpenMetaverse.AgentManager.ControlFlags,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Quaternion,System.Single,OpenMetaverse.AgentFlags,OpenMetaverse.AgentState,System.Boolean)">
2886 <summary>Contains the transaction summary when an item is purchased, 4249 <summary>
2887 money is given, or land is purchased</summary> 4250 Builds an AgentUpdate packet entirely from parameters. This
4251 will not touch the state of Self.Movement or
4252 Self.Movement.Camera in any way
4253 </summary>
4254 <param name="controlFlags"></param>
4255 <param name="position"></param>
4256 <param name="forwardAxis"></param>
4257 <param name="leftAxis"></param>
4258 <param name="upAxis"></param>
4259 <param name="bodyRotation"></param>
4260 <param name="headRotation"></param>
4261 <param name="farClip"></param>
4262 <param name="reliable"></param>
4263 <param name="flags"></param>
4264 <param name="state"></param>
2888 </member> 4265 </member>
2889 <member name="M:OpenMetaverse.MoneyBalanceReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,System.Int32,System.Int32,System.Int32,System.String,OpenMetaverse.TransactionInfo)"> 4266 <member name="M:OpenMetaverse.AgentManager.AgentMovement.SetFOVVerticalAngle(System.Single)">
2890 <summary> 4267 <summary>
2891 Construct a new instance of the MoneyBalanceReplyEventArgs object 4268 Sends update of Field of Vision vertical angle to the simulator
2892 </summary> 4269 </summary>
2893 <param name="transactionID">The ID of the transaction</param> 4270 <param name="angle">Angle in radians</param>
2894 <param name="transactionSuccess">True of the transaction was successful</param>
2895 <param name="balance">The current currency balance</param>
2896 <param name="metersCredit">The meters credited</param>
2897 <param name="metersCommitted">The meters comitted</param>
2898 <param name="description">A brief description of the transaction</param>
2899 </member> 4271 </member>
2900 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.TransactionID"> 4272 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AtPos">
2901 <summary>Get the ID of the transaction</summary> 4273 <summary>Move agent positive along the X axis</summary>
2902 </member> 4274 </member>
2903 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Success"> 4275 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AtNeg">
2904 <summary>True of the transaction was successful</summary> 4276 <summary>Move agent negative along the X axis</summary>
2905 </member> 4277 </member>
2906 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Balance"> 4278 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LeftPos">
2907 <summary>Get the remaining currency balance</summary> 4279 <summary>Move agent positive along the Y axis</summary>
2908 </member> 4280 </member>
2909 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.MetersCredit"> 4281 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LeftNeg">
2910 <summary>Get the meters credited</summary> 4282 <summary>Move agent negative along the Y axis</summary>
2911 </member> 4283 </member>
2912 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.MetersCommitted"> 4284 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpPos">
2913 <summary>Get the meters comitted</summary> 4285 <summary>Move agent positive along the Z axis</summary>
2914 </member> 4286 </member>
2915 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Description"> 4287 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpNeg">
2916 <summary>Get the description of the transaction</summary> 4288 <summary>Move agent negative along the Z axis</summary>
2917 </member> 4289 </member>
2918 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.TransactionInfo"> 4290 <member name="P:OpenMetaverse.AgentManager.AgentMovement.PitchPos">
2919 <summary>Detailed transaction information</summary> 4291 <summary></summary>
2920 </member> 4292 </member>
2921 <member name="T:OpenMetaverse.AgentDataReplyEventArgs"> 4293 <member name="P:OpenMetaverse.AgentManager.AgentMovement.PitchNeg">
2922 <summary>Data sent from the simulator containing information about your agent and active group information</summary> 4294 <summary></summary>
2923 </member> 4295 </member>
2924 <member name="M:OpenMetaverse.AgentDataReplyEventArgs.#ctor(System.String,System.String,OpenMetaverse.UUID,System.String,OpenMetaverse.GroupPowers,System.String)"> 4296 <member name="P:OpenMetaverse.AgentManager.AgentMovement.YawPos">
2925 <summary> 4297 <summary></summary>
2926 Construct a new instance of the AgentDataReplyEventArgs object
2927 </summary>
2928 <param name="firstName">The agents first name</param>
2929 <param name="lastName">The agents last name</param>
2930 <param name="activeGroupID">The agents active group ID</param>
2931 <param name="groupTitle">The group title of the agents active group</param>
2932 <param name="groupPowers">The combined group powers the agent has in the active group</param>
2933 <param name="groupName">The name of the group the agent has currently active</param>
2934 </member> 4298 </member>
2935 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.FirstName"> 4299 <member name="P:OpenMetaverse.AgentManager.AgentMovement.YawNeg">
2936 <summary>Get the agents first name</summary> 4300 <summary></summary>
2937 </member> 4301 </member>
2938 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.LastName"> 4302 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastAt">
2939 <summary>Get the agents last name</summary> 4303 <summary></summary>
2940 </member> 4304 </member>
2941 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.ActiveGroupID"> 4305 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastLeft">
2942 <summary>Get the active group ID of your agent</summary> 4306 <summary></summary>
2943 </member> 4307 </member>
2944 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupTitle"> 4308 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FastUp">
2945 <summary>Get the active groups title of your agent</summary> 4309 <summary></summary>
2946 </member> 4310 </member>
2947 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupPowers"> 4311 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Fly">
2948 <summary>Get the combined group powers of your agent</summary> 4312 <summary>Causes simulator to make agent fly</summary>
2949 </member> 4313 </member>
2950 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupName"> 4314 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Stop">
2951 <summary>Get the active group name of your agent</summary> 4315 <summary>Stop movement</summary>
2952 </member> 4316 </member>
2953 <member name="T:OpenMetaverse.AnimationsChangedEventArgs"> 4317 <member name="P:OpenMetaverse.AgentManager.AgentMovement.FinishAnim">
2954 <summary>Data sent by the simulator to indicate the active/changed animations 4318 <summary>Finish animation</summary>
2955 applied to your agent</summary>
2956 </member> 4319 </member>
2957 <member name="M:OpenMetaverse.AnimationsChangedEventArgs.#ctor(OpenMetaverse.InternalDictionary{OpenMetaverse.UUID,System.Int32})"> 4320 <member name="P:OpenMetaverse.AgentManager.AgentMovement.StandUp">
4321 <summary>Stand up from a sit</summary>
4322 </member>
4323 <member name="P:OpenMetaverse.AgentManager.AgentMovement.SitOnGround">
4324 <summary>Tells simulator to sit agent on ground</summary>
4325 </member>
4326 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Mouselook">
4327 <summary>Place agent into mouselook mode</summary>
4328 </member>
4329 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeAtPos">
4330 <summary>Nudge agent positive along the X axis</summary>
4331 </member>
4332 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeAtNeg">
4333 <summary>Nudge agent negative along the X axis</summary>
4334 </member>
4335 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeLeftPos">
4336 <summary>Nudge agent positive along the Y axis</summary>
4337 </member>
4338 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeLeftNeg">
4339 <summary>Nudge agent negative along the Y axis</summary>
4340 </member>
4341 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeUpPos">
4342 <summary>Nudge agent positive along the Z axis</summary>
4343 </member>
4344 <member name="P:OpenMetaverse.AgentManager.AgentMovement.NudgeUpNeg">
4345 <summary>Nudge agent negative along the Z axis</summary>
4346 </member>
4347 <member name="P:OpenMetaverse.AgentManager.AgentMovement.TurnLeft">
4348 <summary></summary>
4349 </member>
4350 <member name="P:OpenMetaverse.AgentManager.AgentMovement.TurnRight">
4351 <summary></summary>
4352 </member>
4353 <member name="P:OpenMetaverse.AgentManager.AgentMovement.Away">
4354 <summary>Tell simulator to mark agent as away</summary>
4355 </member>
4356 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LButtonDown">
4357 <summary></summary>
4358 </member>
4359 <member name="P:OpenMetaverse.AgentManager.AgentMovement.LButtonUp">
4360 <summary></summary>
4361 </member>
4362 <member name="P:OpenMetaverse.AgentManager.AgentMovement.MLButtonDown">
4363 <summary></summary>
4364 </member>
4365 <member name="P:OpenMetaverse.AgentManager.AgentMovement.MLButtonUp">
4366 <summary></summary>
4367 </member>
4368 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AlwaysRun">
2958 <summary> 4369 <summary>
2959 Construct a new instance of the AnimationsChangedEventArgs class 4370 Returns "always run" value, or changes it by sending a SetAlwaysRunPacket
2960 </summary> 4371 </summary>
2961 <param name="agentAnimations">The dictionary that contains the changed animations</param>
2962 </member> 4372 </member>
2963 <member name="P:OpenMetaverse.AnimationsChangedEventArgs.Animations"> 4373 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentControls">
2964 <summary>Get the dictionary that contains the changed animations</summary> 4374 <summary>The current value of the agent control flags</summary>
2965 </member> 4375 </member>
2966 <member name="T:OpenMetaverse.MeanCollisionEventArgs"> 4376 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpdateInterval">
4377 <summary>Gets or sets the interval in milliseconds at which
4378 AgentUpdate packets are sent to the current simulator. Setting
4379 this to a non-zero value will also enable the packet sending if
4380 it was previously off, and setting it to zero will disable</summary>
4381 </member>
4382 <member name="P:OpenMetaverse.AgentManager.AgentMovement.UpdateEnabled">
4383 <summary>Gets or sets whether AgentUpdate packets are sent to
4384 the current simulator</summary>
4385 </member>
4386 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AutoResetControls">
4387 <summary>Reset movement controls every time we send an update</summary>
4388 </member>
4389 <member name="T:OpenMetaverse.AgentManager.AgentMovement.AgentCamera">
2967 <summary> 4390 <summary>
2968 Data sent from a simulator indicating a collision with your agent 4391 Camera controls for the agent, mostly a thin wrapper around
4392 CoordinateFrame. This class is only responsible for state
4393 tracking and math, it does not send any packets
2969 </summary> 4394 </summary>
2970 </member> 4395 </member>
2971 <member name="M:OpenMetaverse.MeanCollisionEventArgs.#ctor(OpenMetaverse.MeanCollisionType,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,System.DateTime)"> 4396 <member name="F:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Far">
4397 <summary></summary>
4398 </member>
4399 <member name="F:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Frame">
4400 <summary>The camera is a local frame of reference inside of
4401 the larger grid space. This is where the math happens</summary>
4402 </member>
4403 <member name="M:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.#ctor">
2972 <summary> 4404 <summary>
2973 Construct a new instance of the MeanCollisionEventArgs class 4405 Default constructor
2974 </summary> 4406 </summary>
2975 <param name="type">The type of collision that occurred</param>
2976 <param name="perp">The ID of the agent or object that perpetrated the agression</param>
2977 <param name="victim">The ID of the Victim</param>
2978 <param name="magnitude">The strength of the collision</param>
2979 <param name="time">The Time the collision occurred</param>
2980 </member> 4407 </member>
2981 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Type"> 4408 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.Position">
2982 <summary>Get the Type of collision</summary> 4409 <summary></summary>
2983 </member> 4410 </member>
2984 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Aggressor"> 4411 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.AtAxis">
2985 <summary>Get the ID of the agent or object that collided with your agent</summary> 4412 <summary></summary>
2986 </member> 4413 </member>
2987 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Victim"> 4414 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.LeftAxis">
2988 <summary>Get the ID of the agent that was attacked</summary> 4415 <summary></summary>
2989 </member> 4416 </member>
2990 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Magnitude"> 4417 <member name="P:OpenMetaverse.AgentManager.AgentMovement.AgentCamera.UpAxis">
2991 <summary>A value indicating the strength of the collision</summary> 4418 <summary></summary>
2992 </member> 4419 </member>
2993 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Time"> 4420 <member name="T:OpenMetaverse.AgentManager.AttachmentResourcesCallback">
2994 <summary>Get the time the collision occurred</summary> 4421 <summary>
4422 Called once attachment resource usage information has been collected
4423 </summary>
4424 <param name="success">Indicates if operation was successfull</param>
4425 <param name="info">Attachment resource usage information</param>
2995 </member> 4426 </member>
2996 <member name="T:OpenMetaverse.RegionCrossedEventArgs"> 4427 <member name="T:OpenMetaverse.Assets.AssetClothing">
2997 <summary>Data sent to your agent when it crosses region boundaries</summary> 4428 <summary>
4429 Represents an <seealso cref="T:OpenMetaverse.Assets.AssetWearable"/> that can be worn on an avatar
4430 such as a Shirt, Pants, etc.
4431 </summary>
2998 </member> 4432 </member>
2999 <member name="M:OpenMetaverse.RegionCrossedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Simulator)"> 4433 <member name="T:OpenMetaverse.Assets.AssetWearable">
3000 <summary> 4434 <summary>
3001 Construct a new instance of the RegionCrossedEventArgs class 4435 Represents a Wearable Asset, Clothing, Hair, Skin, Etc
3002 </summary> 4436 </summary>
3003 <param name="oldSim">The simulator your agent just left</param>
3004 <param name="newSim">The simulator your agent is now in</param>
3005 </member> 4437 </member>
3006 <member name="P:OpenMetaverse.RegionCrossedEventArgs.OldSimulator"> 4438 <member name="F:OpenMetaverse.Assets.AssetWearable.Name">
3007 <summary>Get the simulator your agent just left</summary> 4439 <summary>A string containing the name of the asset</summary>
3008 </member> 4440 </member>
3009 <member name="P:OpenMetaverse.RegionCrossedEventArgs.NewSimulator"> 4441 <member name="F:OpenMetaverse.Assets.AssetWearable.Description">
3010 <summary>Get the simulator your agent is now in</summary> 4442 <summary>A string containing a short description of the asset</summary>
3011 </member> 4443 </member>
3012 <member name="T:OpenMetaverse.GroupChatJoinedEventArgs"> 4444 <member name="F:OpenMetaverse.Assets.AssetWearable.WearableType">
3013 <summary>Data sent from the simulator when your agent joins a group chat session</summary> 4445 <summary>The Assets WearableType</summary>
3014 </member> 4446 </member>
3015 <member name="M:OpenMetaverse.GroupChatJoinedEventArgs.#ctor(OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,System.Boolean)"> 4447 <member name="F:OpenMetaverse.Assets.AssetWearable.ForSale">
4448 <summary>The For-Sale status of the object</summary>
4449 </member>
4450 <member name="F:OpenMetaverse.Assets.AssetWearable.SalePrice">
4451 <summary>An Integer representing the purchase price of the asset</summary>
4452 </member>
4453 <member name="F:OpenMetaverse.Assets.AssetWearable.Creator">
4454 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the assets creator</summary>
4455 </member>
4456 <member name="F:OpenMetaverse.Assets.AssetWearable.Owner">
4457 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the assets current owner</summary>
4458 </member>
4459 <member name="F:OpenMetaverse.Assets.AssetWearable.LastOwner">
4460 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the assets prior owner</summary>
4461 </member>
4462 <member name="F:OpenMetaverse.Assets.AssetWearable.Group">
4463 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the Group this asset is set to</summary>
4464 </member>
4465 <member name="F:OpenMetaverse.Assets.AssetWearable.GroupOwned">
4466 <summary>True if the asset is owned by a <seealso cref="F:OpenMetaverse.Assets.AssetWearable.Group"/></summary>
4467 </member>
4468 <member name="F:OpenMetaverse.Assets.AssetWearable.Permissions">
4469 <summary>The Permissions mask of the asset</summary>
4470 </member>
4471 <member name="F:OpenMetaverse.Assets.AssetWearable.Params">
4472 <summary>A Dictionary containing Key/Value pairs of the objects parameters</summary>
4473 </member>
4474 <member name="F:OpenMetaverse.Assets.AssetWearable.Textures">
4475 <summary>A Dictionary containing Key/Value pairs where the Key is the textures Index and the Value is the Textures <seealso cref="T:OpenMetaverse.UUID"/></summary>
4476 </member>
4477 <member name="M:OpenMetaverse.Assets.AssetWearable.#ctor">
4478 <summary>Initializes a new instance of an AssetWearable object</summary>
4479 </member>
4480 <member name="M:OpenMetaverse.Assets.AssetWearable.#ctor(OpenMetaverse.UUID,System.Byte[])">
4481 <summary>Initializes a new instance of an AssetWearable object with parameters</summary>
4482 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
4483 <param name="assetData">A byte array containing the raw asset data</param>
4484 </member>
4485 <member name="M:OpenMetaverse.Assets.AssetWearable.Decode">
3016 <summary> 4486 <summary>
3017 Construct a new instance of the GroupChatJoinedEventArgs class 4487 Decode an assets byte encoded data to a string
3018 </summary> 4488 </summary>
3019 <param name="groupChatSessionID">The ID of the session</param> 4489 <returns>true if the asset data was decoded successfully</returns>
3020 <param name="sessionName">The name of the session</param>
3021 <param name="tmpSessionID">A temporary session id used for establishing new sessions</param>
3022 <param name="success">True of your agent successfully joined the session</param>
3023 </member>
3024 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.SessionID">
3025 <summary>Get the ID of the group chat session</summary>
3026 </member> 4490 </member>
3027 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.SessionName"> 4491 <member name="M:OpenMetaverse.Assets.AssetWearable.Encode">
3028 <summary>Get the name of the session</summary> 4492 <summary>
4493 Encode the assets string represantion into a format consumable by the asset server
4494 </summary>
3029 </member> 4495 </member>
3030 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.TmpSessionID"> 4496 <member name="M:OpenMetaverse.Assets.AssetClothing.#ctor">
3031 <summary>Get the temporary session ID used for establishing new sessions</summary> 4497 <summary>Initializes a new instance of an AssetScriptBinary object</summary>
3032 </member> 4498 </member>
3033 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.Success"> 4499 <member name="M:OpenMetaverse.Assets.AssetClothing.#ctor(OpenMetaverse.UUID,System.Byte[])">
3034 <summary>True if your agent successfully joined the session</summary> 4500 <summary>Initializes a new instance of an AssetScriptBinary object with parameters</summary>
4501 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
4502 <param name="assetData">A byte array containing the raw asset data</param>
3035 </member> 4503 </member>
3036 <member name="T:OpenMetaverse.AlertMessageEventArgs"> 4504 <member name="P:OpenMetaverse.Assets.AssetClothing.AssetType">
3037 <summary>Data sent by the simulator containing urgent messages</summary> 4505 <summary>Override the base classes AssetType</summary>
3038 </member> 4506 </member>
3039 <member name="M:OpenMetaverse.AlertMessageEventArgs.#ctor(System.String)"> 4507 <member name="T:OpenMetaverse.PacketFrequency">
3040 <summary> 4508 <summary>
3041 Construct a new instance of the AlertMessageEventArgs class 4509
3042 </summary> 4510 </summary>
3043 <param name="message">The alert message</param>
3044 </member> 4511 </member>
3045 <member name="P:OpenMetaverse.AlertMessageEventArgs.Message"> 4512 <member name="F:OpenMetaverse.PacketFrequency.Low">
3046 <summary>Get the alert message</summary> 4513 <summary></summary>
3047 </member> 4514 </member>
3048 <member name="T:OpenMetaverse.ScriptControlEventArgs"> 4515 <member name="F:OpenMetaverse.PacketFrequency.Medium">
3049 <summary>Data sent by a script requesting to take or release specified controls to your agent</summary> 4516 <summary></summary>
3050 </member> 4517 </member>
3051 <member name="M:OpenMetaverse.ScriptControlEventArgs.#ctor(OpenMetaverse.ScriptControlChange,System.Boolean,System.Boolean)"> 4518 <member name="F:OpenMetaverse.PacketFrequency.High">
4519 <summary></summary>
4520 </member>
4521 <member name="T:OpenMetaverse.Packets.MalformedDataException">
3052 <summary> 4522 <summary>
3053 Construct a new instance of the ScriptControlEventArgs class 4523 Thrown when a packet could not be successfully deserialized
3054 </summary> 4524 </summary>
3055 <param name="controls">The controls the script is attempting to take or release to the agent</param>
3056 <param name="pass">True if the script is passing controls back to the agent</param>
3057 <param name="take">True if the script is requesting controls be released to the script</param>
3058 </member> 4525 </member>
3059 <member name="P:OpenMetaverse.ScriptControlEventArgs.Controls"> 4526 <member name="M:OpenMetaverse.Packets.MalformedDataException.#ctor">
3060 <summary>Get the controls the script is attempting to take or release to the agent</summary> 4527 <summary>
4528 Default constructor
4529 </summary>
3061 </member> 4530 </member>
3062 <member name="P:OpenMetaverse.ScriptControlEventArgs.Pass"> 4531 <member name="M:OpenMetaverse.Packets.MalformedDataException.#ctor(System.String)">
3063 <summary>True if the script is passing controls back to the agent</summary> 4532 <summary>
4533 Constructor that takes an additional error message
4534 </summary>
4535 <param name="Message">An error message to attach to this exception</param>
3064 </member> 4536 </member>
3065 <member name="P:OpenMetaverse.ScriptControlEventArgs.Take"> 4537 <member name="T:OpenMetaverse.Packets.Header">
3066 <summary>True if the script is requesting controls be released to the script</summary> 4538 <summary>
4539 The header of a message template packet. Holds packet flags, sequence
4540 number, packet ID, and any ACKs that will be appended at the end of
4541 the packet
4542 </summary>
3067 </member> 4543 </member>
3068 <member name="T:OpenMetaverse.CameraConstraintEventArgs"> 4544 <member name="M:OpenMetaverse.Packets.Header.AcksToBytes(System.Byte[],System.Int32@)">
3069 <summary> 4545 <summary>
3070 Data sent from the simulator to an agent to indicate its view limits 4546 Convert the AckList to a byte array, used for packet serializing
3071 </summary> 4547 </summary>
4548 <param name="bytes">Reference to the target byte array</param>
4549 <param name="i">Beginning position to start writing to in the byte
4550 array, will be updated with the ending position of the ACK list</param>
3072 </member> 4551 </member>
3073 <member name="M:OpenMetaverse.CameraConstraintEventArgs.#ctor(OpenMetaverse.Vector4)"> 4552 <member name="M:OpenMetaverse.Packets.Header.BuildHeader(System.Byte[],System.Int32@,System.Int32@)">
3074 <summary> 4553 <summary>
3075 Construct a new instance of the CameraConstraintEventArgs class 4554
3076 </summary> 4555 </summary>
3077 <param name="collidePlane">The collision plane</param> 4556 <param name="bytes"></param>
4557 <param name="pos"></param>
4558 <param name="packetEnd"></param>
4559 <returns></returns>
3078 </member> 4560 </member>
3079 <member name="P:OpenMetaverse.CameraConstraintEventArgs.CollidePlane"> 4561 <member name="M:OpenMetaverse.Packets.Header.CreateAckList(OpenMetaverse.Packets.Header@,System.Byte[],System.Int32@)">
3080 <summary>Get the collision plane</summary> 4562 <summary>
4563
4564 </summary>
4565 <param name="header"></param>
4566 <param name="bytes"></param>
4567 <param name="packetEnd"></param>
3081 </member> 4568 </member>
3082 <member name="T:OpenMetaverse.ScriptSensorReplyEventArgs"> 4569 <member name="T:OpenMetaverse.Packets.PacketBlock">
3083 <summary> 4570 <summary>
3084 Data containing script sensor requests which allow an agent to know the specific details 4571 A block of data in a packet. Packets are composed of one or more blocks,
3085 of a primitive sending script sensor requests 4572 each block containing one or more fields
3086 </summary> 4573 </summary>
3087 </member> 4574 </member>
3088 <member name="M:OpenMetaverse.ScriptSensorReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3,System.Single,OpenMetaverse.Quaternion,OpenMetaverse.ScriptSensorTypeFlags,OpenMetaverse.Vector3)"> 4575 <member name="M:OpenMetaverse.Packets.PacketBlock.FromBytes(System.Byte[],System.Int32@)">
3089 <summary> 4576 <summary>
3090 Construct a new instance of the ScriptSensorReplyEventArgs 4577 Create a block from a byte array
3091 </summary> 4578 </summary>
3092 <param name="requestorID">The ID of the primitive sending the sensor</param> 4579 <param name="bytes">Byte array containing the serialized block</param>
3093 <param name="groupID">The ID of the group associated with the primitive</param> 4580 <param name="i">Starting position of the block in the byte array.
3094 <param name="name">The name of the primitive sending the sensor</param> 4581 This will point to the data after the end of the block when the
3095 <param name="objectID">The ID of the primitive sending the sensor</param> 4582 call returns</param>
3096 <param name="ownerID">The ID of the owner of the primitive sending the sensor</param>
3097 <param name="position">The position of the primitive sending the sensor</param>
3098 <param name="range">The range the primitive specified to scan</param>
3099 <param name="rotation">The rotation of the primitive sending the sensor</param>
3100 <param name="type">The type of sensor the primitive sent</param>
3101 <param name="velocity">The velocity of the primitive sending the sensor</param>
3102 </member> 4583 </member>
3103 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.RequestorID"> 4584 <member name="M:OpenMetaverse.Packets.PacketBlock.ToBytes(System.Byte[],System.Int32@)">
3104 <summary>Get the ID of the primitive sending the sensor</summary> 4585 <summary>
4586 Serialize this block into a byte array
4587 </summary>
4588 <param name="bytes">Byte array to serialize this block into</param>
4589 <param name="i">Starting position in the byte array to serialize to.
4590 This will point to the position directly after the end of the
4591 serialized block when the call returns</param>
3105 </member> 4592 </member>
3106 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.GroupID"> 4593 <member name="P:OpenMetaverse.Packets.PacketBlock.Length">
3107 <summary>Get the ID of the group associated with the primitive</summary> 4594 <summary>Current length of the data in this packet</summary>
3108 </member> 4595 </member>
3109 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Name"> 4596 <member name="F:OpenMetaverse.Packets.PacketType.Default">
3110 <summary>Get the name of the primitive sending the sensor</summary> 4597 <summary>A generic value, not an actual packet type</summary>
3111 </member> 4598 </member>
3112 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.ObjectID"> 4599 <member name="M:OpenMetaverse.Packets.Packet.BuildPacket(System.String,OpenMetaverse.StructuredData.OSDMap)">
3113 <summary>Get the ID of the primitive sending the sensor</summary> 4600 <summary>
4601 Attempts to convert an LLSD structure to a known Packet type
4602 </summary>
4603 <param name="capsEventName">Event name, this must match an actual
4604 packet name for a Packet to be successfully built</param>
4605 <param name="body">LLSD to convert to a Packet</param>
4606 <returns>A Packet on success, otherwise null</returns>
3114 </member> 4607 </member>
3115 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.OwnerID"> 4608 <member name="T:OpenMetaverse.Packets.TestMessagePacket">
3116 <summary>Get the ID of the owner of the primitive sending the sensor</summary> 4609 <exclude/>
3117 </member> 4610 </member>
3118 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Position"> 4611 <member name="T:OpenMetaverse.Packets.TestMessagePacket.TestBlock1Block">
3119 <summary>Get the position of the primitive sending the sensor</summary> 4612 <exclude/>
3120 </member> 4613 </member>
3121 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Range"> 4614 <member name="T:OpenMetaverse.Packets.TestMessagePacket.NeighborBlockBlock">
3122 <summary>Get the range the primitive specified to scan</summary> 4615 <exclude/>
3123 </member> 4616 </member>
3124 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Rotation"> 4617 <member name="T:OpenMetaverse.Packets.UseCircuitCodePacket">
3125 <summary>Get the rotation of the primitive sending the sensor</summary> 4618 <exclude/>
3126 </member> 4619 </member>
3127 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Type"> 4620 <member name="T:OpenMetaverse.Packets.UseCircuitCodePacket.CircuitCodeBlock">
3128 <summary>Get the type of sensor the primitive sent</summary> 4621 <exclude/>
3129 </member> 4622 </member>
3130 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Velocity"> 4623 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket">
3131 <summary>Get the velocity of the primitive sending the sensor</summary> 4624 <exclude/>
3132 </member> 4625 </member>
3133 <member name="T:OpenMetaverse.AvatarSitResponseEventArgs"> 4626 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket.TelehubBlockBlock">
3134 <summary>Contains the response data returned from the simulator in response to a <see cref="!:RequestSit" /></summary> 4627 <exclude/>
3135 </member> 4628 </member>
3136 <member name="M:OpenMetaverse.AvatarSitResponseEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Boolean,OpenMetaverse.Vector3,OpenMetaverse.Quaternion)"> 4629 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket.SpawnPointBlockBlock">
3137 <summary>Construct a new instance of the AvatarSitResponseEventArgs object</summary> 4630 <exclude/>
3138 </member> 4631 </member>
3139 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.ObjectID"> 4632 <member name="T:OpenMetaverse.Packets.EconomyDataRequestPacket">
3140 <summary>Get the ID of the primitive the agent will be sitting on</summary> 4633 <exclude/>
3141 </member> 4634 </member>
3142 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.Autopilot"> 4635 <member name="T:OpenMetaverse.Packets.EconomyDataPacket">
3143 <summary>True if the simulator Autopilot functions were involved</summary> 4636 <exclude/>
3144 </member> 4637 </member>
3145 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.CameraAtOffset"> 4638 <member name="T:OpenMetaverse.Packets.EconomyDataPacket.InfoBlock">
3146 <summary>Get the camera offset of the agent when seated</summary> 4639 <exclude/>
3147 </member> 4640 </member>
3148 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.CameraEyeOffset"> 4641 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket">
3149 <summary>Get the camera eye offset of the agent when seated</summary> 4642 <exclude/>
3150 </member> 4643 </member>
3151 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.ForceMouselook"> 4644 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket.AgentDataBlock">
3152 <summary>True of the agent will be in mouselook mode when seated</summary> 4645 <exclude/>
3153 </member> 4646 </member>
3154 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.SitPosition"> 4647 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket.DataBlock">
3155 <summary>Get the position of the agent when seated</summary> 4648 <exclude/>
3156 </member> 4649 </member>
3157 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.SitRotation"> 4650 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket">
3158 <summary>Get the rotation of the agent when seated</summary> 4651 <exclude/>
3159 </member> 4652 </member>
3160 <member name="T:OpenMetaverse.ChatSessionMemberAddedEventArgs"> 4653 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket.AgentDataBlock">
3161 <summary>Data sent when an agent joins a chat session your agent is currently participating in</summary> 4654 <exclude/>
3162 </member> 4655 </member>
3163 <member name="M:OpenMetaverse.ChatSessionMemberAddedEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 4656 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket.DataBlock">
3164 <summary> 4657 <exclude/>
3165 Construct a new instance of the ChatSessionMemberAddedEventArgs object
3166 </summary>
3167 <param name="sessionID">The ID of the chat session</param>
3168 <param name="agentID">The ID of the agent joining</param>
3169 </member> 4658 </member>
3170 <member name="P:OpenMetaverse.ChatSessionMemberAddedEventArgs.SessionID"> 4659 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket">
3171 <summary>Get the ID of the chat session</summary> 4660 <exclude/>
3172 </member> 4661 </member>
3173 <member name="P:OpenMetaverse.ChatSessionMemberAddedEventArgs.AgentID"> 4662 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.AgentDataBlock">
3174 <summary>Get the ID of the agent that joined</summary> 4663 <exclude/>
3175 </member> 4664 </member>
3176 <member name="T:OpenMetaverse.ChatSessionMemberLeftEventArgs"> 4665 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.TransactionDataBlock">
3177 <summary>Data sent when an agent exits a chat session your agent is currently participating in</summary> 4666 <exclude/>
3178 </member> 4667 </member>
3179 <member name="M:OpenMetaverse.ChatSessionMemberLeftEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 4668 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.QueryDataBlock">
3180 <summary> 4669 <exclude/>
3181 Construct a new instance of the ChatSessionMemberLeftEventArgs object
3182 </summary>
3183 <param name="sessionID">The ID of the chat session</param>
3184 <param name="agentID">The ID of the Agent that left</param>
3185 </member> 4670 </member>
3186 <member name="P:OpenMetaverse.ChatSessionMemberLeftEventArgs.SessionID"> 4671 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket">
3187 <summary>Get the ID of the chat session</summary> 4672 <exclude/>
3188 </member> 4673 </member>
3189 <member name="P:OpenMetaverse.ChatSessionMemberLeftEventArgs.AgentID"> 4674 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.AgentDataBlock">
3190 <summary>Get the ID of the agent that left</summary> 4675 <exclude/>
3191 </member> 4676 </member>
3192 <member name="T:OpenMetaverse.SetDisplayNameReplyEventArgs"> 4677 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.TransactionDataBlock">
3193 <summary>Event arguments with the result of setting display name operation</summary> 4678 <exclude/>
3194 </member> 4679 </member>
3195 <member name="M:OpenMetaverse.SetDisplayNameReplyEventArgs.#ctor(System.Int32,System.String,OpenMetaverse.AgentDisplayName)"> 4680 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.QueryDataBlock">
3196 <summary>Default constructor</summary> 4681 <exclude/>
3197 </member> 4682 </member>
3198 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.Status"> 4683 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket">
3199 <summary>Status code, 200 indicates settign display name was successful</summary> 4684 <exclude/>
3200 </member> 4685 </member>
3201 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.Reason"> 4686 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket.AgentDataBlock">
3202 <summary>Textual description of the status</summary> 4687 <exclude/>
3203 </member> 4688 </member>
3204 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.DisplayName"> 4689 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket.QueryDataBlock">
3205 <summary>Details of the newly set display name</summary> 4690 <exclude/>
3206 </member> 4691 </member>
3207 <member name="T:OpenMetaverse.AgentThrottle"> 4692 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket">
3208 <summary> 4693 <exclude/>
3209 Throttles the network traffic for various different traffic types.
3210 Access this class through GridClient.Throttle
3211 </summary>
3212 </member> 4694 </member>
3213 <member name="M:OpenMetaverse.AgentThrottle.#ctor(OpenMetaverse.GridClient)"> 4695 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket.AgentDataBlock">
3214 <summary> 4696 <exclude/>
3215 Default constructor, uses a default high total of 1500 KBps (1536000)
3216 </summary>
3217 </member> 4697 </member>
3218 <member name="M:OpenMetaverse.AgentThrottle.#ctor(System.Byte[],System.Int32)"> 4698 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket.QueryDataBlock">
3219 <summary> 4699 <exclude/>
3220 Constructor that decodes an existing AgentThrottle packet in to
3221 individual values
3222 </summary>
3223 <param name="data">Reference to the throttle data in an AgentThrottle
3224 packet</param>
3225 <param name="pos">Offset position to start reading at in the
3226 throttle data</param>
3227 <remarks>This is generally not needed in clients as the server will
3228 never send a throttle packet to the client</remarks>
3229 </member> 4700 </member>
3230 <member name="P:OpenMetaverse.AgentThrottle.Resend"> 4701 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket">
3231 <summary>Maximum bits per second for resending unacknowledged packets</summary> 4702 <exclude/>
3232 </member> 4703 </member>
3233 <member name="P:OpenMetaverse.AgentThrottle.Land"> 4704 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.AgentDataBlock">
3234 <summary>Maximum bits per second for LayerData terrain</summary> 4705 <exclude/>
3235 </member> 4706 </member>
3236 <member name="P:OpenMetaverse.AgentThrottle.Wind"> 4707 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.QueryDataBlock">
3237 <summary>Maximum bits per second for LayerData wind data</summary> 4708 <exclude/>
3238 </member> 4709 </member>
3239 <member name="P:OpenMetaverse.AgentThrottle.Cloud"> 4710 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.QueryRepliesBlock">
3240 <summary>Maximum bits per second for LayerData clouds</summary> 4711 <exclude/>
3241 </member> 4712 </member>
3242 <member name="P:OpenMetaverse.AgentThrottle.Task"> 4713 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.StatusDataBlock">
3243 <summary>Unknown, includes object data</summary> 4714 <exclude/>
3244 </member> 4715 </member>
3245 <member name="P:OpenMetaverse.AgentThrottle.Texture"> 4716 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket">
3246 <summary>Maximum bits per second for textures</summary> 4717 <exclude/>
3247 </member> 4718 </member>
3248 <member name="P:OpenMetaverse.AgentThrottle.Asset"> 4719 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.AgentDataBlock">
3249 <summary>Maximum bits per second for downloaded assets</summary> 4720 <exclude/>
3250 </member> 4721 </member>
3251 <member name="P:OpenMetaverse.AgentThrottle.Total"> 4722 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.QueryDataBlock">
3252 <summary>Maximum bits per second the entire connection, divided up 4723 <exclude/>
3253 between invidiual streams using default multipliers</summary>
3254 </member> 4724 </member>
3255 <member name="M:OpenMetaverse.AgentThrottle.Set"> 4725 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.QueryRepliesBlock">
3256 <summary> 4726 <exclude/>
3257 Send an AgentThrottle packet to the current server using the
3258 current values
3259 </summary>
3260 </member> 4727 </member>
3261 <member name="M:OpenMetaverse.AgentThrottle.Set(OpenMetaverse.Simulator)"> 4728 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket">
3262 <summary> 4729 <exclude/>
3263 Send an AgentThrottle packet to the specified server using the
3264 current values
3265 </summary>
3266 </member> 4730 </member>
3267 <member name="M:OpenMetaverse.AgentThrottle.ToBytes"> 4731 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.AgentDataBlock">
3268 <summary> 4732 <exclude/>
3269 Convert the current throttle values to a byte array that can be put
3270 in an AgentThrottle packet
3271 </summary>
3272 <returns>Byte array containing all the throttle values</returns>
3273 </member> 4733 </member>
3274 <member name="T:OpenMetaverse.Animations"> 4734 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.QueryDataBlock">
3275 <summary> 4735 <exclude/>
3276 Static pre-defined animations available to all agents
3277 </summary>
3278 </member> 4736 </member>
3279 <member name="F:OpenMetaverse.Animations.AFRAID"> 4737 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.QueryRepliesBlock">
3280 <summary>Agent with afraid expression on face</summary> 4738 <exclude/>
3281 </member> 4739 </member>
3282 <member name="F:OpenMetaverse.Animations.AIM_BAZOOKA_R"> 4740 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.StatusDataBlock">
3283 <summary>Agent aiming a bazooka (right handed)</summary> 4741 <exclude/>
3284 </member> 4742 </member>
3285 <member name="F:OpenMetaverse.Animations.AIM_BOW_L"> 4743 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket">
3286 <summary>Agent aiming a bow (left handed)</summary> 4744 <exclude/>
3287 </member> 4745 </member>
3288 <member name="F:OpenMetaverse.Animations.AIM_HANDGUN_R"> 4746 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.AgentDataBlock">
3289 <summary>Agent aiming a hand gun (right handed)</summary> 4747 <exclude/>
3290 </member> 4748 </member>
3291 <member name="F:OpenMetaverse.Animations.AIM_RIFLE_R"> 4749 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.QueryDataBlock">
3292 <summary>Agent aiming a rifle (right handed)</summary> 4750 <exclude/>
3293 </member> 4751 </member>
3294 <member name="F:OpenMetaverse.Animations.ANGRY"> 4752 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.QueryRepliesBlock">
3295 <summary>Agent with angry expression on face</summary> 4753 <exclude/>
3296 </member> 4754 </member>
3297 <member name="F:OpenMetaverse.Animations.AWAY"> 4755 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket">
3298 <summary>Agent hunched over (away)</summary> 4756 <exclude/>
3299 </member> 4757 </member>
3300 <member name="F:OpenMetaverse.Animations.BACKFLIP"> 4758 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket.AgentDataBlock">
3301 <summary>Agent doing a backflip</summary> 4759 <exclude/>
3302 </member> 4760 </member>
3303 <member name="F:OpenMetaverse.Animations.BELLY_LAUGH"> 4761 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket.QueryDataBlock">
3304 <summary>Agent laughing while holding belly</summary> 4762 <exclude/>
3305 </member> 4763 </member>
3306 <member name="F:OpenMetaverse.Animations.BLOW_KISS"> 4764 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket">
3307 <summary>Agent blowing a kiss</summary> 4765 <exclude/>
3308 </member> 4766 </member>
3309 <member name="F:OpenMetaverse.Animations.BORED"> 4767 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.AgentDataBlock">
3310 <summary>Agent with bored expression on face</summary> 4768 <exclude/>
3311 </member> 4769 </member>
3312 <member name="F:OpenMetaverse.Animations.BOW"> 4770 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.QueryDataBlock">
3313 <summary>Agent bowing to audience</summary> 4771 <exclude/>
3314 </member> 4772 </member>
3315 <member name="F:OpenMetaverse.Animations.BRUSH"> 4773 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.QueryRepliesBlock">
3316 <summary>Agent brushing himself/herself off</summary> 4774 <exclude/>
3317 </member> 4775 </member>
3318 <member name="F:OpenMetaverse.Animations.BUSY"> 4776 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.StatusDataBlock">
3319 <summary>Agent in busy mode</summary> 4777 <exclude/>
3320 </member> 4778 </member>
3321 <member name="F:OpenMetaverse.Animations.CLAP"> 4779 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket">
3322 <summary>Agent clapping hands</summary> 4780 <exclude/>
3323 </member> 4781 </member>
3324 <member name="F:OpenMetaverse.Animations.COURTBOW"> 4782 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket.AgentDataBlock">
3325 <summary>Agent doing a curtsey bow</summary> 4783 <exclude/>
3326 </member> 4784 </member>
3327 <member name="F:OpenMetaverse.Animations.CROUCH"> 4785 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket.DataBlock">
3328 <summary>Agent crouching</summary> 4786 <exclude/>
3329 </member> 4787 </member>
3330 <member name="F:OpenMetaverse.Animations.CROUCHWALK"> 4788 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket">
3331 <summary>Agent crouching while walking</summary> 4789 <exclude/>
3332 </member> 4790 </member>
3333 <member name="F:OpenMetaverse.Animations.CRY"> 4791 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket.AgentDataBlock">
3334 <summary>Agent crying</summary> 4792 <exclude/>
3335 </member> 4793 </member>
3336 <member name="F:OpenMetaverse.Animations.CUSTOMIZE"> 4794 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket.DataBlock">
3337 <summary>Agent unanimated with arms out (e.g. setting appearance)</summary> 4795 <exclude/>
3338 </member> 4796 </member>
3339 <member name="F:OpenMetaverse.Animations.CUSTOMIZE_DONE"> 4797 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket">
3340 <summary>Agent re-animated after set appearance finished</summary> 4798 <exclude/>
3341 </member> 4799 </member>
3342 <member name="F:OpenMetaverse.Animations.DANCE1"> 4800 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket.AgentDataBlock">
3343 <summary>Agent dancing</summary> 4801 <exclude/>
3344 </member> 4802 </member>
3345 <member name="F:OpenMetaverse.Animations.DANCE2"> 4803 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket.DataBlock">
3346 <summary>Agent dancing</summary> 4804 <exclude/>
3347 </member> 4805 </member>
3348 <member name="F:OpenMetaverse.Animations.DANCE3"> 4806 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket">
3349 <summary>Agent dancing</summary> 4807 <exclude/>
3350 </member> 4808 </member>
3351 <member name="F:OpenMetaverse.Animations.DANCE4"> 4809 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket.AgentDataBlock">
3352 <summary>Agent dancing</summary> 4810 <exclude/>
3353 </member> 4811 </member>
3354 <member name="F:OpenMetaverse.Animations.DANCE5"> 4812 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket.DataBlock">
3355 <summary>Agent dancing</summary> 4813 <exclude/>
3356 </member> 4814 </member>
3357 <member name="F:OpenMetaverse.Animations.DANCE6"> 4815 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket">
3358 <summary>Agent dancing</summary> 4816 <exclude/>
3359 </member> 4817 </member>
3360 <member name="F:OpenMetaverse.Animations.DANCE7"> 4818 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket.AgentDataBlock">
3361 <summary>Agent dancing</summary> 4819 <exclude/>
3362 </member> 4820 </member>
3363 <member name="F:OpenMetaverse.Animations.DANCE8"> 4821 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket.DataBlock">
3364 <summary>Agent dancing</summary> 4822 <exclude/>
3365 </member> 4823 </member>
3366 <member name="F:OpenMetaverse.Animations.DEAD"> 4824 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket">
3367 <summary>Agent on ground unanimated</summary> 4825 <exclude/>
3368 </member> 4826 </member>
3369 <member name="F:OpenMetaverse.Animations.DRINK"> 4827 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket.AgentDataBlock">
3370 <summary>Agent boozing it up</summary> 4828 <exclude/>
3371 </member> 4829 </member>
3372 <member name="F:OpenMetaverse.Animations.EMBARRASSED"> 4830 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket.DataBlock">
3373 <summary>Agent with embarassed expression on face</summary> 4831 <exclude/>
3374 </member> 4832 </member>
3375 <member name="F:OpenMetaverse.Animations.EXPRESS_AFRAID"> 4833 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket">
3376 <summary>Agent with afraid expression on face</summary> 4834 <exclude/>
3377 </member> 4835 </member>
3378 <member name="F:OpenMetaverse.Animations.EXPRESS_ANGER"> 4836 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket.AgentDataBlock">
3379 <summary>Agent with angry expression on face</summary> 4837 <exclude/>
3380 </member> 4838 </member>
3381 <member name="F:OpenMetaverse.Animations.EXPRESS_BORED"> 4839 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket.QueryDataBlock">
3382 <summary>Agent with bored expression on face</summary> 4840 <exclude/>
3383 </member> 4841 </member>
3384 <member name="F:OpenMetaverse.Animations.EXPRESS_CRY"> 4842 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket">
3385 <summary>Agent crying</summary> 4843 <exclude/>
3386 </member> 4844 </member>
3387 <member name="F:OpenMetaverse.Animations.EXPRESS_DISDAIN"> 4845 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.AgentDataBlock">
3388 <summary>Agent showing disdain (dislike) for something</summary> 4846 <exclude/>
3389 </member> 4847 </member>
3390 <member name="F:OpenMetaverse.Animations.EXPRESS_EMBARRASSED"> 4848 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.QueryDataBlock">
3391 <summary>Agent with embarassed expression on face</summary> 4849 <exclude/>
3392 </member> 4850 </member>
3393 <member name="F:OpenMetaverse.Animations.EXPRESS_FROWN"> 4851 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.QueryRepliesBlock">
3394 <summary>Agent with frowning expression on face</summary> 4852 <exclude/>
3395 </member> 4853 </member>
3396 <member name="F:OpenMetaverse.Animations.EXPRESS_KISS"> 4854 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket">
3397 <summary>Agent with kissy face</summary> 4855 <exclude/>
3398 </member> 4856 </member>
3399 <member name="F:OpenMetaverse.Animations.EXPRESS_LAUGH"> 4857 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket.AgentDataBlock">
3400 <summary>Agent expressing laughgter</summary> 4858 <exclude/>
3401 </member> 4859 </member>
3402 <member name="F:OpenMetaverse.Animations.EXPRESS_OPEN_MOUTH"> 4860 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket.QueryDataBlock">
3403 <summary>Agent with open mouth</summary> 4861 <exclude/>
3404 </member> 4862 </member>
3405 <member name="F:OpenMetaverse.Animations.EXPRESS_REPULSED"> 4863 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket">
3406 <summary>Agent with repulsed expression on face</summary> 4864 <exclude/>
3407 </member> 4865 </member>
3408 <member name="F:OpenMetaverse.Animations.EXPRESS_SAD"> 4866 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.AgentDataBlock">
3409 <summary>Agent expressing sadness</summary> 4867 <exclude/>
3410 </member> 4868 </member>
3411 <member name="F:OpenMetaverse.Animations.EXPRESS_SHRUG"> 4869 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.QueryDataBlock">
3412 <summary>Agent shrugging shoulders</summary> 4870 <exclude/>
3413 </member> 4871 </member>
3414 <member name="F:OpenMetaverse.Animations.EXPRESS_SMILE"> 4872 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.QueryRepliesBlock">
3415 <summary>Agent with a smile</summary> 4873 <exclude/>
3416 </member> 4874 </member>
3417 <member name="F:OpenMetaverse.Animations.EXPRESS_SURPRISE"> 4875 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket">
3418 <summary>Agent expressing surprise</summary> 4876 <exclude/>
3419 </member> 4877 </member>
3420 <member name="F:OpenMetaverse.Animations.EXPRESS_TONGUE_OUT"> 4878 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket.AgentDataBlock">
3421 <summary>Agent sticking tongue out</summary> 4879 <exclude/>
3422 </member> 4880 </member>
3423 <member name="F:OpenMetaverse.Animations.EXPRESS_TOOTHSMILE"> 4881 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket.DataBlock">
3424 <summary>Agent with big toothy smile</summary> 4882 <exclude/>
3425 </member> 4883 </member>
3426 <member name="F:OpenMetaverse.Animations.EXPRESS_WINK"> 4884 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket">
3427 <summary>Agent winking</summary> 4885 <exclude/>
3428 </member> 4886 </member>
3429 <member name="F:OpenMetaverse.Animations.EXPRESS_WORRY"> 4887 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket.AgentDataBlock">
3430 <summary>Agent expressing worry</summary> 4888 <exclude/>
3431 </member> 4889 </member>
3432 <member name="F:OpenMetaverse.Animations.FALLDOWN"> 4890 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket.DataBlock">
3433 <summary>Agent falling down</summary> 4891 <exclude/>
3434 </member> 4892 </member>
3435 <member name="F:OpenMetaverse.Animations.FEMALE_WALK"> 4893 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket">
3436 <summary>Agent walking (feminine version)</summary> 4894 <exclude/>
3437 </member> 4895 </member>
3438 <member name="F:OpenMetaverse.Animations.FINGER_WAG"> 4896 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket.AgentDataBlock">
3439 <summary>Agent wagging finger (disapproval)</summary> 4897 <exclude/>
3440 </member> 4898 </member>
3441 <member name="F:OpenMetaverse.Animations.FIST_PUMP"> 4899 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket.ParcelDataBlock">
3442 <summary>I'm not sure I want to know</summary> 4900 <exclude/>
3443 </member> 4901 </member>
3444 <member name="F:OpenMetaverse.Animations.FLY"> 4902 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersReplyPacket">
3445 <summary>Agent in superman position</summary> 4903 <exclude/>
3446 </member> 4904 </member>
3447 <member name="F:OpenMetaverse.Animations.FLYSLOW"> 4905 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersReplyPacket.DataBlock">
3448 <summary>Agent in superman position</summary> 4906 <exclude/>
3449 </member> 4907 </member>
3450 <member name="F:OpenMetaverse.Animations.HELLO"> 4908 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket">
3451 <summary>Agent greeting another</summary> 4909 <exclude/>
3452 </member> 4910 </member>
3453 <member name="F:OpenMetaverse.Animations.HOLD_BAZOOKA_R"> 4911 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket.AgentDataBlock">
3454 <summary>Agent holding bazooka (right handed)</summary> 4912 <exclude/>
3455 </member> 4913 </member>
3456 <member name="F:OpenMetaverse.Animations.HOLD_BOW_L"> 4914 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket.DataBlock">
3457 <summary>Agent holding a bow (left handed)</summary> 4915 <exclude/>
3458 </member> 4916 </member>
3459 <member name="F:OpenMetaverse.Animations.HOLD_HANDGUN_R"> 4917 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket">
3460 <summary>Agent holding a handgun (right handed)</summary> 4918 <exclude/>
3461 </member> 4919 </member>
3462 <member name="F:OpenMetaverse.Animations.HOLD_RIFLE_R"> 4920 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket.AgentDataBlock">
3463 <summary>Agent holding a rifle (right handed)</summary> 4921 <exclude/>
3464 </member> 4922 </member>
3465 <member name="F:OpenMetaverse.Animations.HOLD_THROW_R"> 4923 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket.DataBlock">
3466 <summary>Agent throwing an object (right handed)</summary> 4924 <exclude/>
3467 </member> 4925 </member>
3468 <member name="F:OpenMetaverse.Animations.HOVER"> 4926 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket">
3469 <summary>Agent in static hover</summary> 4927 <exclude/>
3470 </member> 4928 </member>
3471 <member name="F:OpenMetaverse.Animations.HOVER_DOWN"> 4929 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket.AgentDataBlock">
3472 <summary>Agent hovering downward</summary> 4930 <exclude/>
3473 </member> 4931 </member>
3474 <member name="F:OpenMetaverse.Animations.HOVER_UP"> 4932 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket.DataBlock">
3475 <summary>Agent hovering upward</summary> 4933 <exclude/>
3476 </member> 4934 </member>
3477 <member name="F:OpenMetaverse.Animations.IMPATIENT"> 4935 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket">
3478 <summary>Agent being impatient</summary> 4936 <exclude/>
3479 </member> 4937 </member>
3480 <member name="F:OpenMetaverse.Animations.JUMP"> 4938 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket.AgentDataBlock">
3481 <summary>Agent jumping</summary> 4939 <exclude/>
3482 </member> 4940 </member>
3483 <member name="F:OpenMetaverse.Animations.JUMP_FOR_JOY"> 4941 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket.InfoBlock">
3484 <summary>Agent jumping with fervor</summary> 4942 <exclude/>
3485 </member> 4943 </member>
3486 <member name="F:OpenMetaverse.Animations.KISS_MY_BUTT"> 4944 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket">
3487 <summary>Agent point to lips then rear end</summary> 4945 <exclude/>
3488 </member> 4946 </member>
3489 <member name="F:OpenMetaverse.Animations.LAND"> 4947 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket.AgentDataBlock">
3490 <summary>Agent landing from jump, finished flight, etc</summary> 4948 <exclude/>
3491 </member> 4949 </member>
3492 <member name="F:OpenMetaverse.Animations.LAUGH_SHORT"> 4950 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket.InfoBlock">
3493 <summary>Agent laughing</summary> 4951 <exclude/>
3494 </member> 4952 </member>
3495 <member name="F:OpenMetaverse.Animations.MEDIUM_LAND"> 4953 <member name="T:OpenMetaverse.Packets.TeleportLocalPacket">
3496 <summary>Agent landing from jump, finished flight, etc</summary> 4954 <exclude/>
3497 </member> 4955 </member>
3498 <member name="F:OpenMetaverse.Animations.MOTORCYCLE_SIT"> 4956 <member name="T:OpenMetaverse.Packets.TeleportLocalPacket.InfoBlock">
3499 <summary>Agent sitting on a motorcycle</summary> 4957 <exclude/>
3500 </member> 4958 </member>
3501 <member name="F:OpenMetaverse.Animations.MUSCLE_BEACH"> 4959 <member name="T:OpenMetaverse.Packets.TeleportLandmarkRequestPacket">
3502 <summary> 4960 <exclude/>
3503 </summary>
3504 </member> 4961 </member>
3505 <member name="F:OpenMetaverse.Animations.NO"> 4962 <member name="T:OpenMetaverse.Packets.TeleportLandmarkRequestPacket.InfoBlock">
3506 <summary>Agent moving head side to side</summary> 4963 <exclude/>
3507 </member> 4964 </member>
3508 <member name="F:OpenMetaverse.Animations.NO_UNHAPPY"> 4965 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket">
3509 <summary>Agent moving head side to side with unhappy expression</summary> 4966 <exclude/>
3510 </member> 4967 </member>
3511 <member name="F:OpenMetaverse.Animations.NYAH_NYAH"> 4968 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket.AgentDataBlock">
3512 <summary>Agent taunting another</summary> 4969 <exclude/>
3513 </member> 4970 </member>
3514 <member name="F:OpenMetaverse.Animations.ONETWO_PUNCH"> 4971 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket.InfoBlock">
3515 <summary> 4972 <exclude/>
3516 </summary>
3517 </member> 4973 </member>
3518 <member name="F:OpenMetaverse.Animations.PEACE"> 4974 <member name="T:OpenMetaverse.Packets.TeleportFinishPacket">
3519 <summary>Agent giving peace sign</summary> 4975 <exclude/>
3520 </member> 4976 </member>
3521 <member name="F:OpenMetaverse.Animations.POINT_ME"> 4977 <member name="T:OpenMetaverse.Packets.TeleportFinishPacket.InfoBlock">
3522 <summary>Agent pointing at self</summary> 4978 <exclude/>
3523 </member> 4979 </member>
3524 <member name="F:OpenMetaverse.Animations.POINT_YOU"> 4980 <member name="T:OpenMetaverse.Packets.StartLurePacket">
3525 <summary>Agent pointing at another</summary> 4981 <exclude/>
3526 </member> 4982 </member>
3527 <member name="F:OpenMetaverse.Animations.PRE_JUMP"> 4983 <member name="T:OpenMetaverse.Packets.StartLurePacket.AgentDataBlock">
3528 <summary>Agent preparing for jump (bending knees)</summary> 4984 <exclude/>
3529 </member> 4985 </member>
3530 <member name="F:OpenMetaverse.Animations.PUNCH_LEFT"> 4986 <member name="T:OpenMetaverse.Packets.StartLurePacket.InfoBlock">
3531 <summary>Agent punching with left hand</summary> 4987 <exclude/>
3532 </member> 4988 </member>
3533 <member name="F:OpenMetaverse.Animations.PUNCH_RIGHT"> 4989 <member name="T:OpenMetaverse.Packets.StartLurePacket.TargetDataBlock">
3534 <summary>Agent punching with right hand</summary> 4990 <exclude/>
3535 </member> 4991 </member>
3536 <member name="F:OpenMetaverse.Animations.REPULSED"> 4992 <member name="T:OpenMetaverse.Packets.TeleportLureRequestPacket">
3537 <summary>Agent acting repulsed</summary> 4993 <exclude/>
3538 </member> 4994 </member>
3539 <member name="F:OpenMetaverse.Animations.ROUNDHOUSE_KICK"> 4995 <member name="T:OpenMetaverse.Packets.TeleportLureRequestPacket.InfoBlock">
3540 <summary>Agent trying to be Chuck Norris</summary> 4996 <exclude/>
3541 </member> 4997 </member>
3542 <member name="F:OpenMetaverse.Animations.RPS_COUNTDOWN"> 4998 <member name="T:OpenMetaverse.Packets.TeleportCancelPacket">
3543 <summary>Rocks, Paper, Scissors 1, 2, 3</summary> 4999 <exclude/>
3544 </member> 5000 </member>
3545 <member name="F:OpenMetaverse.Animations.RPS_PAPER"> 5001 <member name="T:OpenMetaverse.Packets.TeleportCancelPacket.InfoBlock">
3546 <summary>Agent with hand flat over other hand</summary> 5002 <exclude/>
3547 </member> 5003 </member>
3548 <member name="F:OpenMetaverse.Animations.RPS_ROCK"> 5004 <member name="T:OpenMetaverse.Packets.TeleportStartPacket">
3549 <summary>Agent with fist over other hand</summary> 5005 <exclude/>
3550 </member> 5006 </member>
3551 <member name="F:OpenMetaverse.Animations.RPS_SCISSORS"> 5007 <member name="T:OpenMetaverse.Packets.TeleportStartPacket.InfoBlock">
3552 <summary>Agent with two fingers spread over other hand</summary> 5008 <exclude/>
3553 </member> 5009 </member>
3554 <member name="F:OpenMetaverse.Animations.RUN"> 5010 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket">
3555 <summary>Agent running</summary> 5011 <exclude/>
3556 </member> 5012 </member>
3557 <member name="F:OpenMetaverse.Animations.SAD"> 5013 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket.InfoBlock">
3558 <summary>Agent appearing sad</summary> 5014 <exclude/>
3559 </member> 5015 </member>
3560 <member name="F:OpenMetaverse.Animations.SALUTE"> 5016 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket.AlertInfoBlock">
3561 <summary>Agent saluting</summary> 5017 <exclude/>
3562 </member> 5018 </member>
3563 <member name="F:OpenMetaverse.Animations.SHOOT_BOW_L"> 5019 <member name="T:OpenMetaverse.Packets.UndoPacket">
3564 <summary>Agent shooting bow (left handed)</summary> 5020 <exclude/>
3565 </member> 5021 </member>
3566 <member name="F:OpenMetaverse.Animations.SHOUT"> 5022 <member name="T:OpenMetaverse.Packets.UndoPacket.AgentDataBlock">
3567 <summary>Agent cupping mouth as if shouting</summary> 5023 <exclude/>
3568 </member> 5024 </member>
3569 <member name="F:OpenMetaverse.Animations.SHRUG"> 5025 <member name="T:OpenMetaverse.Packets.UndoPacket.ObjectDataBlock">
3570 <summary>Agent shrugging shoulders</summary> 5026 <exclude/>
3571 </member> 5027 </member>
3572 <member name="F:OpenMetaverse.Animations.SIT"> 5028 <member name="T:OpenMetaverse.Packets.RedoPacket">
3573 <summary>Agent in sit position</summary> 5029 <exclude/>
3574 </member> 5030 </member>
3575 <member name="F:OpenMetaverse.Animations.SIT_FEMALE"> 5031 <member name="T:OpenMetaverse.Packets.RedoPacket.AgentDataBlock">
3576 <summary>Agent in sit position (feminine)</summary> 5032 <exclude/>
3577 </member> 5033 </member>
3578 <member name="F:OpenMetaverse.Animations.SIT_GENERIC"> 5034 <member name="T:OpenMetaverse.Packets.RedoPacket.ObjectDataBlock">
3579 <summary>Agent in sit position (generic)</summary> 5035 <exclude/>
3580 </member> 5036 </member>
3581 <member name="F:OpenMetaverse.Animations.SIT_GROUND"> 5037 <member name="T:OpenMetaverse.Packets.UndoLandPacket">
3582 <summary>Agent sitting on ground</summary> 5038 <exclude/>
3583 </member> 5039 </member>
3584 <member name="F:OpenMetaverse.Animations.SIT_GROUND_staticRAINED"> 5040 <member name="T:OpenMetaverse.Packets.UndoLandPacket.AgentDataBlock">
3585 <summary>Agent sitting on ground</summary> 5041 <exclude/>
3586 </member> 5042 </member>
3587 <member name="F:OpenMetaverse.Animations.SIT_TO_STAND"> 5043 <member name="T:OpenMetaverse.Packets.AgentPausePacket">
3588 <summary> 5044 <exclude/>
3589 </summary>
3590 </member> 5045 </member>
3591 <member name="F:OpenMetaverse.Animations.SLEEP"> 5046 <member name="T:OpenMetaverse.Packets.AgentPausePacket.AgentDataBlock">
3592 <summary>Agent sleeping on side</summary> 5047 <exclude/>
3593 </member> 5048 </member>
3594 <member name="F:OpenMetaverse.Animations.SMOKE_IDLE"> 5049 <member name="T:OpenMetaverse.Packets.AgentResumePacket">
3595 <summary>Agent smoking</summary> 5050 <exclude/>
3596 </member> 5051 </member>
3597 <member name="F:OpenMetaverse.Animations.SMOKE_INHALE"> 5052 <member name="T:OpenMetaverse.Packets.AgentResumePacket.AgentDataBlock">
3598 <summary>Agent inhaling smoke</summary> 5053 <exclude/>
3599 </member> 5054 </member>
3600 <member name="F:OpenMetaverse.Animations.SMOKE_THROW_DOWN"> 5055 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket">
3601 <summary> 5056 <exclude/>
3602 </summary>
3603 </member> 5057 </member>
3604 <member name="F:OpenMetaverse.Animations.SNAPSHOT"> 5058 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket.AgentDataBlock">
3605 <summary>Agent taking a picture</summary> 5059 <exclude/>
3606 </member> 5060 </member>
3607 <member name="F:OpenMetaverse.Animations.STAND"> 5061 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket.ChatDataBlock">
3608 <summary>Agent standing</summary> 5062 <exclude/>
3609 </member> 5063 </member>
3610 <member name="F:OpenMetaverse.Animations.STANDUP"> 5064 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket">
3611 <summary>Agent standing up</summary> 5065 <exclude/>
3612 </member> 5066 </member>
3613 <member name="F:OpenMetaverse.Animations.STAND_1"> 5067 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket.AgentDataBlock">
3614 <summary>Agent standing</summary> 5068 <exclude/>
3615 </member> 5069 </member>
3616 <member name="F:OpenMetaverse.Animations.STAND_2"> 5070 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket.ThrottleBlock">
3617 <summary>Agent standing</summary> 5071 <exclude/>
3618 </member> 5072 </member>
3619 <member name="F:OpenMetaverse.Animations.STAND_3"> 5073 <member name="T:OpenMetaverse.Packets.AgentFOVPacket">
3620 <summary>Agent standing</summary> 5074 <exclude/>
3621 </member> 5075 </member>
3622 <member name="F:OpenMetaverse.Animations.STAND_4"> 5076 <member name="T:OpenMetaverse.Packets.AgentFOVPacket.AgentDataBlock">
3623 <summary>Agent standing</summary> 5077 <exclude/>
3624 </member> 5078 </member>
3625 <member name="F:OpenMetaverse.Animations.STRETCH"> 5079 <member name="T:OpenMetaverse.Packets.AgentFOVPacket.FOVBlockBlock">
3626 <summary>Agent stretching</summary> 5080 <exclude/>
3627 </member> 5081 </member>
3628 <member name="F:OpenMetaverse.Animations.STRIDE"> 5082 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket">
3629 <summary>Agent in stride (fast walk)</summary> 5083 <exclude/>
3630 </member> 5084 </member>
3631 <member name="F:OpenMetaverse.Animations.SURF"> 5085 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket.AgentDataBlock">
3632 <summary>Agent surfing</summary> 5086 <exclude/>
3633 </member> 5087 </member>
3634 <member name="F:OpenMetaverse.Animations.SURPRISE"> 5088 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket.HeightWidthBlockBlock">
3635 <summary>Agent acting surprised</summary> 5089 <exclude/>
3636 </member> 5090 </member>
3637 <member name="F:OpenMetaverse.Animations.SWORD_STRIKE"> 5091 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket">
3638 <summary>Agent striking with a sword</summary> 5092 <exclude/>
3639 </member> 5093 </member>
3640 <member name="F:OpenMetaverse.Animations.TALK"> 5094 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.AgentDataBlock">
3641 <summary>Agent talking (lips moving)</summary> 5095 <exclude/>
3642 </member> 5096 </member>
3643 <member name="F:OpenMetaverse.Animations.TANTRUM"> 5097 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.WearableDataBlock">
3644 <summary>Agent throwing a tantrum</summary> 5098 <exclude/>
3645 </member> 5099 </member>
3646 <member name="F:OpenMetaverse.Animations.THROW_R"> 5100 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.ObjectDataBlock">
3647 <summary>Agent throwing an object (right handed)</summary> 5101 <exclude/>
3648 </member> 5102 </member>
3649 <member name="F:OpenMetaverse.Animations.TRYON_SHIRT"> 5103 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.VisualParamBlock">
3650 <summary>Agent trying on a shirt</summary> 5104 <exclude/>
3651 </member> 5105 </member>
3652 <member name="F:OpenMetaverse.Animations.TURNLEFT"> 5106 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket">
3653 <summary>Agent turning to the left</summary> 5107 <exclude/>
3654 </member> 5108 </member>
3655 <member name="F:OpenMetaverse.Animations.TURNRIGHT"> 5109 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket.AgentDataBlock">
3656 <summary>Agent turning to the right</summary> 5110 <exclude/>
3657 </member> 5111 </member>
3658 <member name="F:OpenMetaverse.Animations.TYPE"> 5112 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket.FuseBlockBlock">
3659 <summary>Agent typing</summary> 5113 <exclude/>
3660 </member> 5114 </member>
3661 <member name="F:OpenMetaverse.Animations.WALK"> 5115 <member name="T:OpenMetaverse.Packets.ImageNotInDatabasePacket">
3662 <summary>Agent walking</summary> 5116 <exclude/>
3663 </member> 5117 </member>
3664 <member name="F:OpenMetaverse.Animations.WHISPER"> 5118 <member name="T:OpenMetaverse.Packets.ImageNotInDatabasePacket.ImageIDBlock">
3665 <summary>Agent whispering</summary> 5119 <exclude/>
3666 </member> 5120 </member>
3667 <member name="F:OpenMetaverse.Animations.WHISTLE"> 5121 <member name="T:OpenMetaverse.Packets.RebakeAvatarTexturesPacket">
3668 <summary>Agent whispering with fingers in mouth</summary> 5122 <exclude/>
3669 </member> 5123 </member>
3670 <member name="F:OpenMetaverse.Animations.WINK"> 5124 <member name="T:OpenMetaverse.Packets.RebakeAvatarTexturesPacket.TextureDataBlock">
3671 <summary>Agent winking</summary> 5125 <exclude/>
3672 </member> 5126 </member>
3673 <member name="F:OpenMetaverse.Animations.WINK_HOLLYWOOD"> 5127 <member name="T:OpenMetaverse.Packets.SetAlwaysRunPacket">
3674 <summary>Agent winking</summary> 5128 <exclude/>
3675 </member> 5129 </member>
3676 <member name="F:OpenMetaverse.Animations.WORRY"> 5130 <member name="T:OpenMetaverse.Packets.SetAlwaysRunPacket.AgentDataBlock">
3677 <summary>Agent worried</summary> 5131 <exclude/>
3678 </member> 5132 </member>
3679 <member name="F:OpenMetaverse.Animations.YES"> 5133 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket">
3680 <summary>Agent nodding yes</summary> 5134 <exclude/>
3681 </member> 5135 </member>
3682 <member name="F:OpenMetaverse.Animations.YES_HAPPY"> 5136 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket.AgentDataBlock">
3683 <summary>Agent nodding yes with happy face</summary> 5137 <exclude/>
3684 </member> 5138 </member>
3685 <member name="F:OpenMetaverse.Animations.YOGA_FLOAT"> 5139 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket.ObjectDataBlock">
3686 <summary>Agent floating with legs and arms crossed</summary> 5140 <exclude/>
3687 </member> 5141 </member>
3688 <member name="M:OpenMetaverse.Animations.ToDictionary"> 5142 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket">
3689 <summary> 5143 <exclude/>
3690 A dictionary containing all pre-defined animations
3691 </summary>
3692 <returns>A dictionary containing the pre-defined animations,
3693 where the key is the animations ID, and the value is a string
3694 containing a name to identify the purpose of the animation</returns>
3695 </member> 5144 </member>
3696 <member name="T:OpenMetaverse.AvatarTextureIndex"> 5145 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.AgentDataBlock">
3697 <summary> 5146 <exclude/>
3698 Index of TextureEntry slots for avatar appearances
3699 </summary>
3700 </member> 5147 </member>
3701 <member name="T:OpenMetaverse.BakeType"> 5148 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.SharedDataBlock">
3702 <summary> 5149 <exclude/>
3703 Bake layers for avatar appearance
3704 </summary>
3705 </member> 5150 </member>
3706 <member name="M:OpenMetaverse.AppearanceManager.#ctor(OpenMetaverse.GridClient)"> 5151 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.ObjectDataBlock">
3707 <summary> 5152 <exclude/>
3708 Default constructor
3709 </summary>
3710 <param name="client">A reference to our agent</param>
3711 </member> 5153 </member>
3712 <member name="T:OpenMetaverse.AppearanceManager.WearableData"> 5154 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket">
3713 <summary> 5155 <exclude/>
3714 Contains information about a wearable inventory item
3715 </summary>
3716 </member> 5156 </member>
3717 <member name="F:OpenMetaverse.AppearanceManager.WearableData.ItemID"> 5157 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket.AgentDataBlock">
3718 <summary>Inventory ItemID of the wearable</summary> 5158 <exclude/>
3719 </member> 5159 </member>
3720 <member name="F:OpenMetaverse.AppearanceManager.WearableData.AssetID"> 5160 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket.ObjectDataBlock">
3721 <summary>AssetID of the wearable asset</summary> 5161 <exclude/>
3722 </member> 5162 </member>
3723 <member name="F:OpenMetaverse.AppearanceManager.WearableData.WearableType"> 5163 <member name="T:OpenMetaverse.Packets.ObjectScalePacket">
3724 <summary>WearableType of the wearable</summary> 5164 <exclude/>
3725 </member> 5165 </member>
3726 <member name="F:OpenMetaverse.AppearanceManager.WearableData.AssetType"> 5166 <member name="T:OpenMetaverse.Packets.ObjectScalePacket.AgentDataBlock">
3727 <summary>AssetType of the wearable</summary> 5167 <exclude/>
3728 </member> 5168 </member>
3729 <member name="F:OpenMetaverse.AppearanceManager.WearableData.Asset"> 5169 <member name="T:OpenMetaverse.Packets.ObjectScalePacket.ObjectDataBlock">
3730 <summary>Asset data for the wearable</summary> 5170 <exclude/>
3731 </member> 5171 </member>
3732 <member name="T:OpenMetaverse.AppearanceManager.ColorParamInfo"> 5172 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket">
3733 <summary> 5173 <exclude/>
3734 Data collected from visual params for each wearable
3735 needed for the calculation of the color
3736 </summary>
3737 </member> 5174 </member>
3738 <member name="T:OpenMetaverse.AppearanceManager.TextureData"> 5175 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket.AgentDataBlock">
3739 <summary> 5176 <exclude/>
3740 Holds a texture assetID and the data needed to bake this layer into
3741 an outfit texture. Used to keep track of currently worn textures
3742 and baking data
3743 </summary>
3744 </member> 5177 </member>
3745 <member name="F:OpenMetaverse.AppearanceManager.TextureData.TextureID"> 5178 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket.ObjectDataBlock">
3746 <summary>A texture AssetID</summary> 5179 <exclude/>
3747 </member> 5180 </member>
3748 <member name="F:OpenMetaverse.AppearanceManager.TextureData.Texture"> 5181 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket">
3749 <summary>Asset data for the texture</summary> 5182 <exclude/>
3750 </member> 5183 </member>
3751 <member name="F:OpenMetaverse.AppearanceManager.TextureData.AlphaMasks"> 5184 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket.AgentDataBlock">
3752 <summary>Collection of alpha masks that needs applying</summary> 5185 <exclude/>
3753 </member> 5186 </member>
3754 <member name="F:OpenMetaverse.AppearanceManager.TextureData.Color"> 5187 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket.ExtraPhysicsBlock">
3755 <summary>Tint that should be applied to the texture</summary> 5188 <exclude/>
3756 </member> 5189 </member>
3757 <member name="F:OpenMetaverse.AppearanceManager.TextureData.TextureIndex"> 5190 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket">
3758 <summary>Where on avatar does this texture belong</summary> 5191 <exclude/>
3759 </member> 5192 </member>
3760 <member name="F:OpenMetaverse.AppearanceManager.MAX_CONCURRENT_DOWNLOADS"> 5193 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket.AgentDataBlock">
3761 <summary>Maximum number of concurrent downloads for wearable assets and textures</summary> 5194 <exclude/>
3762 </member> 5195 </member>
3763 <member name="F:OpenMetaverse.AppearanceManager.MAX_CONCURRENT_UPLOADS"> 5196 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket.ObjectDataBlock">
3764 <summary>Maximum number of concurrent uploads for baked textures</summary> 5197 <exclude/>
3765 </member> 5198 </member>
3766 <member name="F:OpenMetaverse.AppearanceManager.INVENTORY_TIMEOUT"> 5199 <member name="T:OpenMetaverse.Packets.ObjectImagePacket">
3767 <summary>Timeout for fetching inventory listings</summary> 5200 <exclude/>
3768 </member> 5201 </member>
3769 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_TIMEOUT"> 5202 <member name="T:OpenMetaverse.Packets.ObjectImagePacket.AgentDataBlock">
3770 <summary>Timeout for fetching a single wearable, or receiving a single packet response</summary> 5203 <exclude/>
3771 </member> 5204 </member>
3772 <member name="F:OpenMetaverse.AppearanceManager.TEXTURE_TIMEOUT"> 5205 <member name="T:OpenMetaverse.Packets.ObjectImagePacket.ObjectDataBlock">
3773 <summary>Timeout for fetching a single texture</summary> 5206 <exclude/>
3774 </member> 5207 </member>
3775 <member name="F:OpenMetaverse.AppearanceManager.UPLOAD_TIMEOUT"> 5208 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket">
3776 <summary>Timeout for uploading a single baked texture</summary> 5209 <exclude/>
3777 </member> 5210 </member>
3778 <member name="F:OpenMetaverse.AppearanceManager.UPLOAD_RETRIES"> 5211 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket.AgentDataBlock">
3779 <summary>Number of times to retry bake upload</summary> 5212 <exclude/>
3780 </member> 5213 </member>
3781 <member name="F:OpenMetaverse.AppearanceManager.REBAKE_DELAY"> 5214 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket.ObjectDataBlock">
3782 <summary>When changing outfit, kick off rebake after 5215 <exclude/>
3783 20 seconds has passed since the last change</summary>
3784 </member> 5216 </member>
3785 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_COUNT"> 5217 <member name="T:OpenMetaverse.Packets.ObjectShapePacket">
3786 <summary>Total number of wearables for each avatar</summary> 5218 <exclude/>
3787 </member> 5219 </member>
3788 <member name="F:OpenMetaverse.AppearanceManager.BAKED_TEXTURE_COUNT"> 5220 <member name="T:OpenMetaverse.Packets.ObjectShapePacket.AgentDataBlock">
3789 <summary>Total number of baked textures on each avatar</summary> 5221 <exclude/>
3790 </member> 5222 </member>
3791 <member name="F:OpenMetaverse.AppearanceManager.WEARABLES_PER_LAYER"> 5223 <member name="T:OpenMetaverse.Packets.ObjectShapePacket.ObjectDataBlock">
3792 <summary>Total number of wearables per bake layer</summary> 5224 <exclude/>
3793 </member> 5225 </member>
3794 <member name="F:OpenMetaverse.AppearanceManager.BakeIndexToTextureIndex"> 5226 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket">
3795 <summary>Mapping between BakeType and AvatarTextureIndex</summary> 5227 <exclude/>
3796 </member> 5228 </member>
3797 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_BAKE_MAP"> 5229 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket.AgentDataBlock">
3798 <summary>Map of what wearables are included in each bake</summary> 5230 <exclude/>
3799 </member> 5231 </member>
3800 <member name="F:OpenMetaverse.AppearanceManager.BAKED_TEXTURE_HASH"> 5232 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket.ObjectDataBlock">
3801 <summary>Magic values to finalize the cache check hashes for each 5233 <exclude/>
3802 bake</summary>
3803 </member> 5234 </member>
3804 <member name="F:OpenMetaverse.AppearanceManager.DEFAULT_AVATAR_TEXTURE"> 5235 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket">
3805 <summary>Default avatar texture, used to detect when a custom 5236 <exclude/>
3806 texture is not set for a face</summary>
3807 </member> 5237 </member>
3808 <member name="F:OpenMetaverse.AppearanceManager.m_AgentWearablesReply"> 5238 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.AgentDataBlock">
3809 <summary>The event subscribers. null if no subcribers</summary> 5239 <exclude/>
3810 </member> 5240 </member>
3811 <member name="F:OpenMetaverse.AppearanceManager.m_AgentWearablesLock"> 5241 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.HeaderDataBlock">
3812 <summary>Thread sync lock object</summary> 5242 <exclude/>
3813 </member> 5243 </member>
3814 <member name="F:OpenMetaverse.AppearanceManager.m_AgentCachedBakesReply"> 5244 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.ObjectDataBlock">
3815 <summary>The event subscribers. null if no subcribers</summary> 5245 <exclude/>
3816 </member> 5246 </member>
3817 <member name="F:OpenMetaverse.AppearanceManager.m_AgentCachedBakesLock"> 5247 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket">
3818 <summary>Thread sync lock object</summary> 5248 <exclude/>
3819 </member> 5249 </member>
3820 <member name="F:OpenMetaverse.AppearanceManager.m_AppearanceSet"> 5250 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket.AgentDataBlock">
3821 <summary>The event subscribers. null if no subcribers</summary> 5251 <exclude/>
3822 </member> 5252 </member>
3823 <member name="F:OpenMetaverse.AppearanceManager.m_AppearanceSetLock"> 5253 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket.ObjectDataBlock">
3824 <summary>Thread sync lock object</summary> 5254 <exclude/>
3825 </member> 5255 </member>
3826 <member name="F:OpenMetaverse.AppearanceManager.m_RebakeAvatarReply"> 5256 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket">
3827 <summary>The event subscribers. null if no subcribers</summary> 5257 <exclude/>
3828 </member> 5258 </member>
3829 <member name="F:OpenMetaverse.AppearanceManager.m_RebakeAvatarLock"> 5259 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket.AgentDataBlock">
3830 <summary>Thread sync lock object</summary> 5260 <exclude/>
3831 </member> 5261 </member>
3832 <member name="F:OpenMetaverse.AppearanceManager.MyVisualParameters"> 5262 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket.ObjectDataBlock">
3833 <summary>Visual parameters last sent to the sim</summary> 5263 <exclude/>
3834 </member> 5264 </member>
3835 <member name="F:OpenMetaverse.AppearanceManager.MyTextures"> 5265 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket">
3836 <summary>Textures about this client sent to the sim</summary> 5266 <exclude/>
3837 </member> 5267 </member>
3838 <member name="F:OpenMetaverse.AppearanceManager.Wearables"> 5268 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket.AgentDataBlock">
3839 <summary>A cache of wearables currently being worn</summary> 5269 <exclude/>
3840 </member> 5270 </member>
3841 <member name="F:OpenMetaverse.AppearanceManager.Textures"> 5271 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket.DataBlock">
3842 <summary>A cache of textures currently being worn</summary> 5272 <exclude/>
3843 </member> 5273 </member>
3844 <member name="F:OpenMetaverse.AppearanceManager.CacheCheckSerialNum"> 5274 <member name="T:OpenMetaverse.Packets.DerezContainerPacket">
3845 <summary>Incrementing serial number for AgentCachedTexture packets</summary> 5275 <exclude/>
3846 </member> 5276 </member>
3847 <member name="F:OpenMetaverse.AppearanceManager.SetAppearanceSerialNum"> 5277 <member name="T:OpenMetaverse.Packets.DerezContainerPacket.DataBlock">
3848 <summary>Incrementing serial number for AgentSetAppearance packets</summary> 5278 <exclude/>
3849 </member> 5279 </member>
3850 <member name="F:OpenMetaverse.AppearanceManager.AppearanceThreadRunning"> 5280 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket">
3851 <summary>Indicates whether or not the appearance thread is currently 5281 <exclude/>
3852 running, to prevent multiple appearance threads from running
3853 simultaneously</summary>
3854 </member> 5282 </member>
3855 <member name="F:OpenMetaverse.AppearanceManager.Client"> 5283 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.AgentDataBlock">
3856 <summary>Reference to our agent</summary> 5284 <exclude/>
3857 </member> 5285 </member>
3858 <member name="F:OpenMetaverse.AppearanceManager.RebakeScheduleTimer"> 5286 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.HeaderDataBlock">
3859 <summary> 5287 <exclude/>
3860 Timer used for delaying rebake on changing outfit
3861 </summary>
3862 </member> 5288 </member>
3863 <member name="F:OpenMetaverse.AppearanceManager.AppearanceThread"> 5289 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.ObjectDataBlock">
3864 <summary> 5290 <exclude/>
3865 Main appearance thread
3866 </summary>
3867 </member> 5291 </member>
3868 <member name="E:OpenMetaverse.AppearanceManager.AgentWearablesReply"> 5292 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket">
3869 <summary>Triggered when an AgentWearablesUpdate packet is received, 5293 <exclude/>
3870 telling us what our avatar is currently wearing
3871 <see cref="M:OpenMetaverse.AppearanceManager.RequestAgentWearables" /> request.</summary>
3872 </member> 5294 </member>
3873 <member name="E:OpenMetaverse.AppearanceManager.CachedBakesReply"> 5295 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket.AgentDataBlock">
3874 <summary>Raised when an AgentCachedTextureResponse packet is 5296 <exclude/>
3875 received, giving a list of cached bakes that were found on the
3876 simulator
3877 <seealso cref="M:OpenMetaverse.AppearanceManager.RequestCachedBakes" /> request.</summary>
3878 </member> 5297 </member>
3879 <member name="E:OpenMetaverse.AppearanceManager.AppearanceSet"> 5298 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket.ObjectDataBlock">
3880 <summary> 5299 <exclude/>
3881 Raised when appearance data is sent to the simulator, also indicates
3882 the main appearance thread is finished.
3883 </summary>
3884 <seealso cref="M:OpenMetaverse.AppearanceManager.RequestAgentSetAppearance" /> request.</member>
3885 <member name="E:OpenMetaverse.AppearanceManager.RebakeAvatarRequested">
3886 <summary>
3887 Triggered when the simulator requests the agent rebake its appearance.
3888 </summary>
3889 <seealso cref="!:RebakeAvatarRequest" />
3890 </member> 5300 </member>
3891 <member name="P:OpenMetaverse.AppearanceManager.ManagerBusy"> 5301 <member name="T:OpenMetaverse.Packets.ObjectNamePacket">
3892 <summary> 5302 <exclude/>
3893 Returns true if AppearanceManager is busy and trying to set or change appearance will fail
3894 </summary>
3895 </member> 5303 </member>
3896 <member name="M:OpenMetaverse.AppearanceManager.OnAgentWearables(OpenMetaverse.AgentWearablesReplyEventArgs)"> 5304 <member name="T:OpenMetaverse.Packets.ObjectNamePacket.AgentDataBlock">
3897 <summary>Raises the AgentWearablesReply event</summary> 5305 <exclude/>
3898 <param name="e">An AgentWearablesReplyEventArgs object containing the
3899 data returned from the data server</param>
3900 </member> 5306 </member>
3901 <member name="M:OpenMetaverse.AppearanceManager.OnAgentCachedBakes(OpenMetaverse.AgentCachedBakesReplyEventArgs)"> 5307 <member name="T:OpenMetaverse.Packets.ObjectNamePacket.ObjectDataBlock">
3902 <summary>Raises the CachedBakesReply event</summary> 5308 <exclude/>
3903 <param name="e">An AgentCachedBakesReplyEventArgs object containing the
3904 data returned from the data server AgentCachedTextureResponse</param>
3905 </member> 5309 </member>
3906 <member name="M:OpenMetaverse.AppearanceManager.OnAppearanceSet(OpenMetaverse.AppearanceSetEventArgs)"> 5310 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket">
3907 <summary>Raises the AppearanceSet event</summary> 5311 <exclude/>
3908 <param name="e">An AppearanceSetEventArgs object indicating if the operatin was successfull</param>
3909 </member> 5312 </member>
3910 <member name="M:OpenMetaverse.AppearanceManager.OnRebakeAvatar(OpenMetaverse.RebakeAvatarTexturesEventArgs)"> 5313 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket.AgentDataBlock">
3911 <summary>Raises the RebakeAvatarRequested event</summary> 5314 <exclude/>
3912 <param name="e">An RebakeAvatarTexturesEventArgs object containing the
3913 data returned from the data server</param>
3914 </member> 5315 </member>
3915 <member name="M:OpenMetaverse.AppearanceManager.SetPreviousAppearance"> 5316 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket.ObjectDataBlock">
3916 <summary> 5317 <exclude/>
3917 Obsolete method for setting appearance. This function no longer does anything.
3918 Use RequestSetAppearance() to manually start the appearance thread
3919 </summary>
3920 </member> 5318 </member>
3921 <member name="M:OpenMetaverse.AppearanceManager.SetPreviousAppearance(System.Boolean)"> 5319 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket">
3922 <summary> 5320 <exclude/>
3923 Obsolete method for setting appearance. This function no longer does anything.
3924 Use RequestSetAppearance() to manually start the appearance thread
3925 </summary>
3926 <param name="allowBake">Unused parameter</param>
3927 </member> 5321 </member>
3928 <member name="M:OpenMetaverse.AppearanceManager.RequestSetAppearance"> 5322 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket.AgentDataBlock">
3929 <summary> 5323 <exclude/>
3930 Starts the appearance setting thread
3931 </summary>
3932 </member> 5324 </member>
3933 <member name="M:OpenMetaverse.AppearanceManager.RequestSetAppearance(System.Boolean)"> 5325 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket.ObjectDataBlock">
3934 <summary> 5326 <exclude/>
3935 Starts the appearance setting thread
3936 </summary>
3937 <param name="forceRebake">True to force rebaking, otherwise false</param>
3938 </member> 5327 </member>
3939 <member name="M:OpenMetaverse.AppearanceManager.RequestAgentWearables"> 5328 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket">
3940 <summary> 5329 <exclude/>
3941 Ask the server what textures our agent is currently wearing
3942 </summary>
3943 </member> 5330 </member>
3944 <member name="M:OpenMetaverse.AppearanceManager.RequestCachedBakes"> 5331 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket.AgentDataBlock">
3945 <summary> 5332 <exclude/>
3946 Build hashes out of the texture assetIDs for each baking layer to
3947 ask the simulator whether it has cached copies of each baked texture
3948 </summary>
3949 </member> 5333 </member>
3950 <member name="M:OpenMetaverse.AppearanceManager.GetWearableAsset(OpenMetaverse.WearableType)"> 5334 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket.ObjectDataBlock">
3951 <summary> 5335 <exclude/>
3952 Returns the AssetID of the asset that is currently being worn in a
3953 given WearableType slot
3954 </summary>
3955 <param name="type">WearableType slot to get the AssetID for</param>
3956 <returns>The UUID of the asset being worn in the given slot, or
3957 UUID.Zero if no wearable is attached to the given slot or wearables
3958 have not been downloaded yet</returns>
3959 </member> 5336 </member>
3960 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(OpenMetaverse.InventoryItem)"> 5337 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket">
3961 <summary> 5338 <exclude/>
3962 Add a wearable to the current outfit and set appearance
3963 </summary>
3964 <param name="wearableItem">Wearable to be added to the outfit</param>
3965 </member> 5339 </member>
3966 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})"> 5340 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket.AgentDataBlock">
3967 <summary> 5341 <exclude/>
3968 Add a list of wearables to the current outfit and set appearance
3969 </summary>
3970 <param name="wearableItems">List of wearable inventory items to
3971 be added to the outfit</param>
3972 </member> 5342 </member>
3973 <member name="M:OpenMetaverse.AppearanceManager.RemoveFromOutfit(OpenMetaverse.InventoryItem)"> 5343 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket.ObjectDataBlock">
3974 <summary> 5344 <exclude/>
3975 Remove a wearable from the current outfit and set appearance
3976 </summary>
3977 <param name="wearableItem">Wearable to be removed from the outfit</param>
3978 </member> 5345 </member>
3979 <member name="M:OpenMetaverse.AppearanceManager.RemoveFromOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})"> 5346 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket">
3980 <summary> 5347 <exclude/>
3981 Removes a list of wearables from the current outfit and set appearance
3982 </summary>
3983 <param name="wearableItems">List of wearable inventory items to
3984 be removed from the outfit</param>
3985 </member> 5348 </member>
3986 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})"> 5349 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket.AgentDataBlock">
3987 <summary> 5350 <exclude/>
3988 Replace the current outfit with a list of wearables and set appearance
3989 </summary>
3990 <param name="wearableItems">List of wearable inventory items that
3991 define a new outfit</param>
3992 </member> 5351 </member>
3993 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean)"> 5352 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket.ObjectDataBlock">
3994 <summary> 5353 <exclude/>
3995 Replace the current outfit with a list of wearables and set appearance
3996 </summary>
3997 <param name="wearableItems">List of wearable inventory items that
3998 define a new outfit</param>
3999 <param name="safe">Check if we have all body parts, set this to false only
4000 if you know what you're doing</param>
4001 </member> 5354 </member>
4002 <member name="M:OpenMetaverse.AppearanceManager.IsItemWorn(OpenMetaverse.InventoryItem)"> 5355 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket">
4003 <summary> 5356 <exclude/>
4004 Checks if an inventory item is currently being worn
4005 </summary>
4006 <param name="item">The inventory item to check against the agent
4007 wearables</param>
4008 <returns>The WearableType slot that the item is being worn in,
4009 or WearbleType.Invalid if it is not currently being worn</returns>
4010 </member> 5357 </member>
4011 <member name="M:OpenMetaverse.AppearanceManager.GetWearables"> 5358 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket.AgentDataBlock">
4012 <summary> 5359 <exclude/>
4013 Returns a copy of the agents currently worn wearables
4014 </summary>
4015 <returns>A copy of the agents currently worn wearables</returns>
4016 <remarks>Avoid calling this function multiple times as it will make
4017 a copy of all of the wearable data each time</remarks>
4018 </member> 5360 </member>
4019 <member name="M:OpenMetaverse.AppearanceManager.WearOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryBase},System.Boolean)"> 5361 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket.ObjectDataBlock">
4020 <summary> 5362 <exclude/>
4021 Calls either <seealso cref="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryWearable})" /> or
4022 <seealso cref="M:OpenMetaverse.AppearanceManager.AddToOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})" /> depending on the value of
4023 replaceItems
4024 </summary>
4025 <param name="wearables">List of wearable inventory items to add
4026 to the outfit or become a new outfit</param>
4027 <param name="replaceItems">True to replace existing items with the
4028 new list of items, false to add these items to the existing outfit</param>
4029 </member> 5363 </member>
4030 <member name="M:OpenMetaverse.AppearanceManager.AddAttachments(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean)"> 5364 <member name="T:OpenMetaverse.Packets.ObjectDropPacket">
4031 <summary> 5365 <exclude/>
4032 Adds a list of attachments to our agent
4033 </summary>
4034 <param name="attachments">A List containing the attachments to add</param>
4035 <param name="removeExistingFirst">If true, tells simulator to remove existing attachment
4036 first</param>
4037 </member> 5366 </member>
4038 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.InventoryItem,OpenMetaverse.AttachmentPoint)"> 5367 <member name="T:OpenMetaverse.Packets.ObjectDropPacket.AgentDataBlock">
4039 <summary> 5368 <exclude/>
4040 Attach an item to our agent at a specific attach point
4041 </summary>
4042 <param name="item">A <seealso cref="T:OpenMetaverse.InventoryItem" /> to attach</param>
4043 <param name="attachPoint">the <seealso cref="T:OpenMetaverse.AttachmentPoint" /> on the avatar
4044 to attach the item to</param>
4045 </member> 5369 </member>
4046 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.Permissions,System.UInt32,OpenMetaverse.AttachmentPoint)"> 5370 <member name="T:OpenMetaverse.Packets.ObjectDropPacket.ObjectDataBlock">
4047 <summary> 5371 <exclude/>
4048 Attach an item to our agent specifying attachment details
4049 </summary>
4050 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the item to attach</param>
4051 <param name="ownerID">The <seealso cref="T:OpenMetaverse.UUID" /> attachments owner</param>
4052 <param name="name">The name of the attachment</param>
4053 <param name="description">The description of the attahment</param>
4054 <param name="perms">The <seealso cref="T:OpenMetaverse.Permissions" /> to apply when attached</param>
4055 <param name="itemFlags">The <seealso cref="T:OpenMetaverse.InventoryItemFlags" /> of the attachment</param>
4056 <param name="attachPoint">The <seealso cref="T:OpenMetaverse.AttachmentPoint" /> on the agent
4057 to attach the item to</param>
4058 </member> 5372 </member>
4059 <member name="M:OpenMetaverse.AppearanceManager.Detach(OpenMetaverse.InventoryItem)"> 5373 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket">
4060 <summary> 5374 <exclude/>
4061 Detach an item from our agent using an <seealso cref="T:OpenMetaverse.InventoryItem" /> object
4062 </summary>
4063 <param name="item">An <seealso cref="T:OpenMetaverse.InventoryItem" /> object</param>
4064 </member> 5375 </member>
4065 <member name="M:OpenMetaverse.AppearanceManager.Detach(OpenMetaverse.UUID)"> 5376 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket.AgentDataBlock">
4066 <summary> 5377 <exclude/>
4067 Detach an item from our agent
4068 </summary>
4069 <param name="itemID">The inventory itemID of the item to detach</param>
4070 </member> 5378 </member>
4071 <member name="M:OpenMetaverse.AppearanceManager.SendAgentIsNowWearing"> 5379 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket.ObjectDataBlock">
4072 <summary> 5380 <exclude/>
4073 Inform the sim which wearables are part of our current outfit
4074 </summary>
4075 </member> 5381 </member>
4076 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryWearable})"> 5382 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket">
4077 <summary> 5383 <exclude/>
4078 Replaces the Wearables collection with a list of new wearable items
4079 </summary>
4080 <param name="wearableItems">Wearable items to replace the Wearables collection with</param>
4081 </member> 5384 </member>
4082 <member name="M:OpenMetaverse.AppearanceManager.GetColorFromParams(System.Collections.Generic.List{OpenMetaverse.AppearanceManager.ColorParamInfo})"> 5385 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket.AgentDataBlock">
4083 <summary> 5386 <exclude/>
4084 Calculates base color/tint for a specific wearable
4085 based on its params
4086 </summary>
4087 <param name="param">All the color info gathered from wearable's VisualParams
4088 passed as list of ColorParamInfo tuples</param>
4089 <returns>Base color/tint for the wearable</returns>
4090 </member> 5387 </member>
4091 <member name="M:OpenMetaverse.AppearanceManager.GetAgentWearables"> 5388 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket.ObjectDataBlock">
4092 <summary> 5389 <exclude/>
4093 Blocking method to populate the Wearables dictionary
4094 </summary>
4095 <returns>True on success, otherwise false</returns>
4096 </member> 5390 </member>
4097 <member name="M:OpenMetaverse.AppearanceManager.GetCachedBakes"> 5391 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket">
4098 <summary> 5392 <exclude/>
4099 Blocking method to populate the Textures array with cached bakes
4100 </summary>
4101 <returns>True on success, otherwise false</returns>
4102 </member> 5393 </member>
4103 <member name="M:OpenMetaverse.AppearanceManager.DecodeWearableParams(OpenMetaverse.AppearanceManager.WearableData)"> 5394 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.AgentDataBlock">
4104 <summary> 5395 <exclude/>
4105 Populates textures and visual params from a decoded asset
4106 </summary>
4107 <param name="wearable">Wearable to decode</param>
4108 </member> 5396 </member>
4109 <member name="M:OpenMetaverse.AppearanceManager.DownloadWearables"> 5397 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.ObjectDataBlock">
4110 <summary> 5398 <exclude/>
4111 Blocking method to download and parse currently worn wearable assets
4112 </summary>
4113 <returns>True on success, otherwise false</returns>
4114 </member> 5399 </member>
4115 <member name="M:OpenMetaverse.AppearanceManager.GetTextureDownloadList(OpenMetaverse.BakeType)"> 5400 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.SurfaceInfoBlock">
4116 <summary> 5401 <exclude/>
4117 Get a list of all of the textures that need to be downloaded for a
4118 single bake layer
4119 </summary>
4120 <param name="bakeType">Bake layer to get texture AssetIDs for</param>
4121 <returns>A list of texture AssetIDs to download</returns>
4122 </member> 5402 </member>
4123 <member name="M:OpenMetaverse.AppearanceManager.AddTextureDownload(OpenMetaverse.AvatarTextureIndex,System.Collections.Generic.List{OpenMetaverse.UUID})"> 5403 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket">
4124 <summary> 5404 <exclude/>
4125 Helper method to lookup the TextureID for a single layer and add it
4126 to a list if it is not already present
4127 </summary>
4128 <param name="index">
4129 </param>
4130 <param name="textures">
4131 </param>
4132 </member> 5405 </member>
4133 <member name="M:OpenMetaverse.AppearanceManager.DownloadTextures(System.Collections.Generic.List{OpenMetaverse.BakeType})"> 5406 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.AgentDataBlock">
4134 <summary> 5407 <exclude/>
4135 Blocking method to download all of the textures needed for baking
4136 the given bake layers
4137 </summary>
4138 <param name="bakeLayers">A list of layers that need baking</param>
4139 <remarks>No return value is given because the baking will happen
4140 whether or not all textures are successfully downloaded</remarks>
4141 </member> 5408 </member>
4142 <member name="M:OpenMetaverse.AppearanceManager.CreateBakes"> 5409 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.ObjectDataBlock">
4143 <summary> 5410 <exclude/>
4144 Blocking method to create and upload baked textures for all of the
4145 missing bakes
4146 </summary>
4147 <returns>True on success, otherwise false</returns>
4148 </member> 5411 </member>
4149 <member name="M:OpenMetaverse.AppearanceManager.CreateBake(OpenMetaverse.BakeType)"> 5412 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.SurfaceInfoBlock">
4150 <summary> 5413 <exclude/>
4151 Blocking method to create and upload a baked texture for a single
4152 bake layer
4153 </summary>
4154 <param name="bakeType">Layer to bake</param>
4155 <returns>True on success, otherwise false</returns>
4156 </member> 5414 </member>
4157 <member name="M:OpenMetaverse.AppearanceManager.UploadBake(System.Byte[])"> 5415 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket">
4158 <summary> 5416 <exclude/>
4159 Blocking method to upload a baked texture
4160 </summary>
4161 <param name="textureData">Five channel JPEG2000 texture data to upload</param>
4162 <returns>UUID of the newly created asset on success, otherwise UUID.Zero</returns>
4163 </member> 5417 </member>
4164 <member name="M:OpenMetaverse.AppearanceManager.MakeParamValues"> 5418 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.AgentDataBlock">
4165 <summary> 5419 <exclude/>
4166 Creates a dictionary of visual param values from the downloaded wearables
4167 </summary>
4168 <returns>A dictionary of visual param indices mapping to visual param
4169 values for our agent that can be fed to the Baker class</returns>
4170 </member> 5420 </member>
4171 <member name="M:OpenMetaverse.AppearanceManager.RequestAgentSetAppearance"> 5421 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.ObjectDataBlock">
4172 <summary> 5422 <exclude/>
4173 Create an AgentSetAppearance packet from Wearables data and the
4174 Textures array and send it
4175 </summary>
4176 </member> 5423 </member>
4177 <member name="M:OpenMetaverse.AppearanceManager.WearableTypeToAssetType(OpenMetaverse.WearableType)"> 5424 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.SurfaceInfoBlock">
4178 <summary> 5425 <exclude/>
4179 Converts a WearableType to a bodypart or clothing WearableType
4180 </summary>
4181 <param name="type">A WearableType</param>
4182 <returns>AssetType.Bodypart or AssetType.Clothing or AssetType.Unknown</returns>
4183 </member> 5426 </member>
4184 <member name="M:OpenMetaverse.AppearanceManager.BakeTypeToAgentTextureIndex(OpenMetaverse.BakeType)"> 5427 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket">
4185 <summary> 5428 <exclude/>
4186 Converts a BakeType to the corresponding baked texture slot in AvatarTextureIndex
4187 </summary>
4188 <param name="index">A BakeType</param>
4189 <returns>The AvatarTextureIndex slot that holds the given BakeType</returns>
4190 </member> 5429 </member>
4191 <member name="M:OpenMetaverse.AppearanceManager.MorphLayerForBakeType(OpenMetaverse.BakeType)"> 5430 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket.AgentDataBlock">
4192 <summary> 5431 <exclude/>
4193 Gives the layer number that is used for morph mask
4194 </summary>
4195 <param name="bakeType">&gt;A BakeType</param>
4196 <returns>Which layer number as defined in BakeTypeToTextures is used for morph mask</returns>
4197 </member> 5432 </member>
4198 <member name="M:OpenMetaverse.AppearanceManager.BakeTypeToTextures(OpenMetaverse.BakeType)"> 5433 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket.ObjectDataBlock">
4199 <summary> 5434 <exclude/>
4200 Converts a BakeType to a list of the texture slots that make up that bake
4201 </summary>
4202 <param name="bakeType">A BakeType</param>
4203 <returns>A list of texture slots that are inputs for the given bake</returns>
4204 </member> 5435 </member>
4205 <member name="T:OpenMetaverse.AgentWearablesReplyEventArgs"> 5436 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket">
4206 <summary>Contains the Event data returned from the data server from an AgentWearablesRequest</summary> 5437 <exclude/>
4207 </member> 5438 </member>
4208 <member name="M:OpenMetaverse.AgentWearablesReplyEventArgs.#ctor"> 5439 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket.AgentDataBlock">
4209 <summary>Construct a new instance of the AgentWearablesReplyEventArgs class</summary> 5440 <exclude/>
4210 </member> 5441 </member>
4211 <member name="T:OpenMetaverse.AgentCachedBakesReplyEventArgs"> 5442 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket.ObjectDataBlock">
4212 <summary>Contains the Event data returned from the data server from an AgentCachedTextureResponse</summary> 5443 <exclude/>
4213 </member> 5444 </member>
4214 <member name="M:OpenMetaverse.AgentCachedBakesReplyEventArgs.#ctor"> 5445 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket">
4215 <summary>Construct a new instance of the AgentCachedBakesReplyEventArgs class</summary> 5446 <exclude/>
4216 </member> 5447 </member>
4217 <member name="T:OpenMetaverse.AppearanceSetEventArgs"> 5448 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket.AgentDataBlock">
4218 <summary>Contains the Event data returned from an AppearanceSetRequest</summary> 5449 <exclude/>
4219 </member> 5450 </member>
4220 <member name="M:OpenMetaverse.AppearanceSetEventArgs.#ctor(System.Boolean)"> 5451 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket.ObjectDataBlock">
4221 <summary> 5452 <exclude/>
4222 Triggered when appearance data is sent to the sim and
4223 the main appearance thread is done.</summary>
4224 <param name="success">Indicates whether appearance setting was successful</param>
4225 </member> 5453 </member>
4226 <member name="P:OpenMetaverse.AppearanceSetEventArgs.Success"> 5454 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket">
4227 <summary>Indicates whether appearance setting was successful</summary> 5455 <exclude/>
4228 </member> 5456 </member>
4229 <member name="T:OpenMetaverse.RebakeAvatarTexturesEventArgs"> 5457 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket.AgentDataBlock">
4230 <summary>Contains the Event data returned from the data server from an RebakeAvatarTextures</summary> 5458 <exclude/>
4231 </member> 5459 </member>
4232 <member name="M:OpenMetaverse.RebakeAvatarTexturesEventArgs.#ctor(OpenMetaverse.UUID)"> 5460 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket.ObjectDataBlock">
4233 <summary> 5461 <exclude/>
4234 Triggered when the simulator sends a request for this agent to rebake
4235 its appearance
4236 </summary>
4237 <param name="textureID">The ID of the Texture Layer to bake</param>
4238 </member> 5462 </member>
4239 <member name="P:OpenMetaverse.RebakeAvatarTexturesEventArgs.TextureID"> 5463 <member name="T:OpenMetaverse.Packets.ModifyLandPacket">
4240 <summary>The ID of the Texture Layer to bake</summary> 5464 <exclude/>
4241 </member> 5465 </member>
4242 <member name="T:OpenMetaverse.AssetCache"> 5466 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.AgentDataBlock">
4243 <summary> 5467 <exclude/>
4244 Class that handles the local asset cache
4245 </summary>
4246 </member> 5468 </member>
4247 <member name="M:OpenMetaverse.AssetCache.#ctor(OpenMetaverse.GridClient)"> 5469 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ModifyBlockBlock">
4248 <summary> 5470 <exclude/>
4249 Default constructor
4250 </summary>
4251 <param name="client">A reference to the GridClient object</param>
4252 </member> 5471 </member>
4253 <member name="T:OpenMetaverse.AssetCache.SortFilesByAccesTimeHelper"> 5472 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ParcelDataBlock">
4254 <summary> 5473 <exclude/>
4255 Helper class for sorting files by their last accessed time
4256 </summary>
4257 </member> 5474 </member>
4258 <member name="P:OpenMetaverse.AssetCache.AutoPruneEnabled"> 5475 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ModifyBlockExtendedBlock">
4259 <summary> 5476 <exclude/>
4260 Allows setting weather to periodicale prune the cache if it grows too big
4261 Default is enabled, when caching is enabled
4262 </summary>
4263 </member> 5477 </member>
4264 <member name="P:OpenMetaverse.AssetCache.AutoPruneInterval"> 5478 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOnPacket">
4265 <summary> 5479 <exclude/>
4266 How long (in ms) between cache checks (default is 5 min.)
4267 </summary>
4268 </member> 5480 </member>
4269 <member name="M:OpenMetaverse.AssetCache.DestroyTimer"> 5481 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOnPacket.AgentDataBlock">
4270 <summary> 5482 <exclude/>
4271 Disposes cleanup timer
4272 </summary>
4273 </member> 5483 </member>
4274 <member name="M:OpenMetaverse.AssetCache.SetupTimer"> 5484 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOffPacket">
4275 <summary> 5485 <exclude/>
4276 Only create timer when needed
4277 </summary>
4278 </member> 5486 </member>
4279 <member name="M:OpenMetaverse.AssetCache.GetCachedAssetBytes(OpenMetaverse.UUID)"> 5487 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOffPacket.AgentDataBlock">
4280 <summary> 5488 <exclude/>
4281 Return bytes read from the local asset cache, null if it does not exist
4282 </summary>
4283 <param name="assetID">UUID of the asset we want to get</param>
4284 <returns>Raw bytes of the asset, or null on failure</returns>
4285 </member> 5489 </member>
4286 <member name="M:OpenMetaverse.AssetCache.GetCachedImage(OpenMetaverse.UUID)"> 5490 <member name="T:OpenMetaverse.Packets.StateSavePacket">
4287 <summary> 5491 <exclude/>
4288 Returns ImageDownload object of the
4289 image from the local image cache, null if it does not exist
4290 </summary>
4291 <param name="imageID">UUID of the image we want to get</param>
4292 <returns>ImageDownload object containing the image, or null on failure</returns>
4293 </member> 5492 </member>
4294 <member name="M:OpenMetaverse.AssetCache.FileName(OpenMetaverse.UUID)"> 5493 <member name="T:OpenMetaverse.Packets.StateSavePacket.AgentDataBlock">
4295 <summary> 5494 <exclude/>
4296 Constructs a file name of the cached asset
4297 </summary>
4298 <param name="assetID">UUID of the asset</param>
4299 <returns>String with the file name of the cahced asset</returns>
4300 </member> 5495 </member>
4301 <member name="M:OpenMetaverse.AssetCache.StaticFileName(OpenMetaverse.UUID)"> 5496 <member name="T:OpenMetaverse.Packets.StateSavePacket.DataBlockBlock">
4302 <summary> 5497 <exclude/>
4303 Constructs a file name of the static cached asset
4304 </summary>
4305 <param name="assetID">UUID of the asset</param>
4306 <returns>String with the file name of the static cached asset</returns>
4307 </member> 5498 </member>
4308 <member name="M:OpenMetaverse.AssetCache.SaveAssetToCache(OpenMetaverse.UUID,System.Byte[])"> 5499 <member name="T:OpenMetaverse.Packets.ReportAutosaveCrashPacket">
4309 <summary> 5500 <exclude/>
4310 Saves an asset to the local cache
4311 </summary>
4312 <param name="assetID">UUID of the asset</param>
4313 <param name="assetData">Raw bytes the asset consists of</param>
4314 <returns>Weather the operation was successfull</returns>
4315 </member> 5501 </member>
4316 <member name="M:OpenMetaverse.AssetCache.AssetFileName(OpenMetaverse.UUID)"> 5502 <member name="T:OpenMetaverse.Packets.ReportAutosaveCrashPacket.AutosaveDataBlock">
4317 <summary> 5503 <exclude/>
4318 Get the file name of the asset stored with gived UUID
4319 </summary>
4320 <param name="assetID">UUID of the asset</param>
4321 <returns>Null if we don't have that UUID cached on disk, file name if found in the cache folder</returns>
4322 </member> 5504 </member>
4323 <member name="M:OpenMetaverse.AssetCache.HasAsset(OpenMetaverse.UUID)"> 5505 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket">
4324 <summary> 5506 <exclude/>
4325 Checks if the asset exists in the local cache
4326 </summary>
4327 <param name="assetID">UUID of the asset</param>
4328 <returns>True is the asset is stored in the cache, otherwise false</returns>
4329 </member> 5507 </member>
4330 <member name="M:OpenMetaverse.AssetCache.Clear"> 5508 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket.AgentDataBlock">
4331 <summary> 5509 <exclude/>
4332 Wipes out entire cache
4333 </summary>
4334 </member> 5510 </member>
4335 <member name="M:OpenMetaverse.AssetCache.Prune"> 5511 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket.DataBlockBlock">
4336 <summary> 5512 <exclude/>
4337 Brings cache size to the 90% of the max size
4338 </summary>
4339 </member> 5513 </member>
4340 <member name="M:OpenMetaverse.AssetCache.BeginPrune"> 5514 <member name="T:OpenMetaverse.Packets.TrackAgentPacket">
4341 <summary> 5515 <exclude/>
4342 Asynchronously brings cache size to the 90% of the max size
4343 </summary>
4344 </member> 5516 </member>
4345 <member name="M:OpenMetaverse.AssetCache.GetFileSize(System.IO.FileInfo[])"> 5517 <member name="T:OpenMetaverse.Packets.TrackAgentPacket.AgentDataBlock">
4346 <summary> 5518 <exclude/>
4347 Adds up file sizes passes in a FileInfo array
4348 </summary>
4349 </member> 5519 </member>
4350 <member name="M:OpenMetaverse.AssetCache.Operational"> 5520 <member name="T:OpenMetaverse.Packets.TrackAgentPacket.TargetDataBlock">
4351 <summary> 5521 <exclude/>
4352 Checks whether caching is enabled
4353 </summary>
4354 </member> 5522 </member>
4355 <member name="M:OpenMetaverse.AssetCache.cleanerTimer_Elapsed(System.Object,System.Timers.ElapsedEventArgs)"> 5523 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket">
4356 <summary> 5524 <exclude/>
4357 Periodically prune the cache
4358 </summary>
4359 </member> 5525 </member>
4360 <member name="M:OpenMetaverse.AssetCache.NiceFileSize(System.Int64)"> 5526 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.AgentDataBlock">
4361 <summary> 5527 <exclude/>
4362 Nicely formats file sizes
4363 </summary>
4364 <param name="byteCount">Byte size we want to output</param>
4365 <returns>String with humanly readable file size</returns>
4366 </member> 5528 </member>
4367 <member name="T:OpenMetaverse.StatusCode"> 5529 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.DownloadTotalsBlock">
4368 <summary> 5530 <exclude/>
4369 </summary>
4370 </member> 5531 </member>
4371 <member name="F:OpenMetaverse.StatusCode.OK"> 5532 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.NetStatsBlock">
4372 <summary>OK</summary> 5533 <exclude/>
4373 </member> 5534 </member>
4374 <member name="F:OpenMetaverse.StatusCode.Done"> 5535 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.FailStatsBlock">
4375 <summary>Transfer completed</summary> 5536 <exclude/>
4376 </member> 5537 </member>
4377 <member name="F:OpenMetaverse.StatusCode.Skip"> 5538 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.MiscStatsBlock">
4378 <summary> 5539 <exclude/>
4379 </summary>
4380 </member> 5540 </member>
4381 <member name="F:OpenMetaverse.StatusCode.Abort"> 5541 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket">
4382 <summary> 5542 <exclude/>
4383 </summary>
4384 </member> 5543 </member>
4385 <member name="F:OpenMetaverse.StatusCode.Error"> 5544 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket.AgentDataBlock">
4386 <summary>Unknown error occurred</summary> 5545 <exclude/>
4387 </member> 5546 </member>
4388 <member name="F:OpenMetaverse.StatusCode.UnknownSource"> 5547 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket.DataBlock">
4389 <summary>Equivalent to a 404 error</summary> 5548 <exclude/>
4390 </member> 5549 </member>
4391 <member name="F:OpenMetaverse.StatusCode.InsufficientPermissions"> 5550 <member name="T:OpenMetaverse.Packets.UserReportPacket">
4392 <summary>Client does not have permission for that resource</summary> 5551 <exclude/>
4393 </member> 5552 </member>
4394 <member name="F:OpenMetaverse.StatusCode.Unknown"> 5553 <member name="T:OpenMetaverse.Packets.UserReportPacket.AgentDataBlock">
4395 <summary>Unknown status</summary> 5554 <exclude/>
4396 </member> 5555 </member>
4397 <member name="T:OpenMetaverse.ChannelType"> 5556 <member name="T:OpenMetaverse.Packets.UserReportPacket.ReportDataBlock">
4398 <summary> 5557 <exclude/>
4399 </summary>
4400 </member> 5558 </member>
4401 <member name="F:OpenMetaverse.ChannelType.Unknown"> 5559 <member name="T:OpenMetaverse.Packets.AlertMessagePacket">
4402 <summary> 5560 <exclude/>
4403 </summary>
4404 </member> 5561 </member>
4405 <member name="F:OpenMetaverse.ChannelType.Misc"> 5562 <member name="T:OpenMetaverse.Packets.AlertMessagePacket.AlertDataBlock">
4406 <summary>Unknown</summary> 5563 <exclude/>
4407 </member> 5564 </member>
4408 <member name="F:OpenMetaverse.ChannelType.Asset"> 5565 <member name="T:OpenMetaverse.Packets.AlertMessagePacket.AlertInfoBlock">
4409 <summary>Virtually all asset transfers use this channel</summary> 5566 <exclude/>
4410 </member> 5567 </member>
4411 <member name="T:OpenMetaverse.SourceType"> 5568 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket">
4412 <summary> 5569 <exclude/>
4413 </summary>
4414 </member> 5570 </member>
4415 <member name="F:OpenMetaverse.SourceType.Unknown"> 5571 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket.AgentDataBlock">
4416 <summary> 5572 <exclude/>
4417 </summary>
4418 </member> 5573 </member>
4419 <member name="F:OpenMetaverse.SourceType.Asset"> 5574 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket.AlertDataBlock">
4420 <summary>Asset from the asset server</summary> 5575 <exclude/>
4421 </member> 5576 </member>
4422 <member name="F:OpenMetaverse.SourceType.SimInventoryItem"> 5577 <member name="T:OpenMetaverse.Packets.MeanCollisionAlertPacket">
4423 <summary>Inventory item</summary> 5578 <exclude/>
4424 </member> 5579 </member>
4425 <member name="F:OpenMetaverse.SourceType.SimEstate"> 5580 <member name="T:OpenMetaverse.Packets.MeanCollisionAlertPacket.MeanCollisionBlock">
4426 <summary>Estate asset, such as an estate covenant</summary> 5581 <exclude/>
4427 </member> 5582 </member>
4428 <member name="T:OpenMetaverse.TargetType"> 5583 <member name="T:OpenMetaverse.Packets.ViewerFrozenMessagePacket">
4429 <summary> 5584 <exclude/>
4430 </summary>
4431 </member> 5585 </member>
4432 <member name="F:OpenMetaverse.TargetType.Unknown"> 5586 <member name="T:OpenMetaverse.Packets.ViewerFrozenMessagePacket.FrozenDataBlock">
4433 <summary> 5587 <exclude/>
4434 </summary>
4435 </member> 5588 </member>
4436 <member name="F:OpenMetaverse.TargetType.File"> 5589 <member name="T:OpenMetaverse.Packets.HealthMessagePacket">
4437 <summary> 5590 <exclude/>
4438 </summary>
4439 </member> 5591 </member>
4440 <member name="F:OpenMetaverse.TargetType.VFile"> 5592 <member name="T:OpenMetaverse.Packets.HealthMessagePacket.HealthDataBlock">
4441 <summary> 5593 <exclude/>
4442 </summary>
4443 </member> 5594 </member>
4444 <member name="T:OpenMetaverse.ImageType"> 5595 <member name="T:OpenMetaverse.Packets.ChatFromSimulatorPacket">
4445 <summary> 5596 <exclude/>
4446 </summary>
4447 </member> 5597 </member>
4448 <member name="F:OpenMetaverse.ImageType.Normal"> 5598 <member name="T:OpenMetaverse.Packets.ChatFromSimulatorPacket.ChatDataBlock">
4449 <summary> 5599 <exclude/>
4450 </summary>
4451 </member> 5600 </member>
4452 <member name="F:OpenMetaverse.ImageType.Baked"> 5601 <member name="T:OpenMetaverse.Packets.SimStatsPacket">
4453 <summary> 5602 <exclude/>
4454 </summary>
4455 </member> 5603 </member>
4456 <member name="T:OpenMetaverse.ImageCodec"> 5604 <member name="T:OpenMetaverse.Packets.SimStatsPacket.RegionBlock">
4457 <summary> 5605 <exclude/>
4458 Image file format
4459 </summary>
4460 </member> 5606 </member>
4461 <member name="T:OpenMetaverse.Transfer"> 5607 <member name="T:OpenMetaverse.Packets.SimStatsPacket.StatBlock">
4462 <summary> 5608 <exclude/>
4463 </summary>
4464 </member> 5609 </member>
4465 <member name="P:OpenMetaverse.Transfer.TimeSinceLastPacket"> 5610 <member name="T:OpenMetaverse.Packets.SimStatsPacket.PidStatBlock">
4466 <summary>Number of milliseconds passed since the last transfer 5611 <exclude/>
4467 packet was received</summary>
4468 </member> 5612 </member>
4469 <member name="T:OpenMetaverse.AssetDownload"> 5613 <member name="T:OpenMetaverse.Packets.SimStatsPacket.RegionInfoBlock">
4470 <summary> 5614 <exclude/>
4471 </summary>
4472 </member> 5615 </member>
4473 <member name="T:OpenMetaverse.XferDownload"> 5616 <member name="T:OpenMetaverse.Packets.RequestRegionInfoPacket">
4474 <summary> 5617 <exclude/>
4475 </summary>
4476 </member> 5618 </member>
4477 <member name="T:OpenMetaverse.ImageDownload"> 5619 <member name="T:OpenMetaverse.Packets.RequestRegionInfoPacket.AgentDataBlock">
4478 <summary> 5620 <exclude/>
4479 </summary>
4480 </member> 5621 </member>
4481 <member name="T:OpenMetaverse.AssetUpload"> 5622 <member name="T:OpenMetaverse.Packets.RegionInfoPacket">
4482 <summary> 5623 <exclude/>
4483 </summary>
4484 </member> 5624 </member>
4485 <member name="T:OpenMetaverse.ImageRequest"> 5625 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.AgentDataBlock">
4486 <summary> 5626 <exclude/>
4487 </summary>
4488 </member> 5627 </member>
4489 <member name="M:OpenMetaverse.ImageRequest.#ctor(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32)"> 5628 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.RegionInfoBlock">
4490 <summary> 5629 <exclude/>
4491 </summary>
4492 <param name="imageid">
4493 </param>
4494 <param name="type">
4495 </param>
4496 <param name="priority">
4497 </param>
4498 <param name="discardLevel">
4499 </param>
4500 </member> 5630 </member>
4501 <member name="T:OpenMetaverse.AssetManager"> 5631 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.RegionInfo2Block">
4502 <summary> 5632 <exclude/>
4503 </summary>
4504 </member> 5633 </member>
4505 <member name="M:OpenMetaverse.AssetManager.#ctor(OpenMetaverse.GridClient)"> 5634 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.RegionInfo3Block">
4506 <summary> 5635 <exclude/>
4507 Default constructor
4508 </summary>
4509 <param name="client">A reference to the GridClient object</param>
4510 </member> 5636 </member>
4511 <member name="T:OpenMetaverse.AssetManager.AssetReceivedCallback"> 5637 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket">
4512 <summary> 5638 <exclude/>
4513 Callback used for various asset download requests
4514 </summary>
4515 <param name="transfer">Transfer information</param>
4516 <param name="asset">Downloaded asset, null on fail</param>
4517 </member> 5639 </member>
4518 <member name="T:OpenMetaverse.AssetManager.BakedTextureUploadedCallback"> 5640 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket.AgentDataBlock">
4519 <summary> 5641 <exclude/>
4520 Callback used upon competition of baked texture upload
4521 </summary>
4522 <param name="newAssetID">Asset UUID of the newly uploaded baked texture</param>
4523 </member> 5642 </member>
4524 <member name="T:OpenMetaverse.AssetManager.MeshDownloadCallback"> 5643 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket.RegionInfoBlock">
4525 <summary> 5644 <exclude/>
4526 A callback that fires upon the completition of the RequestMesh call
4527 </summary>
4528 <param name="success">Was the download successfull</param>
4529 <param name="assetMesh">Resulting mesh or null on problems</param>
4530 </member> 5645 </member>
4531 <member name="F:OpenMetaverse.AssetManager.TRANSFER_HEADER_TIMEOUT"> 5646 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket.RegionInfo2Block">
4532 <summary>Number of milliseconds to wait for a transfer header packet if out of order data was received</summary> 5647 <exclude/>
4533 </member> 5648 </member>
4534 <member name="F:OpenMetaverse.AssetManager.m_XferReceivedEvent"> 5649 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket">
4535 <summary>The event subscribers. null if no subcribers</summary> 5650 <exclude/>
4536 </member> 5651 </member>
4537 <member name="F:OpenMetaverse.AssetManager.m_XferReceivedLock"> 5652 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfoBlock">
4538 <summary>Thread sync lock object</summary> 5653 <exclude/>
4539 </member> 5654 </member>
4540 <member name="F:OpenMetaverse.AssetManager.m_AssetUploadedEvent"> 5655 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfo2Block">
4541 <summary>The event subscribers. null if no subcribers</summary> 5656 <exclude/>
4542 </member> 5657 </member>
4543 <member name="F:OpenMetaverse.AssetManager.m_AssetUploadedLock"> 5658 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfo3Block">
4544 <summary>Thread sync lock object</summary> 5659 <exclude/>
4545 </member> 5660 </member>
4546 <member name="F:OpenMetaverse.AssetManager.m_UploadProgressEvent"> 5661 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfo4Block">
4547 <summary>The event subscribers. null if no subcribers</summary> 5662 <exclude/>
4548 </member> 5663 </member>
4549 <member name="F:OpenMetaverse.AssetManager.m_UploadProgressLock"> 5664 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket">
4550 <summary>Thread sync lock object</summary> 5665 <exclude/>
4551 </member> 5666 </member>
4552 <member name="F:OpenMetaverse.AssetManager.m_InitiateDownloadEvent"> 5667 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket.AgentDataBlock">
4553 <summary>The event subscribers. null if no subcribers</summary> 5668 <exclude/>
4554 </member> 5669 </member>
4555 <member name="F:OpenMetaverse.AssetManager.m_InitiateDownloadLock"> 5670 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket.RegionInfoBlock">
4556 <summary>Thread sync lock object</summary> 5671 <exclude/>
4557 </member> 5672 </member>
4558 <member name="F:OpenMetaverse.AssetManager.m_ImageReceiveProgressEvent"> 5673 <member name="T:OpenMetaverse.Packets.SimulatorViewerTimeMessagePacket">
4559 <summary>The event subscribers. null if no subcribers</summary> 5674 <exclude/>
4560 </member> 5675 </member>
4561 <member name="F:OpenMetaverse.AssetManager.m_ImageReceiveProgressLock"> 5676 <member name="T:OpenMetaverse.Packets.SimulatorViewerTimeMessagePacket.TimeInfoBlock">
4562 <summary>Thread sync lock object</summary> 5677 <exclude/>
4563 </member> 5678 </member>
4564 <member name="F:OpenMetaverse.AssetManager.Cache"> 5679 <member name="T:OpenMetaverse.Packets.EnableSimulatorPacket">
4565 <summary>Texture download cache</summary> 5680 <exclude/>
4566 </member> 5681 </member>
4567 <member name="E:OpenMetaverse.AssetManager.XferReceived"> 5682 <member name="T:OpenMetaverse.Packets.EnableSimulatorPacket.SimulatorInfoBlock">
4568 <summary>Raised when the simulator responds sends </summary> 5683 <exclude/>
4569 </member> 5684 </member>
4570 <member name="E:OpenMetaverse.AssetManager.AssetUploaded"> 5685 <member name="T:OpenMetaverse.Packets.DisableSimulatorPacket">
4571 <summary>Raised during upload completes</summary> 5686 <exclude/>
4572 </member> 5687 </member>
4573 <member name="E:OpenMetaverse.AssetManager.UploadProgress"> 5688 <member name="T:OpenMetaverse.Packets.TransferRequestPacket">
4574 <summary>Raised during upload with progres update</summary> 5689 <exclude/>
4575 </member> 5690 </member>
4576 <member name="E:OpenMetaverse.AssetManager.InitiateDownload"> 5691 <member name="T:OpenMetaverse.Packets.TransferRequestPacket.TransferInfoBlock">
4577 <summary>Fired when the simulator sends an InitiateDownloadPacket, used to download terrain .raw files</summary> 5692 <exclude/>
4578 </member> 5693 </member>
4579 <member name="E:OpenMetaverse.AssetManager.ImageReceiveProgress"> 5694 <member name="T:OpenMetaverse.Packets.TransferInfoPacket">
4580 <summary>Fired when a texture is in the process of being downloaded by the TexturePipeline class</summary> 5695 <exclude/>
4581 </member> 5696 </member>
4582 <member name="M:OpenMetaverse.AssetManager.OnXferReceived(OpenMetaverse.XferReceivedEventArgs)"> 5697 <member name="T:OpenMetaverse.Packets.TransferInfoPacket.TransferInfoBlock">
4583 <summary>Raises the XferReceived event</summary> 5698 <exclude/>
4584 <param name="e">A XferReceivedEventArgs object containing the
4585 data returned from the simulator</param>
4586 </member> 5699 </member>
4587 <member name="M:OpenMetaverse.AssetManager.OnAssetUploaded(OpenMetaverse.AssetUploadEventArgs)"> 5700 <member name="T:OpenMetaverse.Packets.TransferAbortPacket">
4588 <summary>Raises the AssetUploaded event</summary> 5701 <exclude/>
4589 <param name="e">A AssetUploadedEventArgs object containing the
4590 data returned from the simulator</param>
4591 </member> 5702 </member>
4592 <member name="M:OpenMetaverse.AssetManager.OnUploadProgress(OpenMetaverse.AssetUploadEventArgs)"> 5703 <member name="T:OpenMetaverse.Packets.TransferAbortPacket.TransferInfoBlock">
4593 <summary>Raises the UploadProgress event</summary> 5704 <exclude/>
4594 <param name="e">A UploadProgressEventArgs object containing the
4595 data returned from the simulator</param>
4596 </member> 5705 </member>
4597 <member name="M:OpenMetaverse.AssetManager.OnInitiateDownload(OpenMetaverse.InitiateDownloadEventArgs)"> 5706 <member name="T:OpenMetaverse.Packets.RequestXferPacket">
4598 <summary>Raises the InitiateDownload event</summary> 5707 <exclude/>
4599 <param name="e">A InitiateDownloadEventArgs object containing the
4600 data returned from the simulator</param>
4601 </member> 5708 </member>
4602 <member name="M:OpenMetaverse.AssetManager.OnImageReceiveProgress(OpenMetaverse.ImageReceiveProgressEventArgs)"> 5709 <member name="T:OpenMetaverse.Packets.RequestXferPacket.XferIDBlock">
4603 <summary>Raises the ImageReceiveProgress event</summary> 5710 <exclude/>
4604 <param name="e">A ImageReceiveProgressEventArgs object containing the
4605 data returned from the simulator</param>
4606 </member> 5711 </member>
4607 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.AssetManager.AssetReceivedCallback)"> 5712 <member name="T:OpenMetaverse.Packets.AbortXferPacket">
4608 <summary> 5713 <exclude/>
4609 Request an asset download
4610 </summary>
4611 <param name="assetID">Asset UUID</param>
4612 <param name="type">Asset type, must be correct for the transfer to succeed</param>
4613 <param name="priority">Whether to give this transfer an elevated priority</param>
4614 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
4615 </member> 5714 </member>
4616 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.SourceType,OpenMetaverse.AssetManager.AssetReceivedCallback)"> 5715 <member name="T:OpenMetaverse.Packets.AbortXferPacket.XferIDBlock">
4617 <summary> 5716 <exclude/>
4618 Request an asset download
4619 </summary>
4620 <param name="assetID">Asset UUID</param>
4621 <param name="type">Asset type, must be correct for the transfer to succeed</param>
4622 <param name="priority">Whether to give this transfer an elevated priority</param>
4623 <param name="sourceType">Source location of the requested asset</param>
4624 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
4625 </member> 5717 </member>
4626 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.SourceType,OpenMetaverse.UUID,OpenMetaverse.AssetManager.AssetReceivedCallback)"> 5718 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket">
4627 <summary> 5719 <exclude/>
4628 Request an asset download
4629 </summary>
4630 <param name="assetID">Asset UUID</param>
4631 <param name="type">Asset type, must be correct for the transfer to succeed</param>
4632 <param name="priority">Whether to give this transfer an elevated priority</param>
4633 <param name="sourceType">Source location of the requested asset</param>
4634 <param name="transactionID">UUID of the transaction</param>
4635 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
4636 </member> 5720 </member>
4637 <member name="M:OpenMetaverse.AssetManager.RequestAssetXfer(System.String,System.Boolean,System.Boolean,OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean)"> 5721 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.SenderBlock">
4638 <summary> 5722 <exclude/>
4639 Request an asset download through the almost deprecated Xfer system
4640 </summary>
4641 <param name="filename">Filename of the asset to request</param>
4642 <param name="deleteOnCompletion">Whether or not to delete the asset
4643 off the server after it is retrieved</param>
4644 <param name="useBigPackets">Use large transfer packets or not</param>
4645 <param name="vFileID">UUID of the file to request, if filename is
4646 left empty</param>
4647 <param name="vFileType">Asset type of <code>vFileID</code>, or
4648 <code>AssetType.Unknown</code> if filename is not empty</param>
4649 <param name="fromCache">Sets the FilePath in the request to Cache
4650 (4) if true, otherwise Unknown (0) is used</param>
4651 <returns>
4652 </returns>
4653 </member> 5723 </member>
4654 <member name="M:OpenMetaverse.AssetManager.RequestInventoryAsset(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.AssetManager.AssetReceivedCallback)"> 5724 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.ObjectDataBlock">
4655 <summary> 5725 <exclude/>
4656 </summary>
4657 <param name="assetID">Use UUID.Zero if you do not have the
4658 asset ID but have all the necessary permissions</param>
4659 <param name="itemID">The item ID of this asset in the inventory</param>
4660 <param name="taskID">Use UUID.Zero if you are not requesting an
4661 asset from an object inventory</param>
4662 <param name="ownerID">The owner of this asset</param>
4663 <param name="type">Asset type</param>
4664 <param name="priority">Whether to prioritize this asset download or not</param>
4665 <param name="callback">
4666 </param>
4667 </member> 5726 </member>
4668 <member name="M:OpenMetaverse.AssetManager.SetPendingAssetUploadData(OpenMetaverse.AssetUpload)"> 5727 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.VisualParamBlock">
4669 <summary> 5728 <exclude/>
4670 Used to force asset data into the PendingUpload property, ie: for raw terrain uploads
4671 </summary>
4672 <param name="assetData">An AssetUpload object containing the data to upload to the simulator</param>
4673 </member> 5729 </member>
4674 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.Assets.Asset,System.Boolean)"> 5730 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.AppearanceDataBlock">
4675 <summary> 5731 <exclude/>
4676 Request an asset be uploaded to the simulator
4677 </summary>
4678 <param name="asset">The <seealso cref="T:OpenMetaverse.Assets.Asset" /> Object containing the asset data</param>
4679 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
4680 in which the client was connected in addition to being stored on the asset server</param>
4681 <returns>The <seealso cref="T:OpenMetaverse.UUID" /> of the transfer, can be used to correlate the upload with
4682 events being fired</returns>
4683 </member> 5732 </member>
4684 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.AssetType,System.Byte[],System.Boolean)"> 5733 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket">
4685 <summary> 5734 <exclude/>
4686 Request an asset be uploaded to the simulator
4687 </summary>
4688 <param name="type">The <seealso cref="T:OpenMetaverse.AssetType" /> of the asset being uploaded</param>
4689 <param name="data">A byte array containing the encoded asset data</param>
4690 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
4691 in which the client was connected in addition to being stored on the asset server</param>
4692 <returns>The <seealso cref="T:OpenMetaverse.UUID" /> of the transfer, can be used to correlate the upload with
4693 events being fired</returns>
4694 </member> 5735 </member>
4695 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.UUID@,OpenMetaverse.AssetType,System.Byte[],System.Boolean)"> 5736 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket.ObjectDataBlock">
4696 <summary> 5737 <exclude/>
4697 Request an asset be uploaded to the simulator
4698 </summary>
4699 <param name="assetID">
4700 </param>
4701 <param name="type">Asset type to upload this data as</param>
4702 <param name="data">A byte array containing the encoded asset data</param>
4703 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
4704 in which the client was connected in addition to being stored on the asset server</param>
4705 <returns>The <seealso cref="T:OpenMetaverse.UUID" /> of the transfer, can be used to correlate the upload with
4706 events being fired</returns>
4707 </member> 5738 </member>
4708 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.UUID@,OpenMetaverse.AssetType,System.Byte[],System.Boolean,OpenMetaverse.UUID)"> 5739 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket.CameraPropertyBlock">
4709 <summary> 5740 <exclude/>
4710 Initiate an asset upload
4711 </summary>
4712 <param name="assetID">The ID this asset will have if the
4713 upload succeeds</param>
4714 <param name="type">Asset type to upload this data as</param>
4715 <param name="data">Raw asset data to upload</param>
4716 <param name="storeLocal">Whether to store this asset on the local
4717 simulator or the grid-wide asset server</param>
4718 <param name="transactionID">The tranaction id for the upload <see cref="!:RequestCreateItem" /></param>
4719 <returns>The transaction ID of this transfer</returns>
4720 </member> 5741 </member>
4721 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32,OpenMetaverse.TextureDownloadCallback,System.Boolean)"> 5742 <member name="T:OpenMetaverse.Packets.ClearFollowCamPropertiesPacket">
4722 <summary> 5743 <exclude/>
4723 Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline" /> system to
4724 manage the requests and re-assemble the image from the packets received from the simulator
4725 </summary>
4726 <param name="textureID">The <see cref="T:OpenMetaverse.UUID" /> of the texture asset to download</param>
4727 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType" /> of the texture asset.
4728 Use <see cref="F:OpenMetaverse.ImageType.Normal" /> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked" /> for baked layer texture assets</param>
4729 <param name="priority">A float indicating the requested priority for the transfer. Higher priority values tell the simulator
4730 to prioritize the request before lower valued requests. An image already being transferred using the <see cref="T:OpenMetaverse.TexturePipeline" /> can have
4731 its priority changed by resending the request with the new priority value</param>
4732 <param name="discardLevel">Number of quality layers to discard.
4733 This controls the end marker of the data sent. Sending with value -1 combined with priority of 0 cancels an in-progress
4734 transfer.</param>
4735 <remarks>A bug exists in the Linden Simulator where a -1 will occasionally be sent with a non-zero priority
4736 indicating an off-by-one error.</remarks>
4737 <param name="packetStart">The packet number to begin the request at. A value of 0 begins the request
4738 from the start of the asset texture</param>
4739 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback" /> callback to fire when the image is retrieved. The callback
4740 will contain the result of the request and the texture asset data</param>
4741 <param name="progress">If true, the callback will be fired for each chunk of the downloaded image.
4742 The callback asset parameter will contain all previously received chunks of the texture asset starting
4743 from the beginning of the request</param>
4744 <example>
4745 Request an image and fire a callback when the request is complete
4746 <code>
4747 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished);
4748 private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset)
4749 {
4750 if(state == TextureRequestState.Finished)
4751 {
4752 Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded",
4753 asset.AssetID,
4754 asset.AssetData.Length);
4755 }
4756 }
4757 </code>
4758 Request an image and use an inline anonymous method to handle the downloaded texture data
4759 <code>
4760 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, delegate(TextureRequestState state, AssetTexture asset)
4761 {
4762 if(state == TextureRequestState.Finished)
4763 {
4764 Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded",
4765 asset.AssetID,
4766 asset.AssetData.Length);
4767 }
4768 }
4769 );
4770 </code>
4771 Request a texture, decode the texture to a bitmap image and apply it to a imagebox
4772 <code>
4773 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished);
4774 private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset)
4775 {
4776 if(state == TextureRequestState.Finished)
4777 {
4778 ManagedImage imgData;
4779 Image bitmap;
4780 if (state == TextureRequestState.Finished)
4781 {
4782 OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgData, out bitmap);
4783 picInsignia.Image = bitmap;
4784 }
4785 }
4786 }
4787 </code></example>
4788 </member> 5744 </member>
4789 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.TextureDownloadCallback)"> 5745 <member name="T:OpenMetaverse.Packets.ClearFollowCamPropertiesPacket.ObjectDataBlock">
4790 <summary> 5746 <exclude/>
4791 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline" /> system to
4792 manage the requests and re-assemble the image from the packets received from the simulator
4793 </summary>
4794 <param name="textureID">The <see cref="T:OpenMetaverse.UUID" /> of the texture asset to download</param>
4795 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback" /> callback to fire when the image is retrieved. The callback
4796 will contain the result of the request and the texture asset data</param>
4797 </member> 5747 </member>
4798 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,OpenMetaverse.TextureDownloadCallback)"> 5748 <member name="T:OpenMetaverse.Packets.RequestPayPricePacket">
4799 <summary> 5749 <exclude/>
4800 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline" /> system to
4801 manage the requests and re-assemble the image from the packets received from the simulator
4802 </summary>
4803 <param name="textureID">The <see cref="T:OpenMetaverse.UUID" /> of the texture asset to download</param>
4804 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType" /> of the texture asset.
4805 Use <see cref="F:OpenMetaverse.ImageType.Normal" /> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked" /> for baked layer texture assets</param>
4806 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback" /> callback to fire when the image is retrieved. The callback
4807 will contain the result of the request and the texture asset data</param>
4808 </member> 5750 </member>
4809 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,OpenMetaverse.TextureDownloadCallback,System.Boolean)"> 5751 <member name="T:OpenMetaverse.Packets.RequestPayPricePacket.ObjectDataBlock">
4810 <summary> 5752 <exclude/>
4811 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline" /> system to
4812 manage the requests and re-assemble the image from the packets received from the simulator
4813 </summary>
4814 <param name="textureID">The <see cref="T:OpenMetaverse.UUID" /> of the texture asset to download</param>
4815 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType" /> of the texture asset.
4816 Use <see cref="F:OpenMetaverse.ImageType.Normal" /> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked" /> for baked layer texture assets</param>
4817 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback" /> callback to fire when the image is retrieved. The callback
4818 will contain the result of the request and the texture asset data</param>
4819 <param name="progress">If true, the callback will be fired for each chunk of the downloaded image.
4820 The callback asset parameter will contain all previously received chunks of the texture asset starting
4821 from the beginning of the request</param>
4822 </member> 5753 </member>
4823 <member name="M:OpenMetaverse.AssetManager.RequestImageCancel(OpenMetaverse.UUID)"> 5754 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket">
4824 <summary> 5755 <exclude/>
4825 Cancel a texture request
4826 </summary>
4827 <param name="textureID">The texture assets <see cref="T:OpenMetaverse.UUID" /></param>
4828 </member> 5756 </member>
4829 <member name="M:OpenMetaverse.AssetManager.RequestMesh(OpenMetaverse.UUID,OpenMetaverse.AssetManager.MeshDownloadCallback)"> 5757 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket.ObjectDataBlock">
4830 <summary> 5758 <exclude/>
4831 Requests download of a mesh asset
4832 </summary>
4833 <param name="meshID">UUID of the mesh asset</param>
4834 <param name="callback">Callback when the request completes</param>
4835 </member> 5759 </member>
4836 <member name="M:OpenMetaverse.AssetManager.FireImageProgressEvent(OpenMetaverse.UUID,System.Int32,System.Int32)"> 5760 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket.ButtonDataBlock">
4837 <summary> 5761 <exclude/>
4838 Lets TexturePipeline class fire the progress event
4839 </summary>
4840 <param name="texureID">The texture ID currently being downloaded</param>
4841 <param name="transferredBytes">the number of bytes transferred</param>
4842 <param name="totalBytes">the total number of bytes expected</param>
4843 </member> 5762 </member>
4844 <member name="M:OpenMetaverse.AssetManager.TransferInfoHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5763 <member name="T:OpenMetaverse.Packets.KickUserPacket">
4845 <summary>Process an incoming packet and raise the appropriate events</summary> 5764 <exclude/>
4846 <param name="sender">The sender</param>
4847 <param name="e">The EventArgs object containing the packet data</param>
4848 </member> 5765 </member>
4849 <member name="M:OpenMetaverse.AssetManager.TransferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5766 <member name="T:OpenMetaverse.Packets.KickUserPacket.TargetBlockBlock">
4850 <summary>Process an incoming packet and raise the appropriate events</summary> 5767 <exclude/>
4851 <param name="sender">The sender</param>
4852 <param name="e">The EventArgs object containing the packet data</param>
4853 </member> 5768 </member>
4854 <member name="M:OpenMetaverse.AssetManager.InitiateDownloadPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5769 <member name="T:OpenMetaverse.Packets.KickUserPacket.UserInfoBlock">
4855 <summary>Process an incoming packet and raise the appropriate events</summary> 5770 <exclude/>
4856 <param name="sender">The sender</param>
4857 <param name="e">The EventArgs object containing the packet data</param>
4858 </member> 5771 </member>
4859 <member name="M:OpenMetaverse.AssetManager.RequestXferHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5772 <member name="T:OpenMetaverse.Packets.GodKickUserPacket">
4860 <summary>Process an incoming packet and raise the appropriate events</summary> 5773 <exclude/>
4861 <param name="sender">The sender</param>
4862 <param name="e">The EventArgs object containing the packet data</param>
4863 </member> 5774 </member>
4864 <member name="M:OpenMetaverse.AssetManager.ConfirmXferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5775 <member name="T:OpenMetaverse.Packets.GodKickUserPacket.UserInfoBlock">
4865 <summary>Process an incoming packet and raise the appropriate events</summary> 5776 <exclude/>
4866 <param name="sender">The sender</param>
4867 <param name="e">The EventArgs object containing the packet data</param>
4868 </member> 5777 </member>
4869 <member name="M:OpenMetaverse.AssetManager.AssetUploadCompleteHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5778 <member name="T:OpenMetaverse.Packets.EjectUserPacket">
4870 <summary>Process an incoming packet and raise the appropriate events</summary> 5779 <exclude/>
4871 <param name="sender">The sender</param>
4872 <param name="e">The EventArgs object containing the packet data</param>
4873 </member> 5780 </member>
4874 <member name="M:OpenMetaverse.AssetManager.SendXferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5781 <member name="T:OpenMetaverse.Packets.EjectUserPacket.AgentDataBlock">
4875 <summary>Process an incoming packet and raise the appropriate events</summary> 5782 <exclude/>
4876 <param name="sender">The sender</param>
4877 <param name="e">The EventArgs object containing the packet data</param>
4878 </member> 5783 </member>
4879 <member name="M:OpenMetaverse.AssetManager.AbortXferHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 5784 <member name="T:OpenMetaverse.Packets.EjectUserPacket.DataBlock">
4880 <summary>Process an incoming packet and raise the appropriate events</summary> 5785 <exclude/>
4881 <param name="sender">The sender</param>
4882 <param name="e">The EventArgs object containing the packet data</param>
4883 </member> 5786 </member>
4884 <member name="P:OpenMetaverse.XferReceivedEventArgs.Xfer"> 5787 <member name="T:OpenMetaverse.Packets.FreezeUserPacket">
4885 <summary>Xfer data</summary> 5788 <exclude/>
4886 </member> 5789 </member>
4887 <member name="P:OpenMetaverse.AssetUploadEventArgs.Upload"> 5790 <member name="T:OpenMetaverse.Packets.FreezeUserPacket.AgentDataBlock">
4888 <summary>Upload data</summary> 5791 <exclude/>
4889 </member> 5792 </member>
4890 <member name="P:OpenMetaverse.InitiateDownloadEventArgs.SimFileName"> 5793 <member name="T:OpenMetaverse.Packets.FreezeUserPacket.DataBlock">
4891 <summary>Filename used on the simulator</summary> 5794 <exclude/>
4892 </member> 5795 </member>
4893 <member name="P:OpenMetaverse.InitiateDownloadEventArgs.ViewerFileName"> 5796 <member name="T:OpenMetaverse.Packets.AvatarPropertiesRequestPacket">
4894 <summary>Filename used by the client</summary> 5797 <exclude/>
4895 </member> 5798 </member>
4896 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.ImageID"> 5799 <member name="T:OpenMetaverse.Packets.AvatarPropertiesRequestPacket.AgentDataBlock">
4897 <summary>UUID of the image that is in progress</summary> 5800 <exclude/>
4898 </member> 5801 </member>
4899 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.Received"> 5802 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket">
4900 <summary>Number of bytes received so far</summary> 5803 <exclude/>
4901 </member> 5804 </member>
4902 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.Total"> 5805 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket.AgentDataBlock">
4903 <summary>Image size in bytes</summary> 5806 <exclude/>
4904 </member> 5807 </member>
4905 <member name="T:OpenMetaverse.ProfileFlags"> 5808 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket.PropertiesDataBlock">
4906 <summary> 5809 <exclude/>
4907 Avatar profile flags
4908 </summary>
4909 </member> 5810 </member>
4910 <member name="T:OpenMetaverse.Avatar"> 5811 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket">
4911 <summary> 5812 <exclude/>
4912 Represents an avatar (other than your own)
4913 </summary>
4914 </member> 5813 </member>
4915 <member name="M:OpenMetaverse.Avatar.#ctor"> 5814 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket.AgentDataBlock">
4916 <summary> 5815 <exclude/>
4917 Default constructor
4918 </summary>
4919 </member> 5816 </member>
4920 <member name="T:OpenMetaverse.Avatar.Statistics"> 5817 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket.PropertiesDataBlock">
4921 <summary> 5818 <exclude/>
4922 Positive and negative ratings
4923 </summary>
4924 </member> 5819 </member>
4925 <member name="F:OpenMetaverse.Avatar.Statistics.BehaviorPositive"> 5820 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket">
4926 <summary>Positive ratings for Behavior</summary> 5821 <exclude/>
4927 </member> 5822 </member>
4928 <member name="F:OpenMetaverse.Avatar.Statistics.BehaviorNegative"> 5823 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.AgentDataBlock">
4929 <summary>Negative ratings for Behavior</summary> 5824 <exclude/>
4930 </member> 5825 </member>
4931 <member name="F:OpenMetaverse.Avatar.Statistics.AppearancePositive"> 5826 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.GroupDataBlock">
4932 <summary>Positive ratings for Appearance</summary> 5827 <exclude/>
4933 </member> 5828 </member>
4934 <member name="F:OpenMetaverse.Avatar.Statistics.AppearanceNegative"> 5829 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.NewGroupDataBlock">
4935 <summary>Negative ratings for Appearance</summary> 5830 <exclude/>
4936 </member> 5831 </member>
4937 <member name="F:OpenMetaverse.Avatar.Statistics.BuildingPositive"> 5832 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket">
4938 <summary>Positive ratings for Building</summary> 5833 <exclude/>
4939 </member> 5834 </member>
4940 <member name="F:OpenMetaverse.Avatar.Statistics.BuildingNegative"> 5835 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket.AgentDataBlock">
4941 <summary>Negative ratings for Building</summary> 5836 <exclude/>
4942 </member> 5837 </member>
4943 <member name="F:OpenMetaverse.Avatar.Statistics.GivenPositive"> 5838 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket.PropertiesDataBlock">
4944 <summary>Positive ratings given by this avatar</summary> 5839 <exclude/>
4945 </member> 5840 </member>
4946 <member name="F:OpenMetaverse.Avatar.Statistics.GivenNegative"> 5841 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket">
4947 <summary>Negative ratings given by this avatar</summary> 5842 <exclude/>
4948 </member> 5843 </member>
4949 <member name="T:OpenMetaverse.Avatar.AvatarProperties"> 5844 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket.AgentDataBlock">
4950 <summary> 5845 <exclude/>
4951 Avatar properties including about text, profile URL, image IDs and
4952 publishing settings
4953 </summary>
4954 </member> 5846 </member>
4955 <member name="F:OpenMetaverse.Avatar.AvatarProperties.FirstLifeText"> 5847 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket.PropertiesDataBlock">
4956 <summary>First Life about text</summary> 5848 <exclude/>
4957 </member> 5849 </member>
4958 <member name="F:OpenMetaverse.Avatar.AvatarProperties.FirstLifeImage"> 5850 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket">
4959 <summary>First Life image ID</summary> 5851 <exclude/>
4960 </member> 5852 </member>
4961 <member name="F:OpenMetaverse.Avatar.AvatarProperties.Partner"> 5853 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket.AgentDataBlock">
4962 <summary> 5854 <exclude/>
4963 </summary>
4964 </member> 5855 </member>
4965 <member name="F:OpenMetaverse.Avatar.AvatarProperties.AboutText"> 5856 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket.DataBlock">
4966 <summary> 5857 <exclude/>
4967 </summary>
4968 </member> 5858 </member>
4969 <member name="F:OpenMetaverse.Avatar.AvatarProperties.BornOn"> 5859 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket">
4970 <summary> 5860 <exclude/>
4971 </summary>
4972 </member> 5861 </member>
4973 <member name="F:OpenMetaverse.Avatar.AvatarProperties.CharterMember"> 5862 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket.AgentDataBlock">
4974 <summary> 5863 <exclude/>
4975 </summary>
4976 </member> 5864 </member>
4977 <member name="F:OpenMetaverse.Avatar.AvatarProperties.ProfileImage"> 5865 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket.DataBlock">
4978 <summary>Profile image ID</summary> 5866 <exclude/>
4979 </member> 5867 </member>
4980 <member name="F:OpenMetaverse.Avatar.AvatarProperties.Flags"> 5868 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket">
4981 <summary>Flags of the profile</summary> 5869 <exclude/>
4982 </member> 5870 </member>
4983 <member name="F:OpenMetaverse.Avatar.AvatarProperties.ProfileURL"> 5871 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket.AgentDataBlock">
4984 <summary>Web URL for this profile</summary> 5872 <exclude/>
4985 </member> 5873 </member>
4986 <member name="P:OpenMetaverse.Avatar.AvatarProperties.AllowPublish"> 5874 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket.DataBlock">
4987 <summary>Should this profile be published on the web</summary> 5875 <exclude/>
4988 </member> 5876 </member>
4989 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Online"> 5877 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket">
4990 <summary>Avatar Online Status</summary> 5878 <exclude/>
4991 </member> 5879 </member>
4992 <member name="P:OpenMetaverse.Avatar.AvatarProperties.MaturePublish"> 5880 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket.AgentDataBlock">
4993 <summary>Is this a mature profile</summary> 5881 <exclude/>
4994 </member> 5882 </member>
4995 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Identified"> 5883 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket.EventDataBlock">
4996 <summary> 5884 <exclude/>
4997 </summary>
4998 </member> 5885 </member>
4999 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Transacted"> 5886 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket">
5000 <summary> 5887 <exclude/>
5001 </summary>
5002 </member> 5888 </member>
5003 <member name="T:OpenMetaverse.Avatar.Interests"> 5889 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket.AgentDataBlock">
5004 <summary> 5890 <exclude/>
5005 Avatar interests including spoken languages, skills, and "want to"
5006 choices
5007 </summary>
5008 </member> 5891 </member>
5009 <member name="F:OpenMetaverse.Avatar.Interests.LanguagesText"> 5892 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket.EventDataBlock">
5010 <summary>Languages profile field</summary> 5893 <exclude/>
5011 </member> 5894 </member>
5012 <member name="F:OpenMetaverse.Avatar.Interests.SkillsMask"> 5895 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket">
5013 <summary> 5896 <exclude/>
5014 </summary>
5015 </member> 5897 </member>
5016 <member name="F:OpenMetaverse.Avatar.Interests.SkillsText"> 5898 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket.AgentDataBlock">
5017 <summary> 5899 <exclude/>
5018 </summary>
5019 </member> 5900 </member>
5020 <member name="F:OpenMetaverse.Avatar.Interests.WantToMask"> 5901 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket.EventDataBlock">
5021 <summary> 5902 <exclude/>
5022 </summary>
5023 </member> 5903 </member>
5024 <member name="F:OpenMetaverse.Avatar.Interests.WantToText"> 5904 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket">
5025 <summary> 5905 <exclude/>
5026 </summary>
5027 </member> 5906 </member>
5028 <member name="F:OpenMetaverse.Avatar.Groups"> 5907 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket.AgentDataBlock">
5029 <summary>Groups that this avatar is a member of</summary> 5908 <exclude/>
5030 </member> 5909 </member>
5031 <member name="F:OpenMetaverse.Avatar.ProfileStatistics"> 5910 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket.EventDataBlock">
5032 <summary>Positive and negative ratings</summary> 5911 <exclude/>
5033 </member> 5912 </member>
5034 <member name="F:OpenMetaverse.Avatar.ProfileProperties"> 5913 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket">
5035 <summary>Avatar properties including about text, profile URL, image IDs and 5914 <exclude/>
5036 publishing settings</summary>
5037 </member> 5915 </member>
5038 <member name="F:OpenMetaverse.Avatar.ProfileInterests"> 5916 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.AgentDataBlock">
5039 <summary>Avatar interests including spoken languages, skills, and "want to" 5917 <exclude/>
5040 choices</summary>
5041 </member> 5918 </member>
5042 <member name="F:OpenMetaverse.Avatar.ControlFlags"> 5919 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.EventDataBlock">
5043 <summary>Movement control flags for avatars. Typically not set or used by 5920 <exclude/>
5044 clients. To move your avatar, use Client.Self.Movement instead</summary>
5045 </member> 5921 </member>
5046 <member name="F:OpenMetaverse.Avatar.VisualParameters"> 5922 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.QueryDataBlock">
5047 <summary> 5923 <exclude/>
5048 Contains the visual parameters describing the deformation of the avatar
5049 </summary>
5050 </member> 5924 </member>
5051 <member name="P:OpenMetaverse.Avatar.FirstName"> 5925 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket">
5052 <summary>First name</summary> 5926 <exclude/>
5053 </member> 5927 </member>
5054 <member name="P:OpenMetaverse.Avatar.LastName"> 5928 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket.AgentDataBlock">
5055 <summary>Last name</summary> 5929 <exclude/>
5056 </member> 5930 </member>
5057 <member name="P:OpenMetaverse.Avatar.Name"> 5931 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket.DataBlock">
5058 <summary>Full name</summary> 5932 <exclude/>
5059 </member> 5933 </member>
5060 <member name="P:OpenMetaverse.Avatar.GroupName"> 5934 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket">
5061 <summary>Active group</summary> 5935 <exclude/>
5062 </member> 5936 </member>
5063 <member name="T:OpenMetaverse.AgentDisplayName"> 5937 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket.AgentDataBlock">
5064 <summary> Information about agents display name </summary> 5938 <exclude/>
5065 </member> 5939 </member>
5066 <member name="F:OpenMetaverse.AgentDisplayName.ID"> 5940 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket.DataBlock">
5067 <summary> Agent UUID </summary> 5941 <exclude/>
5068 </member> 5942 </member>
5069 <member name="F:OpenMetaverse.AgentDisplayName.UserName"> 5943 <member name="T:OpenMetaverse.Packets.PickDeletePacket">
5070 <summary> Username </summary> 5944 <exclude/>
5071 </member> 5945 </member>
5072 <member name="F:OpenMetaverse.AgentDisplayName.DisplayName"> 5946 <member name="T:OpenMetaverse.Packets.PickDeletePacket.AgentDataBlock">
5073 <summary> Display name </summary> 5947 <exclude/>
5074 </member> 5948 </member>
5075 <member name="F:OpenMetaverse.AgentDisplayName.LegacyFirstName"> 5949 <member name="T:OpenMetaverse.Packets.PickDeletePacket.DataBlock">
5076 <summary> First name (legacy) </summary> 5950 <exclude/>
5077 </member> 5951 </member>
5078 <member name="F:OpenMetaverse.AgentDisplayName.LegacyLastName"> 5952 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket">
5079 <summary> Last name (legacy) </summary> 5953 <exclude/>
5080 </member> 5954 </member>
5081 <member name="F:OpenMetaverse.AgentDisplayName.IsDefaultDisplayName"> 5955 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket.AgentDataBlock">
5082 <summary> Is display name default display name </summary> 5956 <exclude/>
5083 </member> 5957 </member>
5084 <member name="F:OpenMetaverse.AgentDisplayName.NextUpdate"> 5958 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket.DataBlock">
5085 <summary> Cache display name until </summary> 5959 <exclude/>
5086 </member> 5960 </member>
5087 <member name="P:OpenMetaverse.AgentDisplayName.LegacyFullName"> 5961 <member name="T:OpenMetaverse.Packets.ScriptQuestionPacket">
5088 <summary> Full name (legacy) </summary> 5962 <exclude/>
5089 </member> 5963 </member>
5090 <member name="M:OpenMetaverse.AgentDisplayName.FromOSD(OpenMetaverse.StructuredData.OSD)"> 5964 <member name="T:OpenMetaverse.Packets.ScriptQuestionPacket.DataBlock">
5091 <summary> 5965 <exclude/>
5092 Creates AgentDisplayName object from OSD
5093 </summary>
5094 <param name="data">Incoming OSD data</param>
5095 <returns>AgentDisplayName object</returns>
5096 </member> 5966 </member>
5097 <member name="M:OpenMetaverse.AgentDisplayName.GetOSD"> 5967 <member name="T:OpenMetaverse.Packets.ScriptControlChangePacket">
5098 <summary> 5968 <exclude/>
5099 Return object as OSD map
5100 </summary>
5101 <returns>OSD containing agent's display name data</returns>
5102 </member> 5969 </member>
5103 <member name="T:OpenMetaverse.AvatarGroup"> 5970 <member name="T:OpenMetaverse.Packets.ScriptControlChangePacket.DataBlock">
5104 <summary> 5971 <exclude/>
5105 Holds group information for Avatars such as those you might find in a profile
5106 </summary>
5107 </member> 5972 </member>
5108 <member name="F:OpenMetaverse.AvatarGroup.AcceptNotices"> 5973 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket">
5109 <summary>true of Avatar accepts group notices</summary> 5974 <exclude/>
5110 </member> 5975 </member>
5111 <member name="F:OpenMetaverse.AvatarGroup.GroupID"> 5976 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.DataBlock">
5112 <summary>Groups Key</summary> 5977 <exclude/>
5113 </member> 5978 </member>
5114 <member name="F:OpenMetaverse.AvatarGroup.GroupInsigniaID"> 5979 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.ButtonsBlock">
5115 <summary>Texture Key for groups insignia</summary> 5980 <exclude/>
5116 </member> 5981 </member>
5117 <member name="F:OpenMetaverse.AvatarGroup.GroupName"> 5982 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.OwnerDataBlock">
5118 <summary>Name of the group</summary> 5983 <exclude/>
5119 </member> 5984 </member>
5120 <member name="F:OpenMetaverse.AvatarGroup.GroupPowers"> 5985 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket">
5121 <summary>Powers avatar has in the group</summary> 5986 <exclude/>
5122 </member> 5987 </member>
5123 <member name="F:OpenMetaverse.AvatarGroup.GroupTitle"> 5988 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket.AgentDataBlock">
5124 <summary>Avatars Currently selected title</summary> 5989 <exclude/>
5125 </member> 5990 </member>
5126 <member name="F:OpenMetaverse.AvatarGroup.ListInProfile"> 5991 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket.DataBlock">
5127 <summary>true of Avatar has chosen to list this in their profile</summary> 5992 <exclude/>
5128 </member> 5993 </member>
5129 <member name="T:OpenMetaverse.Animation"> 5994 <member name="T:OpenMetaverse.Packets.ForceScriptControlReleasePacket">
5130 <summary> 5995 <exclude/>
5131 Contains an animation currently being played by an agent
5132 </summary>
5133 </member> 5996 </member>
5134 <member name="F:OpenMetaverse.Animation.AnimationID"> 5997 <member name="T:OpenMetaverse.Packets.ForceScriptControlReleasePacket.AgentDataBlock">
5135 <summary>The ID of the animation asset</summary> 5998 <exclude/>
5136 </member> 5999 </member>
5137 <member name="F:OpenMetaverse.Animation.AnimationSequence"> 6000 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket">
5138 <summary>A number to indicate start order of currently playing animations</summary> 6001 <exclude/>
5139 <remarks>On Linden Grids this number is unique per region, with OpenSim it is per client</remarks>
5140 </member> 6002 </member>
5141 <member name="F:OpenMetaverse.Animation.AnimationSourceObjectID"> 6003 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket.AgentDataBlock">
5142 <summary> 6004 <exclude/>
5143 </summary>
5144 </member> 6005 </member>
5145 <member name="T:OpenMetaverse.ProfilePick"> 6006 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket.DataBlock">
5146 <summary> 6007 <exclude/>
5147 Holds group information on an individual profile pick
5148 </summary>
5149 </member> 6008 </member>
5150 <member name="T:OpenMetaverse.AvatarManager"> 6009 <member name="T:OpenMetaverse.Packets.LoadURLPacket">
5151 <summary> 6010 <exclude/>
5152 Retrieve friend status notifications, and retrieve avatar names and
5153 profiles
5154 </summary>
5155 </member> 6011 </member>
5156 <member name="M:OpenMetaverse.AvatarManager.#ctor(OpenMetaverse.GridClient)"> 6012 <member name="T:OpenMetaverse.Packets.LoadURLPacket.DataBlock">
5157 <summary> 6013 <exclude/>
5158 Represents other avatars
5159 </summary>
5160 <param name="client">
5161 </param>
5162 </member> 6014 </member>
5163 <member name="T:OpenMetaverse.AvatarManager.DisplayNamesCallback"> 6015 <member name="T:OpenMetaverse.Packets.ScriptTeleportRequestPacket">
5164 <summary> 6016 <exclude/>
5165 Callback giving results when fetching display names
5166 </summary>
5167 <param name="success">If the request was successful</param>
5168 <param name="names">Array of display names</param>
5169 <param name="badIDs">Array of UUIDs that could not be fetched</param>
5170 </member> 6017 </member>
5171 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAnimation"> 6018 <member name="T:OpenMetaverse.Packets.ScriptTeleportRequestPacket.DataBlock">
5172 <summary>The event subscribers, null of no subscribers</summary> 6019 <exclude/>
5173 </member> 6020 </member>
5174 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAnimationLock"> 6021 <member name="T:OpenMetaverse.Packets.ParcelOverlayPacket">
5175 <summary>Thread sync lock object</summary> 6022 <exclude/>
5176 </member> 6023 </member>
5177 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAppearance"> 6024 <member name="T:OpenMetaverse.Packets.ParcelOverlayPacket.ParcelDataBlock">
5178 <summary>The event subscribers, null of no subscribers</summary> 6025 <exclude/>
5179 </member> 6026 </member>
5180 <member name="F:OpenMetaverse.AvatarManager.m_AvatarAppearanceLock"> 6027 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket">
5181 <summary>Thread sync lock object</summary> 6028 <exclude/>
5182 </member> 6029 </member>
5183 <member name="F:OpenMetaverse.AvatarManager.m_UUIDNameReply"> 6030 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket.AgentDataBlock">
5184 <summary>The event subscribers, null of no subscribers</summary> 6031 <exclude/>
5185 </member> 6032 </member>
5186 <member name="F:OpenMetaverse.AvatarManager.m_UUIDNameReplyLock"> 6033 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket.ParcelDataBlock">
5187 <summary>Thread sync lock object</summary> 6034 <exclude/>
5188 </member> 6035 </member>
5189 <member name="F:OpenMetaverse.AvatarManager.m_AvatarInterestsReply"> 6036 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket">
5190 <summary>The event subscribers, null of no subscribers</summary> 6037 <exclude/>
5191 </member> 6038 </member>
5192 <member name="F:OpenMetaverse.AvatarManager.m_AvatarInterestsReplyLock"> 6039 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket.AgentDataBlock">
5193 <summary>Thread sync lock object</summary> 6040 <exclude/>
5194 </member> 6041 </member>
5195 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPropertiesReply"> 6042 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket.ParcelDataBlock">
5196 <summary>The event subscribers, null of no subscribers</summary> 6043 <exclude/>
5197 </member> 6044 </member>
5198 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPropertiesReplyLock"> 6045 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket">
5199 <summary>Thread sync lock object</summary> 6046 <exclude/>
5200 </member> 6047 </member>
5201 <member name="F:OpenMetaverse.AvatarManager.m_AvatarGroupsReply"> 6048 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.AgentDataBlock">
5202 <summary>The event subscribers, null of no subscribers</summary> 6049 <exclude/>
5203 </member> 6050 </member>
5204 <member name="F:OpenMetaverse.AvatarManager.m_AvatarGroupsReplyLock"> 6051 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.ParcelDataBlock">
5205 <summary>Thread sync lock object</summary> 6052 <exclude/>
5206 </member> 6053 </member>
5207 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPickerReply"> 6054 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.TaskIDsBlock">
5208 <summary>The event subscribers, null of no subscribers</summary> 6055 <exclude/>
5209 </member> 6056 </member>
5210 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPickerReplyLock"> 6057 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.OwnerIDsBlock">
5211 <summary>Thread sync lock object</summary> 6058 <exclude/>
5212 </member> 6059 </member>
5213 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectPointAt"> 6060 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket">
5214 <summary>The event subscribers, null of no subscribers</summary> 6061 <exclude/>
5215 </member> 6062 </member>
5216 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectPointAtLock"> 6063 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket.AgentDataBlock">
5217 <summary>Thread sync lock object</summary> 6064 <exclude/>
5218 </member> 6065 </member>
5219 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLookAt"> 6066 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket.ParcelDataBlock">
5220 <summary>The event subscribers, null of no subscribers</summary> 6067 <exclude/>
5221 </member> 6068 </member>
5222 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLookAtLock"> 6069 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket">
5223 <summary>Thread sync lock object</summary> 6070 <exclude/>
5224 </member> 6071 </member>
5225 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffect"> 6072 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.AgentDataBlock">
5226 <summary>The event subscribers, null of no subscribers</summary> 6073 <exclude/>
5227 </member> 6074 </member>
5228 <member name="F:OpenMetaverse.AvatarManager.m_ViewerEffectLock"> 6075 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.ParcelDataBlock">
5229 <summary>Thread sync lock object</summary> 6076 <exclude/>
5230 </member> 6077 </member>
5231 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPicksReply"> 6078 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.TaskIDsBlock">
5232 <summary>The event subscribers, null of no subscribers</summary> 6079 <exclude/>
5233 </member> 6080 </member>
5234 <member name="F:OpenMetaverse.AvatarManager.m_AvatarPicksReplyLock"> 6081 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.OwnerIDsBlock">
5235 <summary>Thread sync lock object</summary> 6082 <exclude/>
5236 </member> 6083 </member>
5237 <member name="F:OpenMetaverse.AvatarManager.m_PickInfoReply"> 6084 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket">
5238 <summary>The event subscribers, null of no subscribers</summary> 6085 <exclude/>
5239 </member> 6086 </member>
5240 <member name="F:OpenMetaverse.AvatarManager.m_PickInfoReplyLock"> 6087 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.AgentDataBlock">
5241 <summary>Thread sync lock object</summary> 6088 <exclude/>
5242 </member> 6089 </member>
5243 <member name="F:OpenMetaverse.AvatarManager.m_AvatarClassifiedReply"> 6090 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.ParcelDataBlock">
5244 <summary>The event subscribers, null of no subscribers</summary> 6091 <exclude/>
5245 </member> 6092 </member>
5246 <member name="F:OpenMetaverse.AvatarManager.m_AvatarClassifiedReplyLock"> 6093 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.ReturnIDsBlock">
5247 <summary>Thread sync lock object</summary> 6094 <exclude/>
5248 </member> 6095 </member>
5249 <member name="F:OpenMetaverse.AvatarManager.m_ClassifiedInfoReply"> 6096 <member name="T:OpenMetaverse.Packets.EstateCovenantRequestPacket">
5250 <summary>The event subscribers, null of no subscribers</summary> 6097 <exclude/>
5251 </member> 6098 </member>
5252 <member name="F:OpenMetaverse.AvatarManager.m_ClassifiedInfoReplyLock"> 6099 <member name="T:OpenMetaverse.Packets.EstateCovenantRequestPacket.AgentDataBlock">
5253 <summary>Thread sync lock object</summary> 6100 <exclude/>
5254 </member> 6101 </member>
5255 <member name="F:OpenMetaverse.AvatarManager.m_DisplayNameUpdate"> 6102 <member name="T:OpenMetaverse.Packets.EstateCovenantReplyPacket">
5256 <summary>The event subscribers, null of no subscribers</summary> 6103 <exclude/>
5257 </member> 6104 </member>
5258 <member name="F:OpenMetaverse.AvatarManager.m_DisplayNameUpdateLock"> 6105 <member name="T:OpenMetaverse.Packets.EstateCovenantReplyPacket.DataBlock">
5259 <summary>Thread sync lock object</summary> 6106 <exclude/>
5260 </member> 6107 </member>
5261 <member name="E:OpenMetaverse.AvatarManager.AvatarAnimation"> 6108 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket">
5262 <summary>Raised when the simulator sends us data containing 6109 <exclude/>
5263 an agents animation playlist</summary>
5264 </member> 6110 </member>
5265 <member name="E:OpenMetaverse.AvatarManager.AvatarAppearance"> 6111 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket.HeaderBlock">
5266 <summary>Raised when the simulator sends us data containing 6112 <exclude/>
5267 the appearance information for an agent</summary>
5268 </member> 6113 </member>
5269 <member name="E:OpenMetaverse.AvatarManager.UUIDNameReply"> 6114 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket.DataBlock">
5270 <summary>Raised when the simulator sends us data containing 6115 <exclude/>
5271 agent names/id values</summary>
5272 </member> 6116 </member>
5273 <member name="E:OpenMetaverse.AvatarManager.AvatarInterestsReply"> 6117 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket">
5274 <summary>Raised when the simulator sends us data containing 6118 <exclude/>
5275 the interests listed in an agents profile</summary>
5276 </member> 6119 </member>
5277 <member name="E:OpenMetaverse.AvatarManager.AvatarPropertiesReply"> 6120 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket.AgentDataBlock">
5278 <summary>Raised when the simulator sends us data containing 6121 <exclude/>
5279 profile property information for an agent</summary>
5280 </member> 6122 </member>
5281 <member name="E:OpenMetaverse.AvatarManager.AvatarGroupsReply"> 6123 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket.ParcelDataBlock">
5282 <summary>Raised when the simulator sends us data containing 6124 <exclude/>
5283 the group membership an agent is a member of</summary>
5284 </member> 6125 </member>
5285 <member name="E:OpenMetaverse.AvatarManager.AvatarPickerReply"> 6126 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket">
5286 <summary>Raised when the simulator sends us data containing 6127 <exclude/>
5287 name/id pair</summary>
5288 </member> 6128 </member>
5289 <member name="E:OpenMetaverse.AvatarManager.ViewerEffectPointAt"> 6129 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket.AgentDataBlock">
5290 <summary>Raised when the simulator sends us data containing 6130 <exclude/>
5291 the objects and effect when an agent is pointing at</summary>
5292 </member> 6131 </member>
5293 <member name="E:OpenMetaverse.AvatarManager.ViewerEffectLookAt"> 6132 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket.DataBlock">
5294 <summary>Raised when the simulator sends us data containing 6133 <exclude/>
5295 the objects and effect when an agent is looking at</summary>
5296 </member> 6134 </member>
5297 <member name="E:OpenMetaverse.AvatarManager.ViewerEffect"> 6135 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket">
5298 <summary>Raised when the simulator sends us data containing 6136 <exclude/>
5299 an agents viewer effect information</summary>
5300 </member> 6137 </member>
5301 <member name="E:OpenMetaverse.AvatarManager.AvatarPicksReply"> 6138 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket.AgentDataBlock">
5302 <summary>Raised when the simulator sends us data containing 6139 <exclude/>
5303 the top picks from an agents profile</summary>
5304 </member> 6140 </member>
5305 <member name="E:OpenMetaverse.AvatarManager.PickInfoReply"> 6141 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket.DataBlock">
5306 <summary>Raised when the simulator sends us data containing 6142 <exclude/>
5307 the Pick details</summary>
5308 </member> 6143 </member>
5309 <member name="E:OpenMetaverse.AvatarManager.AvatarClassifiedReply"> 6144 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket">
5310 <summary>Raised when the simulator sends us data containing 6145 <exclude/>
5311 the classified ads an agent has placed</summary>
5312 </member> 6146 </member>
5313 <member name="E:OpenMetaverse.AvatarManager.ClassifiedInfoReply"> 6147 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.AgentDataBlock">
5314 <summary>Raised when the simulator sends us data containing 6148 <exclude/>
5315 the details of a classified ad</summary>
5316 </member> 6149 </member>
5317 <member name="E:OpenMetaverse.AvatarManager.DisplayNameUpdate"> 6150 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.DataBlock">
5318 <summary>Raised when the simulator sends us data containing 6151 <exclude/>
5319 the details of display name change</summary>
5320 </member> 6152 </member>
5321 <member name="M:OpenMetaverse.AvatarManager.OnAvatarAnimation(OpenMetaverse.AvatarAnimationEventArgs)"> 6153 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.ParcelDataBlock">
5322 <summary>Raises the AvatarAnimation Event</summary> 6154 <exclude/>
5323 <param name="e">An AvatarAnimationEventArgs object containing
5324 the data sent from the simulator</param>
5325 </member> 6155 </member>
5326 <member name="M:OpenMetaverse.AvatarManager.OnAvatarAppearance(OpenMetaverse.AvatarAppearanceEventArgs)"> 6156 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket">
5327 <summary>Raises the AvatarAppearance Event</summary> 6157 <exclude/>
5328 <param name="e">A AvatarAppearanceEventArgs object containing
5329 the data sent from the simulator</param>
5330 </member> 6158 </member>
5331 <member name="M:OpenMetaverse.AvatarManager.OnUUIDNameReply(OpenMetaverse.UUIDNameReplyEventArgs)"> 6159 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket.AgentDataBlock">
5332 <summary>Raises the UUIDNameReply Event</summary> 6160 <exclude/>
5333 <param name="e">A UUIDNameReplyEventArgs object containing
5334 the data sent from the simulator</param>
5335 </member> 6161 </member>
5336 <member name="M:OpenMetaverse.AvatarManager.OnAvatarInterestsReply(OpenMetaverse.AvatarInterestsReplyEventArgs)"> 6162 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket.ParcelDataBlock">
5337 <summary>Raises the AvatarInterestsReply Event</summary> 6163 <exclude/>
5338 <param name="e">A AvatarInterestsReplyEventArgs object containing
5339 the data sent from the simulator</param>
5340 </member> 6164 </member>
5341 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPropertiesReply(OpenMetaverse.AvatarPropertiesReplyEventArgs)"> 6165 <member name="T:OpenMetaverse.Packets.ParcelDividePacket">
5342 <summary>Raises the AvatarPropertiesReply Event</summary> 6166 <exclude/>
5343 <param name="e">A AvatarPropertiesReplyEventArgs object containing
5344 the data sent from the simulator</param>
5345 </member> 6167 </member>
5346 <member name="M:OpenMetaverse.AvatarManager.OnAvatarGroupsReply(OpenMetaverse.AvatarGroupsReplyEventArgs)"> 6168 <member name="T:OpenMetaverse.Packets.ParcelDividePacket.AgentDataBlock">
5347 <summary>Raises the AvatarGroupsReply Event</summary> 6169 <exclude/>
5348 <param name="e">A AvatarGroupsReplyEventArgs object containing
5349 the data sent from the simulator</param>
5350 </member> 6170 </member>
5351 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPickerReply(OpenMetaverse.AvatarPickerReplyEventArgs)"> 6171 <member name="T:OpenMetaverse.Packets.ParcelDividePacket.ParcelDataBlock">
5352 <summary>Raises the AvatarPickerReply Event</summary> 6172 <exclude/>
5353 <param name="e">A AvatarPickerReplyEventArgs object containing
5354 the data sent from the simulator</param>
5355 </member> 6173 </member>
5356 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffectPointAt(OpenMetaverse.ViewerEffectPointAtEventArgs)"> 6174 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket">
5357 <summary>Raises the ViewerEffectPointAt Event</summary> 6175 <exclude/>
5358 <param name="e">A ViewerEffectPointAtEventArgs object containing
5359 the data sent from the simulator</param>
5360 </member> 6176 </member>
5361 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffectLookAt(OpenMetaverse.ViewerEffectLookAtEventArgs)"> 6177 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket.AgentDataBlock">
5362 <summary>Raises the ViewerEffectLookAt Event</summary> 6178 <exclude/>
5363 <param name="e">A ViewerEffectLookAtEventArgs object containing
5364 the data sent from the simulator</param>
5365 </member> 6179 </member>
5366 <member name="M:OpenMetaverse.AvatarManager.OnViewerEffect(OpenMetaverse.ViewerEffectEventArgs)"> 6180 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket.DataBlock">
5367 <summary>Raises the ViewerEffect Event</summary> 6181 <exclude/>
5368 <param name="e">A ViewerEffectEventArgs object containing
5369 the data sent from the simulator</param>
5370 </member> 6182 </member>
5371 <member name="M:OpenMetaverse.AvatarManager.OnAvatarPicksReply(OpenMetaverse.AvatarPicksReplyEventArgs)"> 6183 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket">
5372 <summary>Raises the AvatarPicksReply Event</summary> 6184 <exclude/>
5373 <param name="e">A AvatarPicksReplyEventArgs object containing
5374 the data sent from the simulator</param>
5375 </member> 6185 </member>
5376 <member name="M:OpenMetaverse.AvatarManager.OnPickInfoReply(OpenMetaverse.PickInfoReplyEventArgs)"> 6186 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.AgentDataBlock">
5377 <summary>Raises the PickInfoReply Event</summary> 6187 <exclude/>
5378 <param name="e">A PickInfoReplyEventArgs object containing
5379 the data sent from the simulator</param>
5380 </member> 6188 </member>
5381 <member name="M:OpenMetaverse.AvatarManager.OnAvatarClassifiedReply(OpenMetaverse.AvatarClassifiedReplyEventArgs)"> 6189 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.DataBlock">
5382 <summary>Raises the AvatarClassifiedReply Event</summary> 6190 <exclude/>
5383 <param name="e">A AvatarClassifiedReplyEventArgs object containing
5384 the data sent from the simulator</param>
5385 </member> 6191 </member>
5386 <member name="M:OpenMetaverse.AvatarManager.OnClassifiedInfoReply(OpenMetaverse.ClassifiedInfoReplyEventArgs)"> 6192 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.ParcelDataBlock">
5387 <summary>Raises the ClassifiedInfoReply Event</summary> 6193 <exclude/>
5388 <param name="e">A ClassifiedInfoReplyEventArgs object containing
5389 the data sent from the simulator</param>
5390 </member> 6194 </member>
5391 <member name="M:OpenMetaverse.AvatarManager.OnDisplayNameUpdate(OpenMetaverse.DisplayNameUpdateEventArgs)"> 6195 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket">
5392 <summary>Raises the DisplayNameUpdate Event</summary> 6196 <exclude/>
5393 <param name="e">A DisplayNameUpdateEventArgs object containing
5394 the data sent from the simulator</param>
5395 </member> 6197 </member>
5396 <member name="M:OpenMetaverse.AvatarManager.RequestTrackAgent(OpenMetaverse.UUID)"> 6198 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket.AgentDataBlock">
5397 <summary>Tracks the specified avatar on your map</summary> 6199 <exclude/>
5398 <param name="preyID">Avatar ID to track</param>
5399 </member> 6200 </member>
5400 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarName(OpenMetaverse.UUID)"> 6201 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket.DataBlock">
5401 <summary> 6202 <exclude/>
5402 Request a single avatar name
5403 </summary>
5404 <param name="id">The avatar key to retrieve a name for</param>
5405 </member> 6203 </member>
5406 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarNames(System.Collections.Generic.List{OpenMetaverse.UUID})"> 6204 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket">
5407 <summary> 6205 <exclude/>
5408 Request a list of avatar names
5409 </summary>
5410 <param name="ids">The avatar keys to retrieve names for</param>
5411 </member> 6206 </member>
5412 <member name="M:OpenMetaverse.AvatarManager.DisplayNamesAvailable"> 6207 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket.AgentDataBlock">
5413 <summary> 6208 <exclude/>
5414 Check if Display Names functionality is available
5415 </summary>
5416 <returns>True if Display name functionality is available</returns>
5417 </member> 6209 </member>
5418 <member name="M:OpenMetaverse.AvatarManager.GetDisplayNames(System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.AvatarManager.DisplayNamesCallback)"> 6210 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket.DataBlock">
5419 <summary> 6211 <exclude/>
5420 Request retrieval of display names (max 90 names per request)
5421 </summary>
5422 <param name="ids">List of UUIDs to lookup</param>
5423 <param name="callback">Callback to report result of the operation</param>
5424 </member> 6212 </member>
5425 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarProperties(OpenMetaverse.UUID)"> 6213 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket">
5426 <summary> 6214 <exclude/>
5427 Start a request for Avatar Properties
5428 </summary>
5429 <param name="avatarid">
5430 </param>
5431 </member> 6215 </member>
5432 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarNameSearch(System.String,OpenMetaverse.UUID)"> 6216 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket.DataBlock">
5433 <summary> 6217 <exclude/>
5434 Search for an avatar (first name, last name)
5435 </summary>
5436 <param name="name">The name to search for</param>
5437 <param name="queryID">An ID to associate with this query</param>
5438 </member> 6218 </member>
5439 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarPicks(OpenMetaverse.UUID)"> 6219 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket.ListBlock">
5440 <summary> 6220 <exclude/>
5441 Start a request for Avatar Picks
5442 </summary>
5443 <param name="avatarid">UUID of the avatar</param>
5444 </member> 6221 </member>
5445 <member name="M:OpenMetaverse.AvatarManager.RequestAvatarClassified(OpenMetaverse.UUID)"> 6222 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket">
5446 <summary> 6223 <exclude/>
5447 Start a request for Avatar Classifieds
5448 </summary>
5449 <param name="avatarid">UUID of the avatar</param>
5450 </member> 6224 </member>
5451 <member name="M:OpenMetaverse.AvatarManager.RequestPickInfo(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 6225 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.AgentDataBlock">
5452 <summary> 6226 <exclude/>
5453 Start a request for details of a specific profile pick
5454 </summary>
5455 <param name="avatarid">UUID of the avatar</param>
5456 <param name="pickid">UUID of the profile pick</param>
5457 </member> 6227 </member>
5458 <member name="M:OpenMetaverse.AvatarManager.RequestClassifiedInfo(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 6228 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.DataBlock">
5459 <summary> 6229 <exclude/>
5460 Start a request for details of a specific profile classified
5461 </summary>
5462 <param name="avatarid">UUID of the avatar</param>
5463 <param name="classifiedid">UUID of the profile classified</param>
5464 </member> 6230 </member>
5465 <member name="M:OpenMetaverse.AvatarManager.UUIDNameReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6231 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.ListBlock">
5466 <summary>Process an incoming packet and raise the appropriate events</summary> 6232 <exclude/>
5467 <param name="sender">The sender</param>
5468 <param name="e">The EventArgs object containing the packet data</param>
5469 </member> 6233 </member>
5470 <member name="M:OpenMetaverse.AvatarManager.AvatarAnimationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6234 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket">
5471 <summary>Process an incoming packet and raise the appropriate events</summary> 6235 <exclude/>
5472 <param name="sender">The sender</param>
5473 <param name="e">The EventArgs object containing the packet data</param>
5474 </member> 6236 </member>
5475 <member name="M:OpenMetaverse.AvatarManager.AvatarAppearanceHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6237 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket.AgentDataBlock">
5476 <summary>Process an incoming packet and raise the appropriate events</summary> 6238 <exclude/>
5477 <param name="sender">The sender</param>
5478 <param name="e">The EventArgs object containing the packet data</param>
5479 </member> 6239 </member>
5480 <member name="M:OpenMetaverse.AvatarManager.AvatarPropertiesHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6240 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket.DataBlock">
5481 <summary>Process an incoming packet and raise the appropriate events</summary> 6241 <exclude/>
5482 <param name="sender">The sender</param>
5483 <param name="e">The EventArgs object containing the packet data</param>
5484 </member> 6242 </member>
5485 <member name="M:OpenMetaverse.AvatarManager.AvatarInterestsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6243 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket">
5486 <summary>Process an incoming packet and raise the appropriate events</summary> 6244 <exclude/>
5487 <param name="sender">The sender</param>
5488 <param name="e">The EventArgs object containing the packet data</param>
5489 </member> 6245 </member>
5490 <member name="M:OpenMetaverse.AvatarManager.DisplayNameUpdateMessageHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 6246 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket.AgentDataBlock">
5491 <summary> 6247 <exclude/>
5492 EQ Message fired when someone nearby changes their display name
5493 </summary>
5494 <param name="capsKey">The message key</param>
5495 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
5496 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> which originated the packet</param>
5497 </member> 6248 </member>
5498 <member name="M:OpenMetaverse.AvatarManager.AvatarGroupsReplyMessageHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 6249 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket.DataBlock">
5499 <summary> 6250 <exclude/>
5500 Crossed region handler for message that comes across the EventQueue. Sent to an agent
5501 when the agent crosses a sim border into a new region.
5502 </summary>
5503 <param name="capsKey">The message key</param>
5504 <param name="message">the IMessage object containing the deserialized data sent from the simulator</param>
5505 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> which originated the packet</param>
5506 </member> 6251 </member>
5507 <member name="M:OpenMetaverse.AvatarManager.AvatarGroupsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6252 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket">
5508 <summary>Process an incoming packet and raise the appropriate events</summary> 6253 <exclude/>
5509 <param name="sender">The sender</param>
5510 <param name="e">The EventArgs object containing the packet data</param>
5511 </member> 6254 </member>
5512 <member name="M:OpenMetaverse.AvatarManager.AvatarPickerReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6255 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket.AgentDataBlock">
5513 <summary>Process an incoming packet and raise the appropriate events</summary> 6256 <exclude/>
5514 <param name="sender">The sender</param>
5515 <param name="e">The EventArgs object containing the packet data</param>
5516 </member> 6257 </member>
5517 <member name="M:OpenMetaverse.AvatarManager.ViewerEffectHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6258 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket.ParcelDataBlock">
5518 <summary>Process an incoming packet and raise the appropriate events</summary> 6259 <exclude/>
5519 <param name="sender">The sender</param>
5520 <param name="e">The EventArgs object containing the packet data</param>
5521 </member> 6260 </member>
5522 <member name="M:OpenMetaverse.AvatarManager.AvatarPicksReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6261 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket">
5523 <summary>Process an incoming packet and raise the appropriate events</summary> 6262 <exclude/>
5524 <param name="sender">The sender</param>
5525 <param name="e">The EventArgs object containing the packet data</param>
5526 </member> 6263 </member>
5527 <member name="M:OpenMetaverse.AvatarManager.PickInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6264 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket.AgentDataBlock">
5528 <summary>Process an incoming packet and raise the appropriate events</summary> 6265 <exclude/>
5529 <param name="sender">The sender</param>
5530 <param name="e">The EventArgs object containing the packet data</param>
5531 </member> 6266 </member>
5532 <member name="M:OpenMetaverse.AvatarManager.AvatarClassifiedReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6267 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket.ParcelDataBlock">
5533 <summary>Process an incoming packet and raise the appropriate events</summary> 6268 <exclude/>
5534 <param name="sender">The sender</param>
5535 <param name="e">The EventArgs object containing the packet data</param>
5536 </member> 6269 </member>
5537 <member name="M:OpenMetaverse.AvatarManager.ClassifiedInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 6270 <member name="T:OpenMetaverse.Packets.UUIDNameRequestPacket">
5538 <summary>Process an incoming packet and raise the appropriate events</summary> 6271 <exclude/>
5539 <param name="sender">The sender</param>
5540 <param name="e">The EventArgs object containing the packet data</param>
5541 </member> 6272 </member>
5542 <member name="T:OpenMetaverse.AvatarAnimationEventArgs"> 6273 <member name="T:OpenMetaverse.Packets.UUIDNameRequestPacket.UUIDNameBlockBlock">
5543 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAnimation" /> event</summary> 6274 <exclude/>
5544 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAnimation" /> event occurs when the simulator sends
5545 the animation playlist for an agent</remarks>
5546 <example>
5547 The following code example uses the <see cref="P:OpenMetaverse.AvatarAnimationEventArgs.AvatarID" /> and <see cref="P:OpenMetaverse.AvatarAnimationEventArgs.Animations" />
5548 properties to display the animation playlist of an avatar on the <see cref="T:System.Console" /> window.
5549 <code>
5550 // subscribe to the event
5551 Client.Avatars.AvatarAnimation += Avatars_AvatarAnimation;
5552 private void Avatars_AvatarAnimation(object sender, AvatarAnimationEventArgs e)
5553 {
5554 // create a dictionary of "known" animations from the Animations class using System.Reflection
5555 Dictionary&lt;UUID, string&gt; systemAnimations = new Dictionary&lt;UUID, string&gt;();
5556 Type type = typeof(Animations);
5557 System.Reflection.FieldInfo[] fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
5558 foreach (System.Reflection.FieldInfo field in fields)
5559 {
5560 systemAnimations.Add((UUID)field.GetValue(type), field.Name);
5561 }
5562 // find out which animations being played are known animations and which are assets
5563 foreach (Animation animation in e.Animations)
5564 {
5565 if (systemAnimations.ContainsKey(animation.AnimationID))
5566 {
5567 Console.WriteLine("{0} is playing {1} ({2}) sequence {3}", e.AvatarID,
5568 systemAnimations[animation.AnimationID], animation.AnimationSequence);
5569 }
5570 else
5571 {
5572 Console.WriteLine("{0} is playing {1} (Asset) sequence {2}", e.AvatarID,
5573 animation.AnimationID, animation.AnimationSequence);
5574 }
5575 }
5576 }
5577 </code></example>
5578 </member> 6275 </member>
5579 <member name="M:OpenMetaverse.AvatarAnimationEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.Animation})"> 6276 <member name="T:OpenMetaverse.Packets.UUIDNameReplyPacket">
5580 <summary> 6277 <exclude/>
5581 Construct a new instance of the AvatarAnimationEventArgs class
5582 </summary>
5583 <param name="avatarID">The ID of the agent</param>
5584 <param name="anims">The list of animations to start</param>
5585 </member> 6278 </member>
5586 <member name="P:OpenMetaverse.AvatarAnimationEventArgs.AvatarID"> 6279 <member name="T:OpenMetaverse.Packets.UUIDNameReplyPacket.UUIDNameBlockBlock">
5587 <summary>Get the ID of the agent</summary> 6280 <exclude/>
5588 </member> 6281 </member>
5589 <member name="P:OpenMetaverse.AvatarAnimationEventArgs.Animations"> 6282 <member name="T:OpenMetaverse.Packets.UUIDGroupNameRequestPacket">
5590 <summary>Get the list of animations to start</summary> 6283 <exclude/>
5591 </member> 6284 </member>
5592 <member name="T:OpenMetaverse.AvatarAppearanceEventArgs"> 6285 <member name="T:OpenMetaverse.Packets.UUIDGroupNameRequestPacket.UUIDNameBlockBlock">
5593 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance" /> event</summary> 6286 <exclude/>
5594 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance" /> event occurs when the simulator sends
5595 the appearance data for an avatar</remarks>
5596 <example>
5597 The following code example uses the <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID" /> and <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams" />
5598 properties to display the selected shape of an avatar on the <see cref="T:System.Console" /> window.
5599 <code>
5600 // subscribe to the event
5601 Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance;
5602 // handle the data when the event is raised
5603 void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e)
5604 {
5605 Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] &gt; 0) : "male" ? "female")
5606 }
5607 </code></example>
5608 </member> 6287 </member>
5609 <member name="M:OpenMetaverse.AvatarAppearanceEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean,OpenMetaverse.Primitive.TextureEntryFace,OpenMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte})"> 6288 <member name="T:OpenMetaverse.Packets.UUIDGroupNameReplyPacket">
5610 <summary> 6289 <exclude/>
5611 Construct a new instance of the AvatarAppearanceEventArgs class
5612 </summary>
5613 <param name="sim">The simulator request was from</param>
5614 <param name="avatarID">The ID of the agent</param>
5615 <param name="isTrial">true of the agent is a trial account</param>
5616 <param name="defaultTexture">The default agent texture</param>
5617 <param name="faceTextures">The agents appearance layer textures</param>
5618 <param name="visualParams">The <see cref="T:OpenMetaverse.VisualParams" /> for the agent</param>
5619 </member> 6290 </member>
5620 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.Simulator"> 6291 <member name="T:OpenMetaverse.Packets.UUIDGroupNameReplyPacket.UUIDNameBlockBlock">
5621 <summary>Get the Simulator this request is from of the agent</summary> 6292 <exclude/>
5622 </member> 6293 </member>
5623 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID"> 6294 <member name="T:OpenMetaverse.Packets.ChildAgentDyingPacket">
5624 <summary>Get the ID of the agent</summary> 6295 <exclude/>
5625 </member> 6296 </member>
5626 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.IsTrial"> 6297 <member name="T:OpenMetaverse.Packets.ChildAgentDyingPacket.AgentDataBlock">
5627 <summary>true if the agent is a trial account</summary> 6298 <exclude/>
5628 </member> 6299 </member>
5629 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.DefaultTexture"> 6300 <member name="T:OpenMetaverse.Packets.ChildAgentUnknownPacket">
5630 <summary>Get the default agent texture</summary> 6301 <exclude/>
5631 </member> 6302 </member>
5632 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.FaceTextures"> 6303 <member name="T:OpenMetaverse.Packets.ChildAgentUnknownPacket.AgentDataBlock">
5633 <summary>Get the agents appearance layer textures</summary> 6304 <exclude/>
5634 </member> 6305 </member>
5635 <member name="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams"> 6306 <member name="T:OpenMetaverse.Packets.GetScriptRunningPacket">
5636 <summary>Get the <see cref="T:OpenMetaverse.VisualParams" /> for the agent</summary> 6307 <exclude/>
5637 </member> 6308 </member>
5638 <member name="T:OpenMetaverse.AvatarInterestsReplyEventArgs"> 6309 <member name="T:OpenMetaverse.Packets.GetScriptRunningPacket.ScriptBlock">
5639 <summary>Represents the interests from the profile of an agent</summary> 6310 <exclude/>
5640 </member> 6311 </member>
5641 <member name="P:OpenMetaverse.AvatarInterestsReplyEventArgs.AvatarID"> 6312 <member name="T:OpenMetaverse.Packets.ScriptRunningReplyPacket">
5642 <summary>Get the ID of the agent</summary> 6313 <exclude/>
5643 </member> 6314 </member>
5644 <member name="T:OpenMetaverse.AvatarPropertiesReplyEventArgs"> 6315 <member name="T:OpenMetaverse.Packets.ScriptRunningReplyPacket.ScriptBlock">
5645 <summary>The properties of an agent</summary> 6316 <exclude/>
5646 </member> 6317 </member>
5647 <member name="P:OpenMetaverse.AvatarPropertiesReplyEventArgs.AvatarID"> 6318 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket">
5648 <summary>Get the ID of the agent</summary> 6319 <exclude/>
5649 </member> 6320 </member>
5650 <member name="P:OpenMetaverse.AvatarGroupsReplyEventArgs.AvatarID"> 6321 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket.AgentDataBlock">
5651 <summary>Get the ID of the agent</summary> 6322 <exclude/>
5652 </member> 6323 </member>
5653 <member name="P:OpenMetaverse.AvatarPicksReplyEventArgs.AvatarID"> 6324 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket.ScriptBlock">
5654 <summary>Get the ID of the agent</summary> 6325 <exclude/>
5655 </member> 6326 </member>
5656 <member name="P:OpenMetaverse.AvatarClassifiedReplyEventArgs.AvatarID"> 6327 <member name="T:OpenMetaverse.Packets.ScriptResetPacket">
5657 <summary>Get the ID of the avatar</summary> 6328 <exclude/>
5658 </member> 6329 </member>
5659 <member name="T:OpenMetaverse.DisplayNameUpdateEventArgs"> 6330 <member name="T:OpenMetaverse.Packets.ScriptResetPacket.AgentDataBlock">
5660 <summary> 6331 <exclude/>
5661 Event args class for display name notification messages
5662 </summary>
5663 </member> 6332 </member>
5664 <member name="T:OpenMetaverse.BinBVHAnimationReader"> 6333 <member name="T:OpenMetaverse.Packets.ScriptResetPacket.ScriptBlock">
5665 <summary> 6334 <exclude/>
5666 Reads in a byte array of an Animation Asset created by the SecondLife(tm) client.
5667 </summary>
5668 </member> 6335 </member>
5669 <member name="M:OpenMetaverse.BinBVHAnimationReader.#ctor(System.Byte[])"> 6336 <member name="T:OpenMetaverse.Packets.ScriptSensorRequestPacket">
5670 <summary> 6337 <exclude/>
5671 Searialize an animation asset into it's joints/keyframes/meta data
5672 </summary>
5673 <param name="animationdata">
5674 </param>
5675 </member> 6338 </member>
5676 <member name="F:OpenMetaverse.BinBVHAnimationReader.rotationkeys"> 6339 <member name="T:OpenMetaverse.Packets.ScriptSensorRequestPacket.RequesterBlock">
5677 <summary> 6340 <exclude/>
5678 Rotation Keyframe count (used internally)
5679 </summary>
5680 </member> 6341 </member>
5681 <member name="F:OpenMetaverse.BinBVHAnimationReader.positionkeys"> 6342 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket">
5682 <summary> 6343 <exclude/>
5683 Position Keyframe count (used internally)
5684 </summary>
5685 </member> 6344 </member>
5686 <member name="F:OpenMetaverse.BinBVHAnimationReader.Priority"> 6345 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket.RequesterBlock">
5687 <summary> 6346 <exclude/>
5688 Animation Priority
5689 </summary>
5690 </member> 6347 </member>
5691 <member name="F:OpenMetaverse.BinBVHAnimationReader.Length"> 6348 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket.SensedDataBlock">
5692 <summary> 6349 <exclude/>
5693 The animation length in seconds.
5694 </summary>
5695 </member> 6350 </member>
5696 <member name="F:OpenMetaverse.BinBVHAnimationReader.ExpressionName"> 6351 <member name="T:OpenMetaverse.Packets.CompleteAgentMovementPacket">
5697 <summary> 6352 <exclude/>
5698 Expression set in the client. Null if [None] is selected
5699 </summary>
5700 </member> 6353 </member>
5701 <member name="F:OpenMetaverse.BinBVHAnimationReader.InPoint"> 6354 <member name="T:OpenMetaverse.Packets.CompleteAgentMovementPacket.AgentDataBlock">
5702 <summary> 6355 <exclude/>
5703 The time in seconds to start the animation
5704 </summary>
5705 </member> 6356 </member>
5706 <member name="F:OpenMetaverse.BinBVHAnimationReader.OutPoint"> 6357 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket">
5707 <summary> 6358 <exclude/>
5708 The time in seconds to end the animation
5709 </summary>
5710 </member> 6359 </member>
5711 <member name="F:OpenMetaverse.BinBVHAnimationReader.Loop"> 6360 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.AgentDataBlock">
5712 <summary> 6361 <exclude/>
5713 Loop the animation
5714 </summary>
5715 </member> 6362 </member>
5716 <member name="F:OpenMetaverse.BinBVHAnimationReader.EaseInTime"> 6363 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.DataBlock">
5717 <summary> 6364 <exclude/>
5718 Meta data. Ease in Seconds.
5719 </summary>
5720 </member> 6365 </member>
5721 <member name="F:OpenMetaverse.BinBVHAnimationReader.EaseOutTime"> 6366 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.SimDataBlock">
5722 <summary> 6367 <exclude/>
5723 Meta data. Ease out seconds.
5724 </summary>
5725 </member> 6368 </member>
5726 <member name="F:OpenMetaverse.BinBVHAnimationReader.HandPose"> 6369 <member name="T:OpenMetaverse.Packets.LogoutRequestPacket">
5727 <summary> 6370 <exclude/>
5728 Meta Data for the Hand Pose
5729 </summary>
5730 </member> 6371 </member>
5731 <member name="F:OpenMetaverse.BinBVHAnimationReader.JointCount"> 6372 <member name="T:OpenMetaverse.Packets.LogoutRequestPacket.AgentDataBlock">
5732 <summary> 6373 <exclude/>
5733 Number of joints defined in the animation
5734 </summary>
5735 </member> 6374 </member>
5736 <member name="F:OpenMetaverse.BinBVHAnimationReader.joints"> 6375 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket">
5737 <summary> 6376 <exclude/>
5738 Contains an array of joints
5739 </summary>
5740 </member> 6377 </member>
5741 <member name="M:OpenMetaverse.BinBVHAnimationReader.ReadBytesUntilNull(System.Byte[],System.Int32@)"> 6378 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket.AgentDataBlock">
5742 <summary> 6379 <exclude/>
5743 Variable length strings seem to be null terminated in the animation asset.. but..
5744 use with caution, home grown.
5745 advances the index.
5746 </summary>
5747 <param name="data">The animation asset byte array</param>
5748 <param name="i">The offset to start reading</param>
5749 <returns>a string</returns>
5750 </member> 6380 </member>
5751 <member name="M:OpenMetaverse.BinBVHAnimationReader.readJoint(System.Byte[],System.Int32@)"> 6381 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket.InventoryDataBlock">
5752 <summary> 6382 <exclude/>
5753 Read in a Joint from an animation asset byte array
5754 Variable length Joint fields, yay!
5755 Advances the index
5756 </summary>
5757 <param name="data">animation asset byte array</param>
5758 <param name="i">Byte Offset of the start of the joint</param>
5759 <returns>The Joint data serialized into the binBVHJoint structure</returns>
5760 </member> 6383 </member>
5761 <member name="M:OpenMetaverse.BinBVHAnimationReader.readKeys(System.Byte[],System.Int32@,System.Int32,System.Single,System.Single)"> 6384 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket">
5762 <summary> 6385 <exclude/>
5763 Read Keyframes of a certain type
5764 advance i
5765 </summary>
5766 <param name="data">Animation Byte array</param>
5767 <param name="i">Offset in the Byte Array. Will be advanced</param>
5768 <param name="keycount">Number of Keyframes</param>
5769 <param name="min">Scaling Min to pass to the Uint16ToFloat method</param>
5770 <param name="max">Scaling Max to pass to the Uint16ToFloat method</param>
5771 <returns>
5772 </returns>
5773 </member> 6386 </member>
5774 <member name="T:OpenMetaverse.binBVHJoint"> 6387 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket.AgentDataBlock">
5775 <summary> 6388 <exclude/>
5776 A Joint and it's associated meta data and keyframes
5777 </summary>
5778 </member> 6389 </member>
5779 <member name="F:OpenMetaverse.binBVHJoint.Name"> 6390 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket.MessageBlockBlock">
5780 <summary> 6391 <exclude/>
5781 Name of the Joint. Matches the avatar_skeleton.xml in client distros
5782 </summary>
5783 </member> 6392 </member>
5784 <member name="F:OpenMetaverse.binBVHJoint.Priority"> 6393 <member name="T:OpenMetaverse.Packets.RetrieveInstantMessagesPacket">
5785 <summary> 6394 <exclude/>
5786 Joint Animation Override? Was the same as the Priority in testing..
5787 </summary>
5788 </member> 6395 </member>
5789 <member name="F:OpenMetaverse.binBVHJoint.rotationkeys"> 6396 <member name="T:OpenMetaverse.Packets.RetrieveInstantMessagesPacket.AgentDataBlock">
5790 <summary> 6397 <exclude/>
5791 Array of Rotation Keyframes in order from earliest to latest
5792 </summary>
5793 </member> 6398 </member>
5794 <member name="F:OpenMetaverse.binBVHJoint.positionkeys"> 6399 <member name="T:OpenMetaverse.Packets.FindAgentPacket">
5795 <summary> 6400 <exclude/>
5796 Array of Position Keyframes in order from earliest to latest
5797 This seems to only be for the Pelvis?
5798 </summary>
5799 </member> 6401 </member>
5800 <member name="F:OpenMetaverse.binBVHJoint.Tag"> 6402 <member name="T:OpenMetaverse.Packets.FindAgentPacket.AgentBlockBlock">
5801 <summary> 6403 <exclude/>
5802 Custom application data that can be attached to a joint
5803 </summary>
5804 </member> 6404 </member>
5805 <member name="T:OpenMetaverse.binBVHJointKey"> 6405 <member name="T:OpenMetaverse.Packets.FindAgentPacket.LocationBlockBlock">
5806 <summary> 6406 <exclude/>
5807 A Joint Keyframe. This is either a position or a rotation.
5808 </summary>
5809 </member> 6407 </member>
5810 <member name="F:OpenMetaverse.binBVHJointKey.key_element"> 6408 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket">
6409 <exclude/>
6410 </member>
6411 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket.AgentDataBlock">
6412 <exclude/>
6413 </member>
6414 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket.RequestBlockBlock">
6415 <exclude/>
6416 </member>
6417 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket">
6418 <exclude/>
6419 </member>
6420 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket.AgentDataBlock">
6421 <exclude/>
6422 </member>
6423 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket.GrantDataBlock">
6424 <exclude/>
6425 </member>
6426 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket">
6427 <exclude/>
6428 </member>
6429 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.AgentDataBlock">
6430 <exclude/>
6431 </member>
6432 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.MethodDataBlock">
6433 <exclude/>
6434 </member>
6435 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.ParamListBlock">
6436 <exclude/>
6437 </member>
6438 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket">
6439 <exclude/>
6440 </member>
6441 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.AgentDataBlock">
6442 <exclude/>
6443 </member>
6444 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.MethodDataBlock">
6445 <exclude/>
6446 </member>
6447 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.ParamListBlock">
6448 <exclude/>
6449 </member>
6450 <member name="T:OpenMetaverse.Packets.GenericMessagePacket">
6451 <exclude/>
6452 </member>
6453 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.AgentDataBlock">
6454 <exclude/>
6455 </member>
6456 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.MethodDataBlock">
6457 <exclude/>
6458 </member>
6459 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.ParamListBlock">
6460 <exclude/>
6461 </member>
6462 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket">
6463 <exclude/>
6464 </member>
6465 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket.AgentDataBlock">
6466 <exclude/>
6467 </member>
6468 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket.MuteDataBlock">
6469 <exclude/>
6470 </member>
6471 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket">
6472 <exclude/>
6473 </member>
6474 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket.AgentDataBlock">
6475 <exclude/>
6476 </member>
6477 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket.MuteDataBlock">
6478 <exclude/>
6479 </member>
6480 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket">
6481 <exclude/>
6482 </member>
6483 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket.AgentDataBlock">
6484 <exclude/>
6485 </member>
6486 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket.MuteDataBlock">
6487 <exclude/>
6488 </member>
6489 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket">
6490 <exclude/>
6491 </member>
6492 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.AgentDataBlock">
6493 <exclude/>
6494 </member>
6495 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.NotecardDataBlock">
6496 <exclude/>
6497 </member>
6498 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.InventoryDataBlock">
6499 <exclude/>
6500 </member>
6501 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket">
6502 <exclude/>
6503 </member>
6504 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket.AgentDataBlock">
6505 <exclude/>
6506 </member>
6507 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket.InventoryDataBlock">
6508 <exclude/>
6509 </member>
6510 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket">
6511 <exclude/>
6512 </member>
6513 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket.AgentDataBlock">
6514 <exclude/>
6515 </member>
6516 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket.InventoryDataBlock">
6517 <exclude/>
6518 </member>
6519 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket">
6520 <exclude/>
6521 </member>
6522 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket.AgentDataBlock">
6523 <exclude/>
6524 </member>
6525 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket.InventoryDataBlock">
6526 <exclude/>
6527 </member>
6528 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket">
6529 <exclude/>
6530 </member>
6531 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket.AgentDataBlock">
6532 <exclude/>
6533 </member>
6534 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket.InventoryDataBlock">
6535 <exclude/>
6536 </member>
6537 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket">
6538 <exclude/>
6539 </member>
6540 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket.AgentDataBlock">
6541 <exclude/>
6542 </member>
6543 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket.InventoryDataBlock">
6544 <exclude/>
6545 </member>
6546 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket">
6547 <exclude/>
6548 </member>
6549 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket.AgentDataBlock">
6550 <exclude/>
6551 </member>
6552 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket.InventoryDataBlock">
6553 <exclude/>
6554 </member>
6555 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket">
6556 <exclude/>
6557 </member>
6558 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket.AgentDataBlock">
6559 <exclude/>
6560 </member>
6561 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket.InventoryDataBlock">
6562 <exclude/>
6563 </member>
6564 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket">
6565 <exclude/>
6566 </member>
6567 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket.AgentDataBlock">
6568 <exclude/>
6569 </member>
6570 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket.FolderDataBlock">
6571 <exclude/>
6572 </member>
6573 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket">
6574 <exclude/>
6575 </member>
6576 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket.AgentDataBlock">
6577 <exclude/>
6578 </member>
6579 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket.FolderDataBlock">
6580 <exclude/>
6581 </member>
6582 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket">
6583 <exclude/>
6584 </member>
6585 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket.AgentDataBlock">
6586 <exclude/>
6587 </member>
6588 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket.InventoryDataBlock">
6589 <exclude/>
6590 </member>
6591 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket">
6592 <exclude/>
6593 </member>
6594 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket.AgentDataBlock">
6595 <exclude/>
6596 </member>
6597 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket.FolderDataBlock">
6598 <exclude/>
6599 </member>
6600 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket">
6601 <exclude/>
6602 </member>
6603 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket.AgentDataBlock">
6604 <exclude/>
6605 </member>
6606 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket.InventoryDataBlock">
6607 <exclude/>
6608 </member>
6609 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket">
6610 <exclude/>
6611 </member>
6612 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.AgentDataBlock">
6613 <exclude/>
6614 </member>
6615 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.FolderDataBlock">
6616 <exclude/>
6617 </member>
6618 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.ItemDataBlock">
6619 <exclude/>
6620 </member>
6621 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket">
6622 <exclude/>
6623 </member>
6624 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket.AgentDataBlock">
6625 <exclude/>
6626 </member>
6627 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket.InventoryDataBlock">
6628 <exclude/>
6629 </member>
6630 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket">
6631 <exclude/>
6632 </member>
6633 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket.AgentDataBlock">
6634 <exclude/>
6635 </member>
6636 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket.InventoryDataBlock">
6637 <exclude/>
6638 </member>
6639 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket">
6640 <exclude/>
6641 </member>
6642 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.AgentDataBlock">
6643 <exclude/>
6644 </member>
6645 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.FolderDataBlock">
6646 <exclude/>
6647 </member>
6648 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.ItemDataBlock">
6649 <exclude/>
6650 </member>
6651 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket">
6652 <exclude/>
6653 </member>
6654 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.AgentDataBlock">
6655 <exclude/>
6656 </member>
6657 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.FolderDataBlock">
6658 <exclude/>
6659 </member>
6660 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.ItemDataBlock">
6661 <exclude/>
6662 </member>
6663 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket">
6664 <exclude/>
6665 </member>
6666 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket.AgentDataBlock">
6667 <exclude/>
6668 </member>
6669 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket.InventoryDataBlock">
6670 <exclude/>
6671 </member>
6672 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket">
6673 <exclude/>
6674 </member>
6675 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.AgentDataBlock">
6676 <exclude/>
6677 </member>
6678 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.UpdateDataBlock">
6679 <exclude/>
6680 </member>
6681 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.InventoryDataBlock">
6682 <exclude/>
6683 </member>
6684 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket">
6685 <exclude/>
6686 </member>
6687 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket.AgentDataBlock">
6688 <exclude/>
6689 </member>
6690 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket.InventoryDataBlock">
6691 <exclude/>
6692 </member>
6693 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket">
6694 <exclude/>
6695 </member>
6696 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket.AgentDataBlock">
6697 <exclude/>
6698 </member>
6699 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket.InventoryDataBlock">
6700 <exclude/>
6701 </member>
6702 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket">
6703 <exclude/>
6704 </member>
6705 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket.AgentDataBlock">
6706 <exclude/>
6707 </member>
6708 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket.InventoryDataBlock">
6709 <exclude/>
6710 </member>
6711 <member name="T:OpenMetaverse.Packets.ReplyTaskInventoryPacket">
6712 <exclude/>
6713 </member>
6714 <member name="T:OpenMetaverse.Packets.ReplyTaskInventoryPacket.InventoryDataBlock">
6715 <exclude/>
6716 </member>
6717 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket">
6718 <exclude/>
6719 </member>
6720 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.AgentDataBlock">
6721 <exclude/>
6722 </member>
6723 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.AgentBlockBlock">
6724 <exclude/>
6725 </member>
6726 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.ObjectDataBlock">
6727 <exclude/>
6728 </member>
6729 <member name="T:OpenMetaverse.Packets.DeRezAckPacket">
6730 <exclude/>
6731 </member>
6732 <member name="T:OpenMetaverse.Packets.DeRezAckPacket.TransactionDataBlock">
6733 <exclude/>
6734 </member>
6735 <member name="T:OpenMetaverse.Packets.RezObjectPacket">
6736 <exclude/>
6737 </member>
6738 <member name="T:OpenMetaverse.Packets.RezObjectPacket.AgentDataBlock">
6739 <exclude/>
6740 </member>
6741 <member name="T:OpenMetaverse.Packets.RezObjectPacket.RezDataBlock">
6742 <exclude/>
6743 </member>
6744 <member name="T:OpenMetaverse.Packets.RezObjectPacket.InventoryDataBlock">
6745 <exclude/>
6746 </member>
6747 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket">
6748 <exclude/>
6749 </member>
6750 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.AgentDataBlock">
6751 <exclude/>
6752 </member>
6753 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.RezDataBlock">
6754 <exclude/>
6755 </member>
6756 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.NotecardDataBlock">
6757 <exclude/>
6758 </member>
6759 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.InventoryDataBlock">
6760 <exclude/>
6761 </member>
6762 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket">
6763 <exclude/>
6764 </member>
6765 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.AgentDataBlock">
6766 <exclude/>
6767 </member>
6768 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.TransactionBlockBlock">
6769 <exclude/>
6770 </member>
6771 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.FolderDataBlock">
6772 <exclude/>
6773 </member>
6774 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket">
6775 <exclude/>
6776 </member>
6777 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket.AgentDataBlock">
6778 <exclude/>
6779 </member>
6780 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket.TransactionBlockBlock">
6781 <exclude/>
6782 </member>
6783 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket">
6784 <exclude/>
6785 </member>
6786 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket.AgentDataBlock">
6787 <exclude/>
6788 </member>
6789 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket.ExBlockBlock">
6790 <exclude/>
6791 </member>
6792 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket">
6793 <exclude/>
6794 </member>
6795 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket.AgentDataBlock">
6796 <exclude/>
6797 </member>
6798 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket.AgentBlockBlock">
6799 <exclude/>
6800 </member>
6801 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket">
6802 <exclude/>
6803 </member>
6804 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.AgentDataBlock">
6805 <exclude/>
6806 </member>
6807 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.TransactionBlockBlock">
6808 <exclude/>
6809 </member>
6810 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.FolderDataBlock">
6811 <exclude/>
6812 </member>
6813 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket">
6814 <exclude/>
6815 </member>
6816 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket.AgentDataBlock">
6817 <exclude/>
6818 </member>
6819 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket.TransactionBlockBlock">
6820 <exclude/>
6821 </member>
6822 <member name="T:OpenMetaverse.Packets.RezScriptPacket">
6823 <exclude/>
6824 </member>
6825 <member name="T:OpenMetaverse.Packets.RezScriptPacket.AgentDataBlock">
6826 <exclude/>
6827 </member>
6828 <member name="T:OpenMetaverse.Packets.RezScriptPacket.UpdateBlockBlock">
6829 <exclude/>
6830 </member>
6831 <member name="T:OpenMetaverse.Packets.RezScriptPacket.InventoryBlockBlock">
6832 <exclude/>
6833 </member>
6834 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket">
6835 <exclude/>
6836 </member>
6837 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket.AgentDataBlock">
6838 <exclude/>
6839 </member>
6840 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket.InventoryBlockBlock">
6841 <exclude/>
6842 </member>
6843 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket">
6844 <exclude/>
6845 </member>
6846 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.AgentDataBlock">
6847 <exclude/>
6848 </member>
6849 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.EventDataBlock">
6850 <exclude/>
6851 </member>
6852 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.InventoryBlockBlock">
6853 <exclude/>
6854 </member>
6855 <member name="T:OpenMetaverse.Packets.RegionHandleRequestPacket">
6856 <exclude/>
6857 </member>
6858 <member name="T:OpenMetaverse.Packets.RegionHandleRequestPacket.RequestBlockBlock">
6859 <exclude/>
6860 </member>
6861 <member name="T:OpenMetaverse.Packets.RegionIDAndHandleReplyPacket">
6862 <exclude/>
6863 </member>
6864 <member name="T:OpenMetaverse.Packets.RegionIDAndHandleReplyPacket.ReplyBlockBlock">
6865 <exclude/>
6866 </member>
6867 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket">
6868 <exclude/>
6869 </member>
6870 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket.AgentDataBlock">
6871 <exclude/>
6872 </member>
6873 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket.MoneyDataBlock">
6874 <exclude/>
6875 </member>
6876 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket">
6877 <exclude/>
6878 </member>
6879 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket.AgentDataBlock">
6880 <exclude/>
6881 </member>
6882 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket.MoneyDataBlock">
6883 <exclude/>
6884 </member>
6885 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket">
6886 <exclude/>
6887 </member>
6888 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket.MoneyDataBlock">
6889 <exclude/>
6890 </member>
6891 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket.TransactionInfoBlock">
6892 <exclude/>
6893 </member>
6894 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket">
6895 <exclude/>
6896 </member>
6897 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.TargetBlockBlock">
6898 <exclude/>
6899 </member>
6900 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.MoneyDataBlock">
6901 <exclude/>
6902 </member>
6903 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.TransactionInfoBlock">
6904 <exclude/>
6905 </member>
6906 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket">
6907 <exclude/>
6908 </member>
6909 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket.AgentDataBlock">
6910 <exclude/>
6911 </member>
6912 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket.DataBlock">
6913 <exclude/>
6914 </member>
6915 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket">
6916 <exclude/>
6917 </member>
6918 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket.AgentDataBlock">
6919 <exclude/>
6920 </member>
6921 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket.DataBlock">
6922 <exclude/>
6923 </member>
6924 <member name="T:OpenMetaverse.Packets.MuteListUpdatePacket">
6925 <exclude/>
6926 </member>
6927 <member name="T:OpenMetaverse.Packets.MuteListUpdatePacket.MuteDataBlock">
6928 <exclude/>
6929 </member>
6930 <member name="T:OpenMetaverse.Packets.UseCachedMuteListPacket">
6931 <exclude/>
6932 </member>
6933 <member name="T:OpenMetaverse.Packets.UseCachedMuteListPacket.AgentDataBlock">
6934 <exclude/>
6935 </member>
6936 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket">
6937 <exclude/>
6938 </member>
6939 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket.AgentDataBlock">
6940 <exclude/>
6941 </member>
6942 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket.RightsBlock">
6943 <exclude/>
6944 </member>
6945 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket">
6946 <exclude/>
6947 </member>
6948 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket.AgentDataBlock">
6949 <exclude/>
6950 </member>
6951 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket.RightsBlock">
6952 <exclude/>
6953 </member>
6954 <member name="T:OpenMetaverse.Packets.OnlineNotificationPacket">
6955 <exclude/>
6956 </member>
6957 <member name="T:OpenMetaverse.Packets.OnlineNotificationPacket.AgentBlockBlock">
6958 <exclude/>
6959 </member>
6960 <member name="T:OpenMetaverse.Packets.OfflineNotificationPacket">
6961 <exclude/>
6962 </member>
6963 <member name="T:OpenMetaverse.Packets.OfflineNotificationPacket.AgentBlockBlock">
6964 <exclude/>
6965 </member>
6966 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket">
6967 <exclude/>
6968 </member>
6969 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket.AgentDataBlock">
6970 <exclude/>
6971 </member>
6972 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket.StartLocationDataBlock">
6973 <exclude/>
6974 </member>
6975 <member name="T:OpenMetaverse.Packets.AssetUploadRequestPacket">
6976 <exclude/>
6977 </member>
6978 <member name="T:OpenMetaverse.Packets.AssetUploadRequestPacket.AssetBlockBlock">
6979 <exclude/>
6980 </member>
6981 <member name="T:OpenMetaverse.Packets.AssetUploadCompletePacket">
6982 <exclude/>
6983 </member>
6984 <member name="T:OpenMetaverse.Packets.AssetUploadCompletePacket.AssetBlockBlock">
6985 <exclude/>
6986 </member>
6987 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket">
6988 <exclude/>
6989 </member>
6990 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket.AgentDataBlock">
6991 <exclude/>
6992 </member>
6993 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket.GroupDataBlock">
6994 <exclude/>
6995 </member>
6996 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket">
6997 <exclude/>
6998 </member>
6999 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket.AgentDataBlock">
7000 <exclude/>
7001 </member>
7002 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket.ReplyDataBlock">
7003 <exclude/>
7004 </member>
7005 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket">
7006 <exclude/>
7007 </member>
7008 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket.AgentDataBlock">
7009 <exclude/>
7010 </member>
7011 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket.GroupDataBlock">
7012 <exclude/>
7013 </member>
7014 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket">
7015 <exclude/>
7016 </member>
7017 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket.AgentDataBlock">
7018 <exclude/>
7019 </member>
7020 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket.RoleChangeBlock">
7021 <exclude/>
7022 </member>
7023 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket">
7024 <exclude/>
7025 </member>
7026 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket.AgentDataBlock">
7027 <exclude/>
7028 </member>
7029 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket.GroupDataBlock">
7030 <exclude/>
7031 </member>
7032 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket">
7033 <exclude/>
7034 </member>
7035 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket.AgentDataBlock">
7036 <exclude/>
7037 </member>
7038 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket.GroupDataBlock">
7039 <exclude/>
7040 </member>
7041 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket">
7042 <exclude/>
7043 </member>
7044 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.AgentDataBlock">
7045 <exclude/>
7046 </member>
7047 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.GroupDataBlock">
7048 <exclude/>
7049 </member>
7050 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.EjectDataBlock">
7051 <exclude/>
7052 </member>
7053 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket">
7054 <exclude/>
7055 </member>
7056 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.AgentDataBlock">
7057 <exclude/>
7058 </member>
7059 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.GroupDataBlock">
7060 <exclude/>
7061 </member>
7062 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.EjectDataBlock">
7063 <exclude/>
7064 </member>
7065 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket">
7066 <exclude/>
7067 </member>
7068 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket.AgentDataBlock">
7069 <exclude/>
7070 </member>
7071 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket.GroupDataBlock">
7072 <exclude/>
7073 </member>
7074 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket">
7075 <exclude/>
7076 </member>
7077 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket.AgentDataBlock">
7078 <exclude/>
7079 </member>
7080 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket.GroupDataBlock">
7081 <exclude/>
7082 </member>
7083 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket">
7084 <exclude/>
7085 </member>
7086 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.AgentDataBlock">
7087 <exclude/>
7088 </member>
7089 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.GroupDataBlock">
7090 <exclude/>
7091 </member>
7092 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.InviteDataBlock">
7093 <exclude/>
7094 </member>
7095 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket">
7096 <exclude/>
7097 </member>
7098 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket.AgentDataBlock">
7099 <exclude/>
7100 </member>
7101 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket.GroupDataBlock">
7102 <exclude/>
7103 </member>
7104 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket">
7105 <exclude/>
7106 </member>
7107 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket.AgentDataBlock">
7108 <exclude/>
7109 </member>
7110 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket.GroupDataBlock">
7111 <exclude/>
7112 </member>
7113 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket">
7114 <exclude/>
7115 </member>
7116 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket.AgentDataBlock">
7117 <exclude/>
7118 </member>
7119 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket.MoneyDataBlock">
7120 <exclude/>
7121 </member>
7122 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket">
7123 <exclude/>
7124 </member>
7125 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket.AgentDataBlock">
7126 <exclude/>
7127 </member>
7128 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket.MoneyDataBlock">
7129 <exclude/>
7130 </member>
7131 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket">
7132 <exclude/>
7133 </member>
7134 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket.AgentDataBlock">
7135 <exclude/>
7136 </member>
7137 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket.MoneyDataBlock">
7138 <exclude/>
7139 </member>
7140 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket">
7141 <exclude/>
7142 </member>
7143 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.AgentDataBlock">
7144 <exclude/>
7145 </member>
7146 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.MoneyDataBlock">
7147 <exclude/>
7148 </member>
7149 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.HistoryDataBlock">
7150 <exclude/>
7151 </member>
7152 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket">
7153 <exclude/>
7154 </member>
7155 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket.AgentDataBlock">
7156 <exclude/>
7157 </member>
7158 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket.MoneyDataBlock">
7159 <exclude/>
7160 </member>
7161 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket">
7162 <exclude/>
7163 </member>
7164 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.AgentDataBlock">
7165 <exclude/>
7166 </member>
7167 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.MoneyDataBlock">
7168 <exclude/>
7169 </member>
7170 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.HistoryDataBlock">
7171 <exclude/>
7172 </member>
7173 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket">
7174 <exclude/>
7175 </member>
7176 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.AgentDataBlock">
7177 <exclude/>
7178 </member>
7179 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.GroupDataBlock">
7180 <exclude/>
7181 </member>
7182 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.TransactionDataBlock">
7183 <exclude/>
7184 </member>
7185 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket">
7186 <exclude/>
7187 </member>
7188 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.AgentDataBlock">
7189 <exclude/>
7190 </member>
7191 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.TransactionDataBlock">
7192 <exclude/>
7193 </member>
7194 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.ProposalDataBlock">
7195 <exclude/>
7196 </member>
7197 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket">
7198 <exclude/>
7199 </member>
7200 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.AgentDataBlock">
7201 <exclude/>
7202 </member>
7203 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.GroupDataBlock">
7204 <exclude/>
7205 </member>
7206 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.TransactionDataBlock">
7207 <exclude/>
7208 </member>
7209 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket">
7210 <exclude/>
7211 </member>
7212 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.AgentDataBlock">
7213 <exclude/>
7214 </member>
7215 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.TransactionDataBlock">
7216 <exclude/>
7217 </member>
7218 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.HistoryItemDataBlock">
7219 <exclude/>
7220 </member>
7221 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.VoteItemBlock">
7222 <exclude/>
7223 </member>
7224 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket">
7225 <exclude/>
7226 </member>
7227 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket.AgentDataBlock">
7228 <exclude/>
7229 </member>
7230 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket.ProposalDataBlock">
7231 <exclude/>
7232 </member>
7233 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket">
7234 <exclude/>
7235 </member>
7236 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket.AgentDataBlock">
7237 <exclude/>
7238 </member>
7239 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket.ProposalDataBlock">
7240 <exclude/>
7241 </member>
7242 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket">
7243 <exclude/>
7244 </member>
7245 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket.AgentDataBlock">
7246 <exclude/>
7247 </member>
7248 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket.GroupDataBlock">
7249 <exclude/>
7250 </member>
7251 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket">
7252 <exclude/>
7253 </member>
7254 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.AgentDataBlock">
7255 <exclude/>
7256 </member>
7257 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.GroupDataBlock">
7258 <exclude/>
7259 </member>
7260 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.MemberDataBlock">
7261 <exclude/>
7262 </member>
7263 <member name="T:OpenMetaverse.Packets.ActivateGroupPacket">
7264 <exclude/>
7265 </member>
7266 <member name="T:OpenMetaverse.Packets.ActivateGroupPacket.AgentDataBlock">
7267 <exclude/>
7268 </member>
7269 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket">
7270 <exclude/>
7271 </member>
7272 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket.AgentDataBlock">
7273 <exclude/>
7274 </member>
7275 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket.DataBlock">
7276 <exclude/>
7277 </member>
7278 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket">
7279 <exclude/>
7280 </member>
7281 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.AgentDataBlock">
7282 <exclude/>
7283 </member>
7284 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.DataBlock">
7285 <exclude/>
7286 </member>
7287 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.NewDataBlock">
7288 <exclude/>
7289 </member>
7290 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket">
7291 <exclude/>
7292 </member>
7293 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket.AgentDataBlock">
7294 <exclude/>
7295 </member>
7296 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket.GroupDataBlock">
7297 <exclude/>
7298 </member>
7299 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket">
7300 <exclude/>
7301 </member>
7302 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.AgentDataBlock">
7303 <exclude/>
7304 </member>
7305 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.GroupDataBlock">
7306 <exclude/>
7307 </member>
7308 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.RoleDataBlock">
7309 <exclude/>
7310 </member>
7311 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket">
7312 <exclude/>
7313 </member>
7314 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket.AgentDataBlock">
7315 <exclude/>
7316 </member>
7317 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket.GroupDataBlock">
7318 <exclude/>
7319 </member>
7320 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket">
7321 <exclude/>
7322 </member>
7323 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket.AgentDataBlock">
7324 <exclude/>
7325 </member>
7326 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket.MemberDataBlock">
7327 <exclude/>
7328 </member>
7329 <member name="T:OpenMetaverse.Packets.GroupTitlesRequestPacket">
7330 <exclude/>
7331 </member>
7332 <member name="T:OpenMetaverse.Packets.GroupTitlesRequestPacket.AgentDataBlock">
7333 <exclude/>
7334 </member>
7335 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket">
7336 <exclude/>
7337 </member>
7338 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket.AgentDataBlock">
7339 <exclude/>
7340 </member>
7341 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket.GroupDataBlock">
7342 <exclude/>
7343 </member>
7344 <member name="T:OpenMetaverse.Packets.GroupTitleUpdatePacket">
7345 <exclude/>
7346 </member>
7347 <member name="T:OpenMetaverse.Packets.GroupTitleUpdatePacket.AgentDataBlock">
7348 <exclude/>
7349 </member>
7350 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket">
7351 <exclude/>
7352 </member>
7353 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket.AgentDataBlock">
7354 <exclude/>
7355 </member>
7356 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket.RoleDataBlock">
7357 <exclude/>
7358 </member>
7359 <member name="T:OpenMetaverse.Packets.LiveHelpGroupRequestPacket">
7360 <exclude/>
7361 </member>
7362 <member name="T:OpenMetaverse.Packets.LiveHelpGroupRequestPacket.RequestDataBlock">
7363 <exclude/>
7364 </member>
7365 <member name="T:OpenMetaverse.Packets.LiveHelpGroupReplyPacket">
7366 <exclude/>
7367 </member>
7368 <member name="T:OpenMetaverse.Packets.LiveHelpGroupReplyPacket.ReplyDataBlock">
7369 <exclude/>
7370 </member>
7371 <member name="T:OpenMetaverse.Packets.AgentWearablesRequestPacket">
7372 <exclude/>
7373 </member>
7374 <member name="T:OpenMetaverse.Packets.AgentWearablesRequestPacket.AgentDataBlock">
7375 <exclude/>
7376 </member>
7377 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket">
7378 <exclude/>
7379 </member>
7380 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket.AgentDataBlock">
7381 <exclude/>
7382 </member>
7383 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket.WearableDataBlock">
7384 <exclude/>
7385 </member>
7386 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket">
7387 <exclude/>
7388 </member>
7389 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket.AgentDataBlock">
7390 <exclude/>
7391 </member>
7392 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket.WearableDataBlock">
7393 <exclude/>
7394 </member>
7395 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket">
7396 <exclude/>
7397 </member>
7398 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket.AgentDataBlock">
7399 <exclude/>
7400 </member>
7401 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket.WearableDataBlock">
7402 <exclude/>
7403 </member>
7404 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket">
7405 <exclude/>
7406 </member>
7407 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket.AgentDataBlock">
7408 <exclude/>
7409 </member>
7410 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket.WearableDataBlock">
7411 <exclude/>
7412 </member>
7413 <member name="T:OpenMetaverse.Packets.AgentDataUpdateRequestPacket">
7414 <exclude/>
7415 </member>
7416 <member name="T:OpenMetaverse.Packets.AgentDataUpdateRequestPacket.AgentDataBlock">
7417 <exclude/>
7418 </member>
7419 <member name="T:OpenMetaverse.Packets.AgentDataUpdatePacket">
7420 <exclude/>
7421 </member>
7422 <member name="T:OpenMetaverse.Packets.AgentDataUpdatePacket.AgentDataBlock">
7423 <exclude/>
7424 </member>
7425 <member name="T:OpenMetaverse.Packets.GroupDataUpdatePacket">
7426 <exclude/>
7427 </member>
7428 <member name="T:OpenMetaverse.Packets.GroupDataUpdatePacket.AgentGroupDataBlock">
7429 <exclude/>
7430 </member>
7431 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket">
7432 <exclude/>
7433 </member>
7434 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket.AgentDataBlock">
7435 <exclude/>
7436 </member>
7437 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket.GroupDataBlock">
7438 <exclude/>
7439 </member>
7440 <member name="T:OpenMetaverse.Packets.AgentDropGroupPacket">
7441 <exclude/>
7442 </member>
7443 <member name="T:OpenMetaverse.Packets.AgentDropGroupPacket.AgentDataBlock">
7444 <exclude/>
7445 </member>
7446 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket">
7447 <exclude/>
7448 </member>
7449 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket.AgentDataBlock">
7450 <exclude/>
7451 </member>
7452 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket.ObjectDataBlock">
7453 <exclude/>
7454 </member>
7455 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket">
7456 <exclude/>
7457 </member>
7458 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.AgentDataBlock">
7459 <exclude/>
7460 </member>
7461 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.HeaderDataBlock">
7462 <exclude/>
7463 </member>
7464 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.ObjectDataBlock">
7465 <exclude/>
7466 </member>
7467 <member name="T:OpenMetaverse.Packets.DetachAttachmentIntoInvPacket">
7468 <exclude/>
7469 </member>
7470 <member name="T:OpenMetaverse.Packets.DetachAttachmentIntoInvPacket.ObjectDataBlock">
7471 <exclude/>
7472 </member>
7473 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket">
7474 <exclude/>
7475 </member>
7476 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.AgentDataBlock">
7477 <exclude/>
7478 </member>
7479 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.HeaderDataBlock">
7480 <exclude/>
7481 </member>
7482 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.ObjectDataBlock">
7483 <exclude/>
7484 </member>
7485 <member name="T:OpenMetaverse.Packets.UserInfoRequestPacket">
7486 <exclude/>
7487 </member>
7488 <member name="T:OpenMetaverse.Packets.UserInfoRequestPacket.AgentDataBlock">
7489 <exclude/>
7490 </member>
7491 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket">
7492 <exclude/>
7493 </member>
7494 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket.AgentDataBlock">
7495 <exclude/>
7496 </member>
7497 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket.UserDataBlock">
7498 <exclude/>
7499 </member>
7500 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket">
7501 <exclude/>
7502 </member>
7503 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket.AgentDataBlock">
7504 <exclude/>
7505 </member>
7506 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket.UserDataBlock">
7507 <exclude/>
7508 </member>
7509 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket">
7510 <exclude/>
7511 </member>
7512 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket.AgentDataBlock">
7513 <exclude/>
7514 </member>
7515 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket.FileDataBlock">
7516 <exclude/>
7517 </member>
7518 <member name="T:OpenMetaverse.Packets.MapLayerRequestPacket">
7519 <exclude/>
7520 </member>
7521 <member name="T:OpenMetaverse.Packets.MapLayerRequestPacket.AgentDataBlock">
7522 <exclude/>
7523 </member>
7524 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket">
7525 <exclude/>
7526 </member>
7527 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket.AgentDataBlock">
7528 <exclude/>
7529 </member>
7530 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket.LayerDataBlock">
7531 <exclude/>
7532 </member>
7533 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket">
7534 <exclude/>
7535 </member>
7536 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket.AgentDataBlock">
7537 <exclude/>
7538 </member>
7539 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket.PositionDataBlock">
7540 <exclude/>
7541 </member>
7542 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket">
7543 <exclude/>
7544 </member>
7545 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket.AgentDataBlock">
7546 <exclude/>
7547 </member>
7548 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket.NameDataBlock">
7549 <exclude/>
7550 </member>
7551 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket">
7552 <exclude/>
7553 </member>
7554 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket.AgentDataBlock">
7555 <exclude/>
7556 </member>
7557 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket.DataBlock">
7558 <exclude/>
7559 </member>
7560 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket">
7561 <exclude/>
7562 </member>
7563 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket.AgentDataBlock">
7564 <exclude/>
7565 </member>
7566 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket.RequestDataBlock">
7567 <exclude/>
7568 </member>
7569 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket">
7570 <exclude/>
7571 </member>
7572 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.AgentDataBlock">
7573 <exclude/>
7574 </member>
7575 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.RequestDataBlock">
7576 <exclude/>
7577 </member>
7578 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.DataBlock">
7579 <exclude/>
7580 </member>
7581 <member name="T:OpenMetaverse.Packets.SendPostcardPacket">
7582 <exclude/>
7583 </member>
7584 <member name="T:OpenMetaverse.Packets.SendPostcardPacket.AgentDataBlock">
7585 <exclude/>
7586 </member>
7587 <member name="T:OpenMetaverse.Packets.ParcelMediaCommandMessagePacket">
7588 <exclude/>
7589 </member>
7590 <member name="T:OpenMetaverse.Packets.ParcelMediaCommandMessagePacket.CommandBlockBlock">
7591 <exclude/>
7592 </member>
7593 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket">
7594 <exclude/>
7595 </member>
7596 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket.DataBlockBlock">
7597 <exclude/>
7598 </member>
7599 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket.DataBlockExtendedBlock">
7600 <exclude/>
7601 </member>
7602 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket">
7603 <exclude/>
7604 </member>
7605 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket.AgentDataBlock">
7606 <exclude/>
7607 </member>
7608 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket.RequestDataBlock">
7609 <exclude/>
7610 </member>
7611 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket">
7612 <exclude/>
7613 </member>
7614 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket.RequestDataBlock">
7615 <exclude/>
7616 </member>
7617 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket.ReportDataBlock">
7618 <exclude/>
7619 </member>
7620 <member name="T:OpenMetaverse.Packets.ErrorPacket">
7621 <exclude/>
7622 </member>
7623 <member name="T:OpenMetaverse.Packets.ErrorPacket.AgentDataBlock">
7624 <exclude/>
7625 </member>
7626 <member name="T:OpenMetaverse.Packets.ErrorPacket.DataBlock">
7627 <exclude/>
7628 </member>
7629 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket">
7630 <exclude/>
7631 </member>
7632 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket.AgentDataBlock">
7633 <exclude/>
7634 </member>
7635 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket.ObjectDataBlock">
7636 <exclude/>
7637 </member>
7638 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket">
7639 <exclude/>
7640 </member>
7641 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket.AgentDataBlock">
7642 <exclude/>
7643 </member>
7644 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket.InventoryDataBlock">
7645 <exclude/>
7646 </member>
7647 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket">
7648 <exclude/>
7649 </member>
7650 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket.AgentDataBlock">
7651 <exclude/>
7652 </member>
7653 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket.InventoryBlockBlock">
7654 <exclude/>
7655 </member>
7656 <member name="T:OpenMetaverse.Packets.PacketAckPacket">
7657 <exclude/>
7658 </member>
7659 <member name="T:OpenMetaverse.Packets.PacketAckPacket.PacketsBlock">
7660 <exclude/>
7661 </member>
7662 <member name="T:OpenMetaverse.Packets.OpenCircuitPacket">
7663 <exclude/>
7664 </member>
7665 <member name="T:OpenMetaverse.Packets.OpenCircuitPacket.CircuitInfoBlock">
7666 <exclude/>
7667 </member>
7668 <member name="T:OpenMetaverse.Packets.CloseCircuitPacket">
7669 <exclude/>
7670 </member>
7671 <member name="T:OpenMetaverse.Packets.ObjectAddPacket">
7672 <exclude/>
7673 </member>
7674 <member name="T:OpenMetaverse.Packets.ObjectAddPacket.AgentDataBlock">
7675 <exclude/>
7676 </member>
7677 <member name="T:OpenMetaverse.Packets.ObjectAddPacket.ObjectDataBlock">
7678 <exclude/>
7679 </member>
7680 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket">
7681 <exclude/>
7682 </member>
7683 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket.AgentDataBlock">
7684 <exclude/>
7685 </member>
7686 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket.ObjectDataBlock">
7687 <exclude/>
7688 </member>
7689 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket">
7690 <exclude/>
7691 </member>
7692 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket.AgentDataBlock">
7693 <exclude/>
7694 </member>
7695 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket.ObjectDataBlock">
7696 <exclude/>
7697 </member>
7698 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket">
7699 <exclude/>
7700 </member>
7701 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket.AgentDataBlock">
7702 <exclude/>
7703 </member>
7704 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket.ObjectDataBlock">
7705 <exclude/>
7706 </member>
7707 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket">
7708 <exclude/>
7709 </member>
7710 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket.AgentDataBlock">
7711 <exclude/>
7712 </member>
7713 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket.ObjectDataBlock">
7714 <exclude/>
7715 </member>
7716 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket">
7717 <exclude/>
7718 </member>
7719 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.LocationBlock">
7720 <exclude/>
7721 </member>
7722 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.IndexBlock">
7723 <exclude/>
7724 </member>
7725 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.AgentDataBlock">
7726 <exclude/>
7727 </member>
7728 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket">
7729 <exclude/>
7730 </member>
7731 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.AgentDataBlock">
7732 <exclude/>
7733 </member>
7734 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.RegionDataBlock">
7735 <exclude/>
7736 </member>
7737 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.InfoBlock">
7738 <exclude/>
7739 </member>
7740 <member name="T:OpenMetaverse.Packets.ConfirmEnableSimulatorPacket">
7741 <exclude/>
7742 </member>
7743 <member name="T:OpenMetaverse.Packets.ConfirmEnableSimulatorPacket.AgentDataBlock">
7744 <exclude/>
7745 </member>
7746 <member name="T:OpenMetaverse.Packets.ObjectPropertiesPacket">
7747 <exclude/>
7748 </member>
7749 <member name="T:OpenMetaverse.Packets.ObjectPropertiesPacket.ObjectDataBlock">
7750 <exclude/>
7751 </member>
7752 <member name="T:OpenMetaverse.Packets.ObjectPropertiesFamilyPacket">
7753 <exclude/>
7754 </member>
7755 <member name="T:OpenMetaverse.Packets.ObjectPropertiesFamilyPacket.ObjectDataBlock">
7756 <exclude/>
7757 </member>
7758 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket">
7759 <exclude/>
7760 </member>
7761 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket.AgentDataBlock">
7762 <exclude/>
7763 </member>
7764 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket.ParcelDataBlock">
7765 <exclude/>
7766 </member>
7767 <member name="T:OpenMetaverse.Packets.AttachedSoundPacket">
7768 <exclude/>
7769 </member>
7770 <member name="T:OpenMetaverse.Packets.AttachedSoundPacket.DataBlockBlock">
7771 <exclude/>
7772 </member>
7773 <member name="T:OpenMetaverse.Packets.AttachedSoundGainChangePacket">
7774 <exclude/>
7775 </member>
7776 <member name="T:OpenMetaverse.Packets.AttachedSoundGainChangePacket.DataBlockBlock">
7777 <exclude/>
7778 </member>
7779 <member name="T:OpenMetaverse.Packets.PreloadSoundPacket">
7780 <exclude/>
7781 </member>
7782 <member name="T:OpenMetaverse.Packets.PreloadSoundPacket.DataBlockBlock">
7783 <exclude/>
7784 </member>
7785 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket">
7786 <exclude/>
7787 </member>
7788 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket.AgentDataBlock">
7789 <exclude/>
7790 </member>
7791 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket.EffectBlock">
7792 <exclude/>
7793 </member>
7794 <member name="T:OpenMetaverse.Packets.StartPingCheckPacket">
7795 <exclude/>
7796 </member>
7797 <member name="T:OpenMetaverse.Packets.StartPingCheckPacket.PingIDBlock">
7798 <exclude/>
7799 </member>
7800 <member name="T:OpenMetaverse.Packets.CompletePingCheckPacket">
7801 <exclude/>
7802 </member>
7803 <member name="T:OpenMetaverse.Packets.CompletePingCheckPacket.PingIDBlock">
7804 <exclude/>
7805 </member>
7806 <member name="T:OpenMetaverse.Packets.AgentUpdatePacket">
7807 <exclude/>
7808 </member>
7809 <member name="T:OpenMetaverse.Packets.AgentUpdatePacket.AgentDataBlock">
7810 <exclude/>
7811 </member>
7812 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket">
7813 <exclude/>
7814 </member>
7815 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.AgentDataBlock">
7816 <exclude/>
7817 </member>
7818 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.AnimationListBlock">
7819 <exclude/>
7820 </member>
7821 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.PhysicalAvatarEventListBlock">
7822 <exclude/>
7823 </member>
7824 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket">
7825 <exclude/>
7826 </member>
7827 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket.AgentDataBlock">
7828 <exclude/>
7829 </member>
7830 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket.TargetObjectBlock">
7831 <exclude/>
7832 </member>
7833 <member name="T:OpenMetaverse.Packets.AgentSitPacket">
7834 <exclude/>
7835 </member>
7836 <member name="T:OpenMetaverse.Packets.AgentSitPacket.AgentDataBlock">
7837 <exclude/>
7838 </member>
7839 <member name="T:OpenMetaverse.Packets.RequestImagePacket">
7840 <exclude/>
7841 </member>
7842 <member name="T:OpenMetaverse.Packets.RequestImagePacket.AgentDataBlock">
7843 <exclude/>
7844 </member>
7845 <member name="T:OpenMetaverse.Packets.RequestImagePacket.RequestImageBlock">
7846 <exclude/>
7847 </member>
7848 <member name="T:OpenMetaverse.Packets.ImageDataPacket">
7849 <exclude/>
7850 </member>
7851 <member name="T:OpenMetaverse.Packets.ImageDataPacket.ImageIDBlock">
7852 <exclude/>
7853 </member>
7854 <member name="T:OpenMetaverse.Packets.ImageDataPacket.ImageDataBlock">
7855 <exclude/>
7856 </member>
7857 <member name="T:OpenMetaverse.Packets.ImagePacketPacket">
7858 <exclude/>
7859 </member>
7860 <member name="T:OpenMetaverse.Packets.ImagePacketPacket.ImageIDBlock">
7861 <exclude/>
7862 </member>
7863 <member name="T:OpenMetaverse.Packets.ImagePacketPacket.ImageDataBlock">
7864 <exclude/>
7865 </member>
7866 <member name="T:OpenMetaverse.Packets.LayerDataPacket">
7867 <exclude/>
7868 </member>
7869 <member name="T:OpenMetaverse.Packets.LayerDataPacket.LayerIDBlock">
7870 <exclude/>
7871 </member>
7872 <member name="T:OpenMetaverse.Packets.LayerDataPacket.LayerDataBlock">
7873 <exclude/>
7874 </member>
7875 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket">
7876 <exclude/>
7877 </member>
7878 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket.RegionDataBlock">
7879 <exclude/>
7880 </member>
7881 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock">
7882 <exclude/>
7883 </member>
7884 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket">
7885 <exclude/>
7886 </member>
7887 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket.RegionDataBlock">
7888 <exclude/>
7889 </member>
7890 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket.ObjectDataBlock">
7891 <exclude/>
7892 </member>
7893 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket">
7894 <exclude/>
7895 </member>
7896 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket.RegionDataBlock">
7897 <exclude/>
7898 </member>
7899 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket.ObjectDataBlock">
7900 <exclude/>
7901 </member>
7902 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket">
7903 <exclude/>
7904 </member>
7905 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket.RegionDataBlock">
7906 <exclude/>
7907 </member>
7908 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket.ObjectDataBlock">
7909 <exclude/>
7910 </member>
7911 <member name="T:OpenMetaverse.Packets.KillObjectPacket">
7912 <exclude/>
7913 </member>
7914 <member name="T:OpenMetaverse.Packets.KillObjectPacket.ObjectDataBlock">
7915 <exclude/>
7916 </member>
7917 <member name="T:OpenMetaverse.Packets.TransferPacketPacket">
7918 <exclude/>
7919 </member>
7920 <member name="T:OpenMetaverse.Packets.TransferPacketPacket.TransferDataBlock">
7921 <exclude/>
7922 </member>
7923 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket">
7924 <exclude/>
7925 </member>
7926 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket.XferIDBlock">
7927 <exclude/>
7928 </member>
7929 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket.DataPacketBlock">
7930 <exclude/>
7931 </member>
7932 <member name="T:OpenMetaverse.Packets.ConfirmXferPacketPacket">
7933 <exclude/>
7934 </member>
7935 <member name="T:OpenMetaverse.Packets.ConfirmXferPacketPacket.XferIDBlock">
7936 <exclude/>
7937 </member>
7938 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket">
7939 <exclude/>
7940 </member>
7941 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.SenderBlock">
7942 <exclude/>
7943 </member>
7944 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.AnimationListBlock">
7945 <exclude/>
7946 </member>
7947 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.AnimationSourceListBlock">
7948 <exclude/>
7949 </member>
7950 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.PhysicalAvatarEventListBlock">
7951 <exclude/>
7952 </member>
7953 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket">
7954 <exclude/>
7955 </member>
7956 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket.SitObjectBlock">
7957 <exclude/>
7958 </member>
7959 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket.SitTransformBlock">
7960 <exclude/>
7961 </member>
7962 <member name="T:OpenMetaverse.Packets.CameraConstraintPacket">
7963 <exclude/>
7964 </member>
7965 <member name="T:OpenMetaverse.Packets.CameraConstraintPacket.CameraCollidePlaneBlock">
7966 <exclude/>
7967 </member>
7968 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket">
7969 <exclude/>
7970 </member>
7971 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket.ParcelDataBlock">
7972 <exclude/>
7973 </member>
7974 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket.AgeVerificationBlockBlock">
7975 <exclude/>
7976 </member>
7977 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket">
7978 <exclude/>
7979 </member>
7980 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentDataBlock">
7981 <exclude/>
7982 </member>
7983 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.GroupDataBlock">
7984 <exclude/>
7985 </member>
7986 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AnimationDataBlock">
7987 <exclude/>
7988 </member>
7989 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.GranterBlockBlock">
7990 <exclude/>
7991 </member>
7992 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.NVPairDataBlock">
7993 <exclude/>
7994 </member>
7995 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.VisualParamBlock">
7996 <exclude/>
7997 </member>
7998 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentAccessBlock">
7999 <exclude/>
8000 </member>
8001 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentInfoBlock">
8002 <exclude/>
8003 </member>
8004 <member name="T:OpenMetaverse.Packets.ChildAgentAlivePacket">
8005 <exclude/>
8006 </member>
8007 <member name="T:OpenMetaverse.Packets.ChildAgentAlivePacket.AgentDataBlock">
8008 <exclude/>
8009 </member>
8010 <member name="T:OpenMetaverse.Packets.ChildAgentPositionUpdatePacket">
8011 <exclude/>
8012 </member>
8013 <member name="T:OpenMetaverse.Packets.ChildAgentPositionUpdatePacket.AgentDataBlock">
8014 <exclude/>
8015 </member>
8016 <member name="T:OpenMetaverse.Packets.SoundTriggerPacket">
8017 <exclude/>
8018 </member>
8019 <member name="T:OpenMetaverse.Packets.SoundTriggerPacket.SoundDataBlock">
8020 <exclude/>
8021 </member>
8022 <member name="M:OpenMetaverse.Packets.PacketDecoder.AddCallback(System.String,OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder)">
5811 <summary> 8023 <summary>
5812 Either a Vector3 position or a Vector3 Euler rotation 8024 Add a custom decoder callback
5813 </summary> 8025 </summary>
8026 <param name="key">The key of the field to decode</param>
8027 <param name="customPacketHandler">The custom decode handler</param>
5814 </member> 8028 </member>
5815 <member name="T:OpenMetaverse.HandPose"> 8029 <member name="M:OpenMetaverse.Packets.PacketDecoder.RemoveCustomHandler(System.String,OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder)">
5816 <summary> 8030 <summary>
5817 Poses set in the animation metadata for the hands. 8031 Remove a custom decoder callback
5818 </summary> 8032 </summary>
8033 <param name="key">The key of the field to decode</param>
8034 <param name="customPacketHandler">The custom decode handler</param>
5819 </member> 8035 </member>
5820 <member name="T:OpenMetaverse.BitPack"> 8036 <member name="M:OpenMetaverse.Packets.PacketDecoder.PacketToString(OpenMetaverse.Packets.Packet)">
5821 <summary> 8037 <summary>
5822 Wrapper around a byte array that allows bit to be packed and unpacked 8038 Creates a formatted string containing the values of a Packet
5823 one at a time or by a variable amount. Useful for very tightly packed
5824 data like LayerData packets
5825 </summary> 8039 </summary>
8040 <param name="packet">The Packet</param>
8041 <returns>A formatted string of values of the nested items in the Packet object</returns>
5826 </member> 8042 </member>
5827 <member name="M:OpenMetaverse.BitPack.#ctor(System.Byte[],System.Int32)"> 8043 <member name="M:OpenMetaverse.Packets.PacketDecoder.MessageToString(System.Object,System.Int32)">
5828 <summary> 8044 <summary>
5829 Default constructor, initialize the bit packer / bit unpacker 8045 Decode an IMessage object into a beautifully formatted string
5830 with a byte array and starting position
5831 </summary> 8046 </summary>
5832 <param name="data">Byte array to pack bits in to or unpack from</param> 8047 <param name="message">The IMessage object</param>
5833 <param name="pos">Starting position in the byte array</param> 8048 <param name="recurseLevel">Recursion level (used for indenting)</param>
8049 <returns>A formatted string containing the names and values of the source object</returns>
5834 </member> 8050 </member>
5835 <member name="F:OpenMetaverse.BitPack.Data"> 8051 <member name="T:OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder">
5836 <summary> 8052 <summary>
8053 A custom decoder callback
5837 </summary> 8054 </summary>
8055 <param name="fieldName">The key of the object</param>
8056 <param name="fieldData">the data to decode</param>
8057 <returns>A string represending the fieldData</returns>
5838 </member> 8058 </member>
5839 <member name="P:OpenMetaverse.BitPack.BytePos"> 8059 <member name="T:OpenMetaverse.DirectoryManager">
5840 <summary> 8060 <summary>
8061 Access to the data server which allows searching for land, events, people, etc
5841 </summary> 8062 </summary>
5842 </member> 8063 </member>
5843 <member name="P:OpenMetaverse.BitPack.BitPos"> 8064 <member name="F:OpenMetaverse.DirectoryManager.m_EventInfoReply">
8065 <summary>The event subscribers. null if no subcribers</summary>
8066 </member>
8067 <member name="M:OpenMetaverse.DirectoryManager.OnEventInfo(OpenMetaverse.EventInfoReplyEventArgs)">
8068 <summary>Raises the EventInfoReply event</summary>
8069 <param name="e">An EventInfoReplyEventArgs object containing the
8070 data returned from the data server</param>
8071 </member>
8072 <member name="F:OpenMetaverse.DirectoryManager.m_EventDetailLock">
8073 <summary>Thread sync lock object</summary>
8074 </member>
8075 <member name="F:OpenMetaverse.DirectoryManager.m_DirEvents">
8076 <summary>The event subscribers. null if no subcribers</summary>
8077 </member>
8078 <member name="M:OpenMetaverse.DirectoryManager.OnDirEvents(OpenMetaverse.DirEventsReplyEventArgs)">
8079 <summary>Raises the DirEventsReply event</summary>
8080 <param name="e">An DirEventsReplyEventArgs object containing the
8081 data returned from the data server</param>
8082 </member>
8083 <member name="F:OpenMetaverse.DirectoryManager.m_DirEventsLock">
8084 <summary>Thread sync lock object</summary>
8085 </member>
8086 <member name="F:OpenMetaverse.DirectoryManager.m_Places">
8087 <summary>The event subscribers. null if no subcribers</summary>
8088 </member>
8089 <member name="M:OpenMetaverse.DirectoryManager.OnPlaces(OpenMetaverse.PlacesReplyEventArgs)">
8090 <summary>Raises the PlacesReply event</summary>
8091 <param name="e">A PlacesReplyEventArgs object containing the
8092 data returned from the data server</param>
8093 </member>
8094 <member name="F:OpenMetaverse.DirectoryManager.m_PlacesLock">
8095 <summary>Thread sync lock object</summary>
8096 </member>
8097 <member name="F:OpenMetaverse.DirectoryManager.m_DirPlaces">
8098 <summary>The event subscribers. null if no subcribers</summary>
8099 </member>
8100 <member name="M:OpenMetaverse.DirectoryManager.OnDirPlaces(OpenMetaverse.DirPlacesReplyEventArgs)">
8101 <summary>Raises the DirPlacesReply event</summary>
8102 <param name="e">A DirPlacesReplyEventArgs object containing the
8103 data returned from the data server</param>
8104 </member>
8105 <member name="F:OpenMetaverse.DirectoryManager.m_DirPlacesLock">
8106 <summary>Thread sync lock object</summary>
8107 </member>
8108 <member name="F:OpenMetaverse.DirectoryManager.m_DirClassifieds">
8109 <summary>The event subscribers. null if no subcribers</summary>
8110 </member>
8111 <member name="M:OpenMetaverse.DirectoryManager.OnDirClassifieds(OpenMetaverse.DirClassifiedsReplyEventArgs)">
8112 <summary>Raises the DirClassifiedsReply event</summary>
8113 <param name="e">A DirClassifiedsReplyEventArgs object containing the
8114 data returned from the data server</param>
8115 </member>
8116 <member name="F:OpenMetaverse.DirectoryManager.m_DirClassifiedsLock">
8117 <summary>Thread sync lock object</summary>
8118 </member>
8119 <member name="F:OpenMetaverse.DirectoryManager.m_DirGroups">
8120 <summary>The event subscribers. null if no subcribers</summary>
8121 </member>
8122 <member name="M:OpenMetaverse.DirectoryManager.OnDirGroups(OpenMetaverse.DirGroupsReplyEventArgs)">
8123 <summary>Raises the DirGroupsReply event</summary>
8124 <param name="e">A DirGroupsReplyEventArgs object containing the
8125 data returned from the data server</param>
8126 </member>
8127 <member name="F:OpenMetaverse.DirectoryManager.m_DirGroupsLock">
8128 <summary>Thread sync lock object</summary>
8129 </member>
8130 <member name="F:OpenMetaverse.DirectoryManager.m_DirPeople">
8131 <summary>The event subscribers. null if no subcribers</summary>
8132 </member>
8133 <member name="M:OpenMetaverse.DirectoryManager.OnDirPeople(OpenMetaverse.DirPeopleReplyEventArgs)">
8134 <summary>Raises the DirPeopleReply event</summary>
8135 <param name="e">A DirPeopleReplyEventArgs object containing the
8136 data returned from the data server</param>
8137 </member>
8138 <member name="F:OpenMetaverse.DirectoryManager.m_DirPeopleLock">
8139 <summary>Thread sync lock object</summary>
8140 </member>
8141 <member name="F:OpenMetaverse.DirectoryManager.m_DirLandReply">
8142 <summary>The event subscribers. null if no subcribers</summary>
8143 </member>
8144 <member name="M:OpenMetaverse.DirectoryManager.OnDirLand(OpenMetaverse.DirLandReplyEventArgs)">
8145 <summary>Raises the DirLandReply event</summary>
8146 <param name="e">A DirLandReplyEventArgs object containing the
8147 data returned from the data server</param>
8148 </member>
8149 <member name="F:OpenMetaverse.DirectoryManager.m_DirLandLock">
8150 <summary>Thread sync lock object</summary>
8151 </member>
8152 <member name="M:OpenMetaverse.DirectoryManager.#ctor(OpenMetaverse.GridClient)">
5844 <summary> 8153 <summary>
8154 Constructs a new instance of the DirectoryManager class
5845 </summary> 8155 </summary>
8156 <param name="client">An instance of GridClient</param>
5846 </member> 8157 </member>
5847 <member name="M:OpenMetaverse.BitPack.PackFloat(System.Single)"> 8158 <member name="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String)">
5848 <summary> 8159 <summary>
5849 Pack a floating point value in to the data 8160 Query the data server for a list of classified ads containing the specified string.
8161 Defaults to searching for classified placed in any category, and includes PG, Adult and Mature
8162 results.
8163
8164 Responses are sent 16 per response packet, there is no way to know how many results a query reply will contain however assuming
8165 the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received
8166
8167 The <see cref="!:OnClassifiedReply"/> event is raised when a response is received from the simulator
5850 </summary> 8168 </summary>
5851 <param name="data">Floating point value to pack</param> 8169 <param name="searchText">A string containing a list of keywords to search for</param>
8170 <returns>A UUID to correlate the results when the <see cref="!:OnClassifiedReply"/> event is raised</returns>
5852 </member> 8171 </member>
5853 <member name="M:OpenMetaverse.BitPack.PackBits(System.Int32,System.Int32)"> 8172 <member name="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String,OpenMetaverse.DirectoryManager.ClassifiedCategories,OpenMetaverse.DirectoryManager.ClassifiedQueryFlags)">
5854 <summary> 8173 <summary>
5855 Pack part or all of an integer in to the data 8174 Query the data server for a list of classified ads which contain specified keywords (Overload)
8175
8176 The <see cref="!:OnClassifiedReply"/> event is raised when a response is received from the simulator
5856 </summary> 8177 </summary>
5857 <param name="data">Integer containing the data to pack</param> 8178 <param name="searchText">A string containing a list of keywords to search for</param>
5858 <param name="totalCount">Number of bits of the integer to pack</param> 8179 <param name="category">The category to search</param>
8180 <param name="queryFlags">A set of flags which can be ORed to modify query options
8181 such as classified maturity rating.</param>
8182 <returns>A UUID to correlate the results when the <see cref="!:OnClassifiedReply"/> event is raised</returns>
8183 <example>
8184 Search classified ads containing the key words "foo" and "bar" in the "Any" category that are either PG or Mature
8185 <code>
8186 UUID searchID = StartClassifiedSearch("foo bar", ClassifiedCategories.Any, ClassifiedQueryFlags.PG | ClassifiedQueryFlags.Mature);
8187 </code>
8188 </example>
8189 <remarks>
8190 Responses are sent 16 at a time, there is no way to know how many results a query reply will contain however assuming
8191 the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received
8192 </remarks>
5859 </member> 8193 </member>
5860 <member name="M:OpenMetaverse.BitPack.PackBits(System.UInt32,System.Int32)"> 8194 <member name="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,System.Int32)">
5861 <summary> 8195 <summary>
5862 Pack part or all of an unsigned integer in to the data 8196 Starts search for places (Overloaded)
8197
8198 The <see cref="!:OnDirPlacesReply"/> event is raised when a response is received from the simulator
5863 </summary> 8199 </summary>
5864 <param name="data">Unsigned integer containing the data to pack</param> 8200 <param name="searchText">Search text</param>
5865 <param name="totalCount">Number of bits of the integer to pack</param> 8201 <param name="queryStart">Each request is limited to 100 places
8202 being returned. To get the first 100 result entries of a request use 0,
8203 from 100-199 use 1, 200-299 use 2, etc.</param>
8204 <returns>A UUID to correlate the results when the <see cref="!:OnDirPlacesReply"/> event is raised</returns>
5866 </member> 8205 </member>
5867 <member name="M:OpenMetaverse.BitPack.PackBit(System.Boolean)"> 8206 <member name="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.Int32)">
5868 <summary> 8207 <summary>
5869 Pack a single bit in to the data 8208 Queries the dataserver for parcels of land which are flagged to be shown in search
8209
8210 The <see cref="!:OnDirPlacesReply"/> event is raised when a response is received from the simulator
5870 </summary> 8211 </summary>
5871 <param name="bit">Bit to pack</param> 8212 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
8213 <param name="queryFlags">A set of flags which can be ORed to modify query options
8214 such as classified maturity rating.</param>
8215 <param name="category">The category to search</param>
8216 <param name="queryStart">Each request is limited to 100 places
8217 being returned. To get the first 100 result entries of a request use 0,
8218 from 100-199 use 1, 200-299 use 2, etc.</param>
8219 <returns>A UUID to correlate the results when the <see cref="!:OnDirPlacesReply"/> event is raised</returns>
8220 <example>
8221 Search places containing the key words "foo" and "bar" in the "Any" category that are either PG or Adult
8222 <code>
8223 UUID searchID = StartDirPlacesSearch("foo bar", DirFindFlags.DwellSort | DirFindFlags.IncludePG | DirFindFlags.IncludeAdult, ParcelCategory.Any, 0);
8224 </code>
8225 </example>
8226 <remarks>
8227 Additional information on the results can be obtained by using the ParcelManager.InfoRequest method
8228 </remarks>
5872 </member> 8229 </member>
5873 <member name="M:OpenMetaverse.BitPack.PackFixed(System.Single,System.Boolean,System.Int32,System.Int32)"> 8230 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.SearchTypeFlags)">
5874 <summary> 8231 <summary>
8232 Starts a search for land sales using the directory
8233
8234 The <see cref="!:OnDirLandReply"/> event is raised when a response is received from the simulator
5875 </summary> 8235 </summary>
5876 <param name="data"> 8236 <param name="typeFlags">What type of land to search for. Auction,
5877 </param> 8237 estate, mainland, "first land", etc</param>
5878 <param name="isSigned"> 8238 <remarks>The OnDirLandReply event handler must be registered before
5879 </param> 8239 calling this function. There is no way to determine how many
5880 <param name="intBits"> 8240 results will be returned, or how many times the callback will be
5881 </param> 8241 fired other than you won't get more than 100 total parcels from
5882 <param name="fracBits"> 8242 each query.</remarks>
5883 </param>
5884 </member> 8243 </member>
5885 <member name="M:OpenMetaverse.BitPack.PackUUID(OpenMetaverse.UUID)"> 8244 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.SearchTypeFlags,System.Int32,System.Int32,System.Int32)">
5886 <summary> 8245 <summary>
8246 Starts a search for land sales using the directory
8247
8248 The <seealso cref="!:OnDirLandReply"/> event is raised when a response is received from the simulator
5887 </summary> 8249 </summary>
5888 <param name="data"> 8250 <param name="typeFlags">What type of land to search for. Auction,
5889 </param> 8251 estate, mainland, "first land", etc</param>
8252 <param name="priceLimit">Maximum price to search for</param>
8253 <param name="areaLimit">Maximum area to search for</param>
8254 <param name="queryStart">Each request is limited to 100 parcels
8255 being returned. To get the first 100 parcels of a request use 0,
8256 from 100-199 use 1, 200-299 use 2, etc.</param>
8257 <remarks>The OnDirLandReply event handler must be registered before
8258 calling this function. There is no way to determine how many
8259 results will be returned, or how many times the callback will be
8260 fired other than you won't get more than 100 total parcels from
8261 each query.</remarks>
5890 </member> 8262 </member>
5891 <member name="M:OpenMetaverse.BitPack.PackColor(OpenMetaverse.Color4)"> 8263 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.DirectoryManager.SearchTypeFlags,System.Int32,System.Int32,System.Int32)">
5892 <summary> 8264 <summary>
8265 Send a request to the data server for land sales listings
5893 </summary> 8266 </summary>
5894 <param name="data"> 8267
8268 <param name="findFlags">Flags sent to specify query options
8269
8270 Available flags:
8271 Specify the parcel rating with one or more of the following:
8272 IncludePG IncludeMature IncludeAdult
8273
8274 Specify the field to pre sort the results with ONLY ONE of the following:
8275 PerMeterSort NameSort AreaSort PricesSort
8276
8277 Specify the order the results are returned in, if not specified the results are pre sorted in a Descending Order
8278 SortAsc
8279
8280 Specify additional filters to limit the results with one or both of the following:
8281 LimitByPrice LimitByArea
8282
8283 Flags can be combined by separating them with the | (pipe) character
8284
8285 Additional details can be found in <see cref="T:OpenMetaverse.DirectoryManager.DirFindFlags"/>
5895 </param> 8286 </param>
8287 <param name="typeFlags">What type of land to search for. Auction,
8288 Estate or Mainland</param>
8289 <param name="priceLimit">Maximum price to search for when the
8290 DirFindFlags.LimitByPrice flag is specified in findFlags</param>
8291 <param name="areaLimit">Maximum area to search for when the
8292 DirFindFlags.LimitByArea flag is specified in findFlags</param>
8293 <param name="queryStart">Each request is limited to 100 parcels
8294 being returned. To get the first 100 parcels of a request use 0,
8295 from 100-199 use 100, 200-299 use 200, etc.</param>
8296 <remarks><para>The <seealso cref="!:OnDirLandReply"/> event will be raised with the response from the simulator
8297
8298 There is no way to determine how many results will be returned, or how many times the callback will be
8299 fired other than you won't get more than 100 total parcels from
8300 each reply.</para>
8301
8302 <para>Any land set for sale to either anybody or specific to the connected agent will be included in the
8303 results if the land is included in the query</para></remarks>
8304 <example>
8305 <code>
8306 // request all mainland, any maturity rating that is larger than 512 sq.m
8307 StartLandSearch(DirFindFlags.SortAsc | DirFindFlags.PerMeterSort | DirFindFlags.LimitByArea | DirFindFlags.IncludePG | DirFindFlags.IncludeMature | DirFindFlags.IncludeAdult, SearchTypeFlags.Mainland, 0, 512, 0);
8308 </code></example>
5896 </member> 8309 </member>
5897 <member name="M:OpenMetaverse.BitPack.UnpackFloat"> 8310 <member name="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32)">
5898 <summary> 8311 <summary>
5899 Unpacking a floating point value from the data 8312 Search for Groups
5900 </summary> 8313 </summary>
5901 <returns>Unpacked floating point value</returns> 8314 <param name="searchText">The name or portion of the name of the group you wish to search for</param>
8315 <param name="queryStart">Start from the match number</param>
8316 <returns></returns>
5902 </member> 8317 </member>
5903 <member name="M:OpenMetaverse.BitPack.UnpackBits(System.Int32)"> 8318 <member name="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32,OpenMetaverse.DirectoryManager.DirFindFlags)">
5904 <summary> 8319 <summary>
5905 Unpack a variable number of bits from the data in to integer format 8320 Search for Groups
5906 </summary> 8321 </summary>
5907 <param name="totalCount">Number of bits to unpack</param> 8322 <param name="searchText">The name or portion of the name of the group you wish to search for</param>
5908 <returns>An integer containing the unpacked bits</returns> 8323 <param name="queryStart">Start from the match number</param>
5909 <remarks>This function is only useful up to 32 bits</remarks> 8324 <param name="flags">Search flags</param>
8325 <returns></returns>
5910 </member> 8326 </member>
5911 <member name="M:OpenMetaverse.BitPack.UnpackUBits(System.Int32)"> 8327 <member name="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)">
5912 <summary> 8328 <summary>
5913 Unpack a variable number of bits from the data in to unsigned 8329 Search the People directory for other avatars
5914 integer format
5915 </summary> 8330 </summary>
5916 <param name="totalCount">Number of bits to unpack</param> 8331 <param name="searchText">The name or portion of the name of the avatar you wish to search for</param>
5917 <returns>An unsigned integer containing the unpacked bits</returns> 8332 <param name="queryStart"></param>
5918 <remarks>This function is only useful up to 32 bits</remarks> 8333 <returns></returns>
5919 </member> 8334 </member>
5920 <member name="M:OpenMetaverse.BitPack.UnpackShort"> 8335 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch">
5921 <summary> 8336 <summary>
5922 Unpack a 16-bit signed integer 8337 Search Places for parcels of land you personally own
5923 </summary> 8338 </summary>
5924 <returns>16-bit signed integer</returns>
5925 </member> 8339 </member>
5926 <member name="M:OpenMetaverse.BitPack.UnpackUShort"> 8340 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.UUID)">
5927 <summary> 8341 <summary>
5928 Unpack a 16-bit unsigned integer 8342 Searches Places for land owned by the specified group
5929 </summary> 8343 </summary>
5930 <returns>16-bit unsigned integer</returns> 8344 <param name="groupID">ID of the group you want to recieve land list for (You must be a member of the group)</param>
8345 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
5931 </member> 8346 </member>
5932 <member name="M:OpenMetaverse.BitPack.UnpackInt"> 8347 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(System.String)">
5933 <summary> 8348 <summary>
5934 Unpack a 32-bit signed integer 8349 Search the Places directory for parcels that are listed in search and contain the specified keywords
5935 </summary> 8350 </summary>
5936 <returns>32-bit signed integer</returns> 8351 <param name="searchText">A string containing the keywords to search for</param>
8352 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
5937 </member> 8353 </member>
5938 <member name="M:OpenMetaverse.BitPack.UnpackUInt"> 8354 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID)">
5939 <summary> 8355 <summary>
5940 Unpack a 32-bit unsigned integer 8356 Search Places - All Options
5941 </summary> 8357 </summary>
5942 <returns>32-bit unsigned integer</returns> 8358 <param name="findFlags">One of the Values from the DirFindFlags struct, ie: AgentOwned, GroupOwned, etc.</param>
8359 <param name="searchCategory">One of the values from the SearchCategory Struct, ie: Any, Linden, Newcomer</param>
8360 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
8361 <param name="simulatorName">String Simulator Name to search in</param>
8362 <param name="groupID">LLUID of group you want to recieve results for</param>
8363 <param name="transactionID">Transaction (Query) ID which can be associated with results from your request.</param>
8364 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
5943 </member> 8365 </member>
5944 <member name="T:OpenMetaverse.Caps"> 8366 <member name="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,System.UInt32)">
5945 <summary> 8367 <summary>
5946 Capabilities is the name of the bi-directional HTTP REST protocol 8368 Search All Events with specifid searchText in all categories, includes PG, Mature and Adult
5947 used to communicate non real-time transactions such as teleporting or
5948 group messaging
5949 </summary> 8369 </summary>
8370 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
8371 <param name="queryStart">Each request is limited to 100 entries
8372 being returned. To get the first group of entries of a request use 0,
8373 from 100-199 use 100, 200-299 use 200, etc.</param>
8374 <returns>UUID of query to correlate results in callback.</returns>
5950 </member> 8375 </member>
5951 <member name="M:OpenMetaverse.Caps.#ctor(OpenMetaverse.Simulator,System.String)"> 8376 <member name="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,System.String,System.UInt32,OpenMetaverse.DirectoryManager.EventCategories)">
5952 <summary> 8377 <summary>
5953 Default constructor 8378 Search Events
5954 </summary> 8379 </summary>
5955 <param name="simulator"> 8380 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
5956 </param> 8381 <param name="queryFlags">One or more of the following flags: DateEvents, IncludePG, IncludeMature, IncludeAdult
5957 <param name="seedcaps"> 8382 from the <see cref="T:OpenMetaverse.DirectoryManager.DirFindFlags"/> Enum
5958 </param> 8383
8384 Multiple flags can be combined by separating the flags with the | (pipe) character</param>
8385 <param name="eventDay">"u" for in-progress and upcoming events, -or- number of days since/until event is scheduled
8386 For example "0" = Today, "1" = tomorrow, "2" = following day, "-1" = yesterday, etc.</param>
8387 <param name="queryStart">Each request is limited to 100 entries
8388 being returned. To get the first group of entries of a request use 0,
8389 from 100-199 use 100, 200-299 use 200, etc.</param>
8390 <param name="category">EventCategory event is listed under.</param>
8391 <returns>UUID of query to correlate results in callback.</returns>
5959 </member> 8392 </member>
5960 <member name="T:OpenMetaverse.Caps.EventQueueCallback"> 8393 <member name="M:OpenMetaverse.DirectoryManager.EventInfoRequest(System.UInt32)">
5961 <summary> 8394 <summary>Requests Event Details</summary>
5962 Triggered when an event is received via the EventQueueGet 8395 <param name="eventID">ID of Event returned from the <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,System.UInt32)"/> method</param>
5963 capability
5964 </summary>
5965 <param name="capsKey">Event name</param>
5966 <param name="message">Decoded event data</param>
5967 <param name="simulator">The simulator that generated the event</param>
5968 </member> 8396 </member>
5969 <member name="F:OpenMetaverse.Caps.Simulator"> 8397 <member name="M:OpenMetaverse.DirectoryManager.DirClassifiedReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
5970 <summary>Reference to the simulator this system is connected to</summary> 8398 <summary>Process an incoming packet and raise the appropriate events</summary>
8399 <param name="sender">The sender</param>
8400 <param name="e">The EventArgs object containing the packet data</param>
5971 </member> 8401 </member>
5972 <member name="P:OpenMetaverse.Caps.SeedCapsURI"> 8402 <member name="M:OpenMetaverse.DirectoryManager.DirLandReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
5973 <summary>Capabilities URI this system was initialized with</summary> 8403 <summary>Process an incoming packet and raise the appropriate events</summary>
8404 <param name="sender">The sender</param>
8405 <param name="e">The EventArgs object containing the packet data</param>
5974 </member> 8406 </member>
5975 <member name="P:OpenMetaverse.Caps.IsEventQueueRunning"> 8407 <member name="M:OpenMetaverse.DirectoryManager.DirLandReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
5976 <summary>Whether the capabilities event queue is connected and 8408 <summary>Process an incoming <see cref="T:OpenMetaverse.Messages.Linden.DirLandReplyMessage"/> event message</summary>
5977 listening for incoming events</summary> 8409 <param name="capsKey">The Unique Capabilities Key</param>
8410 <param name="message">The <see cref="T:OpenMetaverse.Messages.Linden.DirLandReplyMessage"/> event message containing the data</param>
8411 <param name="simulator">The simulator the message originated from</param>
5978 </member> 8412 </member>
5979 <member name="M:OpenMetaverse.Caps.CapabilityURI(System.String)"> 8413 <member name="M:OpenMetaverse.DirectoryManager.DirPeopleReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
5980 <summary> 8414 <summary>Process an incoming packet and raise the appropriate events</summary>
5981 Request the URI of a named capability 8415 <param name="sender">The sender</param>
5982 </summary> 8416 <param name="e">The EventArgs object containing the packet data</param>
5983 <param name="capability">Name of the capability to request</param>
5984 <returns>The URI of the requested capability, or String.Empty if
5985 the capability does not exist</returns>
5986 </member> 8417 </member>
5987 <member name="M:OpenMetaverse.Caps.EventQueueEventHandler(System.String,OpenMetaverse.StructuredData.OSDMap)"> 8418 <member name="M:OpenMetaverse.DirectoryManager.DirGroupsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
5988 <summary> 8419 <summary>Process an incoming packet and raise the appropriate events</summary>
5989 Process any incoming events, check to see if we have a message created for the event, 8420 <param name="sender">The sender</param>
5990 </summary> 8421 <param name="e">The EventArgs object containing the packet data</param>
5991 <param name="eventName">
5992 </param>
5993 <param name="body">
5994 </param>
5995 </member> 8422 </member>
5996 <member name="M:OpenMetaverse.Packets.Packet.BuildPacket(System.String,OpenMetaverse.StructuredData.OSDMap)"> 8423 <member name="M:OpenMetaverse.DirectoryManager.PlacesReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
5997 <summary> 8424 <summary>Process an incoming <see cref="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage"/> event message</summary>
5998 Attempts to convert an LLSD structure to a known Packet type 8425 <param name="capsKey">The Unique Capabilities Key</param>
5999 </summary> 8426 <param name="message">The <see cref="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage"/> event message containing the data</param>
6000 <param name="capsEventName">Event name, this must match an actual 8427 <param name="simulator">The simulator the message originated from</param>
6001 packet name for a Packet to be successfully built</param>
6002 <param name="body">LLSD to convert to a Packet</param>
6003 <returns>A Packet on success, otherwise null</returns>
6004 </member> 8428 </member>
6005 <member name="P:OpenMetaverse.CoordinateFrame.Origin"> 8429 <member name="M:OpenMetaverse.DirectoryManager.PlacesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6006 <summary>Origin position of this coordinate frame</summary> 8430 <summary>Process an incoming packet and raise the appropriate events</summary>
8431 <param name="sender">The sender</param>
8432 <param name="e">The EventArgs object containing the packet data</param>
6007 </member> 8433 </member>
6008 <member name="P:OpenMetaverse.CoordinateFrame.XAxis"> 8434 <member name="M:OpenMetaverse.DirectoryManager.EventsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6009 <summary>X axis of this coordinate frame, or Forward/At in grid terms</summary> 8435 <summary>Process an incoming packet and raise the appropriate events</summary>
8436 <param name="sender">The sender</param>
8437 <param name="e">The EventArgs object containing the packet data</param>
6010 </member> 8438 </member>
6011 <member name="P:OpenMetaverse.CoordinateFrame.YAxis"> 8439 <member name="M:OpenMetaverse.DirectoryManager.EventInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6012 <summary>Y axis of this coordinate frame, or Left in grid terms</summary> 8440 <summary>Process an incoming packet and raise the appropriate events</summary>
8441 <param name="sender">The sender</param>
8442 <param name="e">The EventArgs object containing the packet data</param>
6013 </member> 8443 </member>
6014 <member name="P:OpenMetaverse.CoordinateFrame.ZAxis"> 8444 <member name="M:OpenMetaverse.DirectoryManager.DirPlacesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6015 <summary>Z axis of this coordinate frame, or Up in grid terms</summary> 8445 <summary>Process an incoming packet and raise the appropriate events</summary>
8446 <param name="sender">The sender</param>
8447 <param name="e">The EventArgs object containing the packet data</param>
6016 </member> 8448 </member>
6017 <member name="M:OpenMetaverse.CoordinateFrame.LookDirection(OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 8449 <member name="E:OpenMetaverse.DirectoryManager.EventInfoReply">
6018 <summary> 8450 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.EventInfoRequest(System.UInt32)"/> request.</summary>
6019 </summary>
6020 <param name="at">Looking direction, must be a normalized vector</param>
6021 <param name="upDirection">Up direction, must be a normalized vector</param>
6022 </member> 8451 </member>
6023 <member name="M:OpenMetaverse.CoordinateFrame.LookDirection(System.Double)"> 8452 <member name="E:OpenMetaverse.DirectoryManager.DirEventsReply">
6024 <summary> 8453 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,System.UInt32)"/> request.</summary>
6025 Align the coordinate frame X and Y axis with a given rotation
6026 around the Z axis in radians
6027 </summary>
6028 <param name="heading">Absolute rotation around the Z axis in
6029 radians</param>
6030 </member> 8454 </member>
6031 <member name="T:OpenMetaverse.DirectoryManager"> 8455 <member name="E:OpenMetaverse.DirectoryManager.PlacesReply">
6032 <summary> 8456 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch"/> request.</summary>
6033 Access to the data server which allows searching for land, events, people, etc
6034 </summary>
6035 </member> 8457 </member>
6036 <member name="M:OpenMetaverse.DirectoryManager.#ctor(OpenMetaverse.GridClient)"> 8458 <member name="E:OpenMetaverse.DirectoryManager.DirPlacesReply">
6037 <summary> 8459 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,System.Int32)"/> request.</summary>
6038 Constructs a new instance of the DirectoryManager class 8460 </member>
6039 </summary> 8461 <member name="E:OpenMetaverse.DirectoryManager.DirClassifiedsReply">
6040 <param name="client">An instance of GridClient</param> 8462 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String,OpenMetaverse.DirectoryManager.ClassifiedCategories,System.Boolean)"/> request.</summary>
8463 </member>
8464 <member name="E:OpenMetaverse.DirectoryManager.DirGroupsReply">
8465 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32)"/> request.</summary>
8466 </member>
8467 <member name="E:OpenMetaverse.DirectoryManager.DirPeopleReply">
8468 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)"/> request.</summary>
8469 </member>
8470 <member name="E:OpenMetaverse.DirectoryManager.DirLandReply">
8471 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.SearchTypeFlags)"/> request.</summary>
6041 </member> 8472 </member>
6042 <member name="T:OpenMetaverse.DirectoryManager.ClassifiedCategories"> 8473 <member name="T:OpenMetaverse.DirectoryManager.ClassifiedCategories">
6043 <summary>Classified Ad categories</summary> 8474 <summary>Classified Ad categories</summary>
@@ -6052,87 +8483,69 @@
6052 <summary>Classified is </summary> 8483 <summary>Classified is </summary>
6053 </member> 8484 </member>
6054 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.PropertyRental"> 8485 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.PropertyRental">
6055 <summary> 8486 <summary></summary>
6056 </summary>
6057 </member> 8487 </member>
6058 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.SpecialAttraction"> 8488 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.SpecialAttraction">
6059 <summary> 8489 <summary></summary>
6060 </summary>
6061 </member> 8490 </member>
6062 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.NewProducts"> 8491 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.NewProducts">
6063 <summary> 8492 <summary></summary>
6064 </summary>
6065 </member> 8493 </member>
6066 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Employment"> 8494 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Employment">
6067 <summary> 8495 <summary></summary>
6068 </summary>
6069 </member> 8496 </member>
6070 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Wanted"> 8497 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Wanted">
6071 <summary> 8498 <summary></summary>
6072 </summary>
6073 </member> 8499 </member>
6074 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Service"> 8500 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Service">
6075 <summary> 8501 <summary></summary>
6076 </summary>
6077 </member> 8502 </member>
6078 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Personal"> 8503 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedCategories.Personal">
6079 <summary> 8504 <summary></summary>
6080 </summary>
6081 </member> 8505 </member>
6082 <member name="T:OpenMetaverse.DirectoryManager.EventCategories"> 8506 <member name="T:OpenMetaverse.DirectoryManager.EventCategories">
6083 <summary>Event Categories</summary> 8507 <summary>Event Categories</summary>
6084 </member> 8508 </member>
6085 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.All"> 8509 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.All">
6086 <summary> 8510 <summary></summary>
6087 </summary>
6088 </member> 8511 </member>
6089 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Discussion"> 8512 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Discussion">
6090 <summary> 8513 <summary></summary>
6091 </summary>
6092 </member> 8514 </member>
6093 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Sports"> 8515 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Sports">
6094 <summary> 8516 <summary></summary>
6095 </summary>
6096 </member> 8517 </member>
6097 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.LiveMusic"> 8518 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.LiveMusic">
6098 <summary> 8519 <summary></summary>
6099 </summary>
6100 </member> 8520 </member>
6101 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Commercial"> 8521 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Commercial">
6102 <summary> 8522 <summary></summary>
6103 </summary>
6104 </member> 8523 </member>
6105 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Nightlife"> 8524 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Nightlife">
6106 <summary> 8525 <summary></summary>
6107 </summary>
6108 </member> 8526 </member>
6109 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Games"> 8527 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Games">
6110 <summary> 8528 <summary></summary>
6111 </summary>
6112 </member> 8529 </member>
6113 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Pageants"> 8530 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Pageants">
6114 <summary> 8531 <summary></summary>
6115 </summary>
6116 </member> 8532 </member>
6117 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Education"> 8533 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Education">
6118 <summary> 8534 <summary></summary>
6119 </summary>
6120 </member> 8535 </member>
6121 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Arts"> 8536 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Arts">
6122 <summary> 8537 <summary></summary>
6123 </summary>
6124 </member> 8538 </member>
6125 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Charity"> 8539 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Charity">
6126 <summary> 8540 <summary></summary>
6127 </summary>
6128 </member> 8541 </member>
6129 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Miscellaneous"> 8542 <member name="F:OpenMetaverse.DirectoryManager.EventCategories.Miscellaneous">
6130 <summary> 8543 <summary></summary>
6131 </summary>
6132 </member> 8544 </member>
6133 <member name="T:OpenMetaverse.DirectoryManager.DirFindFlags"> 8545 <member name="T:OpenMetaverse.DirectoryManager.DirFindFlags">
6134 <summary> 8546 <summary>
6135 Query Flags used in many of the DirectoryManager methods to specify which query to execute and how to return the results. 8547 Query Flags used in many of the DirectoryManager methods to specify which query to execute and how to return the results.
8548
6136 Flags can be combined using the | (pipe) character, not all flags are available in all queries 8549 Flags can be combined using the | (pipe) character, not all flags are available in all queries
6137 </summary> 8550 </summary>
6138 </member> 8551 </member>
@@ -6140,12 +8553,10 @@
6140 <summary>Query the People database</summary> 8553 <summary>Query the People database</summary>
6141 </member> 8554 </member>
6142 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Online"> 8555 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Online">
6143 <summary> 8556 <summary></summary>
6144 </summary>
6145 </member> 8557 </member>
6146 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Events"> 8558 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Events">
6147 <summary> 8559 <summary></summary>
6148 </summary>
6149 </member> 8560 </member>
6150 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Groups"> 8561 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.Groups">
6151 <summary>Query the Groups database</summary> 8562 <summary>Query the Groups database</summary>
@@ -6157,8 +8568,7 @@
6157 <summary>Query the land holdings database for land owned by the currently connected agent</summary> 8568 <summary>Query the land holdings database for land owned by the currently connected agent</summary>
6158 </member> 8569 </member>
6159 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.ForSale"> 8570 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.ForSale">
6160 <summary> 8571 <summary></summary>
6161 </summary>
6162 </member> 8572 </member>
6163 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.GroupOwned"> 8573 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.GroupOwned">
6164 <summary>Query the land holdings database for land which is owned by a Group</summary> 8574 <summary>Query the land holdings database for land which is owned by a Group</summary>
@@ -6168,39 +8578,35 @@
6168 when searching the Places database</summary> 8578 when searching the Places database</summary>
6169 </member> 8579 </member>
6170 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PgSimsOnly"> 8580 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PgSimsOnly">
6171 <summary> 8581 <summary></summary>
6172 </summary>
6173 </member> 8582 </member>
6174 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PicturesOnly"> 8583 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PicturesOnly">
6175 <summary> 8584 <summary></summary>
6176 </summary>
6177 </member> 8585 </member>
6178 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PgEventsOnly"> 8586 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PgEventsOnly">
6179 <summary> 8587 <summary></summary>
6180 </summary>
6181 </member> 8588 </member>
6182 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.MatureSimsOnly"> 8589 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.MatureSimsOnly">
6183 <summary> 8590 <summary></summary>
6184 </summary>
6185 </member> 8591 </member>
6186 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.SortAsc"> 8592 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.SortAsc">
6187 <summary>Specifies the query should pre sort the results in an ascending order when searching the land sales database. 8593 <summary>Specifies the query should pre sort the results in an ascending order when searching the land sales database.
6188 This flag is only used when searching the land sales database</summary> 8594 This flag is only used when searching the land sales database</summary>
6189 </member> 8595 </member>
6190 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PricesSort"> 8596 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PricesSort">
6191 <summary>Specifies the query should pre sort the results using the SalePrice field when searching the land sales database. 8597 <summary>Specifies the query should pre sort the results using the SalePrice field when searching the land sales database.
6192 This flag is only used when searching the land sales database</summary> 8598 This flag is only used when searching the land sales database</summary>
6193 </member> 8599 </member>
6194 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PerMeterSort"> 8600 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PerMeterSort">
6195 <summary>Specifies the query should pre sort the results by calculating the average price/sq.m (SalePrice / Area) when searching the land sales database. 8601 <summary>Specifies the query should pre sort the results by calculating the average price/sq.m (SalePrice / Area) when searching the land sales database.
6196 This flag is only used when searching the land sales database</summary> 8602 This flag is only used when searching the land sales database</summary>
6197 </member> 8603 </member>
6198 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.AreaSort"> 8604 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.AreaSort">
6199 <summary>Specifies the query should pre sort the results using the ParcelSize field when searching the land sales database. 8605 <summary>Specifies the query should pre sort the results using the ParcelSize field when searching the land sales database.
6200 This flag is only used when searching the land sales database</summary> 8606 This flag is only used when searching the land sales database</summary>
6201 </member> 8607 </member>
6202 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.NameSort"> 8608 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.NameSort">
6203 <summary>Specifies the query should pre sort the results using the Name field when searching the land sales database. 8609 <summary>Specifies the query should pre sort the results using the Name field when searching the land sales database.
6204 This flag is only used when searching the land sales database</summary> 8610 This flag is only used when searching the land sales database</summary>
6205 </member> 8611 </member>
6206 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.LimitByPrice"> 8612 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.LimitByPrice">
@@ -6212,12 +8618,10 @@
6212 This flag is only used when searching the land sales database</summary> 8618 This flag is only used when searching the land sales database</summary>
6213 </member> 8619 </member>
6214 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.FilterMature"> 8620 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.FilterMature">
6215 <summary> 8621 <summary></summary>
6216 </summary>
6217 </member> 8622 </member>
6218 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PGOnly"> 8623 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.PGOnly">
6219 <summary> 8624 <summary></summary>
6220 </summary>
6221 </member> 8625 </member>
6222 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.IncludePG"> 8626 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.IncludePG">
6223 <summary>Include PG land in results. This flag is used when searching both the Groups, Events and Land sales databases</summary> 8627 <summary>Include PG land in results. This flag is used when searching both the Groups, Events and Land sales databases</summary>
@@ -6229,8 +8633,7 @@
6229 <summary>Include Adult land in results. This flag is used when searching both the Groups, Events and Land sales databases</summary> 8633 <summary>Include Adult land in results. This flag is used when searching both the Groups, Events and Land sales databases</summary>
6230 </member> 8634 </member>
6231 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.AdultOnly"> 8635 <member name="F:OpenMetaverse.DirectoryManager.DirFindFlags.AdultOnly">
6232 <summary> 8636 <summary></summary>
6233 </summary>
6234 </member> 8637 </member>
6235 <member name="T:OpenMetaverse.DirectoryManager.SearchTypeFlags"> 8638 <member name="T:OpenMetaverse.DirectoryManager.SearchTypeFlags">
6236 <summary> 8639 <summary>
@@ -6271,24 +8674,19 @@
6271 This set of flags is for the newer style</remarks> 8674 This set of flags is for the newer style</remarks>
6272 </member> 8675 </member>
6273 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.None"> 8676 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.None">
6274 <summary> 8677 <summary></summary>
6275 </summary>
6276 </member> 8678 </member>
6277 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.Mature"> 8679 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.Mature">
6278 <summary> 8680 <summary></summary>
6279 </summary>
6280 </member> 8681 </member>
6281 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.Enabled"> 8682 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.Enabled">
6282 <summary> 8683 <summary></summary>
6283 </summary>
6284 </member> 8684 </member>
6285 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.UpdateTime"> 8685 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.UpdateTime">
6286 <summary> 8686 <summary></summary>
6287 </summary>
6288 </member> 8687 </member>
6289 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.AutoRenew"> 8688 <member name="F:OpenMetaverse.DirectoryManager.ClassifiedFlags.AutoRenew">
6290 <summary> 8689 <summary></summary>
6291 </summary>
6292 </member> 8690 </member>
6293 <member name="T:OpenMetaverse.DirectoryManager.ClassifiedQueryFlags"> 8691 <member name="T:OpenMetaverse.DirectoryManager.ClassifiedQueryFlags">
6294 <summary> 8692 <summary>
@@ -6348,14 +8746,14 @@
6348 </member> 8746 </member>
6349 <member name="T:OpenMetaverse.DirectoryManager.DirectoryParcel"> 8747 <member name="T:OpenMetaverse.DirectoryManager.DirectoryParcel">
6350 <summary> 8748 <summary>
6351 A parcel retrieved from the dataserver such as results from the 8749 A parcel retrieved from the dataserver such as results from the
6352 "For-Sale" listings or "Places" Search 8750 "For-Sale" listings or "Places" Search
6353 </summary> 8751 </summary>
6354 </member> 8752 </member>
6355 <member name="F:OpenMetaverse.DirectoryManager.DirectoryParcel.ID"> 8753 <member name="F:OpenMetaverse.DirectoryManager.DirectoryParcel.ID">
6356 <summary>The unique dataserver parcel ID</summary> 8754 <summary>The unique dataserver parcel ID</summary>
6357 <remarks>This id is used to obtain additional information from the entry 8755 <remarks>This id is used to obtain additional information from the entry
6358 by using the <see cref="!:ParcelManager.InfoRequest" /> method</remarks> 8756 by using the <see cref="!:ParcelManager.InfoRequest"/> method</remarks>
6359 </member> 8757 </member>
6360 <member name="F:OpenMetaverse.DirectoryManager.DirectoryParcel.Name"> 8758 <member name="F:OpenMetaverse.DirectoryManager.DirectoryParcel.Name">
6361 <summary>A string containing the name of the parcel</summary> 8759 <summary>A string containing the name of the parcel</summary>
@@ -6397,7 +8795,7 @@
6397 <summary>The agents last name</summary> 8795 <summary>The agents last name</summary>
6398 </member> 8796 </member>
6399 <member name="F:OpenMetaverse.DirectoryManager.AgentSearchData.AgentID"> 8797 <member name="F:OpenMetaverse.DirectoryManager.AgentSearchData.AgentID">
6400 <summary>The agents <see cref="T:OpenMetaverse.UUID" /></summary> 8798 <summary>The agents <see cref="T:OpenMetaverse.UUID"/></summary>
6401 </member> 8799 </member>
6402 <member name="M:OpenMetaverse.DirectoryManager.AgentSearchData.ToString"> 8800 <member name="M:OpenMetaverse.DirectoryManager.AgentSearchData.ToString">
6403 <summary>Print the struct data as a string</summary> 8801 <summary>Print the struct data as a string</summary>
@@ -6405,7 +8803,7 @@
6405 </member> 8803 </member>
6406 <member name="T:OpenMetaverse.DirectoryManager.GroupSearchData"> 8804 <member name="T:OpenMetaverse.DirectoryManager.GroupSearchData">
6407 <summary> 8805 <summary>
6408 Response to a "Groups" Search 8806 Response to a "Groups" Search
6409 </summary> 8807 </summary>
6410 </member> 8808 </member>
6411 <member name="F:OpenMetaverse.DirectoryManager.GroupSearchData.GroupID"> 8809 <member name="F:OpenMetaverse.DirectoryManager.GroupSearchData.GroupID">
@@ -6423,13 +8821,14 @@
6423 </member> 8821 </member>
6424 <member name="T:OpenMetaverse.DirectoryManager.PlacesSearchData"> 8822 <member name="T:OpenMetaverse.DirectoryManager.PlacesSearchData">
6425 <summary> 8823 <summary>
6426 Parcel information returned from a <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID)" /> request 8824 Parcel information returned from a <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch"/> request
6427 <para> 8825 <para>
6428 Represents one of the following: 8826 Represents one of the following:
6429 A parcel of land on the grid that has its Show In Search flag set 8827 A parcel of land on the grid that has its Show In Search flag set
6430 A parcel of land owned by the agent making the request 8828 A parcel of land owned by the agent making the request
6431 A parcel of land owned by a group the agent making the request is a member of 8829 A parcel of land owned by a group the agent making the request is a member of
6432 </para><para> 8830 </para>
8831 <para>
6433 In a request for Group Land, the First record will contain an empty record 8832 In a request for Group Land, the First record will contain an empty record
6434 </para> 8833 </para>
6435 Note: This is not the same as searching the land for sale data source 8834 Note: This is not the same as searching the land for sale data source
@@ -6476,7 +8875,14 @@
6476 <member name="F:OpenMetaverse.DirectoryManager.PlacesSearchData.SKU"> 8875 <member name="F:OpenMetaverse.DirectoryManager.PlacesSearchData.SKU">
6477 <summary>The billing product SKU</summary> 8876 <summary>The billing product SKU</summary>
6478 <remarks>Known values are: 8877 <remarks>Known values are:
6479 <list type="table"><item><term>023</term><description>Mainland / Full Region</description></item><item><term>024</term><description>Estate / Full Region</description></item><item><term>027</term><description>Estate / Openspace</description></item><item><term>029</term><description>Estate / Homestead</description></item><item><term>129</term><description>Mainland / Homestead (Linden Owned)</description></item></list></remarks> 8878 <list type="table">
8879 <item><term>023</term><description>Mainland / Full Region</description></item>
8880 <item><term>024</term><description>Estate / Full Region</description></item>
8881 <item><term>027</term><description>Estate / Openspace</description></item>
8882 <item><term>029</term><description>Estate / Homestead</description></item>
8883 <item><term>129</term><description>Mainland / Homestead (Linden Owned)</description></item>
8884 </list>
8885 </remarks>
6480 </member> 8886 </member>
6481 <member name="F:OpenMetaverse.DirectoryManager.PlacesSearchData.Price"> 8887 <member name="F:OpenMetaverse.DirectoryManager.PlacesSearchData.Price">
6482 <summary>No longer used, will always be 0</summary> 8888 <summary>No longer used, will always be 0</summary>
@@ -6568,396 +8974,6 @@
6568 <summary>Print the struct data as a string</summary> 8974 <summary>Print the struct data as a string</summary>
6569 <returns>A string containing the field name, and field value</returns> 8975 <returns>A string containing the field name, and field value</returns>
6570 </member> 8976 </member>
6571 <member name="F:OpenMetaverse.DirectoryManager.m_EventInfoReply">
6572 <summary>The event subscribers. null if no subcribers</summary>
6573 </member>
6574 <member name="F:OpenMetaverse.DirectoryManager.m_EventDetailLock">
6575 <summary>Thread sync lock object</summary>
6576 </member>
6577 <member name="F:OpenMetaverse.DirectoryManager.m_DirEvents">
6578 <summary>The event subscribers. null if no subcribers</summary>
6579 </member>
6580 <member name="F:OpenMetaverse.DirectoryManager.m_DirEventsLock">
6581 <summary>Thread sync lock object</summary>
6582 </member>
6583 <member name="F:OpenMetaverse.DirectoryManager.m_Places">
6584 <summary>The event subscribers. null if no subcribers</summary>
6585 </member>
6586 <member name="F:OpenMetaverse.DirectoryManager.m_PlacesLock">
6587 <summary>Thread sync lock object</summary>
6588 </member>
6589 <member name="F:OpenMetaverse.DirectoryManager.m_DirPlaces">
6590 <summary>The event subscribers. null if no subcribers</summary>
6591 </member>
6592 <member name="F:OpenMetaverse.DirectoryManager.m_DirPlacesLock">
6593 <summary>Thread sync lock object</summary>
6594 </member>
6595 <member name="F:OpenMetaverse.DirectoryManager.m_DirClassifieds">
6596 <summary>The event subscribers. null if no subcribers</summary>
6597 </member>
6598 <member name="F:OpenMetaverse.DirectoryManager.m_DirClassifiedsLock">
6599 <summary>Thread sync lock object</summary>
6600 </member>
6601 <member name="F:OpenMetaverse.DirectoryManager.m_DirGroups">
6602 <summary>The event subscribers. null if no subcribers</summary>
6603 </member>
6604 <member name="F:OpenMetaverse.DirectoryManager.m_DirGroupsLock">
6605 <summary>Thread sync lock object</summary>
6606 </member>
6607 <member name="F:OpenMetaverse.DirectoryManager.m_DirPeople">
6608 <summary>The event subscribers. null if no subcribers</summary>
6609 </member>
6610 <member name="F:OpenMetaverse.DirectoryManager.m_DirPeopleLock">
6611 <summary>Thread sync lock object</summary>
6612 </member>
6613 <member name="F:OpenMetaverse.DirectoryManager.m_DirLandReply">
6614 <summary>The event subscribers. null if no subcribers</summary>
6615 </member>
6616 <member name="F:OpenMetaverse.DirectoryManager.m_DirLandLock">
6617 <summary>Thread sync lock object</summary>
6618 </member>
6619 <member name="E:OpenMetaverse.DirectoryManager.EventInfoReply">
6620 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.EventInfoRequest(System.UInt32)" /> request.</summary>
6621 </member>
6622 <member name="E:OpenMetaverse.DirectoryManager.DirEventsReply">
6623 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,System.String,System.UInt32,OpenMetaverse.DirectoryManager.EventCategories)" /> request.</summary>
6624 </member>
6625 <member name="E:OpenMetaverse.DirectoryManager.PlacesReply">
6626 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID)" /> request.</summary>
6627 </member>
6628 <member name="E:OpenMetaverse.DirectoryManager.DirPlacesReply">
6629 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.Int32)" /> request.</summary>
6630 </member>
6631 <member name="E:OpenMetaverse.DirectoryManager.DirClassifiedsReply">
6632 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String,OpenMetaverse.DirectoryManager.ClassifiedCategories,OpenMetaverse.DirectoryManager.ClassifiedQueryFlags)" /> request.</summary>
6633 </member>
6634 <member name="E:OpenMetaverse.DirectoryManager.DirGroupsReply">
6635 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32,OpenMetaverse.DirectoryManager.DirFindFlags)" /> request.</summary>
6636 </member>
6637 <member name="E:OpenMetaverse.DirectoryManager.DirPeopleReply">
6638 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)" /> request.</summary>
6639 </member>
6640 <member name="E:OpenMetaverse.DirectoryManager.DirLandReply">
6641 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.DirectoryManager.SearchTypeFlags,System.Int32,System.Int32,System.Int32)" /> request.</summary>
6642 </member>
6643 <member name="M:OpenMetaverse.DirectoryManager.OnEventInfo(OpenMetaverse.EventInfoReplyEventArgs)">
6644 <summary>Raises the EventInfoReply event</summary>
6645 <param name="e">An EventInfoReplyEventArgs object containing the
6646 data returned from the data server</param>
6647 </member>
6648 <member name="M:OpenMetaverse.DirectoryManager.OnDirEvents(OpenMetaverse.DirEventsReplyEventArgs)">
6649 <summary>Raises the DirEventsReply event</summary>
6650 <param name="e">An DirEventsReplyEventArgs object containing the
6651 data returned from the data server</param>
6652 </member>
6653 <member name="M:OpenMetaverse.DirectoryManager.OnPlaces(OpenMetaverse.PlacesReplyEventArgs)">
6654 <summary>Raises the PlacesReply event</summary>
6655 <param name="e">A PlacesReplyEventArgs object containing the
6656 data returned from the data server</param>
6657 </member>
6658 <member name="M:OpenMetaverse.DirectoryManager.OnDirPlaces(OpenMetaverse.DirPlacesReplyEventArgs)">
6659 <summary>Raises the DirPlacesReply event</summary>
6660 <param name="e">A DirPlacesReplyEventArgs object containing the
6661 data returned from the data server</param>
6662 </member>
6663 <member name="M:OpenMetaverse.DirectoryManager.OnDirClassifieds(OpenMetaverse.DirClassifiedsReplyEventArgs)">
6664 <summary>Raises the DirClassifiedsReply event</summary>
6665 <param name="e">A DirClassifiedsReplyEventArgs object containing the
6666 data returned from the data server</param>
6667 </member>
6668 <member name="M:OpenMetaverse.DirectoryManager.OnDirGroups(OpenMetaverse.DirGroupsReplyEventArgs)">
6669 <summary>Raises the DirGroupsReply event</summary>
6670 <param name="e">A DirGroupsReplyEventArgs object containing the
6671 data returned from the data server</param>
6672 </member>
6673 <member name="M:OpenMetaverse.DirectoryManager.OnDirPeople(OpenMetaverse.DirPeopleReplyEventArgs)">
6674 <summary>Raises the DirPeopleReply event</summary>
6675 <param name="e">A DirPeopleReplyEventArgs object containing the
6676 data returned from the data server</param>
6677 </member>
6678 <member name="M:OpenMetaverse.DirectoryManager.OnDirLand(OpenMetaverse.DirLandReplyEventArgs)">
6679 <summary>Raises the DirLandReply event</summary>
6680 <param name="e">A DirLandReplyEventArgs object containing the
6681 data returned from the data server</param>
6682 </member>
6683 <member name="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String)">
6684 <summary>
6685 Query the data server for a list of classified ads containing the specified string.
6686 Defaults to searching for classified placed in any category, and includes PG, Adult and Mature
6687 results.
6688 Responses are sent 16 per response packet, there is no way to know how many results a query reply will contain however assuming
6689 the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received
6690 The <see cref="!:OnClassifiedReply" /> event is raised when a response is received from the simulator
6691 </summary>
6692 <param name="searchText">A string containing a list of keywords to search for</param>
6693 <returns>A UUID to correlate the results when the <see cref="!:OnClassifiedReply" /> event is raised</returns>
6694 </member>
6695 <member name="M:OpenMetaverse.DirectoryManager.StartClassifiedSearch(System.String,OpenMetaverse.DirectoryManager.ClassifiedCategories,OpenMetaverse.DirectoryManager.ClassifiedQueryFlags)">
6696 <summary>
6697 Query the data server for a list of classified ads which contain specified keywords (Overload)
6698 The <see cref="!:OnClassifiedReply" /> event is raised when a response is received from the simulator
6699 </summary>
6700 <param name="searchText">A string containing a list of keywords to search for</param>
6701 <param name="category">The category to search</param>
6702 <param name="queryFlags">A set of flags which can be ORed to modify query options
6703 such as classified maturity rating.</param>
6704 <returns>A UUID to correlate the results when the <see cref="!:OnClassifiedReply" /> event is raised</returns>
6705 <example>
6706 Search classified ads containing the key words "foo" and "bar" in the "Any" category that are either PG or Mature
6707 <code>
6708 UUID searchID = StartClassifiedSearch("foo bar", ClassifiedCategories.Any, ClassifiedQueryFlags.PG | ClassifiedQueryFlags.Mature);
6709 </code></example>
6710 <remarks>
6711 Responses are sent 16 at a time, there is no way to know how many results a query reply will contain however assuming
6712 the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received
6713 </remarks>
6714 </member>
6715 <member name="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,System.Int32)">
6716 <summary>
6717 Starts search for places (Overloaded)
6718 The <see cref="!:OnDirPlacesReply" /> event is raised when a response is received from the simulator
6719 </summary>
6720 <param name="searchText">Search text</param>
6721 <param name="queryStart">Each request is limited to 100 places
6722 being returned. To get the first 100 result entries of a request use 0,
6723 from 100-199 use 1, 200-299 use 2, etc.</param>
6724 <returns>A UUID to correlate the results when the <see cref="!:OnDirPlacesReply" /> event is raised</returns>
6725 </member>
6726 <member name="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.Int32)">
6727 <summary>
6728 Queries the dataserver for parcels of land which are flagged to be shown in search
6729 The <see cref="!:OnDirPlacesReply" /> event is raised when a response is received from the simulator
6730 </summary>
6731 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
6732 <param name="queryFlags">A set of flags which can be ORed to modify query options
6733 such as classified maturity rating.</param>
6734 <param name="category">The category to search</param>
6735 <param name="queryStart">Each request is limited to 100 places
6736 being returned. To get the first 100 result entries of a request use 0,
6737 from 100-199 use 1, 200-299 use 2, etc.</param>
6738 <returns>A UUID to correlate the results when the <see cref="!:OnDirPlacesReply" /> event is raised</returns>
6739 <example>
6740 Search places containing the key words "foo" and "bar" in the "Any" category that are either PG or Adult
6741 <code>
6742 UUID searchID = StartDirPlacesSearch("foo bar", DirFindFlags.DwellSort | DirFindFlags.IncludePG | DirFindFlags.IncludeAdult, ParcelCategory.Any, 0);
6743 </code></example>
6744 <remarks>
6745 Additional information on the results can be obtained by using the ParcelManager.InfoRequest method
6746 </remarks>
6747 </member>
6748 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.SearchTypeFlags)">
6749 <summary>
6750 Starts a search for land sales using the directory
6751 The <see cref="!:OnDirLandReply" /> event is raised when a response is received from the simulator
6752 </summary>
6753 <param name="typeFlags">What type of land to search for. Auction,
6754 estate, mainland, "first land", etc</param>
6755 <remarks>The OnDirLandReply event handler must be registered before
6756 calling this function. There is no way to determine how many
6757 results will be returned, or how many times the callback will be
6758 fired other than you won't get more than 100 total parcels from
6759 each query.</remarks>
6760 </member>
6761 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.SearchTypeFlags,System.Int32,System.Int32,System.Int32)">
6762 <summary>
6763 Starts a search for land sales using the directory
6764 The <seealso cref="!:OnDirLandReply" /> event is raised when a response is received from the simulator
6765 </summary>
6766 <param name="typeFlags">What type of land to search for. Auction,
6767 estate, mainland, "first land", etc</param>
6768 <param name="priceLimit">Maximum price to search for</param>
6769 <param name="areaLimit">Maximum area to search for</param>
6770 <param name="queryStart">Each request is limited to 100 parcels
6771 being returned. To get the first 100 parcels of a request use 0,
6772 from 100-199 use 1, 200-299 use 2, etc.</param>
6773 <remarks>The OnDirLandReply event handler must be registered before
6774 calling this function. There is no way to determine how many
6775 results will be returned, or how many times the callback will be
6776 fired other than you won't get more than 100 total parcels from
6777 each query.</remarks>
6778 </member>
6779 <member name="M:OpenMetaverse.DirectoryManager.StartLandSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.DirectoryManager.SearchTypeFlags,System.Int32,System.Int32,System.Int32)">
6780 <summary>
6781 Send a request to the data server for land sales listings
6782 </summary>
6783 <param name="findFlags">Flags sent to specify query options
6784 Available flags:
6785 Specify the parcel rating with one or more of the following:
6786 IncludePG IncludeMature IncludeAdult
6787 Specify the field to pre sort the results with ONLY ONE of the following:
6788 PerMeterSort NameSort AreaSort PricesSort
6789 Specify the order the results are returned in, if not specified the results are pre sorted in a Descending Order
6790 SortAsc
6791 Specify additional filters to limit the results with one or both of the following:
6792 LimitByPrice LimitByArea
6793 Flags can be combined by separating them with the | (pipe) character
6794 Additional details can be found in <see cref="T:OpenMetaverse.DirectoryManager.DirFindFlags" /></param>
6795 <param name="typeFlags">What type of land to search for. Auction,
6796 Estate or Mainland</param>
6797 <param name="priceLimit">Maximum price to search for when the
6798 DirFindFlags.LimitByPrice flag is specified in findFlags</param>
6799 <param name="areaLimit">Maximum area to search for when the
6800 DirFindFlags.LimitByArea flag is specified in findFlags</param>
6801 <param name="queryStart">Each request is limited to 100 parcels
6802 being returned. To get the first 100 parcels of a request use 0,
6803 from 100-199 use 100, 200-299 use 200, etc.</param>
6804 <remarks>
6805 <para>The <seealso cref="!:OnDirLandReply" /> event will be raised with the response from the simulator
6806 There is no way to determine how many results will be returned, or how many times the callback will be
6807 fired other than you won't get more than 100 total parcels from
6808 each reply.</para>
6809 <para>Any land set for sale to either anybody or specific to the connected agent will be included in the
6810 results if the land is included in the query</para>
6811 </remarks>
6812 <example>
6813 <code>
6814 // request all mainland, any maturity rating that is larger than 512 sq.m
6815 StartLandSearch(DirFindFlags.SortAsc | DirFindFlags.PerMeterSort | DirFindFlags.LimitByArea | DirFindFlags.IncludePG | DirFindFlags.IncludeMature | DirFindFlags.IncludeAdult, SearchTypeFlags.Mainland, 0, 512, 0);
6816 </code>
6817 </example>
6818 </member>
6819 <member name="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32)">
6820 <summary>
6821 Search for Groups
6822 </summary>
6823 <param name="searchText">The name or portion of the name of the group you wish to search for</param>
6824 <param name="queryStart">Start from the match number</param>
6825 <returns>
6826 </returns>
6827 </member>
6828 <member name="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32,OpenMetaverse.DirectoryManager.DirFindFlags)">
6829 <summary>
6830 Search for Groups
6831 </summary>
6832 <param name="searchText">The name or portion of the name of the group you wish to search for</param>
6833 <param name="queryStart">Start from the match number</param>
6834 <param name="flags">Search flags</param>
6835 <returns>
6836 </returns>
6837 </member>
6838 <member name="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)">
6839 <summary>
6840 Search the People directory for other avatars
6841 </summary>
6842 <param name="searchText">The name or portion of the name of the avatar you wish to search for</param>
6843 <param name="queryStart">
6844 </param>
6845 <returns>
6846 </returns>
6847 </member>
6848 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch">
6849 <summary>
6850 Search Places for parcels of land you personally own
6851 </summary>
6852 </member>
6853 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.UUID)">
6854 <summary>
6855 Searches Places for land owned by the specified group
6856 </summary>
6857 <param name="groupID">ID of the group you want to recieve land list for (You must be a member of the group)</param>
6858 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
6859 </member>
6860 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(System.String)">
6861 <summary>
6862 Search the Places directory for parcels that are listed in search and contain the specified keywords
6863 </summary>
6864 <param name="searchText">A string containing the keywords to search for</param>
6865 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
6866 </member>
6867 <member name="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID)">
6868 <summary>
6869 Search Places - All Options
6870 </summary>
6871 <param name="findFlags">One of the Values from the DirFindFlags struct, ie: AgentOwned, GroupOwned, etc.</param>
6872 <param name="searchCategory">One of the values from the SearchCategory Struct, ie: Any, Linden, Newcomer</param>
6873 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
6874 <param name="simulatorName">String Simulator Name to search in</param>
6875 <param name="groupID">LLUID of group you want to recieve results for</param>
6876 <param name="transactionID">Transaction (Query) ID which can be associated with results from your request.</param>
6877 <returns>Transaction (Query) ID which can be associated with results from your request.</returns>
6878 </member>
6879 <member name="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,System.UInt32)">
6880 <summary>
6881 Search All Events with specifid searchText in all categories, includes PG, Mature and Adult
6882 </summary>
6883 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
6884 <param name="queryStart">Each request is limited to 100 entries
6885 being returned. To get the first group of entries of a request use 0,
6886 from 100-199 use 100, 200-299 use 200, etc.</param>
6887 <returns>UUID of query to correlate results in callback.</returns>
6888 </member>
6889 <member name="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,System.String,System.UInt32,OpenMetaverse.DirectoryManager.EventCategories)">
6890 <summary>
6891 Search Events
6892 </summary>
6893 <param name="searchText">A string containing a list of keywords to search for separated by a space character</param>
6894 <param name="queryFlags">One or more of the following flags: DateEvents, IncludePG, IncludeMature, IncludeAdult
6895 from the <see cref="T:OpenMetaverse.DirectoryManager.DirFindFlags" /> Enum
6896 Multiple flags can be combined by separating the flags with the | (pipe) character</param>
6897 <param name="eventDay">"u" for in-progress and upcoming events, -or- number of days since/until event is scheduled
6898 For example "0" = Today, "1" = tomorrow, "2" = following day, "-1" = yesterday, etc.</param>
6899 <param name="queryStart">Each request is limited to 100 entries
6900 being returned. To get the first group of entries of a request use 0,
6901 from 100-199 use 100, 200-299 use 200, etc.</param>
6902 <param name="category">EventCategory event is listed under.</param>
6903 <returns>UUID of query to correlate results in callback.</returns>
6904 </member>
6905 <member name="M:OpenMetaverse.DirectoryManager.EventInfoRequest(System.UInt32)">
6906 <summary>Requests Event Details</summary>
6907 <param name="eventID">ID of Event returned from the <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,System.String,System.UInt32,OpenMetaverse.DirectoryManager.EventCategories)" /> method</param>
6908 </member>
6909 <member name="M:OpenMetaverse.DirectoryManager.DirClassifiedReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6910 <summary>Process an incoming packet and raise the appropriate events</summary>
6911 <param name="sender">The sender</param>
6912 <param name="e">The EventArgs object containing the packet data</param>
6913 </member>
6914 <member name="M:OpenMetaverse.DirectoryManager.DirLandReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6915 <summary>Process an incoming packet and raise the appropriate events</summary>
6916 <param name="sender">The sender</param>
6917 <param name="e">The EventArgs object containing the packet data</param>
6918 </member>
6919 <member name="M:OpenMetaverse.DirectoryManager.DirLandReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
6920 <summary>Process an incoming <see cref="T:OpenMetaverse.Messages.Linden.DirLandReplyMessage" /> event message</summary>
6921 <param name="capsKey">The Unique Capabilities Key</param>
6922 <param name="message">The <see cref="T:OpenMetaverse.Messages.Linden.DirLandReplyMessage" /> event message containing the data</param>
6923 <param name="simulator">The simulator the message originated from</param>
6924 </member>
6925 <member name="M:OpenMetaverse.DirectoryManager.DirPeopleReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6926 <summary>Process an incoming packet and raise the appropriate events</summary>
6927 <param name="sender">The sender</param>
6928 <param name="e">The EventArgs object containing the packet data</param>
6929 </member>
6930 <member name="M:OpenMetaverse.DirectoryManager.DirGroupsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6931 <summary>Process an incoming packet and raise the appropriate events</summary>
6932 <param name="sender">The sender</param>
6933 <param name="e">The EventArgs object containing the packet data</param>
6934 </member>
6935 <member name="M:OpenMetaverse.DirectoryManager.PlacesReplyEventHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
6936 <summary>Process an incoming <see cref="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage" /> event message</summary>
6937 <param name="capsKey">The Unique Capabilities Key</param>
6938 <param name="message">The <see cref="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage" /> event message containing the data</param>
6939 <param name="simulator">The simulator the message originated from</param>
6940 </member>
6941 <member name="M:OpenMetaverse.DirectoryManager.PlacesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6942 <summary>Process an incoming packet and raise the appropriate events</summary>
6943 <param name="sender">The sender</param>
6944 <param name="e">The EventArgs object containing the packet data</param>
6945 </member>
6946 <member name="M:OpenMetaverse.DirectoryManager.EventsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6947 <summary>Process an incoming packet and raise the appropriate events</summary>
6948 <param name="sender">The sender</param>
6949 <param name="e">The EventArgs object containing the packet data</param>
6950 </member>
6951 <member name="M:OpenMetaverse.DirectoryManager.EventInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6952 <summary>Process an incoming packet and raise the appropriate events</summary>
6953 <param name="sender">The sender</param>
6954 <param name="e">The EventArgs object containing the packet data</param>
6955 </member>
6956 <member name="M:OpenMetaverse.DirectoryManager.DirPlacesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
6957 <summary>Process an incoming packet and raise the appropriate events</summary>
6958 <param name="sender">The sender</param>
6959 <param name="e">The EventArgs object containing the packet data</param>
6960 </member>
6961 <member name="T:OpenMetaverse.EventInfoReplyEventArgs"> 8977 <member name="T:OpenMetaverse.EventInfoReplyEventArgs">
6962 <summary>Contains the Event data returned from the data server from an EventInfoRequest</summary> 8978 <summary>Contains the Event data returned from the data server from an EventInfoRequest</summary>
6963 </member> 8979 </member>
@@ -6975,12 +8991,12 @@
6975 </member> 8991 </member>
6976 <member name="M:OpenMetaverse.DirEventsReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.EventsSearchData})"> 8992 <member name="M:OpenMetaverse.DirEventsReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.EventsSearchData})">
6977 <summary>Construct a new instance of the DirEventsReplyEventArgs class</summary> 8993 <summary>Construct a new instance of the DirEventsReplyEventArgs class</summary>
6978 <param name="queryID">The ID of the query returned by the data server. 8994 <param name="queryID">The ID of the query returned by the data server.
6979 This will correlate to the ID returned by the <see cref="!:StartEventsSearch" /> method</param> 8995 This will correlate to the ID returned by the <see cref="!:StartEventsSearch"/> method</param>
6980 <param name="matchedEvents">A list containing the "Events" returned by the search query</param> 8996 <param name="matchedEvents">A list containing the "Events" returned by the search query</param>
6981 </member> 8997 </member>
6982 <member name="P:OpenMetaverse.DirEventsReplyEventArgs.QueryID"> 8998 <member name="P:OpenMetaverse.DirEventsReplyEventArgs.QueryID">
6983 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,System.String,System.UInt32,OpenMetaverse.DirectoryManager.EventCategories)" /></summary> 8999 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartEventsSearch(System.String,System.UInt32)"/></summary>
6984 </member> 9000 </member>
6985 <member name="P:OpenMetaverse.DirEventsReplyEventArgs.MatchedEvents"> 9001 <member name="P:OpenMetaverse.DirEventsReplyEventArgs.MatchedEvents">
6986 <summary>A list of "Events" returned by the data server</summary> 9002 <summary>A list of "Events" returned by the data server</summary>
@@ -6990,12 +9006,12 @@
6990 </member> 9006 </member>
6991 <member name="M:OpenMetaverse.PlacesReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.PlacesSearchData})"> 9007 <member name="M:OpenMetaverse.PlacesReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.PlacesSearchData})">
6992 <summary>Construct a new instance of PlacesReplyEventArgs class</summary> 9008 <summary>Construct a new instance of PlacesReplyEventArgs class</summary>
6993 <param name="queryID">The ID of the query returned by the data server. 9009 <param name="queryID">The ID of the query returned by the data server.
6994 This will correlate to the ID returned by the <see cref="!:StartPlacesSearch" /> method</param> 9010 This will correlate to the ID returned by the <see cref="!:StartPlacesSearch"/> method</param>
6995 <param name="matchedPlaces">A list containing the "Places" returned by the data server query</param> 9011 <param name="matchedPlaces">A list containing the "Places" returned by the data server query</param>
6996 </member> 9012 </member>
6997 <member name="P:OpenMetaverse.PlacesReplyEventArgs.QueryID"> 9013 <member name="P:OpenMetaverse.PlacesReplyEventArgs.QueryID">
6998 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch(OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID)" /></summary> 9014 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartPlacesSearch"/></summary>
6999 </member> 9015 </member>
7000 <member name="P:OpenMetaverse.PlacesReplyEventArgs.MatchedPlaces"> 9016 <member name="P:OpenMetaverse.PlacesReplyEventArgs.MatchedPlaces">
7001 <summary>A list of "Places" returned by the data server</summary> 9017 <summary>A list of "Places" returned by the data server</summary>
@@ -7005,12 +9021,12 @@
7005 </member> 9021 </member>
7006 <member name="M:OpenMetaverse.DirPlacesReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.DirectoryParcel})"> 9022 <member name="M:OpenMetaverse.DirPlacesReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.DirectoryParcel})">
7007 <summary>Construct a new instance of the DirPlacesReplyEventArgs class</summary> 9023 <summary>Construct a new instance of the DirPlacesReplyEventArgs class</summary>
7008 <param name="queryID">The ID of the query returned by the data server. 9024 <param name="queryID">The ID of the query returned by the data server.
7009 This will correlate to the ID returned by the <see cref="!:StartDirPlacesSearch" /> method</param> 9025 This will correlate to the ID returned by the <see cref="!:StartDirPlacesSearch"/> method</param>
7010 <param name="matchedParcels">A list containing land data returned by the data server</param> 9026 <param name="matchedParcels">A list containing land data returned by the data server</param>
7011 </member> 9027 </member>
7012 <member name="P:OpenMetaverse.DirPlacesReplyEventArgs.QueryID"> 9028 <member name="P:OpenMetaverse.DirPlacesReplyEventArgs.QueryID">
7013 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,OpenMetaverse.DirectoryManager.DirFindFlags,OpenMetaverse.ParcelCategory,System.Int32)" /></summary> 9029 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartDirPlacesSearch(System.String,System.Int32)"/></summary>
7014 </member> 9030 </member>
7015 <member name="P:OpenMetaverse.DirPlacesReplyEventArgs.MatchedParcels"> 9031 <member name="P:OpenMetaverse.DirPlacesReplyEventArgs.MatchedParcels">
7016 <summary>A list containing Places data returned by the data server</summary> 9032 <summary>A list containing Places data returned by the data server</summary>
@@ -7030,12 +9046,12 @@
7030 </member> 9046 </member>
7031 <member name="M:OpenMetaverse.DirGroupsReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.GroupSearchData})"> 9047 <member name="M:OpenMetaverse.DirGroupsReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.GroupSearchData})">
7032 <summary>Construct a new instance of the DirGroupsReplyEventArgs class</summary> 9048 <summary>Construct a new instance of the DirGroupsReplyEventArgs class</summary>
7033 <param name="queryID">The ID of the query returned by the data server. 9049 <param name="queryID">The ID of the query returned by the data server.
7034 This will correlate to the ID returned by the <see cref="!:StartGroupSearch" /> method</param> 9050 This will correlate to the ID returned by the <see cref="!:StartGroupSearch"/> method</param>
7035 <param name="matchedGroups">A list of groups data returned by the data server</param> 9051 <param name="matchedGroups">A list of groups data returned by the data server</param>
7036 </member> 9052 </member>
7037 <member name="P:OpenMetaverse.DirGroupsReplyEventArgs.QueryID"> 9053 <member name="P:OpenMetaverse.DirGroupsReplyEventArgs.QueryID">
7038 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32,OpenMetaverse.DirectoryManager.DirFindFlags)" /></summary> 9054 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartGroupSearch(System.String,System.Int32)"/></summary>
7039 </member> 9055 </member>
7040 <member name="P:OpenMetaverse.DirGroupsReplyEventArgs.MatchedGroups"> 9056 <member name="P:OpenMetaverse.DirGroupsReplyEventArgs.MatchedGroups">
7041 <summary>A list containing Groups data returned by the data server</summary> 9057 <summary>A list containing Groups data returned by the data server</summary>
@@ -7045,12 +9061,12 @@
7045 </member> 9061 </member>
7046 <member name="M:OpenMetaverse.DirPeopleReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.AgentSearchData})"> 9062 <member name="M:OpenMetaverse.DirPeopleReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.DirectoryManager.AgentSearchData})">
7047 <summary>Construct a new instance of the DirPeopleReplyEventArgs class</summary> 9063 <summary>Construct a new instance of the DirPeopleReplyEventArgs class</summary>
7048 <param name="queryID">The ID of the query returned by the data server. 9064 <param name="queryID">The ID of the query returned by the data server.
7049 This will correlate to the ID returned by the <see cref="!:StartPeopleSearch" /> method</param> 9065 This will correlate to the ID returned by the <see cref="!:StartPeopleSearch"/> method</param>
7050 <param name="matchedPeople">A list of people data returned by the data server</param> 9066 <param name="matchedPeople">A list of people data returned by the data server</param>
7051 </member> 9067 </member>
7052 <member name="P:OpenMetaverse.DirPeopleReplyEventArgs.QueryID"> 9068 <member name="P:OpenMetaverse.DirPeopleReplyEventArgs.QueryID">
7053 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)" /></summary> 9069 <summary>The ID returned by <see cref="M:OpenMetaverse.DirectoryManager.StartPeopleSearch(System.String,System.Int32)"/></summary>
7054 </member> 9070 </member>
7055 <member name="P:OpenMetaverse.DirPeopleReplyEventArgs.MatchedPeople"> 9071 <member name="P:OpenMetaverse.DirPeopleReplyEventArgs.MatchedPeople">
7056 <summary>A list containing People data returned by the data server</summary> 9072 <summary>A list containing People data returned by the data server</summary>
@@ -7065,732 +9081,619 @@
7065 <member name="P:OpenMetaverse.DirLandReplyEventArgs.DirParcels"> 9081 <member name="P:OpenMetaverse.DirLandReplyEventArgs.DirParcels">
7066 <summary>A list containing land forsale data returned by the data server</summary> 9082 <summary>A list containing land forsale data returned by the data server</summary>
7067 </member> 9083 </member>
7068 <member name="T:OpenMetaverse.DownloadRequest"> 9084 <member name="T:OpenMetaverse.Interfaces.IMessage">
7069 <summary> 9085 <summary>
7070 Represends individual HTTP Download request 9086 Interface requirements for Messaging system
7071 </summary> 9087 </summary>
7072 </member> 9088 </member>
7073 <member name="M:OpenMetaverse.DownloadRequest.#ctor"> 9089 <member name="F:OpenMetaverse.Imaging.ManagedImage.Width">
7074 <summary>Default constructor</summary>
7075 </member>
7076 <member name="M:OpenMetaverse.DownloadRequest.#ctor(System.Uri,System.Int32,System.String,OpenMetaverse.Http.CapsBase.DownloadProgressEventHandler,OpenMetaverse.Http.CapsBase.RequestCompletedEventHandler)">
7077 <summary>Constructor</summary>
7078 </member>
7079 <member name="F:OpenMetaverse.DownloadRequest.Address">
7080 <summary>URI of the item to fetch</summary>
7081 </member>
7082 <member name="F:OpenMetaverse.DownloadRequest.MillisecondsTimeout">
7083 <summary>Timout specified in milliseconds</summary>
7084 </member>
7085 <member name="F:OpenMetaverse.DownloadRequest.DownloadProgressCallback">
7086 <summary>Download progress callback</summary>
7087 </member>
7088 <member name="F:OpenMetaverse.DownloadRequest.CompletedCallback">
7089 <summary>Download completed callback</summary>
7090 </member>
7091 <member name="F:OpenMetaverse.DownloadRequest.ContentType">
7092 <summary>Accept the following content type</summary>
7093 </member>
7094 <member name="T:OpenMetaverse.DownloadManager">
7095 <summary> 9090 <summary>
7096 Manages async HTTP downloads with a limit on maximum 9091 Image width
7097 concurrent downloads
7098 </summary> 9092 </summary>
7099 </member> 9093 </member>
7100 <member name="M:OpenMetaverse.DownloadManager.#ctor"> 9094 <member name="F:OpenMetaverse.Imaging.ManagedImage.Height">
7101 <summary>Default constructor</summary>
7102 </member>
7103 <member name="P:OpenMetaverse.DownloadManager.ParallelDownloads">
7104 <summary>Maximum number of parallel downloads from a single endpoint</summary>
7105 </member>
7106 <member name="P:OpenMetaverse.DownloadManager.ClientCert">
7107 <summary>Client certificate</summary>
7108 </member>
7109 <member name="M:OpenMetaverse.DownloadManager.Dispose">
7110 <summary>Cleanup method</summary>
7111 </member>
7112 <member name="M:OpenMetaverse.DownloadManager.SetupRequest(System.Uri,System.String)">
7113 <summary>Setup http download request</summary>
7114 </member>
7115 <member name="M:OpenMetaverse.DownloadManager.EnqueuePending">
7116 <summary>Check the queue for pending work</summary>
7117 </member>
7118 <member name="M:OpenMetaverse.DownloadManager.QueueDownlad(OpenMetaverse.DownloadRequest)">
7119 <summary>Enqueue a new HTPP download</summary>
7120 </member>
7121 <member name="T:OpenMetaverse.EstateTask">
7122 <summary>Describes tasks returned in LandStatReply</summary>
7123 </member>
7124 <member name="T:OpenMetaverse.EstateTools">
7125 <summary> 9095 <summary>
7126 Estate level administration and utilities 9096 Image height
7127 </summary> 9097 </summary>
7128 </member> 9098 </member>
7129 <member name="M:OpenMetaverse.EstateTools.#ctor(OpenMetaverse.GridClient)"> 9099 <member name="F:OpenMetaverse.Imaging.ManagedImage.Channels">
7130 <summary> 9100 <summary>
7131 Constructor for EstateTools class 9101 Image channel flags
7132 </summary> 9102 </summary>
7133 <param name="client">
7134 </param>
7135 </member>
7136 <member name="T:OpenMetaverse.EstateTools.LandStatReportType">
7137 <summary>Used in the ReportType field of a LandStatRequest</summary>
7138 </member>
7139 <member name="T:OpenMetaverse.EstateTools.EstateAccessDelta">
7140 <summary>Used by EstateOwnerMessage packets</summary>
7141 </member> 9103 </member>
7142 <member name="T:OpenMetaverse.EstateTools.EstateAccessReplyDelta"> 9104 <member name="F:OpenMetaverse.Imaging.ManagedImage.Red">
7143 <summary>Used by EstateOwnerMessage packets</summary>
7144 </member>
7145 <member name="T:OpenMetaverse.EstateTools.EstateReturnFlags">
7146 <summary> 9105 <summary>
9106 Red channel data
7147 </summary> 9107 </summary>
7148 </member> 9108 </member>
7149 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.None"> 9109 <member name="F:OpenMetaverse.Imaging.ManagedImage.Green">
7150 <summary>No flags set</summary> 9110 <summary>
7151 </member> 9111 Green channel data
7152 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnScripted"> 9112 </summary>
7153 <summary>Only return targets scripted objects</summary>
7154 </member>
7155 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnOnOthersLand">
7156 <summary>Only return targets objects if on others land</summary>
7157 </member>
7158 <member name="F:OpenMetaverse.EstateTools.EstateReturnFlags.ReturnScriptedAndOnOthers">
7159 <summary>Returns target's scripted objects and objects on other parcels</summary>
7160 </member>
7161 <member name="T:OpenMetaverse.EstateTools.GroundTextureSettings">
7162 <summary>Ground texture settings for each corner of the region</summary>
7163 </member>
7164 <member name="T:OpenMetaverse.EstateTools.GroundTextureHeight">
7165 <summary>Used by GroundTextureHeightSettings</summary>
7166 </member>
7167 <member name="T:OpenMetaverse.EstateTools.GroundTextureHeightSettings">
7168 <summary>The high and low texture thresholds for each corner of the sim</summary>
7169 </member>
7170 <member name="F:OpenMetaverse.EstateTools.GroundTextures">
7171 <summary>Textures for each of the four terrain height levels</summary>
7172 </member>
7173 <member name="F:OpenMetaverse.EstateTools.GroundTextureLimits">
7174 <summary>Upper/lower texture boundaries for each corner of the sim</summary>
7175 </member>
7176 <member name="F:OpenMetaverse.EstateTools.m_TopCollidersReply">
7177 <summary>The event subscribers. null if no subcribers</summary>
7178 </member>
7179 <member name="F:OpenMetaverse.EstateTools.m_TopCollidersReply_Lock">
7180 <summary>Thread sync lock object</summary>
7181 </member>
7182 <member name="F:OpenMetaverse.EstateTools.m_TopScriptsReply">
7183 <summary>The event subscribers. null if no subcribers</summary>
7184 </member>
7185 <member name="F:OpenMetaverse.EstateTools.m_TopScriptsReply_Lock">
7186 <summary>Thread sync lock object</summary>
7187 </member>
7188 <member name="F:OpenMetaverse.EstateTools.m_EstateUsersReply">
7189 <summary>The event subscribers. null if no subcribers</summary>
7190 </member>
7191 <member name="F:OpenMetaverse.EstateTools.m_EstateUsersReply_Lock">
7192 <summary>Thread sync lock object</summary>
7193 </member>
7194 <member name="F:OpenMetaverse.EstateTools.m_EstateGroupsReply">
7195 <summary>The event subscribers. null if no subcribers</summary>
7196 </member>
7197 <member name="F:OpenMetaverse.EstateTools.m_EstateGroupsReply_Lock">
7198 <summary>Thread sync lock object</summary>
7199 </member>
7200 <member name="F:OpenMetaverse.EstateTools.m_EstateManagersReply">
7201 <summary>The event subscribers. null if no subcribers</summary>
7202 </member>
7203 <member name="F:OpenMetaverse.EstateTools.m_EstateManagersReply_Lock">
7204 <summary>Thread sync lock object</summary>
7205 </member>
7206 <member name="F:OpenMetaverse.EstateTools.m_EstateBansReply">
7207 <summary>The event subscribers. null if no subcribers</summary>
7208 </member>
7209 <member name="F:OpenMetaverse.EstateTools.m_EstateBansReply_Lock">
7210 <summary>Thread sync lock object</summary>
7211 </member>
7212 <member name="F:OpenMetaverse.EstateTools.m_EstateCovenantReply">
7213 <summary>The event subscribers. null if no subcribers</summary>
7214 </member>
7215 <member name="F:OpenMetaverse.EstateTools.m_EstateCovenantReply_Lock">
7216 <summary>Thread sync lock object</summary>
7217 </member>
7218 <member name="F:OpenMetaverse.EstateTools.m_EstateUpdateInfoReply">
7219 <summary>The event subscribers. null if no subcribers</summary>
7220 </member>
7221 <member name="F:OpenMetaverse.EstateTools.m_EstateUpdateInfoReply_Lock">
7222 <summary>Thread sync lock object</summary>
7223 </member>
7224 <member name="E:OpenMetaverse.EstateTools.TopCollidersReply">
7225 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary>
7226 </member>
7227 <member name="E:OpenMetaverse.EstateTools.TopScriptsReply">
7228 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary>
7229 </member>
7230 <member name="E:OpenMetaverse.EstateTools.EstateUsersReply">
7231 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary>
7232 </member>
7233 <member name="E:OpenMetaverse.EstateTools.EstateGroupsReply">
7234 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary>
7235 </member> 9113 </member>
7236 <member name="E:OpenMetaverse.EstateTools.EstateManagersReply"> 9114 <member name="F:OpenMetaverse.Imaging.ManagedImage.Blue">
7237 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary> 9115 <summary>
9116 Blue channel data
9117 </summary>
7238 </member> 9118 </member>
7239 <member name="E:OpenMetaverse.EstateTools.EstateBansReply"> 9119 <member name="F:OpenMetaverse.Imaging.ManagedImage.Alpha">
7240 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary> 9120 <summary>
9121 Alpha channel data
9122 </summary>
7241 </member> 9123 </member>
7242 <member name="E:OpenMetaverse.EstateTools.EstateCovenantReply"> 9124 <member name="F:OpenMetaverse.Imaging.ManagedImage.Bump">
7243 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary> 9125 <summary>
9126 Bump channel data
9127 </summary>
7244 </member> 9128 </member>
7245 <member name="E:OpenMetaverse.EstateTools.EstateUpdateInfoReply"> 9129 <member name="M:OpenMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,OpenMetaverse.Imaging.ManagedImage.ImageChannels)">
7246 <summary>Raised when the data server responds to a <see cref="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)" /> request.</summary> 9130 <summary>
9131 Create a new blank image
9132 </summary>
9133 <param name="width">width</param>
9134 <param name="height">height</param>
9135 <param name="channels">channel flags</param>
7247 </member> 9136 </member>
7248 <member name="M:OpenMetaverse.EstateTools.OnTopCollidersReply(OpenMetaverse.TopCollidersReplyEventArgs)"> 9137 <member name="M:OpenMetaverse.Imaging.ManagedImage.#ctor(System.Drawing.Bitmap)">
7249 <summary>Raises the TopCollidersReply event</summary> 9138 <summary>
7250 <param name="e">A TopCollidersReplyEventArgs object containing the 9139
7251 data returned from the data server</param> 9140 </summary>
9141 <param name="bitmap"></param>
7252 </member> 9142 </member>
7253 <member name="M:OpenMetaverse.EstateTools.OnTopScriptsReply(OpenMetaverse.TopScriptsReplyEventArgs)"> 9143 <member name="M:OpenMetaverse.Imaging.ManagedImage.ConvertChannels(OpenMetaverse.Imaging.ManagedImage.ImageChannels)">
7254 <summary>Raises the TopScriptsReply event</summary> 9144 <summary>
7255 <param name="e">A TopScriptsReplyEventArgs object containing the 9145 Convert the channels in the image. Channels are created or destroyed as required.
7256 data returned from the data server</param> 9146 </summary>
9147 <param name="channels">new channel flags</param>
7257 </member> 9148 </member>
7258 <member name="M:OpenMetaverse.EstateTools.OnEstateUsersReply(OpenMetaverse.EstateUsersReplyEventArgs)"> 9149 <member name="M:OpenMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)">
7259 <summary>Raises the EstateUsersReply event</summary> 9150 <summary>
7260 <param name="e">A EstateUsersReplyEventArgs object containing the 9151 Resize or stretch the image using nearest neighbor (ugly) resampling
7261 data returned from the data server</param> 9152 </summary>
9153 <param name="width">new width</param>
9154 <param name="height">new height</param>
7262 </member> 9155 </member>
7263 <member name="M:OpenMetaverse.EstateTools.OnEstateGroupsReply(OpenMetaverse.EstateGroupsReplyEventArgs)"> 9156 <member name="M:OpenMetaverse.Imaging.ManagedImage.ExportRaw">
7264 <summary>Raises the EstateGroupsReply event</summary> 9157 <summary>
7265 <param name="e">A EstateGroupsReplyEventArgs object containing the 9158 Create a byte array containing 32-bit RGBA data with a bottom-left
7266 data returned from the data server</param> 9159 origin, suitable for feeding directly into OpenGL
9160 </summary>
9161 <returns>A byte array containing raw texture data</returns>
7267 </member> 9162 </member>
7268 <member name="M:OpenMetaverse.EstateTools.OnEstateManagersReply(OpenMetaverse.EstateManagersReplyEventArgs)"> 9163 <member name="T:OpenMetaverse.Assets.AssetMutable">
7269 <summary>Raises the EstateManagersReply event</summary> 9164 <summary>
7270 <param name="e">A EstateManagersReplyEventArgs object containing the 9165 Represents an Animation
7271 data returned from the data server</param> 9166 </summary>
7272 </member> 9167 </member>
7273 <member name="M:OpenMetaverse.EstateTools.OnEstateBansReply(OpenMetaverse.EstateBansReplyEventArgs)"> 9168 <member name="M:OpenMetaverse.Assets.AssetMutable.#ctor(OpenMetaverse.AssetType)">
7274 <summary>Raises the EstateBansReply event</summary> 9169 <summary>Default Constructor</summary>
7275 <param name="e">A EstateBansReplyEventArgs object containing the
7276 data returned from the data server</param>
7277 </member> 9170 </member>
7278 <member name="M:OpenMetaverse.EstateTools.OnEstateCovenantReply(OpenMetaverse.EstateCovenantReplyEventArgs)"> 9171 <member name="M:OpenMetaverse.Assets.AssetMutable.#ctor(OpenMetaverse.AssetType,OpenMetaverse.UUID,System.Byte[])">
7279 <summary>Raises the EstateCovenantReply event</summary> 9172 <summary>
7280 <param name="e">A EstateCovenantReplyEventArgs object containing the 9173 Construct an Asset object of type Animation
7281 data returned from the data server</param> 9174 </summary>
9175 <param name="type">Asset type</param>
9176 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
9177 <param name="assetData">A byte array containing the raw asset data</param>
7282 </member> 9178 </member>
7283 <member name="M:OpenMetaverse.EstateTools.OnEstateUpdateInfoReply(OpenMetaverse.EstateUpdateInfoReplyEventArgs)"> 9179 <member name="P:OpenMetaverse.Assets.AssetMutable.AssetType">
7284 <summary>Raises the EstateUpdateInfoReply event</summary> 9180 <summary>Override the base classes AssetType</summary>
7285 <param name="e">A EstateUpdateInfoReplyEventArgs object containing the
7286 data returned from the data server</param>
7287 </member> 9181 </member>
7288 <member name="M:OpenMetaverse.EstateTools.LandStatRequest(System.Int32,OpenMetaverse.EstateTools.LandStatReportType,System.UInt32,System.String)"> 9182 <member name="T:OpenMetaverse.Assets.AssetLandmark">
7289 <summary> 9183 <summary>
7290 Requests estate information such as top scripts and colliders 9184 Represents a Landmark with RegionID and Position vector
7291 </summary> 9185 </summary>
7292 <param name="parcelLocalID">
7293 </param>
7294 <param name="reportType">
7295 </param>
7296 <param name="requestFlags">
7297 </param>
7298 <param name="filter">
7299 </param>
7300 </member> 9186 </member>
7301 <member name="M:OpenMetaverse.EstateTools.RequestInfo"> 9187 <member name="F:OpenMetaverse.Assets.AssetLandmark.RegionID">
7302 <summary>Requests estate settings, including estate manager and access/ban lists</summary> 9188 <summary>UUID of the Landmark target region</summary>
7303 </member> 9189 </member>
7304 <member name="M:OpenMetaverse.EstateTools.RequestTopScripts"> 9190 <member name="F:OpenMetaverse.Assets.AssetLandmark.Position">
7305 <summary>Requests the "Top Scripts" list for the current region</summary> 9191 <summary> Local position of the target </summary>
7306 </member> 9192 </member>
7307 <member name="M:OpenMetaverse.EstateTools.RequestTopColliders"> 9193 <member name="M:OpenMetaverse.Assets.AssetLandmark.#ctor">
7308 <summary>Requests the "Top Colliders" list for the current region</summary> 9194 <summary>Construct an Asset of type Landmark</summary>
7309 </member> 9195 </member>
7310 <member name="M:OpenMetaverse.EstateTools.SetTerrainVariables(System.Single,System.Single,System.Single,System.Boolean,System.Boolean,System.Single)"> 9196 <member name="M:OpenMetaverse.Assets.AssetLandmark.#ctor(OpenMetaverse.UUID,System.Byte[])">
7311 <summary> 9197 <summary>
7312 Set several estate specific configuration variables 9198 Construct an Asset object of type Landmark
7313 </summary> 9199 </summary>
7314 <param name="WaterHeight">The Height of the waterlevel over the entire estate. Defaults to 20</param> 9200 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
7315 <param name="TerrainRaiseLimit">The maximum height change allowed above the baked terrain. Defaults to 4</param> 9201 <param name="assetData">A byte array containing the raw asset data</param>
7316 <param name="TerrainLowerLimit">The minimum height change allowed below the baked terrain. Defaults to -4</param>
7317 <param name="UseEstateSun">true to use</param>
7318 <param name="FixedSun">if True forces the sun position to the position in SunPosition</param>
7319 <param name="SunPosition">The current position of the sun on the estate, or when FixedSun is true the static position
7320 the sun will remain. <remarks>6.0 = Sunrise, 30.0 = Sunset</remarks></param>
7321 </member> 9202 </member>
7322 <member name="M:OpenMetaverse.EstateTools.SimWideReturn(OpenMetaverse.UUID,OpenMetaverse.EstateTools.EstateReturnFlags,System.Boolean)"> 9203 <member name="M:OpenMetaverse.Assets.AssetLandmark.Encode">
7323 <summary> 9204 <summary>
7324 Request return of objects owned by specified avatar 9205 Encode the raw contents of a string with the specific Landmark format
7325 </summary> 9206 </summary>
7326 <param name="Target">The Agents <see cref="T:OpenMetaverse.UUID" /> owning the primitives to return</param>
7327 <param name="flag">specify the coverage and type of objects to be included in the return</param>
7328 <param name="EstateWide">true to perform return on entire estate</param>
7329 </member> 9207 </member>
7330 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessage(System.String,System.String)"> 9208 <member name="M:OpenMetaverse.Assets.AssetLandmark.Decode">
7331 <summary> 9209 <summary>
9210 Decode the raw asset data, populating the RegionID and Position
7332 </summary> 9211 </summary>
7333 <param name="method"> 9212 <returns>true if the AssetData was successfully decoded to a UUID and Vector</returns>
7334 </param>
7335 <param name="param">
7336 </param>
7337 </member> 9213 </member>
7338 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessage(System.String,System.Collections.Generic.List{System.String})"> 9214 <member name="P:OpenMetaverse.Assets.AssetLandmark.AssetType">
9215 <summary>Override the base classes AssetType</summary>
9216 </member>
9217 <member name="T:ThreadUtil">
7339 <summary> 9218 <summary>
7340 Used for setting and retrieving various estate panel settings 9219
7341 </summary> 9220 </summary>
7342 <param name="method">EstateOwnerMessage Method field</param>
7343 <param name="listParams">List of parameters to include</param>
7344 </member> 9221 </member>
7345 <member name="M:OpenMetaverse.EstateTools.KickUser(OpenMetaverse.UUID)"> 9222 <member name="F:ThreadUtil.wrapperInstance">
7346 <summary> 9223 <summary>
7347 Kick an avatar from an estate 9224 An instance of DelegateWrapper which calls InvokeWrappedDelegate,
9225 which in turn calls the DynamicInvoke method of the wrapped
9226 delegate
7348 </summary> 9227 </summary>
7349 <param name="userID">Key of Agent to remove</param>
7350 </member> 9228 </member>
7351 <member name="M:OpenMetaverse.EstateTools.BanUser(OpenMetaverse.UUID,System.Boolean)"> 9229 <member name="F:ThreadUtil.callback">
7352 <summary> 9230 <summary>
7353 Ban an avatar from an estate</summary> 9231 Callback used to call EndInvoke on the asynchronously
7354 <param name="userID">Key of Agent to remove</param> 9232 invoked DelegateWrapper
7355 <param name="allEstates">Ban user from this estate and all others owned by the estate owner</param> 9233 </summary>
7356 </member> 9234 </member>
7357 <member name="M:OpenMetaverse.EstateTools.UnbanUser(OpenMetaverse.UUID,System.Boolean)"> 9235 <member name="M:ThreadUtil.FireAndForget(System.Delegate,System.Object[])">
7358 <summary>Unban an avatar from an estate</summary>
7359 <param name="userID">Key of Agent to remove</param>
7360 /// <param name="allEstates">Unban user from this estate and all others owned by the estate owner</param></member>
7361 <member name="M:OpenMetaverse.EstateTools.EstateMessage(System.String)">
7362 <summary> 9236 <summary>
7363 Send a message dialog to everyone in an entire estate 9237 Executes the specified delegate with the specified arguments
9238 asynchronously on a thread pool thread
7364 </summary> 9239 </summary>
7365 <param name="message">Message to send all users in the estate</param> 9240 <param name="d"></param>
9241 <param name="args"></param>
7366 </member> 9242 </member>
7367 <member name="M:OpenMetaverse.EstateTools.SimulatorMessage(System.String)"> 9243 <member name="M:ThreadUtil.InvokeWrappedDelegate(System.Delegate,System.Object[])">
7368 <summary> 9244 <summary>
7369 Send a message dialog to everyone in a simulator 9245 Invokes the wrapped delegate synchronously
7370 </summary> 9246 </summary>
7371 <param name="message">Message to send all users in the simulator</param> 9247 <param name="d"></param>
9248 <param name="args"></param>
7372 </member> 9249 </member>
7373 <member name="M:OpenMetaverse.EstateTools.TeleportHomeUser(OpenMetaverse.UUID)"> 9250 <member name="M:ThreadUtil.EndWrapperInvoke(System.IAsyncResult)">
7374 <summary> 9251 <summary>
7375 Send an avatar back to their home location 9252 Calls EndInvoke on the wrapper and Close on the resulting WaitHandle
9253 to prevent resource leaks
7376 </summary> 9254 </summary>
7377 <param name="pest">Key of avatar to send home</param> 9255 <param name="ar"></param>
7378 </member> 9256 </member>
7379 <member name="M:OpenMetaverse.EstateTools.RestartRegion"> 9257 <member name="T:ThreadUtil.DelegateWrapper">
7380 <summary> 9258 <summary>
7381 Begin the region restart process 9259 Delegate to wrap another delegate and its arguments
7382 </summary> 9260 </summary>
9261 <param name="d"></param>
9262 <param name="args"></param>
7383 </member> 9263 </member>
7384 <member name="M:OpenMetaverse.EstateTools.CancelRestart"> 9264 <member name="T:OpenMetaverse.TextureRequestState">
7385 <summary> 9265 <summary>
7386 Cancels a region restart 9266 The current status of a texture request as it moves through the pipeline or final result of a texture request.
7387 </summary> 9267 </summary>
7388 </member> 9268 </member>
7389 <member name="M:OpenMetaverse.EstateTools.SetRegionInfo(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Single,System.Single,System.Boolean)"> 9269 <member name="F:OpenMetaverse.TextureRequestState.Pending">
7390 <summary>Estate panel "Region" tab settings</summary> 9270 <summary>The initial state given to a request. Requests in this state
9271 are waiting for an available slot in the pipeline</summary>
7391 </member> 9272 </member>
7392 <member name="M:OpenMetaverse.EstateTools.SetRegionDebug(System.Boolean,System.Boolean,System.Boolean)"> 9273 <member name="F:OpenMetaverse.TextureRequestState.Started">
7393 <summary>Estate panel "Debug" tab settings</summary> 9274 <summary>A request that has been added to the pipeline and the request packet
9275 has been sent to the simulator</summary>
7394 </member> 9276 </member>
7395 <member name="M:OpenMetaverse.EstateTools.SetRegionTerrain(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)"> 9277 <member name="F:OpenMetaverse.TextureRequestState.Progress">
7396 <summary>Used for setting the region's terrain textures for its four height levels</summary> 9278 <summary>A request that has received one or more packets back from the simulator</summary>
7397 <param name="low">
7398 </param>
7399 <param name="midLow">
7400 </param>
7401 <param name="midHigh">
7402 </param>
7403 <param name="high">
7404 </param>
7405 </member> 9279 </member>
7406 <member name="M:OpenMetaverse.EstateTools.SetRegionTerrainHeights(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)"> 9280 <member name="F:OpenMetaverse.TextureRequestState.Finished">
7407 <summary>Used for setting sim terrain texture heights</summary> 9281 <summary>A request that has received all packets back from the simulator</summary>
7408 </member> 9282 </member>
7409 <member name="M:OpenMetaverse.EstateTools.RequestCovenant"> 9283 <member name="F:OpenMetaverse.TextureRequestState.Timeout">
7410 <summary>Requests the estate covenant</summary> 9284 <summary>A request that has taken longer than <seealso cref="F:OpenMetaverse.Settings.PIPELINE_REQUEST_TIMEOUT"/>
9285 to download OR the initial packet containing the packet information was never received</summary>
7411 </member> 9286 </member>
7412 <member name="M:OpenMetaverse.EstateTools.UploadTerrain(System.Byte[],System.String)"> 9287 <member name="F:OpenMetaverse.TextureRequestState.Aborted">
7413 <summary> 9288 <summary>The texture request was aborted by request of the agent</summary>
7414 Upload a terrain RAW file
7415 </summary>
7416 <param name="fileData">A byte array containing the encoded terrain data</param>
7417 <param name="fileName">The name of the file being uploaded</param>
7418 <returns>The Id of the transfer request</returns>
7419 </member> 9289 </member>
7420 <member name="M:OpenMetaverse.EstateTools.TeleportHomeAllUsers"> 9290 <member name="F:OpenMetaverse.TextureRequestState.NotFound">
7421 <summary> 9291 <summary>The simulator replied to the request that it was not able to find the requested texture</summary>
7422 Teleports all users home in current Estate
7423 </summary>
7424 </member> 9292 </member>
7425 <member name="M:OpenMetaverse.EstateTools.RemoveEstateManager(OpenMetaverse.UUID,System.Boolean)"> 9293 <member name="T:OpenMetaverse.TextureDownloadCallback">
7426 <summary> 9294 <summary>
7427 Remove estate manager</summary> 9295 A callback fired to indicate the status or final state of the requested texture. For progressive
7428 <param name="userID">Key of Agent to Remove</param> 9296 downloads this will fire each time new asset data is returned from the simulator.
7429 <param name="allEstates">removes manager to this estate and all others owned by the estate owner</param> 9297 </summary>
9298 <param name="state">The <see cref="T:OpenMetaverse.TextureRequestState"/> indicating either Progress for textures not fully downloaded,
9299 or the final result of the request after it has been processed through the TexturePipeline</param>
9300 <param name="assetTexture">The <see cref="T:OpenMetaverse.Assets.AssetTexture"/> object containing the Assets ID, raw data
9301 and other information. For progressive rendering the <see cref="F:OpenMetaverse.Assets.Asset.AssetData"/> will contain
9302 the data from the beginning of the file. For failed, aborted and timed out requests it will contain
9303 an empty byte array.</param>
7430 </member> 9304 </member>
7431 <member name="M:OpenMetaverse.EstateTools.AddEstateManager(OpenMetaverse.UUID,System.Boolean)"> 9305 <member name="T:OpenMetaverse.TexturePipeline">
7432 <summary> 9306 <summary>
7433 Add estate manager</summary> 9307 Texture request download handler, allows a configurable number of download slots which manage multiple
7434 <param name="userID">Key of Agent to Add</param> 9308 concurrent texture downloads from the <seealso cref="T:OpenMetaverse.Simulator"/>
7435 <param name="allEstates">Add agent as manager to this estate and all others owned by the estate owner</param> 9309 </summary>
9310 <remarks>This class makes full use of the internal <seealso cref="!:TextureCache"/>
9311 system for full texture downloads.</remarks>
7436 </member> 9312 </member>
7437 <member name="M:OpenMetaverse.EstateTools.AddAllowedUser(OpenMetaverse.UUID,System.Boolean)"> 9313 <member name="F:OpenMetaverse.TexturePipeline._Transfers">
7438 <summary> 9314 <summary>A dictionary containing all pending and in-process transfer requests where the Key is both the RequestID
7439 Add's an agent to the estate Allowed list</summary> 9315 and also the Asset Texture ID, and the value is an object containing the current state of the request and also
7440 <param name="userID">Key of Agent to Add</param> 9316 the asset data as it is being re-assembled</summary>
7441 <param name="allEstates">Add agent as an allowed reisdent to All estates if true</param>
7442 </member> 9317 </member>
7443 <member name="M:OpenMetaverse.EstateTools.RemoveAllowedUser(OpenMetaverse.UUID,System.Boolean)"> 9318 <member name="F:OpenMetaverse.TexturePipeline._Client">
7444 <summary> 9319 <summary>Holds the reference to the <see cref="T:OpenMetaverse.GridClient"/> client object</summary>
7445 Removes an agent from the estate Allowed list</summary>
7446 <param name="userID">Key of Agent to Remove</param>
7447 <param name="allEstates">Removes agent as an allowed reisdent from All estates if true</param>
7448 </member> 9320 </member>
7449 <member name="M:OpenMetaverse.EstateTools.AddAllowedGroup(OpenMetaverse.UUID,System.Boolean)"> 9321 <member name="F:OpenMetaverse.TexturePipeline.maxTextureRequests">
7450 <summary> 9322 <summary>Maximum concurrent texture requests allowed at a time</summary>
7451 Add's a group to the estate Allowed list</summary>
7452 <param name="groupID">Key of Group to Add</param>
7453 <param name="allEstates">Add Group as an allowed group to All estates if true</param>
7454 </member> 9323 </member>
7455 <member name="M:OpenMetaverse.EstateTools.RemoveAllowedGroup(OpenMetaverse.UUID,System.Boolean)"> 9324 <member name="F:OpenMetaverse.TexturePipeline.resetEvents">
7456 <summary> 9325 <summary>An array of <see cref="T:System.Threading.AutoResetEvent"/> objects used to manage worker request threads</summary>
7457 Removes a group from the estate Allowed list</summary>
7458 <param name="groupID">Key of Group to Remove</param>
7459 <param name="allEstates">Removes Group as an allowed Group from All estates if true</param>
7460 </member> 9326 </member>
7461 <member name="M:OpenMetaverse.EstateTools.EstateCovenantReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 9327 <member name="F:OpenMetaverse.TexturePipeline.threadpoolSlots">
7462 <summary>Process an incoming packet and raise the appropriate events</summary> 9328 <summary>An array of worker slots which shows the availablity status of the slot</summary>
7463 <param name="sender">The sender</param>
7464 <param name="e">The EventArgs object containing the packet data</param>
7465 </member> 9329 </member>
7466 <member name="M:OpenMetaverse.EstateTools.EstateOwnerMessageHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 9330 <member name="F:OpenMetaverse.TexturePipeline.downloadMaster">
7467 <summary>Process an incoming packet and raise the appropriate events</summary> 9331 <summary>The primary thread which manages the requests.</summary>
7468 <param name="sender">The sender</param>
7469 <param name="e">The EventArgs object containing the packet data</param>
7470 </member> 9332 </member>
7471 <member name="M:OpenMetaverse.EstateTools.LandStatReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 9333 <member name="F:OpenMetaverse.TexturePipeline._Running">
7472 <summary>Process an incoming packet and raise the appropriate events</summary> 9334 <summary>true if the TexturePipeline is currently running</summary>
7473 <param name="sender">The sender</param>
7474 <param name="e">The EventArgs object containing the packet data</param>
7475 </member> 9335 </member>
7476 <member name="T:OpenMetaverse.TopCollidersReplyEventArgs"> 9336 <member name="F:OpenMetaverse.TexturePipeline.lockerObject">
7477 <summary>Raised on LandStatReply when the report type is for "top colliders"</summary> 9337 <summary>A synchronization object used by the primary thread</summary>
7478 </member> 9338 </member>
7479 <member name="M:OpenMetaverse.TopCollidersReplyEventArgs.#ctor(System.Int32,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.EstateTask})"> 9339 <member name="F:OpenMetaverse.TexturePipeline.RefreshDownloadsTimer">
7480 <summary>Construct a new instance of the TopCollidersReplyEventArgs class</summary> 9340 <summary>A refresh timer used to increase the priority of stalled requests</summary>
7481 <param name="objectCount">The number of returned items in LandStatReply</param>
7482 <param name="tasks">Dictionary of Object UUIDs to tasks returned in LandStatReply</param>
7483 </member> 9341 </member>
7484 <member name="P:OpenMetaverse.TopCollidersReplyEventArgs.ObjectCount"> 9342 <member name="M:OpenMetaverse.TexturePipeline.#ctor(OpenMetaverse.GridClient)">
7485 <summary> 9343 <summary>
7486 The number of returned items in LandStatReply 9344 Default constructor, Instantiates a new copy of the TexturePipeline class
7487 </summary> 9345 </summary>
9346 <param name="client">Reference to the instantiated <see cref="T:OpenMetaverse.GridClient"/> object</param>
7488 </member> 9347 </member>
7489 <member name="P:OpenMetaverse.TopCollidersReplyEventArgs.Tasks"> 9348 <member name="M:OpenMetaverse.TexturePipeline.Startup">
7490 <summary> 9349 <summary>
7491 A Dictionary of Object UUIDs to tasks returned in LandStatReply 9350 Initialize callbacks required for the TexturePipeline to operate
7492 </summary> 9351 </summary>
7493 </member> 9352 </member>
7494 <member name="T:OpenMetaverse.TopScriptsReplyEventArgs"> 9353 <member name="M:OpenMetaverse.TexturePipeline.Shutdown">
7495 <summary>Raised on LandStatReply when the report type is for "top Scripts"</summary>
7496 </member>
7497 <member name="M:OpenMetaverse.TopScriptsReplyEventArgs.#ctor(System.Int32,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.EstateTask})">
7498 <summary>Construct a new instance of the TopScriptsReplyEventArgs class</summary>
7499 <param name="objectCount">The number of returned items in LandStatReply</param>
7500 <param name="tasks">Dictionary of Object UUIDs to tasks returned in LandStatReply</param>
7501 </member>
7502 <member name="P:OpenMetaverse.TopScriptsReplyEventArgs.ObjectCount">
7503 <summary> 9354 <summary>
7504 The number of scripts returned in LandStatReply 9355 Shutdown the TexturePipeline and cleanup any callbacks or transfers
7505 </summary> 9356 </summary>
7506 </member> 9357 </member>
7507 <member name="P:OpenMetaverse.TopScriptsReplyEventArgs.Tasks"> 9358 <member name="M:OpenMetaverse.TexturePipeline.RequestTexture(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32,OpenMetaverse.TextureDownloadCallback,System.Boolean)">
7508 <summary> 9359 <summary>
7509 A Dictionary of Object UUIDs to tasks returned in LandStatReply 9360 Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline"/> system to
9361 manage the requests and re-assemble the image from the packets received from the simulator
7510 </summary> 9362 </summary>
9363 <param name="textureID">The <see cref="T:OpenMetaverse.UUID"/> of the texture asset to download</param>
9364 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType"/> of the texture asset.
9365 Use <see cref="F:OpenMetaverse.ImageType.Normal"/> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked"/> for baked layer texture assets</param>
9366 <param name="priority">A float indicating the requested priority for the transfer. Higher priority values tell the simulator
9367 to prioritize the request before lower valued requests. An image already being transferred using the <see cref="T:OpenMetaverse.TexturePipeline"/> can have
9368 its priority changed by resending the request with the new priority value</param>
9369 <param name="discardLevel">Number of quality layers to discard.
9370 This controls the end marker of the data sent</param>
9371 <param name="packetStart">The packet number to begin the request at. A value of 0 begins the request
9372 from the start of the asset texture</param>
9373 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback"/> callback to fire when the image is retrieved. The callback
9374 will contain the result of the request and the texture asset data</param>
9375 <param name="progressive">If true, the callback will be fired for each chunk of the downloaded image.
9376 The callback asset parameter will contain all previously received chunks of the texture asset starting
9377 from the beginning of the request</param>
7511 </member> 9378 </member>
7512 <member name="T:OpenMetaverse.EstateBansReplyEventArgs"> 9379 <member name="M:OpenMetaverse.TexturePipeline.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32)">
7513 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
7514 </member>
7515 <member name="M:OpenMetaverse.EstateBansReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
7516 <summary>Construct a new instance of the EstateBansReplyEventArgs class</summary>
7517 <param name="estateID">The estate's identifier on the grid</param>
7518 <param name="count">The number of returned items in LandStatReply</param>
7519 <param name="banned">User UUIDs banned</param>
7520 </member>
7521 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.EstateID">
7522 <summary> 9380 <summary>
7523 The identifier of the estate 9381 Sends the actual request packet to the simulator
7524 </summary> 9382 </summary>
9383 <param name="imageID">The image to download</param>
9384 <param name="type">Type of the image to download, either a baked
9385 avatar texture or a normal texture</param>
9386 <param name="priority">Priority level of the download. Default is
9387 <c>1,013,000.0f</c></param>
9388 <param name="discardLevel">Number of quality layers to discard.
9389 This controls the end marker of the data sent</param>
9390 <param name="packetNum">Packet number to start the download at.
9391 This controls the start marker of the data sent</param>
9392 <remarks>Sending a priority of 0 and a discardlevel of -1 aborts
9393 download</remarks>
7525 </member> 9394 </member>
7526 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.Count"> 9395 <member name="M:OpenMetaverse.TexturePipeline.AbortTextureRequest(OpenMetaverse.UUID)">
7527 <summary> 9396 <summary>
7528 The number of returned itmes 9397 Cancel a pending or in process texture request
7529 </summary> 9398 </summary>
9399 <param name="textureID">The texture assets unique ID</param>
7530 </member> 9400 </member>
7531 <member name="P:OpenMetaverse.EstateBansReplyEventArgs.Banned"> 9401 <member name="M:OpenMetaverse.TexturePipeline.DownloadThread">
7532 <summary> 9402 <summary>
7533 List of UUIDs of Banned Users 9403 Master Download Thread, Queues up downloads in the threadpool
7534 </summary> 9404 </summary>
7535 </member> 9405 </member>
7536 <member name="T:OpenMetaverse.EstateUsersReplyEventArgs"> 9406 <member name="M:OpenMetaverse.TexturePipeline.TextureRequestDoWork(System.Object)">
7537 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary> 9407 <summary>
9408 The worker thread that sends the request and handles timeouts
9409 </summary>
9410 <param name="threadContext">A <see cref="T:OpenMetaverse.TexturePipeline.TaskInfo"/> object containing the request details</param>
7538 </member> 9411 </member>
7539 <member name="M:OpenMetaverse.EstateUsersReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})"> 9412 <member name="M:OpenMetaverse.TexturePipeline.ImageNotInDatabaseHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
7540 <summary>Construct a new instance of the EstateUsersReplyEventArgs class</summary> 9413 <summary>
7541 <param name="estateID">The estate's identifier on the grid</param> 9414 Handle responses from the simulator that tell us a texture we have requested is unable to be located
7542 <param name="count">The number of users</param> 9415 or no longer exists. This will remove the request from the pipeline and free up a slot if one is in use
7543 <param name="allowedUsers">Allowed users UUIDs</param> 9416 </summary>
9417 <param name="sender">The sender</param>
9418 <param name="e">The EventArgs object containing the packet data</param>
7544 </member> 9419 </member>
7545 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.EstateID"> 9420 <member name="M:OpenMetaverse.TexturePipeline.ImagePacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
7546 <summary> 9421 <summary>
7547 The identifier of the estate 9422 Handles the remaining Image data that did not fit in the initial ImageData packet
7548 </summary> 9423 </summary>
9424 <param name="sender">The sender</param>
9425 <param name="e">The EventArgs object containing the packet data</param>
7549 </member> 9426 </member>
7550 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.Count"> 9427 <member name="M:OpenMetaverse.TexturePipeline.ImageDataHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
7551 <summary> 9428 <summary>
7552 The number of returned items 9429 Handle the initial ImageDataPacket sent from the simulator
7553 </summary> 9430 </summary>
9431 <param name="sender">The sender</param>
9432 <param name="e">The EventArgs object containing the packet data</param>
7554 </member> 9433 </member>
7555 <member name="P:OpenMetaverse.EstateUsersReplyEventArgs.AllowedUsers"> 9434 <member name="P:OpenMetaverse.TexturePipeline.TransferCount">
9435 <summary>Current number of pending and in-process transfers</summary>
9436 </member>
9437 <member name="T:OpenMetaverse.TexturePipeline.TaskInfo">
7556 <summary> 9438 <summary>
7557 List of UUIDs of Allowed Users 9439 A request task containing information and status of a request as it is processed through the <see cref="T:OpenMetaverse.TexturePipeline"/>
7558 </summary> 9440 </summary>
7559 </member> 9441 </member>
7560 <member name="T:OpenMetaverse.EstateGroupsReplyEventArgs"> 9442 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.State">
7561 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary> 9443 <summary>The current <seealso cref="T:OpenMetaverse.TextureRequestState"/> which identifies the current status of the request</summary>
7562 </member> 9444 </member>
7563 <member name="M:OpenMetaverse.EstateGroupsReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})"> 9445 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.RequestID">
7564 <summary>Construct a new instance of the EstateGroupsReplyEventArgs class</summary> 9446 <summary>The Unique Request ID, This is also the Asset ID of the texture being requested</summary>
7565 <param name="estateID">The estate's identifier on the grid</param>
7566 <param name="count">The number of Groups</param>
7567 <param name="allowedGroups">Allowed Groups UUIDs</param>
7568 </member> 9447 </member>
7569 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.EstateID"> 9448 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.RequestSlot">
9449 <summary>The slot this request is occupying in the threadpoolSlots array</summary>
9450 </member>
9451 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Type">
9452 <summary>The ImageType of the request.</summary>
9453 </member>
9454 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Callbacks">
9455 <summary>The callback to fire when the request is complete, will include
9456 the <seealso cref="T:OpenMetaverse.TextureRequestState"/> and the <see cref="T:OpenMetaverse.Assets.AssetTexture"/>
9457 object containing the result data</summary>
9458 </member>
9459 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.ReportProgress">
9460 <summary>If true, indicates the callback will be fired whenever new data is returned from the simulator.
9461 This is used to progressively render textures as portions of the texture are received.</summary>
9462 </member>
9463 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Transfer">
9464 <summary>An object that maintains the data of an request thats in-process.</summary>
9465 </member>
9466 <member name="F:OpenMetaverse.UDPPacketBuffer.BUFFER_SIZE">
9467 <summary>Size of the byte array used to store raw packet data</summary>
9468 </member>
9469 <member name="F:OpenMetaverse.UDPPacketBuffer.Data">
9470 <summary>Raw packet data buffer</summary>
9471 </member>
9472 <member name="F:OpenMetaverse.UDPPacketBuffer.DataLength">
9473 <summary>Length of the data to transmit</summary>
9474 </member>
9475 <member name="F:OpenMetaverse.UDPPacketBuffer.RemoteEndPoint">
9476 <summary>EndPoint of the remote host</summary>
9477 </member>
9478 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor">
7570 <summary> 9479 <summary>
7571 The identifier of the estate 9480 Create an allocated UDP packet buffer for receiving a packet
7572 </summary> 9481 </summary>
7573 </member> 9482 </member>
7574 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.Count"> 9483 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor(System.Net.IPEndPoint)">
7575 <summary> 9484 <summary>
7576 The number of returned items 9485 Create an allocated UDP packet buffer for sending a packet
7577 </summary> 9486 </summary>
9487 <param name="endPoint">EndPoint of the remote host</param>
7578 </member> 9488 </member>
7579 <member name="P:OpenMetaverse.EstateGroupsReplyEventArgs.AllowedGroups"> 9489 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor(System.Net.IPEndPoint,System.Int32)">
7580 <summary> 9490 <summary>
7581 List of UUIDs of Allowed Groups 9491 Create an allocated UDP packet buffer for sending a packet
7582 </summary> 9492 </summary>
9493 <param name="endPoint">EndPoint of the remote host</param>
9494 <param name="bufferSize">Size of the buffer to allocate for packet data</param>
7583 </member> 9495 </member>
7584 <member name="T:OpenMetaverse.EstateManagersReplyEventArgs"> 9496 <member name="T:OpenMetaverse.PacketBufferPool">
7585 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
7586 </member>
7587 <member name="M:OpenMetaverse.EstateManagersReplyEventArgs.#ctor(System.UInt32,System.Int32,System.Collections.Generic.List{OpenMetaverse.UUID})">
7588 <summary>Construct a new instance of the EstateManagersReplyEventArgs class</summary>
7589 <param name="estateID">The estate's identifier on the grid</param>
7590 <param name="count">The number of Managers</param>
7591 <param name="managers"> Managers UUIDs</param>
7592 </member>
7593 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.EstateID">
7594 <summary> 9497 <summary>
7595 The identifier of the estate 9498 Object pool for packet buffers. This is used to allocate memory for all
9499 incoming and outgoing packets, and zerocoding buffers for those packets
7596 </summary> 9500 </summary>
7597 </member> 9501 </member>
7598 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.Count"> 9502 <member name="M:OpenMetaverse.ObjectPoolBase`1.#ctor">
7599 <summary> 9503 <summary>
7600 The number of returned items 9504 Creates a new instance of the ObjectPoolBase class. Initialize MUST be called
9505 after using this constructor.
7601 </summary> 9506 </summary>
7602 </member> 9507 </member>
7603 <member name="P:OpenMetaverse.EstateManagersReplyEventArgs.Managers"> 9508 <member name="M:OpenMetaverse.ObjectPoolBase`1.#ctor(System.Int32,System.Int32,System.Boolean,System.Int32)">
7604 <summary> 9509 <summary>
7605 List of UUIDs of the Estate's Managers 9510 Creates a new instance of the ObjectPool Base class.
7606 </summary> 9511 </summary>
9512 <param name="itemsPerSegment">The object pool is composed of segments, which
9513 are allocated whenever the size of the pool is exceeded. The number of items
9514 in a segment should be large enough that allocating a new segmeng is a rare
9515 thing. For example, on a server that will have 10k people logged in at once,
9516 the receive buffer object pool should have segment sizes of at least 1000
9517 byte arrays per segment.
9518 </param>
9519 <param name="minimumSegmentCount">The minimun number of segments that may exist.</param>
9520 <param name="gcOnPoolGrowth">Perform a full GC.Collect whenever a segment is allocated, and then again after allocation to compact the heap.</param>
9521 <param name="cleanupFrequenceMS">The frequency which segments are checked to see if they're eligible for cleanup.</param>
7607 </member> 9522 </member>
7608 <member name="T:OpenMetaverse.EstateCovenantReplyEventArgs"> 9523 <member name="M:OpenMetaverse.ObjectPoolBase`1.ForceCleanup">
7609 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
7610 </member>
7611 <member name="M:OpenMetaverse.EstateCovenantReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Int64,System.String,OpenMetaverse.UUID)">
7612 <summary>Construct a new instance of the EstateCovenantReplyEventArgs class</summary>
7613 <param name="covenantID">The Covenant ID</param>
7614 <param name="timestamp">The timestamp</param>
7615 <param name="estateName">The estate's name</param>
7616 <param name="estateOwnerID">The Estate Owner's ID (can be a GroupID)</param>
7617 </member>
7618 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.CovenantID">
7619 <summary> 9524 <summary>
7620 The Covenant 9525 Forces the segment cleanup algorithm to be run. This method is intended
9526 primarly for use from the Unit Test libraries.
7621 </summary> 9527 </summary>
7622 </member> 9528 </member>
7623 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.Timestamp"> 9529 <member name="M:OpenMetaverse.ObjectPoolBase`1.GetObjectInstance">
7624 <summary> 9530 <summary>
7625 The timestamp 9531 Responsible for allocate 1 instance of an object that will be stored in a segment.
7626 </summary> 9532 </summary>
9533 <returns>An instance of whatever objec the pool is pooling.</returns>
7627 </member> 9534 </member>
7628 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.EstateName"> 9535 <member name="M:OpenMetaverse.ObjectPoolBase`1.CheckIn(OpenMetaverse.ObjectPoolSegment{`0},`0)">
7629 <summary> 9536 <summary>
7630 The Estate name 9537 Checks in an instance of T owned by the object pool. This method is only intended to be called
9538 by the <c>WrappedObject</c> class.
7631 </summary> 9539 </summary>
9540 <param name="owningSegment">The segment from which the instance is checked out.</param>
9541 <param name="instance">The instance of <c>T</c> to check back into the segment.</param>
7632 </member> 9542 </member>
7633 <member name="P:OpenMetaverse.EstateCovenantReplyEventArgs.EstateOwnerID"> 9543 <member name="M:OpenMetaverse.ObjectPoolBase`1.CheckOut">
7634 <summary> 9544 <summary>
7635 The Estate Owner's ID (can be a GroupID) 9545 Checks an instance of <c>T</c> from the pool. If the pool is not sufficient to
9546 allow the checkout, a new segment is created.
7636 </summary> 9547 </summary>
9548 <returns>A <c>WrappedObject</c> around the instance of <c>T</c>. To check
9549 the instance back into the segment, be sureto dispose the WrappedObject
9550 when finished. </returns>
7637 </member> 9551 </member>
7638 <member name="T:OpenMetaverse.EstateUpdateInfoReplyEventArgs"> 9552 <member name="P:OpenMetaverse.ObjectPoolBase`1.TotalSegments">
7639 <summary>Returned, along with other info, upon a successful .RequestInfo()</summary>
7640 </member>
7641 <member name="M:OpenMetaverse.EstateUpdateInfoReplyEventArgs.#ctor(System.String,OpenMetaverse.UUID,System.UInt32,System.Boolean)">
7642 <summary>Construct a new instance of the EstateUpdateInfoReplyEventArgs class</summary>
7643 <param name="estateName">The estate's name</param>
7644 <param name="estateOwner">The Estate Owners ID (can be a GroupID)</param>
7645 <param name="estateID">The estate's identifier on the grid</param>
7646 <param name="denyNoPaymentInfo">
7647 </param>
7648 </member>
7649 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateName">
7650 <summary> 9553 <summary>
7651 The estate's name 9554 The total number of segments created. Intended to be used by the Unit Tests.
7652 </summary> 9555 </summary>
7653 </member> 9556 </member>
7654 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateOwner"> 9557 <member name="P:OpenMetaverse.ObjectPoolBase`1.ItemsPerSegment">
7655 <summary> 9558 <summary>
7656 The Estate Owner's ID (can be a GroupID) 9559 The number of items that are in a segment. Items in a segment
9560 are all allocated at the same time, and are hopefully close to
9561 each other in the managed heap.
7657 </summary> 9562 </summary>
7658 </member> 9563 </member>
7659 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.EstateID"> 9564 <member name="P:OpenMetaverse.ObjectPoolBase`1.MinimumSegmentCount">
7660 <summary> 9565 <summary>
7661 The identifier of the estate on the grid 9566 The minimum number of segments. When segments are reclaimed,
9567 this number of segments will always be left alone. These
9568 segments are allocated at startup.
7662 </summary> 9569 </summary>
7663 </member> 9570 </member>
7664 <member name="P:OpenMetaverse.EstateUpdateInfoReplyEventArgs.DenyNoPaymentInfo"> 9571 <member name="P:OpenMetaverse.ObjectPoolBase`1.MinimumSegmentAgePriorToCleanup">
7665 <summary> 9572 <summary>
9573 The age a segment must be before it's eligible for cleanup.
9574 This is used to prevent thrash, and typical values are in
9575 the 5 minute range.
7666 </summary> 9576 </summary>
7667 </member> 9577 </member>
7668 <member name="T:OpenMetaverse.PacketEventDictionary"> 9578 <member name="P:OpenMetaverse.ObjectPoolBase`1.CleanupFrequencyMilliseconds">
7669 <summary> 9579 <summary>
7670 Registers, unregisters, and fires events generated by incoming packets 9580 The frequence which the cleanup thread runs. This is typically
9581 expected to be in the 5 minute range.
7671 </summary> 9582 </summary>
7672 </member> 9583 </member>
7673 <member name="M:OpenMetaverse.PacketEventDictionary.#ctor(OpenMetaverse.GridClient)"> 9584 <member name="M:OpenMetaverse.PacketBufferPool.#ctor(System.Net.IPEndPoint,System.Int32,System.Int32)">
7674 <summary> 9585 <summary>
7675 Default constructor 9586 Initialize the object pool in client mode
7676 </summary> 9587 </summary>
7677 <param name="client"> 9588 <param name="endPoint">Server to connect to</param>
7678 </param> 9589 <param name="itemsPerSegment"></param>
9590 <param name="minSegments"></param>
7679 </member> 9591 </member>
7680 <member name="T:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper"> 9592 <member name="M:OpenMetaverse.PacketBufferPool.#ctor(System.Int32,System.Int32)">
7681 <summary> 9593 <summary>
7682 Object that is passed to worker threads in the ThreadPool for 9594 Initialize the object pool in server mode
7683 firing packet callbacks
7684 </summary> 9595 </summary>
9596 <param name="itemsPerSegment"></param>
9597 <param name="minSegments"></param>
7685 </member> 9598 </member>
7686 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Callback"> 9599 <member name="M:OpenMetaverse.PacketBufferPool.GetObjectInstance">
7687 <summary>Callback to fire for this packet</summary>
7688 </member>
7689 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Simulator">
7690 <summary>Reference to the simulator that this packet came from</summary>
7691 </member>
7692 <member name="F:OpenMetaverse.PacketEventDictionary.PacketCallbackWrapper.Packet">
7693 <summary>The packet that needs to be processed</summary>
7694 </member>
7695 <member name="F:OpenMetaverse.PacketEventDictionary.Client">
7696 <summary>Reference to the GridClient object</summary>
7697 </member>
7698 <member name="M:OpenMetaverse.PacketEventDictionary.RegisterEvent(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs},System.Boolean)">
7699 <summary> 9600 <summary>
7700 Register an event handler 9601 Returns a packet buffer with EndPoint set if the buffer is in
9602 client mode, or with EndPoint set to null in server mode
7701 </summary> 9603 </summary>
7702 <remarks>Use PacketType.Default to fire this event on every 9604 <returns>Initialized UDPPacketBuffer object</returns>
7703 incoming packet</remarks>
7704 <param name="packetType">Packet type to register the handler for</param>
7705 <param name="eventHandler">Callback to be fired</param>
7706 <param name="isAsync">True if this callback should be ran
7707 asynchronously, false to run it synchronous</param>
7708 </member> 9605 </member>
7709 <member name="M:OpenMetaverse.PacketEventDictionary.UnregisterEvent(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})"> 9606 <member name="M:OpenMetaverse.Pool.#cctor">
7710 <summary> 9607 <summary>
7711 Unregister an event handler 9608 Default constructor
7712 </summary> 9609 </summary>
7713 <param name="packetType">Packet type to unregister the handler for</param>
7714 <param name="eventHandler">Callback to be unregistered</param>
7715 </member> 9610 </member>
7716 <member name="M:OpenMetaverse.PacketEventDictionary.RaiseEvent(OpenMetaverse.Packets.PacketType,OpenMetaverse.Packets.Packet,OpenMetaverse.Simulator)"> 9611 <member name="M:OpenMetaverse.Pool.CheckOut">
7717 <summary> 9612 <summary>
7718 Fire the events registered for this packet type 9613 Check a packet buffer out of the pool
7719 </summary> 9614 </summary>
7720 <param name="packetType">Incoming packet type</param> 9615 <returns>A packet buffer object</returns>
7721 <param name="packet">Incoming packet</param>
7722 <param name="simulator">Simulator this packet was received from</param>
7723 </member> 9616 </member>
7724 <member name="T:OpenMetaverse.CapsEventDictionary"> 9617 <member name="T:OpenMetaverse.Logger">
7725 <summary> 9618 <summary>
7726 Registers, unregisters, and fires events generated by the Capabilities 9619 Singleton logging class for the entire library
7727 event queue
7728 </summary> 9620 </summary>
7729 </member> 9621 </member>
7730 <member name="M:OpenMetaverse.CapsEventDictionary.#ctor(OpenMetaverse.GridClient)"> 9622 <member name="F:OpenMetaverse.Logger.LogInstance">
9623 <summary>log4net logging engine</summary>
9624 </member>
9625 <member name="M:OpenMetaverse.Logger.#cctor">
7731 <summary> 9626 <summary>
7732 Default constructor 9627 Default constructor
7733 </summary> 9628 </summary>
7734 <param name="client">Reference to the GridClient object</param>
7735 </member> 9629 </member>
7736 <member name="T:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper"> 9630 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel)">
7737 <summary> 9631 <summary>
7738 Object that is passed to worker threads in the ThreadPool for 9632 Send a log message to the logging engine
7739 firing CAPS callbacks
7740 </summary> 9633 </summary>
9634 <param name="message">The log message</param>
9635 <param name="level">The severity of the log entry</param>
7741 </member> 9636 </member>
7742 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Callback"> 9637 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,OpenMetaverse.GridClient)">
7743 <summary>Callback to fire for this packet</summary> 9638 <summary>
7744 </member> 9639 Send a log message to the logging engine
7745 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.CapsEvent"> 9640 </summary>
7746 <summary>Name of the CAPS event</summary> 9641 <param name="message">The log message</param>
7747 </member> 9642 <param name="level">The severity of the log entry</param>
7748 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Message"> 9643 <param name="client">Instance of the client</param>
7749 <summary>Strongly typed decoded data</summary>
7750 </member>
7751 <member name="F:OpenMetaverse.CapsEventDictionary.CapsCallbackWrapper.Simulator">
7752 <summary>Reference to the simulator that generated this event</summary>
7753 </member> 9644 </member>
7754 <member name="F:OpenMetaverse.CapsEventDictionary.Client"> 9645 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,System.Exception)">
7755 <summary>Reference to the GridClient object</summary> 9646 <summary>
9647 Send a log message to the logging engine
9648 </summary>
9649 <param name="message">The log message</param>
9650 <param name="level">The severity of the log entry</param>
9651 <param name="exception">Exception that was raised</param>
7756 </member> 9652 </member>
7757 <member name="M:OpenMetaverse.CapsEventDictionary.RegisterEvent(System.String,OpenMetaverse.Caps.EventQueueCallback)"> 9653 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,OpenMetaverse.GridClient,System.Exception)">
7758 <summary> 9654 <summary>
7759 Register an new event handler for a capabilities event sent via the EventQueue 9655 Send a log message to the logging engine
7760 </summary> 9656 </summary>
7761 <remarks>Use String.Empty to fire this event on every CAPS event</remarks> 9657 <param name="message">The log message</param>
7762 <param name="capsEvent">Capability event name to register the 9658 <param name="level">The severity of the log entry</param>
7763 handler for</param> 9659 <param name="client">Instance of the client</param>
7764 <param name="eventHandler">Callback to fire</param> 9660 <param name="exception">Exception that was raised</param>
7765 </member> 9661 </member>
7766 <member name="M:OpenMetaverse.CapsEventDictionary.UnregisterEvent(System.String,OpenMetaverse.Caps.EventQueueCallback)"> 9662 <member name="M:OpenMetaverse.Logger.DebugLog(System.Object)">
7767 <summary> 9663 <summary>
7768 Unregister a previously registered capabilities handler 9664 If the library is compiled with DEBUG defined, an event will be
9665 fired if an <code>OnLogMessage</code> handler is registered and the
9666 message will be sent to the logging engine
7769 </summary> 9667 </summary>
7770 <param name="capsEvent">Capability event name unregister the 9668 <param name="message">The message to log at the DEBUG level to the
7771 handler for</param> 9669 current logging engine</param>
7772 <param name="eventHandler">Callback to unregister</param>
7773 </member> 9670 </member>
7774 <member name="M:OpenMetaverse.CapsEventDictionary.RaiseEvent(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 9671 <member name="M:OpenMetaverse.Logger.DebugLog(System.Object,OpenMetaverse.GridClient)">
7775 <summary> 9672 <summary>
7776 Fire the events registered for this event type synchronously 9673 If the library is compiled with DEBUG defined and
9674 <code>GridClient.Settings.DEBUG</code> is true, an event will be
9675 fired if an <code>OnLogMessage</code> handler is registered and the
9676 message will be sent to the logging engine
7777 </summary> 9677 </summary>
7778 <param name="capsEvent">Capability name</param> 9678 <param name="message">The message to log at the DEBUG level to the
7779 <param name="message">Decoded event body</param> 9679 current logging engine</param>
7780 <param name="simulator">Reference to the simulator that 9680 <param name="client">Instance of the client</param>
7781 generated this event</param>
7782 </member> 9681 </member>
7783 <member name="M:OpenMetaverse.CapsEventDictionary.BeginRaiseEvent(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 9682 <member name="E:OpenMetaverse.Logger.OnLogMessage">
9683 <summary>Triggered whenever a message is logged. If this is left
9684 null, log messages will go to the console</summary>
9685 </member>
9686 <member name="T:OpenMetaverse.Logger.LogCallback">
7784 <summary> 9687 <summary>
7785 Fire the events registered for this event type asynchronously 9688 Callback used for client apps to receive log messages from
9689 the library
7786 </summary> 9690 </summary>
7787 <param name="capsEvent">Capability name</param> 9691 <param name="message">Data being logged</param>
7788 <param name="message">Decoded event body</param> 9692 <param name="level">The severity of the log entry from <seealso cref="T:OpenMetaverse.Helpers.LogLevel"/></param>
7789 <param name="simulator">Reference to the simulator that
7790 generated this event</param>
7791 </member> 9693 </member>
7792 <member name="T:OpenMetaverse.FriendRights"> 9694 <member name="T:OpenMetaverse.FriendRights">
7793 <summary> 9695 <summary>
9696
7794 </summary> 9697 </summary>
7795 </member> 9698 </member>
7796 <member name="F:OpenMetaverse.FriendRights.None"> 9699 <member name="F:OpenMetaverse.FriendRights.None">
@@ -7807,7 +9710,7 @@
7807 </member> 9710 </member>
7808 <member name="T:OpenMetaverse.FriendInfo"> 9711 <member name="T:OpenMetaverse.FriendInfo">
7809 <summary> 9712 <summary>
7810 This class holds information about an avatar in the friends list. There are two ways 9713 This class holds information about an avatar in the friends list. There are two ways
7811 to interface to this class. The first is through the set of boolean properties. This is the typical 9714 to interface to this class. The first is through the set of boolean properties. This is the typical
7812 way clients of this class will use it. The second interface is through two bitflag properties, 9715 way clients of this class will use it. The second interface is through two bitflag properties,
7813 TheirFriendsRights and MyFriendsRights 9716 TheirFriendsRights and MyFriendsRights
@@ -7821,6 +9724,12 @@
7821 <param name="theirRights">Rights the friend has to see you online and to modify your objects</param> 9724 <param name="theirRights">Rights the friend has to see you online and to modify your objects</param>
7822 <param name="myRights">Rights you have to see your friend online and to modify their objects</param> 9725 <param name="myRights">Rights you have to see your friend online and to modify their objects</param>
7823 </member> 9726 </member>
9727 <member name="M:OpenMetaverse.FriendInfo.ToString">
9728 <summary>
9729 FriendInfo represented as a string
9730 </summary>
9731 <returns>A string reprentation of both my rights and my friends rights</returns>
9732 </member>
7824 <member name="P:OpenMetaverse.FriendInfo.UUID"> 9733 <member name="P:OpenMetaverse.FriendInfo.UUID">
7825 <summary> 9734 <summary>
7826 System ID of the avatar 9735 System ID of the avatar
@@ -7843,7 +9752,7 @@
7843 </member> 9752 </member>
7844 <member name="P:OpenMetaverse.FriendInfo.CanSeeMeOnMap"> 9753 <member name="P:OpenMetaverse.FriendInfo.CanSeeMeOnMap">
7845 <summary> 9754 <summary>
7846 True if the friend can see me on the map 9755 True if the friend can see me on the map
7847 </summary> 9756 </summary>
7848 </member> 9757 </member>
7849 <member name="P:OpenMetaverse.FriendInfo.CanModifyMyObjects"> 9758 <member name="P:OpenMetaverse.FriendInfo.CanModifyMyObjects">
@@ -7876,151 +9785,121 @@
7876 My rights represented as bitmapped flags 9785 My rights represented as bitmapped flags
7877 </summary> 9786 </summary>
7878 </member> 9787 </member>
7879 <member name="M:OpenMetaverse.FriendInfo.ToString">
7880 <summary>
7881 FriendInfo represented as a string
7882 </summary>
7883 <returns>A string reprentation of both my rights and my friends rights</returns>
7884 </member>
7885 <member name="T:OpenMetaverse.FriendsManager"> 9788 <member name="T:OpenMetaverse.FriendsManager">
7886 <summary> 9789 <summary>
7887 This class is used to add and remove avatars from your friends list and to manage their permission. 9790 This class is used to add and remove avatars from your friends list and to manage their permission.
7888 </summary>
7889 </member>
7890 <member name="M:OpenMetaverse.FriendsManager.#ctor(OpenMetaverse.GridClient)">
7891 <summary>
7892 Internal constructor
7893 </summary> 9791 </summary>
7894 <param name="client">A reference to the GridClient Object</param>
7895 </member> 9792 </member>
7896 <member name="F:OpenMetaverse.FriendsManager.m_FriendOnline"> 9793 <member name="F:OpenMetaverse.FriendsManager.m_FriendOnline">
7897 <summary>The event subscribers. null if no subcribers</summary> 9794 <summary>The event subscribers. null if no subcribers</summary>
7898 </member> 9795 </member>
9796 <member name="M:OpenMetaverse.FriendsManager.OnFriendOnline(OpenMetaverse.FriendInfoEventArgs)">
9797 <summary>Raises the FriendOnline event</summary>
9798 <param name="e">A FriendInfoEventArgs object containing the
9799 data returned from the data server</param>
9800 </member>
7899 <member name="F:OpenMetaverse.FriendsManager.m_FriendOnlineLock"> 9801 <member name="F:OpenMetaverse.FriendsManager.m_FriendOnlineLock">
7900 <summary>Thread sync lock object</summary> 9802 <summary>Thread sync lock object</summary>
7901 </member> 9803 </member>
7902 <member name="F:OpenMetaverse.FriendsManager.m_FriendOffline"> 9804 <member name="F:OpenMetaverse.FriendsManager.m_FriendOffline">
7903 <summary>The event subscribers. null if no subcribers</summary> 9805 <summary>The event subscribers. null if no subcribers</summary>
7904 </member> 9806 </member>
9807 <member name="M:OpenMetaverse.FriendsManager.OnFriendOffline(OpenMetaverse.FriendInfoEventArgs)">
9808 <summary>Raises the FriendOffline event</summary>
9809 <param name="e">A FriendInfoEventArgs object containing the
9810 data returned from the data server</param>
9811 </member>
7905 <member name="F:OpenMetaverse.FriendsManager.m_FriendOfflineLock"> 9812 <member name="F:OpenMetaverse.FriendsManager.m_FriendOfflineLock">
7906 <summary>Thread sync lock object</summary> 9813 <summary>Thread sync lock object</summary>
7907 </member> 9814 </member>
7908 <member name="F:OpenMetaverse.FriendsManager.m_FriendRights"> 9815 <member name="F:OpenMetaverse.FriendsManager.m_FriendRights">
7909 <summary>The event subscribers. null if no subcribers</summary> 9816 <summary>The event subscribers. null if no subcribers</summary>
7910 </member> 9817 </member>
9818 <member name="M:OpenMetaverse.FriendsManager.OnFriendRights(OpenMetaverse.FriendInfoEventArgs)">
9819 <summary>Raises the FriendRightsUpdate event</summary>
9820 <param name="e">A FriendInfoEventArgs object containing the
9821 data returned from the data server</param>
9822 </member>
7911 <member name="F:OpenMetaverse.FriendsManager.m_FriendRightsLock"> 9823 <member name="F:OpenMetaverse.FriendsManager.m_FriendRightsLock">
7912 <summary>Thread sync lock object</summary> 9824 <summary>Thread sync lock object</summary>
7913 </member> 9825 </member>
7914 <member name="F:OpenMetaverse.FriendsManager.m_FriendNames"> 9826 <member name="F:OpenMetaverse.FriendsManager.m_FriendNames">
7915 <summary>The event subscribers. null if no subcribers</summary> 9827 <summary>The event subscribers. null if no subcribers</summary>
7916 </member> 9828 </member>
9829 <member name="M:OpenMetaverse.FriendsManager.OnFriendNames(OpenMetaverse.FriendNamesEventArgs)">
9830 <summary>Raises the FriendNames event</summary>
9831 <param name="e">A FriendNamesEventArgs object containing the
9832 data returned from the data server</param>
9833 </member>
7917 <member name="F:OpenMetaverse.FriendsManager.m_FriendNamesLock"> 9834 <member name="F:OpenMetaverse.FriendsManager.m_FriendNamesLock">
7918 <summary>Thread sync lock object</summary> 9835 <summary>Thread sync lock object</summary>
7919 </member> 9836 </member>
7920 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipOffered"> 9837 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipOffered">
7921 <summary>The event subscribers. null if no subcribers</summary> 9838 <summary>The event subscribers. null if no subcribers</summary>
7922 </member> 9839 </member>
9840 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipOffered(OpenMetaverse.FriendshipOfferedEventArgs)">
9841 <summary>Raises the FriendshipOffered event</summary>
9842 <param name="e">A FriendshipOfferedEventArgs object containing the
9843 data returned from the data server</param>
9844 </member>
7923 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipOfferedLock"> 9845 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipOfferedLock">
7924 <summary>Thread sync lock object</summary> 9846 <summary>Thread sync lock object</summary>
7925 </member> 9847 </member>
7926 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipResponse"> 9848 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipResponse">
7927 <summary>The event subscribers. null if no subcribers</summary> 9849 <summary>The event subscribers. null if no subcribers</summary>
7928 </member> 9850 </member>
9851 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipResponse(OpenMetaverse.FriendshipResponseEventArgs)">
9852 <summary>Raises the FriendshipResponse event</summary>
9853 <param name="e">A FriendshipResponseEventArgs object containing the
9854 data returned from the data server</param>
9855 </member>
7929 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipResponseLock"> 9856 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipResponseLock">
7930 <summary>Thread sync lock object</summary> 9857 <summary>Thread sync lock object</summary>
7931 </member> 9858 </member>
7932 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipTerminated"> 9859 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipTerminated">
7933 <summary>The event subscribers. null if no subcribers</summary> 9860 <summary>The event subscribers. null if no subcribers</summary>
7934 </member> 9861 </member>
9862 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipTerminated(OpenMetaverse.FriendshipTerminatedEventArgs)">
9863 <summary>Raises the FriendshipTerminated event</summary>
9864 <param name="e">A FriendshipTerminatedEventArgs object containing the
9865 data returned from the data server</param>
9866 </member>
7935 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipTerminatedLock"> 9867 <member name="F:OpenMetaverse.FriendsManager.m_FriendshipTerminatedLock">
7936 <summary>Thread sync lock object</summary> 9868 <summary>Thread sync lock object</summary>
7937 </member> 9869 </member>
7938 <member name="F:OpenMetaverse.FriendsManager.m_FriendFound"> 9870 <member name="F:OpenMetaverse.FriendsManager.m_FriendFound">
7939 <summary>The event subscribers. null if no subcribers</summary> 9871 <summary>The event subscribers. null if no subcribers</summary>
7940 </member> 9872 </member>
9873 <member name="M:OpenMetaverse.FriendsManager.OnFriendFoundReply(OpenMetaverse.FriendFoundReplyEventArgs)">
9874 <summary>Raises the FriendFoundReply event</summary>
9875 <param name="e">A FriendFoundReplyEventArgs object containing the
9876 data returned from the data server</param>
9877 </member>
7941 <member name="F:OpenMetaverse.FriendsManager.m_FriendFoundLock"> 9878 <member name="F:OpenMetaverse.FriendsManager.m_FriendFoundLock">
7942 <summary>Thread sync lock object</summary> 9879 <summary>Thread sync lock object</summary>
7943 </member> 9880 </member>
7944 <member name="F:OpenMetaverse.FriendsManager.FriendList"> 9881 <member name="F:OpenMetaverse.FriendsManager.FriendList">
7945 <summary> 9882 <summary>
7946 A dictionary of key/value pairs containing known friends of this avatar. 9883 A dictionary of key/value pairs containing known friends of this avatar.
7947 The Key is the <seealso cref="T:OpenMetaverse.UUID" /> of the friend, the value is a <seealso cref="T:OpenMetaverse.FriendInfo" /> 9884
9885 The Key is the <seealso cref="T:OpenMetaverse.UUID"/> of the friend, the value is a <seealso cref="T:OpenMetaverse.FriendInfo"/>
7948 object that contains detailed information including permissions you have and have given to the friend 9886 object that contains detailed information including permissions you have and have given to the friend
7949 </summary> 9887 </summary>
7950 </member> 9888 </member>
7951 <member name="F:OpenMetaverse.FriendsManager.FriendRequests"> 9889 <member name="F:OpenMetaverse.FriendsManager.FriendRequests">
7952 <summary> 9890 <summary>
7953 A Dictionary of key/value pairs containing current pending frienship offers. 9891 A Dictionary of key/value pairs containing current pending frienship offers.
7954 The key is the <seealso cref="T:OpenMetaverse.UUID" /> of the avatar making the request, 9892
7955 the value is the <seealso cref="T:OpenMetaverse.UUID" /> of the request which is used to accept 9893 The key is the <seealso cref="T:OpenMetaverse.UUID"/> of the avatar making the request,
9894 the value is the <seealso cref="T:OpenMetaverse.UUID"/> of the request which is used to accept
7956 or decline the friendship offer 9895 or decline the friendship offer
7957 </summary> 9896 </summary>
7958 </member> 9897 </member>
7959 <member name="E:OpenMetaverse.FriendsManager.FriendOnline"> 9898 <member name="M:OpenMetaverse.FriendsManager.#ctor(OpenMetaverse.GridClient)">
7960 <summary>Raised when the simulator sends notification one of the members in our friends list comes online</summary> 9899 <summary>
7961 </member> 9900 Internal constructor
7962 <member name="E:OpenMetaverse.FriendsManager.FriendOffline"> 9901 </summary>
7963 <summary>Raised when the simulator sends notification one of the members in our friends list goes offline</summary> 9902 <param name="client">A reference to the GridClient Object</param>
7964 </member>
7965 <member name="E:OpenMetaverse.FriendsManager.FriendRightsUpdate">
7966 <summary>Raised when the simulator sends notification one of the members in our friends list grants or revokes permissions</summary>
7967 </member>
7968 <member name="E:OpenMetaverse.FriendsManager.FriendNames">
7969 <summary>Raised when the simulator sends us the names on our friends list</summary>
7970 </member>
7971 <member name="E:OpenMetaverse.FriendsManager.FriendshipOffered">
7972 <summary>Raised when the simulator sends notification another agent is offering us friendship</summary>
7973 </member>
7974 <member name="E:OpenMetaverse.FriendsManager.FriendshipResponse">
7975 <summary>Raised when a request we sent to friend another agent is accepted or declined</summary>
7976 </member>
7977 <member name="E:OpenMetaverse.FriendsManager.FriendshipTerminated">
7978 <summary>Raised when the simulator sends notification one of the members in our friends list has terminated
7979 our friendship</summary>
7980 </member>
7981 <member name="E:OpenMetaverse.FriendsManager.FriendFoundReply">
7982 <summary>Raised when the simulator sends the location of a friend we have
7983 requested map location info for</summary>
7984 </member>
7985 <member name="M:OpenMetaverse.FriendsManager.OnFriendOnline(OpenMetaverse.FriendInfoEventArgs)">
7986 <summary>Raises the FriendOnline event</summary>
7987 <param name="e">A FriendInfoEventArgs object containing the
7988 data returned from the data server</param>
7989 </member>
7990 <member name="M:OpenMetaverse.FriendsManager.OnFriendOffline(OpenMetaverse.FriendInfoEventArgs)">
7991 <summary>Raises the FriendOffline event</summary>
7992 <param name="e">A FriendInfoEventArgs object containing the
7993 data returned from the data server</param>
7994 </member>
7995 <member name="M:OpenMetaverse.FriendsManager.OnFriendRights(OpenMetaverse.FriendInfoEventArgs)">
7996 <summary>Raises the FriendRightsUpdate event</summary>
7997 <param name="e">A FriendInfoEventArgs object containing the
7998 data returned from the data server</param>
7999 </member>
8000 <member name="M:OpenMetaverse.FriendsManager.OnFriendNames(OpenMetaverse.FriendNamesEventArgs)">
8001 <summary>Raises the FriendNames event</summary>
8002 <param name="e">A FriendNamesEventArgs object containing the
8003 data returned from the data server</param>
8004 </member>
8005 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipOffered(OpenMetaverse.FriendshipOfferedEventArgs)">
8006 <summary>Raises the FriendshipOffered event</summary>
8007 <param name="e">A FriendshipOfferedEventArgs object containing the
8008 data returned from the data server</param>
8009 </member>
8010 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipResponse(OpenMetaverse.FriendshipResponseEventArgs)">
8011 <summary>Raises the FriendshipResponse event</summary>
8012 <param name="e">A FriendshipResponseEventArgs object containing the
8013 data returned from the data server</param>
8014 </member>
8015 <member name="M:OpenMetaverse.FriendsManager.OnFriendshipTerminated(OpenMetaverse.FriendshipTerminatedEventArgs)">
8016 <summary>Raises the FriendshipTerminated event</summary>
8017 <param name="e">A FriendshipTerminatedEventArgs object containing the
8018 data returned from the data server</param>
8019 </member>
8020 <member name="M:OpenMetaverse.FriendsManager.OnFriendFoundReply(OpenMetaverse.FriendFoundReplyEventArgs)">
8021 <summary>Raises the FriendFoundReply event</summary>
8022 <param name="e">A FriendFoundReplyEventArgs object containing the
8023 data returned from the data server</param>
8024 </member> 9903 </member>
8025 <member name="M:OpenMetaverse.FriendsManager.AcceptFriendship(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 9904 <member name="M:OpenMetaverse.FriendsManager.AcceptFriendship(OpenMetaverse.UUID,OpenMetaverse.UUID)">
8026 <summary> 9905 <summary>
@@ -8033,8 +9912,7 @@
8033 <summary> 9912 <summary>
8034 Decline a friendship request 9913 Decline a friendship request
8035 </summary> 9914 </summary>
8036 <param name="fromAgentID"> 9915 <param name="fromAgentID"><seealso cref="T:OpenMetaverse.UUID"/> of friend</param>
8037 <seealso cref="T:OpenMetaverse.UUID" /> of friend</param>
8038 <param name="imSessionID">imSessionID of the friendship request message</param> 9916 <param name="imSessionID">imSessionID of the friendship request message</param>
8039 </member> 9917 </member>
8040 <member name="M:OpenMetaverse.FriendsManager.OfferFriendship(OpenMetaverse.UUID)"> 9918 <member name="M:OpenMetaverse.FriendsManager.OfferFriendship(OpenMetaverse.UUID)">
@@ -8065,7 +9943,7 @@
8065 <summary> 9943 <summary>
8066 Change the rights of a friend avatar. 9944 Change the rights of a friend avatar.
8067 </summary> 9945 </summary>
8068 <param name="friendID">the <seealso cref="T:OpenMetaverse.UUID" /> of the friend</param> 9946 <param name="friendID">the <seealso cref="T:OpenMetaverse.UUID"/> of the friend</param>
8069 <param name="rights">the new rights to give the friend</param> 9947 <param name="rights">the new rights to give the friend</param>
8070 <remarks>This method will implicitly set the rights to those passed in the rights parameter.</remarks> 9948 <remarks>This method will implicitly set the rights to those passed in the rights parameter.</remarks>
8071 </member> 9949 </member>
@@ -8074,9 +9952,7 @@
8074 Use to map a friends location on the grid. 9952 Use to map a friends location on the grid.
8075 </summary> 9953 </summary>
8076 <param name="friendID">Friends UUID to find</param> 9954 <param name="friendID">Friends UUID to find</param>
8077 <remarks> 9955 <remarks><seealso cref="E:OnFriendFound"/></remarks>
8078 <seealso cref="E:OnFriendFound" />
8079 </remarks>
8080 </member> 9956 </member>
8081 <member name="M:OpenMetaverse.FriendsManager.TrackFriend(OpenMetaverse.UUID)"> 9957 <member name="M:OpenMetaverse.FriendsManager.TrackFriend(OpenMetaverse.UUID)">
8082 <summary> 9958 <summary>
@@ -8094,8 +9970,7 @@
8094 <summary> 9970 <summary>
8095 This handles the asynchronous response of a RequestAvatarNames call. 9971 This handles the asynchronous response of a RequestAvatarNames call.
8096 </summary> 9972 </summary>
8097 <param name="sender"> 9973 <param name="sender"></param>
8098 </param>
8099 <param name="e">names cooresponding to the the list of IDs sent the the RequestAvatarNames call.</param> 9974 <param name="e">names cooresponding to the the list of IDs sent the the RequestAvatarNames call.</param>
8100 </member> 9975 </member>
8101 <member name="M:OpenMetaverse.FriendsManager.OnlineNotificationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 9976 <member name="M:OpenMetaverse.FriendsManager.OnlineNotificationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
@@ -8120,15 +9995,41 @@
8120 </member> 9995 </member>
8121 <member name="M:OpenMetaverse.FriendsManager.Network_OnLoginResponse(System.Boolean,System.Boolean,System.String,System.String,OpenMetaverse.LoginResponseData)"> 9996 <member name="M:OpenMetaverse.FriendsManager.Network_OnLoginResponse(System.Boolean,System.Boolean,System.String,System.String,OpenMetaverse.LoginResponseData)">
8122 <summary> 9997 <summary>
8123 Populate FriendList <seealso cref="!:InternalDictionary" /> with data from the login reply 9998 Populate FriendList <seealso cref="!:InternalDictionary"/> with data from the login reply
8124 </summary> 9999 </summary>
8125 <param name="loginSuccess">true if login was successful</param> 10000 <param name="loginSuccess">true if login was successful</param>
8126 <param name="redirect">true if login request is requiring a redirect</param> 10001 <param name="redirect">true if login request is requiring a redirect</param>
8127 <param name="message">A string containing the response to the login request</param> 10002 <param name="message">A string containing the response to the login request</param>
8128 <param name="reason">A string containing the reason for the request</param> 10003 <param name="reason">A string containing the reason for the request</param>
8129 <param name="replyData">A <seealso cref="T:OpenMetaverse.LoginResponseData" /> object containing the decoded 10004 <param name="replyData">A <seealso cref="T:OpenMetaverse.LoginResponseData"/> object containing the decoded
8130 reply from the login server</param> 10005 reply from the login server</param>
8131 </member> 10006 </member>
10007 <member name="E:OpenMetaverse.FriendsManager.FriendOnline">
10008 <summary>Raised when the simulator sends notification one of the members in our friends list comes online</summary>
10009 </member>
10010 <member name="E:OpenMetaverse.FriendsManager.FriendOffline">
10011 <summary>Raised when the simulator sends notification one of the members in our friends list goes offline</summary>
10012 </member>
10013 <member name="E:OpenMetaverse.FriendsManager.FriendRightsUpdate">
10014 <summary>Raised when the simulator sends notification one of the members in our friends list grants or revokes permissions</summary>
10015 </member>
10016 <member name="E:OpenMetaverse.FriendsManager.FriendNames">
10017 <summary>Raised when the simulator sends us the names on our friends list</summary>
10018 </member>
10019 <member name="E:OpenMetaverse.FriendsManager.FriendshipOffered">
10020 <summary>Raised when the simulator sends notification another agent is offering us friendship</summary>
10021 </member>
10022 <member name="E:OpenMetaverse.FriendsManager.FriendshipResponse">
10023 <summary>Raised when a request we sent to friend another agent is accepted or declined</summary>
10024 </member>
10025 <member name="E:OpenMetaverse.FriendsManager.FriendshipTerminated">
10026 <summary>Raised when the simulator sends notification one of the members in our friends list has terminated
10027 our friendship</summary>
10028 </member>
10029 <member name="E:OpenMetaverse.FriendsManager.FriendFoundReply">
10030 <summary>Raised when the simulator sends the location of a friend we have
10031 requested map location info for</summary>
10032 </member>
8132 <member name="T:OpenMetaverse.FriendInfoEventArgs"> 10033 <member name="T:OpenMetaverse.FriendInfoEventArgs">
8133 <summary>Contains information on a member of our friends list</summary> 10034 <summary>Contains information on a member of our friends list</summary>
8134 </member> 10035 </member>
@@ -8148,11 +10049,11 @@
8148 <summary> 10049 <summary>
8149 Construct a new instance of the FriendNamesEventArgs class 10050 Construct a new instance of the FriendNamesEventArgs class
8150 </summary> 10051 </summary>
8151 <param name="names">A dictionary where the Key is the ID of the Agent, 10052 <param name="names">A dictionary where the Key is the ID of the Agent,
8152 and the Value is a string containing their name</param> 10053 and the Value is a string containing their name</param>
8153 </member> 10054 </member>
8154 <member name="P:OpenMetaverse.FriendNamesEventArgs.Names"> 10055 <member name="P:OpenMetaverse.FriendNamesEventArgs.Names">
8155 <summary>A dictionary where the Key is the ID of the Agent, 10056 <summary>A dictionary where the Key is the ID of the Agent,
8156 and the Value is a string containing their name</summary> 10057 and the Value is a string containing their name</summary>
8157 </member> 10058 </member>
8158 <member name="T:OpenMetaverse.FriendshipOfferedEventArgs"> 10059 <member name="T:OpenMetaverse.FriendshipOfferedEventArgs">
@@ -8164,7 +10065,7 @@
8164 </summary> 10065 </summary>
8165 <param name="agentID">The ID of the agent requesting friendship</param> 10066 <param name="agentID">The ID of the agent requesting friendship</param>
8166 <param name="agentName">The name of the agent requesting friendship</param> 10067 <param name="agentName">The name of the agent requesting friendship</param>
8167 <param name="imSessionID">The ID of the session, used in accepting or declining the 10068 <param name="imSessionID">The ID of the session, used in accepting or declining the
8168 friendship offer</param> 10069 friendship offer</param>
8169 </member> 10070 </member>
8170 <member name="P:OpenMetaverse.FriendshipOfferedEventArgs.AgentID"> 10071 <member name="P:OpenMetaverse.FriendshipOfferedEventArgs.AgentID">
@@ -8174,7 +10075,7 @@
8174 <summary>Get the name of the agent requesting friendship</summary> 10075 <summary>Get the name of the agent requesting friendship</summary>
8175 </member> 10076 </member>
8176 <member name="P:OpenMetaverse.FriendshipOfferedEventArgs.SessionID"> 10077 <member name="P:OpenMetaverse.FriendshipOfferedEventArgs.SessionID">
8177 <summary>Get the ID of the session, used in accepting or declining the 10078 <summary>Get the ID of the session, used in accepting or declining the
8178 friendship offer</summary> 10079 friendship offer</summary>
8179 </member> 10080 </member>
8180 <member name="T:OpenMetaverse.FriendshipResponseEventArgs"> 10081 <member name="T:OpenMetaverse.FriendshipResponseEventArgs">
@@ -8215,7 +10116,7 @@
8215 </member> 10116 </member>
8216 <member name="T:OpenMetaverse.FriendFoundReplyEventArgs"> 10117 <member name="T:OpenMetaverse.FriendFoundReplyEventArgs">
8217 <summary> 10118 <summary>
8218 Data sent in response to a <see cref="!:FindFriend" /> request which contains the information to allow us to map the friends location 10119 Data sent in response to a <see cref="!:FindFriend"/> request which contains the information to allow us to map the friends location
8219 </summary> 10120 </summary>
8220 </member> 10121 </member>
8221 <member name="M:OpenMetaverse.FriendFoundReplyEventArgs.#ctor(OpenMetaverse.UUID,System.UInt64,OpenMetaverse.Vector3)"> 10122 <member name="M:OpenMetaverse.FriendFoundReplyEventArgs.#ctor(OpenMetaverse.UUID,System.UInt64,OpenMetaverse.Vector3)">
@@ -8235,6345 +10136,2832 @@
8235 <member name="P:OpenMetaverse.FriendFoundReplyEventArgs.Location"> 10136 <member name="P:OpenMetaverse.FriendFoundReplyEventArgs.Location">
8236 <summary>Get the simulator local position where our friend is located</summary> 10137 <summary>Get the simulator local position where our friend is located</summary>
8237 </member> 10138 </member>
8238 <member name="T:OpenMetaverse.GridClient"> 10139 <member name="T:OpenMetaverse.Animations">
8239 <summary>
8240 Main class to expose grid functionality to clients. All of the
8241 classes needed for sending and receiving data are accessible through
8242 this class.
8243 </summary>
8244 <example>
8245 <code>
8246 // Example minimum code required to instantiate class and
8247 // connect to a simulator.
8248 using System;
8249 using System.Collections.Generic;
8250 using System.Text;
8251 using OpenMetaverse;
8252 namespace FirstBot
8253 {
8254 class Bot
8255 {
8256 public static GridClient Client;
8257 static void Main(string[] args)
8258 {
8259 Client = new GridClient(); // instantiates the GridClient class
8260 // to the global Client object
8261 // Login to Simulator
8262 Client.Network.Login("FirstName", "LastName", "Password", "FirstBot", "1.0");
8263 // Wait for a Keypress
8264 Console.ReadLine();
8265 // Logout of simulator
8266 Client.Network.Logout();
8267 }
8268 }
8269 }
8270 </code>
8271 </example>
8272 </member>
8273 <member name="M:OpenMetaverse.GridClient.#ctor">
8274 <summary>
8275 Default constructor
8276 </summary>
8277 </member>
8278 <member name="F:OpenMetaverse.GridClient.Network">
8279 <summary>Networking subsystem</summary>
8280 </member>
8281 <member name="F:OpenMetaverse.GridClient.Settings">
8282 <summary>Settings class including constant values and changeable
8283 parameters for everything</summary>
8284 </member>
8285 <member name="F:OpenMetaverse.GridClient.Parcels">
8286 <summary>Parcel (subdivided simulator lots) subsystem</summary>
8287 </member>
8288 <member name="F:OpenMetaverse.GridClient.Self">
8289 <summary>Our own avatars subsystem</summary>
8290 </member>
8291 <member name="F:OpenMetaverse.GridClient.Avatars">
8292 <summary>Other avatars subsystem</summary>
8293 </member>
8294 <member name="F:OpenMetaverse.GridClient.Estate">
8295 <summary>Estate subsystem</summary>
8296 </member>
8297 <member name="F:OpenMetaverse.GridClient.Friends">
8298 <summary>Friends list subsystem</summary>
8299 </member>
8300 <member name="F:OpenMetaverse.GridClient.Grid">
8301 <summary>Grid (aka simulator group) subsystem</summary>
8302 </member>
8303 <member name="F:OpenMetaverse.GridClient.Objects">
8304 <summary>Object subsystem</summary>
8305 </member>
8306 <member name="F:OpenMetaverse.GridClient.Groups">
8307 <summary>Group subsystem</summary>
8308 </member>
8309 <member name="F:OpenMetaverse.GridClient.Assets">
8310 <summary>Asset subsystem</summary>
8311 </member>
8312 <member name="F:OpenMetaverse.GridClient.Appearance">
8313 <summary>Appearance subsystem</summary>
8314 </member>
8315 <member name="F:OpenMetaverse.GridClient.Inventory">
8316 <summary>Inventory subsystem</summary>
8317 </member>
8318 <member name="F:OpenMetaverse.GridClient.Directory">
8319 <summary>Directory searches including classifieds, people, land
8320 sales, etc</summary>
8321 </member>
8322 <member name="F:OpenMetaverse.GridClient.Terrain">
8323 <summary>Handles land, wind, and cloud heightmaps</summary>
8324 </member>
8325 <member name="F:OpenMetaverse.GridClient.Sound">
8326 <summary>Handles sound-related networking</summary>
8327 </member>
8328 <member name="F:OpenMetaverse.GridClient.Throttle">
8329 <summary>Throttling total bandwidth usage, or allocating bandwidth
8330 for specific data stream types</summary>
8331 </member>
8332 <member name="M:OpenMetaverse.GridClient.ToString">
8333 <summary>
8334 Return the full name of this instance
8335 </summary>
8336 <returns>Client avatars full name</returns>
8337 </member>
8338 <member name="T:OpenMetaverse.GridLayerType">
8339 <summary>
8340 Map layer request type
8341 </summary>
8342 </member>
8343 <member name="F:OpenMetaverse.GridLayerType.Objects">
8344 <summary>Objects and terrain are shown</summary>
8345 </member>
8346 <member name="F:OpenMetaverse.GridLayerType.Terrain">
8347 <summary>Only the terrain is shown, no objects</summary>
8348 </member>
8349 <member name="F:OpenMetaverse.GridLayerType.LandForSale">
8350 <summary>Overlay showing land for sale and for auction</summary>
8351 </member>
8352 <member name="T:OpenMetaverse.GridItemType">
8353 <summary>
8354 Type of grid item, such as telehub, event, populator location, etc.
8355 </summary>
8356 </member>
8357 <member name="F:OpenMetaverse.GridItemType.Telehub">
8358 <summary>Telehub</summary>
8359 </member>
8360 <member name="F:OpenMetaverse.GridItemType.PgEvent">
8361 <summary>PG rated event</summary>
8362 </member>
8363 <member name="F:OpenMetaverse.GridItemType.MatureEvent">
8364 <summary>Mature rated event</summary>
8365 </member>
8366 <member name="F:OpenMetaverse.GridItemType.Popular">
8367 <summary>Popular location</summary>
8368 </member>
8369 <member name="F:OpenMetaverse.GridItemType.AgentLocations">
8370 <summary>Locations of avatar groups in a region</summary>
8371 </member>
8372 <member name="F:OpenMetaverse.GridItemType.LandForSale">
8373 <summary>Land for sale</summary>
8374 </member>
8375 <member name="F:OpenMetaverse.GridItemType.Classified">
8376 <summary>Classified ad</summary>
8377 </member>
8378 <member name="F:OpenMetaverse.GridItemType.AdultEvent">
8379 <summary>Adult rated event</summary>
8380 </member>
8381 <member name="F:OpenMetaverse.GridItemType.AdultLandForSale">
8382 <summary>Adult land for sale</summary>
8383 </member>
8384 <member name="T:OpenMetaverse.GridRegion">
8385 <summary> 10140 <summary>
8386 Information about a region on the grid map 10141 Static pre-defined animations available to all agents
8387 </summary> 10142 </summary>
8388 </member> 10143 </member>
8389 <member name="F:OpenMetaverse.GridRegion.X"> 10144 <member name="F:OpenMetaverse.Animations.AFRAID">
8390 <summary>Sim X position on World Map</summary> 10145 <summary>Agent with afraid expression on face</summary>
8391 </member>
8392 <member name="F:OpenMetaverse.GridRegion.Y">
8393 <summary>Sim Y position on World Map</summary>
8394 </member>
8395 <member name="F:OpenMetaverse.GridRegion.Name">
8396 <summary>Sim Name (NOTE: In lowercase!)</summary>
8397 </member>
8398 <member name="F:OpenMetaverse.GridRegion.Access">
8399 <summary>
8400 </summary>
8401 </member> 10146 </member>
8402 <member name="F:OpenMetaverse.GridRegion.RegionFlags"> 10147 <member name="F:OpenMetaverse.Animations.AIM_BAZOOKA_R">
8403 <summary>Appears to always be zero (None)</summary> 10148 <summary>Agent aiming a bazooka (right handed)</summary>
8404 </member> 10149 </member>
8405 <member name="F:OpenMetaverse.GridRegion.WaterHeight"> 10150 <member name="F:OpenMetaverse.Animations.AIM_BOW_L">
8406 <summary>Sim's defined Water Height</summary> 10151 <summary>Agent aiming a bow (left handed)</summary>
8407 </member> 10152 </member>
8408 <member name="F:OpenMetaverse.GridRegion.Agents"> 10153 <member name="F:OpenMetaverse.Animations.AIM_HANDGUN_R">
8409 <summary> 10154 <summary>Agent aiming a hand gun (right handed)</summary>
8410 </summary>
8411 </member> 10155 </member>
8412 <member name="F:OpenMetaverse.GridRegion.MapImageID"> 10156 <member name="F:OpenMetaverse.Animations.AIM_RIFLE_R">
8413 <summary>UUID of the World Map image</summary> 10157 <summary>Agent aiming a rifle (right handed)</summary>
8414 </member> 10158 </member>
8415 <member name="F:OpenMetaverse.GridRegion.RegionHandle"> 10159 <member name="F:OpenMetaverse.Animations.ANGRY">
8416 <summary>Unique identifier for this region, a combination of the X 10160 <summary>Agent with angry expression on face</summary>
8417 and Y position</summary>
8418 </member> 10161 </member>
8419 <member name="M:OpenMetaverse.GridRegion.ToString"> 10162 <member name="F:OpenMetaverse.Animations.AWAY">
8420 <summary> 10163 <summary>Agent hunched over (away)</summary>
8421 </summary>
8422 <returns>
8423 </returns>
8424 </member> 10164 </member>
8425 <member name="M:OpenMetaverse.GridRegion.GetHashCode"> 10165 <member name="F:OpenMetaverse.Animations.BACKFLIP">
8426 <summary> 10166 <summary>Agent doing a backflip</summary>
8427 </summary>
8428 <returns>
8429 </returns>
8430 </member> 10167 </member>
8431 <member name="M:OpenMetaverse.GridRegion.Equals(System.Object)"> 10168 <member name="F:OpenMetaverse.Animations.BELLY_LAUGH">
8432 <summary> 10169 <summary>Agent laughing while holding belly</summary>
8433 </summary>
8434 <param name="obj">
8435 </param>
8436 <returns>
8437 </returns>
8438 </member> 10170 </member>
8439 <member name="T:OpenMetaverse.GridLayer"> 10171 <member name="F:OpenMetaverse.Animations.BLOW_KISS">
8440 <summary> 10172 <summary>Agent blowing a kiss</summary>
8441 Visual chunk of the grid map
8442 </summary>
8443 </member> 10173 </member>
8444 <member name="T:OpenMetaverse.MapItem"> 10174 <member name="F:OpenMetaverse.Animations.BORED">
8445 <summary> 10175 <summary>Agent with bored expression on face</summary>
8446 Base class for Map Items
8447 </summary>
8448 </member> 10176 </member>
8449 <member name="F:OpenMetaverse.MapItem.GlobalX"> 10177 <member name="F:OpenMetaverse.Animations.BOW">
8450 <summary>The Global X position of the item</summary> 10178 <summary>Agent bowing to audience</summary>
8451 </member> 10179 </member>
8452 <member name="F:OpenMetaverse.MapItem.GlobalY"> 10180 <member name="F:OpenMetaverse.Animations.BRUSH">
8453 <summary>The Global Y position of the item</summary> 10181 <summary>Agent brushing himself/herself off</summary>
8454 </member> 10182 </member>
8455 <member name="P:OpenMetaverse.MapItem.LocalX"> 10183 <member name="F:OpenMetaverse.Animations.BUSY">
8456 <summary>Get the Local X position of the item</summary> 10184 <summary>Agent in busy mode</summary>
8457 </member> 10185 </member>
8458 <member name="P:OpenMetaverse.MapItem.LocalY"> 10186 <member name="F:OpenMetaverse.Animations.CLAP">
8459 <summary>Get the Local Y position of the item</summary> 10187 <summary>Agent clapping hands</summary>
8460 </member> 10188 </member>
8461 <member name="P:OpenMetaverse.MapItem.RegionHandle"> 10189 <member name="F:OpenMetaverse.Animations.COURTBOW">
8462 <summary>Get the Handle of the region</summary> 10190 <summary>Agent doing a curtsey bow</summary>
8463 </member> 10191 </member>
8464 <member name="T:OpenMetaverse.MapAgentLocation"> 10192 <member name="F:OpenMetaverse.Animations.CROUCH">
8465 <summary> 10193 <summary>Agent crouching</summary>
8466 Represents an agent or group of agents location
8467 </summary>
8468 </member> 10194 </member>
8469 <member name="T:OpenMetaverse.MapTelehub"> 10195 <member name="F:OpenMetaverse.Animations.CROUCHWALK">
8470 <summary> 10196 <summary>Agent crouching while walking</summary>
8471 Represents a Telehub location
8472 </summary>
8473 </member> 10197 </member>
8474 <member name="T:OpenMetaverse.MapLandForSale"> 10198 <member name="F:OpenMetaverse.Animations.CRY">
8475 <summary> 10199 <summary>Agent crying</summary>
8476 Represents a non-adult parcel of land for sale
8477 </summary>
8478 </member> 10200 </member>
8479 <member name="T:OpenMetaverse.MapAdultLandForSale"> 10201 <member name="F:OpenMetaverse.Animations.CUSTOMIZE">
8480 <summary> 10202 <summary>Agent unanimated with arms out (e.g. setting appearance)</summary>
8481 Represents an Adult parcel of land for sale
8482 </summary>
8483 </member> 10203 </member>
8484 <member name="T:OpenMetaverse.MapPGEvent"> 10204 <member name="F:OpenMetaverse.Animations.CUSTOMIZE_DONE">
8485 <summary> 10205 <summary>Agent re-animated after set appearance finished</summary>
8486 Represents a PG Event
8487 </summary>
8488 </member> 10206 </member>
8489 <member name="T:OpenMetaverse.MapMatureEvent"> 10207 <member name="F:OpenMetaverse.Animations.DANCE1">
8490 <summary> 10208 <summary>Agent dancing</summary>
8491 Represents a Mature event
8492 </summary>
8493 </member> 10209 </member>
8494 <member name="T:OpenMetaverse.MapAdultEvent"> 10210 <member name="F:OpenMetaverse.Animations.DANCE2">
8495 <summary> 10211 <summary>Agent dancing</summary>
8496 Represents an Adult event
8497 </summary>
8498 </member> 10212 </member>
8499 <member name="T:OpenMetaverse.GridManager"> 10213 <member name="F:OpenMetaverse.Animations.DANCE3">
8500 <summary> 10214 <summary>Agent dancing</summary>
8501 Manages grid-wide tasks such as the world map
8502 </summary>
8503 </member> 10215 </member>
8504 <member name="M:OpenMetaverse.GridManager.#ctor(OpenMetaverse.GridClient)"> 10216 <member name="F:OpenMetaverse.Animations.DANCE4">
8505 <summary> 10217 <summary>Agent dancing</summary>
8506 Constructor
8507 </summary>
8508 <param name="client">Instance of GridClient object to associate with this GridManager instance</param>
8509 </member> 10218 </member>
8510 <member name="F:OpenMetaverse.GridManager.m_CoarseLocationUpdate"> 10219 <member name="F:OpenMetaverse.Animations.DANCE5">
8511 <summary>The event subscribers. null if no subcribers</summary> 10220 <summary>Agent dancing</summary>
8512 </member> 10221 </member>
8513 <member name="F:OpenMetaverse.GridManager.m_CoarseLocationUpdateLock"> 10222 <member name="F:OpenMetaverse.Animations.DANCE6">
8514 <summary>Thread sync lock object</summary> 10223 <summary>Agent dancing</summary>
8515 </member> 10224 </member>
8516 <member name="F:OpenMetaverse.GridManager.m_GridRegion"> 10225 <member name="F:OpenMetaverse.Animations.DANCE7">
8517 <summary>The event subscribers. null if no subcribers</summary> 10226 <summary>Agent dancing</summary>
8518 </member> 10227 </member>
8519 <member name="F:OpenMetaverse.GridManager.m_GridRegionLock"> 10228 <member name="F:OpenMetaverse.Animations.DANCE8">
8520 <summary>Thread sync lock object</summary> 10229 <summary>Agent dancing</summary>
8521 </member> 10230 </member>
8522 <member name="F:OpenMetaverse.GridManager.m_GridLayer"> 10231 <member name="F:OpenMetaverse.Animations.DEAD">
8523 <summary>The event subscribers. null if no subcribers</summary> 10232 <summary>Agent on ground unanimated</summary>
8524 </member> 10233 </member>
8525 <member name="F:OpenMetaverse.GridManager.m_GridLayerLock"> 10234 <member name="F:OpenMetaverse.Animations.DRINK">
8526 <summary>Thread sync lock object</summary> 10235 <summary>Agent boozing it up</summary>
8527 </member> 10236 </member>
8528 <member name="F:OpenMetaverse.GridManager.m_GridItems"> 10237 <member name="F:OpenMetaverse.Animations.EMBARRASSED">
8529 <summary>The event subscribers. null if no subcribers</summary> 10238 <summary>Agent with embarassed expression on face</summary>
8530 </member> 10239 </member>
8531 <member name="F:OpenMetaverse.GridManager.m_GridItemsLock"> 10240 <member name="F:OpenMetaverse.Animations.EXPRESS_AFRAID">
8532 <summary>Thread sync lock object</summary> 10241 <summary>Agent with afraid expression on face</summary>
8533 </member> 10242 </member>
8534 <member name="F:OpenMetaverse.GridManager.m_RegionHandleReply"> 10243 <member name="F:OpenMetaverse.Animations.EXPRESS_ANGER">
8535 <summary>The event subscribers. null if no subcribers</summary> 10244 <summary>Agent with angry expression on face</summary>
8536 </member> 10245 </member>
8537 <member name="F:OpenMetaverse.GridManager.m_RegionHandleReplyLock"> 10246 <member name="F:OpenMetaverse.Animations.EXPRESS_BORED">
8538 <summary>Thread sync lock object</summary> 10247 <summary>Agent with bored expression on face</summary>
8539 </member> 10248 </member>
8540 <member name="F:OpenMetaverse.GridManager.Regions"> 10249 <member name="F:OpenMetaverse.Animations.EXPRESS_CRY">
8541 <summary>A dictionary of all the regions, indexed by region name</summary> 10250 <summary>Agent crying</summary>
8542 </member> 10251 </member>
8543 <member name="F:OpenMetaverse.GridManager.RegionsByHandle"> 10252 <member name="F:OpenMetaverse.Animations.EXPRESS_DISDAIN">
8544 <summary>A dictionary of all the regions, indexed by region handle</summary> 10253 <summary>Agent showing disdain (dislike) for something</summary>
8545 </member> 10254 </member>
8546 <member name="E:OpenMetaverse.GridManager.CoarseLocationUpdate"> 10255 <member name="F:OpenMetaverse.Animations.EXPRESS_EMBARRASSED">
8547 <summary>Raised when the simulator sends a <see cref="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket" /> 10256 <summary>Agent with embarassed expression on face</summary>
8548 containing the location of agents in the simulator</summary>
8549 </member> 10257 </member>
8550 <member name="E:OpenMetaverse.GridManager.GridRegion"> 10258 <member name="F:OpenMetaverse.Animations.EXPRESS_FROWN">
8551 <summary>Raised when the simulator sends a Region Data in response to 10259 <summary>Agent with frowning expression on face</summary>
8552 a Map request</summary>
8553 </member> 10260 </member>
8554 <member name="E:OpenMetaverse.GridManager.GridLayer"> 10261 <member name="F:OpenMetaverse.Animations.EXPRESS_KISS">
8555 <summary>Raised when the simulator sends GridLayer object containing 10262 <summary>Agent with kissy face</summary>
8556 a map tile coordinates and texture information</summary>
8557 </member> 10263 </member>
8558 <member name="E:OpenMetaverse.GridManager.GridItems"> 10264 <member name="F:OpenMetaverse.Animations.EXPRESS_LAUGH">
8559 <summary>Raised when the simulator sends GridItems object containing 10265 <summary>Agent expressing laughgter</summary>
8560 details on events, land sales at a specific location</summary>
8561 </member> 10266 </member>
8562 <member name="E:OpenMetaverse.GridManager.RegionHandleReply"> 10267 <member name="F:OpenMetaverse.Animations.EXPRESS_OPEN_MOUTH">
8563 <summary>Raised in response to a Region lookup</summary> 10268 <summary>Agent with open mouth</summary>
8564 </member> 10269 </member>
8565 <member name="P:OpenMetaverse.GridManager.SunPhase"> 10270 <member name="F:OpenMetaverse.Animations.EXPRESS_REPULSED">
8566 <summary>Unknown</summary> 10271 <summary>Agent with repulsed expression on face</summary>
8567 </member> 10272 </member>
8568 <member name="P:OpenMetaverse.GridManager.SunDirection"> 10273 <member name="F:OpenMetaverse.Animations.EXPRESS_SAD">
8569 <summary>Current direction of the sun</summary> 10274 <summary>Agent expressing sadness</summary>
8570 </member> 10275 </member>
8571 <member name="P:OpenMetaverse.GridManager.SunAngVelocity"> 10276 <member name="F:OpenMetaverse.Animations.EXPRESS_SHRUG">
8572 <summary>Current angular velocity of the sun</summary> 10277 <summary>Agent shrugging shoulders</summary>
8573 </member> 10278 </member>
8574 <member name="P:OpenMetaverse.GridManager.TimeOfDay"> 10279 <member name="F:OpenMetaverse.Animations.EXPRESS_SMILE">
8575 <summary>Microseconds since the start of SL 4-hour day</summary> 10280 <summary>Agent with a smile</summary>
8576 </member> 10281 </member>
8577 <member name="M:OpenMetaverse.GridManager.OnCoarseLocationUpdate(OpenMetaverse.CoarseLocationUpdateEventArgs)"> 10282 <member name="F:OpenMetaverse.Animations.EXPRESS_SURPRISE">
8578 <summary>Raises the CoarseLocationUpdate event</summary> 10283 <summary>Agent expressing surprise</summary>
8579 <param name="e">A CoarseLocationUpdateEventArgs object containing the
8580 data sent by simulator</param>
8581 </member> 10284 </member>
8582 <member name="M:OpenMetaverse.GridManager.OnGridRegion(OpenMetaverse.GridRegionEventArgs)"> 10285 <member name="F:OpenMetaverse.Animations.EXPRESS_TONGUE_OUT">
8583 <summary>Raises the GridRegion event</summary> 10286 <summary>Agent sticking tongue out</summary>
8584 <param name="e">A GridRegionEventArgs object containing the
8585 data sent by simulator</param>
8586 </member> 10287 </member>
8587 <member name="M:OpenMetaverse.GridManager.OnGridLayer(OpenMetaverse.GridLayerEventArgs)"> 10288 <member name="F:OpenMetaverse.Animations.EXPRESS_TOOTHSMILE">
8588 <summary>Raises the GridLayer event</summary> 10289 <summary>Agent with big toothy smile</summary>
8589 <param name="e">A GridLayerEventArgs object containing the
8590 data sent by simulator</param>
8591 </member> 10290 </member>
8592 <member name="M:OpenMetaverse.GridManager.OnGridItems(OpenMetaverse.GridItemsEventArgs)"> 10291 <member name="F:OpenMetaverse.Animations.EXPRESS_WINK">
8593 <summary>Raises the GridItems event</summary> 10292 <summary>Agent winking</summary>
8594 <param name="e">A GridItemEventArgs object containing the
8595 data sent by simulator</param>
8596 </member> 10293 </member>
8597 <member name="M:OpenMetaverse.GridManager.OnRegionHandleReply(OpenMetaverse.RegionHandleReplyEventArgs)"> 10294 <member name="F:OpenMetaverse.Animations.EXPRESS_WORRY">
8598 <summary>Raises the RegionHandleReply event</summary> 10295 <summary>Agent expressing worry</summary>
8599 <param name="e">A RegionHandleReplyEventArgs object containing the
8600 data sent by simulator</param>
8601 </member> 10296 </member>
8602 <member name="M:OpenMetaverse.GridManager.RequestMapLayer(OpenMetaverse.GridLayerType)"> 10297 <member name="F:OpenMetaverse.Animations.FALLDOWN">
8603 <summary> 10298 <summary>Agent falling down</summary>
8604 </summary>
8605 <param name="layer">
8606 </param>
8607 </member> 10299 </member>
8608 <member name="M:OpenMetaverse.GridManager.RequestMapRegion(System.String,OpenMetaverse.GridLayerType)"> 10300 <member name="F:OpenMetaverse.Animations.FEMALE_WALK">
8609 <summary> 10301 <summary>Agent walking (feminine version)</summary>
8610 Request a map layer
8611 </summary>
8612 <param name="regionName">The name of the region</param>
8613 <param name="layer">The type of layer</param>
8614 </member> 10302 </member>
8615 <member name="M:OpenMetaverse.GridManager.RequestMapBlocks(OpenMetaverse.GridLayerType,System.UInt16,System.UInt16,System.UInt16,System.UInt16,System.Boolean)"> 10303 <member name="F:OpenMetaverse.Animations.FINGER_WAG">
8616 <summary> 10304 <summary>Agent wagging finger (disapproval)</summary>
8617 </summary>
8618 <param name="layer">
8619 </param>
8620 <param name="minX">
8621 </param>
8622 <param name="minY">
8623 </param>
8624 <param name="maxX">
8625 </param>
8626 <param name="maxY">
8627 </param>
8628 <param name="returnNonExistent">
8629 </param>
8630 </member> 10305 </member>
8631 <member name="M:OpenMetaverse.GridManager.MapItems(System.UInt64,OpenMetaverse.GridItemType,OpenMetaverse.GridLayerType,System.Int32)"> 10306 <member name="F:OpenMetaverse.Animations.FIST_PUMP">
8632 <summary> 10307 <summary>I'm not sure I want to know</summary>
8633 </summary>
8634 <param name="regionHandle">
8635 </param>
8636 <param name="item">
8637 </param>
8638 <param name="layer">
8639 </param>
8640 <param name="timeoutMS">
8641 </param>
8642 <returns>
8643 </returns>
8644 </member> 10308 </member>
8645 <member name="M:OpenMetaverse.GridManager.RequestMapItems(System.UInt64,OpenMetaverse.GridItemType,OpenMetaverse.GridLayerType)"> 10309 <member name="F:OpenMetaverse.Animations.FLY">
8646 <summary> 10310 <summary>Agent in superman position</summary>
8647 </summary>
8648 <param name="regionHandle">
8649 </param>
8650 <param name="item">
8651 </param>
8652 <param name="layer">
8653 </param>
8654 </member> 10311 </member>
8655 <member name="M:OpenMetaverse.GridManager.RequestMainlandSims(OpenMetaverse.GridLayerType)"> 10312 <member name="F:OpenMetaverse.Animations.FLYSLOW">
8656 <summary> 10313 <summary>Agent in superman position</summary>
8657 Request data for all mainland (Linden managed) simulators
8658 </summary>
8659 </member> 10314 </member>
8660 <member name="M:OpenMetaverse.GridManager.RequestRegionHandle(OpenMetaverse.UUID)"> 10315 <member name="F:OpenMetaverse.Animations.HELLO">
8661 <summary> 10316 <summary>Agent greeting another</summary>
8662 Request the region handle for the specified region UUID
8663 </summary>
8664 <param name="regionID">UUID of the region to look up</param>
8665 </member> 10317 </member>
8666 <member name="M:OpenMetaverse.GridManager.GetGridRegion(System.String,OpenMetaverse.GridLayerType,OpenMetaverse.GridRegion@)"> 10318 <member name="F:OpenMetaverse.Animations.HOLD_BAZOOKA_R">
8667 <summary> 10319 <summary>Agent holding bazooka (right handed)</summary>
8668 Get grid region information using the region name, this function
8669 will block until it can find the region or gives up
8670 </summary>
8671 <param name="name">Name of sim you're looking for</param>
8672 <param name="layer">Layer that you are requesting</param>
8673 <param name="region">Will contain a GridRegion for the sim you're
8674 looking for if successful, otherwise an empty structure</param>
8675 <returns>True if the GridRegion was successfully fetched, otherwise
8676 false</returns>
8677 </member> 10320 </member>
8678 <member name="M:OpenMetaverse.GridManager.MapBlockReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10321 <member name="F:OpenMetaverse.Animations.HOLD_BOW_L">
8679 <summary>Process an incoming packet and raise the appropriate events</summary> 10322 <summary>Agent holding a bow (left handed)</summary>
8680 <param name="sender">The sender</param>
8681 <param name="e">The EventArgs object containing the packet data</param>
8682 </member> 10323 </member>
8683 <member name="M:OpenMetaverse.GridManager.MapItemReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10324 <member name="F:OpenMetaverse.Animations.HOLD_HANDGUN_R">
8684 <summary>Process an incoming packet and raise the appropriate events</summary> 10325 <summary>Agent holding a handgun (right handed)</summary>
8685 <param name="sender">The sender</param>
8686 <param name="e">The EventArgs object containing the packet data</param>
8687 </member> 10326 </member>
8688 <member name="M:OpenMetaverse.GridManager.SimulatorViewerTimeMessageHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10327 <member name="F:OpenMetaverse.Animations.HOLD_RIFLE_R">
8689 <summary>Process an incoming packet and raise the appropriate events</summary> 10328 <summary>Agent holding a rifle (right handed)</summary>
8690 <param name="sender">The sender</param>
8691 <param name="e">The EventArgs object containing the packet data</param>
8692 </member> 10329 </member>
8693 <member name="M:OpenMetaverse.GridManager.CoarseLocationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10330 <member name="F:OpenMetaverse.Animations.HOLD_THROW_R">
8694 <summary>Process an incoming packet and raise the appropriate events</summary> 10331 <summary>Agent throwing an object (right handed)</summary>
8695 <param name="sender">The sender</param>
8696 <param name="e">The EventArgs object containing the packet data</param>
8697 </member> 10332 </member>
8698 <member name="M:OpenMetaverse.GridManager.RegionHandleReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10333 <member name="F:OpenMetaverse.Animations.HOVER">
8699 <summary>Process an incoming packet and raise the appropriate events</summary> 10334 <summary>Agent in static hover</summary>
8700 <param name="sender">The sender</param>
8701 <param name="e">The EventArgs object containing the packet data</param>
8702 </member> 10335 </member>
8703 <member name="T:OpenMetaverse.GroupMember"> 10336 <member name="F:OpenMetaverse.Animations.HOVER_DOWN">
8704 <summary> 10337 <summary>Agent hovering downward</summary>
8705 Avatar group management
8706 </summary>
8707 </member> 10338 </member>
8708 <member name="F:OpenMetaverse.GroupMember.ID"> 10339 <member name="F:OpenMetaverse.Animations.HOVER_UP">
8709 <summary>Key of Group Member</summary> 10340 <summary>Agent hovering upward</summary>
8710 </member> 10341 </member>
8711 <member name="F:OpenMetaverse.GroupMember.Contribution"> 10342 <member name="F:OpenMetaverse.Animations.IMPATIENT">
8712 <summary>Total land contribution</summary> 10343 <summary>Agent being impatient</summary>
8713 </member> 10344 </member>
8714 <member name="F:OpenMetaverse.GroupMember.OnlineStatus"> 10345 <member name="F:OpenMetaverse.Animations.JUMP">
8715 <summary>Online status information</summary> 10346 <summary>Agent jumping</summary>
8716 </member> 10347 </member>
8717 <member name="F:OpenMetaverse.GroupMember.Powers"> 10348 <member name="F:OpenMetaverse.Animations.JUMP_FOR_JOY">
8718 <summary>Abilities that the Group Member has</summary> 10349 <summary>Agent jumping with fervor</summary>
8719 </member> 10350 </member>
8720 <member name="F:OpenMetaverse.GroupMember.Title"> 10351 <member name="F:OpenMetaverse.Animations.KISS_MY_BUTT">
8721 <summary>Current group title</summary> 10352 <summary>Agent point to lips then rear end</summary>
8722 </member> 10353 </member>
8723 <member name="F:OpenMetaverse.GroupMember.IsOwner"> 10354 <member name="F:OpenMetaverse.Animations.LAND">
8724 <summary>Is a group owner</summary> 10355 <summary>Agent landing from jump, finished flight, etc</summary>
8725 </member> 10356 </member>
8726 <member name="T:OpenMetaverse.GroupRole"> 10357 <member name="F:OpenMetaverse.Animations.LAUGH_SHORT">
8727 <summary> 10358 <summary>Agent laughing</summary>
8728 Role manager for a group
8729 </summary>
8730 </member> 10359 </member>
8731 <member name="F:OpenMetaverse.GroupRole.GroupID"> 10360 <member name="F:OpenMetaverse.Animations.MEDIUM_LAND">
8732 <summary>Key of the group</summary> 10361 <summary>Agent landing from jump, finished flight, etc</summary>
8733 </member> 10362 </member>
8734 <member name="F:OpenMetaverse.GroupRole.ID"> 10363 <member name="F:OpenMetaverse.Animations.MOTORCYCLE_SIT">
8735 <summary>Key of Role</summary> 10364 <summary>Agent sitting on a motorcycle</summary>
8736 </member> 10365 </member>
8737 <member name="F:OpenMetaverse.GroupRole.Name"> 10366 <member name="F:OpenMetaverse.Animations.MUSCLE_BEACH">
8738 <summary>Name of Role</summary> 10367 <summary></summary>
8739 </member> 10368 </member>
8740 <member name="F:OpenMetaverse.GroupRole.Title"> 10369 <member name="F:OpenMetaverse.Animations.NO">
8741 <summary>Group Title associated with Role</summary> 10370 <summary>Agent moving head side to side</summary>
8742 </member> 10371 </member>
8743 <member name="F:OpenMetaverse.GroupRole.Description"> 10372 <member name="F:OpenMetaverse.Animations.NO_UNHAPPY">
8744 <summary>Description of Role</summary> 10373 <summary>Agent moving head side to side with unhappy expression</summary>
8745 </member> 10374 </member>
8746 <member name="F:OpenMetaverse.GroupRole.Powers"> 10375 <member name="F:OpenMetaverse.Animations.NYAH_NYAH">
8747 <summary>Abilities Associated with Role</summary> 10376 <summary>Agent taunting another</summary>
8748 </member> 10377 </member>
8749 <member name="M:OpenMetaverse.GroupRole.ToString"> 10378 <member name="F:OpenMetaverse.Animations.ONETWO_PUNCH">
8750 <summary>Returns the role's title</summary> 10379 <summary></summary>
8751 <returns>The role's title</returns>
8752 </member> 10380 </member>
8753 <member name="T:OpenMetaverse.GroupTitle"> 10381 <member name="F:OpenMetaverse.Animations.PEACE">
8754 <summary> 10382 <summary>Agent giving peace sign</summary>
8755 Class to represent Group Title
8756 </summary>
8757 </member> 10383 </member>
8758 <member name="F:OpenMetaverse.GroupTitle.GroupID"> 10384 <member name="F:OpenMetaverse.Animations.POINT_ME">
8759 <summary>Key of the group</summary> 10385 <summary>Agent pointing at self</summary>
8760 </member> 10386 </member>
8761 <member name="F:OpenMetaverse.GroupTitle.RoleID"> 10387 <member name="F:OpenMetaverse.Animations.POINT_YOU">
8762 <summary>ID of the role title belongs to</summary> 10388 <summary>Agent pointing at another</summary>
8763 </member> 10389 </member>
8764 <member name="F:OpenMetaverse.GroupTitle.Title"> 10390 <member name="F:OpenMetaverse.Animations.PRE_JUMP">
8765 <summary>Group Title</summary> 10391 <summary>Agent preparing for jump (bending knees)</summary>
8766 </member> 10392 </member>
8767 <member name="F:OpenMetaverse.GroupTitle.Selected"> 10393 <member name="F:OpenMetaverse.Animations.PUNCH_LEFT">
8768 <summary>Whether title is Active</summary> 10394 <summary>Agent punching with left hand</summary>
8769 </member> 10395 </member>
8770 <member name="M:OpenMetaverse.GroupTitle.ToString"> 10396 <member name="F:OpenMetaverse.Animations.PUNCH_RIGHT">
8771 <summary>Returns group title</summary> 10397 <summary>Agent punching with right hand</summary>
8772 </member> 10398 </member>
8773 <member name="T:OpenMetaverse.Group"> 10399 <member name="F:OpenMetaverse.Animations.REPULSED">
8774 <summary> 10400 <summary>Agent acting repulsed</summary>
8775 Represents a group on the grid
8776 </summary>
8777 </member> 10401 </member>
8778 <member name="F:OpenMetaverse.Group.ID"> 10402 <member name="F:OpenMetaverse.Animations.ROUNDHOUSE_KICK">
8779 <summary>Key of Group</summary> 10403 <summary>Agent trying to be Chuck Norris</summary>
8780 </member> 10404 </member>
8781 <member name="F:OpenMetaverse.Group.InsigniaID"> 10405 <member name="F:OpenMetaverse.Animations.RPS_COUNTDOWN">
8782 <summary>Key of Group Insignia</summary> 10406 <summary>Rocks, Paper, Scissors 1, 2, 3</summary>
8783 </member> 10407 </member>
8784 <member name="F:OpenMetaverse.Group.FounderID"> 10408 <member name="F:OpenMetaverse.Animations.RPS_PAPER">
8785 <summary>Key of Group Founder</summary> 10409 <summary>Agent with hand flat over other hand</summary>
8786 </member> 10410 </member>
8787 <member name="F:OpenMetaverse.Group.OwnerRole"> 10411 <member name="F:OpenMetaverse.Animations.RPS_ROCK">
8788 <summary>Key of Group Role for Owners</summary> 10412 <summary>Agent with fist over other hand</summary>
8789 </member> 10413 </member>
8790 <member name="F:OpenMetaverse.Group.Name"> 10414 <member name="F:OpenMetaverse.Animations.RPS_SCISSORS">
8791 <summary>Name of Group</summary> 10415 <summary>Agent with two fingers spread over other hand</summary>
8792 </member> 10416 </member>
8793 <member name="F:OpenMetaverse.Group.Charter"> 10417 <member name="F:OpenMetaverse.Animations.RUN">
8794 <summary>Text of Group Charter</summary> 10418 <summary>Agent running</summary>
8795 </member> 10419 </member>
8796 <member name="F:OpenMetaverse.Group.MemberTitle"> 10420 <member name="F:OpenMetaverse.Animations.SAD">
8797 <summary>Title of "everyone" role</summary> 10421 <summary>Agent appearing sad</summary>
8798 </member> 10422 </member>
8799 <member name="F:OpenMetaverse.Group.OpenEnrollment"> 10423 <member name="F:OpenMetaverse.Animations.SALUTE">
8800 <summary>Is the group open for enrolement to everyone</summary> 10424 <summary>Agent saluting</summary>
8801 </member> 10425 </member>
8802 <member name="F:OpenMetaverse.Group.ShowInList"> 10426 <member name="F:OpenMetaverse.Animations.SHOOT_BOW_L">
8803 <summary>Will group show up in search</summary> 10427 <summary>Agent shooting bow (left handed)</summary>
8804 </member> 10428 </member>
8805 <member name="F:OpenMetaverse.Group.Powers"> 10429 <member name="F:OpenMetaverse.Animations.SHOUT">
8806 <summary> 10430 <summary>Agent cupping mouth as if shouting</summary>
8807 </summary>
8808 </member> 10431 </member>
8809 <member name="F:OpenMetaverse.Group.AcceptNotices"> 10432 <member name="F:OpenMetaverse.Animations.SHRUG">
8810 <summary> 10433 <summary>Agent shrugging shoulders</summary>
8811 </summary>
8812 </member> 10434 </member>
8813 <member name="F:OpenMetaverse.Group.AllowPublish"> 10435 <member name="F:OpenMetaverse.Animations.SIT">
8814 <summary> 10436 <summary>Agent in sit position</summary>
8815 </summary>
8816 </member> 10437 </member>
8817 <member name="F:OpenMetaverse.Group.MaturePublish"> 10438 <member name="F:OpenMetaverse.Animations.SIT_FEMALE">
8818 <summary>Is the group Mature</summary> 10439 <summary>Agent in sit position (feminine)</summary>
8819 </member> 10440 </member>
8820 <member name="F:OpenMetaverse.Group.MembershipFee"> 10441 <member name="F:OpenMetaverse.Animations.SIT_GENERIC">
8821 <summary>Cost of group membership</summary> 10442 <summary>Agent in sit position (generic)</summary>
8822 </member> 10443 </member>
8823 <member name="F:OpenMetaverse.Group.Money"> 10444 <member name="F:OpenMetaverse.Animations.SIT_GROUND">
8824 <summary> 10445 <summary>Agent sitting on ground</summary>
8825 </summary>
8826 </member> 10446 </member>
8827 <member name="F:OpenMetaverse.Group.Contribution"> 10447 <member name="F:OpenMetaverse.Animations.SIT_GROUND_staticRAINED">
8828 <summary> 10448 <summary>Agent sitting on ground</summary>
8829 </summary>
8830 </member> 10449 </member>
8831 <member name="F:OpenMetaverse.Group.GroupMembershipCount"> 10450 <member name="F:OpenMetaverse.Animations.SIT_TO_STAND">
8832 <summary>The total number of current members this group has</summary> 10451 <summary></summary>
8833 </member> 10452 </member>
8834 <member name="F:OpenMetaverse.Group.GroupRolesCount"> 10453 <member name="F:OpenMetaverse.Animations.SLEEP">
8835 <summary>The number of roles this group has configured</summary> 10454 <summary>Agent sleeping on side</summary>
8836 </member> 10455 </member>
8837 <member name="F:OpenMetaverse.Group.ListInProfile"> 10456 <member name="F:OpenMetaverse.Animations.SMOKE_IDLE">
8838 <summary>Show this group in agent's profile</summary> 10457 <summary>Agent smoking</summary>
8839 </member> 10458 </member>
8840 <member name="M:OpenMetaverse.Group.ToString"> 10459 <member name="F:OpenMetaverse.Animations.SMOKE_INHALE">
8841 <summary>Returns the name of the group</summary> 10460 <summary>Agent inhaling smoke</summary>
8842 <returns>A string containing the name of the group</returns>
8843 </member> 10461 </member>
8844 <member name="T:OpenMetaverse.Vote"> 10462 <member name="F:OpenMetaverse.Animations.SMOKE_THROW_DOWN">
8845 <summary> 10463 <summary></summary>
8846 A group Vote
8847 </summary>
8848 </member> 10464 </member>
8849 <member name="F:OpenMetaverse.Vote.Candidate"> 10465 <member name="F:OpenMetaverse.Animations.SNAPSHOT">
8850 <summary>Key of Avatar who created Vote</summary> 10466 <summary>Agent taking a picture</summary>
8851 </member> 10467 </member>
8852 <member name="F:OpenMetaverse.Vote.VoteString"> 10468 <member name="F:OpenMetaverse.Animations.STAND">
8853 <summary>Text of the Vote proposal</summary> 10469 <summary>Agent standing</summary>
8854 </member> 10470 </member>
8855 <member name="F:OpenMetaverse.Vote.NumVotes"> 10471 <member name="F:OpenMetaverse.Animations.STANDUP">
8856 <summary>Total number of votes</summary> 10472 <summary>Agent standing up</summary>
8857 </member> 10473 </member>
8858 <member name="T:OpenMetaverse.GroupProposal"> 10474 <member name="F:OpenMetaverse.Animations.STAND_1">
8859 <summary> 10475 <summary>Agent standing</summary>
8860 A group proposal
8861 </summary>
8862 </member> 10476 </member>
8863 <member name="F:OpenMetaverse.GroupProposal.VoteText"> 10477 <member name="F:OpenMetaverse.Animations.STAND_2">
8864 <summary>The Text of the proposal</summary> 10478 <summary>Agent standing</summary>
8865 </member> 10479 </member>
8866 <member name="F:OpenMetaverse.GroupProposal.Quorum"> 10480 <member name="F:OpenMetaverse.Animations.STAND_3">
8867 <summary>The minimum number of members that must vote before proposal passes or failes</summary> 10481 <summary>Agent standing</summary>
8868 </member> 10482 </member>
8869 <member name="F:OpenMetaverse.GroupProposal.Majority"> 10483 <member name="F:OpenMetaverse.Animations.STAND_4">
8870 <summary>The required ration of yes/no votes required for vote to pass</summary> 10484 <summary>Agent standing</summary>
8871 <remarks>The three options are Simple Majority, 2/3 Majority, and Unanimous</remarks>
8872 TODO: this should be an enum</member>
8873 <member name="F:OpenMetaverse.GroupProposal.Duration">
8874 <summary>The duration in days votes are accepted</summary>
8875 </member> 10485 </member>
8876 <member name="T:OpenMetaverse.GroupAccountSummary"> 10486 <member name="F:OpenMetaverse.Animations.STRETCH">
8877 <summary> 10487 <summary>Agent stretching</summary>
8878 </summary>
8879 </member> 10488 </member>
8880 <member name="F:OpenMetaverse.GroupAccountSummary.IntervalDays"> 10489 <member name="F:OpenMetaverse.Animations.STRIDE">
8881 <summary> 10490 <summary>Agent in stride (fast walk)</summary>
8882 </summary>
8883 </member> 10491 </member>
8884 <member name="F:OpenMetaverse.GroupAccountSummary.CurrentInterval"> 10492 <member name="F:OpenMetaverse.Animations.SURF">
8885 <summary> 10493 <summary>Agent surfing</summary>
8886 </summary>
8887 </member> 10494 </member>
8888 <member name="F:OpenMetaverse.GroupAccountSummary.StartDate"> 10495 <member name="F:OpenMetaverse.Animations.SURPRISE">
8889 <summary> 10496 <summary>Agent acting surprised</summary>
8890 </summary>
8891 </member> 10497 </member>
8892 <member name="F:OpenMetaverse.GroupAccountSummary.Balance"> 10498 <member name="F:OpenMetaverse.Animations.SWORD_STRIKE">
8893 <summary> 10499 <summary>Agent striking with a sword</summary>
8894 </summary>
8895 </member> 10500 </member>
8896 <member name="F:OpenMetaverse.GroupAccountSummary.TotalCredits"> 10501 <member name="F:OpenMetaverse.Animations.TALK">
8897 <summary> 10502 <summary>Agent talking (lips moving)</summary>
8898 </summary>
8899 </member> 10503 </member>
8900 <member name="F:OpenMetaverse.GroupAccountSummary.TotalDebits"> 10504 <member name="F:OpenMetaverse.Animations.TANTRUM">
8901 <summary> 10505 <summary>Agent throwing a tantrum</summary>
8902 </summary>
8903 </member> 10506 </member>
8904 <member name="F:OpenMetaverse.GroupAccountSummary.ObjectTaxCurrent"> 10507 <member name="F:OpenMetaverse.Animations.THROW_R">
8905 <summary> 10508 <summary>Agent throwing an object (right handed)</summary>
8906 </summary>
8907 </member> 10509 </member>
8908 <member name="F:OpenMetaverse.GroupAccountSummary.LightTaxCurrent"> 10510 <member name="F:OpenMetaverse.Animations.TRYON_SHIRT">
8909 <summary> 10511 <summary>Agent trying on a shirt</summary>
8910 </summary>
8911 </member> 10512 </member>
8912 <member name="F:OpenMetaverse.GroupAccountSummary.LandTaxCurrent"> 10513 <member name="F:OpenMetaverse.Animations.TURNLEFT">
8913 <summary> 10514 <summary>Agent turning to the left</summary>
8914 </summary>
8915 </member> 10515 </member>
8916 <member name="F:OpenMetaverse.GroupAccountSummary.GroupTaxCurrent"> 10516 <member name="F:OpenMetaverse.Animations.TURNRIGHT">
8917 <summary> 10517 <summary>Agent turning to the right</summary>
8918 </summary>
8919 </member> 10518 </member>
8920 <member name="F:OpenMetaverse.GroupAccountSummary.ParcelDirFeeCurrent"> 10519 <member name="F:OpenMetaverse.Animations.TYPE">
8921 <summary> 10520 <summary>Agent typing</summary>
8922 </summary>
8923 </member> 10521 </member>
8924 <member name="F:OpenMetaverse.GroupAccountSummary.ObjectTaxEstimate"> 10522 <member name="F:OpenMetaverse.Animations.WALK">
8925 <summary> 10523 <summary>Agent walking</summary>
8926 </summary>
8927 </member> 10524 </member>
8928 <member name="F:OpenMetaverse.GroupAccountSummary.LightTaxEstimate"> 10525 <member name="F:OpenMetaverse.Animations.WHISPER">
8929 <summary> 10526 <summary>Agent whispering</summary>
8930 </summary>
8931 </member> 10527 </member>
8932 <member name="F:OpenMetaverse.GroupAccountSummary.LandTaxEstimate"> 10528 <member name="F:OpenMetaverse.Animations.WHISTLE">
8933 <summary> 10529 <summary>Agent whispering with fingers in mouth</summary>
8934 </summary>
8935 </member> 10530 </member>
8936 <member name="F:OpenMetaverse.GroupAccountSummary.GroupTaxEstimate"> 10531 <member name="F:OpenMetaverse.Animations.WINK">
8937 <summary> 10532 <summary>Agent winking</summary>
8938 </summary>
8939 </member> 10533 </member>
8940 <member name="F:OpenMetaverse.GroupAccountSummary.ParcelDirFeeEstimate"> 10534 <member name="F:OpenMetaverse.Animations.WINK_HOLLYWOOD">
8941 <summary> 10535 <summary>Agent winking</summary>
8942 </summary>
8943 </member> 10536 </member>
8944 <member name="F:OpenMetaverse.GroupAccountSummary.NonExemptMembers"> 10537 <member name="F:OpenMetaverse.Animations.WORRY">
8945 <summary> 10538 <summary>Agent worried</summary>
8946 </summary>
8947 </member> 10539 </member>
8948 <member name="F:OpenMetaverse.GroupAccountSummary.LastTaxDate"> 10540 <member name="F:OpenMetaverse.Animations.YES">
8949 <summary> 10541 <summary>Agent nodding yes</summary>
8950 </summary>
8951 </member> 10542 </member>
8952 <member name="F:OpenMetaverse.GroupAccountSummary.TaxDate"> 10543 <member name="F:OpenMetaverse.Animations.YES_HAPPY">
8953 <summary> 10544 <summary>Agent nodding yes with happy face</summary>
8954 </summary>
8955 </member> 10545 </member>
8956 <member name="T:OpenMetaverse.GroupNotice"> 10546 <member name="F:OpenMetaverse.Animations.YOGA_FLOAT">
8957 <summary> 10547 <summary>Agent floating with legs and arms crossed</summary>
8958 Struct representing a group notice
8959 </summary>
8960 </member> 10548 </member>
8961 <member name="F:OpenMetaverse.GroupNotice.Subject"> 10549 <member name="M:OpenMetaverse.Animations.ToDictionary">
8962 <summary> 10550 <summary>
10551 A dictionary containing all pre-defined animations
8963 </summary> 10552 </summary>
10553 <returns>A dictionary containing the pre-defined animations,
10554 where the key is the animations ID, and the value is a string
10555 containing a name to identify the purpose of the animation</returns>
8964 </member> 10556 </member>
8965 <member name="F:OpenMetaverse.GroupNotice.Message"> 10557 <member name="T:OpenMetaverse.AgentThrottle">
8966 <summary> 10558 <summary>
10559 Throttles the network traffic for various different traffic types.
10560 Access this class through GridClient.Throttle
8967 </summary> 10561 </summary>
8968 </member> 10562 </member>
8969 <member name="F:OpenMetaverse.GroupNotice.AttachmentID"> 10563 <member name="M:OpenMetaverse.AgentThrottle.#ctor(OpenMetaverse.GridClient)">
8970 <summary> 10564 <summary>
10565 Default constructor, uses a default high total of 1500 KBps (1536000)
8971 </summary> 10566 </summary>
8972 </member> 10567 </member>
8973 <member name="F:OpenMetaverse.GroupNotice.OwnerID"> 10568 <member name="M:OpenMetaverse.AgentThrottle.#ctor(System.Byte[],System.Int32)">
8974 <summary> 10569 <summary>
10570 Constructor that decodes an existing AgentThrottle packet in to
10571 individual values
8975 </summary> 10572 </summary>
10573 <param name="data">Reference to the throttle data in an AgentThrottle
10574 packet</param>
10575 <param name="pos">Offset position to start reading at in the
10576 throttle data</param>
10577 <remarks>This is generally not needed in clients as the server will
10578 never send a throttle packet to the client</remarks>
8976 </member> 10579 </member>
8977 <member name="M:OpenMetaverse.GroupNotice.SerializeAttachment"> 10580 <member name="M:OpenMetaverse.AgentThrottle.Set">
8978 <summary> 10581 <summary>
10582 Send an AgentThrottle packet to the current server using the
10583 current values
8979 </summary> 10584 </summary>
8980 <returns>
8981 </returns>
8982 </member> 10585 </member>
8983 <member name="T:OpenMetaverse.GroupNoticesListEntry"> 10586 <member name="M:OpenMetaverse.AgentThrottle.Set(OpenMetaverse.Simulator)">
8984 <summary> 10587 <summary>
8985 Struct representing a group notice list entry 10588 Send an AgentThrottle packet to the specified server using the
10589 current values
8986 </summary> 10590 </summary>
8987 </member> 10591 </member>
8988 <member name="F:OpenMetaverse.GroupNoticesListEntry.NoticeID"> 10592 <member name="M:OpenMetaverse.AgentThrottle.ToBytes">
8989 <summary>Notice ID</summary>
8990 </member>
8991 <member name="F:OpenMetaverse.GroupNoticesListEntry.Timestamp">
8992 <summary>Creation timestamp of notice</summary>
8993 </member>
8994 <member name="F:OpenMetaverse.GroupNoticesListEntry.FromName">
8995 <summary>Agent name who created notice</summary>
8996 </member>
8997 <member name="F:OpenMetaverse.GroupNoticesListEntry.Subject">
8998 <summary>Notice subject</summary>
8999 </member>
9000 <member name="F:OpenMetaverse.GroupNoticesListEntry.HasAttachment">
9001 <summary>Is there an attachment?</summary>
9002 </member>
9003 <member name="F:OpenMetaverse.GroupNoticesListEntry.AssetType">
9004 <summary>Attachment Type</summary>
9005 </member>
9006 <member name="T:OpenMetaverse.ChatSessionMember">
9007 <summary> 10593 <summary>
9008 Struct representing a member of a group chat session and their settings 10594 Convert the current throttle values to a byte array that can be put
10595 in an AgentThrottle packet
9009 </summary> 10596 </summary>
10597 <returns>Byte array containing all the throttle values</returns>
9010 </member> 10598 </member>
9011 <member name="F:OpenMetaverse.ChatSessionMember.AvatarKey"> 10599 <member name="P:OpenMetaverse.AgentThrottle.Resend">
9012 <summary>The <see cref="T:OpenMetaverse.UUID" /> of the Avatar</summary> 10600 <summary>Maximum bits per second for resending unacknowledged packets</summary>
9013 </member> 10601 </member>
9014 <member name="F:OpenMetaverse.ChatSessionMember.CanVoiceChat"> 10602 <member name="P:OpenMetaverse.AgentThrottle.Land">
9015 <summary>True if user has voice chat enabled</summary> 10603 <summary>Maximum bits per second for LayerData terrain</summary>
9016 </member> 10604 </member>
9017 <member name="F:OpenMetaverse.ChatSessionMember.IsModerator"> 10605 <member name="P:OpenMetaverse.AgentThrottle.Wind">
9018 <summary>True of Avatar has moderator abilities</summary> 10606 <summary>Maximum bits per second for LayerData wind data</summary>
9019 </member> 10607 </member>
9020 <member name="F:OpenMetaverse.ChatSessionMember.MuteText"> 10608 <member name="P:OpenMetaverse.AgentThrottle.Cloud">
9021 <summary>True if a moderator has muted this avatars chat</summary> 10609 <summary>Maximum bits per second for LayerData clouds</summary>
9022 </member> 10610 </member>
9023 <member name="F:OpenMetaverse.ChatSessionMember.MuteVoice"> 10611 <member name="P:OpenMetaverse.AgentThrottle.Task">
9024 <summary>True if a moderator has muted this avatars voice</summary> 10612 <summary>Unknown, includes object data</summary>
9025 </member> 10613 </member>
9026 <member name="T:OpenMetaverse.GroupRoleUpdate"> 10614 <member name="P:OpenMetaverse.AgentThrottle.Texture">
9027 <summary> 10615 <summary>Maximum bits per second for textures</summary>
9028 Role update flags
9029 </summary>
9030 </member> 10616 </member>
9031 <member name="F:OpenMetaverse.GroupRoleUpdate.NoUpdate"> 10617 <member name="P:OpenMetaverse.AgentThrottle.Asset">
9032 <summary> 10618 <summary>Maximum bits per second for downloaded assets</summary>
9033 </summary>
9034 </member> 10619 </member>
9035 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdateData"> 10620 <member name="P:OpenMetaverse.AgentThrottle.Total">
9036 <summary> 10621 <summary>Maximum bits per second the entire connection, divided up
9037 </summary> 10622 between invidiual streams using default multipliers</summary>
9038 </member> 10623 </member>
9039 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdatePowers"> 10624 <member name="T:OpenMetaverse.Voice.VoiceSession">
9040 <summary> 10625 <summary>
10626 Represents a single Voice Session to the Vivox service.
9041 </summary> 10627 </summary>
9042 </member> 10628 </member>
9043 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdateAll"> 10629 <member name="M:OpenMetaverse.Voice.VoiceSession.Close">
9044 <summary> 10630 <summary>
10631 Close this session.
9045 </summary> 10632 </summary>
9046 </member> 10633 </member>
9047 <member name="F:OpenMetaverse.GroupRoleUpdate.Create"> 10634 <member name="M:OpenMetaverse.Voice.VoiceSession.FindParticipant(System.String)">
9048 <summary> 10635 <summary>
10636 Look up an existing Participants in this session
9049 </summary> 10637 </summary>
10638 <param name="puri"></param>
10639 <returns></returns>
9050 </member> 10640 </member>
9051 <member name="F:OpenMetaverse.GroupRoleUpdate.Delete"> 10641 <member name="M:OpenMetaverse.Voice.VoiceParticipant.IDFromName(System.String)">
9052 <summary> 10642 <summary>
10643 Extract the avatar UUID encoded in a SIP URI
9053 </summary> 10644 </summary>
10645 <param name="inName"></param>
10646 <returns></returns>
9054 </member> 10647 </member>
9055 <member name="F:OpenMetaverse.GroupPowers.None"> 10648 <member name="T:OpenMetaverse.MediaPermission">
9056 <summary> 10649 <summary>
10650 Permissions for control of object media
9057 </summary> 10651 </summary>
9058 </member> 10652 </member>
9059 <member name="F:OpenMetaverse.GroupPowers.Invite"> 10653 <member name="T:OpenMetaverse.MediaControls">
9060 <summary>Can send invitations to groups default role</summary>
9061 </member>
9062 <member name="F:OpenMetaverse.GroupPowers.Eject">
9063 <summary>Can eject members from group</summary>
9064 </member>
9065 <member name="F:OpenMetaverse.GroupPowers.ChangeOptions">
9066 <summary>Can toggle 'Open Enrollment' and change 'Signup fee'</summary>
9067 </member>
9068 <member name="F:OpenMetaverse.GroupPowers.MemberVisible">
9069 <summary>Member is visible in the public member list</summary>
9070 </member>
9071 <member name="F:OpenMetaverse.GroupPowers.CreateRole">
9072 <summary>Can create new roles</summary>
9073 </member>
9074 <member name="F:OpenMetaverse.GroupPowers.DeleteRole">
9075 <summary>Can delete existing roles</summary>
9076 </member>
9077 <member name="F:OpenMetaverse.GroupPowers.RoleProperties">
9078 <summary>Can change Role names, titles and descriptions</summary>
9079 </member>
9080 <member name="F:OpenMetaverse.GroupPowers.AssignMemberLimited">
9081 <summary>Can assign other members to assigners role</summary>
9082 </member>
9083 <member name="F:OpenMetaverse.GroupPowers.AssignMember">
9084 <summary>Can assign other members to any role</summary>
9085 </member>
9086 <member name="F:OpenMetaverse.GroupPowers.RemoveMember">
9087 <summary>Can remove members from roles</summary>
9088 </member>
9089 <member name="F:OpenMetaverse.GroupPowers.ChangeActions">
9090 <summary>Can assign and remove abilities in roles</summary>
9091 </member>
9092 <member name="F:OpenMetaverse.GroupPowers.ChangeIdentity">
9093 <summary>Can change group Charter, Insignia, 'Publish on the web' and which
9094 members are publicly visible in group member listings</summary>
9095 </member>
9096 <member name="F:OpenMetaverse.GroupPowers.LandDeed">
9097 <summary>Can buy land or deed land to group</summary>
9098 </member>
9099 <member name="F:OpenMetaverse.GroupPowers.LandRelease">
9100 <summary>Can abandon group owned land to Governor Linden on mainland, or Estate owner for
9101 private estates</summary>
9102 </member>
9103 <member name="F:OpenMetaverse.GroupPowers.LandSetSale">
9104 <summary>Can set land for-sale information on group owned parcels</summary>
9105 </member>
9106 <member name="F:OpenMetaverse.GroupPowers.LandDivideJoin">
9107 <summary>Can subdivide and join parcels</summary>
9108 </member>
9109 <member name="F:OpenMetaverse.GroupPowers.JoinChat">
9110 <summary>Can join group chat sessions</summary>
9111 </member>
9112 <member name="F:OpenMetaverse.GroupPowers.AllowVoiceChat">
9113 <summary>Can use voice chat in Group Chat sessions</summary>
9114 </member>
9115 <member name="F:OpenMetaverse.GroupPowers.ModerateChat">
9116 <summary>Can moderate group chat sessions</summary>
9117 </member>
9118 <member name="F:OpenMetaverse.GroupPowers.FindPlaces">
9119 <summary>Can toggle "Show in Find Places" and set search category</summary>
9120 </member>
9121 <member name="F:OpenMetaverse.GroupPowers.LandChangeIdentity">
9122 <summary>Can change parcel name, description, and 'Publish on web' settings</summary>
9123 </member>
9124 <member name="F:OpenMetaverse.GroupPowers.SetLandingPoint">
9125 <summary>Can set the landing point and teleport routing on group land</summary>
9126 </member>
9127 <member name="F:OpenMetaverse.GroupPowers.ChangeMedia">
9128 <summary>Can change music and media settings</summary>
9129 </member>
9130 <member name="F:OpenMetaverse.GroupPowers.LandEdit">
9131 <summary>Can toggle 'Edit Terrain' option in Land settings</summary>
9132 </member>
9133 <member name="F:OpenMetaverse.GroupPowers.LandOptions">
9134 <summary>Can toggle various About Land &gt; Options settings</summary>
9135 </member>
9136 <member name="F:OpenMetaverse.GroupPowers.AllowEditLand">
9137 <summary>Can always terraform land, even if parcel settings have it turned off</summary>
9138 </member>
9139 <member name="F:OpenMetaverse.GroupPowers.AllowFly">
9140 <summary>Can always fly while over group owned land</summary>
9141 </member>
9142 <member name="F:OpenMetaverse.GroupPowers.AllowRez">
9143 <summary>Can always rez objects on group owned land</summary>
9144 </member>
9145 <member name="F:OpenMetaverse.GroupPowers.AllowLandmark">
9146 <summary>Can always create landmarks for group owned parcels</summary>
9147 </member>
9148 <member name="F:OpenMetaverse.GroupPowers.AllowSetHome">
9149 <summary>Can set home location on any group owned parcel</summary>
9150 </member>
9151 <member name="F:OpenMetaverse.GroupPowers.LandManageAllowed">
9152 <summary>Can modify public access settings for group owned parcels</summary>
9153 </member>
9154 <member name="F:OpenMetaverse.GroupPowers.LandManageBanned">
9155 <summary>Can manager parcel ban lists on group owned land</summary>
9156 </member>
9157 <member name="F:OpenMetaverse.GroupPowers.LandManagePasses">
9158 <summary>Can manage pass list sales information</summary>
9159 </member>
9160 <member name="F:OpenMetaverse.GroupPowers.LandEjectAndFreeze">
9161 <summary>Can eject and freeze other avatars on group owned land</summary>
9162 </member>
9163 <member name="F:OpenMetaverse.GroupPowers.ReturnGroupSet">
9164 <summary>Can return objects set to group</summary>
9165 </member>
9166 <member name="F:OpenMetaverse.GroupPowers.ReturnNonGroup">
9167 <summary>Can return non-group owned/set objects</summary>
9168 </member>
9169 <member name="F:OpenMetaverse.GroupPowers.ReturnGroupOwned">
9170 <summary>Can return group owned objects</summary>
9171 </member>
9172 <member name="F:OpenMetaverse.GroupPowers.LandGardening">
9173 <summary>Can landscape using Linden plants</summary>
9174 </member>
9175 <member name="F:OpenMetaverse.GroupPowers.DeedObject">
9176 <summary>Can deed objects to group</summary>
9177 </member>
9178 <member name="F:OpenMetaverse.GroupPowers.ObjectManipulate">
9179 <summary>Can move group owned objects</summary>
9180 </member>
9181 <member name="F:OpenMetaverse.GroupPowers.ObjectSetForSale">
9182 <summary>Can set group owned objects for-sale</summary>
9183 </member>
9184 <member name="F:OpenMetaverse.GroupPowers.Accountable">
9185 <summary>Pay group liabilities and receive group dividends</summary>
9186 </member>
9187 <member name="F:OpenMetaverse.GroupPowers.SendNotices">
9188 <summary>Can send group notices</summary>
9189 </member>
9190 <member name="F:OpenMetaverse.GroupPowers.ReceiveNotices">
9191 <summary>Can receive group notices</summary>
9192 </member>
9193 <member name="F:OpenMetaverse.GroupPowers.StartProposal">
9194 <summary>Can create group proposals</summary>
9195 </member>
9196 <member name="F:OpenMetaverse.GroupPowers.VoteOnProposal">
9197 <summary>Can vote on group proposals</summary>
9198 </member>
9199 <member name="T:OpenMetaverse.GroupManager">
9200 <summary> 10654 <summary>
9201 Handles all network traffic related to reading and writing group 10655 Style of cotrols that shold be displayed to the user
9202 information
9203 </summary> 10656 </summary>
9204 </member> 10657 </member>
9205 <member name="M:OpenMetaverse.GroupManager.#ctor(OpenMetaverse.GridClient)"> 10658 <member name="T:OpenMetaverse.MediaEntry">
9206 <summary> 10659 <summary>
9207 Construct a new instance of the GroupManager class 10660 Class representing media data for a single face
9208 </summary> 10661 </summary>
9209 <param name="client">A reference to the current <seealso cref="T:OpenMetaverse.GridClient" /> instance</param>
9210 </member>
9211 <member name="F:OpenMetaverse.GroupManager.m_CurrentGroups">
9212 <summary>The event subscribers. null if no subcribers</summary>
9213 </member>
9214 <member name="F:OpenMetaverse.GroupManager.m_CurrentGroupsLock">
9215 <summary>Thread sync lock object</summary>
9216 </member>
9217 <member name="F:OpenMetaverse.GroupManager.m_GroupNames">
9218 <summary>The event subscribers. null if no subcribers</summary>
9219 </member>
9220 <member name="F:OpenMetaverse.GroupManager.m_GroupNamesLock">
9221 <summary>Thread sync lock object</summary>
9222 </member>
9223 <member name="F:OpenMetaverse.GroupManager.m_GroupProfile">
9224 <summary>The event subscribers. null if no subcribers</summary>
9225 </member>
9226 <member name="F:OpenMetaverse.GroupManager.m_GroupProfileLock">
9227 <summary>Thread sync lock object</summary>
9228 </member>
9229 <member name="F:OpenMetaverse.GroupManager.m_GroupMembers">
9230 <summary>The event subscribers. null if no subcribers</summary>
9231 </member>
9232 <member name="F:OpenMetaverse.GroupManager.m_GroupMembersLock">
9233 <summary>Thread sync lock object</summary>
9234 </member>
9235 <member name="F:OpenMetaverse.GroupManager.m_GroupRoles">
9236 <summary>The event subscribers. null if no subcribers</summary>
9237 </member>
9238 <member name="F:OpenMetaverse.GroupManager.m_GroupRolesLock">
9239 <summary>Thread sync lock object</summary>
9240 </member>
9241 <member name="F:OpenMetaverse.GroupManager.m_GroupRoleMembers">
9242 <summary>The event subscribers. null if no subcribers</summary>
9243 </member>
9244 <member name="F:OpenMetaverse.GroupManager.m_GroupRolesMembersLock">
9245 <summary>Thread sync lock object</summary>
9246 </member>
9247 <member name="F:OpenMetaverse.GroupManager.m_GroupTitles">
9248 <summary>The event subscribers. null if no subcribers</summary>
9249 </member>
9250 <member name="F:OpenMetaverse.GroupManager.m_GroupTitlesLock">
9251 <summary>Thread sync lock object</summary>
9252 </member>
9253 <member name="F:OpenMetaverse.GroupManager.m_GroupAccountSummary">
9254 <summary>The event subscribers. null if no subcribers</summary>
9255 </member>
9256 <member name="F:OpenMetaverse.GroupManager.m_GroupAccountSummaryLock">
9257 <summary>Thread sync lock object</summary>
9258 </member>
9259 <member name="F:OpenMetaverse.GroupManager.m_GroupCreated">
9260 <summary>The event subscribers. null if no subcribers</summary>
9261 </member>
9262 <member name="F:OpenMetaverse.GroupManager.m_GroupCreatedLock">
9263 <summary>Thread sync lock object</summary>
9264 </member>
9265 <member name="F:OpenMetaverse.GroupManager.m_GroupJoined">
9266 <summary>The event subscribers. null if no subcribers</summary>
9267 </member>
9268 <member name="F:OpenMetaverse.GroupManager.m_GroupJoinedLock">
9269 <summary>Thread sync lock object</summary>
9270 </member>
9271 <member name="F:OpenMetaverse.GroupManager.m_GroupLeft">
9272 <summary>The event subscribers. null if no subcribers</summary>
9273 </member>
9274 <member name="F:OpenMetaverse.GroupManager.m_GroupLeftLock">
9275 <summary>Thread sync lock object</summary>
9276 </member>
9277 <member name="F:OpenMetaverse.GroupManager.m_GroupDropped">
9278 <summary>The event subscribers. null if no subcribers</summary>
9279 </member>
9280 <member name="F:OpenMetaverse.GroupManager.m_GroupDroppedLock">
9281 <summary>Thread sync lock object</summary>
9282 </member>
9283 <member name="F:OpenMetaverse.GroupManager.m_GroupMemberEjected">
9284 <summary>The event subscribers. null if no subcribers</summary>
9285 </member>
9286 <member name="F:OpenMetaverse.GroupManager.m_GroupMemberEjectedLock">
9287 <summary>Thread sync lock object</summary>
9288 </member>
9289 <member name="F:OpenMetaverse.GroupManager.m_GroupNoticesListReply">
9290 <summary>The event subscribers. null if no subcribers</summary>
9291 </member>
9292 <member name="F:OpenMetaverse.GroupManager.m_GroupNoticesListReplyLock">
9293 <summary>Thread sync lock object</summary>
9294 </member>
9295 <member name="F:OpenMetaverse.GroupManager.m_GroupInvitation">
9296 <summary>The event subscribers. null if no subcribers</summary>
9297 </member>
9298 <member name="F:OpenMetaverse.GroupManager.m_GroupInvitationLock">
9299 <summary>Thread sync lock object</summary>
9300 </member>
9301 <member name="F:OpenMetaverse.GroupManager.Client">
9302 <summary>A reference to the current <seealso cref="T:OpenMetaverse.GridClient" /> instance</summary>
9303 </member>
9304 <member name="F:OpenMetaverse.GroupManager.GroupMembersRequests">
9305 <summary>Currently-active group members requests</summary>
9306 </member>
9307 <member name="F:OpenMetaverse.GroupManager.GroupRolesRequests">
9308 <summary>Currently-active group roles requests</summary>
9309 </member>
9310 <member name="F:OpenMetaverse.GroupManager.GroupRolesMembersRequests">
9311 <summary>Currently-active group role-member requests</summary>
9312 </member>
9313 <member name="F:OpenMetaverse.GroupManager.TempGroupMembers">
9314 <summary>Dictionary keeping group members while request is in progress</summary>
9315 </member>
9316 <member name="F:OpenMetaverse.GroupManager.TempGroupRolesMembers">
9317 <summary>Dictionary keeping mebmer/role mapping while request is in progress</summary>
9318 </member>
9319 <member name="F:OpenMetaverse.GroupManager.TempGroupRoles">
9320 <summary>Dictionary keeping GroupRole information while request is in progress</summary>
9321 </member>
9322 <member name="F:OpenMetaverse.GroupManager.GroupName2KeyCache">
9323 <summary>Caches group name lookups</summary>
9324 </member>
9325 <member name="E:OpenMetaverse.GroupManager.CurrentGroups">
9326 <summary>Raised when the simulator sends us data containing
9327 our current group membership</summary>
9328 </member>
9329 <member name="E:OpenMetaverse.GroupManager.GroupNamesReply">
9330 <summary>Raised when the simulator responds to a RequestGroupName
9331 or RequestGroupNames request</summary>
9332 </member>
9333 <member name="E:OpenMetaverse.GroupManager.GroupProfile">
9334 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupProfile(OpenMetaverse.UUID)" /> request</summary>
9335 </member>
9336 <member name="E:OpenMetaverse.GroupManager.GroupMembersReply">
9337 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupMembers(OpenMetaverse.UUID)" /> request</summary>
9338 </member>
9339 <member name="E:OpenMetaverse.GroupManager.GroupRoleDataReply">
9340 <summary>Raised when the simulator responds to a <see cref="!:RequestGroupRoleData" /> request</summary>
9341 </member> 10662 </member>
9342 <member name="E:OpenMetaverse.GroupManager.GroupRoleMembersReply"> 10663 <member name="F:OpenMetaverse.MediaEntry.EnableAlterntiveImage">
9343 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupRolesMembers(OpenMetaverse.UUID)" /> request</summary> 10664 <summary>Is display of the alternative image enabled</summary>
9344 </member>
9345 <member name="E:OpenMetaverse.GroupManager.GroupTitlesReply">
9346 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupTitles(OpenMetaverse.UUID)" /> request</summary>
9347 </member>
9348 <member name="E:OpenMetaverse.GroupManager.GroupAccountSummaryReply">
9349 <summary>Raised when a response to a RequestGroupAccountSummary is returned
9350 by the simulator</summary>
9351 </member>
9352 <member name="E:OpenMetaverse.GroupManager.GroupCreatedReply">
9353 <summary>Raised when a request to create a group is successful</summary>
9354 </member>
9355 <member name="E:OpenMetaverse.GroupManager.GroupJoinedReply">
9356 <summary>Raised when a request to join a group either
9357 fails or succeeds</summary>
9358 </member>
9359 <member name="E:OpenMetaverse.GroupManager.GroupLeaveReply">
9360 <summary>Raised when a request to leave a group either
9361 fails or succeeds</summary>
9362 </member>
9363 <member name="E:OpenMetaverse.GroupManager.GroupDropped">
9364 <summary>Raised when A group is removed from the group server</summary>
9365 </member>
9366 <member name="E:OpenMetaverse.GroupManager.GroupMemberEjected">
9367 <summary>Raised when a request to eject a member from a group either
9368 fails or succeeds</summary>
9369 </member>
9370 <member name="E:OpenMetaverse.GroupManager.GroupNoticesListReply">
9371 <summary>Raised when the simulator sends us group notices</summary>
9372 <seealso cref="M:OpenMetaverse.GroupManager.RequestGroupNoticesList(OpenMetaverse.UUID)" />
9373 </member>
9374 <member name="E:OpenMetaverse.GroupManager.GroupInvitation">
9375 <summary>Raised when another agent invites our avatar to join a group</summary>
9376 </member>
9377 <member name="M:OpenMetaverse.GroupManager.OnCurrentGroups(OpenMetaverse.CurrentGroupsEventArgs)">
9378 <summary>Raises the CurrentGroups event</summary>
9379 <param name="e">A CurrentGroupsEventArgs object containing the
9380 data sent from the simulator</param>
9381 </member>
9382 <member name="M:OpenMetaverse.GroupManager.OnGroupNamesReply(OpenMetaverse.GroupNamesEventArgs)">
9383 <summary>Raises the GroupNamesReply event</summary>
9384 <param name="e">A GroupNamesEventArgs object containing the
9385 data response from the simulator</param>
9386 </member> 10665 </member>
9387 <member name="M:OpenMetaverse.GroupManager.OnGroupProfile(OpenMetaverse.GroupProfileEventArgs)"> 10666 <member name="F:OpenMetaverse.MediaEntry.AutoLoop">
9388 <summary>Raises the GroupProfile event</summary> 10667 <summary>Should media auto loop</summary>
9389 <param name="e">An GroupProfileEventArgs object containing the
9390 data returned from the simulator</param>
9391 </member> 10668 </member>
9392 <member name="M:OpenMetaverse.GroupManager.OnGroupMembersReply(OpenMetaverse.GroupMembersReplyEventArgs)"> 10669 <member name="F:OpenMetaverse.MediaEntry.AutoPlay">
9393 <summary>Raises the GroupMembers event</summary> 10670 <summary>Shoule media be auto played</summary>
9394 <param name="e">A GroupMembersEventArgs object containing the
9395 data returned from the simulator</param>
9396 </member> 10671 </member>
9397 <member name="M:OpenMetaverse.GroupManager.OnGroupRoleDataReply(OpenMetaverse.GroupRolesDataReplyEventArgs)"> 10672 <member name="F:OpenMetaverse.MediaEntry.AutoScale">
9398 <summary>Raises the GroupRolesDataReply event</summary> 10673 <summary>Auto scale media to prim face</summary>
9399 <param name="e">A GroupRolesDataReplyEventArgs object containing the
9400 data returned from the simulator</param>
9401 </member> 10674 </member>
9402 <member name="M:OpenMetaverse.GroupManager.OnGroupRoleMembers(OpenMetaverse.GroupRolesMembersReplyEventArgs)"> 10675 <member name="F:OpenMetaverse.MediaEntry.AutoZoom">
9403 <summary>Raises the GroupRoleMembersReply event</summary> 10676 <summary>Should viewer automatically zoom in on the face when clicked</summary>
9404 <param name="e">A GroupRolesRoleMembersReplyEventArgs object containing the
9405 data returned from the simulator</param>
9406 </member> 10677 </member>
9407 <member name="M:OpenMetaverse.GroupManager.OnGroupTitles(OpenMetaverse.GroupTitlesReplyEventArgs)"> 10678 <member name="F:OpenMetaverse.MediaEntry.InteractOnFirstClick">
9408 <summary>Raises the GroupTitlesReply event</summary> 10679 <summary>Should viewer interpret first click as interaction with the media
9409 <param name="e">A GroupTitlesReplyEventArgs object containing the 10680 or when false should the first click be treated as zoom in commadn</summary>
9410 data returned from the simulator</param>
9411 </member> 10681 </member>
9412 <member name="M:OpenMetaverse.GroupManager.OnGroupAccountSummaryReply(OpenMetaverse.GroupAccountSummaryReplyEventArgs)"> 10682 <member name="F:OpenMetaverse.MediaEntry.Controls">
9413 <summary>Raises the GroupAccountSummary event</summary> 10683 <summary>Style of controls viewer should display when
9414 <param name="e">A GroupAccountSummaryReplyEventArgs object containing the 10684 viewer media on this face</summary>
9415 data returned from the simulator</param>
9416 </member> 10685 </member>
9417 <member name="M:OpenMetaverse.GroupManager.OnGroupCreatedReply(OpenMetaverse.GroupCreatedReplyEventArgs)"> 10686 <member name="F:OpenMetaverse.MediaEntry.HomeURL">
9418 <summary>Raises the GroupCreated event</summary> 10687 <summary>Starting URL for the media</summary>
9419 <param name="e">An GroupCreatedEventArgs object containing the
9420 data returned from the simulator</param>
9421 </member> 10688 </member>
9422 <member name="M:OpenMetaverse.GroupManager.OnGroupJoinedReply(OpenMetaverse.GroupOperationEventArgs)"> 10689 <member name="F:OpenMetaverse.MediaEntry.CurrentURL">
9423 <summary>Raises the GroupJoined event</summary> 10690 <summary>Currently navigated URL</summary>
9424 <param name="e">A GroupOperationEventArgs object containing the
9425 result of the operation returned from the simulator</param>
9426 </member> 10691 </member>
9427 <member name="M:OpenMetaverse.GroupManager.OnGroupLeaveReply(OpenMetaverse.GroupOperationEventArgs)"> 10692 <member name="F:OpenMetaverse.MediaEntry.Height">
9428 <summary>Raises the GroupLeft event</summary> 10693 <summary>Media height in pixes</summary>
9429 <param name="e">A GroupOperationEventArgs object containing the
9430 result of the operation returned from the simulator</param>
9431 </member> 10694 </member>
9432 <member name="M:OpenMetaverse.GroupManager.OnGroupDropped(OpenMetaverse.GroupDroppedEventArgs)"> 10695 <member name="F:OpenMetaverse.MediaEntry.Width">
9433 <summary>Raises the GroupDropped event</summary> 10696 <summary>Media width in pixels</summary>
9434 <param name="e">An GroupDroppedEventArgs object containing the
9435 the group your agent left</param>
9436 </member> 10697 </member>
9437 <member name="M:OpenMetaverse.GroupManager.OnGroupMemberEjected(OpenMetaverse.GroupOperationEventArgs)"> 10698 <member name="F:OpenMetaverse.MediaEntry.ControlPermissions">
9438 <summary>Raises the GroupMemberEjected event</summary> 10699 <summary>Who can controls the media</summary>
9439 <param name="e">An GroupMemberEjectedEventArgs object containing the
9440 data returned from the simulator</param>
9441 </member> 10700 </member>
9442 <member name="M:OpenMetaverse.GroupManager.OnGroupNoticesListReply(OpenMetaverse.GroupNoticesListReplyEventArgs)"> 10701 <member name="F:OpenMetaverse.MediaEntry.InteractPermissions">
9443 <summary>Raises the GroupNoticesListReply event</summary> 10702 <summary>Who can interact with the media</summary>
9444 <param name="e">An GroupNoticesListReplyEventArgs object containing the
9445 data returned from the simulator</param>
9446 </member> 10703 </member>
9447 <member name="M:OpenMetaverse.GroupManager.OnGroupInvitation(OpenMetaverse.GroupInvitationEventArgs)"> 10704 <member name="F:OpenMetaverse.MediaEntry.EnableWhiteList">
9448 <summary>Raises the GroupInvitation event</summary> 10705 <summary>Is URL whitelist enabled</summary>
9449 <param name="e">An GroupInvitationEventArgs object containing the
9450 data returned from the simulator</param>
9451 </member> 10706 </member>
9452 <member name="M:OpenMetaverse.GroupManager.RequestCurrentGroups"> 10707 <member name="F:OpenMetaverse.MediaEntry.WhiteList">
9453 <summary> 10708 <summary>Array of URLs that are whitelisted</summary>
9454 Request a current list of groups the avatar is a member of.
9455 </summary>
9456 <remarks>CAPS Event Queue must be running for this to work since the results
9457 come across CAPS.</remarks>
9458 </member> 10709 </member>
9459 <member name="M:OpenMetaverse.GroupManager.RequestGroupName(OpenMetaverse.UUID)"> 10710 <member name="M:OpenMetaverse.MediaEntry.GetOSD">
9460 <summary> 10711 <summary>
9461 Lookup name of group based on groupID 10712 Serialize to OSD
9462 </summary> 10713 </summary>
9463 <param name="groupID">groupID of group to lookup name for.</param> 10714 <returns>OSDMap with the serialized data</returns>
9464 </member> 10715 </member>
9465 <member name="M:OpenMetaverse.GroupManager.RequestGroupNames(System.Collections.Generic.List{OpenMetaverse.UUID})"> 10716 <member name="M:OpenMetaverse.MediaEntry.FromOSD(OpenMetaverse.StructuredData.OSD)">
9466 <summary> 10717 <summary>
9467 Request lookup of multiple group names 10718 Deserialize from OSD data
9468 </summary> 10719 </summary>
9469 <param name="groupIDs">List of group IDs to request.</param> 10720 <param name="osd">Serialized OSD data</param>
9470 </member> 10721 <returns>Deserialized object</returns>
9471 <member name="M:OpenMetaverse.GroupManager.RequestGroupProfile(OpenMetaverse.UUID)">
9472 <summary>Lookup group profile data such as name, enrollment, founder, logo, etc</summary>
9473 <remarks>Subscribe to <code>OnGroupProfile</code> event to receive the results.</remarks>
9474 <param name="group">group ID (UUID)</param>
9475 </member>
9476 <member name="M:OpenMetaverse.GroupManager.RequestGroupMembers(OpenMetaverse.UUID)">
9477 <summary>Request a list of group members.</summary>
9478 <remarks>Subscribe to <code>OnGroupMembers</code> event to receive the results.</remarks>
9479 <param name="group">group ID (UUID)</param>
9480 <returns>UUID of the request, use to index into cache</returns>
9481 </member>
9482 <member name="M:OpenMetaverse.GroupManager.RequestGroupRoles(OpenMetaverse.UUID)">
9483 <summary>Request group roles</summary>
9484 <remarks>Subscribe to <code>OnGroupRoles</code> event to receive the results.</remarks>
9485 <param name="group">group ID (UUID)</param>
9486 <returns>UUID of the request, use to index into cache</returns>
9487 </member>
9488 <member name="M:OpenMetaverse.GroupManager.RequestGroupRolesMembers(OpenMetaverse.UUID)">
9489 <summary>Request members (members,role) role mapping for a group.</summary>
9490 <remarks>Subscribe to <code>OnGroupRolesMembers</code> event to receive the results.</remarks>
9491 <param name="group">group ID (UUID)</param>
9492 <returns>UUID of the request, use to index into cache</returns>
9493 </member>
9494 <member name="M:OpenMetaverse.GroupManager.RequestGroupTitles(OpenMetaverse.UUID)">
9495 <summary>Request a groups Titles</summary>
9496 <remarks>Subscribe to <code>OnGroupTitles</code> event to receive the results.</remarks>
9497 <param name="group">group ID (UUID)</param>
9498 <returns>UUID of the request, use to index into cache</returns>
9499 </member>
9500 <member name="M:OpenMetaverse.GroupManager.RequestGroupAccountSummary(OpenMetaverse.UUID,System.Int32,System.Int32)">
9501 <summary>Begin to get the group account summary</summary>
9502 <remarks>Subscribe to the <code>OnGroupAccountSummary</code> event to receive the results.</remarks>
9503 <param name="group">group ID (UUID)</param>
9504 <param name="intervalDays">How long of an interval</param>
9505 <param name="currentInterval">Which interval (0 for current, 1 for last)</param>
9506 </member>
9507 <member name="M:OpenMetaverse.GroupManager.Invite(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.UUID)">
9508 <summary>Invites a user to a group</summary>
9509 <param name="group">The group to invite to</param>
9510 <param name="roles">A list of roles to invite a person to</param>
9511 <param name="personkey">Key of person to invite</param>
9512 </member>
9513 <member name="M:OpenMetaverse.GroupManager.ActivateGroup(OpenMetaverse.UUID)">
9514 <summary>Set a group as the current active group</summary>
9515 <param name="id">group ID (UUID)</param>
9516 </member>
9517 <member name="M:OpenMetaverse.GroupManager.ActivateTitle(OpenMetaverse.UUID,OpenMetaverse.UUID)">
9518 <summary>Change the role that determines your active title</summary>
9519 <param name="group">Group ID to use</param>
9520 <param name="role">Role ID to change to</param>
9521 </member>
9522 <member name="M:OpenMetaverse.GroupManager.SetGroupContribution(OpenMetaverse.UUID,System.Int32)">
9523 <summary>Set this avatar's tier contribution</summary>
9524 <param name="group">Group ID to change tier in</param>
9525 <param name="contribution">amount of tier to donate</param>
9526 </member> 10722 </member>
9527 <member name="M:OpenMetaverse.GroupManager.SetGroupAcceptNotices(OpenMetaverse.UUID,System.Boolean,System.Boolean)"> 10723 <member name="T:OpenMetaverse.Primitive">
9528 <summary> 10724 <summary>
9529 Save wheather agent wants to accept group notices and list this group in their profile 10725 Particle system specific enumerators, flags and methods.
9530 </summary> 10726 </summary>
9531 <param name="groupID">Group <see cref="T:OpenMetaverse.UUID" /></param>
9532 <param name="acceptNotices">Accept notices from this group</param>
9533 <param name="listInProfile">List this group in the profile</param>
9534 </member> 10727 </member>
9535 <member name="M:OpenMetaverse.GroupManager.RequestJoinGroup(OpenMetaverse.UUID)"> 10728 <member name="F:OpenMetaverse.Primitive.MediaVersion">
9536 <summary>Request to join a group</summary>
9537 <remarks>Subscribe to <code>OnGroupJoined</code> event for confirmation.</remarks>
9538 <param name="id">group ID (UUID) to join.</param>
9539 </member>
9540 <member name="M:OpenMetaverse.GroupManager.RequestCreateGroup(OpenMetaverse.Group)">
9541 <summary> 10729 <summary>
9542 Request to create a new group. If the group is successfully 10730 Current version of the media data for the prim
9543 created, L$100 will automatically be deducted
9544 </summary> 10731 </summary>
9545 <remarks>Subscribe to <code>OnGroupCreated</code> event to receive confirmation.</remarks>
9546 <param name="group">Group struct containing the new group info</param>
9547 </member>
9548 <member name="M:OpenMetaverse.GroupManager.UpdateGroup(OpenMetaverse.UUID,OpenMetaverse.Group)">
9549 <summary>Update a group's profile and other information</summary>
9550 <param name="id">Groups ID (UUID) to update.</param>
9551 <param name="group">Group struct to update.</param>
9552 </member>
9553 <member name="M:OpenMetaverse.GroupManager.EjectUser(OpenMetaverse.UUID,OpenMetaverse.UUID)">
9554 <summary>Eject a user from a group</summary>
9555 <param name="group">Group ID to eject the user from</param>
9556 <param name="member">Avatar's key to eject</param>
9557 </member>
9558 <member name="M:OpenMetaverse.GroupManager.UpdateRole(OpenMetaverse.GroupRole)">
9559 <summary>Update role information</summary>
9560 <param name="role">Modified role to be updated</param>
9561 </member>
9562 <member name="M:OpenMetaverse.GroupManager.CreateRole(OpenMetaverse.UUID,OpenMetaverse.GroupRole)">
9563 <summary>Create a new group role</summary>
9564 <param name="group">Group ID to update</param>
9565 <param name="role">Role to create</param>
9566 </member>
9567 <member name="M:OpenMetaverse.GroupManager.DeleteRole(OpenMetaverse.UUID,OpenMetaverse.UUID)">
9568 <summary>Delete a group role</summary>
9569 <param name="group">Group ID to update</param>
9570 <param name="roleID">Role to delete</param>
9571 </member>
9572 <member name="M:OpenMetaverse.GroupManager.RemoveFromRole(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
9573 <summary>Remove an avatar from a role</summary>
9574 <param name="group">Group ID to update</param>
9575 <param name="role">Role ID to be removed from</param>
9576 <param name="member">Avatar's Key to remove</param>
9577 </member>
9578 <member name="M:OpenMetaverse.GroupManager.AddToRole(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
9579 <summary>Assign an avatar to a role</summary>
9580 <param name="group">Group ID to update</param>
9581 <param name="role">Role ID to assign to</param>
9582 <param name="member">Avatar's ID to assign to role</param>
9583 </member>
9584 <member name="M:OpenMetaverse.GroupManager.RequestGroupNoticesList(OpenMetaverse.UUID)">
9585 <summary>Request the group notices list</summary>
9586 <param name="group">Group ID to fetch notices for</param>
9587 </member>
9588 <member name="M:OpenMetaverse.GroupManager.RequestGroupNotice(OpenMetaverse.UUID)">
9589 <summary>Request a group notice by key</summary>
9590 <param name="noticeID">ID of group notice</param>
9591 </member>
9592 <member name="M:OpenMetaverse.GroupManager.SendGroupNotice(OpenMetaverse.UUID,OpenMetaverse.GroupNotice)">
9593 <summary>Send out a group notice</summary>
9594 <param name="group">Group ID to update</param>
9595 <param name="notice">
9596 <code>GroupNotice</code> structure containing notice data</param>
9597 </member>
9598 <member name="M:OpenMetaverse.GroupManager.StartProposal(OpenMetaverse.UUID,OpenMetaverse.GroupProposal)">
9599 <summary>Start a group proposal (vote)</summary>
9600 <param name="group">The Group ID to send proposal to</param>
9601 <param name="prop">
9602 <code>GroupProposal</code> structure containing the proposal</param>
9603 </member>
9604 <member name="M:OpenMetaverse.GroupManager.LeaveGroup(OpenMetaverse.UUID)">
9605 <summary>Request to leave a group</summary>
9606 <remarks>Subscribe to <code>OnGroupLeft</code> event to receive confirmation</remarks>
9607 <param name="groupID">The group to leave</param>
9608 </member>
9609 <member name="M:OpenMetaverse.GroupManager.AgentDropGroupHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9610 <summary>Process an incoming packet and raise the appropriate events</summary>
9611 <param name="sender">The sender</param>
9612 <param name="e">The EventArgs object containing the packet data</param>
9613 </member>
9614 <member name="M:OpenMetaverse.GroupManager.GroupProfileReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9615 <summary>Process an incoming packet and raise the appropriate events</summary>
9616 <param name="sender">The sender</param>
9617 <param name="e">The EventArgs object containing the packet data</param>
9618 </member>
9619 <member name="M:OpenMetaverse.GroupManager.GroupNoticesListReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9620 <summary>Process an incoming packet and raise the appropriate events</summary>
9621 <param name="sender">The sender</param>
9622 <param name="e">The EventArgs object containing the packet data</param>
9623 </member>
9624 <member name="M:OpenMetaverse.GroupManager.GroupTitlesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9625 <summary>Process an incoming packet and raise the appropriate events</summary>
9626 <param name="sender">The sender</param>
9627 <param name="e">The EventArgs object containing the packet data</param>
9628 </member> 10732 </member>
9629 <member name="M:OpenMetaverse.GroupManager.GroupMembersHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 10733 <member name="F:OpenMetaverse.Primitive.FaceMedia">
9630 <summary>Process an incoming packet and raise the appropriate events</summary>
9631 <param name="sender">The sender</param>
9632 <param name="e">The EventArgs object containing the packet data</param>
9633 </member>
9634 <member name="M:OpenMetaverse.GroupManager.GroupRoleDataReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9635 <summary>Process an incoming packet and raise the appropriate events</summary>
9636 <param name="sender">The sender</param>
9637 <param name="e">The EventArgs object containing the packet data</param>
9638 </member>
9639 <member name="M:OpenMetaverse.GroupManager.GroupRoleMembersReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9640 <summary>Process an incoming packet and raise the appropriate events</summary>
9641 <param name="sender">The sender</param>
9642 <param name="e">The EventArgs object containing the packet data</param>
9643 </member>
9644 <member name="M:OpenMetaverse.GroupManager.GroupActiveProposalItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9645 <summary>Process an incoming packet and raise the appropriate events</summary>
9646 <param name="sender">The sender</param>
9647 <param name="e">The EventArgs object containing the packet data</param>
9648 </member>
9649 <member name="M:OpenMetaverse.GroupManager.GroupVoteHistoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9650 <summary>Process an incoming packet and raise the appropriate events</summary>
9651 <param name="sender">The sender</param>
9652 <param name="e">The EventArgs object containing the packet data</param>
9653 </member>
9654 <member name="M:OpenMetaverse.GroupManager.GroupAccountSummaryReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9655 <summary>Process an incoming packet and raise the appropriate events</summary>
9656 <param name="sender">The sender</param>
9657 <param name="e">The EventArgs object containing the packet data</param>
9658 </member>
9659 <member name="M:OpenMetaverse.GroupManager.CreateGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9660 <summary>Process an incoming packet and raise the appropriate events</summary>
9661 <param name="sender">The sender</param>
9662 <param name="e">The EventArgs object containing the packet data</param>
9663 </member>
9664 <member name="M:OpenMetaverse.GroupManager.JoinGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9665 <summary>Process an incoming packet and raise the appropriate events</summary>
9666 <param name="sender">The sender</param>
9667 <param name="e">The EventArgs object containing the packet data</param>
9668 </member>
9669 <member name="M:OpenMetaverse.GroupManager.LeaveGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9670 <summary>Process an incoming packet and raise the appropriate events</summary>
9671 <param name="sender">The sender</param>
9672 <param name="e">The EventArgs object containing the packet data</param>
9673 </member>
9674 <member name="M:OpenMetaverse.GroupManager.UUIDGroupNameReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9675 <summary>Process an incoming packet and raise the appropriate events</summary>
9676 <param name="sender">The sender</param>
9677 <param name="e">The EventArgs object containing the packet data</param>
9678 </member>
9679 <member name="M:OpenMetaverse.GroupManager.EjectGroupMemberReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
9680 <summary>Process an incoming packet and raise the appropriate events</summary>
9681 <param name="sender">The sender</param>
9682 <param name="e">The EventArgs object containing the packet data</param>
9683 </member>
9684 <member name="T:OpenMetaverse.CurrentGroupsEventArgs">
9685 <summary>Contains the current groups your agent is a member of</summary>
9686 </member>
9687 <member name="M:OpenMetaverse.CurrentGroupsEventArgs.#ctor(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.Group})">
9688 <summary>Construct a new instance of the CurrentGroupsEventArgs class</summary>
9689 <param name="groups">The current groups your agent is a member of</param>
9690 </member>
9691 <member name="P:OpenMetaverse.CurrentGroupsEventArgs.Groups">
9692 <summary>Get the current groups your agent is a member of</summary>
9693 </member>
9694 <member name="T:OpenMetaverse.GroupNamesEventArgs">
9695 <summary>A Dictionary of group names, where the Key is the groups ID and the value is the groups name</summary>
9696 </member>
9697 <member name="M:OpenMetaverse.GroupNamesEventArgs.#ctor(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,System.String})">
9698 <summary>Construct a new instance of the GroupNamesEventArgs class</summary>
9699 <param name="groupNames">The Group names dictionary</param>
9700 </member>
9701 <member name="P:OpenMetaverse.GroupNamesEventArgs.GroupNames">
9702 <summary>Get the Group Names dictionary</summary>
9703 </member>
9704 <member name="T:OpenMetaverse.GroupMembersReplyEventArgs">
9705 <summary>Represents the members of a group</summary>
9706 </member>
9707 <member name="M:OpenMetaverse.GroupMembersReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupMember})">
9708 <summary> 10734 <summary>
9709 Construct a new instance of the GroupMembersReplyEventArgs class 10735 Array of media entries indexed by face number
9710 </summary> 10736 </summary>
9711 <param name="requestID">The ID of the request</param>
9712 <param name="groupID">The ID of the group</param>
9713 <param name="members">The membership list of the group</param>
9714 </member>
9715 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.RequestID">
9716 <summary>Get the ID as returned by the request to correlate
9717 this result set and the request</summary>
9718 </member>
9719 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.GroupID">
9720 <summary>Get the ID of the group</summary>
9721 </member>
9722 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.Members">
9723 <summary>Get the dictionary of members</summary>
9724 </member>
9725 <member name="T:OpenMetaverse.GroupRolesDataReplyEventArgs">
9726 <summary>Represents the roles associated with a group</summary>
9727 </member>
9728 <member name="M:OpenMetaverse.GroupRolesDataReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupRole})">
9729 <summary>Construct a new instance of the GroupRolesDataReplyEventArgs class</summary>
9730 <param name="requestID">The ID as returned by the request to correlate
9731 this result set and the request</param>
9732 <param name="groupID">The ID of the group</param>
9733 <param name="roles">The dictionary containing the roles</param>
9734 </member>
9735 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.RequestID">
9736 <summary>Get the ID as returned by the request to correlate
9737 this result set and the request</summary>
9738 </member>
9739 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.GroupID">
9740 <summary>Get the ID of the group</summary>
9741 </member>
9742 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.Roles">
9743 <summary>Get the dictionary containing the roles</summary>
9744 </member>
9745 <member name="T:OpenMetaverse.GroupRolesMembersReplyEventArgs">
9746 <summary>Represents the Role to Member mappings for a group</summary>
9747 </member>
9748 <member name="M:OpenMetaverse.GroupRolesMembersReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.List{System.Collections.Generic.KeyValuePair{OpenMetaverse.UUID,OpenMetaverse.UUID}})">
9749 <summary>Construct a new instance of the GroupRolesMembersReplyEventArgs class</summary>
9750 <param name="requestID">The ID as returned by the request to correlate
9751 this result set and the request</param>
9752 <param name="groupID">The ID of the group</param>
9753 <param name="rolesMembers">The member to roles map</param>
9754 </member>
9755 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.RequestID">
9756 <summary>Get the ID as returned by the request to correlate
9757 this result set and the request</summary>
9758 </member>
9759 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.GroupID">
9760 <summary>Get the ID of the group</summary>
9761 </member>
9762 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.RolesMembers">
9763 <summary>Get the member to roles map</summary>
9764 </member>
9765 <member name="T:OpenMetaverse.GroupTitlesReplyEventArgs">
9766 <summary>Represents the titles for a group</summary>
9767 </member>
9768 <member name="M:OpenMetaverse.GroupTitlesReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupTitle})">
9769 <summary>Construct a new instance of the GroupTitlesReplyEventArgs class</summary>
9770 <param name="requestID">The ID as returned by the request to correlate
9771 this result set and the request</param>
9772 <param name="groupID">The ID of the group</param>
9773 <param name="titles">The titles</param>
9774 </member>
9775 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.RequestID">
9776 <summary>Get the ID as returned by the request to correlate
9777 this result set and the request</summary>
9778 </member>
9779 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.GroupID">
9780 <summary>Get the ID of the group</summary>
9781 </member>
9782 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.Titles">
9783 <summary>Get the titles</summary>
9784 </member>
9785 <member name="T:OpenMetaverse.GroupAccountSummaryReplyEventArgs">
9786 <summary>Represents the summary data for a group</summary>
9787 </member>
9788 <member name="M:OpenMetaverse.GroupAccountSummaryReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.GroupAccountSummary)">
9789 <summary>Construct a new instance of the GroupAccountSummaryReplyEventArgs class</summary>
9790 <param name="groupID">The ID of the group</param>
9791 <param name="summary">The summary data</param>
9792 </member>
9793 <member name="P:OpenMetaverse.GroupAccountSummaryReplyEventArgs.GroupID">
9794 <summary>Get the ID of the group</summary>
9795 </member>
9796 <member name="P:OpenMetaverse.GroupAccountSummaryReplyEventArgs.Summary">
9797 <summary>Get the summary data</summary>
9798 </member>
9799 <member name="T:OpenMetaverse.GroupCreatedReplyEventArgs">
9800 <summary>A response to a group create request</summary>
9801 </member>
9802 <member name="M:OpenMetaverse.GroupCreatedReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,System.String)">
9803 <summary>Construct a new instance of the GroupCreatedReplyEventArgs class</summary>
9804 <param name="groupID">The ID of the group</param>
9805 <param name="success">the success or faulure of the request</param>
9806 <param name="messsage">A string containing additional information</param>
9807 </member>
9808 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.GroupID">
9809 <summary>Get the ID of the group</summary>
9810 </member>
9811 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.Success">
9812 <summary>true of the group was created successfully</summary>
9813 </member>
9814 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.Message">
9815 <summary>A string containing the message</summary>
9816 </member>
9817 <member name="T:OpenMetaverse.GroupOperationEventArgs">
9818 <summary>Represents a response to a request</summary>
9819 </member>
9820 <member name="M:OpenMetaverse.GroupOperationEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean)">
9821 <summary>Construct a new instance of the GroupOperationEventArgs class</summary>
9822 <param name="groupID">The ID of the group</param>
9823 <param name="success">true of the request was successful</param>
9824 </member> 10737 </member>
9825 <member name="P:OpenMetaverse.GroupOperationEventArgs.GroupID"> 10738 <member name="F:OpenMetaverse.Primitive.Textures">
9826 <summary>Get the ID of the group</summary> 10739 <summary></summary>
9827 </member>
9828 <member name="P:OpenMetaverse.GroupOperationEventArgs.Success">
9829 <summary>true of the request was successful</summary>
9830 </member>
9831 <member name="T:OpenMetaverse.GroupDroppedEventArgs">
9832 <summary>Represents your agent leaving a group</summary>
9833 </member>
9834 <member name="M:OpenMetaverse.GroupDroppedEventArgs.#ctor(OpenMetaverse.UUID)">
9835 <summary>Construct a new instance of the GroupDroppedEventArgs class</summary>
9836 <param name="groupID">The ID of the group</param>
9837 </member>
9838 <member name="P:OpenMetaverse.GroupDroppedEventArgs.GroupID">
9839 <summary>Get the ID of the group</summary>
9840 </member>
9841 <member name="T:OpenMetaverse.GroupNoticesListReplyEventArgs">
9842 <summary>Represents a list of active group notices</summary>
9843 </member> 10740 </member>
9844 <member name="M:OpenMetaverse.GroupNoticesListReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.GroupNoticesListEntry})"> 10741 <member name="F:OpenMetaverse.Primitive.TextureAnim">
9845 <summary>Construct a new instance of the GroupNoticesListReplyEventArgs class</summary> 10742 <summary></summary>
9846 <param name="groupID">The ID of the group</param>
9847 <param name="notices">The list containing active notices</param>
9848 </member> 10743 </member>
9849 <member name="P:OpenMetaverse.GroupNoticesListReplyEventArgs.GroupID"> 10744 <member name="F:OpenMetaverse.Primitive.ID">
9850 <summary>Get the ID of the group</summary> 10745 <summary></summary>
9851 </member> 10746 </member>
9852 <member name="P:OpenMetaverse.GroupNoticesListReplyEventArgs.Notices"> 10747 <member name="F:OpenMetaverse.Primitive.GroupID">
9853 <summary>Get the notices list</summary> 10748 <summary></summary>
9854 </member> 10749 </member>
9855 <member name="T:OpenMetaverse.GroupProfileEventArgs"> 10750 <member name="F:OpenMetaverse.Primitive.LocalID">
9856 <summary>Represents the profile of a group</summary> 10751 <summary></summary>
9857 </member> 10752 </member>
9858 <member name="M:OpenMetaverse.GroupProfileEventArgs.#ctor(OpenMetaverse.Group)"> 10753 <member name="F:OpenMetaverse.Primitive.ParentID">
9859 <summary>Construct a new instance of the GroupProfileEventArgs class</summary> 10754 <summary></summary>
9860 <param name="group">The group profile</param>
9861 </member> 10755 </member>
9862 <member name="P:OpenMetaverse.GroupProfileEventArgs.Group"> 10756 <member name="F:OpenMetaverse.Primitive.RegionHandle">
9863 <summary>Get the group profile</summary> 10757 <summary></summary>
9864 </member> 10758 </member>
9865 <member name="T:OpenMetaverse.GroupInvitationEventArgs"> 10759 <member name="F:OpenMetaverse.Primitive.Flags">
9866 <summary> 10760 <summary></summary>
9867 Provides notification of a group invitation request sent by another Avatar
9868 </summary>
9869 <remarks>The <see cref="!:GroupInvitation" /> invitation is raised when another avatar makes an offer for our avatar
9870 to join a group.</remarks>
9871 </member> 10761 </member>
9872 <member name="P:OpenMetaverse.GroupInvitationEventArgs.AgentID"> 10762 <member name="F:OpenMetaverse.Primitive.TreeSpecies">
9873 <summary>The ID of the Avatar sending the group invitation</summary> 10763 <summary>Foliage type for this primitive. Only applicable if this
10764 primitive is foliage</summary>
9874 </member> 10765 </member>
9875 <member name="P:OpenMetaverse.GroupInvitationEventArgs.FromName"> 10766 <member name="F:OpenMetaverse.Primitive.ScratchPad">
9876 <summary>The name of the Avatar sending the group invitation</summary> 10767 <summary>Unknown</summary>
9877 </member> 10768 </member>
9878 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Message"> 10769 <member name="F:OpenMetaverse.Primitive.Position">
9879 <summary>A message containing the request information which includes 10770 <summary></summary>
9880 the name of the group, the groups charter and the fee to join details</summary>
9881 </member> 10771 </member>
9882 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Simulator"> 10772 <member name="F:OpenMetaverse.Primitive.Scale">
9883 <summary>The Simulator</summary> 10773 <summary></summary>
9884 </member> 10774 </member>
9885 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Accept"> 10775 <member name="F:OpenMetaverse.Primitive.Rotation">
9886 <summary>Set to true to accept invitation, false to decline</summary> 10776 <summary></summary>
9887 </member> 10777 </member>
9888 <member name="T:OpenMetaverse.Helpers"> 10778 <member name="F:OpenMetaverse.Primitive.Velocity">
9889 <summary> 10779 <summary></summary>
9890 Static helper functions and global variables
9891 </summary>
9892 </member> 10780 </member>
9893 <member name="T:OpenMetaverse.Helpers.LogLevel"> 10781 <member name="F:OpenMetaverse.Primitive.AngularVelocity">
9894 <summary> 10782 <summary></summary>
9895 Passed to Logger.Log() to identify the severity of a log entry
9896 </summary>
9897 </member> 10783 </member>
9898 <member name="F:OpenMetaverse.Helpers.LogLevel.None"> 10784 <member name="F:OpenMetaverse.Primitive.Acceleration">
9899 <summary>No logging information will be output</summary> 10785 <summary></summary>
9900 </member> 10786 </member>
9901 <member name="F:OpenMetaverse.Helpers.LogLevel.Info"> 10787 <member name="F:OpenMetaverse.Primitive.CollisionPlane">
9902 <summary>Non-noisy useful information, may be helpful in 10788 <summary></summary>
9903 debugging a problem</summary>
9904 </member> 10789 </member>
9905 <member name="F:OpenMetaverse.Helpers.LogLevel.Warning"> 10790 <member name="F:OpenMetaverse.Primitive.Flexible">
9906 <summary>A non-critical error occurred. A warning will not 10791 <summary></summary>
9907 prevent the rest of the library from operating as usual,
9908 although it may be indicative of an underlying issue</summary>
9909 </member> 10792 </member>
9910 <member name="F:OpenMetaverse.Helpers.LogLevel.Error"> 10793 <member name="F:OpenMetaverse.Primitive.Light">
9911 <summary>A critical error has occurred. Generally this will 10794 <summary></summary>
9912 be followed by the network layer shutting down, although the
9913 stability of the library after an error is uncertain</summary>
9914 </member> 10795 </member>
9915 <member name="F:OpenMetaverse.Helpers.LogLevel.Debug"> 10796 <member name="F:OpenMetaverse.Primitive.LightMap">
9916 <summary>Used for internal testing, this logging level can 10797 <summary></summary>
9917 generate very noisy (long and/or repetitive) messages. Don't
9918 pass this to the Log() function, use DebugLog() instead.
9919 </summary>
9920 </member> 10798 </member>
9921 <member name="F:OpenMetaverse.Helpers.MSG_APPENDED_ACKS"> 10799 <member name="F:OpenMetaverse.Primitive.Sculpt">
9922 <summary>This header flag signals that ACKs are appended to the packet</summary> 10800 <summary></summary>
9923 </member> 10801 </member>
9924 <member name="F:OpenMetaverse.Helpers.MSG_RESENT"> 10802 <member name="F:OpenMetaverse.Primitive.ClickAction">
9925 <summary>This header flag signals that this packet has been sent before</summary> 10803 <summary></summary>
9926 </member> 10804 </member>
9927 <member name="F:OpenMetaverse.Helpers.MSG_RELIABLE"> 10805 <member name="F:OpenMetaverse.Primitive.Sound">
9928 <summary>This header flags signals that an ACK is expected for this packet</summary> 10806 <summary></summary>
9929 </member> 10807 </member>
9930 <member name="F:OpenMetaverse.Helpers.MSG_ZEROCODED"> 10808 <member name="F:OpenMetaverse.Primitive.OwnerID">
9931 <summary>This header flag signals that the message is compressed using zerocoding</summary> 10809 <summary>Identifies the owner if audio or a particle system is
10810 active</summary>
9932 </member> 10811 </member>
9933 <member name="M:OpenMetaverse.Helpers.TEOffsetShort(System.Single)"> 10812 <member name="F:OpenMetaverse.Primitive.SoundFlags">
9934 <summary> 10813 <summary></summary>
9935 </summary>
9936 <param name="offset">
9937 </param>
9938 <returns>
9939 </returns>
9940 </member> 10814 </member>
9941 <member name="M:OpenMetaverse.Helpers.TEOffsetFloat(System.Byte[],System.Int32)"> 10815 <member name="F:OpenMetaverse.Primitive.SoundGain">
9942 <summary> 10816 <summary></summary>
9943 </summary>
9944 <param name="bytes">
9945 </param>
9946 <param name="pos">
9947 </param>
9948 <returns>
9949 </returns>
9950 </member> 10817 </member>
9951 <member name="M:OpenMetaverse.Helpers.TERotationShort(System.Single)"> 10818 <member name="F:OpenMetaverse.Primitive.SoundRadius">
9952 <summary> 10819 <summary></summary>
9953 </summary>
9954 <param name="rotation">
9955 </param>
9956 <returns>
9957 </returns>
9958 </member> 10820 </member>
9959 <member name="M:OpenMetaverse.Helpers.TERotationFloat(System.Byte[],System.Int32)"> 10821 <member name="F:OpenMetaverse.Primitive.Text">
9960 <summary> 10822 <summary></summary>
9961 </summary>
9962 <param name="bytes">
9963 </param>
9964 <param name="pos">
9965 </param>
9966 <returns>
9967 </returns>
9968 </member> 10823 </member>
9969 <member name="M:OpenMetaverse.Helpers.GlobalPosToRegionHandle(System.Single,System.Single,System.Single@,System.Single@)"> 10824 <member name="F:OpenMetaverse.Primitive.TextColor">
9970 <summary> 10825 <summary></summary>
9971 Given an X/Y location in absolute (grid-relative) terms, a region
9972 handle is returned along with the local X/Y location in that region
9973 </summary>
9974 <param name="globalX">The absolute X location, a number such as
9975 255360.35</param>
9976 <param name="globalY">The absolute Y location, a number such as
9977 255360.35</param>
9978 <param name="localX">The sim-local X position of the global X
9979 position, a value from 0.0 to 256.0</param>
9980 <param name="localY">The sim-local Y position of the global Y
9981 position, a value from 0.0 to 256.0</param>
9982 <returns>A 64-bit region handle that can be used to teleport to</returns>
9983 </member> 10826 </member>
9984 <member name="M:OpenMetaverse.Helpers.FloatToTerseString(System.Single)"> 10827 <member name="F:OpenMetaverse.Primitive.MediaURL">
9985 <summary> 10828 <summary></summary>
9986 Converts a floating point number to a terse string format used for
9987 transmitting numbers in wearable asset files
9988 </summary>
9989 <param name="val">Floating point number to convert to a string</param>
9990 <returns>A terse string representation of the input number</returns>
9991 </member> 10829 </member>
9992 <member name="M:OpenMetaverse.Helpers.FieldToString(System.Text.StringBuilder,System.Byte[],System.String)"> 10830 <member name="F:OpenMetaverse.Primitive.Joint">
9993 <summary> 10831 <summary></summary>
9994 Convert a variable length field (byte array) to a string, with a
9995 field name prepended to each line of the output
9996 </summary>
9997 <remarks>If the byte array has unprintable characters in it, a
9998 hex dump will be written instead</remarks>
9999 <param name="output">The StringBuilder object to write to</param>
10000 <param name="bytes">The byte array to convert to a string</param>
10001 <param name="fieldName">A field name to prepend to each line of output</param>
10002 </member> 10832 </member>
10003 <member name="M:OpenMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])"> 10833 <member name="F:OpenMetaverse.Primitive.JointPivot">
10004 <summary> 10834 <summary></summary>
10005 Decode a zerocoded byte array, used to decompress packets marked
10006 with the zerocoded flag
10007 </summary>
10008 <remarks>Any time a zero is encountered, the next byte is a count
10009 of how many zeroes to expand. One zero is encoded with 0x00 0x01,
10010 two zeroes is 0x00 0x02, three zeroes is 0x00 0x03, etc. The
10011 first four bytes are copied directly to the output buffer.
10012 </remarks>
10013 <param name="src">The byte array to decode</param>
10014 <param name="srclen">The length of the byte array to decode. This
10015 would be the length of the packet up to (but not including) any
10016 appended ACKs</param>
10017 <param name="dest">The output byte array to decode to</param>
10018 <returns>The length of the output buffer</returns>
10019 </member> 10835 </member>
10020 <member name="M:OpenMetaverse.Helpers.ZeroEncode(System.Byte[],System.Int32,System.Byte[])"> 10836 <member name="F:OpenMetaverse.Primitive.JointAxisOrAnchor">
10021 <summary> 10837 <summary></summary>
10022 Encode a byte array with zerocoding. Used to compress packets marked
10023 with the zerocoded flag. Any zeroes in the array are compressed down
10024 to a single zero byte followed by a count of how many zeroes to expand
10025 out. A single zero becomes 0x00 0x01, two zeroes becomes 0x00 0x02,
10026 three zeroes becomes 0x00 0x03, etc. The first four bytes are copied
10027 directly to the output buffer.
10028 </summary>
10029 <param name="src">The byte array to encode</param>
10030 <param name="srclen">The length of the byte array to encode</param>
10031 <param name="dest">The output byte array to encode to</param>
10032 <returns>The length of the output buffer</returns>
10033 </member> 10838 </member>
10034 <member name="M:OpenMetaverse.Helpers.InventoryCRC(System.Int32,System.Byte,System.SByte,System.SByte,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Int32,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.UInt32)"> 10839 <member name="F:OpenMetaverse.Primitive.NameValues">
10035 <summary> 10840 <summary></summary>
10036 Calculates the CRC (cyclic redundancy check) needed to upload inventory.
10037 </summary>
10038 <param name="creationDate">Creation date</param>
10039 <param name="saleType">Sale type</param>
10040 <param name="invType">Inventory type</param>
10041 <param name="type">Type</param>
10042 <param name="assetID">Asset ID</param>
10043 <param name="groupID">Group ID</param>
10044 <param name="salePrice">Sale price</param>
10045 <param name="ownerID">Owner ID</param>
10046 <param name="creatorID">Creator ID</param>
10047 <param name="itemID">Item ID</param>
10048 <param name="folderID">Folder ID</param>
10049 <param name="everyoneMask">Everyone mask (permissions)</param>
10050 <param name="flags">Flags</param>
10051 <param name="nextOwnerMask">Next owner mask (permissions)</param>
10052 <param name="groupMask">Group mask (permissions)</param>
10053 <param name="ownerMask">Owner mask (permissions)</param>
10054 <returns>The calculated CRC</returns>
10055 </member> 10841 </member>
10056 <member name="M:OpenMetaverse.Helpers.GetResourceStream(System.String)"> 10842 <member name="F:OpenMetaverse.Primitive.PrimData">
10057 <summary> 10843 <summary></summary>
10058 Attempts to load a file embedded in the assembly
10059 </summary>
10060 <param name="resourceName">The filename of the resource to load</param>
10061 <returns>A Stream for the requested file, or null if the resource
10062 was not successfully loaded</returns>
10063 </member> 10844 </member>
10064 <member name="M:OpenMetaverse.Helpers.GetResourceStream(System.String,System.String)"> 10845 <member name="F:OpenMetaverse.Primitive.Properties">
10065 <summary> 10846 <summary></summary>
10066 Attempts to load a file either embedded in the assembly or found in
10067 a given search path
10068 </summary>
10069 <param name="resourceName">The filename of the resource to load</param>
10070 <param name="searchPath">An optional path that will be searched if
10071 the asset is not found embedded in the assembly</param>
10072 <returns>A Stream for the requested file, or null if the resource
10073 was not successfully loaded</returns>
10074 </member> 10847 </member>
10075 <member name="M:OpenMetaverse.Helpers.PrimListToOSD(System.Collections.Generic.List{OpenMetaverse.Primitive})"> 10848 <member name="F:OpenMetaverse.Primitive.PhysicsProps">
10076 <summary> 10849 <summary>Objects physics engine propertis</summary>
10077 Converts a list of primitives to an object that can be serialized
10078 with the LLSD system
10079 </summary>
10080 <param name="prims">Primitives to convert to a serializable object</param>
10081 <returns>An object that can be serialized with LLSD</returns>
10082 </member> 10850 </member>
10083 <member name="M:OpenMetaverse.Helpers.OSDToPrimList(OpenMetaverse.StructuredData.OSD)"> 10851 <member name="F:OpenMetaverse.Primitive.Tag">
10084 <summary> 10852 <summary>Extra data about primitive</summary>
10085 Deserializes OSD in to a list of primitives
10086 </summary>
10087 <param name="osd">Structure holding the serialized primitive list,
10088 must be of the SDMap type</param>
10089 <returns>A list of deserialized primitives</returns>
10090 </member> 10853 </member>
10091 <member name="M:OpenMetaverse.Helpers.StructToString(System.Object)"> 10854 <member name="F:OpenMetaverse.Primitive.IsAttachment">
10092 <summary> 10855 <summary>Indicates if prim is attached to an avatar</summary>
10093 Converts a struct or class object containing fields only into a key value separated string
10094 </summary>
10095 <param name="t">The struct object</param>
10096 <returns>A string containing the struct fields as the keys, and the field value as the value separated</returns>
10097 <example>
10098 <code>
10099 // Add the following code to any struct or class containing only fields to override the ToString()
10100 // method to display the values of the passed object
10101 /// <summary>Print the struct data as a string</summary>
10102 ///<returns>A string containing the field name, and field value</returns>
10103 public override string ToString()
10104 {
10105 return Helpers.StructToString(this);
10106 }
10107 </code>
10108 </example>
10109 </member> 10856 </member>
10110 <member name="T:OpenMetaverse.InternalDictionary`2"> 10857 <member name="F:OpenMetaverse.Primitive.ActiveClients">
10111 <summary> 10858 <summary>Number of clients referencing this prim</summary>
10112 The InternalDictionary class is used through the library for storing key/value pairs.
10113 It is intended to be a replacement for the generic Dictionary class and should
10114 be used in its place. It contains several methods for allowing access to the data from
10115 outside the library that are read only and thread safe.
10116 </summary>
10117 <typeparam name="TKey">Key <see langword="Tkey" /></typeparam>
10118 <typeparam name="TValue">Value <see langword="TValue" /></typeparam>
10119 </member> 10859 </member>
10120 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor"> 10860 <member name="M:OpenMetaverse.Primitive.#ctor">
10121 <summary> 10861 <summary>
10122 Initializes a new instance of the <seealso cref="T:InternalDictionary" /> Class 10862 Default constructor
10123 with the specified key/value, has the default initial capacity.
10124 </summary> 10863 </summary>
10125 <example>
10126 <code>
10127 // initialize a new InternalDictionary named testDict with a string as the key and an int as the value.
10128 public InternalDictionary&lt;string, int&gt; testDict = new InternalDictionary&lt;string, int&gt;();
10129 </code>
10130 </example>
10131 </member>
10132 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor(System.Collections.Generic.IDictionary{`0,`1})">
10133 <summary>
10134 Initializes a new instance of the <seealso cref="T:InternalDictionary" /> Class
10135 with the specified key/value, has its initial valies copied from the specified
10136 <seealso cref="T:System.Collections.Generic.Dictionary" /></summary>
10137 <param name="dictionary">
10138 <seealso cref="T:System.Collections.Generic.Dictionary" />
10139 to copy initial values from</param>
10140 <example>
10141 <code>
10142 // initialize a new InternalDictionary named testAvName with a UUID as the key and an string as the value.
10143 // populates with copied values from example KeyNameCache Dictionary.
10144 // create source dictionary
10145 Dictionary&lt;UUID, string&gt; KeyNameCache = new Dictionary&lt;UUID, string&gt;();
10146 KeyNameCache.Add("8300f94a-7970-7810-cf2c-fc9aa6cdda24", "Jack Avatar");
10147 KeyNameCache.Add("27ba1e40-13f7-0708-3e98-5819d780bd62", "Jill Avatar");
10148 // Initialize new dictionary.
10149 public InternalDictionary&lt;UUID, string&gt; testAvName = new InternalDictionary&lt;UUID, string&gt;(KeyNameCache);
10150 </code>
10151 </example>
10152 </member> 10864 </member>
10153 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor(System.Int32)"> 10865 <member name="M:OpenMetaverse.Primitive.PackPathTwist(System.Single)">
10154 <summary> 10866 <summary>
10155 Initializes a new instance of the <seealso cref="T:OpenMetaverse.InternalDictionary" /> Class 10867 Packs PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew
10156 with the specified key/value, With its initial capacity specified. 10868 parameters in to signed eight bit values
10157 </summary> 10869 </summary>
10158 <param name="capacity">Initial size of dictionary</param> 10870 <param name="pathTwist">Floating point parameter to pack</param>
10159 <example> 10871 <returns>Signed eight bit value containing the packed parameter</returns>
10160 <code>
10161 // initialize a new InternalDictionary named testDict with a string as the key and an int as the value,
10162 // initially allocated room for 10 entries.
10163 public InternalDictionary&lt;string, int&gt; testDict = new InternalDictionary&lt;string, int&gt;(10);
10164 </code>
10165 </example>
10166 </member>
10167 <member name="F:OpenMetaverse.InternalDictionary`2.Dictionary">
10168 <summary>Internal dictionary that this class wraps around. Do not
10169 modify or enumerate the contents of this dictionary without locking
10170 on this member</summary>
10171 </member> 10872 </member>
10172 <member name="P:OpenMetaverse.InternalDictionary`2.Item(`0)"> 10873 <member name="M:OpenMetaverse.Primitive.UnpackPathTwist(System.SByte)">
10173 <summary> 10874 <summary>
10174 Indexer for the dictionary 10875 Unpacks PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew
10876 parameters from signed eight bit integers to floating point values
10175 </summary> 10877 </summary>
10176 <param name="key">The key</param> 10878 <param name="pathTwist">Signed eight bit value to unpack</param>
10177 <returns>The value</returns> 10879 <returns>Unpacked floating point value</returns>
10178 </member> 10880 </member>
10179 <member name="P:OpenMetaverse.InternalDictionary`2.Count"> 10881 <member name="F:OpenMetaverse.Primitive.ParticleSys">
10180 <summary> 10882 <summary></summary>
10181 Gets the number of Key/Value pairs contained in the <seealso cref="T:InternalDictionary" /></summary>
10182 </member> 10883 </member>
10183 <member name="M:OpenMetaverse.InternalDictionary`2.TryGetValue(`0,`1@)"> 10884 <member name="P:OpenMetaverse.Primitive.Type">
10184 <summary> 10885 <summary>Uses basic heuristics to estimate the primitive shape</summary>
10185 Try to get entry from <seealso cref="T:OpenMetaverse.InternalDictionary" /> with specified key
10186 </summary>
10187 <param name="key">Key to use for lookup</param>
10188 <param name="value">Value returned</param>
10189 <returns>
10190 <see langword="true" /> if specified key exists, <see langword="false" /> if not found</returns>
10191 <example>
10192 <code>
10193 // find your avatar using the Simulator.ObjectsAvatars InternalDictionary:
10194 Avatar av;
10195 if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av))
10196 Console.WriteLine("Found Avatar {0}", av.Name);
10197 </code>
10198 <seealso cref="F:OpenMetaverse.Simulator.ObjectsAvatars" />
10199 </example>
10200 </member> 10886 </member>
10201 <member name="M:OpenMetaverse.InternalDictionary`2.Find(System.Predicate{`1})"> 10887 <member name="T:OpenMetaverse.Primitive.TextureAnimMode">
10202 <summary> 10888 <summary>
10203 Finds the specified match. 10889 Texture animation mode
10204 </summary> 10890 </summary>
10205 <param name="match">The match.</param>
10206 <returns>Matched value</returns>
10207 <example>
10208 <code>
10209 // use a delegate to find a prim in the ObjectsPrimitives InternalDictionary
10210 // with the ID 95683496
10211 uint findID = 95683496;
10212 Primitive findPrim = sim.ObjectsPrimitives.Find(
10213 delegate(Primitive prim) { return prim.ID == findID; });
10214 </code>
10215 </example>
10216 </member> 10891 </member>
10217 <member name="M:OpenMetaverse.InternalDictionary`2.FindAll(System.Predicate{`1})"> 10892 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ANIM_OFF">
10218 <summary>Find All items in an <seealso cref="T:InternalDictionary" /></summary> 10893 <summary>Disable texture animation</summary>
10219 <param name="match">return matching items.</param>
10220 <returns>a <seealso cref="T:System.Collections.Generic.List" /> containing found items.</returns>
10221 <example>
10222 Find All prims within 20 meters and store them in a List
10223 <code>
10224 int radius = 20;
10225 List&lt;Primitive&gt; prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll(
10226 delegate(Primitive prim) {
10227 Vector3 pos = prim.Position;
10228 return ((prim.ParentID == 0) &amp;&amp; (pos != Vector3.Zero) &amp;&amp; (Vector3.Distance(pos, location) &lt; radius));
10229 }
10230 );
10231 </code></example>
10232 </member> 10894 </member>
10233 <member name="M:OpenMetaverse.InternalDictionary`2.FindAll(System.Predicate{`0})"> 10895 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ANIM_ON">
10234 <summary>Find All items in an <seealso cref="T:InternalDictionary" /></summary> 10896 <summary>Enable texture animation</summary>
10235 <param name="match">return matching keys.</param>
10236 <returns>a <seealso cref="T:System.Collections.Generic.List" /> containing found keys.</returns>
10237 <example>
10238 Find All keys which also exist in another dictionary
10239 <code>
10240 List&lt;UUID&gt; matches = myDict.FindAll(
10241 delegate(UUID id) {
10242 return myOtherDict.ContainsKey(id);
10243 }
10244 );
10245 </code></example>
10246 </member> 10897 </member>
10247 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{`1})"> 10898 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.LOOP">
10248 <summary>Perform an <seealso cref="T:System.Action" /> on each entry in an <seealso cref="T:OpenMetaverse.InternalDictionary" /></summary> 10899 <summary>Loop when animating textures</summary>
10249 <param name="action">
10250 <seealso cref="T:System.Action" /> to perform</param>
10251 <example>
10252 <code>
10253 // Iterates over the ObjectsPrimitives InternalDictionary and prints out some information.
10254 Client.Network.CurrentSim.ObjectsPrimitives.ForEach(
10255 delegate(Primitive prim)
10256 {
10257 if (prim.Text != null)
10258 {
10259 Console.WriteLine("NAME={0} ID = {1} TEXT = '{2}'",
10260 prim.PropertiesFamily.Name, prim.ID, prim.Text);
10261 }
10262 });
10263 </code>
10264 </example>
10265 </member> 10900 </member>
10266 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{`0})"> 10901 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.REVERSE">
10267 <summary>Perform an <seealso cref="T:System.Action" /> on each key of an <seealso cref="T:OpenMetaverse.InternalDictionary" /></summary> 10902 <summary>Animate in reverse direction</summary>
10268 <param name="action">
10269 <seealso cref="T:System.Action" /> to perform</param>
10270 </member> 10903 </member>
10271 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{System.Collections.Generic.KeyValuePair{`0,`1}})"> 10904 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.PING_PONG">
10272 <summary> 10905 <summary>Animate forward then reverse</summary>
10273 Perform an <seealso cref="T:System.Action" /> on each KeyValuePair of an <seealso cref="T:OpenMetaverse.InternalDictionary" /></summary>
10274 <param name="action">
10275 <seealso cref="T:System.Action" /> to perform</param>
10276 </member> 10906 </member>
10277 <member name="M:OpenMetaverse.InternalDictionary`2.ContainsKey(`0)"> 10907 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.SMOOTH">
10278 <summary>Check if Key exists in Dictionary</summary> 10908 <summary>Slide texture smoothly instead of frame-stepping</summary>
10279 <param name="key">Key to check for</param>
10280 <returns>
10281 <see langword="true" /> if found, <see langword="false" /> otherwise</returns>
10282 </member> 10909 </member>
10283 <member name="M:OpenMetaverse.InternalDictionary`2.ContainsValue(`1)"> 10910 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ROTATE">
10284 <summary>Check if Value exists in Dictionary</summary> 10911 <summary>Rotate texture instead of using frames</summary>
10285 <param name="value">Value to check for</param>
10286 <returns>
10287 <see langword="true" /> if found, <see langword="false" /> otherwise</returns>
10288 </member> 10912 </member>
10289 <member name="M:OpenMetaverse.InternalDictionary`2.Add(`0,`1)"> 10913 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.SCALE">
10290 <summary> 10914 <summary>Scale texture instead of using frames</summary>
10291 Adds the specified key to the dictionary, dictionary locking is not performed,
10292 <see cref="!:SafeAdd" /></summary>
10293 <param name="key">The key</param>
10294 <param name="value">The value</param>
10295 </member> 10915 </member>
10296 <member name="M:OpenMetaverse.InternalDictionary`2.Remove(`0)"> 10916 <member name="T:OpenMetaverse.Primitive.TextureEntryFace">
10297 <summary> 10917 <summary>
10298 Removes the specified key, dictionary locking is not performed 10918 A single textured face. Don't instantiate this class yourself, use the
10919 methods in TextureEntry
10299 </summary> 10920 </summary>
10300 <param name="key">The key.</param>
10301 <returns>
10302 <see langword="true" /> if successful, <see langword="false" /> otherwise</returns>
10303 </member> 10921 </member>
10304 <member name="T:OpenMetaverse.InventoryException"> 10922 <member name="M:OpenMetaverse.Primitive.TextureEntryFace.#ctor(OpenMetaverse.Primitive.TextureEntryFace)">
10305 <summary> 10923 <summary>
10306 Exception class to identify inventory exceptions 10924 Contains the definition for individual faces
10307 </summary> 10925 </summary>
10926 <param name="defaultTexture"></param>
10308 </member> 10927 </member>
10309 <member name="T:OpenMetaverse.Inventory"> 10928 <member name="M:OpenMetaverse.Primitive.TextureEntryFace.ToString">
10310 <summary> 10929 <summary>
10311 Responsible for maintaining inventory structure. Inventory constructs nodes 10930
10312 and manages node children as is necessary to maintain a coherant hirarchy.
10313 Other classes should not manipulate or create InventoryNodes explicitly. When
10314 A node's parent changes (when a folder is moved, for example) simply pass
10315 Inventory the updated InventoryFolder and it will make the appropriate changes
10316 to its internal representation.
10317 </summary> 10931 </summary>
10932 <returns></returns>
10318 </member> 10933 </member>
10319 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectUpdated"> 10934 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.material">
10320 <summary>The event subscribers, null of no subscribers</summary> 10935 <summary></summary>
10321 </member>
10322 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectUpdatedLock">
10323 <summary>Thread sync lock object</summary>
10324 </member>
10325 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectRemoved">
10326 <summary>The event subscribers, null of no subscribers</summary>
10327 </member>
10328 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectRemovedLock">
10329 <summary>Thread sync lock object</summary>
10330 </member>
10331 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectAdded">
10332 <summary>The event subscribers, null of no subscribers</summary>
10333 </member> 10936 </member>
10334 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectAddedLock"> 10937 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.media">
10335 <summary>Thread sync lock object</summary> 10938 <summary></summary>
10336 </member> 10939 </member>
10337 <member name="E:OpenMetaverse.Inventory.InventoryObjectUpdated"> 10940 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RGBA">
10338 <summary>Raised when the simulator sends us data containing 10941 <summary></summary>
10339 ...</summary>
10340 </member> 10942 </member>
10341 <member name="E:OpenMetaverse.Inventory.InventoryObjectRemoved"> 10943 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RepeatU">
10342 <summary>Raised when the simulator sends us data containing 10944 <summary></summary>
10343 ...</summary>
10344 </member> 10945 </member>
10345 <member name="E:OpenMetaverse.Inventory.InventoryObjectAdded"> 10946 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RepeatV">
10346 <summary>Raised when the simulator sends us data containing 10947 <summary></summary>
10347 ...</summary>
10348 </member> 10948 </member>
10349 <member name="P:OpenMetaverse.Inventory.Item(OpenMetaverse.UUID)"> 10949 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.OffsetU">
10350 <summary> 10950 <summary></summary>
10351 By using the bracket operator on this class, the program can get the
10352 InventoryObject designated by the specified uuid. If the value for the corresponding
10353 UUID is null, the call is equivelant to a call to <code>RemoveNodeFor(this[uuid])</code>.
10354 If the value is non-null, it is equivelant to a call to <code>UpdateNodeFor(value)</code>,
10355 the uuid parameter is ignored.
10356 </summary>
10357 <param name="uuid">The UUID of the InventoryObject to get or set, ignored if set to non-null value.</param>
10358 <returns>The InventoryObject corresponding to <code>uuid</code>.</returns>
10359 </member> 10951 </member>
10360 <member name="P:OpenMetaverse.Inventory.RootFolder"> 10952 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.OffsetV">
10361 <summary> 10953 <summary></summary>
10362 The root folder of this avatars inventory
10363 </summary>
10364 </member> 10954 </member>
10365 <member name="P:OpenMetaverse.Inventory.LibraryFolder"> 10955 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Rotation">
10366 <summary> 10956 <summary></summary>
10367 The default shared library folder
10368 </summary>
10369 </member> 10957 </member>
10370 <member name="P:OpenMetaverse.Inventory.RootNode"> 10958 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Glow">
10371 <summary> 10959 <summary></summary>
10372 The root node of the avatars inventory
10373 </summary>
10374 </member> 10960 </member>
10375 <member name="P:OpenMetaverse.Inventory.LibraryRootNode"> 10961 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Bump">
10376 <summary> 10962 <summary></summary>
10377 The root node of the default shared library
10378 </summary>
10379 </member> 10963 </member>
10380 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectUpdated(OpenMetaverse.InventoryObjectUpdatedEventArgs)"> 10964 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.MediaFlags">
10381 <summary>Raises the InventoryObjectUpdated Event</summary> 10965 <summary>In the future this will specify whether a webpage is
10382 <param name="e">A InventoryObjectUpdatedEventArgs object containing 10966 attached to this face</summary>
10383 the data sent from the simulator</param>
10384 </member> 10967 </member>
10385 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectRemoved(OpenMetaverse.InventoryObjectRemovedEventArgs)"> 10968 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.TextureID">
10386 <summary>Raises the InventoryObjectRemoved Event</summary> 10969 <summary></summary>
10387 <param name="e">A InventoryObjectRemovedEventArgs object containing
10388 the data sent from the simulator</param>
10389 </member> 10970 </member>
10390 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectAdded(OpenMetaverse.InventoryObjectAddedEventArgs)"> 10971 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.MaterialID">
10391 <summary>Raises the InventoryObjectAdded Event</summary> 10972 <summary></summary>
10392 <param name="e">A InventoryObjectAddedEventArgs object containing
10393 the data sent from the simulator</param>
10394 </member> 10973 </member>
10395 <member name="M:OpenMetaverse.Inventory.GetContents(OpenMetaverse.UUID)"> 10974 <member name="T:OpenMetaverse.Primitive.TextureEntry">
10396 <summary> 10975 <summary>
10397 Returns the contents of the specified folder 10976 Represents all of the texturable faces for an object
10398 </summary> 10977 </summary>
10399 <param name="folder">A folder's UUID</param> 10978 <remarks>Grid objects have infinite faces, with each face
10400 <returns>The contents of the folder corresponding to <code>folder</code></returns> 10979 using the properties of the default face unless set otherwise. So if
10401 <exception cref="T:OpenMetaverse.InventoryException">When <code>folder</code> does not exist in the inventory</exception> 10980 you have a TextureEntry with a default texture uuid of X, and face 18
10981 has a texture UUID of Y, every face would be textured with X except for
10982 face 18 that uses Y. In practice however, primitives utilize a maximum
10983 of nine faces</remarks>
10402 </member> 10984 </member>
10403 <member name="M:OpenMetaverse.Inventory.UpdateNodeFor(OpenMetaverse.InventoryBase)"> 10985 <member name="F:OpenMetaverse.Primitive.TextureEntry.DefaultTexture">
10404 <summary> 10986 <summary></summary>
10405 Updates the state of the InventoryNode and inventory data structure that
10406 is responsible for the InventoryObject. If the item was previously not added to inventory,
10407 it adds the item, and updates structure accordingly. If it was, it updates the
10408 InventoryNode, changing the parent node if <code>item.parentUUID</code> does
10409 not match <code>node.Parent.Data.UUID</code>.
10410 You can not set the inventory root folder using this method
10411 </summary>
10412 <param name="item">The InventoryObject to store</param>
10413 </member> 10987 </member>
10414 <member name="M:OpenMetaverse.Inventory.RemoveNodeFor(OpenMetaverse.InventoryBase)"> 10988 <member name="F:OpenMetaverse.Primitive.TextureEntry.FaceTextures">
10415 <summary> 10989 <summary></summary>
10416 Removes the InventoryObject and all related node data from Inventory.
10417 </summary>
10418 <param name="item">The InventoryObject to remove.</param>
10419 </member> 10990 </member>
10420 <member name="M:OpenMetaverse.Inventory.Contains(OpenMetaverse.UUID)"> 10991 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(OpenMetaverse.UUID)">
10421 <summary> 10992 <summary>
10422 Used to find out if Inventory contains the InventoryObject 10993 Constructor that takes a default texture UUID
10423 specified by <code>uuid</code>.
10424 </summary> 10994 </summary>
10425 <param name="uuid">The UUID to check.</param> 10995 <param name="defaultTextureID">Texture UUID to use as the default texture</param>
10426 <returns>true if inventory contains uuid, false otherwise</returns>
10427 </member> 10996 </member>
10428 <member name="M:OpenMetaverse.Inventory.SaveToDisk(System.String)"> 10997 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(OpenMetaverse.Primitive.TextureEntryFace)">
10429 <summary> 10998 <summary>
10430 Saves the current inventory structure to a cache file 10999 Constructor that takes a <code>TextureEntryFace</code> for the
11000 default face
10431 </summary> 11001 </summary>
10432 <param name="filename">Name of the cache file to save to</param> 11002 <param name="defaultFace">Face to use as the default face</param>
10433 </member> 11003 </member>
10434 <member name="M:OpenMetaverse.Inventory.RestoreFromDisk(System.String)"> 11004 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(System.Byte[],System.Int32,System.Int32)">
10435 <summary> 11005 <summary>
10436 Loads in inventory cache file into the inventory structure. Note only valid to call after login has been successful. 11006 Constructor that creates the TextureEntry class from a byte array
10437 </summary> 11007 </summary>
10438 <param name="filename">Name of the cache file to load</param> 11008 <param name="data">Byte array containing the TextureEntry field</param>
10439 <returns>The number of inventory items sucessfully reconstructed into the inventory node tree</returns> 11009 <param name="pos">Starting position of the TextureEntry field in
10440 </member> 11010 the byte array</param>
10441 <member name="F:OpenMetaverse.InventorySortOrder.ByName"> 11011 <param name="length">Length of the TextureEntry field, in bytes</param>
10442 <summary>Sort by name</summary>
10443 </member>
10444 <member name="F:OpenMetaverse.InventorySortOrder.ByDate">
10445 <summary>Sort by date</summary>
10446 </member>
10447 <member name="F:OpenMetaverse.InventorySortOrder.FoldersByName">
10448 <summary>Sort folders by name, regardless of whether items are
10449 sorted by name or date</summary>
10450 </member>
10451 <member name="F:OpenMetaverse.InventorySortOrder.SystemFoldersToTop">
10452 <summary>Place system folders at the top</summary>
10453 </member> 11012 </member>
10454 <member name="T:OpenMetaverse.DeRezDestination"> 11013 <member name="M:OpenMetaverse.Primitive.TextureEntry.CreateFace(System.UInt32)">
10455 <summary> 11014 <summary>
10456 Possible destinations for DeRezObject request 11015 This will either create a new face if a custom face for the given
11016 index is not defined, or return the custom face for that index if
11017 it already exists
10457 </summary> 11018 </summary>
11019 <param name="index">The index number of the face to create or
11020 retrieve</param>
11021 <returns>A TextureEntryFace containing all the properties for that
11022 face</returns>
10458 </member> 11023 </member>
10459 <member name="F:OpenMetaverse.DeRezDestination.AgentInventorySave"> 11024 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetFace(System.UInt32)">
10460 <summary> 11025 <summary>
11026
10461 </summary> 11027 </summary>
11028 <param name="index"></param>
11029 <returns></returns>
10462 </member> 11030 </member>
10463 <member name="F:OpenMetaverse.DeRezDestination.AgentInventoryCopy"> 11031 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetOSD">
10464 <summary>Copy from in-world to agent inventory</summary>
10465 </member>
10466 <member name="F:OpenMetaverse.DeRezDestination.TaskInventory">
10467 <summary>Derez to TaskInventory</summary>
10468 </member>
10469 <member name="F:OpenMetaverse.DeRezDestination.Attachment">
10470 <summary> 11032 <summary>
11033
10471 </summary> 11034 </summary>
11035 <returns></returns>
10472 </member> 11036 </member>
10473 <member name="F:OpenMetaverse.DeRezDestination.AgentInventoryTake"> 11037 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetBytes">
10474 <summary>Take Object</summary>
10475 </member>
10476 <member name="F:OpenMetaverse.DeRezDestination.ForceToGodInventory">
10477 <summary> 11038 <summary>
11039
10478 </summary> 11040 </summary>
11041 <returns></returns>
10479 </member> 11042 </member>
10480 <member name="F:OpenMetaverse.DeRezDestination.TrashFolder"> 11043 <member name="M:OpenMetaverse.Primitive.TextureEntry.ToString">
10481 <summary>Delete Object</summary>
10482 </member>
10483 <member name="F:OpenMetaverse.DeRezDestination.AttachmentToInventory">
10484 <summary>Put an avatar attachment into agent inventory</summary>
10485 </member>
10486 <member name="F:OpenMetaverse.DeRezDestination.AttachmentExists">
10487 <summary> 11044 <summary>
11045
10488 </summary> 11046 </summary>
11047 <returns></returns>
10489 </member> 11048 </member>
10490 <member name="F:OpenMetaverse.DeRezDestination.ReturnToOwner"> 11049 <member name="T:OpenMetaverse.Primitive.TextureAnimation">
10491 <summary>Return an object back to the owner's inventory</summary>
10492 </member>
10493 <member name="F:OpenMetaverse.DeRezDestination.ReturnToLastOwner">
10494 <summary>Return a deeded object back to the last owner's inventory</summary>
10495 </member>
10496 <member name="T:OpenMetaverse.InventoryItemFlags">
10497 <summary> 11050 <summary>
10498 Upper half of the Flags field for inventory items 11051 Controls the texture animation of a particular prim
10499 </summary> 11052 </summary>
10500 </member> 11053 </member>
10501 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectSlamPerm"> 11054 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Flags">
10502 <summary>Indicates that the NextOwner permission will be set to the 11055 <summary></summary>
10503 most restrictive set of permissions found in the object set
10504 (including linkset items and object inventory items) on next rez</summary>
10505 </member>
10506 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectSlamSale">
10507 <summary>Indicates that the object sale information has been
10508 changed</summary>
10509 </member>
10510 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteBase">
10511 <summary>If set, and a slam bit is set, indicates BaseMask will be overwritten on Rez</summary>
10512 </member>
10513 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteOwner">
10514 <summary>If set, and a slam bit is set, indicates OwnerMask will be overwritten on Rez</summary>
10515 </member> 11056 </member>
10516 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteGroup"> 11057 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Face">
10517 <summary>If set, and a slam bit is set, indicates GroupMask will be overwritten on Rez</summary> 11058 <summary></summary>
10518 </member> 11059 </member>
10519 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteEveryone"> 11060 <member name="F:OpenMetaverse.Primitive.TextureAnimation.SizeX">
10520 <summary>If set, and a slam bit is set, indicates EveryoneMask will be overwritten on Rez</summary> 11061 <summary></summary>
10521 </member> 11062 </member>
10522 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteNextOwner"> 11063 <member name="F:OpenMetaverse.Primitive.TextureAnimation.SizeY">
10523 <summary>If set, and a slam bit is set, indicates NextOwnerMask will be overwritten on Rez</summary> 11064 <summary></summary>
10524 </member> 11065 </member>
10525 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectHasMultipleItems"> 11066 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Start">
10526 <summary>Indicates whether this object is composed of multiple 11067 <summary></summary>
10527 items or not</summary>
10528 </member> 11068 </member>
10529 <member name="F:OpenMetaverse.InventoryItemFlags.SharedSingleReference"> 11069 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Length">
10530 <summary>Indicates that the asset is only referenced by this 11070 <summary></summary>
10531 inventory item. If this item is deleted or updated to reference a
10532 new assetID, the asset can be deleted</summary>
10533 </member> 11071 </member>
10534 <member name="T:OpenMetaverse.InventoryBase"> 11072 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Rate">
10535 <summary> 11073 <summary></summary>
10536 Base Class for Inventory Items
10537 </summary>
10538 </member> 11074 </member>
10539 <member name="M:OpenMetaverse.InventoryBase.#ctor(OpenMetaverse.UUID)"> 11075 <member name="M:OpenMetaverse.Primitive.TextureAnimation.#ctor(System.Byte[],System.Int32)">
10540 <summary> 11076 <summary>
10541 Constructor, takes an itemID as a parameter 11077
10542 </summary> 11078 </summary>
10543 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the item</param> 11079 <param name="data"></param>
11080 <param name="pos"></param>
10544 </member> 11081 </member>
10545 <member name="M:OpenMetaverse.InventoryBase.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11082 <member name="M:OpenMetaverse.Primitive.TextureAnimation.GetBytes">
10546 <summary> 11083 <summary>
11084
10547 </summary> 11085 </summary>
10548 <returns> 11086 <returns></returns>
10549 </returns>
10550 </member> 11087 </member>
10551 <member name="F:OpenMetaverse.InventoryBase.UUID"> 11088 <member name="T:OpenMetaverse.Primitive.ConstructionData">
10552 <summary>
10553 <seealso cref="T:OpenMetaverse.UUID" /> of item/folder</summary>
10554 </member>
10555 <member name="F:OpenMetaverse.InventoryBase.ParentUUID">
10556 <summary>
10557 <seealso cref="T:OpenMetaverse.UUID" /> of parent folder</summary>
10558 </member>
10559 <member name="F:OpenMetaverse.InventoryBase.Name">
10560 <summary>Name of item/folder</summary>
10561 </member>
10562 <member name="F:OpenMetaverse.InventoryBase.OwnerID">
10563 <summary>Item/Folder Owners <seealso cref="T:OpenMetaverse.UUID" /></summary>
10564 </member>
10565 <member name="M:OpenMetaverse.InventoryBase.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
10566 <summary> 11089 <summary>
11090 Parameters used to construct a visual representation of a primitive
10567 </summary> 11091 </summary>
10568 <returns>
10569 </returns>
10570 </member> 11092 </member>
10571 <member name="M:OpenMetaverse.InventoryBase.GetHashCode"> 11093 <member name="F:OpenMetaverse.Primitive.ConstructionData.profileCurve">
10572 <summary> 11094 <summary></summary>
10573 Generates a number corresponding to the value of the object to support the use of a hash table,
10574 suitable for use in hashing algorithms and data structures such as a hash table
10575 </summary>
10576 <returns>A Hashcode of all the combined InventoryBase fields</returns>
10577 </member> 11095 </member>
10578 <member name="M:OpenMetaverse.InventoryBase.Equals(System.Object)"> 11096 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathCurve">
10579 <summary> 11097 <summary></summary>
10580 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase" /> object is equal to the current object
10581 </summary>
10582 <param name="o">InventoryBase object to compare against</param>
10583 <returns>true if objects are the same</returns>
10584 </member> 11098 </member>
10585 <member name="M:OpenMetaverse.InventoryBase.Equals(OpenMetaverse.InventoryBase)"> 11099 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathEnd">
10586 <summary> 11100 <summary></summary>
10587 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase" /> object is equal to the current object
10588 </summary>
10589 <param name="o">InventoryBase object to compare against</param>
10590 <returns>true if objects are the same</returns>
10591 </member> 11101 </member>
10592 <member name="T:OpenMetaverse.InventoryItem"> 11102 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathRadiusOffset">
10593 <summary> 11103 <summary></summary>
10594 An Item in Inventory
10595 </summary>
10596 </member> 11104 </member>
10597 <member name="M:OpenMetaverse.InventoryItem.#ctor(OpenMetaverse.UUID)"> 11105 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathSkew">
10598 <summary> 11106 <summary></summary>
10599 Construct a new InventoryItem object
10600 </summary>
10601 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the item</param>
10602 </member> 11107 </member>
10603 <member name="M:OpenMetaverse.InventoryItem.#ctor(OpenMetaverse.InventoryType,OpenMetaverse.UUID)"> 11108 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathScaleX">
10604 <summary> 11109 <summary></summary>
10605 Construct a new InventoryItem object of a specific Type
10606 </summary>
10607 <param name="type">The type of item from <seealso cref="T:OpenMetaverse.InventoryType" /></param>
10608 <param name="itemID">
10609 <seealso cref="T:OpenMetaverse.UUID" /> of the item</param>
10610 </member> 11110 </member>
10611 <member name="M:OpenMetaverse.InventoryItem.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11111 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathScaleY">
10612 <summary> 11112 <summary></summary>
10613 </summary>
10614 <returns>
10615 </returns>
10616 </member> 11113 </member>
10617 <member name="F:OpenMetaverse.InventoryItem.AssetUUID"> 11114 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathShearX">
10618 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of this item</summary> 11115 <summary></summary>
10619 </member> 11116 </member>
10620 <member name="F:OpenMetaverse.InventoryItem.Permissions"> 11117 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathShearY">
10621 <summary>The combined <seealso cref="T:OpenMetaverse.Permissions" /> of this item</summary> 11118 <summary></summary>
10622 </member> 11119 </member>
10623 <member name="F:OpenMetaverse.InventoryItem.AssetType"> 11120 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTaperX">
10624 <summary>The type of item from <seealso cref="T:OpenMetaverse.AssetType" /></summary> 11121 <summary></summary>
10625 </member> 11122 </member>
10626 <member name="F:OpenMetaverse.InventoryItem.InventoryType"> 11123 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTaperY">
10627 <summary>The type of item from the <seealso cref="T:OpenMetaverse.InventoryType" /> enum</summary> 11124 <summary></summary>
10628 </member> 11125 </member>
10629 <member name="F:OpenMetaverse.InventoryItem.CreatorID"> 11126 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathBegin">
10630 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the creator of this item</summary> 11127 <summary></summary>
10631 </member> 11128 </member>
10632 <member name="F:OpenMetaverse.InventoryItem.Description"> 11129 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTwist">
10633 <summary>A Description of this item</summary> 11130 <summary></summary>
10634 </member> 11131 </member>
10635 <member name="F:OpenMetaverse.InventoryItem.GroupID"> 11132 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTwistBegin">
10636 <summary>The <seealso cref="T:OpenMetaverse.Group" />s <seealso cref="T:OpenMetaverse.UUID" /> this item is set to or owned by</summary> 11133 <summary></summary>
10637 </member> 11134 </member>
10638 <member name="F:OpenMetaverse.InventoryItem.GroupOwned"> 11135 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathRevolutions">
10639 <summary>If true, item is owned by a group</summary> 11136 <summary></summary>
10640 </member> 11137 </member>
10641 <member name="F:OpenMetaverse.InventoryItem.SalePrice"> 11138 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileBegin">
10642 <summary>The price this item can be purchased for</summary> 11139 <summary></summary>
10643 </member> 11140 </member>
10644 <member name="F:OpenMetaverse.InventoryItem.SaleType"> 11141 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileEnd">
10645 <summary>The type of sale from the <seealso cref="T:OpenMetaverse.SaleType" /> enum</summary> 11142 <summary></summary>
10646 </member> 11143 </member>
10647 <member name="F:OpenMetaverse.InventoryItem.Flags"> 11144 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileHollow">
10648 <summary>Combined flags from <seealso cref="T:OpenMetaverse.InventoryItemFlags" /></summary> 11145 <summary></summary>
10649 </member> 11146 </member>
10650 <member name="F:OpenMetaverse.InventoryItem.CreationDate"> 11147 <member name="F:OpenMetaverse.Primitive.ConstructionData.Material">
10651 <summary>Time and date this inventory item was created, stored as 11148 <summary></summary>
10652 UTC (Coordinated Universal Time)</summary>
10653 </member> 11149 </member>
10654 <member name="F:OpenMetaverse.InventoryItem.TransactionID"> 11150 <member name="F:OpenMetaverse.Primitive.ConstructionData.State">
10655 <summary>Used to update the AssetID in requests sent to the server</summary> 11151 <summary></summary>
10656 </member> 11152 </member>
10657 <member name="F:OpenMetaverse.InventoryItem.LastOwnerID"> 11153 <member name="F:OpenMetaverse.Primitive.ConstructionData.PCode">
10658 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the previous owner of the item</summary> 11154 <summary></summary>
10659 </member> 11155 </member>
10660 <member name="M:OpenMetaverse.InventoryItem.IsLink"> 11156 <member name="M:OpenMetaverse.Primitive.ConstructionData.GetHashCode">
10661 <summary> 11157 <summary>
10662 Indicates inventory item is a link 11158 Calculdates hash code for prim construction data
10663 </summary> 11159 </summary>
10664 <returns>True if inventory item is a link to another inventory item</returns> 11160 <returns>The has</returns>
10665 </member> 11161 </member>
10666 <member name="M:OpenMetaverse.InventoryItem.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11162 <member name="P:OpenMetaverse.Primitive.ConstructionData.AttachmentPoint">
10667 <summary> 11163 <summary>Attachment point to an avatar</summary>
10668 </summary>
10669 <returns>
10670 </returns>
10671 </member> 11164 </member>
10672 <member name="M:OpenMetaverse.InventoryItem.GetHashCode"> 11165 <member name="P:OpenMetaverse.Primitive.ConstructionData.ProfileCurve">
10673 <summary> 11166 <summary></summary>
10674 Generates a number corresponding to the value of the object to support the use of a hash table.
10675 Suitable for use in hashing algorithms and data structures such as a hash table
10676 </summary>
10677 <returns>A Hashcode of all the combined InventoryItem fields</returns>
10678 </member> 11167 </member>
10679 <member name="M:OpenMetaverse.InventoryItem.Equals(System.Object)"> 11168 <member name="P:OpenMetaverse.Primitive.ConstructionData.ProfileHole">
10680 <summary> 11169 <summary></summary>
10681 Compares an object
10682 </summary>
10683 <param name="o">The object to compare</param>
10684 <returns>true if comparison object matches</returns>
10685 </member> 11170 </member>
10686 <member name="M:OpenMetaverse.InventoryItem.Equals(OpenMetaverse.InventoryBase)"> 11171 <member name="P:OpenMetaverse.Primitive.ConstructionData.PathBeginScale">
10687 <summary> 11172 <summary></summary>
10688 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase" /> object is equal to the current object
10689 </summary>
10690 <param name="o">The <seealso cref="T:OpenMetaverse.InventoryBase" /> object to compare against</param>
10691 <returns>true if objects are the same</returns>
10692 </member> 11173 </member>
10693 <member name="M:OpenMetaverse.InventoryItem.Equals(OpenMetaverse.InventoryItem)"> 11174 <member name="P:OpenMetaverse.Primitive.ConstructionData.PathEndScale">
10694 <summary> 11175 <summary></summary>
10695 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryItem" /> object is equal to the current object
10696 </summary>
10697 <param name="o">The <seealso cref="T:OpenMetaverse.InventoryItem" /> object to compare against</param>
10698 <returns>true if objects are the same</returns>
10699 </member> 11176 </member>
10700 <member name="T:OpenMetaverse.InventoryTexture"> 11177 <member name="T:OpenMetaverse.Primitive.FlexibleData">
10701 <summary> 11178 <summary>
10702 InventoryTexture Class representing a graphical image 11179 Information on the flexible properties of a primitive
10703 </summary> 11180 </summary>
10704 <seealso cref="!:ManagedImage" />
10705 </member> 11181 </member>
10706 <member name="M:OpenMetaverse.InventoryTexture.#ctor(OpenMetaverse.UUID)"> 11182 <member name="F:OpenMetaverse.Primitive.FlexibleData.Softness">
10707 <summary> 11183 <summary></summary>
10708 Construct an InventoryTexture object
10709 </summary>
10710 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10711 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10712 </member> 11184 </member>
10713 <member name="M:OpenMetaverse.InventoryTexture.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11185 <member name="F:OpenMetaverse.Primitive.FlexibleData.Gravity">
10714 <summary> 11186 <summary></summary>
10715 Construct an InventoryTexture object from a serialization stream
10716 </summary>
10717 </member> 11187 </member>
10718 <member name="T:OpenMetaverse.InventorySound"> 11188 <member name="F:OpenMetaverse.Primitive.FlexibleData.Drag">
10719 <summary> 11189 <summary></summary>
10720 InventorySound Class representing a playable sound
10721 </summary>
10722 </member> 11190 </member>
10723 <member name="M:OpenMetaverse.InventorySound.#ctor(OpenMetaverse.UUID)"> 11191 <member name="F:OpenMetaverse.Primitive.FlexibleData.Wind">
10724 <summary> 11192 <summary></summary>
10725 Construct an InventorySound object
10726 </summary>
10727 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10728 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10729 </member> 11193 </member>
10730 <member name="M:OpenMetaverse.InventorySound.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11194 <member name="F:OpenMetaverse.Primitive.FlexibleData.Tension">
10731 <summary> 11195 <summary></summary>
10732 Construct an InventorySound object from a serialization stream
10733 </summary>
10734 </member> 11196 </member>
10735 <member name="T:OpenMetaverse.InventoryCallingCard"> 11197 <member name="F:OpenMetaverse.Primitive.FlexibleData.Force">
10736 <summary> 11198 <summary></summary>
10737 InventoryCallingCard Class, contains information on another avatar
10738 </summary>
10739 </member> 11199 </member>
10740 <member name="M:OpenMetaverse.InventoryCallingCard.#ctor(OpenMetaverse.UUID)"> 11200 <member name="M:OpenMetaverse.Primitive.FlexibleData.#ctor">
10741 <summary> 11201 <summary>
10742 Construct an InventoryCallingCard object 11202 Default constructor
10743 </summary> 11203 </summary>
10744 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10745 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10746 </member> 11204 </member>
10747 <member name="M:OpenMetaverse.InventoryCallingCard.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11205 <member name="M:OpenMetaverse.Primitive.FlexibleData.#ctor(System.Byte[],System.Int32)">
10748 <summary> 11206 <summary>
10749 Construct an InventoryCallingCard object from a serialization stream 11207
10750 </summary> 11208 </summary>
11209 <param name="data"></param>
11210 <param name="pos"></param>
10751 </member> 11211 </member>
10752 <member name="T:OpenMetaverse.InventoryLandmark"> 11212 <member name="M:OpenMetaverse.Primitive.FlexibleData.GetBytes">
10753 <summary> 11213 <summary>
10754 InventoryLandmark Class, contains details on a specific location 11214
10755 </summary> 11215 </summary>
11216 <returns></returns>
10756 </member> 11217 </member>
10757 <member name="M:OpenMetaverse.InventoryLandmark.#ctor(OpenMetaverse.UUID)"> 11218 <member name="M:OpenMetaverse.Primitive.FlexibleData.GetOSD">
10758 <summary> 11219 <summary>
10759 Construct an InventoryLandmark object 11220
10760 </summary> 11221 </summary>
10761 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the 11222 <returns></returns>
10762 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10763 </member> 11223 </member>
10764 <member name="M:OpenMetaverse.InventoryLandmark.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11224 <member name="T:OpenMetaverse.Primitive.LightData">
10765 <summary> 11225 <summary>
10766 Construct an InventoryLandmark object from a serialization stream 11226 Information on the light properties of a primitive
10767 </summary> 11227 </summary>
10768 </member> 11228 </member>
10769 <member name="P:OpenMetaverse.InventoryLandmark.LandmarkVisited"> 11229 <member name="F:OpenMetaverse.Primitive.LightData.Color">
10770 <summary> 11230 <summary></summary>
10771 Landmarks use the InventoryItemFlags struct and will have a flag of 1 set if they have been visited
10772 </summary>
10773 </member> 11231 </member>
10774 <member name="T:OpenMetaverse.InventoryObject"> 11232 <member name="F:OpenMetaverse.Primitive.LightData.Intensity">
10775 <summary> 11233 <summary></summary>
10776 InventoryObject Class contains details on a primitive or coalesced set of primitives
10777 </summary>
10778 </member> 11234 </member>
10779 <member name="M:OpenMetaverse.InventoryObject.#ctor(OpenMetaverse.UUID)"> 11235 <member name="F:OpenMetaverse.Primitive.LightData.Radius">
10780 <summary> 11236 <summary></summary>
10781 Construct an InventoryObject object
10782 </summary>
10783 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10784 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10785 </member> 11237 </member>
10786 <member name="M:OpenMetaverse.InventoryObject.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11238 <member name="F:OpenMetaverse.Primitive.LightData.Cutoff">
10787 <summary> 11239 <summary></summary>
10788 Construct an InventoryObject object from a serialization stream
10789 </summary>
10790 </member> 11240 </member>
10791 <member name="P:OpenMetaverse.InventoryObject.ItemFlags"> 11241 <member name="F:OpenMetaverse.Primitive.LightData.Falloff">
10792 <summary> 11242 <summary></summary>
10793 Gets or sets the upper byte of the Flags value
10794 </summary>
10795 </member> 11243 </member>
10796 <member name="P:OpenMetaverse.InventoryObject.AttachPoint"> 11244 <member name="M:OpenMetaverse.Primitive.LightData.#ctor">
10797 <summary> 11245 <summary>
10798 Gets or sets the object attachment point, the lower byte of the Flags value 11246 Default constructor
10799 </summary> 11247 </summary>
10800 </member> 11248 </member>
10801 <member name="T:OpenMetaverse.InventoryNotecard"> 11249 <member name="M:OpenMetaverse.Primitive.LightData.#ctor(System.Byte[],System.Int32)">
10802 <summary> 11250 <summary>
10803 InventoryNotecard Class, contains details on an encoded text document 11251
10804 </summary> 11252 </summary>
11253 <param name="data"></param>
11254 <param name="pos"></param>
10805 </member> 11255 </member>
10806 <member name="M:OpenMetaverse.InventoryNotecard.#ctor(OpenMetaverse.UUID)"> 11256 <member name="M:OpenMetaverse.Primitive.LightData.GetBytes">
10807 <summary> 11257 <summary>
10808 Construct an InventoryNotecard object 11258
10809 </summary> 11259 </summary>
10810 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the 11260 <returns></returns>
10811 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10812 </member> 11261 </member>
10813 <member name="M:OpenMetaverse.InventoryNotecard.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11262 <member name="M:OpenMetaverse.Primitive.LightData.ToString">
10814 <summary> 11263 <summary>
10815 Construct an InventoryNotecard object from a serialization stream 11264
10816 </summary> 11265 </summary>
11266 <returns></returns>
10817 </member> 11267 </member>
10818 <member name="T:OpenMetaverse.InventoryCategory"> 11268 <member name="T:OpenMetaverse.Primitive.LightImage">
10819 <summary> 11269 <summary>
10820 InventoryCategory Class 11270 Information on the light properties of a primitive as texture map
10821 </summary> 11271 </summary>
10822 <remarks>TODO: Is this even used for anything?</remarks>
10823 </member> 11272 </member>
10824 <member name="M:OpenMetaverse.InventoryCategory.#ctor(OpenMetaverse.UUID)"> 11273 <member name="F:OpenMetaverse.Primitive.LightImage.LightTexture">
10825 <summary> 11274 <summary></summary>
10826 Construct an InventoryCategory object
10827 </summary>
10828 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10829 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10830 </member> 11275 </member>
10831 <member name="M:OpenMetaverse.InventoryCategory.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11276 <member name="F:OpenMetaverse.Primitive.LightImage.Params">
10832 <summary> 11277 <summary></summary>
10833 Construct an InventoryCategory object from a serialization stream
10834 </summary>
10835 </member> 11278 </member>
10836 <member name="T:OpenMetaverse.InventoryLSL"> 11279 <member name="M:OpenMetaverse.Primitive.LightImage.#ctor">
10837 <summary> 11280 <summary>
10838 InventoryLSL Class, represents a Linden Scripting Language object 11281 Default constructor
10839 </summary> 11282 </summary>
10840 </member> 11283 </member>
10841 <member name="M:OpenMetaverse.InventoryLSL.#ctor(OpenMetaverse.UUID)"> 11284 <member name="M:OpenMetaverse.Primitive.LightImage.#ctor(System.Byte[],System.Int32)">
10842 <summary> 11285 <summary>
10843 Construct an InventoryLSL object 11286
10844 </summary> 11287 </summary>
10845 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the 11288 <param name="data"></param>
10846 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param> 11289 <param name="pos"></param>
10847 </member> 11290 </member>
10848 <member name="M:OpenMetaverse.InventoryLSL.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11291 <member name="M:OpenMetaverse.Primitive.LightImage.GetBytes">
10849 <summary> 11292 <summary>
10850 Construct an InventoryLSL object from a serialization stream 11293
10851 </summary> 11294 </summary>
11295 <returns></returns>
10852 </member> 11296 </member>
10853 <member name="T:OpenMetaverse.InventorySnapshot"> 11297 <member name="M:OpenMetaverse.Primitive.LightImage.ToString">
10854 <summary> 11298 <summary>
10855 InventorySnapshot Class, an image taken with the viewer 11299
10856 </summary> 11300 </summary>
11301 <returns></returns>
10857 </member> 11302 </member>
10858 <member name="M:OpenMetaverse.InventorySnapshot.#ctor(OpenMetaverse.UUID)"> 11303 <member name="T:OpenMetaverse.Primitive.SculptData">
10859 <summary> 11304 <summary>
10860 Construct an InventorySnapshot object 11305 Information on the sculpt properties of a sculpted primitive
10861 </summary> 11306 </summary>
10862 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10863 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10864 </member> 11307 </member>
10865 <member name="M:OpenMetaverse.InventorySnapshot.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11308 <member name="M:OpenMetaverse.Primitive.SculptData.#ctor">
10866 <summary> 11309 <summary>
10867 Construct an InventorySnapshot object from a serialization stream 11310 Default constructor
10868 </summary> 11311 </summary>
10869 </member> 11312 </member>
10870 <member name="T:OpenMetaverse.InventoryAttachment"> 11313 <member name="M:OpenMetaverse.Primitive.SculptData.#ctor(System.Byte[],System.Int32)">
10871 <summary> 11314 <summary>
10872 InventoryAttachment Class, contains details on an attachable object 11315
10873 </summary> 11316 </summary>
11317 <param name="data"></param>
11318 <param name="pos"></param>
10874 </member> 11319 </member>
10875 <member name="M:OpenMetaverse.InventoryAttachment.#ctor(OpenMetaverse.UUID)"> 11320 <member name="P:OpenMetaverse.Primitive.SculptData.Invert">
10876 <summary> 11321 <summary>
10877 Construct an InventoryAttachment object 11322 Render inside out (inverts the normals).
10878 </summary> 11323 </summary>
10879 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10880 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10881 </member> 11324 </member>
10882 <member name="M:OpenMetaverse.InventoryAttachment.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11325 <member name="P:OpenMetaverse.Primitive.SculptData.Mirror">
10883 <summary> 11326 <summary>
10884 Construct an InventoryAttachment object from a serialization stream 11327 Render an X axis mirror of the sculpty.
10885 </summary> 11328 </summary>
10886 </member> 11329 </member>
10887 <member name="P:OpenMetaverse.InventoryAttachment.AttachmentPoint"> 11330 <member name="T:OpenMetaverse.Primitive.ObjectProperties">
10888 <summary> 11331 <summary>
10889 Get the last AttachmentPoint this object was attached to 11332 Extended properties to describe an object
10890 </summary> 11333 </summary>
10891 </member> 11334 </member>
10892 <member name="T:OpenMetaverse.InventoryWearable"> 11335 <member name="F:OpenMetaverse.Primitive.ObjectProperties.ObjectID">
10893 <summary> 11336 <summary></summary>
10894 InventoryWearable Class, details on a clothing item or body part
10895 </summary>
10896 </member> 11337 </member>
10897 <member name="M:OpenMetaverse.InventoryWearable.#ctor(OpenMetaverse.UUID)"> 11338 <member name="F:OpenMetaverse.Primitive.ObjectProperties.CreatorID">
10898 <summary> 11339 <summary></summary>
10899 Construct an InventoryWearable object
10900 </summary>
10901 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10902 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10903 </member> 11340 </member>
10904 <member name="M:OpenMetaverse.InventoryWearable.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11341 <member name="F:OpenMetaverse.Primitive.ObjectProperties.OwnerID">
10905 <summary> 11342 <summary></summary>
10906 Construct an InventoryWearable object from a serialization stream
10907 </summary>
10908 </member> 11343 </member>
10909 <member name="P:OpenMetaverse.InventoryWearable.WearableType"> 11344 <member name="F:OpenMetaverse.Primitive.ObjectProperties.GroupID">
10910 <summary> 11345 <summary></summary>
10911 The <seealso cref="T:OpenMetaverse.WearableType" />, Skin, Shape, Skirt, Etc
10912 </summary>
10913 </member> 11346 </member>
10914 <member name="T:OpenMetaverse.InventoryAnimation"> 11347 <member name="F:OpenMetaverse.Primitive.ObjectProperties.CreationDate">
10915 <summary> 11348 <summary></summary>
10916 InventoryAnimation Class, A bvh encoded object which animates an avatar
10917 </summary>
10918 </member> 11349 </member>
10919 <member name="M:OpenMetaverse.InventoryAnimation.#ctor(OpenMetaverse.UUID)"> 11350 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Permissions">
10920 <summary> 11351 <summary></summary>
10921 Construct an InventoryAnimation object
10922 </summary>
10923 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10924 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10925 </member> 11352 </member>
10926 <member name="M:OpenMetaverse.InventoryAnimation.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11353 <member name="F:OpenMetaverse.Primitive.ObjectProperties.OwnershipCost">
10927 <summary> 11354 <summary></summary>
10928 Construct an InventoryAnimation object from a serialization stream
10929 </summary>
10930 </member> 11355 </member>
10931 <member name="T:OpenMetaverse.InventoryGesture"> 11356 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SaleType">
10932 <summary> 11357 <summary></summary>
10933 InventoryGesture Class, details on a series of animations, sounds, and actions
10934 </summary>
10935 </member> 11358 </member>
10936 <member name="M:OpenMetaverse.InventoryGesture.#ctor(OpenMetaverse.UUID)"> 11359 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SalePrice">
10937 <summary> 11360 <summary></summary>
10938 Construct an InventoryGesture object
10939 </summary>
10940 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID" /> which becomes the
10941 <seealso cref="T:OpenMetaverse.InventoryItem" /> objects AssetUUID</param>
10942 </member> 11361 </member>
10943 <member name="M:OpenMetaverse.InventoryGesture.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11362 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePerms">
10944 <summary> 11363 <summary></summary>
10945 Construct an InventoryGesture object from a serialization stream
10946 </summary>
10947 </member> 11364 </member>
10948 <member name="T:OpenMetaverse.InventoryFolder"> 11365 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePermTextures">
10949 <summary> 11366 <summary></summary>
10950 A folder contains <seealso cref="T:OpenMetaverse.InventoryItem" />s and has certain attributes specific
10951 to itself
10952 </summary>
10953 </member> 11367 </member>
10954 <member name="M:OpenMetaverse.InventoryFolder.#ctor(OpenMetaverse.UUID)"> 11368 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePermTexturesOwner">
10955 <summary> 11369 <summary></summary>
10956 Constructor
10957 </summary>
10958 <param name="itemID">UUID of the folder</param>
10959 </member> 11370 </member>
10960 <member name="M:OpenMetaverse.InventoryFolder.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11371 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Category">
10961 <summary> 11372 <summary></summary>
10962 Construct an InventoryFolder object from a serialization stream
10963 </summary>
10964 </member> 11373 </member>
10965 <member name="F:OpenMetaverse.InventoryFolder.PreferredType"> 11374 <member name="F:OpenMetaverse.Primitive.ObjectProperties.InventorySerial">
10966 <summary>The Preferred <seealso cref="T:OpenMetaverse.AssetType" /> for a folder.</summary> 11375 <summary></summary>
10967 </member> 11376 </member>
10968 <member name="F:OpenMetaverse.InventoryFolder.Version"> 11377 <member name="F:OpenMetaverse.Primitive.ObjectProperties.ItemID">
10969 <summary>The Version of this folder</summary> 11378 <summary></summary>
10970 </member> 11379 </member>
10971 <member name="F:OpenMetaverse.InventoryFolder.DescendentCount"> 11380 <member name="F:OpenMetaverse.Primitive.ObjectProperties.FolderID">
10972 <summary>Number of child items this folder contains.</summary> 11381 <summary></summary>
10973 </member> 11382 </member>
10974 <member name="M:OpenMetaverse.InventoryFolder.ToString"> 11383 <member name="F:OpenMetaverse.Primitive.ObjectProperties.FromTaskID">
10975 <summary> 11384 <summary></summary>
10976 </summary>
10977 <returns>
10978 </returns>
10979 </member> 11385 </member>
10980 <member name="M:OpenMetaverse.InventoryFolder.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11386 <member name="F:OpenMetaverse.Primitive.ObjectProperties.LastOwnerID">
10981 <summary> 11387 <summary></summary>
10982 Get Serilization data for this InventoryFolder object
10983 </summary>
10984 </member> 11388 </member>
10985 <member name="M:OpenMetaverse.InventoryFolder.GetHashCode"> 11389 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Name">
10986 <summary> 11390 <summary></summary>
10987 </summary>
10988 <returns>
10989 </returns>
10990 </member> 11391 </member>
10991 <member name="M:OpenMetaverse.InventoryFolder.Equals(System.Object)"> 11392 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Description">
10992 <summary> 11393 <summary></summary>
10993 </summary>
10994 <param name="o">
10995 </param>
10996 <returns>
10997 </returns>
10998 </member> 11394 </member>
10999 <member name="M:OpenMetaverse.InventoryFolder.Equals(OpenMetaverse.InventoryBase)"> 11395 <member name="F:OpenMetaverse.Primitive.ObjectProperties.TouchName">
11000 <summary> 11396 <summary></summary>
11001 </summary>
11002 <param name="o">
11003 </param>
11004 <returns>
11005 </returns>
11006 </member> 11397 </member>
11007 <member name="M:OpenMetaverse.InventoryFolder.Equals(OpenMetaverse.InventoryFolder)"> 11398 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SitName">
11008 <summary> 11399 <summary></summary>
11009 </summary>
11010 <param name="o">
11011 </param>
11012 <returns>
11013 </returns>
11014 </member> 11400 </member>
11015 <member name="T:OpenMetaverse.InventoryManager"> 11401 <member name="F:OpenMetaverse.Primitive.ObjectProperties.TextureIDs">
11016 <summary> 11402 <summary></summary>
11017 Tools for dealing with agents inventory
11018 </summary>
11019 </member> 11403 </member>
11020 <member name="M:OpenMetaverse.InventoryManager.#ctor(OpenMetaverse.GridClient)"> 11404 <member name="M:OpenMetaverse.Primitive.ObjectProperties.#ctor">
11021 <summary> 11405 <summary>
11022 Default constructor 11406 Default constructor
11023 </summary> 11407 </summary>
11024 <param name="client">Reference to the GridClient object</param>
11025 </member>
11026 <member name="T:OpenMetaverse.InventoryManager.ItemCreatedCallback">
11027 <summary>
11028 Callback for inventory item creation finishing
11029 </summary>
11030 <param name="success">Whether the request to create an inventory
11031 item succeeded or not</param>
11032 <param name="item">Inventory item being created. If success is
11033 false this will be null</param>
11034 </member>
11035 <member name="T:OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback">
11036 <summary>
11037 Callback for an inventory item being create from an uploaded asset
11038 </summary>
11039 <param name="success">true if inventory item creation was successful</param>
11040 <param name="status">
11041 </param>
11042 <param name="itemID">
11043 </param>
11044 <param name="assetID">
11045 </param>
11046 </member>
11047 <member name="T:OpenMetaverse.InventoryManager.ItemCopiedCallback">
11048 <summary>
11049 </summary>
11050 <param name="item">
11051 </param>
11052 </member>
11053 <member name="T:OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback">
11054 <summary>
11055 Reply received when uploading an inventory asset
11056 </summary>
11057 <param name="success">Has upload been successful</param>
11058 <param name="status">Error message if upload failed</param>
11059 <param name="itemID">Inventory asset UUID</param>
11060 <param name="assetID">New asset UUID</param>
11061 </member> 11408 </member>
11062 <member name="T:OpenMetaverse.InventoryManager.ScriptUpdatedCallback"> 11409 <member name="M:OpenMetaverse.Primitive.ObjectProperties.SetFamilyProperties(OpenMetaverse.Primitive.ObjectProperties)">
11063 <summary> 11410 <summary>
11064 Delegate that is invoked when script upload is completed 11411 Set the properties that are set in an ObjectPropertiesFamily packet
11065 </summary> 11412 </summary>
11066 <param name="uploadSuccess">Has upload succeded (note, there still might be compile errors)</param> 11413 <param name="props"><seealso cref="T:OpenMetaverse.Primitive.ObjectProperties"/> that has
11067 <param name="uploadStatus">Upload status message</param> 11414 been partially filled by an ObjectPropertiesFamily packet</param>
11068 <param name="compileSuccess">Is compilation successful</param>
11069 <param name="compileMessages">If compilation failed, list of error messages, null on compilation success</param>
11070 <param name="itemID">Script inventory UUID</param>
11071 <param name="assetID">Script's new asset UUID</param>
11072 </member>
11073 <member name="F:OpenMetaverse.InventoryManager.MAGIC_ID">
11074 <summary>Used for converting shadow_id to asset_id</summary>
11075 </member>
11076 <member name="F:OpenMetaverse.InventoryManager.m_ItemReceived">
11077 <summary>The event subscribers, null of no subscribers</summary>
11078 </member>
11079 <member name="F:OpenMetaverse.InventoryManager.m_ItemReceivedLock">
11080 <summary>Thread sync lock object</summary>
11081 </member>
11082 <member name="F:OpenMetaverse.InventoryManager.m_FolderUpdated">
11083 <summary>The event subscribers, null of no subscribers</summary>
11084 </member>
11085 <member name="F:OpenMetaverse.InventoryManager.m_FolderUpdatedLock">
11086 <summary>Thread sync lock object</summary>
11087 </member>
11088 <member name="F:OpenMetaverse.InventoryManager.m_InventoryObjectOffered">
11089 <summary>The event subscribers, null of no subscribers</summary>
11090 </member>
11091 <member name="F:OpenMetaverse.InventoryManager.m_InventoryObjectOfferedLock">
11092 <summary>Thread sync lock object</summary>
11093 </member>
11094 <member name="F:OpenMetaverse.InventoryManager.m_TaskItemReceived">
11095 <summary>The event subscribers, null of no subscribers</summary>
11096 </member>
11097 <member name="F:OpenMetaverse.InventoryManager.m_TaskItemReceivedLock">
11098 <summary>Thread sync lock object</summary>
11099 </member>
11100 <member name="F:OpenMetaverse.InventoryManager.m_FindObjectByPathReply">
11101 <summary>The event subscribers, null of no subscribers</summary>
11102 </member>
11103 <member name="F:OpenMetaverse.InventoryManager.m_FindObjectByPathReplyLock">
11104 <summary>Thread sync lock object</summary>
11105 </member>
11106 <member name="F:OpenMetaverse.InventoryManager.m_TaskInventoryReply">
11107 <summary>The event subscribers, null of no subscribers</summary>
11108 </member>
11109 <member name="F:OpenMetaverse.InventoryManager.m_TaskInventoryReplyLock">
11110 <summary>Thread sync lock object</summary>
11111 </member>
11112 <member name="F:OpenMetaverse.InventoryManager.m_SaveAssetToInventory">
11113 <summary>The event subscribers, null of no subscribers</summary>
11114 </member>
11115 <member name="F:OpenMetaverse.InventoryManager.m_SaveAssetToInventoryLock">
11116 <summary>Thread sync lock object</summary>
11117 </member>
11118 <member name="F:OpenMetaverse.InventoryManager.m_ScriptRunningReply">
11119 <summary>The event subscribers, null of no subscribers</summary>
11120 </member>
11121 <member name="F:OpenMetaverse.InventoryManager.m_ScriptRunningReplyLock">
11122 <summary>Thread sync lock object</summary>
11123 </member>
11124 <member name="F:OpenMetaverse.InventoryManager._NewFolderNames">
11125 <summary>Partial mapping of AssetTypes to folder names</summary>
11126 </member>
11127 <member name="E:OpenMetaverse.InventoryManager.ItemReceived">
11128 <summary>Raised when the simulator sends us data containing
11129 ...</summary>
11130 </member>
11131 <member name="E:OpenMetaverse.InventoryManager.FolderUpdated">
11132 <summary>Raised when the simulator sends us data containing
11133 ...</summary>
11134 </member>
11135 <member name="E:OpenMetaverse.InventoryManager.InventoryObjectOffered">
11136 <summary>Raised when the simulator sends us data containing
11137 an inventory object sent by another avatar or primitive</summary>
11138 </member>
11139 <member name="E:OpenMetaverse.InventoryManager.TaskItemReceived">
11140 <summary>Raised when the simulator sends us data containing
11141 ...</summary>
11142 </member>
11143 <member name="E:OpenMetaverse.InventoryManager.FindObjectByPathReply">
11144 <summary>Raised when the simulator sends us data containing
11145 ...</summary>
11146 </member>
11147 <member name="E:OpenMetaverse.InventoryManager.TaskInventoryReply">
11148 <summary>Raised when the simulator sends us data containing
11149 ...</summary>
11150 </member>
11151 <member name="E:OpenMetaverse.InventoryManager.SaveAssetToInventory">
11152 <summary>Raised when the simulator sends us data containing
11153 ...</summary>
11154 </member>
11155 <member name="E:OpenMetaverse.InventoryManager.ScriptRunningReply">
11156 <summary>Raised when the simulator sends us data containing
11157 ...</summary>
11158 </member> 11415 </member>
11159 <member name="P:OpenMetaverse.InventoryManager.Store"> 11416 <member name="T:OpenMetaverse.Primitive.PhysicsProperties">
11160 <summary> 11417 <summary>
11161 Get this agents Inventory data 11418 Describes physics attributes of the prim
11162 </summary> 11419 </summary>
11163 </member> 11420 </member>
11164 <member name="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)"> 11421 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.LocalID">
11165 <summary>Raises the ItemReceived Event</summary> 11422 <summary>Primitive's local ID</summary>
11166 <param name="e">A ItemReceivedEventArgs object containing
11167 the data sent from the simulator</param>
11168 </member>
11169 <member name="M:OpenMetaverse.InventoryManager.OnFolderUpdated(OpenMetaverse.FolderUpdatedEventArgs)">
11170 <summary>Raises the FolderUpdated Event</summary>
11171 <param name="e">A FolderUpdatedEventArgs object containing
11172 the data sent from the simulator</param>
11173 </member>
11174 <member name="M:OpenMetaverse.InventoryManager.OnInventoryObjectOffered(OpenMetaverse.InventoryObjectOfferedEventArgs)">
11175 <summary>Raises the InventoryObjectOffered Event</summary>
11176 <param name="e">A InventoryObjectOfferedEventArgs object containing
11177 the data sent from the simulator</param>
11178 </member>
11179 <member name="M:OpenMetaverse.InventoryManager.OnTaskItemReceived(OpenMetaverse.TaskItemReceivedEventArgs)">
11180 <summary>Raises the TaskItemReceived Event</summary>
11181 <param name="e">A TaskItemReceivedEventArgs object containing
11182 the data sent from the simulator</param>
11183 </member> 11423 </member>
11184 <member name="M:OpenMetaverse.InventoryManager.OnFindObjectByPathReply(OpenMetaverse.FindObjectByPathReplyEventArgs)"> 11424 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Density">
11185 <summary>Raises the FindObjectByPath Event</summary> 11425 <summary>Density (1000 for normal density)</summary>
11186 <param name="e">A FindObjectByPathEventArgs object containing
11187 the data sent from the simulator</param>
11188 </member> 11426 </member>
11189 <member name="M:OpenMetaverse.InventoryManager.OnTaskInventoryReply(OpenMetaverse.TaskInventoryReplyEventArgs)"> 11427 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Friction">
11190 <summary>Raises the TaskInventoryReply Event</summary> 11428 <summary>Friction</summary>
11191 <param name="e">A TaskInventoryReplyEventArgs object containing
11192 the data sent from the simulator</param>
11193 </member> 11429 </member>
11194 <member name="M:OpenMetaverse.InventoryManager.OnSaveAssetToInventory(OpenMetaverse.SaveAssetToInventoryEventArgs)"> 11430 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.GravityMultiplier">
11195 <summary>Raises the SaveAssetToInventory Event</summary> 11431 <summary>Gravity multiplier (1 for normal gravity) </summary>
11196 <param name="e">A SaveAssetToInventoryEventArgs object containing
11197 the data sent from the simulator</param>
11198 </member> 11432 </member>
11199 <member name="M:OpenMetaverse.InventoryManager.OnScriptRunningReply(OpenMetaverse.ScriptRunningReplyEventArgs)"> 11433 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.PhysicsShapeType">
11200 <summary>Raises the ScriptRunningReply Event</summary> 11434 <summary>Type of physics representation of this primitive in the simulator</summary>
11201 <param name="e">A ScriptRunningReplyEventArgs object containing
11202 the data sent from the simulator</param>
11203 </member> 11435 </member>
11204 <member name="M:OpenMetaverse.InventoryManager.FetchItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Int32)"> 11436 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Restitution">
11205 <summary> 11437 <summary>Restitution</summary>
11206 Fetch an inventory item from the dataserver
11207 </summary>
11208 <param name="itemID">The items <seealso cref="T:OpenMetaverse.UUID" /></param>
11209 <param name="ownerID">The item Owners <seealso cref="T:OpenMetaverse.UUID" /></param>
11210 <param name="timeoutMS">a integer representing the number of milliseconds to wait for results</param>
11211 <returns>An <seealso cref="T:OpenMetaverse.InventoryItem" /> object on success, or null if no item was found</returns>
11212 <remarks>Items will also be sent to the <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)" /> event</remarks>
11213 </member> 11438 </member>
11214 <member name="M:OpenMetaverse.InventoryManager.RequestFetchInventory(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 11439 <member name="M:OpenMetaverse.Primitive.PhysicsProperties.FromOSD(OpenMetaverse.StructuredData.OSD)">
11215 <summary> 11440 <summary>
11216 Request A single inventory item 11441 Creates PhysicsProperties from OSD
11217 </summary> 11442 </summary>
11218 <param name="itemID">The items <seealso cref="T:OpenMetaverse.UUID" /></param> 11443 <param name="osd">OSDMap with incoming data</param>
11219 <param name="ownerID">The item Owners <seealso cref="T:OpenMetaverse.UUID" /></param> 11444 <returns>Deserialized PhysicsProperties object</returns>
11220 <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)" />
11221 </member> 11445 </member>
11222 <member name="M:OpenMetaverse.InventoryManager.RequestFetchInventory(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID})"> 11446 <member name="M:OpenMetaverse.Primitive.PhysicsProperties.GetOSD">
11223 <summary> 11447 <summary>
11224 Request inventory items 11448 Serializes PhysicsProperties to OSD
11225 </summary> 11449 </summary>
11226 <param name="itemIDs">Inventory items to request</param> 11450 <returns>OSDMap with serialized PhysicsProperties data</returns>
11227 <param name="ownerIDs">Owners of the inventory items</param>
11228 <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)" />
11229 </member> 11451 </member>
11230 <member name="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)"> 11452 <member name="T:OpenMetaverse.Primitive.ParticleSystem">
11231 <summary> 11453 <summary>
11232 Get contents of a folder 11454 Complete structure for the particle system
11233 </summary> 11455 </summary>
11234 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID" /> of the folder to search</param>
11235 <param name="owner">The <seealso cref="T:OpenMetaverse.UUID" /> of the folders owner</param>
11236 <param name="folders">true to retrieve folders</param>
11237 <param name="items">true to retrieve items</param>
11238 <param name="order">sort order to return results in</param>
11239 <param name="timeoutMS">a integer representing the number of milliseconds to wait for results</param>
11240 <returns>A list of inventory items matching search criteria within folder</returns>
11241 <seealso cref="M:OpenMetaverse.InventoryManager.RequestFolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)" />
11242 <remarks>InventoryFolder.DescendentCount will only be accurate if both folders and items are
11243 requested</remarks>
11244 </member> 11456 </member>
11245 <member name="M:OpenMetaverse.InventoryManager.RequestFolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)"> 11457 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartFlags">
11246 <summary> 11458 <summary>Particle Flags</summary>
11247 Request the contents of an inventory folder 11459 <remarks>There appears to be more data packed in to this area
11248 </summary> 11460 for many particle systems. It doesn't appear to be flag values
11249 <param name="folder">The folder to search</param> 11461 and serialization breaks unless there is a flag for every
11250 <param name="owner">The folder owners <seealso cref="T:OpenMetaverse.UUID" /></param> 11462 possible bit so it is left as an unsigned integer</remarks>
11251 <param name="folders">true to return <seealso cref="!:InventoryManager.InventoryFolder" />s contained in folder</param>
11252 <param name="items">true to return <seealso cref="!:InventoryManager.InventoryItem" />s containd in folder</param>
11253 <param name="order">the sort order to return items in</param>
11254 <seealso cref="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)" />
11255 </member> 11463 </member>
11256 <member name="M:OpenMetaverse.InventoryManager.RequestFolderContentsCap(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)"> 11464 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Pattern">
11257 <summary> 11465 <summary><seealso cref="T:SourcePattern"/> pattern of particles</summary>
11258 Request the contents of an inventory folder using HTTP capabilities
11259 </summary>
11260 <param name="folderID">The folder to search</param>
11261 <param name="ownerID">The folder owners <seealso cref="T:OpenMetaverse.UUID" /></param>
11262 <param name="fetchFolders">true to return <seealso cref="!:InventoryManager.InventoryFolder" />s contained in folder</param>
11263 <param name="fetchItems">true to return <seealso cref="!:InventoryManager.InventoryItem" />s containd in folder</param>
11264 <param name="order">the sort order to return items in</param>
11265 <seealso cref="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)" />
11266 </member> 11466 </member>
11267 <member name="M:OpenMetaverse.InventoryManager.FindFolderForType(OpenMetaverse.AssetType)"> 11467 <member name="F:OpenMetaverse.Primitive.ParticleSystem.MaxAge">
11268 <summary> 11468 <summary>A <see langword="float"/> representing the maximimum age (in seconds) particle will be displayed</summary>
11269 Returns the UUID of the folder (category) that defaults to 11469 <remarks>Maximum value is 30 seconds</remarks>
11270 containing 'type'. The folder is not necessarily only for that
11271 type
11272 </summary>
11273 <remarks>This will return the root folder if one does not exist</remarks>
11274 <param name="type">
11275 </param>
11276 <returns>The UUID of the desired folder if found, the UUID of the RootFolder
11277 if not found, or UUID.Zero on failure</returns>
11278 </member> 11470 </member>
11279 <member name="M:OpenMetaverse.InventoryManager.FindObjectByPath(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.Int32)"> 11471 <member name="F:OpenMetaverse.Primitive.ParticleSystem.StartAge">
11280 <summary> 11472 <summary>A <see langword="float"/> representing the number of seconds,
11281 Find an object in inventory using a specific path to search 11473 from when the particle source comes into view,
11282 </summary> 11474 or the particle system's creation, that the object will emits particles;
11283 <param name="baseFolder">The folder to begin the search in</param> 11475 after this time period no more particles are emitted</summary>
11284 <param name="inventoryOwner">The object owners <seealso cref="T:OpenMetaverse.UUID" /></param>
11285 <param name="path">A string path to search</param>
11286 <param name="timeoutMS">milliseconds to wait for a reply</param>
11287 <returns>Found items <seealso cref="T:OpenMetaverse.UUID" /> or <seealso cref="F:OpenMetaverse.UUID.Zero" /> if
11288 timeout occurs or item is not found</returns>
11289 </member> 11476 </member>
11290 <member name="M:OpenMetaverse.InventoryManager.RequestFindObjectByPath(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)"> 11477 <member name="F:OpenMetaverse.Primitive.ParticleSystem.InnerAngle">
11291 <summary> 11478 <summary>A <see langword="float"/> in radians that specifies where particles will not be created</summary>
11292 Find inventory items by path
11293 </summary>
11294 <param name="baseFolder">The folder to begin the search in</param>
11295 <param name="inventoryOwner">The object owners <seealso cref="T:OpenMetaverse.UUID" /></param>
11296 <param name="path">A string path to search, folders/objects separated by a '/'</param>
11297 <remarks>Results are sent to the <seealso cref="!:InventoryManager.OnFindObjectByPath" /> event</remarks>
11298 </member> 11479 </member>
11299 <member name="M:OpenMetaverse.InventoryManager.LocalFind(OpenMetaverse.UUID,System.String[],System.Int32,System.Boolean)"> 11480 <member name="F:OpenMetaverse.Primitive.ParticleSystem.OuterAngle">
11300 <summary> 11481 <summary>A <see langword="float"/> in radians that specifies where particles will be created</summary>
11301 Search inventory Store object for an item or folder
11302 </summary>
11303 <param name="baseFolder">The folder to begin the search in</param>
11304 <param name="path">An array which creates a path to search</param>
11305 <param name="level">Number of levels below baseFolder to conduct searches</param>
11306 <param name="firstOnly">if True, will stop searching after first match is found</param>
11307 <returns>A list of inventory items found</returns>
11308 </member> 11482 </member>
11309 <member name="M:OpenMetaverse.InventoryManager.Move(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryFolder)"> 11483 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstRate">
11310 <summary> 11484 <summary>A <see langword="float"/> representing the number of seconds between burts.</summary>
11311 Move an inventory item or folder to a new location
11312 </summary>
11313 <param name="item">The <seealso cref="T:InventoryBase" /> item or folder to move</param>
11314 <param name="newParent">The <seealso cref="T:InventoryFolder" /> to move item or folder to</param>
11315 </member> 11485 </member>
11316 <member name="M:OpenMetaverse.InventoryManager.Move(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryFolder,System.String)"> 11486 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstRadius">
11317 <summary> 11487 <summary>A <see langword="float"/> representing the number of meters
11318 Move an inventory item or folder to a new location and change its name 11488 around the center of the source where particles will be created.</summary>
11319 </summary>
11320 <param name="item">The <seealso cref="T:InventoryBase" /> item or folder to move</param>
11321 <param name="newParent">The <seealso cref="T:InventoryFolder" /> to move item or folder to</param>
11322 <param name="newName">The name to change the item or folder to</param>
11323 </member> 11489 </member>
11324 <member name="M:OpenMetaverse.InventoryManager.MoveFolder(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)"> 11490 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstSpeedMin">
11325 <summary> 11491 <summary>A <see langword="float"/> representing in seconds, the minimum speed between bursts of new particles
11326 Move and rename a folder 11492 being emitted</summary>
11327 </summary>
11328 <param name="folderID">The source folders <seealso cref="T:OpenMetaverse.UUID" /></param>
11329 <param name="newparentID">The destination folders <seealso cref="T:OpenMetaverse.UUID" /></param>
11330 <param name="newName">The name to change the folder to</param>
11331 </member> 11493 </member>
11332 <member name="M:OpenMetaverse.InventoryManager.UpdateFolderProperties(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType)"> 11494 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstSpeedMax">
11333 <summary> 11495 <summary>A <see langword="float"/> representing in seconds the maximum speed of new particles being emitted.</summary>
11334 Update folder properties
11335 </summary>
11336 <param name="folderID">
11337 <seealso cref="T:OpenMetaverse.UUID" /> of the folder to update</param>
11338 <param name="parentID">Sets folder's parent to <seealso cref="T:OpenMetaverse.UUID" /></param>
11339 <param name="name">Folder name</param>
11340 <param name="type">Folder type</param>
11341 </member> 11496 </member>
11342 <member name="M:OpenMetaverse.InventoryManager.MoveFolder(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 11497 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstPartCount">
11343 <summary> 11498 <summary>A <see langword="byte"/> representing the maximum number of particles emitted per burst</summary>
11344 Move a folder
11345 </summary>
11346 <param name="folderID">The source folders <seealso cref="T:OpenMetaverse.UUID" /></param>
11347 <param name="newParentID">The destination folders <seealso cref="T:OpenMetaverse.UUID" /></param>
11348 </member> 11499 </member>
11349 <member name="M:OpenMetaverse.InventoryManager.MoveFolders(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.UUID})"> 11500 <member name="F:OpenMetaverse.Primitive.ParticleSystem.AngularVelocity">
11350 <summary> 11501 <summary>A <see cref="T:Vector3"/> which represents the velocity (speed) from the source which particles are emitted</summary>
11351 Move multiple folders, the keys in the Dictionary parameter,
11352 to a new parents, the value of that folder's key.
11353 </summary>
11354 <param name="foldersNewParents">A Dictionary containing the
11355 <seealso cref="T:OpenMetaverse.UUID" /> of the source as the key, and the
11356 <seealso cref="T:OpenMetaverse.UUID" /> of the destination as the value</param>
11357 </member> 11502 </member>
11358 <member name="M:OpenMetaverse.InventoryManager.MoveItem(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 11503 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartAcceleration">
11359 <summary> 11504 <summary>A <see cref="T:Vector3"/> which represents the Acceleration from the source which particles are emitted</summary>
11360 Move an inventory item to a new folder
11361 </summary>
11362 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the source item to move</param>
11363 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID" /> of the destination folder</param>
11364 </member> 11505 </member>
11365 <member name="M:OpenMetaverse.InventoryManager.MoveItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)"> 11506 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Texture">
11366 <summary> 11507 <summary>The <see cref="T:UUID"/> Key of the texture displayed on the particle</summary>
11367 Move and rename an inventory item
11368 </summary>
11369 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the source item to move</param>
11370 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID" /> of the destination folder</param>
11371 <param name="newName">The name to change the folder to</param>
11372 </member> 11508 </member>
11373 <member name="M:OpenMetaverse.InventoryManager.MoveItems(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.UUID})"> 11509 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Target">
11374 <summary> 11510 <summary>The <see cref="T:UUID"/> Key of the specified target object or avatar particles will follow</summary>
11375 Move multiple inventory items to new locations
11376 </summary>
11377 <param name="itemsNewParents">A Dictionary containing the
11378 <seealso cref="T:OpenMetaverse.UUID" /> of the source item as the key, and the
11379 <seealso cref="T:OpenMetaverse.UUID" /> of the destination folder as the value</param>
11380 </member> 11511 </member>
11381 <member name="M:OpenMetaverse.InventoryManager.RemoveDescendants(OpenMetaverse.UUID)"> 11512 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartDataFlags">
11382 <summary> 11513 <summary>Flags of particle from <seealso cref="T:ParticleDataFlags"/></summary>
11383 Remove descendants of a folder
11384 </summary>
11385 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID" /> of the folder</param>
11386 </member> 11514 </member>
11387 <member name="M:OpenMetaverse.InventoryManager.RemoveItem(OpenMetaverse.UUID)"> 11515 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartMaxAge">
11388 <summary> 11516 <summary>Max Age particle system will emit particles for</summary>
11389 Remove a single item from inventory
11390 </summary>
11391 <param name="item">The <seealso cref="T:OpenMetaverse.UUID" /> of the inventory item to remove</param>
11392 </member> 11517 </member>
11393 <member name="M:OpenMetaverse.InventoryManager.RemoveFolder(OpenMetaverse.UUID)"> 11518 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartColor">
11394 <summary> 11519 <summary>The <see cref="T:Color4"/> the particle has at the beginning of its lifecycle</summary>
11395 Remove a folder from inventory
11396 </summary>
11397 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID" /> of the folder to remove</param>
11398 </member> 11520 </member>
11399 <member name="M:OpenMetaverse.InventoryManager.Remove(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID})"> 11521 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndColor">
11400 <summary> 11522 <summary>The <see cref="T:Color4"/> the particle has at the ending of its lifecycle</summary>
11401 Remove multiple items or folders from inventory
11402 </summary>
11403 <param name="items">A List containing the <seealso cref="T:OpenMetaverse.UUID" />s of items to remove</param>
11404 <param name="folders">A List containing the <seealso cref="T:OpenMetaverse.UUID" />s of the folders to remove</param>
11405 </member> 11523 </member>
11406 <member name="M:OpenMetaverse.InventoryManager.EmptyLostAndFound"> 11524 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartScaleX">
11407 <summary> 11525 <summary>A <see langword="float"/> that represents the starting X size of the particle</summary>
11408 Empty the Lost and Found folder 11526 <remarks>Minimum value is 0, maximum value is 4</remarks>
11409 </summary>
11410 </member> 11527 </member>
11411 <member name="M:OpenMetaverse.InventoryManager.EmptyTrash"> 11528 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartScaleY">
11412 <summary> 11529 <summary>A <see langword="float"/> that represents the starting Y size of the particle</summary>
11413 Empty the Trash folder 11530 <remarks>Minimum value is 0, maximum value is 4</remarks>
11414 </summary>
11415 </member> 11531 </member>
11416 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItem(OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,OpenMetaverse.InventoryType,OpenMetaverse.PermissionMask,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11532 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndScaleX">
11417 <summary> 11533 <summary>A <see langword="float"/> that represents the ending X size of the particle</summary>
11418 </summary> 11534 <remarks>Minimum value is 0, maximum value is 4</remarks>
11419 <param name="parentFolder">
11420 </param>
11421 <param name="name">
11422 </param>
11423 <param name="description">
11424 </param>
11425 <param name="type">
11426 </param>
11427 <param name="assetTransactionID">Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here.</param>
11428 <param name="invType">
11429 </param>
11430 <param name="nextOwnerMask">
11431 </param>
11432 <param name="callback">
11433 </param>
11434 </member> 11535 </member>
11435 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItem(OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,OpenMetaverse.InventoryType,OpenMetaverse.WearableType,OpenMetaverse.PermissionMask,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11536 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndScaleY">
11436 <summary> 11537 <summary>A <see langword="float"/> that represents the ending Y size of the particle</summary>
11437 </summary> 11538 <remarks>Minimum value is 0, maximum value is 4</remarks>
11438 <param name="parentFolder">
11439 </param>
11440 <param name="name">
11441 </param>
11442 <param name="description">
11443 </param>
11444 <param name="type">
11445 </param>
11446 <param name="assetTransactionID">Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here.</param>
11447 <param name="invType">
11448 </param>
11449 <param name="wearableType">
11450 </param>
11451 <param name="nextOwnerMask">
11452 </param>
11453 <param name="callback">
11454 </param>
11455 </member> 11539 </member>
11456 <member name="M:OpenMetaverse.InventoryManager.CreateFolder(OpenMetaverse.UUID,System.String)"> 11540 <member name="M:OpenMetaverse.Primitive.ParticleSystem.#ctor(System.Byte[],System.Int32)">
11457 <summary> 11541 <summary>
11458 Creates a new inventory folder 11542 Decodes a byte[] array into a ParticleSystem Object
11459 </summary> 11543 </summary>
11460 <param name="parentID">ID of the folder to put this folder in</param> 11544 <param name="data">ParticleSystem object</param>
11461 <param name="name">Name of the folder to create</param> 11545 <param name="pos">Start position for BitPacker</param>
11462 <returns>The UUID of the newly created folder</returns>
11463 </member> 11546 </member>
11464 <member name="M:OpenMetaverse.InventoryManager.CreateFolder(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType)"> 11547 <member name="M:OpenMetaverse.Primitive.ParticleSystem.GetBytes">
11465 <summary> 11548 <summary>
11466 Creates a new inventory folder 11549 Generate byte[] array from particle data
11467 </summary> 11550 </summary>
11468 <param name="parentID">ID of the folder to put this folder in</param> 11551 <returns>Byte array</returns>
11469 <param name="name">Name of the folder to create</param>
11470 <param name="preferredType">Sets this folder as the default folder
11471 for new assets of the specified type. Use <code>AssetType.Unknown</code>
11472 to create a normal folder, otherwise it will likely create a
11473 duplicate of an existing folder type</param>
11474 <returns>The UUID of the newly created folder</returns>
11475 <remarks>If you specify a preferred type of <code>AsseType.Folder</code>
11476 it will create a new root folder which may likely cause all sorts
11477 of strange problems</remarks>
11478 </member> 11552 </member>
11479 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItemFromAsset(System.Byte[],System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback)"> 11553 <member name="T:OpenMetaverse.Primitive.ParticleSystem.SourcePattern">
11480 <summary> 11554 <summary>
11481 Create an inventory item and upload asset data 11555 Particle source pattern
11482 </summary> 11556 </summary>
11483 <param name="data">Asset data</param>
11484 <param name="name">Inventory item name</param>
11485 <param name="description">Inventory item description</param>
11486 <param name="assetType">Asset type</param>
11487 <param name="invType">Inventory type</param>
11488 <param name="folderID">Put newly created inventory in this folder</param>
11489 <param name="callback">Delegate that will receive feedback on success or failure</param>
11490 </member> 11557 </member>
11491 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItemFromAsset(System.Byte[],System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.Permissions,OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback)"> 11558 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.None">
11492 <summary> 11559 <summary>None</summary>
11493 Create an inventory item and upload asset data
11494 </summary>
11495 <param name="data">Asset data</param>
11496 <param name="name">Inventory item name</param>
11497 <param name="description">Inventory item description</param>
11498 <param name="assetType">Asset type</param>
11499 <param name="invType">Inventory type</param>
11500 <param name="folderID">Put newly created inventory in this folder</param>
11501 <param name="permissions">Permission of the newly created item
11502 (EveryoneMask, GroupMask, and NextOwnerMask of Permissions struct are supported)</param>
11503 <param name="callback">Delegate that will receive feedback on success or failure</param>
11504 </member> 11560 </member>
11505 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryBase,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11561 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Drop">
11506 <summary> 11562 <summary>Drop particles from source position with no force</summary>
11507 Creates inventory link to another inventory item or folder
11508 </summary>
11509 <param name="folderID">Put newly created link in folder with this UUID</param>
11510 <param name="bse">Inventory item or folder</param>
11511 <param name="callback">Method to call upon creation of the link</param>
11512 </member> 11563 </member>
11513 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryItem,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11564 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Explode">
11514 <summary> 11565 <summary>"Explode" particles in all directions</summary>
11515 Creates inventory link to another inventory item
11516 </summary>
11517 <param name="folderID">Put newly created link in folder with this UUID</param>
11518 <param name="item">Original inventory item</param>
11519 <param name="callback">Method to call upon creation of the link</param>
11520 </member> 11566 </member>
11521 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryFolder,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11567 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Angle">
11522 <summary> 11568 <summary>Particles shoot across a 2D area</summary>
11523 Creates inventory link to another inventory folder
11524 </summary>
11525 <param name="folderID">Put newly created link in folder with this UUID</param>
11526 <param name="folder">Original inventory folder</param>
11527 <param name="callback">Method to call upon creation of the link</param>
11528 </member> 11569 </member>
11529 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCreatedCallback)"> 11570 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.AngleCone">
11530 <summary> 11571 <summary>Particles shoot across a 3D Cone</summary>
11531 Creates inventory link to another inventory item or folder
11532 </summary>
11533 <param name="folderID">Put newly created link in folder with this UUID</param>
11534 <param name="itemID">Original item's UUID</param>
11535 <param name="name">Name</param>
11536 <param name="description">Description</param>
11537 <param name="assetType">Asset Type</param>
11538 <param name="invType">Inventory Type</param>
11539 <param name="transactionID">Transaction UUID</param>
11540 <param name="callback">Method to call upon creation of the link</param>
11541 </member> 11572 </member>
11542 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.InventoryManager.ItemCopiedCallback)"> 11573 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.AngleConeEmpty">
11543 <summary> 11574 <summary>Inverse of AngleCone (shoot particles everywhere except the 3D cone defined</summary>
11544 </summary>
11545 <param name="item">
11546 </param>
11547 <param name="newParent">
11548 </param>
11549 <param name="newName">
11550 </param>
11551 <param name="callback">
11552 </param>
11553 </member> 11575 </member>
11554 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)"> 11576 <member name="T:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags">
11555 <summary> 11577 <summary>
11578 Particle Data Flags
11556 </summary> 11579 </summary>
11557 <param name="item">
11558 </param>
11559 <param name="newParent">
11560 </param>
11561 <param name="newName">
11562 </param>
11563 <param name="oldOwnerID">
11564 </param>
11565 <param name="callback">
11566 </param>
11567 </member> 11580 </member>
11568 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItems(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{System.String},OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)"> 11581 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.None">
11569 <summary> 11582 <summary>None</summary>
11570 </summary>
11571 <param name="items">
11572 </param>
11573 <param name="targetFolders">
11574 </param>
11575 <param name="newNames">
11576 </param>
11577 <param name="oldOwnerID">
11578 </param>
11579 <param name="callback">
11580 </param>
11581 </member> 11583 </member>
11582 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItemFromNotecard(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)"> 11584 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.InterpColor">
11583 <summary> 11585 <summary>Interpolate color and alpha from start to end</summary>
11584 Request a copy of an asset embedded within a notecard
11585 </summary>
11586 <param name="objectID">Usually UUID.Zero for copying an asset from a notecard</param>
11587 <param name="notecardID">UUID of the notecard to request an asset from</param>
11588 <param name="folderID">Target folder for asset to go to in your inventory</param>
11589 <param name="itemID">UUID of the embedded asset</param>
11590 <param name="callback">callback to run when item is copied to inventory</param>
11591 </member> 11586 </member>
11592 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItem(OpenMetaverse.InventoryItem)"> 11587 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.InterpScale">
11593 <summary> 11588 <summary>Interpolate scale from start to end</summary>
11594 </summary>
11595 <param name="item">
11596 </param>
11597 </member> 11589 </member>
11598 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{OpenMetaverse.InventoryItem})"> 11590 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Bounce">
11599 <summary> 11591 <summary>Bounce particles off particle sources Z height</summary>
11600 </summary>
11601 <param name="items">
11602 </param>
11603 </member> 11592 </member>
11604 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{OpenMetaverse.InventoryItem},OpenMetaverse.UUID)"> 11593 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Wind">
11605 <summary> 11594 <summary>velocity of particles is dampened toward the simulators wind</summary>
11606 </summary>
11607 <param name="items">
11608 </param>
11609 <param name="transactionID">
11610 </param>
11611 </member> 11595 </member>
11612 <member name="M:OpenMetaverse.InventoryManager.RequestUploadNotecardAsset(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)"> 11596 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.FollowSrc">
11613 <summary> 11597 <summary>Particles follow the source</summary>
11614 </summary>
11615 <param name="data">
11616 </param>
11617 <param name="notecardID">
11618 </param>
11619 <param name="callback">
11620 </param>
11621 </member> 11598 </member>
11622 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateNotecardTask(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)"> 11599 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.FollowVelocity">
11623 <summary> 11600 <summary>Particles point towards the direction of source's velocity</summary>
11624 Save changes to notecard embedded in object contents
11625 </summary>
11626 <param name="data">Encoded notecard asset data</param>
11627 <param name="notecardID">Notecard UUID</param>
11628 <param name="taskID">Object's UUID</param>
11629 <param name="callback">Called upon finish of the upload with status information</param>
11630 </member> 11601 </member>
11631 <member name="M:OpenMetaverse.InventoryManager.RequestUploadGestureAsset(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)"> 11602 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.TargetPos">
11632 <summary> 11603 <summary>Target of the particles</summary>
11633 Upload new gesture asset for an inventory gesture item
11634 </summary>
11635 <param name="data">Encoded gesture asset</param>
11636 <param name="gestureID">Gesture inventory UUID</param>
11637 <param name="callback">Callback whick will be called when upload is complete</param>
11638 </member> 11604 </member>
11639 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateScriptAgentInventory(System.Byte[],OpenMetaverse.UUID,System.Boolean,OpenMetaverse.InventoryManager.ScriptUpdatedCallback)"> 11605 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.TargetLinear">
11640 <summary> 11606 <summary>Particles are sent in a straight line</summary>
11641 Update an existing script in an agents Inventory
11642 </summary>
11643 <param name="data">A byte[] array containing the encoded scripts contents</param>
11644 <param name="itemID">the itemID of the script</param>
11645 <param name="mono">if true, sets the script content to run on the mono interpreter</param>
11646 <param name="callback">
11647 </param>
11648 </member> 11607 </member>
11649 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateScriptTask(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventoryManager.ScriptUpdatedCallback)"> 11608 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Emissive">
11650 <summary> 11609 <summary>Particles emit a glow</summary>
11651 Update an existing script in an task Inventory
11652 </summary>
11653 <param name="data">A byte[] array containing the encoded scripts contents</param>
11654 <param name="itemID">the itemID of the script</param>
11655 <param name="taskID">UUID of the prim containting the script</param>
11656 <param name="mono">if true, sets the script content to run on the mono interpreter</param>
11657 <param name="running">if true, sets the script to running</param>
11658 <param name="callback">
11659 </param>
11660 </member> 11610 </member>
11661 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem)"> 11611 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Beam">
11662 <summary> 11612 <summary>used for point/grab/touch</summary>
11663 Rez an object from inventory
11664 </summary>
11665 <param name="simulator">Simulator to place object in</param>
11666 <param name="rotation">Rotation of the object when rezzed</param>
11667 <param name="position">Vector of where to place object</param>
11668 <param name="item">InventoryItem object containing item details</param>
11669 </member> 11613 </member>
11670 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem,OpenMetaverse.UUID)"> 11614 <member name="T:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags">
11671 <summary> 11615 <summary>
11672 Rez an object from inventory 11616 Particle Flags Enum
11673 </summary> 11617 </summary>
11674 <param name="simulator">Simulator to place object in</param>
11675 <param name="rotation">Rotation of the object when rezzed</param>
11676 <param name="position">Vector of where to place object</param>
11677 <param name="item">InventoryItem object containing item details</param>
11678 <param name="groupOwner">UUID of group to own the object</param>
11679 </member> 11618 </member>
11680 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)"> 11619 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.None">
11681 <summary> 11620 <summary>None</summary>
11682 Rez an object from inventory
11683 </summary>
11684 <param name="simulator">Simulator to place object in</param>
11685 <param name="rotation">Rotation of the object when rezzed</param>
11686 <param name="position">Vector of where to place object</param>
11687 <param name="item">InventoryItem object containing item details</param>
11688 <param name="groupOwner">UUID of group to own the object</param>
11689 <param name="queryID">User defined queryID to correlate replies</param>
11690 <param name="rezSelected">If set to true, the CreateSelected flag
11691 will be set on the rezzed object</param>
11692 </member> 11621 </member>
11693 <member name="M:OpenMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32)"> 11622 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.ObjectRelative">
11694 <summary> 11623 <summary>Acceleration and velocity for particles are
11695 DeRez an object from the simulator to the agents Objects folder in the agents Inventory 11624 relative to the object rotation</summary>
11696 </summary>
11697 <param name="objectLocalID">The simulator Local ID of the object</param>
11698 <remarks>If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed</remarks>
11699 </member> 11625 </member>
11700 <member name="M:OpenMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32,OpenMetaverse.DeRezDestination,OpenMetaverse.UUID,OpenMetaverse.UUID)"> 11626 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.UseNewAngle">
11701 <summary> 11627 <summary>Particles use new 'correct' angle parameters</summary>
11702 DeRez an object from the simulator and return to inventory
11703 </summary>
11704 <param name="objectLocalID">The simulator Local ID of the object</param>
11705 <param name="destType">The type of destination from the <seealso cref="T:OpenMetaverse.DeRezDestination" /> enum</param>
11706 <param name="destFolder">The destination inventory folders <seealso cref="T:OpenMetaverse.UUID" /> -or-
11707 if DeRezzing object to a tasks Inventory, the Tasks <seealso cref="T:OpenMetaverse.UUID" /></param>
11708 <param name="transactionID">The transaction ID for this request which
11709 can be used to correlate this request with other packets</param>
11710 <remarks>If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed</remarks>
11711 </member> 11628 </member>
11712 <member name="M:OpenMetaverse.InventoryManager.RequestRestoreRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.InventoryItem,OpenMetaverse.UUID)"> 11629 <member name="M:OpenMetaverse.Messages.MessageUtils.DecodeEvent(System.String,OpenMetaverse.StructuredData.OSDMap)">
11713 <summary> 11630 <summary>
11714 Rez an item from inventory to its previous simulator location 11631 Return a decoded capabilities message as a strongly typed object
11715 </summary> 11632 </summary>
11716 <param name="simulator"> 11633 <param name="eventName">A string containing the name of the capabilities message key</param>
11717 </param> 11634 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> to decode</param>
11718 <param name="item"> 11635 <returns>A strongly typed object containing the decoded information from the capabilities message, or null
11719 </param> 11636 if no existing Message object exists for the specified event</returns>
11720 <param name="queryID">
11721 </param>
11722 <returns>
11723 </returns>
11724 </member> 11637 </member>
11725 <member name="M:OpenMetaverse.InventoryManager.GiveItem(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,System.Boolean)"> 11638 <member name="T:OpenMetaverse.Imaging.OpenJPEG">
11726 <summary> 11639 <summary>
11727 Give an inventory item to another avatar 11640 A Wrapper around openjpeg to encode and decode images to and from byte arrays
11728 </summary> 11641 </summary>
11729 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID" /> of the item to give</param>
11730 <param name="itemName">The name of the item</param>
11731 <param name="assetType">The type of the item from the <seealso cref="T:OpenMetaverse.AssetType" /> enum</param>
11732 <param name="recipient">The <seealso cref="T:OpenMetaverse.UUID" /> of the recipient</param>
11733 <param name="doEffect">true to generate a beameffect during transfer</param>
11734 </member> 11642 </member>
11735 <member name="M:OpenMetaverse.InventoryManager.GiveFolder(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,System.Boolean)"> 11643 <member name="F:OpenMetaverse.Imaging.OpenJPEG.TGA_HEADER_SIZE">
11736 <summary> 11644 <summary>TGA Header size</summary>
11737 Give an inventory Folder with contents to another avatar
11738 </summary>
11739 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID" /> of the Folder to give</param>
11740 <param name="folderName">The name of the folder</param>
11741 <param name="assetType">The type of the item from the <seealso cref="T:OpenMetaverse.AssetType" /> enum</param>
11742 <param name="recipient">The <seealso cref="T:OpenMetaverse.UUID" /> of the recipient</param>
11743 <param name="doEffect">true to generate a beameffect during transfer</param>
11744 </member> 11645 </member>
11745 <member name="M:OpenMetaverse.InventoryManager.UpdateTaskInventory(System.UInt32,OpenMetaverse.InventoryItem)"> 11646 <member name="F:OpenMetaverse.Imaging.OpenJPEG.OpenJPEGLock">
11746 <summary> 11647 <summary>OpenJPEG is not threadsafe, so this object is used to lock
11747 Copy or move an <see cref="T:OpenMetaverse.InventoryItem" /> from agent inventory to a task (primitive) inventory 11648 during calls into unmanaged code</summary>
11748 </summary>
11749 <param name="objectLocalID">The target object</param>
11750 <param name="item">The item to copy or move from inventory</param>
11751 <returns>
11752 </returns>
11753 <remarks>For items with copy permissions a copy of the item is placed in the tasks inventory,
11754 for no-copy items the object is moved to the tasks inventory</remarks>
11755 </member> 11649 </member>
11756 <member name="M:OpenMetaverse.InventoryManager.GetTaskInventory(OpenMetaverse.UUID,System.UInt32,System.Int32)"> 11650 <member name="M:OpenMetaverse.Imaging.OpenJPEG.Encode(OpenMetaverse.Imaging.ManagedImage,System.Boolean)">
11757 <summary> 11651 <summary>
11758 Retrieve a listing of the items contained in a task (Primitive) 11652 Encode a <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object into a byte array
11759 </summary> 11653 </summary>
11760 <param name="objectID">The tasks <seealso cref="T:OpenMetaverse.UUID" /></param> 11654 <param name="image">The <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object to encode</param>
11761 <param name="objectLocalID">The tasks simulator local ID</param> 11655 <param name="lossless">true to enable lossless conversion, only useful for small images ie: sculptmaps</param>
11762 <param name="timeoutMS">milliseconds to wait for reply from simulator</param> 11656 <returns>A byte array containing the encoded Image object</returns>
11763 <returns>A list containing the inventory items inside the task or null
11764 if a timeout occurs</returns>
11765 <remarks>This request blocks until the response from the simulator arrives
11766 or timeoutMS is exceeded</remarks>
11767 </member> 11657 </member>
11768 <member name="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32)"> 11658 <member name="M:OpenMetaverse.Imaging.OpenJPEG.Encode(OpenMetaverse.Imaging.ManagedImage)">
11769 <summary> 11659 <summary>
11770 Request the contents of a tasks (primitives) inventory from the 11660 Encode a <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object into a byte array
11771 current simulator
11772 </summary> 11661 </summary>
11773 <param name="objectLocalID">The LocalID of the object</param> 11662 <param name="image">The <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object to encode</param>
11774 <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply" /> 11663 <returns>a byte array of the encoded image</returns>
11775 </member> 11664 </member>
11776 <member name="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32,OpenMetaverse.Simulator)"> 11665 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(System.Byte[],OpenMetaverse.Imaging.ManagedImage@,System.Drawing.Image@)">
11777 <summary> 11666 <summary>
11778 Request the contents of a tasks (primitives) inventory 11667 Decode JPEG2000 data to an <seealso cref="T:System.Drawing.Image"/> and
11668 <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/>
11779 </summary> 11669 </summary>
11780 <param name="objectLocalID">The simulator Local ID of the object</param> 11670 <param name="encoded">JPEG2000 encoded data</param>
11781 <param name="simulator">A reference to the simulator object that contains the object</param> 11671 <param name="managedImage">ManagedImage object to decode to</param>
11782 <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply" /> 11672 <param name="image">Image object to decode to</param>
11673 <returns>True if the decode succeeds, otherwise false</returns>
11783 </member> 11674 </member>
11784 <member name="M:OpenMetaverse.InventoryManager.MoveTaskInventory(System.UInt32,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Simulator)"> 11675 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(System.Byte[],OpenMetaverse.Imaging.ManagedImage@)">
11785 <summary> 11676 <summary>
11786 Move an item from a tasks (Primitive) inventory to the specified folder in the avatars inventory 11677
11787 </summary> 11678 </summary>
11788 <param name="objectLocalID">LocalID of the object in the simulator</param> 11679 <param name="encoded"></param>
11789 <param name="taskItemID">UUID of the task item to move</param> 11680 <param name="managedImage"></param>
11790 <param name="inventoryFolderID">The ID of the destination folder in this agents inventory</param> 11681 <returns></returns>
11791 <param name="simulator">Simulator Object</param>
11792 <remarks>Raises the <see cref="M:OpenMetaverse.InventoryManager.OnTaskItemReceived(OpenMetaverse.TaskItemReceivedEventArgs)" /> event</remarks>
11793 </member> 11682 </member>
11794 <member name="M:OpenMetaverse.InventoryManager.RemoveTaskInventory(System.UInt32,OpenMetaverse.UUID,OpenMetaverse.Simulator)"> 11683 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeLayerBoundaries(System.Byte[],OpenMetaverse.Imaging.OpenJPEG.J2KLayerInfo[]@,System.Int32@)">
11795 <summary> 11684 <summary>
11796 Remove an item from an objects (Prim) Inventory 11685
11797 </summary> 11686 </summary>
11798 <param name="objectLocalID">LocalID of the object in the simulator</param> 11687 <param name="encoded"></param>
11799 <param name="taskItemID">UUID of the task item to remove</param> 11688 <param name="layerInfo"></param>
11800 <param name="simulator">Simulator Object</param> 11689 <param name="components"></param>
11801 <remarks>You can confirm the removal by comparing the tasks inventory serial before and after the 11690 <returns></returns>
11802 request with the <see cref="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32,OpenMetaverse.Simulator)" /> request combined with
11803 the <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply" /> event</remarks>
11804 </member> 11691 </member>
11805 <member name="M:OpenMetaverse.InventoryManager.CopyScriptToTask(System.UInt32,OpenMetaverse.InventoryItem,System.Boolean)"> 11692 <member name="M:OpenMetaverse.Imaging.OpenJPEG.EncodeFromImage(System.Drawing.Bitmap,System.Boolean)">
11806 <summary> 11693 <summary>
11807 Copy an InventoryScript item from the Agents Inventory into a primitives task inventory 11694 Encode a <seealso cref="T:System.Drawing.Bitmap"/> object into a byte array
11808 </summary> 11695 </summary>
11809 <param name="objectLocalID">An unsigned integer representing a primitive being simulated</param> 11696 <param name="bitmap">The source <seealso cref="T:System.Drawing.Bitmap"/> object to encode</param>
11810 <param name="item">An <seealso cref="T:OpenMetaverse.InventoryItem" /> which represents a script object from the agents inventory</param> 11697 <param name="lossless">true to enable lossless decoding</param>
11811 <param name="enableScript">true to set the scripts running state to enabled</param> 11698 <returns>A byte array containing the source Bitmap object</returns>
11812 <returns>A Unique Transaction ID</returns>
11813 <example>
11814 The following example shows the basic steps necessary to copy a script from the agents inventory into a tasks inventory
11815 and assumes the script exists in the agents inventory.
11816 <code>
11817 uint primID = 95899503; // Fake prim ID
11818 UUID scriptID = UUID.Parse("92a7fe8a-e949-dd39-a8d8-1681d8673232"); // Fake Script UUID in Inventory
11819 Client.Inventory.FolderContents(Client.Inventory.FindFolderForType(AssetType.LSLText), Client.Self.AgentID,
11820 false, true, InventorySortOrder.ByName, 10000);
11821 Client.Inventory.RezScript(primID, (InventoryItem)Client.Inventory.Store[scriptID]);
11822 </code></example>
11823 </member> 11699 </member>
11824 <member name="M:OpenMetaverse.InventoryManager.RequestGetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 11700 <member name="T:OpenMetaverse.Imaging.OpenJPEG.J2KLayerInfo">
11825 <summary> 11701 <summary>
11826 Request the running status of a script contained in a task (primitive) inventory 11702 Defines the beginning and ending file positions of a layer in an
11703 LRCP-progression JPEG2000 file
11827 </summary> 11704 </summary>
11828 <param name="objectID">The ID of the primitive containing the script</param>
11829 <param name="scriptID">The ID of the script</param>
11830 <remarks>The <see cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply" /> event can be used to obtain the results of the
11831 request</remarks>
11832 <seealso cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply" />
11833 </member> 11705 </member>
11834 <member name="M:OpenMetaverse.InventoryManager.RequestSetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)"> 11706 <member name="T:OpenMetaverse.Imaging.OpenJPEG.MarshalledImage">
11835 <summary> 11707 <summary>
11836 Send a request to set the running state of a script contained in a task (primitive) inventory 11708 This structure is used to marshal both encoded and decoded images.
11709 MUST MATCH THE STRUCT IN dotnet.h!
11837 </summary> 11710 </summary>
11838 <param name="objectID">The ID of the primitive containing the script</param>
11839 <param name="scriptID">The ID of the script</param>
11840 <param name="running">true to set the script running, false to stop a running script</param>
11841 <remarks>To verify the change you can use the <see cref="M:OpenMetaverse.InventoryManager.RequestGetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID)" /> method combined
11842 with the <see cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply" /> event</remarks>
11843 </member> 11711 </member>
11844 <member name="M:OpenMetaverse.InventoryManager.ItemCRC(OpenMetaverse.InventoryItem)"> 11712 <member name="T:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket">
11845 <summary> 11713 <summary>
11846 Create a CRC from an InventoryItem 11714 Information about a single packet in a JPEG2000 stream
11847 </summary> 11715 </summary>
11848 <param name="iitem">The source InventoryItem</param>
11849 <returns>A uint representing the source InventoryItem as a CRC</returns>
11850 </member> 11716 </member>
11851 <member name="M:OpenMetaverse.InventoryManager.DecryptShadowID(OpenMetaverse.UUID)"> 11717 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.start_pos">
11852 <summary> 11718 <summary>Packet start position</summary>
11853 Reverses a cheesy XORing with a fixed UUID to convert a shadow_id to an asset_id
11854 </summary>
11855 <param name="shadowID">Obfuscated shadow_id value</param>
11856 <returns>Deobfuscated asset_id value</returns>
11857 </member> 11719 </member>
11858 <member name="M:OpenMetaverse.InventoryManager.EncryptAssetID(OpenMetaverse.UUID)"> 11720 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.end_ph_pos">
11859 <summary> 11721 <summary>Packet header end position</summary>
11860 Does a cheesy XORing with a fixed UUID to convert an asset_id to a shadow_id
11861 </summary>
11862 <param name="assetID">asset_id value to obfuscate</param>
11863 <returns>Obfuscated shadow_id value</returns>
11864 </member> 11722 </member>
11865 <member name="M:OpenMetaverse.InventoryManager.CreateInventoryItem(OpenMetaverse.InventoryType,OpenMetaverse.UUID)"> 11723 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.end_pos">
11866 <summary> 11724 <summary>Packet end position</summary>
11867 Wrapper for creating a new <seealso cref="T:OpenMetaverse.InventoryItem" /> object
11868 </summary>
11869 <param name="type">The type of item from the <seealso cref="T:OpenMetaverse.InventoryType" /> enum</param>
11870 <param name="id">The <seealso cref="T:OpenMetaverse.UUID" /> of the newly created object</param>
11871 <returns>An <seealso cref="T:OpenMetaverse.InventoryItem" /> object with the type and id passed</returns>
11872 </member> 11725 </member>
11873 <member name="M:OpenMetaverse.InventoryManager.ParseTaskInventory(System.String)"> 11726 <member name="F:OpenMetaverse.TerrainManager.m_LandPatchReceivedEvent">
11874 <summary> 11727 <summary>The event subscribers. null if no subcribers</summary>
11875 Parse the results of a RequestTaskInventory() response
11876 </summary>
11877 <param name="taskData">A string which contains the data from the task reply</param>
11878 <returns>A List containing the items contained within the tasks inventory</returns>
11879 </member> 11728 </member>
11880 <member name="M:OpenMetaverse.InventoryManager.SaveAssetIntoInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11729 <member name="M:OpenMetaverse.TerrainManager.OnLandPatchReceived(OpenMetaverse.LandPatchReceivedEventArgs)">
11881 <summary>Process an incoming packet and raise the appropriate events</summary> 11730 <summary>Raises the LandPatchReceived event</summary>
11882 <param name="sender">The sender</param> 11731 <param name="e">A LandPatchReceivedEventArgs object containing the
11883 <param name="e">The EventArgs object containing the packet data</param> 11732 data returned from the simulator</param>
11884 </member> 11733 </member>
11885 <member name="M:OpenMetaverse.InventoryManager.InventoryDescendentsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11734 <member name="F:OpenMetaverse.TerrainManager.m_LandPatchReceivedLock">
11886 <summary>Process an incoming packet and raise the appropriate events</summary> 11735 <summary>Thread sync lock object</summary>
11887 <param name="sender">The sender</param>
11888 <param name="e">The EventArgs object containing the packet data</param>
11889 </member> 11736 </member>
11890 <member name="M:OpenMetaverse.InventoryManager.UpdateCreateInventoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11737 <member name="M:OpenMetaverse.TerrainManager.#ctor(OpenMetaverse.GridClient)">
11891 <summary> 11738 <summary>
11892 UpdateCreateInventoryItem packets are received when a new inventory item 11739 Default constructor
11893 is created. This may occur when an object that's rezzed in world is
11894 taken into inventory, when an item is created using the CreateInventoryItem
11895 packet, or when an object is purchased
11896 </summary> 11740 </summary>
11897 <param name="sender">The sender</param> 11741 <param name="client"></param>
11898 <param name="e">The EventArgs object containing the packet data</param>
11899 </member> 11742 </member>
11900 <member name="M:OpenMetaverse.InventoryManager.MoveInventoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11743 <member name="E:OpenMetaverse.TerrainManager.LandPatchReceived">
11901 <summary>Process an incoming packet and raise the appropriate events</summary> 11744 <summary>Raised when the simulator responds sends </summary>
11902 <param name="sender">The sender</param>
11903 <param name="e">The EventArgs object containing the packet data</param>
11904 </member> 11745 </member>
11905 <member name="M:OpenMetaverse.InventoryManager.BulkUpdateInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11746 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.Simulator">
11906 <summary>Process an incoming packet and raise the appropriate events</summary> 11747 <summary>Simulator from that sent tha data</summary>
11907 <param name="sender">The sender</param>
11908 <param name="e">The EventArgs object containing the packet data</param>
11909 </member> 11748 </member>
11910 <member name="M:OpenMetaverse.InventoryManager.FetchInventoryReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11749 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.X">
11911 <summary>Process an incoming packet and raise the appropriate events</summary> 11750 <summary>Sim coordinate of the patch</summary>
11912 <param name="sender">The sender</param>
11913 <param name="e">The EventArgs object containing the packet data</param>
11914 </member> 11751 </member>
11915 <member name="M:OpenMetaverse.InventoryManager.ReplyTaskInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 11752 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.Y">
11916 <summary>Process an incoming packet and raise the appropriate events</summary> 11753 <summary>Sim coordinate of the patch</summary>
11917 <param name="sender">The sender</param>
11918 <param name="e">The EventArgs object containing the packet data</param>
11919 </member> 11754 </member>
11920 <member name="P:OpenMetaverse.InventoryObjectOfferedEventArgs.Accept"> 11755 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.PatchSize">
11921 <summary>Set to true to accept offer, false to decline it</summary> 11756 <summary>Size of tha patch</summary>
11922 </member> 11757 </member>
11923 <member name="P:OpenMetaverse.InventoryObjectOfferedEventArgs.FolderID"> 11758 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.HeightMap">
11924 <summary>The folder to accept the inventory into, if null default folder for <see cref="T:OpenMetaverse.AssetType" /> will be used</summary> 11759 <summary>Heightmap for the patch</summary>
11925 </member> 11760 </member>
11926 <member name="T:OpenMetaverse.TaskItemReceivedEventArgs"> 11761 <member name="T:OpenMetaverse.Caps">
11927 <summary> 11762 <summary>
11928 Callback when an inventory object is accepted and received from a 11763 Capabilities is the name of the bi-directional HTTP REST protocol
11929 task inventory. This is the callback in which you actually get 11764 used to communicate non real-time transactions such as teleporting or
11930 the ItemID, as in ObjectOfferedCallback it is null when received 11765 group messaging
11931 from a task.
11932 </summary> 11766 </summary>
11933 </member> 11767 </member>
11934 <member name="M:OpenMetaverse.InventoryNode.#ctor"> 11768 <member name="F:OpenMetaverse.Caps.Simulator">
11935 <summary> 11769 <summary>Reference to the simulator this system is connected to</summary>
11936 </summary>
11937 </member> 11770 </member>
11938 <member name="M:OpenMetaverse.InventoryNode.#ctor(OpenMetaverse.InventoryBase)"> 11771 <member name="M:OpenMetaverse.Caps.#ctor(OpenMetaverse.Simulator,System.String)">
11939 <summary> 11772 <summary>
11773 Default constructor
11940 </summary> 11774 </summary>
11941 <param name="data"> 11775 <param name="simulator"></param>
11942 </param> 11776 <param name="seedcaps"></param>
11943 </member> 11777 </member>
11944 <member name="M:OpenMetaverse.InventoryNode.#ctor(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryNode)"> 11778 <member name="M:OpenMetaverse.Caps.CapabilityURI(System.String)">
11945 <summary> 11779 <summary>
11946 De-serialization constructor for the InventoryNode Class 11780 Request the URI of a named capability
11947 </summary> 11781 </summary>
11782 <param name="capability">Name of the capability to request</param>
11783 <returns>The URI of the requested capability, or String.Empty if
11784 the capability does not exist</returns>
11948 </member> 11785 </member>
11949 <member name="M:OpenMetaverse.InventoryNode.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11786 <member name="M:OpenMetaverse.Caps.EventQueueEventHandler(System.String,OpenMetaverse.StructuredData.OSDMap)">
11950 <summary> 11787 <summary>
11951 De-serialization handler for the InventoryNode Class 11788 Process any incoming events, check to see if we have a message created for the event,
11952 </summary> 11789 </summary>
11790 <param name="eventName"></param>
11791 <param name="body"></param>
11953 </member> 11792 </member>
11954 <member name="P:OpenMetaverse.InventoryNode.Data"> 11793 <member name="P:OpenMetaverse.Caps.SeedCapsURI">
11955 <summary> 11794 <summary>Capabilities URI this system was initialized with</summary>
11956 </summary>
11957 </member> 11795 </member>
11958 <member name="P:OpenMetaverse.InventoryNode.Parent"> 11796 <member name="P:OpenMetaverse.Caps.IsEventQueueRunning">
11959 <summary> 11797 <summary>Whether the capabilities event queue is connected and
11960 </summary> 11798 listening for incoming events</summary>
11961 </member> 11799 </member>
11962 <member name="P:OpenMetaverse.InventoryNode.ParentID"> 11800 <member name="T:OpenMetaverse.Caps.EventQueueCallback">
11963 <summary> 11801 <summary>
11802 Triggered when an event is received via the EventQueueGet
11803 capability
11964 </summary> 11804 </summary>
11805 <param name="capsKey">Event name</param>
11806 <param name="message">Decoded event data</param>
11807 <param name="simulator">The simulator that generated the event</param>
11965 </member> 11808 </member>
11966 <member name="P:OpenMetaverse.InventoryNode.Nodes"> 11809 <member name="T:OpenMetaverse.StatusCode">
11967 <summary> 11810 <summary>
11811
11968 </summary> 11812 </summary>
11969 </member> 11813 </member>
11970 <member name="P:OpenMetaverse.InventoryNode.NeedsUpdate"> 11814 <member name="F:OpenMetaverse.StatusCode.OK">
11971 <summary> 11815 <summary>OK</summary>
11972 For inventory folder nodes specifies weather the folder needs to be
11973 refreshed from the server
11974 </summary>
11975 </member> 11816 </member>
11976 <member name="M:OpenMetaverse.InventoryNode.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)"> 11817 <member name="F:OpenMetaverse.StatusCode.Done">
11977 <summary> 11818 <summary>Transfer completed</summary>
11978 Serialization handler for the InventoryNode Class
11979 </summary>
11980 </member> 11819 </member>
11981 <member name="M:OpenMetaverse.InventoryNode.ToString"> 11820 <member name="F:OpenMetaverse.StatusCode.Skip">
11982 <summary> 11821 <summary></summary>
11983 </summary>
11984 <returns>
11985 </returns>
11986 </member> 11822 </member>
11987 <member name="T:OpenMetaverse.Logger"> 11823 <member name="F:OpenMetaverse.StatusCode.Abort">
11988 <summary> 11824 <summary></summary>
11989 Singleton logging class for the entire library
11990 </summary>
11991 </member> 11825 </member>
11992 <member name="M:OpenMetaverse.Logger.#ctor"> 11826 <member name="F:OpenMetaverse.StatusCode.Error">
11993 <summary> 11827 <summary>Unknown error occurred</summary>
11994 Default constructor
11995 </summary>
11996 </member> 11828 </member>
11997 <member name="T:OpenMetaverse.Logger.LogCallback"> 11829 <member name="F:OpenMetaverse.StatusCode.UnknownSource">
11998 <summary> 11830 <summary>Equivalent to a 404 error</summary>
11999 Callback used for client apps to receive log messages from
12000 the library
12001 </summary>
12002 <param name="message">Data being logged</param>
12003 <param name="level">The severity of the log entry from <seealso cref="T:OpenMetaverse.Helpers.LogLevel" /></param>
12004 </member> 11831 </member>
12005 <member name="F:OpenMetaverse.Logger.LogInstance"> 11832 <member name="F:OpenMetaverse.StatusCode.InsufficientPermissions">
12006 <summary>log4net logging engine</summary> 11833 <summary>Client does not have permission for that resource</summary>
12007 </member> 11834 </member>
12008 <member name="E:OpenMetaverse.Logger.OnLogMessage"> 11835 <member name="F:OpenMetaverse.StatusCode.Unknown">
12009 <summary>Triggered whenever a message is logged. If this is left 11836 <summary>Unknown status</summary>
12010 null, log messages will go to the console</summary>
12011 </member> 11837 </member>
12012 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel)"> 11838 <member name="T:OpenMetaverse.ChannelType">
12013 <summary> 11839 <summary>
12014 Send a log message to the logging engine 11840
12015 </summary> 11841 </summary>
12016 <param name="message">The log message</param>
12017 <param name="level">The severity of the log entry</param>
12018 </member> 11842 </member>
12019 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,OpenMetaverse.GridClient)"> 11843 <member name="F:OpenMetaverse.ChannelType.Unknown">
12020 <summary> 11844 <summary></summary>
12021 Send a log message to the logging engine
12022 </summary>
12023 <param name="message">The log message</param>
12024 <param name="level">The severity of the log entry</param>
12025 <param name="client">Instance of the client</param>
12026 </member> 11845 </member>
12027 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,System.Exception)"> 11846 <member name="F:OpenMetaverse.ChannelType.Misc">
12028 <summary> 11847 <summary>Unknown</summary>
12029 Send a log message to the logging engine
12030 </summary>
12031 <param name="message">The log message</param>
12032 <param name="level">The severity of the log entry</param>
12033 <param name="exception">Exception that was raised</param>
12034 </member> 11848 </member>
12035 <member name="M:OpenMetaverse.Logger.Log(System.Object,OpenMetaverse.Helpers.LogLevel,OpenMetaverse.GridClient,System.Exception)"> 11849 <member name="F:OpenMetaverse.ChannelType.Asset">
12036 <summary> 11850 <summary>Virtually all asset transfers use this channel</summary>
12037 Send a log message to the logging engine
12038 </summary>
12039 <param name="message">The log message</param>
12040 <param name="level">The severity of the log entry</param>
12041 <param name="client">Instance of the client</param>
12042 <param name="exception">Exception that was raised</param>
12043 </member> 11851 </member>
12044 <member name="M:OpenMetaverse.Logger.DebugLog(System.Object)"> 11852 <member name="T:OpenMetaverse.SourceType">
12045 <summary> 11853 <summary>
12046 If the library is compiled with DEBUG defined, an event will be 11854
12047 fired if an <code>OnLogMessage</code> handler is registered and the
12048 message will be sent to the logging engine
12049 </summary> 11855 </summary>
12050 <param name="message">The message to log at the DEBUG level to the
12051 current logging engine</param>
12052 </member> 11856 </member>
12053 <member name="M:OpenMetaverse.Logger.DebugLog(System.Object,OpenMetaverse.GridClient)"> 11857 <member name="F:OpenMetaverse.SourceType.Unknown">
12054 <summary> 11858 <summary></summary>
12055 If the library is compiled with DEBUG defined and
12056 <code>GridClient.Settings.DEBUG</code> is true, an event will be
12057 fired if an <code>OnLogMessage</code> handler is registered and the
12058 message will be sent to the logging engine
12059 </summary>
12060 <param name="message">The message to log at the DEBUG level to the
12061 current logging engine</param>
12062 <param name="client">Instance of the client</param>
12063 </member> 11859 </member>
12064 <member name="T:OpenMetaverse.LoginStatus"> 11860 <member name="F:OpenMetaverse.SourceType.Asset">
12065 <summary> 11861 <summary>Asset from the asset server</summary>
12066 </summary>
12067 </member> 11862 </member>
12068 <member name="F:OpenMetaverse.LoginStatus.Failed"> 11863 <member name="F:OpenMetaverse.SourceType.SimInventoryItem">
12069 <summary> 11864 <summary>Inventory item</summary>
12070 </summary>
12071 </member> 11865 </member>
12072 <member name="F:OpenMetaverse.LoginStatus.None"> 11866 <member name="F:OpenMetaverse.SourceType.SimEstate">
12073 <summary> 11867 <summary>Estate asset, such as an estate covenant</summary>
12074 </summary>
12075 </member> 11868 </member>
12076 <member name="F:OpenMetaverse.LoginStatus.ConnectingToLogin"> 11869 <member name="T:OpenMetaverse.TargetType">
12077 <summary> 11870 <summary>
11871
12078 </summary> 11872 </summary>
12079 </member> 11873 </member>
12080 <member name="F:OpenMetaverse.LoginStatus.ReadingResponse"> 11874 <member name="F:OpenMetaverse.TargetType.Unknown">
12081 <summary> 11875 <summary></summary>
12082 </summary>
12083 </member> 11876 </member>
12084 <member name="F:OpenMetaverse.LoginStatus.ConnectingToSim"> 11877 <member name="F:OpenMetaverse.TargetType.File">
12085 <summary> 11878 <summary></summary>
12086 </summary>
12087 </member> 11879 </member>
12088 <member name="F:OpenMetaverse.LoginStatus.Redirecting"> 11880 <member name="F:OpenMetaverse.TargetType.VFile">
12089 <summary> 11881 <summary></summary>
12090 </summary>
12091 </member> 11882 </member>
12092 <member name="F:OpenMetaverse.LoginStatus.Success"> 11883 <member name="T:OpenMetaverse.ImageType">
12093 <summary> 11884 <summary>
11885 When requesting image download, type of the image requested
12094 </summary> 11886 </summary>
12095 </member> 11887 </member>
12096 <member name="T:OpenMetaverse.LoginParams"> 11888 <member name="F:OpenMetaverse.ImageType.Normal">
12097 <summary> 11889 <summary>Normal in-world object texture</summary>
12098 Login Request Parameters
12099 </summary>
12100 </member> 11890 </member>
12101 <member name="M:OpenMetaverse.LoginParams.#ctor"> 11891 <member name="F:OpenMetaverse.ImageType.Baked">
12102 <summary> 11892 <summary>Avatar texture</summary>
12103 Default constuctor, initializes sane default values
12104 </summary>
12105 </member> 11893 </member>
12106 <member name="M:OpenMetaverse.LoginParams.#ctor(OpenMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String)"> 11894 <member name="F:OpenMetaverse.ImageType.ServerBaked">
12107 <summary> 11895 <summary>Server baked avatar texture</summary>
12108 Instantiates new LoginParams object and fills in the values
12109 </summary>
12110 <param name="client">Instance of GridClient to read settings from</param>
12111 <param name="firstName">Login first name</param>
12112 <param name="lastName">Login last name</param>
12113 <param name="password">Password</param>
12114 <param name="channel">Login channnel (application name)</param>
12115 <param name="version">Client version, should be application name + version number</param>
12116 </member> 11896 </member>
12117 <member name="M:OpenMetaverse.LoginParams.#ctor(OpenMetaverse.GridClient,System.String,System.String,System.String,System.String,System.String,System.String)"> 11897 <member name="T:OpenMetaverse.ImageCodec">
12118 <summary> 11898 <summary>
12119 Instantiates new LoginParams object and fills in the values 11899 Image file format
12120 </summary> 11900 </summary>
12121 <param name="client">Instance of GridClient to read settings from</param>
12122 <param name="firstName">Login first name</param>
12123 <param name="lastName">Login last name</param>
12124 <param name="password">Password</param>
12125 <param name="channel">Login channnel (application name)</param>
12126 <param name="version">Client version, should be application name + version number</param>
12127 <param name="loginURI">URI of the login server</param>
12128 </member>
12129 <member name="F:OpenMetaverse.LoginParams.URI">
12130 <summary>The URL of the Login Server</summary>
12131 </member>
12132 <member name="F:OpenMetaverse.LoginParams.Timeout">
12133 <summary>The number of milliseconds to wait before a login is considered
12134 failed due to timeout</summary>
12135 </member>
12136 <member name="F:OpenMetaverse.LoginParams.MethodName">
12137 <summary>The request method</summary>
12138 <remarks>login_to_simulator is currently the only supported method</remarks>
12139 </member>
12140 <member name="F:OpenMetaverse.LoginParams.FirstName">
12141 <summary>The Agents First name</summary>
12142 </member>
12143 <member name="F:OpenMetaverse.LoginParams.LastName">
12144 <summary>The Agents Last name</summary>
12145 </member>
12146 <member name="F:OpenMetaverse.LoginParams.Password">
12147 <summary>A md5 hashed password</summary>
12148 <remarks>plaintext password will be automatically hashed</remarks>
12149 </member>
12150 <member name="F:OpenMetaverse.LoginParams.Start">
12151 <summary>The agents starting location once logged in</summary>
12152 <remarks>Either "last", "home", or a string encoded URI
12153 containing the simulator name and x/y/z coordinates e.g: uri:hooper&amp;128&amp;152&amp;17</remarks>
12154 </member> 11901 </member>
12155 <member name="F:OpenMetaverse.LoginParams.Channel"> 11902 <member name="T:OpenMetaverse.Transfer">
12156 <summary>A string containing the client software channel information</summary>
12157 <example>Second Life Release</example>
12158 </member>
12159 <member name="F:OpenMetaverse.LoginParams.Version">
12160 <summary>The client software version information</summary>
12161 <remarks>The official viewer uses: Second Life Release n.n.n.n
12162 where n is replaced with the current version of the viewer</remarks>
12163 </member>
12164 <member name="F:OpenMetaverse.LoginParams.Platform">
12165 <summary>A string containing the platform information the agent is running on</summary>
12166 </member>
12167 <member name="F:OpenMetaverse.LoginParams.MAC">
12168 <summary>A string hash of the network cards Mac Address</summary>
12169 </member>
12170 <member name="F:OpenMetaverse.LoginParams.ViewerDigest">
12171 <summary>Unknown or deprecated</summary>
12172 </member>
12173 <member name="F:OpenMetaverse.LoginParams.ID0">
12174 <summary>A string hash of the first disk drives ID used to identify this clients uniqueness</summary>
12175 </member>
12176 <member name="F:OpenMetaverse.LoginParams.UserAgent">
12177 <summary>A string containing the viewers Software, this is not directly sent to the login server but
12178 instead is used to generate the Version string</summary>
12179 </member>
12180 <member name="F:OpenMetaverse.LoginParams.Author">
12181 <summary>A string representing the software creator. This is not directly sent to the login server but
12182 is used by the library to generate the Version information</summary>
12183 </member>
12184 <member name="F:OpenMetaverse.LoginParams.AgreeToTos">
12185 <summary>If true, this agent agrees to the Terms of Service of the grid its connecting to</summary>
12186 </member>
12187 <member name="F:OpenMetaverse.LoginParams.ReadCritical">
12188 <summary>Unknown</summary>
12189 </member>
12190 <member name="F:OpenMetaverse.LoginParams.Options">
12191 <summary>An array of string sent to the login server to enable various options</summary>
12192 </member>
12193 <member name="F:OpenMetaverse.LoginParams.LoginID">
12194 <summary>A randomly generated ID to distinguish between login attempts. This value is only used
12195 internally in the library and is never sent over the wire</summary>
12196 </member>
12197 <member name="T:OpenMetaverse.LoginResponseData">
12198 <summary> 11903 <summary>
12199 The decoded data returned from the login server after a successful login 11904
12200 </summary> 11905 </summary>
12201 </member> 11906 </member>
12202 <member name="F:OpenMetaverse.LoginResponseData.Login"> 11907 <member name="P:OpenMetaverse.Transfer.TimeSinceLastPacket">
12203 <summary>true, false, indeterminate</summary> 11908 <summary>Number of milliseconds passed since the last transfer
12204 </member> 11909 packet was received</summary>
12205 <member name="F:OpenMetaverse.LoginResponseData.Message">
12206 <summary>Login message of the day</summary>
12207 </member>
12208 <member name="F:OpenMetaverse.LoginResponseData.AgentAccess">
12209 <summary>M or PG, also agent_region_access and agent_access_max</summary>
12210 </member> 11910 </member>
12211 <member name="M:OpenMetaverse.LoginResponseData.Parse(OpenMetaverse.StructuredData.OSDMap)"> 11911 <member name="T:OpenMetaverse.AssetDownload">
12212 <summary> 11912 <summary>
12213 Parse LLSD Login Reply Data 11913
12214 </summary> 11914 </summary>
12215 <param name="reply">An <seealso cref="T:OpenMetaverse.StructuredData.OSDMap" />
12216 contaning the login response data</param>
12217 <remarks>XML-RPC logins do not require this as XML-RPC.NET
12218 automatically populates the struct properly using attributes</remarks>
12219 </member> 11915 </member>
12220 <member name="T:OpenMetaverse.NetworkManager"> 11916 <member name="T:OpenMetaverse.XferDownload">
12221 <summary>
12222 Login Routines
12223 </summary>
12224 <summary> 11917 <summary>
12225 NetworkManager is responsible for managing the network layer of 11918
12226 OpenMetaverse. It tracks all the server connections, serializes
12227 outgoing traffic and deserializes incoming traffic, and provides
12228 instances of delegates for network-related events.
12229 </summary> 11919 </summary>
12230 </member> 11920 </member>
12231 <member name="M:OpenMetaverse.NetworkManager.#ctor(OpenMetaverse.GridClient)"> 11921 <member name="T:OpenMetaverse.ImageDownload">
12232 <summary> 11922 <summary>
12233 Default constructor 11923
12234 </summary> 11924 </summary>
12235 <param name="client">Reference to the GridClient object</param>
12236 </member> 11925 </member>
12237 <member name="T:OpenMetaverse.NetworkManager.DisconnectType"> 11926 <member name="T:OpenMetaverse.AssetUpload">
12238 <summary> 11927 <summary>
12239 Explains why a simulator or the grid disconnected from us 11928
12240 </summary> 11929 </summary>
12241 </member> 11930 </member>
12242 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.ClientInitiated"> 11931 <member name="T:OpenMetaverse.ImageRequest">
12243 <summary>The client requested the logout or simulator disconnect</summary>
12244 </member>
12245 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.ServerInitiated">
12246 <summary>The server notified us that it is disconnecting</summary>
12247 </member>
12248 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.NetworkTimeout">
12249 <summary>Either a socket was closed or network traffic timed out</summary>
12250 </member>
12251 <member name="F:OpenMetaverse.NetworkManager.DisconnectType.SimShutdown">
12252 <summary>The last active simulator shut down</summary>
12253 </member>
12254 <member name="T:OpenMetaverse.NetworkManager.IncomingPacket">
12255 <summary> 11932 <summary>
12256 Holds a simulator reference and a decoded packet, these structs are put in 11933
12257 the packet inbox for event handling
12258 </summary> 11934 </summary>
12259 </member> 11935 </member>
12260 <member name="F:OpenMetaverse.NetworkManager.IncomingPacket.Simulator"> 11936 <member name="M:OpenMetaverse.ImageRequest.#ctor(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32)">
12261 <summary>Reference to the simulator that this packet came from</summary>
12262 </member>
12263 <member name="F:OpenMetaverse.NetworkManager.IncomingPacket.Packet">
12264 <summary>Packet that needs to be processed</summary>
12265 </member>
12266 <member name="T:OpenMetaverse.NetworkManager.OutgoingPacket">
12267 <summary> 11937 <summary>
12268 Holds a simulator reference and a serialized packet, these structs are put in 11938
12269 the packet outbox for sending
12270 </summary> 11939 </summary>
11940 <param name="imageid"></param>
11941 <param name="type"></param>
11942 <param name="priority"></param>
11943 <param name="discardLevel"></param>
12271 </member> 11944 </member>
12272 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Simulator"> 11945 <member name="T:OpenMetaverse.AssetManager">
12273 <summary>Reference to the simulator this packet is destined for</summary>
12274 </member>
12275 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Buffer">
12276 <summary>Packet that needs to be sent</summary>
12277 </member>
12278 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.SequenceNumber">
12279 <summary>Sequence number of the wrapped packet</summary>
12280 </member>
12281 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.ResendCount">
12282 <summary>Number of times this packet has been resent</summary>
12283 </member>
12284 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.TickCount">
12285 <summary>Environment.TickCount when this packet was last sent over the wire</summary>
12286 </member>
12287 <member name="F:OpenMetaverse.NetworkManager.OutgoingPacket.Type">
12288 <summary>Type of the packet</summary>
12289 </member>
12290 <member name="T:OpenMetaverse.NetworkManager.LoginResponseCallback">
12291 <summary> 11946 <summary>
11947
12292 </summary> 11948 </summary>
12293 <param name="loginSuccess">
12294 </param>
12295 <param name="redirect">
12296 </param>
12297 <param name="replyData">
12298 </param>
12299 <param name="message">
12300 </param>
12301 <param name="reason">
12302 </param>
12303 </member>
12304 <member name="F:OpenMetaverse.NetworkManager.m_LoginProgress">
12305 <summary>The event subscribers, null of no subscribers</summary>
12306 </member>
12307 <member name="F:OpenMetaverse.NetworkManager.m_LoginProgressLock">
12308 <summary>Thread sync lock object</summary>
12309 </member>
12310 <member name="F:OpenMetaverse.NetworkManager.LoginSeedCapability">
12311 <summary>Seed CAPS URL returned from the login server</summary>
12312 </member>
12313 <member name="F:OpenMetaverse.NetworkManager.MaxAgentGroups">
12314 <summary>Maximum number of groups an agent can belong to, -1 for unlimited</summary>
12315 </member>
12316 <member name="F:OpenMetaverse.NetworkManager.XMPPHost">
12317 <summary>XMPP server to connect to for Group chat and IM services</summary>
12318 </member>
12319 <member name="F:OpenMetaverse.NetworkManager.UDPBlacklist">
12320 <summary>A list of packets obtained during the login process which
12321 networkmanager will log but not process</summary>
12322 </member> 11949 </member>
12323 <member name="F:OpenMetaverse.NetworkManager.m_PacketSent"> 11950 <member name="F:OpenMetaverse.AssetManager.TRANSFER_HEADER_TIMEOUT">
12324 <summary>The event subscribers, null of no subscribers</summary> 11951 <summary>Number of milliseconds to wait for a transfer header packet if out of order data was received</summary>
12325 </member> 11952 </member>
12326 <member name="F:OpenMetaverse.NetworkManager.m_PacketSentLock"> 11953 <member name="F:OpenMetaverse.AssetManager.m_XferReceivedEvent">
12327 <summary>Thread sync lock object</summary> 11954 <summary>The event subscribers. null if no subcribers</summary>
12328 </member> 11955 </member>
12329 <member name="F:OpenMetaverse.NetworkManager.m_LoggedOut"> 11956 <member name="M:OpenMetaverse.AssetManager.OnXferReceived(OpenMetaverse.XferReceivedEventArgs)">
12330 <summary>The event subscribers, null of no subscribers</summary> 11957 <summary>Raises the XferReceived event</summary>
11958 <param name="e">A XferReceivedEventArgs object containing the
11959 data returned from the simulator</param>
12331 </member> 11960 </member>
12332 <member name="F:OpenMetaverse.NetworkManager.m_LoggedOutLock"> 11961 <member name="F:OpenMetaverse.AssetManager.m_XferReceivedLock">
12333 <summary>Thread sync lock object</summary> 11962 <summary>Thread sync lock object</summary>
12334 </member> 11963 </member>
12335 <member name="F:OpenMetaverse.NetworkManager.m_SimConnecting"> 11964 <member name="F:OpenMetaverse.AssetManager.m_AssetUploadedEvent">
12336 <summary>The event subscribers, null of no subscribers</summary> 11965 <summary>The event subscribers. null if no subcribers</summary>
12337 </member>
12338 <member name="F:OpenMetaverse.NetworkManager.m_SimConnectingLock">
12339 <summary>Thread sync lock object</summary>
12340 </member> 11966 </member>
12341 <member name="F:OpenMetaverse.NetworkManager.m_SimConnected"> 11967 <member name="M:OpenMetaverse.AssetManager.OnAssetUploaded(OpenMetaverse.AssetUploadEventArgs)">
12342 <summary>The event subscribers, null of no subscribers</summary> 11968 <summary>Raises the AssetUploaded event</summary>
11969 <param name="e">A AssetUploadedEventArgs object containing the
11970 data returned from the simulator</param>
12343 </member> 11971 </member>
12344 <member name="F:OpenMetaverse.NetworkManager.m_SimConnectedLock"> 11972 <member name="F:OpenMetaverse.AssetManager.m_AssetUploadedLock">
12345 <summary>Thread sync lock object</summary> 11973 <summary>Thread sync lock object</summary>
12346 </member> 11974 </member>
12347 <member name="F:OpenMetaverse.NetworkManager.m_SimDisconnected"> 11975 <member name="F:OpenMetaverse.AssetManager.m_UploadProgressEvent">
12348 <summary>The event subscribers, null of no subscribers</summary> 11976 <summary>The event subscribers. null if no subcribers</summary>
12349 </member>
12350 <member name="F:OpenMetaverse.NetworkManager.m_SimDisconnectedLock">
12351 <summary>Thread sync lock object</summary>
12352 </member> 11977 </member>
12353 <member name="F:OpenMetaverse.NetworkManager.m_Disconnected"> 11978 <member name="M:OpenMetaverse.AssetManager.OnUploadProgress(OpenMetaverse.AssetUploadEventArgs)">
12354 <summary>The event subscribers, null of no subscribers</summary> 11979 <summary>Raises the UploadProgress event</summary>
11980 <param name="e">A UploadProgressEventArgs object containing the
11981 data returned from the simulator</param>
12355 </member> 11982 </member>
12356 <member name="F:OpenMetaverse.NetworkManager.m_DisconnectedLock"> 11983 <member name="F:OpenMetaverse.AssetManager.m_UploadProgressLock">
12357 <summary>Thread sync lock object</summary> 11984 <summary>Thread sync lock object</summary>
12358 </member> 11985 </member>
12359 <member name="F:OpenMetaverse.NetworkManager.m_SimChanged"> 11986 <member name="F:OpenMetaverse.AssetManager.m_InitiateDownloadEvent">
12360 <summary>The event subscribers, null of no subscribers</summary> 11987 <summary>The event subscribers. null if no subcribers</summary>
12361 </member>
12362 <member name="F:OpenMetaverse.NetworkManager.m_SimChangedLock">
12363 <summary>Thread sync lock object</summary>
12364 </member> 11988 </member>
12365 <member name="F:OpenMetaverse.NetworkManager.m_EventQueueRunning"> 11989 <member name="M:OpenMetaverse.AssetManager.OnInitiateDownload(OpenMetaverse.InitiateDownloadEventArgs)">
12366 <summary>The event subscribers, null of no subscribers</summary> 11990 <summary>Raises the InitiateDownload event</summary>
11991 <param name="e">A InitiateDownloadEventArgs object containing the
11992 data returned from the simulator</param>
12367 </member> 11993 </member>
12368 <member name="F:OpenMetaverse.NetworkManager.m_EventQueueRunningLock"> 11994 <member name="F:OpenMetaverse.AssetManager.m_InitiateDownloadLock">
12369 <summary>Thread sync lock object</summary> 11995 <summary>Thread sync lock object</summary>
12370 </member> 11996 </member>
12371 <member name="F:OpenMetaverse.NetworkManager.Simulators"> 11997 <member name="F:OpenMetaverse.AssetManager.m_ImageReceiveProgressEvent">
12372 <summary>All of the simulators we are currently connected to</summary> 11998 <summary>The event subscribers. null if no subcribers</summary>
12373 </member>
12374 <member name="F:OpenMetaverse.NetworkManager.CapsEvents">
12375 <summary>Handlers for incoming capability events</summary>
12376 </member>
12377 <member name="F:OpenMetaverse.NetworkManager.PacketEvents">
12378 <summary>Handlers for incoming packets</summary>
12379 </member>
12380 <member name="F:OpenMetaverse.NetworkManager.PacketInbox">
12381 <summary>Incoming packets that are awaiting handling</summary>
12382 </member>
12383 <member name="F:OpenMetaverse.NetworkManager.PacketOutbox">
12384 <summary>Outgoing packets that are awaiting handling</summary>
12385 </member>
12386 <member name="E:OpenMetaverse.NetworkManager.LoginProgress">
12387 <summary>Raised when the simulator sends us data containing
12388 ...</summary>
12389 </member>
12390 <member name="E:OpenMetaverse.NetworkManager.OnLoginResponse">
12391 <summary>Called when a reply is received from the login server, the
12392 login sequence will block until this event returns</summary>
12393 </member>
12394 <member name="E:OpenMetaverse.NetworkManager.PacketSent">
12395 <summary>Raised when the simulator sends us data containing
12396 ...</summary>
12397 </member>
12398 <member name="E:OpenMetaverse.NetworkManager.LoggedOut">
12399 <summary>Raised when the simulator sends us data containing
12400 ...</summary>
12401 </member>
12402 <member name="E:OpenMetaverse.NetworkManager.SimConnecting">
12403 <summary>Raised when the simulator sends us data containing
12404 ...</summary>
12405 </member>
12406 <member name="E:OpenMetaverse.NetworkManager.SimConnected">
12407 <summary>Raised when the simulator sends us data containing
12408 ...</summary>
12409 </member>
12410 <member name="E:OpenMetaverse.NetworkManager.SimDisconnected">
12411 <summary>Raised when the simulator sends us data containing
12412 ...</summary>
12413 </member>
12414 <member name="E:OpenMetaverse.NetworkManager.Disconnected">
12415 <summary>Raised when the simulator sends us data containing
12416 ...</summary>
12417 </member>
12418 <member name="E:OpenMetaverse.NetworkManager.SimChanged">
12419 <summary>Raised when the simulator sends us data containing
12420 ...</summary>
12421 </member>
12422 <member name="E:OpenMetaverse.NetworkManager.EventQueueRunning">
12423 <summary>Raised when the simulator sends us data containing
12424 ...</summary>
12425 </member>
12426 <member name="P:OpenMetaverse.NetworkManager.LoginStatusCode">
12427 <summary>Current state of logging in</summary>
12428 </member>
12429 <member name="P:OpenMetaverse.NetworkManager.LoginErrorKey">
12430 <summary>Upon login failure, contains a short string key for the
12431 type of login error that occurred</summary>
12432 </member>
12433 <member name="P:OpenMetaverse.NetworkManager.RawLoginReply">
12434 <summary>The raw XML-RPC reply from the login server, exactly as it
12435 was received (minus the HTTP header)</summary>
12436 </member>
12437 <member name="P:OpenMetaverse.NetworkManager.LoginMessage">
12438 <summary>During login this contains a descriptive version of
12439 LoginStatusCode. After a successful login this will contain the
12440 message of the day, and after a failed login a descriptive error
12441 message will be returned</summary>
12442 </member>
12443 <member name="P:OpenMetaverse.NetworkManager.CircuitCode">
12444 <summary>Unique identifier associated with our connections to
12445 simulators</summary>
12446 </member>
12447 <member name="P:OpenMetaverse.NetworkManager.CurrentSim">
12448 <summary>The simulator that the logged in avatar is currently
12449 occupying</summary>
12450 </member>
12451 <member name="P:OpenMetaverse.NetworkManager.Connected">
12452 <summary>Shows whether the network layer is logged in to the
12453 grid or not</summary>
12454 </member>
12455 <member name="P:OpenMetaverse.NetworkManager.InboxCount">
12456 <summary>Number of packets in the incoming queue</summary>
12457 </member>
12458 <member name="P:OpenMetaverse.NetworkManager.OutboxCount">
12459 <summary>Number of packets in the outgoing queue</summary>
12460 </member>
12461 <member name="M:OpenMetaverse.NetworkManager.OnLoginProgress(OpenMetaverse.LoginProgressEventArgs)">
12462 <summary>Raises the LoginProgress Event</summary>
12463 <param name="e">A LoginProgressEventArgs object containing
12464 the data sent from the simulator</param>
12465 </member>
12466 <member name="M:OpenMetaverse.NetworkManager.DefaultLoginParams(System.String,System.String,System.String,System.String,System.String)">
12467 <summary>
12468 Generate sane default values for a login request
12469 </summary>
12470 <param name="firstName">Account first name</param>
12471 <param name="lastName">Account last name</param>
12472 <param name="password">Account password</param>
12473 <param name="userAgent">Client application name</param>
12474 <param name="userVersion">Client application version</param>
12475 <returns>A populated <seealso cref="T:OpenMetaverse.LoginParams" /> struct containing
12476 sane defaults</returns>
12477 </member>
12478 <member name="M:OpenMetaverse.NetworkManager.Login(System.String,System.String,System.String,System.String,System.String)">
12479 <summary>
12480 Simplified login that takes the most common and required fields
12481 </summary>
12482 <param name="firstName">Account first name</param>
12483 <param name="lastName">Account last name</param>
12484 <param name="password">Account password</param>
12485 <param name="userAgent">Client application name</param>
12486 <param name="userVersion">Client application version</param>
12487 <returns>Whether the login was successful or not. On failure the
12488 LoginErrorKey string will contain the error code and LoginMessage
12489 will contain a description of the error</returns>
12490 </member>
12491 <member name="M:OpenMetaverse.NetworkManager.Login(System.String,System.String,System.String,System.String,System.String,System.String)">
12492 <summary>
12493 Simplified login that takes the most common fields along with a
12494 starting location URI, and can accept an MD5 string instead of a
12495 plaintext password
12496 </summary>
12497 <param name="firstName">Account first name</param>
12498 <param name="lastName">Account last name</param>
12499 <param name="password">Account password or MD5 hash of the password
12500 such as $1$1682a1e45e9f957dcdf0bb56eb43319c</param>
12501 <param name="userAgent">Client application name</param>
12502 <param name="start">Starting location URI that can be built with
12503 StartLocation()</param>
12504 <param name="userVersion">Client application version</param>
12505 <returns>Whether the login was successful or not. On failure the
12506 LoginErrorKey string will contain the error code and LoginMessage
12507 will contain a description of the error</returns>
12508 </member> 11999 </member>
12509 <member name="M:OpenMetaverse.NetworkManager.Login(OpenMetaverse.LoginParams)"> 12000 <member name="M:OpenMetaverse.AssetManager.OnImageReceiveProgress(OpenMetaverse.ImageReceiveProgressEventArgs)">
12510 <summary> 12001 <summary>Raises the ImageReceiveProgress event</summary>
12511 Login that takes a struct of all the values that will be passed to 12002 <param name="e">A ImageReceiveProgressEventArgs object containing the
12512 the login server 12003 data returned from the simulator</param>
12513 </summary>
12514 <param name="loginParams">The values that will be passed to the login
12515 server, all fields must be set even if they are String.Empty</param>
12516 <returns>Whether the login was successful or not. On failure the
12517 LoginErrorKey string will contain the error code and LoginMessage
12518 will contain a description of the error</returns>
12519 </member> 12004 </member>
12520 <member name="M:OpenMetaverse.NetworkManager.StartLocation(System.String,System.Int32,System.Int32,System.Int32)"> 12005 <member name="F:OpenMetaverse.AssetManager.m_ImageReceiveProgressLock">
12521 <summary> 12006 <summary>Thread sync lock object</summary>
12522 Build a start location URI for passing to the Login function
12523 </summary>
12524 <param name="sim">Name of the simulator to start in</param>
12525 <param name="x">X coordinate to start at</param>
12526 <param name="y">Y coordinate to start at</param>
12527 <param name="z">Z coordinate to start at</param>
12528 <returns>String with a URI that can be used to login to a specified
12529 location</returns>
12530 </member> 12007 </member>
12531 <member name="M:OpenMetaverse.NetworkManager.RemoteLoginHandler(OpenMetaverse.LoginResponseData,OpenMetaverse.LoginParams)"> 12008 <member name="F:OpenMetaverse.AssetManager.Cache">
12532 <summary> 12009 <summary>Texture download cache</summary>
12533 LoginParams and the initial login XmlRpcRequest were made on a remote machine.
12534 This method now initializes libomv with the results.
12535 </summary>
12536 </member> 12010 </member>
12537 <member name="M:OpenMetaverse.NetworkManager.LoginReplyXmlRpcHandler(Nwc.XmlRpc.XmlRpcResponse,OpenMetaverse.LoginParams)"> 12011 <member name="M:OpenMetaverse.AssetManager.#ctor(OpenMetaverse.GridClient)">
12538 <summary> 12012 <summary>
12539 Handles response from XML-RPC login replies 12013 Default constructor
12540 </summary> 12014 </summary>
12015 <param name="client">A reference to the GridClient object</param>
12541 </member> 12016 </member>
12542 <member name="M:OpenMetaverse.NetworkManager.LoginReplyXmlRpcHandler(OpenMetaverse.LoginResponseData,OpenMetaverse.LoginParams)"> 12017 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.AssetManager.AssetReceivedCallback)">
12543 <summary> 12018 <summary>
12544 Handles response from XML-RPC login replies with already parsed LoginResponseData 12019 Request an asset download
12545 </summary> 12020 </summary>
12021 <param name="assetID">Asset UUID</param>
12022 <param name="type">Asset type, must be correct for the transfer to succeed</param>
12023 <param name="priority">Whether to give this transfer an elevated priority</param>
12024 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
12546 </member> 12025 </member>
12547 <member name="M:OpenMetaverse.NetworkManager.LoginReplyLLSDHandler(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)"> 12026 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.SourceType,OpenMetaverse.AssetManager.AssetReceivedCallback)">
12548 <summary> 12027 <summary>
12549 Handle response from LLSD login replies 12028 Request an asset download
12550 </summary> 12029 </summary>
12551 <param name="client"> 12030 <param name="assetID">Asset UUID</param>
12552 </param> 12031 <param name="type">Asset type, must be correct for the transfer to succeed</param>
12553 <param name="result"> 12032 <param name="priority">Whether to give this transfer an elevated priority</param>
12554 </param> 12033 <param name="sourceType">Source location of the requested asset</param>
12555 <param name="error"> 12034 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
12556 </param>
12557 </member> 12035 </member>
12558 <member name="M:OpenMetaverse.NetworkManager.GetPlatform"> 12036 <member name="M:OpenMetaverse.AssetManager.RequestAsset(OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.SourceType,OpenMetaverse.UUID,OpenMetaverse.AssetManager.AssetReceivedCallback)">
12559 <summary> 12037 <summary>
12560 Get current OS 12038 Request an asset download
12561 </summary> 12039 </summary>
12562 <returns>Either "Win" or "Linux"</returns> 12040 <param name="assetID">Asset UUID</param>
12041 <param name="type">Asset type, must be correct for the transfer to succeed</param>
12042 <param name="priority">Whether to give this transfer an elevated priority</param>
12043 <param name="sourceType">Source location of the requested asset</param>
12044 <param name="transactionID">UUID of the transaction</param>
12045 <param name="callback">The callback to fire when the simulator responds with the asset data</param>
12563 </member> 12046 </member>
12564 <member name="M:OpenMetaverse.NetworkManager.GetMAC"> 12047 <member name="M:OpenMetaverse.AssetManager.RequestAssetXfer(System.String,System.Boolean,System.Boolean,OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean)">
12565 <summary> 12048 <summary>
12566 Get clients default Mac Address 12049 Request an asset download through the almost deprecated Xfer system
12567 </summary> 12050 </summary>
12568 <returns>A string containing the first found Mac Address</returns> 12051 <param name="filename">Filename of the asset to request</param>
12569 </member> 12052 <param name="deleteOnCompletion">Whether or not to delete the asset
12570 <member name="M:OpenMetaverse.NetworkManager.OnPacketSent(OpenMetaverse.PacketSentEventArgs)"> 12053 off the server after it is retrieved</param>
12571 <summary>Raises the PacketSent Event</summary> 12054 <param name="useBigPackets">Use large transfer packets or not</param>
12572 <param name="e">A PacketSentEventArgs object containing 12055 <param name="vFileID">UUID of the file to request, if filename is
12573 the data sent from the simulator</param> 12056 left empty</param>
12574 </member> 12057 <param name="vFileType">Asset type of <code>vFileID</code>, or
12575 <member name="M:OpenMetaverse.NetworkManager.OnLoggedOut(OpenMetaverse.LoggedOutEventArgs)"> 12058 <code>AssetType.Unknown</code> if filename is not empty</param>
12576 <summary>Raises the LoggedOut Event</summary> 12059 <param name="fromCache">Sets the FilePath in the request to Cache
12577 <param name="e">A LoggedOutEventArgs object containing 12060 (4) if true, otherwise Unknown (0) is used</param>
12578 the data sent from the simulator</param> 12061 <returns></returns>
12579 </member>
12580 <member name="M:OpenMetaverse.NetworkManager.OnSimConnecting(OpenMetaverse.SimConnectingEventArgs)">
12581 <summary>Raises the SimConnecting Event</summary>
12582 <param name="e">A SimConnectingEventArgs object containing
12583 the data sent from the simulator</param>
12584 </member>
12585 <member name="M:OpenMetaverse.NetworkManager.OnSimConnected(OpenMetaverse.SimConnectedEventArgs)">
12586 <summary>Raises the SimConnected Event</summary>
12587 <param name="e">A SimConnectedEventArgs object containing
12588 the data sent from the simulator</param>
12589 </member>
12590 <member name="M:OpenMetaverse.NetworkManager.OnSimDisconnected(OpenMetaverse.SimDisconnectedEventArgs)">
12591 <summary>Raises the SimDisconnected Event</summary>
12592 <param name="e">A SimDisconnectedEventArgs object containing
12593 the data sent from the simulator</param>
12594 </member>
12595 <member name="M:OpenMetaverse.NetworkManager.OnDisconnected(OpenMetaverse.DisconnectedEventArgs)">
12596 <summary>Raises the Disconnected Event</summary>
12597 <param name="e">A DisconnectedEventArgs object containing
12598 the data sent from the simulator</param>
12599 </member>
12600 <member name="M:OpenMetaverse.NetworkManager.OnSimChanged(OpenMetaverse.SimChangedEventArgs)">
12601 <summary>Raises the SimChanged Event</summary>
12602 <param name="e">A SimChangedEventArgs object containing
12603 the data sent from the simulator</param>
12604 </member>
12605 <member name="M:OpenMetaverse.NetworkManager.OnEventQueueRunning(OpenMetaverse.EventQueueRunningEventArgs)">
12606 <summary>Raises the EventQueueRunning Event</summary>
12607 <param name="e">A EventQueueRunningEventArgs object containing
12608 the data sent from the simulator</param>
12609 </member> 12062 </member>
12610 <member name="M:OpenMetaverse.NetworkManager.RegisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})"> 12063 <member name="M:OpenMetaverse.AssetManager.RequestInventoryAsset(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.AssetType,System.Boolean,OpenMetaverse.AssetManager.AssetReceivedCallback)">
12611 <summary> 12064 <summary>
12612 Register an event handler for a packet. This is a low level event 12065
12613 interface and should only be used if you are doing something not
12614 supported in the library
12615 </summary> 12066 </summary>
12616 <param name="type">Packet type to trigger events for</param> 12067 <param name="assetID">Use UUID.Zero if you do not have the
12617 <param name="callback">Callback to fire when a packet of this type 12068 asset ID but have all the necessary permissions</param>
12618 is received</param> 12069 <param name="itemID">The item ID of this asset in the inventory</param>
12070 <param name="taskID">Use UUID.Zero if you are not requesting an
12071 asset from an object inventory</param>
12072 <param name="ownerID">The owner of this asset</param>
12073 <param name="type">Asset type</param>
12074 <param name="priority">Whether to prioritize this asset download or not</param>
12075 <param name="callback"></param>
12619 </member> 12076 </member>
12620 <member name="M:OpenMetaverse.NetworkManager.RegisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs},System.Boolean)"> 12077 <member name="M:OpenMetaverse.AssetManager.SetPendingAssetUploadData(OpenMetaverse.AssetUpload)">
12621 <summary> 12078 <summary>
12622 Register an event handler for a packet. This is a low level event 12079 Used to force asset data into the PendingUpload property, ie: for raw terrain uploads
12623 interface and should only be used if you are doing something not
12624 supported in the library
12625 </summary> 12080 </summary>
12626 <param name="type">Packet type to trigger events for</param> 12081 <param name="assetData">An AssetUpload object containing the data to upload to the simulator</param>
12627 <param name="callback">Callback to fire when a packet of this type
12628 is received</param>
12629 <param name="isAsync">True if the callback should be ran
12630 asynchronously. Only set this to false (synchronous for callbacks
12631 that will always complete quickly)</param>
12632 <remarks>If any callback for a packet type is marked as
12633 asynchronous, all callbacks for that packet type will be fired
12634 asynchronously</remarks>
12635 </member> 12082 </member>
12636 <member name="M:OpenMetaverse.NetworkManager.UnregisterCallback(OpenMetaverse.Packets.PacketType,System.EventHandler{OpenMetaverse.PacketReceivedEventArgs})"> 12083 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.Assets.Asset,System.Boolean)">
12637 <summary> 12084 <summary>
12638 Unregister an event handler for a packet. This is a low level event 12085 Request an asset be uploaded to the simulator
12639 interface and should only be used if you are doing something not
12640 supported in the library
12641 </summary> 12086 </summary>
12642 <param name="type">Packet type this callback is registered with</param> 12087 <param name="asset">The <seealso cref="T:OpenMetaverse.Assets.Asset"/> Object containing the asset data</param>
12643 <param name="callback">Callback to stop firing events for</param> 12088 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
12089 in which the client was connected in addition to being stored on the asset server</param>
12090 <returns>The <seealso cref="T:OpenMetaverse.UUID"/> of the transfer, can be used to correlate the upload with
12091 events being fired</returns>
12644 </member> 12092 </member>
12645 <member name="M:OpenMetaverse.NetworkManager.RegisterEventCallback(System.String,OpenMetaverse.Caps.EventQueueCallback)"> 12093 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.AssetType,System.Byte[],System.Boolean)">
12646 <summary> 12094 <summary>
12647 Register a CAPS event handler. This is a low level event interface 12095 Request an asset be uploaded to the simulator
12648 and should only be used if you are doing something not supported in
12649 the library
12650 </summary> 12096 </summary>
12651 <param name="capsEvent">Name of the CAPS event to register a handler for</param> 12097 <param name="type">The <seealso cref="T:OpenMetaverse.AssetType"/> of the asset being uploaded</param>
12652 <param name="callback">Callback to fire when a CAPS event is received</param> 12098 <param name="data">A byte array containing the encoded asset data</param>
12099 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
12100 in which the client was connected in addition to being stored on the asset server</param>
12101 <returns>The <seealso cref="T:OpenMetaverse.UUID"/> of the transfer, can be used to correlate the upload with
12102 events being fired</returns>
12653 </member> 12103 </member>
12654 <member name="M:OpenMetaverse.NetworkManager.UnregisterEventCallback(System.String,OpenMetaverse.Caps.EventQueueCallback)"> 12104 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.UUID@,OpenMetaverse.AssetType,System.Byte[],System.Boolean)">
12655 <summary> 12105 <summary>
12656 Unregister a CAPS event handler. This is a low level event interface 12106 Request an asset be uploaded to the simulator
12657 and should only be used if you are doing something not supported in
12658 the library
12659 </summary> 12107 </summary>
12660 <param name="capsEvent">Name of the CAPS event this callback is 12108 <param name="assetID"></param>
12661 registered with</param> 12109 <param name="type">Asset type to upload this data as</param>
12662 <param name="callback">Callback to stop firing events for</param> 12110 <param name="data">A byte array containing the encoded asset data</param>
12111 <param name="storeLocal">If True, the asset once uploaded will be stored on the simulator
12112 in which the client was connected in addition to being stored on the asset server</param>
12113 <returns>The <seealso cref="T:OpenMetaverse.UUID"/> of the transfer, can be used to correlate the upload with
12114 events being fired</returns>
12663 </member> 12115 </member>
12664 <member name="M:OpenMetaverse.NetworkManager.SendPacket(OpenMetaverse.Packets.Packet)"> 12116 <member name="M:OpenMetaverse.AssetManager.RequestUpload(OpenMetaverse.UUID@,OpenMetaverse.AssetType,System.Byte[],System.Boolean,OpenMetaverse.UUID)">
12665 <summary> 12117 <summary>
12666 Send a packet to the simulator the avatar is currently occupying 12118 Initiate an asset upload
12667 </summary> 12119 </summary>
12668 <param name="packet">Packet to send</param> 12120 <param name="assetID">The ID this asset will have if the
12121 upload succeeds</param>
12122 <param name="type">Asset type to upload this data as</param>
12123 <param name="data">Raw asset data to upload</param>
12124 <param name="storeLocal">Whether to store this asset on the local
12125 simulator or the grid-wide asset server</param>
12126 <param name="transactionID">The tranaction id for the upload <see cref="!:RequestCreateItem"/></param>
12127 <returns>The transaction ID of this transfer</returns>
12669 </member> 12128 </member>
12670 <member name="M:OpenMetaverse.NetworkManager.SendPacket(OpenMetaverse.Packets.Packet,OpenMetaverse.Simulator)"> 12129 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32,OpenMetaverse.TextureDownloadCallback,System.Boolean)">
12671 <summary> 12130 <summary>
12672 Send a packet to a specified simulator 12131 Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline"/> system to
12673 </summary> 12132 manage the requests and re-assemble the image from the packets received from the simulator
12674 <param name="packet">Packet to send</param> 12133 </summary>
12675 <param name="simulator">Simulator to send the packet to</param> 12134 <param name="textureID">The <see cref="T:OpenMetaverse.UUID"/> of the texture asset to download</param>
12135 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType"/> of the texture asset.
12136 Use <see cref="F:OpenMetaverse.ImageType.Normal"/> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked"/> for baked layer texture assets</param>
12137 <param name="priority">A float indicating the requested priority for the transfer. Higher priority values tell the simulator
12138 to prioritize the request before lower valued requests. An image already being transferred using the <see cref="T:OpenMetaverse.TexturePipeline"/> can have
12139 its priority changed by resending the request with the new priority value</param>
12140 <param name="discardLevel">Number of quality layers to discard.
12141 This controls the end marker of the data sent. Sending with value -1 combined with priority of 0 cancels an in-progress
12142 transfer.</param>
12143 <remarks>A bug exists in the Linden Simulator where a -1 will occasionally be sent with a non-zero priority
12144 indicating an off-by-one error.</remarks>
12145 <param name="packetStart">The packet number to begin the request at. A value of 0 begins the request
12146 from the start of the asset texture</param>
12147 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback"/> callback to fire when the image is retrieved. The callback
12148 will contain the result of the request and the texture asset data</param>
12149 <param name="progress">If true, the callback will be fired for each chunk of the downloaded image.
12150 The callback asset parameter will contain all previously received chunks of the texture asset starting
12151 from the beginning of the request</param>
12152 <example>
12153 Request an image and fire a callback when the request is complete
12154 <code>
12155 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished);
12156
12157 private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset)
12158 {
12159 if(state == TextureRequestState.Finished)
12160 {
12161 Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded",
12162 asset.AssetID,
12163 asset.AssetData.Length);
12164 }
12165 }
12166 </code>
12167 Request an image and use an inline anonymous method to handle the downloaded texture data
12168 <code>
12169 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, delegate(TextureRequestState state, AssetTexture asset)
12170 {
12171 if(state == TextureRequestState.Finished)
12172 {
12173 Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded",
12174 asset.AssetID,
12175 asset.AssetData.Length);
12176 }
12177 }
12178 );
12179 </code>
12180 Request a texture, decode the texture to a bitmap image and apply it to a imagebox
12181 <code>
12182 Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished);
12183
12184 private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset)
12185 {
12186 if(state == TextureRequestState.Finished)
12187 {
12188 ManagedImage imgData;
12189 Image bitmap;
12190
12191 if (state == TextureRequestState.Finished)
12192 {
12193 OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgData, out bitmap);
12194 picInsignia.Image = bitmap;
12195 }
12196 }
12197 }
12198 </code>
12199 </example>
12676 </member> 12200 </member>
12677 <member name="M:OpenMetaverse.NetworkManager.Connect(System.Net.IPAddress,System.UInt16,System.UInt64,System.Boolean,System.String)"> 12201 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.TextureDownloadCallback)">
12678 <summary> 12202 <summary>
12679 Connect to a simulator 12203 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline"/> system to
12204 manage the requests and re-assemble the image from the packets received from the simulator
12680 </summary> 12205 </summary>
12681 <param name="ip">IP address to connect to</param> 12206 <param name="textureID">The <see cref="T:OpenMetaverse.UUID"/> of the texture asset to download</param>
12682 <param name="port">Port to connect to</param> 12207 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback"/> callback to fire when the image is retrieved. The callback
12683 <param name="handle">Handle for this simulator, to identify its 12208 will contain the result of the request and the texture asset data</param>
12684 location in the grid</param>
12685 <param name="setDefault">Whether to set CurrentSim to this new
12686 connection, use this if the avatar is moving in to this simulator</param>
12687 <param name="seedcaps">URL of the capabilities server to use for
12688 this sim connection</param>
12689 <returns>A Simulator object on success, otherwise null</returns>
12690 </member> 12209 </member>
12691 <member name="M:OpenMetaverse.NetworkManager.Connect(System.Net.IPEndPoint,System.UInt64,System.Boolean,System.String)"> 12210 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,OpenMetaverse.TextureDownloadCallback)">
12692 <summary> 12211 <summary>
12693 Connect to a simulator 12212 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline"/> system to
12213 manage the requests and re-assemble the image from the packets received from the simulator
12694 </summary> 12214 </summary>
12695 <param name="endPoint">IP address and port to connect to</param> 12215 <param name="textureID">The <see cref="T:OpenMetaverse.UUID"/> of the texture asset to download</param>
12696 <param name="handle">Handle for this simulator, to identify its 12216 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType"/> of the texture asset.
12697 location in the grid</param> 12217 Use <see cref="F:OpenMetaverse.ImageType.Normal"/> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked"/> for baked layer texture assets</param>
12698 <param name="setDefault">Whether to set CurrentSim to this new 12218 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback"/> callback to fire when the image is retrieved. The callback
12699 connection, use this if the avatar is moving in to this simulator</param> 12219 will contain the result of the request and the texture asset data</param>
12700 <param name="seedcaps">URL of the capabilities server to use for
12701 this sim connection</param>
12702 <returns>A Simulator object on success, otherwise null</returns>
12703 </member> 12220 </member>
12704 <member name="M:OpenMetaverse.NetworkManager.Logout"> 12221 <member name="M:OpenMetaverse.AssetManager.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,OpenMetaverse.TextureDownloadCallback,System.Boolean)">
12705 <summary> 12222 <summary>
12706 Initiate a blocking logout request. This will return when the logout 12223 Overload: Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline"/> system to
12707 handshake has completed or when <code>Settings.LOGOUT_TIMEOUT</code> 12224 manage the requests and re-assemble the image from the packets received from the simulator
12708 has expired and the network layer is manually shut down
12709 </summary> 12225 </summary>
12226 <param name="textureID">The <see cref="T:OpenMetaverse.UUID"/> of the texture asset to download</param>
12227 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType"/> of the texture asset.
12228 Use <see cref="F:OpenMetaverse.ImageType.Normal"/> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked"/> for baked layer texture assets</param>
12229 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback"/> callback to fire when the image is retrieved. The callback
12230 will contain the result of the request and the texture asset data</param>
12231 <param name="progress">If true, the callback will be fired for each chunk of the downloaded image.
12232 The callback asset parameter will contain all previously received chunks of the texture asset starting
12233 from the beginning of the request</param>
12710 </member> 12234 </member>
12711 <member name="M:OpenMetaverse.NetworkManager.RequestLogout"> 12235 <member name="M:OpenMetaverse.AssetManager.RequestImageCancel(OpenMetaverse.UUID)">
12712 <summary> 12236 <summary>
12713 Initiate the logout process. Check if logout succeeded with the 12237 Cancel a texture request
12714 <code>OnLogoutReply</code> event, and if this does not fire the
12715 <code>Shutdown()</code> function needs to be manually called
12716 </summary> 12238 </summary>
12239 <param name="textureID">The texture assets <see cref="T:OpenMetaverse.UUID"/></param>
12717 </member> 12240 </member>
12718 <member name="M:OpenMetaverse.NetworkManager.DisconnectSim(OpenMetaverse.Simulator,System.Boolean)"> 12241 <member name="M:OpenMetaverse.AssetManager.RequestMesh(OpenMetaverse.UUID,OpenMetaverse.AssetManager.MeshDownloadCallback)">
12719 <summary> 12242 <summary>
12720 Close a connection to the given simulator 12243 Requests download of a mesh asset
12721 </summary> 12244 </summary>
12722 <param name="simulator"> 12245 <param name="meshID">UUID of the mesh asset</param>
12723 </param> 12246 <param name="callback">Callback when the request completes</param>
12724 <param name="sendCloseCircuit">
12725 </param>
12726 </member>
12727 <member name="M:OpenMetaverse.NetworkManager.Shutdown(OpenMetaverse.NetworkManager.DisconnectType)">
12728 <summary>
12729 Shutdown will disconnect all the sims except for the current sim
12730 first, and then kill the connection to CurrentSim. This should only
12731 be called if the logout process times out on <code>RequestLogout</code></summary>
12732 <param name="type">Type of shutdown</param>
12733 </member>
12734 <member name="M:OpenMetaverse.NetworkManager.Shutdown(OpenMetaverse.NetworkManager.DisconnectType,System.String)">
12735 <summary>
12736 Shutdown will disconnect all the sims except for the current sim
12737 first, and then kill the connection to CurrentSim. This should only
12738 be called if the logout process times out on <code>RequestLogout</code></summary>
12739 <param name="type">Type of shutdown</param>
12740 <param name="message">Shutdown message</param>
12741 </member> 12247 </member>
12742 <member name="M:OpenMetaverse.NetworkManager.FindSimulator(System.Net.IPEndPoint)"> 12248 <member name="M:OpenMetaverse.AssetManager.RequestServerBakedImage(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.TextureDownloadCallback)">
12743 <summary> 12249 <summary>
12744 Searches through the list of currently connected simulators to find 12250 Fetach avatar texture on a grid capable of server side baking
12745 one attached to the given IPEndPoint
12746 </summary> 12251 </summary>
12747 <param name="endPoint">IPEndPoint of the Simulator to search for</param> 12252 <param name="avatarID">ID of the avatar</param>
12748 <returns>A Simulator reference on success, otherwise null</returns> 12253 <param name="textureID">ID of the texture</param>
12254 <param name="bakeName">Name of the part of the avatar texture applies to</param>
12255 <param name="callback">Callback invoked on operation completion</param>
12749 </member> 12256 </member>
12750 <member name="M:OpenMetaverse.NetworkManager.RaiseConnectedEvent(OpenMetaverse.Simulator)"> 12257 <member name="M:OpenMetaverse.AssetManager.FireImageProgressEvent(OpenMetaverse.UUID,System.Int32,System.Int32)">
12751 <summary> 12258 <summary>
12752 Fire an event when an event queue connects for capabilities 12259 Lets TexturePipeline class fire the progress event
12753 </summary> 12260 </summary>
12754 <param name="simulator">Simulator the event queue is attached to</param> 12261 <param name="texureID">The texture ID currently being downloaded</param>
12262 <param name="transferredBytes">the number of bytes transferred</param>
12263 <param name="totalBytes">the total number of bytes expected</param>
12755 </member> 12264 </member>
12756 <member name="M:OpenMetaverse.NetworkManager.LogoutReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12265 <member name="M:OpenMetaverse.AssetManager.TransferInfoHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12757 <summary>Process an incoming packet and raise the appropriate events</summary> 12266 <summary>Process an incoming packet and raise the appropriate events</summary>
12758 <param name="sender">The sender</param> 12267 <param name="sender">The sender</param>
12759 <param name="e">The EventArgs object containing the packet data</param> 12268 <param name="e">The EventArgs object containing the packet data</param>
12760 </member> 12269 </member>
12761 <member name="M:OpenMetaverse.NetworkManager.StartPingCheckHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12270 <member name="M:OpenMetaverse.AssetManager.TransferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12762 <summary>Process an incoming packet and raise the appropriate events</summary> 12271 <summary>Process an incoming packet and raise the appropriate events</summary>
12763 <param name="sender">The sender</param> 12272 <param name="sender">The sender</param>
12764 <param name="e">The EventArgs object containing the packet data</param> 12273 <param name="e">The EventArgs object containing the packet data</param>
12765 </member> 12274 </member>
12766 <member name="M:OpenMetaverse.NetworkManager.CompletePingCheckHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12275 <member name="M:OpenMetaverse.AssetManager.InitiateDownloadPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12767 <summary>Process an incoming packet and raise the appropriate events</summary> 12276 <summary>Process an incoming packet and raise the appropriate events</summary>
12768 <param name="sender">The sender</param> 12277 <param name="sender">The sender</param>
12769 <param name="e">The EventArgs object containing the packet data</param> 12278 <param name="e">The EventArgs object containing the packet data</param>
12770 </member> 12279 </member>
12771 <member name="M:OpenMetaverse.NetworkManager.SimStatsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12280 <member name="M:OpenMetaverse.AssetManager.RequestXferHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12772 <summary>Process an incoming packet and raise the appropriate events</summary> 12281 <summary>Process an incoming packet and raise the appropriate events</summary>
12773 <param name="sender">The sender</param> 12282 <param name="sender">The sender</param>
12774 <param name="e">The EventArgs object containing the packet data</param> 12283 <param name="e">The EventArgs object containing the packet data</param>
12775 </member> 12284 </member>
12776 <member name="M:OpenMetaverse.NetworkManager.RegionHandshakeHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12285 <member name="M:OpenMetaverse.AssetManager.ConfirmXferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12777 <summary>Process an incoming packet and raise the appropriate events</summary> 12286 <summary>Process an incoming packet and raise the appropriate events</summary>
12778 <param name="sender">The sender</param> 12287 <param name="sender">The sender</param>
12779 <param name="e">The EventArgs object containing the packet data</param> 12288 <param name="e">The EventArgs object containing the packet data</param>
12780 </member> 12289 </member>
12781 <member name="M:OpenMetaverse.NetworkManager.DisableSimulatorHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12290 <member name="M:OpenMetaverse.AssetManager.AssetUploadCompleteHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12782 <summary>Process an incoming packet and raise the appropriate events</summary> 12291 <summary>Process an incoming packet and raise the appropriate events</summary>
12783 <param name="sender">The sender</param> 12292 <param name="sender">The sender</param>
12784 <param name="e">The EventArgs object containing the packet data</param> 12293 <param name="e">The EventArgs object containing the packet data</param>
12785 </member> 12294 </member>
12786 <member name="M:OpenMetaverse.NetworkManager.KickUserHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12295 <member name="M:OpenMetaverse.AssetManager.SendXferPacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12787 <summary>Process an incoming packet and raise the appropriate events</summary> 12296 <summary>Process an incoming packet and raise the appropriate events</summary>
12788 <param name="sender">The sender</param> 12297 <param name="sender">The sender</param>
12789 <param name="e">The EventArgs object containing the packet data</param> 12298 <param name="e">The EventArgs object containing the packet data</param>
12790 </member> 12299 </member>
12791 <member name="T:OpenMetaverse.NameValue"> 12300 <member name="M:OpenMetaverse.AssetManager.AbortXferHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
12792 <summary> 12301 <summary>Process an incoming packet and raise the appropriate events</summary>
12793 A Name Value pair with additional settings, used in the protocol 12302 <param name="sender">The sender</param>
12794 primarily to transmit avatar names and active group in object packets 12303 <param name="e">The EventArgs object containing the packet data</param>
12795 </summary>
12796 </member>
12797 <member name="M:OpenMetaverse.NameValue.#ctor(System.String,OpenMetaverse.NameValue.ValueType,OpenMetaverse.NameValue.ClassType,OpenMetaverse.NameValue.SendtoType,System.Object)">
12798 <summary>
12799 Constructor that takes all the fields as parameters
12800 </summary>
12801 <param name="name">
12802 </param>
12803 <param name="valueType">
12804 </param>
12805 <param name="classType">
12806 </param>
12807 <param name="sendtoType">
12808 </param>
12809 <param name="value">
12810 </param>
12811 </member>
12812 <member name="M:OpenMetaverse.NameValue.#ctor(System.String)">
12813 <summary>
12814 Constructor that takes a single line from a NameValue field
12815 </summary>
12816 <param name="data">
12817 </param>
12818 </member>
12819 <member name="T:OpenMetaverse.NameValue.ValueType">
12820 <summary>Type of the value</summary>
12821 </member>
12822 <member name="F:OpenMetaverse.NameValue.ValueType.Unknown">
12823 <summary>Unknown</summary>
12824 </member>
12825 <member name="F:OpenMetaverse.NameValue.ValueType.String">
12826 <summary>String value</summary>
12827 </member>
12828 <member name="F:OpenMetaverse.NameValue.ValueType.F32">
12829 <summary>
12830 </summary>
12831 </member>
12832 <member name="F:OpenMetaverse.NameValue.ValueType.S32">
12833 <summary>
12834 </summary>
12835 </member>
12836 <member name="F:OpenMetaverse.NameValue.ValueType.VEC3">
12837 <summary>
12838 </summary>
12839 </member>
12840 <member name="F:OpenMetaverse.NameValue.ValueType.U32">
12841 <summary>
12842 </summary>
12843 </member>
12844 <member name="F:OpenMetaverse.NameValue.ValueType.CAMERA">
12845 <summary>Deprecated</summary>
12846 </member>
12847 <member name="F:OpenMetaverse.NameValue.ValueType.Asset">
12848 <summary>String value, but designated as an asset</summary>
12849 </member>
12850 <member name="F:OpenMetaverse.NameValue.ValueType.U64">
12851 <summary>
12852 </summary>
12853 </member>
12854 <member name="T:OpenMetaverse.NameValue.ClassType">
12855 <summary>
12856 </summary>
12857 </member> 12304 </member>
12858 <member name="F:OpenMetaverse.NameValue.ClassType.Unknown"> 12305 <member name="E:OpenMetaverse.AssetManager.XferReceived">
12859 <summary> 12306 <summary>Raised when the simulator responds sends </summary>
12860 </summary>
12861 </member> 12307 </member>
12862 <member name="F:OpenMetaverse.NameValue.ClassType.ReadOnly"> 12308 <member name="E:OpenMetaverse.AssetManager.AssetUploaded">
12863 <summary> 12309 <summary>Raised during upload completes</summary>
12864 </summary>
12865 </member> 12310 </member>
12866 <member name="F:OpenMetaverse.NameValue.ClassType.ReadWrite"> 12311 <member name="E:OpenMetaverse.AssetManager.UploadProgress">
12867 <summary> 12312 <summary>Raised during upload with progres update</summary>
12868 </summary>
12869 </member> 12313 </member>
12870 <member name="F:OpenMetaverse.NameValue.ClassType.Callback"> 12314 <member name="E:OpenMetaverse.AssetManager.InitiateDownload">
12871 <summary> 12315 <summary>Fired when the simulator sends an InitiateDownloadPacket, used to download terrain .raw files</summary>
12872 </summary>
12873 </member> 12316 </member>
12874 <member name="T:OpenMetaverse.NameValue.SendtoType"> 12317 <member name="E:OpenMetaverse.AssetManager.ImageReceiveProgress">
12875 <summary> 12318 <summary>Fired when a texture is in the process of being downloaded by the TexturePipeline class</summary>
12876 </summary>
12877 </member> 12319 </member>
12878 <member name="F:OpenMetaverse.NameValue.SendtoType.Unknown"> 12320 <member name="T:OpenMetaverse.AssetManager.AssetReceivedCallback">
12879 <summary> 12321 <summary>
12322 Callback used for various asset download requests
12880 </summary> 12323 </summary>
12324 <param name="transfer">Transfer information</param>
12325 <param name="asset">Downloaded asset, null on fail</param>
12881 </member> 12326 </member>
12882 <member name="F:OpenMetaverse.NameValue.SendtoType.Sim"> 12327 <member name="T:OpenMetaverse.AssetManager.BakedTextureUploadedCallback">
12883 <summary> 12328 <summary>
12329 Callback used upon competition of baked texture upload
12884 </summary> 12330 </summary>
12331 <param name="newAssetID">Asset UUID of the newly uploaded baked texture</param>
12885 </member> 12332 </member>
12886 <member name="F:OpenMetaverse.NameValue.SendtoType.DataSim"> 12333 <member name="T:OpenMetaverse.AssetManager.MeshDownloadCallback">
12887 <summary> 12334 <summary>
12335 A callback that fires upon the completition of the RequestMesh call
12888 </summary> 12336 </summary>
12337 <param name="success">Was the download successfull</param>
12338 <param name="assetMesh">Resulting mesh or null on problems</param>
12889 </member> 12339 </member>
12890 <member name="F:OpenMetaverse.NameValue.SendtoType.SimViewer"> 12340 <member name="P:OpenMetaverse.XferReceivedEventArgs.Xfer">
12891 <summary> 12341 <summary>Xfer data</summary>
12892 </summary>
12893 </member> 12342 </member>
12894 <member name="F:OpenMetaverse.NameValue.SendtoType.DataSimViewer"> 12343 <member name="P:OpenMetaverse.AssetUploadEventArgs.Upload">
12895 <summary> 12344 <summary>Upload data</summary>
12896 </summary>
12897 </member> 12345 </member>
12898 <member name="F:OpenMetaverse.NameValue.Name"> 12346 <member name="P:OpenMetaverse.InitiateDownloadEventArgs.SimFileName">
12899 <summary> 12347 <summary>Filename used on the simulator</summary>
12900 </summary>
12901 </member> 12348 </member>
12902 <member name="F:OpenMetaverse.NameValue.Type"> 12349 <member name="P:OpenMetaverse.InitiateDownloadEventArgs.ViewerFileName">
12903 <summary> 12350 <summary>Filename used by the client</summary>
12904 </summary>
12905 </member> 12351 </member>
12906 <member name="F:OpenMetaverse.NameValue.Class"> 12352 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.ImageID">
12907 <summary> 12353 <summary>UUID of the image that is in progress</summary>
12908 </summary>
12909 </member> 12354 </member>
12910 <member name="F:OpenMetaverse.NameValue.Sendto"> 12355 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.Received">
12911 <summary> 12356 <summary>Number of bytes received so far</summary>
12912 </summary>
12913 </member> 12357 </member>
12914 <member name="F:OpenMetaverse.NameValue.Value"> 12358 <member name="P:OpenMetaverse.ImageReceiveProgressEventArgs.Total">
12915 <summary> 12359 <summary>Image size in bytes</summary>
12916 </summary>
12917 </member> 12360 </member>
12918 <member name="T:OpenMetaverse.ReportType"> 12361 <member name="T:OpenMetaverse.Assets.AssetScriptText">
12919 <summary> 12362 <summary>
12363 Represents an LSL Text object containing a string of UTF encoded characters
12920 </summary> 12364 </summary>
12921 </member> 12365 </member>
12922 <member name="F:OpenMetaverse.ReportType.None"> 12366 <member name="F:OpenMetaverse.Assets.AssetScriptText.Source">
12923 <summary>No report</summary> 12367 <summary>A string of characters represting the script contents</summary>
12924 </member>
12925 <member name="F:OpenMetaverse.ReportType.Unknown">
12926 <summary>Unknown report type</summary>
12927 </member>
12928 <member name="F:OpenMetaverse.ReportType.Bug">
12929 <summary>Bug report</summary>
12930 </member>
12931 <member name="F:OpenMetaverse.ReportType.Complaint">
12932 <summary>Complaint report</summary>
12933 </member> 12368 </member>
12934 <member name="F:OpenMetaverse.ReportType.CustomerServiceRequest"> 12369 <member name="M:OpenMetaverse.Assets.AssetScriptText.#ctor">
12935 <summary>Customer service report</summary> 12370 <summary>Initializes a new AssetScriptText object</summary>
12936 </member> 12371 </member>
12937 <member name="T:OpenMetaverse.CompressedFlags"> 12372 <member name="M:OpenMetaverse.Assets.AssetScriptText.#ctor(OpenMetaverse.UUID,System.Byte[])">
12938 <summary> 12373 <summary>
12939 Bitflag field for ObjectUpdateCompressed data blocks, describing 12374 Initializes a new AssetScriptText object with parameters
12940 which options are present for each object
12941 </summary> 12375 </summary>
12376 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
12377 <param name="assetData">A byte array containing the raw asset data</param>
12942 </member> 12378 </member>
12943 <member name="F:OpenMetaverse.CompressedFlags.ScratchPad"> 12379 <member name="M:OpenMetaverse.Assets.AssetScriptText.Encode">
12944 <summary>Unknown</summary>
12945 </member>
12946 <member name="F:OpenMetaverse.CompressedFlags.Tree">
12947 <summary>Whether the object has a TreeSpecies</summary>
12948 </member>
12949 <member name="F:OpenMetaverse.CompressedFlags.HasText">
12950 <summary>Whether the object has floating text ala llSetText</summary>
12951 </member>
12952 <member name="F:OpenMetaverse.CompressedFlags.HasParticles">
12953 <summary>Whether the object has an active particle system</summary>
12954 </member>
12955 <member name="F:OpenMetaverse.CompressedFlags.HasSound">
12956 <summary>Whether the object has sound attached to it</summary>
12957 </member>
12958 <member name="F:OpenMetaverse.CompressedFlags.HasParent">
12959 <summary>Whether the object is attached to a root object or not</summary>
12960 </member>
12961 <member name="F:OpenMetaverse.CompressedFlags.TextureAnimation">
12962 <summary>Whether the object has texture animation settings</summary>
12963 </member>
12964 <member name="F:OpenMetaverse.CompressedFlags.HasAngularVelocity">
12965 <summary>Whether the object has an angular velocity</summary>
12966 </member>
12967 <member name="F:OpenMetaverse.CompressedFlags.HasNameValues">
12968 <summary>Whether the object has a name value pairs string</summary>
12969 </member>
12970 <member name="F:OpenMetaverse.CompressedFlags.MediaURL">
12971 <summary>Whether the object has a Media URL set</summary>
12972 </member>
12973 <member name="T:OpenMetaverse.UpdateType">
12974 <summary> 12380 <summary>
12975 Specific Flags for MultipleObjectUpdate requests 12381 Encode a string containing the scripts contents into byte encoded AssetData
12976 </summary> 12382 </summary>
12977 </member> 12383 </member>
12978 <member name="F:OpenMetaverse.UpdateType.None"> 12384 <member name="M:OpenMetaverse.Assets.AssetScriptText.Decode">
12979 <summary>None</summary>
12980 </member>
12981 <member name="F:OpenMetaverse.UpdateType.Position">
12982 <summary>Change position of prims</summary>
12983 </member>
12984 <member name="F:OpenMetaverse.UpdateType.Rotation">
12985 <summary>Change rotation of prims</summary>
12986 </member>
12987 <member name="F:OpenMetaverse.UpdateType.Scale">
12988 <summary>Change size of prims</summary>
12989 </member>
12990 <member name="F:OpenMetaverse.UpdateType.Linked">
12991 <summary>Perform operation on link set</summary>
12992 </member>
12993 <member name="F:OpenMetaverse.UpdateType.Uniform">
12994 <summary>Scale prims uniformly, same as selecing ctrl+shift in the
12995 viewer. Used in conjunction with Scale</summary>
12996 </member>
12997 <member name="T:OpenMetaverse.PayPriceType">
12998 <summary> 12385 <summary>
12999 Special values in PayPriceReply. If the price is not one of these 12386 Decode a byte array containing the scripts contents into a string
13000 literal value of the price should be use
13001 </summary> 12387 </summary>
12388 <returns>true if decoding is successful</returns>
13002 </member> 12389 </member>
13003 <member name="F:OpenMetaverse.PayPriceType.Hide"> 12390 <member name="P:OpenMetaverse.Assets.AssetScriptText.AssetType">
13004 <summary> 12391 <summary>Override the base classes AssetType</summary>
13005 Indicates that this pay option should be hidden
13006 </summary>
13007 </member> 12392 </member>
13008 <member name="F:OpenMetaverse.PayPriceType.Default"> 12393 <member name="T:OpenMetaverse.Assets.AssetScriptBinary">
13009 <summary> 12394 <summary>
13010 Indicates that this pay option should have the default value 12395 Represents an AssetScriptBinary object containing the
12396 LSO compiled bytecode of an LSL script
13011 </summary> 12397 </summary>
13012 </member> 12398 </member>
13013 <member name="T:OpenMetaverse.ObjectMovementUpdate"> 12399 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.#ctor">
13014 <summary> 12400 <summary>Initializes a new instance of an AssetScriptBinary object</summary>
13015 Contains the variables sent in an object update packet for objects.
13016 Used to track position and movement of prims and avatars
13017 </summary>
13018 </member> 12401 </member>
13019 <member name="F:OpenMetaverse.ObjectMovementUpdate.Avatar"> 12402 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.#ctor(OpenMetaverse.UUID,System.Byte[])">
13020 <summary> 12403 <summary>Initializes a new instance of an AssetScriptBinary object with parameters</summary>
13021 </summary> 12404 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
12405 <param name="assetData">A byte array containing the raw asset data</param>
13022 </member> 12406 </member>
13023 <member name="F:OpenMetaverse.ObjectMovementUpdate.CollisionPlane"> 12407 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.Encode">
13024 <summary> 12408 <summary>
12409 TODO: Encodes a scripts contents into a LSO Bytecode file
13025 </summary> 12410 </summary>
13026 </member> 12411 </member>
13027 <member name="F:OpenMetaverse.ObjectMovementUpdate.State"> 12412 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.Decode">
13028 <summary> 12413 <summary>
12414 TODO: Decode LSO Bytecode into a string
13029 </summary> 12415 </summary>
12416 <returns>true</returns>
13030 </member> 12417 </member>
13031 <member name="F:OpenMetaverse.ObjectMovementUpdate.LocalID"> 12418 <member name="P:OpenMetaverse.Assets.AssetScriptBinary.AssetType">
13032 <summary> 12419 <summary>Override the base classes AssetType</summary>
13033 </summary>
13034 </member> 12420 </member>
13035 <member name="F:OpenMetaverse.ObjectMovementUpdate.Position"> 12421 <member name="T:OpenMetaverse.Assets.AssetCallingCard">
13036 <summary> 12422 <summary>
12423 Represents a Callingcard with AvatarID and Position vector
13037 </summary> 12424 </summary>
13038 </member> 12425 </member>
13039 <member name="F:OpenMetaverse.ObjectMovementUpdate.Velocity"> 12426 <member name="F:OpenMetaverse.Assets.AssetCallingCard.AvatarID">
13040 <summary> 12427 <summary>UUID of the Callingcard target avatar</summary>
13041 </summary>
13042 </member> 12428 </member>
13043 <member name="F:OpenMetaverse.ObjectMovementUpdate.Acceleration"> 12429 <member name="M:OpenMetaverse.Assets.AssetCallingCard.#ctor">
13044 <summary> 12430 <summary>Construct an Asset of type Callingcard</summary>
13045 </summary>
13046 </member> 12431 </member>
13047 <member name="F:OpenMetaverse.ObjectMovementUpdate.Rotation"> 12432 <member name="M:OpenMetaverse.Assets.AssetCallingCard.#ctor(OpenMetaverse.UUID,System.Byte[])">
13048 <summary> 12433 <summary>
12434 Construct an Asset object of type Callingcard
13049 </summary> 12435 </summary>
12436 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
12437 <param name="assetData">A byte array containing the raw asset data</param>
13050 </member> 12438 </member>
13051 <member name="F:OpenMetaverse.ObjectMovementUpdate.AngularVelocity"> 12439 <member name="M:OpenMetaverse.Assets.AssetCallingCard.#ctor(OpenMetaverse.UUID)">
13052 <summary> 12440 <summary>
12441 Constuct an asset of type Callingcard
13053 </summary> 12442 </summary>
12443 <param name="avatarID">UUID of the target avatar</param>
13054 </member> 12444 </member>
13055 <member name="F:OpenMetaverse.ObjectMovementUpdate.Textures"> 12445 <member name="M:OpenMetaverse.Assets.AssetCallingCard.Encode">
13056 <summary> 12446 <summary>
12447 Encode the raw contents of a string with the specific Callingcard format
13057 </summary> 12448 </summary>
13058 </member> 12449 </member>
13059 <member name="T:OpenMetaverse.ObjectManager"> 12450 <member name="M:OpenMetaverse.Assets.AssetCallingCard.Decode">
13060 <summary> 12451 <summary>
13061 Handles all network traffic related to prims and avatar positions and 12452 Decode the raw asset data, populating the AvatarID and Position
13062 movement.
13063 </summary> 12453 </summary>
12454 <returns>true if the AssetData was successfully decoded to a UUID and Vector</returns>
13064 </member> 12455 </member>
13065 <member name="M:OpenMetaverse.ObjectManager.#ctor(OpenMetaverse.GridClient)"> 12456 <member name="P:OpenMetaverse.Assets.AssetCallingCard.AssetType">
13066 <summary> 12457 <summary>Override the base classes AssetType</summary>
13067 Construct a new instance of the ObjectManager class
13068 </summary>
13069 <param name="client">A reference to the <see cref="T:OpenMetaverse.GridClient" /> instance</param>
13070 </member> 12458 </member>
13071 <member name="T:OpenMetaverse.ObjectManager.ObjectMediaCallback"> 12459 <member name="T:OpenMetaverse.SoundManager">
13072 <summary> 12460 <summary>
13073 Callback for getting object media data via CAP 12461
13074 </summary> 12462 </summary>
13075 <param name="success">Indicates if the operation was succesfull</param>
13076 <param name="version">Object media version string</param>
13077 <param name="faceMedia">Array indexed on prim face of media entry data</param>
13078 </member> 12463 </member>
13079 <member name="F:OpenMetaverse.ObjectManager.m_ObjectUpdate"> 12464 <member name="F:OpenMetaverse.SoundManager.m_AttachedSound">
13080 <summary>The event subscribers, null of no subscribers</summary>
13081 </member>
13082 <member name="F:OpenMetaverse.ObjectManager.m_ObjectUpdateLock">
13083 <summary>Thread sync lock object</summary>
13084 </member>
13085 <member name="F:OpenMetaverse.ObjectManager.m_ObjectProperties">
13086 <summary>The event subscribers, null of no subscribers</summary>
13087 </member>
13088 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesLock">
13089 <summary>Thread sync lock object</summary>
13090 </member>
13091 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesUpdated">
13092 <summary>The event subscribers, null of no subscribers</summary>
13093 </member>
13094 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesUpdatedLock">
13095 <summary>Thread sync lock object</summary>
13096 </member>
13097 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesFamily">
13098 <summary>The event subscribers, null of no subscribers</summary> 12465 <summary>The event subscribers, null of no subscribers</summary>
13099 </member> 12466 </member>
13100 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesFamilyLock"> 12467 <member name="M:OpenMetaverse.SoundManager.OnAttachedSound(OpenMetaverse.AttachedSoundEventArgs)">
13101 <summary>Thread sync lock object</summary> 12468 <summary>Raises the AttachedSound Event</summary>
13102 </member> 12469 <param name="e">A AttachedSoundEventArgs object containing
13103 <member name="F:OpenMetaverse.ObjectManager.m_AvatarUpdate"> 12470 the data sent from the simulator</param>
13104 <summary>The event subscribers, null of no subscribers</summary>
13105 </member> 12471 </member>
13106 <member name="F:OpenMetaverse.ObjectManager.m_AvatarUpdateLock"> 12472 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundLock">
13107 <summary>Thread sync lock object</summary> 12473 <summary>Thread sync lock object</summary>
13108 </member> 12474 </member>
13109 <member name="F:OpenMetaverse.ObjectManager.m_TerseObjectUpdate"> 12475 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundGainChange">
13110 <summary>The event subscribers, null of no subscribers</summary> 12476 <summary>The event subscribers, null of no subscribers</summary>
13111 </member> 12477 </member>
13112 <member name="F:OpenMetaverse.ObjectManager.m_TerseObjectUpdateLock"> 12478 <member name="M:OpenMetaverse.SoundManager.OnAttachedSoundGainChange(OpenMetaverse.AttachedSoundGainChangeEventArgs)">
13113 <summary>Thread sync lock object</summary> 12479 <summary>Raises the AttachedSoundGainChange Event</summary>
13114 </member> 12480 <param name="e">A AttachedSoundGainChangeEventArgs object containing
13115 <member name="F:OpenMetaverse.ObjectManager.m_ObjectDataBlockUpdate"> 12481 the data sent from the simulator</param>
13116 <summary>The event subscribers, null of no subscribers</summary>
13117 </member> 12482 </member>
13118 <member name="F:OpenMetaverse.ObjectManager.m_ObjectDataBlockUpdateLock"> 12483 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundGainChangeLock">
13119 <summary>Thread sync lock object</summary> 12484 <summary>Thread sync lock object</summary>
13120 </member> 12485 </member>
13121 <member name="F:OpenMetaverse.ObjectManager.m_KillObject"> 12486 <member name="F:OpenMetaverse.SoundManager.m_SoundTrigger">
13122 <summary>The event subscribers, null of no subscribers</summary> 12487 <summary>The event subscribers, null of no subscribers</summary>
13123 </member> 12488 </member>
13124 <member name="F:OpenMetaverse.ObjectManager.m_KillObjectLock"> 12489 <member name="M:OpenMetaverse.SoundManager.OnSoundTrigger(OpenMetaverse.SoundTriggerEventArgs)">
13125 <summary>Thread sync lock object</summary> 12490 <summary>Raises the SoundTrigger Event</summary>
13126 </member> 12491 <param name="e">A SoundTriggerEventArgs object containing
13127 <member name="F:OpenMetaverse.ObjectManager.m_AvatarSitChanged"> 12492 the data sent from the simulator</param>
13128 <summary>The event subscribers, null of no subscribers</summary>
13129 </member> 12493 </member>
13130 <member name="F:OpenMetaverse.ObjectManager.m_AvatarSitChangedLock"> 12494 <member name="F:OpenMetaverse.SoundManager.m_SoundTriggerLock">
13131 <summary>Thread sync lock object</summary> 12495 <summary>Thread sync lock object</summary>
13132 </member> 12496 </member>
13133 <member name="F:OpenMetaverse.ObjectManager.m_PayPriceReply"> 12497 <member name="F:OpenMetaverse.SoundManager.m_PreloadSound">
13134 <summary>The event subscribers, null of no subscribers</summary> 12498 <summary>The event subscribers, null of no subscribers</summary>
13135 </member> 12499 </member>
13136 <member name="F:OpenMetaverse.ObjectManager.m_PayPriceReplyLock"> 12500 <member name="M:OpenMetaverse.SoundManager.OnPreloadSound(OpenMetaverse.PreloadSoundEventArgs)">
13137 <summary>Thread sync lock object</summary> 12501 <summary>Raises the PreloadSound Event</summary>
13138 </member> 12502 <param name="e">A PreloadSoundEventArgs object containing
13139 <member name="F:OpenMetaverse.ObjectManager.m_PhysicsProperties"> 12503 the data sent from the simulator</param>
13140 <summary>The event subscribers, null of no subscribers</summary>
13141 </member> 12504 </member>
13142 <member name="F:OpenMetaverse.ObjectManager.m_PhysicsPropertiesLock"> 12505 <member name="F:OpenMetaverse.SoundManager.m_PreloadSoundLock">
13143 <summary>Thread sync lock object</summary> 12506 <summary>Thread sync lock object</summary>
13144 </member> 12507 </member>
13145 <member name="F:OpenMetaverse.ObjectManager.Client"> 12508 <member name="M:OpenMetaverse.SoundManager.#ctor(OpenMetaverse.GridClient)">
13146 <summary>Reference to the GridClient object</summary>
13147 </member>
13148 <member name="F:OpenMetaverse.ObjectManager.InterpolationTimer">
13149 <summary>Does periodic dead reckoning calculation to convert
13150 velocity and acceleration to new positions for objects</summary>
13151 </member>
13152 <member name="E:OpenMetaverse.ObjectManager.ObjectUpdate">
13153 <summary>Raised when the simulator sends us data containing
13154 A <see cref="T:OpenMetaverse.Primitive" />, Foliage or Attachment</summary>
13155 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObject(OpenMetaverse.Simulator,System.UInt32)" />
13156 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})" />
13157 </member>
13158 <member name="E:OpenMetaverse.ObjectManager.ObjectProperties">
13159 <summary>Raised when the simulator sends us data containing
13160 additional <seea cref="Primitive" /> information</summary>
13161 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)" />
13162 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[])" />
13163 </member>
13164 <member name="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated">
13165 <summary>Raised when the simulator sends us data containing
13166 Primitive.ObjectProperties for an object we are currently tracking</summary>
13167 </member>
13168 <member name="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily">
13169 <summary>Raised when the simulator sends us data containing
13170 additional <seea cref="Primitive" /> and <see cref="T:OpenMetaverse.Avatar" /> details</summary>
13171 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean)" />
13172 </member>
13173 <member name="E:OpenMetaverse.ObjectManager.AvatarUpdate">
13174 <summary>Raised when the simulator sends us data containing
13175 updated information for an <see cref="T:OpenMetaverse.Avatar" /></summary>
13176 </member>
13177 <member name="E:OpenMetaverse.ObjectManager.TerseObjectUpdate">
13178 <summary>Raised when the simulator sends us data containing
13179 <see cref="T:OpenMetaverse.Primitive" /> and <see cref="T:OpenMetaverse.Avatar" /> movement changes</summary>
13180 </member>
13181 <member name="E:OpenMetaverse.ObjectManager.ObjectDataBlockUpdate">
13182 <summary>Raised when the simulator sends us data containing
13183 updates to an Objects DataBlock</summary>
13184 </member>
13185 <member name="E:OpenMetaverse.ObjectManager.KillObject">
13186 <summary>Raised when the simulator informs us an <see cref="T:OpenMetaverse.Primitive" />
13187 or <see cref="T:OpenMetaverse.Avatar" /> is no longer within view</summary>
13188 </member>
13189 <member name="E:OpenMetaverse.ObjectManager.AvatarSitChanged">
13190 <summary>Raised when the simulator sends us data containing
13191 updated sit information for our <see cref="T:OpenMetaverse.Avatar" /></summary>
13192 </member>
13193 <member name="E:OpenMetaverse.ObjectManager.PayPriceReply">
13194 <summary>Raised when the simulator sends us data containing
13195 purchase price information for a <see cref="T:OpenMetaverse.Primitive" /></summary>
13196 </member>
13197 <member name="E:OpenMetaverse.ObjectManager.PhysicsProperties">
13198 <summary>Raised when the simulator sends us data containing
13199 additional <seea cref="Primitive" /> information</summary>
13200 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)" />
13201 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[])" />
13202 </member>
13203 <member name="M:OpenMetaverse.ObjectManager.OnObjectProperties(OpenMetaverse.ObjectPropertiesEventArgs)">
13204 <summary>Raises the ObjectProperties Event</summary>
13205 <param name="e">A ObjectPropertiesEventArgs object containing
13206 the data sent from the simulator</param>
13207 </member>
13208 <member name="M:OpenMetaverse.ObjectManager.OnObjectPropertiesUpdated(OpenMetaverse.ObjectPropertiesUpdatedEventArgs)">
13209 <summary>Raises the ObjectPropertiesUpdated Event</summary>
13210 <param name="e">A ObjectPropertiesUpdatedEventArgs object containing
13211 the data sent from the simulator</param>
13212 </member>
13213 <member name="M:OpenMetaverse.ObjectManager.OnObjectPropertiesFamily(OpenMetaverse.ObjectPropertiesFamilyEventArgs)">
13214 <summary>Raises the ObjectPropertiesFamily Event</summary>
13215 <param name="e">A ObjectPropertiesFamilyEventArgs object containing
13216 the data sent from the simulator</param>
13217 </member>
13218 <member name="M:OpenMetaverse.ObjectManager.OnAvatarUpdate(OpenMetaverse.AvatarUpdateEventArgs)">
13219 <summary>Raises the AvatarUpdate Event</summary>
13220 <param name="e">A AvatarUpdateEventArgs object containing
13221 the data sent from the simulator</param>
13222 </member>
13223 <member name="M:OpenMetaverse.ObjectManager.OnObjectDataBlockUpdate(OpenMetaverse.ObjectDataBlockUpdateEventArgs)">
13224 <summary>Raises the ObjectDataBlockUpdate Event</summary>
13225 <param name="e">A ObjectDataBlockUpdateEventArgs object containing
13226 the data sent from the simulator</param>
13227 </member>
13228 <member name="M:OpenMetaverse.ObjectManager.OnKillObject(OpenMetaverse.KillObjectEventArgs)">
13229 <summary>Raises the KillObject Event</summary>
13230 <param name="e">A KillObjectEventArgs object containing
13231 the data sent from the simulator</param>
13232 </member>
13233 <member name="M:OpenMetaverse.ObjectManager.OnAvatarSitChanged(OpenMetaverse.AvatarSitChangedEventArgs)">
13234 <summary>Raises the AvatarSitChanged Event</summary>
13235 <param name="e">A AvatarSitChangedEventArgs object containing
13236 the data sent from the simulator</param>
13237 </member>
13238 <member name="M:OpenMetaverse.ObjectManager.OnPayPriceReply(OpenMetaverse.PayPriceReplyEventArgs)">
13239 <summary>Raises the PayPriceReply Event</summary>
13240 <param name="e">A PayPriceReplyEventArgs object containing
13241 the data sent from the simulator</param>
13242 </member>
13243 <member name="M:OpenMetaverse.ObjectManager.OnPhysicsProperties(OpenMetaverse.PhysicsPropertiesEventArgs)">
13244 <summary>Raises the PhysicsProperties Event</summary>
13245 <param name="e">A PhysicsPropertiesEventArgs object containing
13246 the data sent from the simulator</param>
13247 </member>
13248 <member name="M:OpenMetaverse.ObjectManager.RequestObject(OpenMetaverse.Simulator,System.UInt32)">
13249 <summary>
13250 Request information for a single object from a <see cref="T:OpenMetaverse.Simulator" />
13251 you are currently connected to
13252 </summary>
13253 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13254 <param name="localID">The Local ID of the object</param>
13255 </member>
13256 <member name="M:OpenMetaverse.ObjectManager.RequestObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
13257 <summary>
13258 Request information for multiple objects contained in
13259 the same simulator
13260 </summary>
13261 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the objects are located</param>
13262 <param name="localIDs">An array containing the Local IDs of the objects</param>
13263 </member>
13264 <member name="M:OpenMetaverse.ObjectManager.BuyObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.SaleType,System.Int32,OpenMetaverse.UUID,OpenMetaverse.UUID)">
13265 <summary>
13266 Attempt to purchase an original object, a copy, or the contents of
13267 an object
13268 </summary>
13269 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13270 <param name="localID">The Local ID of the object</param>
13271 <param name="saleType">Whether the original, a copy, or the object
13272 contents are on sale. This is used for verification, if the this
13273 sale type is not valid for the object the purchase will fail</param>
13274 <param name="price">Price of the object. This is used for
13275 verification, if it does not match the actual price the purchase
13276 will fail</param>
13277 <param name="groupID">Group ID that will be associated with the new
13278 purchase</param>
13279 <param name="categoryID">Inventory folder UUID where the object or objects
13280 purchased should be placed</param>
13281 <example>
13282 <code>
13283 BuyObject(Client.Network.CurrentSim, 500, SaleType.Copy,
13284 100, UUID.Zero, Client.Self.InventoryRootFolderUUID);
13285 </code>
13286 </example>
13287 </member>
13288 <member name="M:OpenMetaverse.ObjectManager.RequestPayPrice(OpenMetaverse.Simulator,OpenMetaverse.UUID)">
13289 <summary>
13290 Request prices that should be displayed in pay dialog. This will triggger the simulator
13291 to send us back a PayPriceReply which can be handled by OnPayPriceReply event
13292 </summary>
13293 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13294 <param name="objectID">The ID of the object</param>
13295 <remarks>The result is raised in the <see cref="E:OpenMetaverse.ObjectManager.PayPriceReply" /> event</remarks>
13296 </member>
13297 <member name="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)">
13298 <summary>
13299 Select a single object. This will cause the <see cref="T:OpenMetaverse.Simulator" /> to send us
13300 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event
13301 </summary>
13302 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13303 <param name="localID">The Local ID of the object</param>
13304 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs" />
13305 </member>
13306 <member name="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)">
13307 <summary>
13308 Select a single object. This will cause the <see cref="T:OpenMetaverse.Simulator" /> to send us
13309 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event
13310 </summary>
13311 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13312 <param name="localID">The Local ID of the object</param>
13313 <param name="automaticDeselect">if true, a call to <see cref="M:OpenMetaverse.ObjectManager.DeselectObject(OpenMetaverse.Simulator,System.UInt32)" /> is
13314 made immediately following the request</param>
13315 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs" />
13316 </member>
13317 <member name="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[],System.Boolean)">
13318 <summary>
13319 Select multiple objects. This will cause the <see cref="T:OpenMetaverse.Simulator" /> to send us
13320 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event
13321 </summary>
13322 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the objects are located</param>
13323 <param name="localIDs">An array containing the Local IDs of the objects</param>
13324 <param name="automaticDeselect">Should objects be deselected immediately after selection</param>
13325 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs" />
13326 </member>
13327 <member name="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[])">
13328 <summary>
13329 Select multiple objects. This will cause the <see cref="T:OpenMetaverse.Simulator" /> to send us
13330 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event
13331 </summary>
13332 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the objects are located</param>
13333 <param name="localIDs">An array containing the Local IDs of the objects</param>
13334 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs" />
13335 </member>
13336 <member name="M:OpenMetaverse.ObjectManager.SetFlags(OpenMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean)">
13337 <summary>
13338 Update the properties of an object
13339 </summary>
13340 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13341 <param name="localID">The Local ID of the object</param>
13342 <param name="physical">true to turn the objects physical property on</param>
13343 <param name="temporary">true to turn the objects temporary property on</param>
13344 <param name="phantom">true to turn the objects phantom property on</param>
13345 <param name="castsShadow">true to turn the objects cast shadows property on</param>
13346 </member>
13347 <member name="M:OpenMetaverse.ObjectManager.SetFlags(OpenMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean,OpenMetaverse.PhysicsShapeType,System.Single,System.Single,System.Single,System.Single)">
13348 <summary>
13349 Update the properties of an object
13350 </summary>
13351 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13352 <param name="localID">The Local ID of the object</param>
13353 <param name="physical">true to turn the objects physical property on</param>
13354 <param name="temporary">true to turn the objects temporary property on</param>
13355 <param name="phantom">true to turn the objects phantom property on</param>
13356 <param name="castsShadow">true to turn the objects cast shadows property on</param>
13357 <param name="physicsType">Type of the represetnation prim will have in the physics engine</param>
13358 <param name="density">Density - normal value 1000</param>
13359 <param name="friction">Friction - normal value 0.6</param>
13360 <param name="restitution">Restitution - standard value 0.5</param>
13361 <param name="gravityMultiplier">Gravity multiplier - standar value 1.0</param>
13362 </member>
13363 <member name="M:OpenMetaverse.ObjectManager.SetSaleInfo(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.SaleType,System.Int32)">
13364 <summary>
13365 Sets the sale properties of a single object
13366 </summary>
13367 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13368 <param name="localID">The Local ID of the object</param>
13369 <param name="saleType">One of the options from the <see cref="T:OpenMetaverse.SaleType" /> enum</param>
13370 <param name="price">The price of the object</param>
13371 </member>
13372 <member name="M:OpenMetaverse.ObjectManager.SetSaleInfo(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.SaleType,System.Int32)">
13373 <summary>
13374 Sets the sale properties of multiple objects
13375 </summary>
13376 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the objects are located</param>
13377 <param name="localIDs">An array containing the Local IDs of the objects</param>
13378 <param name="saleType">One of the options from the <see cref="T:OpenMetaverse.SaleType" /> enum</param>
13379 <param name="price">The price of the object</param>
13380 </member>
13381 <member name="M:OpenMetaverse.ObjectManager.DeselectObject(OpenMetaverse.Simulator,System.UInt32)">
13382 <summary>
13383 Deselect a single object
13384 </summary>
13385 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13386 <param name="localID">The Local ID of the object</param>
13387 </member>
13388 <member name="M:OpenMetaverse.ObjectManager.DeselectObjects(OpenMetaverse.Simulator,System.UInt32[])">
13389 <summary>
13390 Deselect multiple objects.
13391 </summary>
13392 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the objects are located</param>
13393 <param name="localIDs">An array containing the Local IDs of the objects</param>
13394 </member>
13395 <member name="M:OpenMetaverse.ObjectManager.ClickObject(OpenMetaverse.Simulator,System.UInt32)">
13396 <summary>
13397 Perform a click action on an object
13398 </summary>
13399 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13400 <param name="localID">The Local ID of the object</param>
13401 </member>
13402 <member name="M:OpenMetaverse.ObjectManager.ClickObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
13403 <summary>
13404 Perform a click action (Grab) on a single object
13405 </summary>
13406 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator" /> the object is located</param>
13407 <param name="localID">The Local ID of the object</param>
13408 <param name="uvCoord">The texture coordinates to touch</param>
13409 <param name="stCoord">The surface coordinates to touch</param>
13410 <param name="faceIndex">The face of the position to touch</param>
13411 <param name="position">The region coordinates of the position to touch</param>
13412 <param name="normal">The surface normal of the position to touch (A normal is a vector perpindicular to the surface)</param>
13413 <param name="binormal">The surface binormal of the position to touch (A binormal is a vector tangen to the surface
13414 pointing along the U direction of the tangent space</param>
13415 </member>
13416 <member name="M:OpenMetaverse.ObjectManager.AddPrim(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ConstructionData,OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion)">
13417 <summary>
13418 Create (rez) a new prim object in a simulator
13419 </summary>
13420 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object to place the object in</param>
13421 <param name="prim">Data describing the prim object to rez</param>
13422 <param name="groupID">Group ID that this prim will be set to, or UUID.Zero if you
13423 do not want the object to be associated with a specific group</param>
13424 <param name="position">An approximation of the position at which to rez the prim</param>
13425 <param name="scale">Scale vector to size this prim</param>
13426 <param name="rotation">Rotation quaternion to rotate this prim</param>
13427 <remarks>Due to the way client prim rezzing is done on the server,
13428 the requested position for an object is only close to where the prim
13429 actually ends up. If you desire exact placement you'll need to
13430 follow up by moving the object after it has been created. This
13431 function will not set textures, light and flexible data, or other
13432 extended primitive properties</remarks>
13433 </member>
13434 <member name="M:OpenMetaverse.ObjectManager.AddPrim(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ConstructionData,OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.PrimFlags)">
13435 <summary>
13436 Create (rez) a new prim object in a simulator
13437 </summary>
13438 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object to place the object in</param>
13439 <param name="prim">Data describing the prim object to rez</param>
13440 <param name="groupID">Group ID that this prim will be set to, or UUID.Zero if you
13441 do not want the object to be associated with a specific group</param>
13442 <param name="position">An approximation of the position at which to rez the prim</param>
13443 <param name="scale">Scale vector to size this prim</param>
13444 <param name="rotation">Rotation quaternion to rotate this prim</param>
13445 <param name="createFlags">Specify the <seealso cref="T:OpenMetaverse.PrimFlags" /></param>
13446 <remarks>Due to the way client prim rezzing is done on the server,
13447 the requested position for an object is only close to where the prim
13448 actually ends up. If you desire exact placement you'll need to
13449 follow up by moving the object after it has been created. This
13450 function will not set textures, light and flexible data, or other
13451 extended primitive properties</remarks>
13452 </member>
13453 <member name="M:OpenMetaverse.ObjectManager.AddTree(OpenMetaverse.Simulator,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.Tree,OpenMetaverse.UUID,System.Boolean)">
13454 <summary>
13455 Rez a Linden tree
13456 </summary>
13457 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13458 <param name="scale">The size of the tree</param>
13459 <param name="rotation">The rotation of the tree</param>
13460 <param name="position">The position of the tree</param>
13461 <param name="treeType">The Type of tree</param>
13462 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID" /> of the group to set the tree to,
13463 or UUID.Zero if no group is to be set</param>
13464 <param name="newTree">true to use the "new" Linden trees, false to use the old</param>
13465 </member>
13466 <member name="M:OpenMetaverse.ObjectManager.AddGrass(OpenMetaverse.Simulator,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.Grass,OpenMetaverse.UUID)">
13467 <summary>
13468 Rez grass and ground cover
13469 </summary>
13470 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13471 <param name="scale">The size of the grass</param>
13472 <param name="rotation">The rotation of the grass</param>
13473 <param name="position">The position of the grass</param>
13474 <param name="grassType">The type of grass from the <seealso cref="T:OpenMetaverse.Grass" /> enum</param>
13475 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID" /> of the group to set the tree to,
13476 or UUID.Zero if no group is to be set</param>
13477 </member>
13478 <member name="M:OpenMetaverse.ObjectManager.SetTextures(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.TextureEntry)">
13479 <summary>
13480 Set the textures to apply to the faces of an object
13481 </summary>
13482 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13483 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13484 <param name="textures">The texture data to apply</param>
13485 </member>
13486 <member name="M:OpenMetaverse.ObjectManager.SetTextures(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.TextureEntry,System.String)">
13487 <summary>
13488 Set the textures to apply to the faces of an object
13489 </summary>
13490 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13491 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13492 <param name="textures">The texture data to apply</param>
13493 <param name="mediaUrl">A media URL (not used)</param>
13494 </member>
13495 <member name="M:OpenMetaverse.ObjectManager.SetLight(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.LightData)">
13496 <summary>
13497 Set the Light data on an object
13498 </summary>
13499 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13500 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13501 <param name="light">A <seealso cref="T:OpenMetaverse.Primitive.LightData" /> object containing the data to set</param>
13502 </member>
13503 <member name="M:OpenMetaverse.ObjectManager.SetFlexible(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.FlexibleData)">
13504 <summary>
13505 Set the flexible data on an object
13506 </summary>
13507 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13508 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13509 <param name="flexible">A <seealso cref="T:OpenMetaverse.Primitive.FlexibleData" /> object containing the data to set</param>
13510 </member>
13511 <member name="M:OpenMetaverse.ObjectManager.SetSculpt(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.SculptData)">
13512 <summary>
13513 Set the sculptie texture and data on an object
13514 </summary>
13515 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13516 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13517 <param name="sculpt">A <seealso cref="T:OpenMetaverse.Primitive.SculptData" /> object containing the data to set</param>
13518 </member>
13519 <member name="M:OpenMetaverse.ObjectManager.SetExtraParamOff(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.ExtraParamType)">
13520 <summary>
13521 Unset additional primitive parameters on an object
13522 </summary>
13523 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13524 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13525 <param name="type">The extra parameters to set</param>
13526 </member>
13527 <member name="M:OpenMetaverse.ObjectManager.LinkPrims(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
13528 <summary>
13529 Link multiple prims into a linkset
13530 </summary>
13531 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param>
13532 <param name="localIDs">An array which contains the IDs of the objects to link</param>
13533 <remarks>The last object in the array will be the root object of the linkset TODO: Is this true?</remarks>
13534 </member>
13535 <member name="M:OpenMetaverse.ObjectManager.DelinkPrims(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
13536 <summary>
13537 Delink/Unlink multiple prims from a linkset
13538 </summary>
13539 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param>
13540 <param name="localIDs">An array which contains the IDs of the objects to delink</param>
13541 </member>
13542 <member name="M:OpenMetaverse.ObjectManager.SetRotation(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Quaternion)">
13543 <summary>
13544 Change the rotation of an object
13545 </summary>
13546 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13547 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13548 <param name="rotation">The new rotation of the object</param>
13549 </member>
13550 <member name="M:OpenMetaverse.ObjectManager.SetName(OpenMetaverse.Simulator,System.UInt32,System.String)">
13551 <summary>
13552 Set the name of an object
13553 </summary>
13554 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13555 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13556 <param name="name">A string containing the new name of the object</param>
13557 </member>
13558 <member name="M:OpenMetaverse.ObjectManager.SetNames(OpenMetaverse.Simulator,System.UInt32[],System.String[])">
13559 <summary>
13560 Set the name of multiple objects
13561 </summary>
13562 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param>
13563 <param name="localIDs">An array which contains the IDs of the objects to change the name of</param>
13564 <param name="names">An array which contains the new names of the objects</param>
13565 </member>
13566 <member name="M:OpenMetaverse.ObjectManager.SetDescription(OpenMetaverse.Simulator,System.UInt32,System.String)">
13567 <summary>
13568 Set the description of an object
13569 </summary>
13570 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13571 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13572 <param name="description">A string containing the new description of the object</param>
13573 </member>
13574 <member name="M:OpenMetaverse.ObjectManager.SetDescriptions(OpenMetaverse.Simulator,System.UInt32[],System.String[])">
13575 <summary>
13576 Set the descriptions of multiple objects
13577 </summary>
13578 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param>
13579 <param name="localIDs">An array which contains the IDs of the objects to change the description of</param>
13580 <param name="descriptions">An array which contains the new descriptions of the objects</param>
13581 </member>
13582 <member name="M:OpenMetaverse.ObjectManager.AttachObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.AttachmentPoint,OpenMetaverse.Quaternion)">
13583 <summary>
13584 Attach an object to this avatar
13585 </summary>
13586 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13587 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13588 <param name="attachPoint">The point on the avatar the object will be attached</param>
13589 <param name="rotation">The rotation of the attached object</param>
13590 </member>
13591 <member name="M:OpenMetaverse.ObjectManager.DropObject(OpenMetaverse.Simulator,System.UInt32)">
13592 <summary>
13593 Drop an attached object from this avatar
13594 </summary>
13595 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" />
13596 object where the objects reside. This will always be the simulator the avatar is currently in
13597 </param>
13598 <param name="localID">The object's ID which is local to the simulator the object is in</param>
13599 </member>
13600 <member name="M:OpenMetaverse.ObjectManager.DetachObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
13601 <summary>
13602 Detach an object from yourself
13603 </summary>
13604 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" />
13605 object where the objects reside
13606 This will always be the simulator the avatar is currently in
13607 </param>
13608 <param name="localIDs">An array which contains the IDs of the objects to detach</param>
13609 </member>
13610 <member name="M:OpenMetaverse.ObjectManager.SetPosition(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3)">
13611 <summary>
13612 Change the position of an object, Will change position of entire linkset
13613 </summary>
13614 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13615 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13616 <param name="position">The new position of the object</param>
13617 </member>
13618 <member name="M:OpenMetaverse.ObjectManager.SetPosition(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,System.Boolean)">
13619 <summary>
13620 Change the position of an object
13621 </summary>
13622 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13623 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13624 <param name="position">The new position of the object</param>
13625 <param name="childOnly">if true, will change position of (this) child prim only, not entire linkset</param>
13626 </member>
13627 <member name="M:OpenMetaverse.ObjectManager.SetScale(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,System.Boolean,System.Boolean)">
13628 <summary>
13629 Change the Scale (size) of an object
13630 </summary>
13631 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13632 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13633 <param name="scale">The new scale of the object</param>
13634 <param name="childOnly">If true, will change scale of this prim only, not entire linkset</param>
13635 <param name="uniform">True to resize prims uniformly</param>
13636 </member>
13637 <member name="M:OpenMetaverse.ObjectManager.SetRotation(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Quaternion,System.Boolean)">
13638 <summary>
13639 Change the Rotation of an object that is either a child or a whole linkset
13640 </summary>
13641 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13642 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13643 <param name="quat">The new scale of the object</param>
13644 <param name="childOnly">If true, will change rotation of this prim only, not entire linkset</param>
13645 </member>
13646 <member name="M:OpenMetaverse.ObjectManager.UpdateObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.UpdateType)">
13647 <summary>
13648 Send a Multiple Object Update packet to change the size, scale or rotation of a primitive
13649 </summary>
13650 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13651 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13652 <param name="data">The new rotation, size, or position of the target object</param>
13653 <param name="type">The flags from the <seealso cref="T:OpenMetaverse.UpdateType" /> Enum</param>
13654 </member>
13655 <member name="M:OpenMetaverse.ObjectManager.DeedObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
13656 <summary>
13657 Deed an object (prim) to a group, Object must be shared with group which
13658 can be accomplished with SetPermissions()
13659 </summary>
13660 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13661 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13662 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID" /> of the group to deed the object to</param>
13663 </member>
13664 <member name="M:OpenMetaverse.ObjectManager.DeedObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.UUID)">
13665 <summary>
13666 Deed multiple objects (prims) to a group, Objects must be shared with group which
13667 can be accomplished with SetPermissions()
13668 </summary>
13669 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13670 <param name="localIDs">An array which contains the IDs of the objects to deed</param>
13671 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID" /> of the group to deed the object to</param>
13672 </member>
13673 <member name="M:OpenMetaverse.ObjectManager.SetPermissions(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.PermissionWho,OpenMetaverse.PermissionMask,System.Boolean)">
13674 <summary>
13675 Set the permissions on multiple objects
13676 </summary>
13677 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param>
13678 <param name="localIDs">An array which contains the IDs of the objects to set the permissions on</param>
13679 <param name="who">The new Who mask to set</param>
13680 <param name="permissions">Which permission to modify</param>
13681 <param name="set">The new state of permission</param>
13682 </member>
13683 <member name="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID)">
13684 <summary>
13685 Request additional properties for an object
13686 </summary>
13687 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13688 <param name="objectID">
13689 </param>
13690 </member>
13691 <member name="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean)">
13692 <summary> 12509 <summary>
13693 Request additional properties for an object 12510 Construct a new instance of the SoundManager class, used for playing and receiving
12511 sound assets
13694 </summary> 12512 </summary>
13695 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param> 12513 <param name="client">A reference to the current GridClient instance</param>
13696 <param name="objectID">Absolute UUID of the object</param>
13697 <param name="reliable">Whether to require server acknowledgement of this request</param>
13698 </member> 12514 </member>
13699 <member name="M:OpenMetaverse.ObjectManager.SetObjectsGroup(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.UUID)"> 12515 <member name="M:OpenMetaverse.SoundManager.PlaySound(OpenMetaverse.UUID)">
13700 <summary> 12516 <summary>
13701 Set the ownership of a list of objects to the specified group 12517 Plays a sound in the current region at full volume from avatar position
13702 </summary> 12518 </summary>
13703 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the objects reside</param> 12519 <param name="soundID">UUID of the sound to be played</param>
13704 <param name="localIds">An array which contains the IDs of the objects to set the group id on</param>
13705 <param name="groupID">The Groups ID</param>
13706 </member> 12520 </member>
13707 <member name="M:OpenMetaverse.ObjectManager.NavigateObjectMedia(OpenMetaverse.UUID,System.Int32,System.String,OpenMetaverse.Simulator)"> 12521 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Vector3)">
13708 <summary> 12522 <summary>
13709 Update current URL of the previously set prim media 12523 Plays a sound in the current region at full volume
13710 </summary> 12524 </summary>
13711 <param name="primID">UUID of the prim</param> 12525 <param name="soundID">UUID of the sound to be played.</param>
13712 <param name="newURL">Set current URL to this</param> 12526 <param name="position">position for the sound to be played at. Normally the avatar.</param>
13713 <param name="face">Prim face number</param>
13714 <param name="sim">Simulator in which prim is located</param>
13715 </member> 12527 </member>
13716 <member name="M:OpenMetaverse.ObjectManager.UpdateObjectMedia(OpenMetaverse.UUID,OpenMetaverse.MediaEntry[],OpenMetaverse.Simulator)"> 12528 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Vector3,System.Single)">
13717 <summary> 12529 <summary>
13718 Set object media 12530 Plays a sound in the current region
13719 </summary> 12531 </summary>
13720 <param name="primID">UUID of the prim</param> 12532 <param name="soundID">UUID of the sound to be played.</param>
13721 <param name="faceMedia">Array the length of prims number of faces. Null on face indexes where there is 12533 <param name="position">position for the sound to be played at. Normally the avatar.</param>
13722 no media, <seealso cref="T:OpenMetaverse.MediaEntry" /> on faces which contain the media</param> 12534 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
13723 <param name="sim">Simulatior in which prim is located</param>
13724 </member> 12535 </member>
13725 <member name="M:OpenMetaverse.ObjectManager.RequestObjectMedia(OpenMetaverse.UUID,OpenMetaverse.Simulator,OpenMetaverse.ObjectManager.ObjectMediaCallback)"> 12536 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Simulator,OpenMetaverse.Vector3,System.Single)">
13726 <summary> 12537 <summary>
13727 Retrieve information about object media 12538 Plays a sound in the specified sim
13728 </summary> 12539 </summary>
13729 <param name="primID">UUID of the primitive</param> 12540 <param name="soundID">UUID of the sound to be played.</param>
13730 <param name="sim">Simulator where prim is located</param> 12541 <param name="sim">UUID of the sound to be played.</param>
13731 <param name="callback">Call this callback when done</param> 12542 <param name="position">position for the sound to be played at. Normally the avatar.</param>
13732 </member> 12543 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
13733 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13734 <summary>Process an incoming packet and raise the appropriate events</summary>
13735 <param name="sender">The sender</param>
13736 <param name="e">The EventArgs object containing the packet data</param>
13737 </member> 12544 </member>
13738 <member name="M:OpenMetaverse.ObjectManager.ImprovedTerseObjectUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12545 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,System.UInt64,OpenMetaverse.Vector3,System.Single)">
13739 <summary> 12546 <summary>
13740 A terse object update, used when a transformation matrix or 12547 Play a sound asset
13741 velocity/acceleration for an object changes but nothing else
13742 (scale/position/rotation/acceleration/velocity)
13743 </summary> 12548 </summary>
13744 <param name="sender">The sender</param> 12549 <param name="soundID">UUID of the sound to be played.</param>
13745 <param name="e">The EventArgs object containing the packet data</param> 12550 <param name="handle">handle id for the sim to be played in.</param>
13746 </member> 12551 <param name="position">position for the sound to be played at. Normally the avatar.</param>
13747 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateCompressedHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12552 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
13748 <summary>Process an incoming packet and raise the appropriate events</summary>
13749 <param name="sender">The sender</param>
13750 <param name="e">The EventArgs object containing the packet data</param>
13751 </member>
13752 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateCachedHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13753 <summary>Process an incoming packet and raise the appropriate events</summary>
13754 <param name="sender">The sender</param>
13755 <param name="e">The EventArgs object containing the packet data</param>
13756 </member> 12553 </member>
13757 <member name="M:OpenMetaverse.ObjectManager.KillObjectHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12554 <member name="M:OpenMetaverse.SoundManager.AttachedSoundHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13758 <summary>Process an incoming packet and raise the appropriate events</summary> 12555 <summary>Process an incoming packet and raise the appropriate events</summary>
13759 <param name="sender">The sender</param> 12556 <param name="sender">The sender</param>
13760 <param name="e">The EventArgs object containing the packet data</param> 12557 <param name="e">The EventArgs object containing the packet data</param>
13761 </member> 12558 </member>
13762 <member name="M:OpenMetaverse.ObjectManager.ObjectPropertiesHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12559 <member name="M:OpenMetaverse.SoundManager.AttachedSoundGainChangeHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13763 <summary>Process an incoming packet and raise the appropriate events</summary> 12560 <summary>Process an incoming packet and raise the appropriate events</summary>
13764 <param name="sender">The sender</param> 12561 <param name="sender">The sender</param>
13765 <param name="e">The EventArgs object containing the packet data</param> 12562 <param name="e">The EventArgs object containing the packet data</param>
13766 </member> 12563 </member>
13767 <member name="M:OpenMetaverse.ObjectManager.ObjectPropertiesFamilyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12564 <member name="M:OpenMetaverse.SoundManager.PreloadSoundHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13768 <summary>Process an incoming packet and raise the appropriate events</summary> 12565 <summary>Process an incoming packet and raise the appropriate events</summary>
13769 <param name="sender">The sender</param> 12566 <param name="sender">The sender</param>
13770 <param name="e">The EventArgs object containing the packet data</param> 12567 <param name="e">The EventArgs object containing the packet data</param>
13771 </member> 12568 </member>
13772 <member name="M:OpenMetaverse.ObjectManager.PayPriceReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 12569 <member name="M:OpenMetaverse.SoundManager.SoundTriggerHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
13773 <summary>Process an incoming packet and raise the appropriate events</summary> 12570 <summary>Process an incoming packet and raise the appropriate events</summary>
13774 <param name="sender">The sender</param> 12571 <param name="sender">The sender</param>
13775 <param name="e">The EventArgs object containing the packet data</param> 12572 <param name="e">The EventArgs object containing the packet data</param>
13776 </member> 12573 </member>
13777 <member name="M:OpenMetaverse.ObjectManager.ObjectPhysicsPropertiesHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)"> 12574 <member name="E:OpenMetaverse.SoundManager.AttachedSound">
13778 <summary> 12575 <summary>Raised when the simulator sends us data containing
13779 </summary> 12576 sound</summary>
13780 <param name="capsKey">
13781 </param>
13782 <param name="message">
13783 </param>
13784 <param name="simulator">
13785 </param>
13786 </member>
13787 <member name="M:OpenMetaverse.ObjectManager.BuildBasicShape(OpenMetaverse.PrimType)">
13788 <summary>
13789 Setup construction data for a basic primitive shape
13790 </summary>
13791 <param name="type">Primitive shape to construct</param>
13792 <returns>Construction data that can be plugged into a <seealso cref="T:OpenMetaverse.Primitive" /></returns>
13793 </member>
13794 <member name="M:OpenMetaverse.ObjectManager.SetAvatarSittingOn(OpenMetaverse.Simulator,OpenMetaverse.Avatar,System.UInt32,System.UInt32)">
13795 <summary>
13796 </summary>
13797 <param name="sim">
13798 </param>
13799 <param name="av">
13800 </param>
13801 <param name="localid">
13802 </param>
13803 <param name="oldSeatID">
13804 </param>
13805 </member>
13806 <member name="M:OpenMetaverse.ObjectManager.UpdateDilation(OpenMetaverse.Simulator,System.UInt32)">
13807 <summary>
13808 </summary>
13809 <param name="s">
13810 </param>
13811 <param name="dilation">
13812 </param>
13813 </member>
13814 <member name="M:OpenMetaverse.ObjectManager.SetShape(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.ConstructionData)">
13815 <summary>
13816 Set the Shape data of an object
13817 </summary>
13818 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13819 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13820 <param name="prim">Data describing the prim shape</param>
13821 </member>
13822 <member name="M:OpenMetaverse.ObjectManager.SetMaterial(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Material)">
13823 <summary>
13824 Set the Material data of an object
13825 </summary>
13826 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator" /> object where the object resides</param>
13827 <param name="localID">The objects ID which is local to the simulator the object is in</param>
13828 <param name="material">The new material of the object</param>
13829 </member>
13830 <member name="M:OpenMetaverse.ObjectManager.GetPrimitive(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
13831 <summary>
13832 </summary>
13833 <param name="simulator">
13834 </param>
13835 <param name="localID">
13836 </param>
13837 <param name="fullID">
13838 </param>
13839 <returns>
13840 </returns>
13841 </member>
13842 <member name="M:OpenMetaverse.ObjectManager.GetAvatar(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
13843 <summary>
13844 </summary>
13845 <param name="simulator">
13846 </param>
13847 <param name="localID">
13848 </param>
13849 <param name="fullID">
13850 </param>
13851 <returns>
13852 </returns>
13853 </member>
13854 <member name="T:OpenMetaverse.PrimEventArgs">
13855 <summary>Provides data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" /> event</summary>
13856 <remarks>
13857 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" /> event occurs when the simulator sends
13858 an <see cref="T:OpenMetaverse.Packets.ObjectUpdatePacket" /> containing a Primitive, Foliage or Attachment data</para>
13859 <para>Note 1: The <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" /> event will not be raised when the object is an Avatar</para>
13860 <para>Note 2: It is possible for the <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" /> to be
13861 raised twice for the same object if for example the primitive moved to a new simulator, then returned to the current simulator or
13862 if an Avatar crosses the border into a new simulator and returns to the current simulator</para>
13863 </remarks>
13864 <example>
13865 The following code example uses the <see cref="P:OpenMetaverse.PrimEventArgs.Prim" />, <see cref="P:OpenMetaverse.PrimEventArgs.Simulator" />, and <see cref="P:OpenMetaverse.PrimEventArgs.IsAttachment" />
13866 properties to display new Primitives and Attachments on the <see cref="T:System.Console" /> window.
13867 <code>
13868 // Subscribe to the event that gives us prim and foliage information
13869 Client.Objects.ObjectUpdate += Objects_ObjectUpdate;
13870 private void Objects_ObjectUpdate(object sender, PrimEventArgs e)
13871 {
13872 Console.WriteLine("Primitive {0} {1} in {2} is an attachment {3}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name, e.IsAttachment);
13873 }
13874 </code></example>
13875 <seealso cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" />
13876 <seealso cref="E:OpenMetaverse.ObjectManager.AvatarUpdate" />
13877 <seealso cref="T:OpenMetaverse.AvatarUpdateEventArgs" />
13878 </member>
13879 <member name="M:OpenMetaverse.PrimEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive,System.UInt16,System.Boolean,System.Boolean)">
13880 <summary>
13881 Construct a new instance of the PrimEventArgs class
13882 </summary>
13883 <param name="simulator">The simulator the object originated from</param>
13884 <param name="prim">The Primitive</param>
13885 <param name="timeDilation">The simulator time dilation</param>
13886 <param name="isNew">The prim was not in the dictionary before this update</param>
13887 <param name="isAttachment">true if the primitive represents an attachment to an agent</param>
13888 </member>
13889 <member name="P:OpenMetaverse.PrimEventArgs.Simulator">
13890 <summary>Get the simulator the <see cref="T:OpenMetaverse.Primitive" /> originated from</summary>
13891 </member>
13892 <member name="P:OpenMetaverse.PrimEventArgs.Prim">
13893 <summary>Get the <see cref="T:OpenMetaverse.Primitive" /> details</summary>
13894 </member>
13895 <member name="P:OpenMetaverse.PrimEventArgs.IsNew">
13896 <summary>true if the <see cref="T:OpenMetaverse.Primitive" /> did not exist in the dictionary before this update (always true if object tracking has been disabled)</summary>
13897 </member>
13898 <member name="P:OpenMetaverse.PrimEventArgs.IsAttachment">
13899 <summary>true if the <see cref="T:OpenMetaverse.Primitive" /> is attached to an <see cref="T:OpenMetaverse.Avatar" /></summary>
13900 </member>
13901 <member name="P:OpenMetaverse.PrimEventArgs.TimeDilation">
13902 <summary>Get the simulator Time Dilation</summary>
13903 </member>
13904 <member name="T:OpenMetaverse.AvatarUpdateEventArgs">
13905 <summary>Provides data for the <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate" /> event</summary>
13906 <remarks>
13907 <para>The <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate" /> event occurs when the simulator sends
13908 an <see cref="T:OpenMetaverse.Packets.ObjectUpdatePacket" /> containing Avatar data</para>
13909 <para>Note 1: The <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate" /> event will not be raised when the object is an Avatar</para>
13910 <para>Note 2: It is possible for the <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate" /> to be
13911 raised twice for the same avatar if for example the avatar moved to a new simulator, then returned to the current simulator</para>
13912 </remarks>
13913 <example>
13914 The following code example uses the <see cref="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar" /> property to make a request for the top picks
13915 using the <see cref="M:OpenMetaverse.AvatarManager.RequestAvatarPicks(OpenMetaverse.UUID)" /> method in the <see cref="T:OpenMetaverse.AvatarManager" /> class to display the names
13916 of our own agents picks listings on the <see cref="T:System.Console" /> window.
13917 <code>
13918 // subscribe to the AvatarUpdate event to get our information
13919 Client.Objects.AvatarUpdate += Objects_AvatarUpdate;
13920 Client.Avatars.AvatarPicksReply += Avatars_AvatarPicksReply;
13921 private void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e)
13922 {
13923 // we only want our own data
13924 if (e.Avatar.LocalID == Client.Self.LocalID)
13925 {
13926 // Unsubscribe from the avatar update event to prevent a loop
13927 // where we continually request the picks every time we get an update for ourselves
13928 Client.Objects.AvatarUpdate -= Objects_AvatarUpdate;
13929 // make the top picks request through AvatarManager
13930 Client.Avatars.RequestAvatarPicks(e.Avatar.ID);
13931 }
13932 }
13933 private void Avatars_AvatarPicksReply(object sender, AvatarPicksReplyEventArgs e)
13934 {
13935 // we'll unsubscribe from the AvatarPicksReply event since we now have the data
13936 // we were looking for
13937 Client.Avatars.AvatarPicksReply -= Avatars_AvatarPicksReply;
13938 // loop through the dictionary and extract the names of the top picks from our profile
13939 foreach (var pickName in e.Picks.Values)
13940 {
13941 Console.WriteLine(pickName);
13942 }
13943 }
13944 </code></example>
13945 <seealso cref="E:OpenMetaverse.ObjectManager.ObjectUpdate" />
13946 <seealso cref="T:OpenMetaverse.PrimEventArgs" />
13947 </member>
13948 <member name="M:OpenMetaverse.AvatarUpdateEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Avatar,System.UInt16,System.Boolean)">
13949 <summary>
13950 Construct a new instance of the AvatarUpdateEventArgs class
13951 </summary>
13952 <param name="simulator">The simulator the packet originated from</param>
13953 <param name="avatar">The <see cref="T:OpenMetaverse.Avatar" /> data</param>
13954 <param name="timeDilation">The simulator time dilation</param>
13955 <param name="isNew">The avatar was not in the dictionary before this update</param>
13956 </member>
13957 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.Simulator">
13958 <summary>Get the simulator the object originated from</summary>
13959 </member> 12577 </member>
13960 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar"> 12578 <member name="E:OpenMetaverse.SoundManager.AttachedSoundGainChange">
13961 <summary>Get the <see cref="T:OpenMetaverse.Avatar" /> data</summary> 12579 <summary>Raised when the simulator sends us data containing
12580 ...</summary>
13962 </member> 12581 </member>
13963 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.TimeDilation"> 12582 <member name="E:OpenMetaverse.SoundManager.SoundTrigger">
13964 <summary>Get the simulator time dilation</summary> 12583 <summary>Raised when the simulator sends us data containing
12584 ...</summary>
13965 </member> 12585 </member>
13966 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.IsNew"> 12586 <member name="E:OpenMetaverse.SoundManager.PreloadSound">
13967 <summary>true if the <see cref="T:OpenMetaverse.Avatar" /> did not exist in the dictionary before this update (always true if avatar tracking has been disabled)</summary> 12587 <summary>Raised when the simulator sends us data containing
12588 ...</summary>
13968 </member> 12589 </member>
13969 <member name="T:OpenMetaverse.ObjectPropertiesEventArgs"> 12590 <member name="T:OpenMetaverse.AttachedSoundEventArgs">
13970 <summary>Provides additional primitive data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event</summary> 12591 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.AttachedSound"/> event</summary>
13971 <remarks> 12592 <remarks>The <see cref="E:OpenMetaverse.SoundManager.AttachedSound"/> event occurs when the simulator sends
13972 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event occurs when the simulator sends 12593 the sound data which emits from an agents attachment</remarks>
13973 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> containing additional details for a Primitive, Foliage data or Attachment data</para>
13974 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)" /> request is
13975 made.</para>
13976 </remarks>
13977 <example> 12594 <example>
13978 The following code example uses the <see cref="P:OpenMetaverse.PrimEventArgs.Prim" />, <see cref="P:OpenMetaverse.PrimEventArgs.Simulator" /> and 12595 The following code example shows the process to subscribe to the <see cref="E:OpenMetaverse.SoundManager.AttachedSound"/> event
13979 <see cref="P:OpenMetaverse.ObjectPropertiesEventArgs.Properties" /> 12596 and a stub to handle the data passed from the simulator
13980 properties to display new attachments and send a request for additional properties containing the name of the
13981 attachment then display it on the <see cref="T:System.Console" /> window.
13982 <code> 12597 <code>
13983 // Subscribe to the event that provides additional primitive details 12598 // Subscribe to the AttachedSound event
13984 Client.Objects.ObjectProperties += Objects_ObjectProperties; 12599 Client.Sound.AttachedSound += Sound_AttachedSound;
13985 // handle the properties data that arrives 12600
13986 private void Objects_ObjectProperties(object sender, ObjectPropertiesEventArgs e) 12601 // process the data raised in the event here
13987 { 12602 private void Sound_AttachedSound(object sender, AttachedSoundEventArgs e)
13988 Console.WriteLine("Primitive Properties: {0} Name is {1}", e.Properties.ObjectID, e.Properties.Name); 12603 {
13989 } 12604 // ... Process AttachedSoundEventArgs here ...
13990 </code></example> 12605 }
13991 </member> 12606 </code>
13992 <member name="M:OpenMetaverse.ObjectPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ObjectProperties)"> 12607 </example>
13993 <summary>
13994 Construct a new instance of the ObjectPropertiesEventArgs class
13995 </summary>
13996 <param name="simulator">The simulator the object is located</param>
13997 <param name="props">The primitive Properties</param>
13998 </member>
13999 <member name="P:OpenMetaverse.ObjectPropertiesEventArgs.Simulator">
14000 <summary>Get the simulator the object is located</summary>
14001 </member>
14002 <member name="P:OpenMetaverse.ObjectPropertiesEventArgs.Properties">
14003 <summary>Get the primitive properties</summary>
14004 </member>
14005 <member name="T:OpenMetaverse.ObjectPropertiesUpdatedEventArgs">
14006 <summary>Provides additional primitive data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated" /> event</summary>
14007 <remarks>
14008 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated" /> event occurs when the simulator sends
14009 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> containing additional details for a Primitive or Foliage data that is currently
14010 being tracked in the <see cref="F:OpenMetaverse.Simulator.ObjectsPrimitives" /> dictionary</para>
14011 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated" /> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)" /> request is
14012 made and <see cref="F:OpenMetaverse.Settings.OBJECT_TRACKING" /> is enabled</para>
14013 </remarks>
14014 </member>
14015 <member name="M:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive,OpenMetaverse.Primitive.ObjectProperties)">
14016 <summary>
14017 Construct a new instance of the ObjectPropertiesUpdatedEvenrArgs class
14018 </summary>
14019 <param name="simulator">The simulator the object is located</param>
14020 <param name="prim">The Primitive</param>
14021 <param name="props">The primitive Properties</param>
14022 </member>
14023 <member name="P:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.Simulator">
14024 <summary>Get the simulator the object is located</summary>
14025 </member>
14026 <member name="P:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.Prim">
14027 <summary>Get the primitive details</summary>
14028 </member>
14029 <member name="P:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.Properties">
14030 <summary>Get the primitive properties</summary>
14031 </member>
14032 <member name="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs">
14033 <summary>Provides additional primitive data, permissions and sale info for the <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily" /> event</summary>
14034 <remarks>
14035 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily" /> event occurs when the simulator sends
14036 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket" /> containing additional details for a Primitive, Foliage data or Attachment. This includes
14037 Permissions, Sale info, and other basic details on an object</para>
14038 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties" /> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean)" /> request is
14039 made, the viewer equivalent is hovering the mouse cursor over an object</para>
14040 </remarks>
14041 </member>
14042 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Simulator">
14043 <summary>Get the simulator the object is located</summary>
14044 </member>
14045 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Properties">
14046 <summary>
14047 </summary>
14048 </member>
14049 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Type">
14050 <summary>
14051 </summary>
14052 </member>
14053 <member name="T:OpenMetaverse.TerseObjectUpdateEventArgs">
14054 <summary>Provides primitive data containing updated location, velocity, rotation, textures for the <see cref="E:OpenMetaverse.ObjectManager.TerseObjectUpdate" /> event</summary>
14055 <remarks>
14056 <para>The <see cref="E:OpenMetaverse.ObjectManager.TerseObjectUpdate" /> event occurs when the simulator sends updated location, velocity, rotation, etc</para>
14057 </remarks>
14058 </member>
14059 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Simulator">
14060 <summary>Get the simulator the object is located</summary>
14061 </member>
14062 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Prim">
14063 <summary>Get the primitive details</summary>
14064 </member>
14065 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Update">
14066 <summary>
14067 </summary>
14068 </member>
14069 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.TimeDilation">
14070 <summary>
14071 </summary>
14072 </member>
14073 <member name="T:OpenMetaverse.ObjectDataBlockUpdateEventArgs">
14074 <summary>
14075 </summary>
14076 </member>
14077 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Simulator">
14078 <summary>Get the simulator the object is located</summary>
14079 </member>
14080 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Prim">
14081 <summary>Get the primitive details</summary>
14082 </member>
14083 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.ConstructionData">
14084 <summary>
14085 </summary>
14086 </member>
14087 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Block">
14088 <summary>
14089 </summary>
14090 </member>
14091 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Update">
14092 <summary>
14093 </summary>
14094 </member> 12608 </member>
14095 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.NameValues"> 12609 <member name="M:OpenMetaverse.AttachedSoundEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,OpenMetaverse.SoundFlags)">
14096 <summary> 12610 <summary>
12611 Construct a new instance of the SoundTriggerEventArgs class
14097 </summary> 12612 </summary>
12613 <param name="sim">Simulator where the event originated</param>
12614 <param name="soundID">The sound asset id</param>
12615 <param name="ownerID">The ID of the owner</param>
12616 <param name="objectID">The ID of the object</param>
12617 <param name="gain">The volume level</param>
12618 <param name="flags">The <see cref="T:OpenMetaverse.SoundFlags"/></param>
14098 </member> 12619 </member>
14099 <member name="T:OpenMetaverse.KillObjectEventArgs"> 12620 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Simulator">
14100 <summary>Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the 12621 <summary>Simulator where the event originated</summary>
14101 <see cref="E:OpenMetaverse.ObjectManager.KillObject" /> event</summary>
14102 </member> 12622 </member>
14103 <member name="P:OpenMetaverse.KillObjectEventArgs.Simulator"> 12623 <member name="P:OpenMetaverse.AttachedSoundEventArgs.SoundID">
14104 <summary>Get the simulator the object is located</summary> 12624 <summary>Get the sound asset id</summary>
14105 </member> 12625 </member>
14106 <member name="P:OpenMetaverse.KillObjectEventArgs.ObjectLocalID"> 12626 <member name="P:OpenMetaverse.AttachedSoundEventArgs.OwnerID">
14107 <summary>The LocalID of the object</summary> 12627 <summary>Get the ID of the owner</summary>
14108 </member> 12628 </member>
14109 <member name="T:OpenMetaverse.AvatarSitChangedEventArgs"> 12629 <member name="P:OpenMetaverse.AttachedSoundEventArgs.ObjectID">
14110 <summary> 12630 <summary>Get the ID of the Object</summary>
14111 Provides updates sit position data
14112 </summary>
14113 </member> 12631 </member>
14114 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.Simulator"> 12632 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Gain">
14115 <summary>Get the simulator the object is located</summary> 12633 <summary>Get the volume level</summary>
14116 </member> 12634 </member>
14117 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.Avatar"> 12635 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Flags">
14118 <summary> 12636 <summary>Get the <see cref="T:OpenMetaverse.SoundFlags"/></summary>
14119 </summary>
14120 </member> 12637 </member>
14121 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.SittingOn"> 12638 <member name="T:OpenMetaverse.AttachedSoundGainChangeEventArgs">
14122 <summary> 12639 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.AttachedSoundGainChange"/> event</summary>
14123 </summary> 12640 <remarks>The <see cref="E:OpenMetaverse.SoundManager.AttachedSoundGainChange"/> event occurs when an attached sound
12641 changes its volume level</remarks>
14124 </member> 12642 </member>
14125 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.OldSeat"> 12643 <member name="M:OpenMetaverse.AttachedSoundGainChangeEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Single)">
14126 <summary> 12644 <summary>
12645 Construct a new instance of the AttachedSoundGainChangedEventArgs class
14127 </summary> 12646 </summary>
12647 <param name="sim">Simulator where the event originated</param>
12648 <param name="objectID">The ID of the Object</param>
12649 <param name="gain">The new volume level</param>
14128 </member> 12650 </member>
14129 <member name="T:OpenMetaverse.PayPriceReplyEventArgs"> 12651 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.Simulator">
14130 <summary> 12652 <summary>Simulator where the event originated</summary>
14131 </summary>
14132 </member> 12653 </member>
14133 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.Simulator"> 12654 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.ObjectID">
14134 <summary>Get the simulator the object is located</summary> 12655 <summary>Get the ID of the Object</summary>
14135 </member> 12656 </member>
14136 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.ObjectID"> 12657 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.Gain">
14137 <summary> 12658 <summary>Get the volume level</summary>
14138 </summary>
14139 </member> 12659 </member>
14140 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.DefaultPrice"> 12660 <member name="T:OpenMetaverse.SoundTriggerEventArgs">
14141 <summary> 12661 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.SoundTrigger"/> event</summary>
14142 </summary> 12662 <remarks><para>The <see cref="E:OpenMetaverse.SoundManager.SoundTrigger"/> event occurs when the simulator forwards
12663 a request made by yourself or another agent to play either an asset sound or a built in sound</para>
12664
12665 <para>Requests to play sounds where the <see cref="P:OpenMetaverse.SoundTriggerEventArgs.SoundID"/> is not one of the built-in
12666 <see cref="T:OpenMetaverse.Sounds"/> will require sending a request to download the sound asset before it can be played</para>
12667 </remarks>
12668 <example>
12669 The following code example uses the <see cref="P:OpenMetaverse.SoundTriggerEventArgs.OwnerID"/>, <see cref="P:OpenMetaverse.SoundTriggerEventArgs.SoundID"/>
12670 and <see cref="P:OpenMetaverse.SoundTriggerEventArgs.Gain"/>
12671 properties to display some information on a sound request on the <see cref="T:System.Console"/> window.
12672 <code>
12673 // subscribe to the event
12674 Client.Sound.SoundTrigger += Sound_SoundTrigger;
12675
12676 // play the pre-defined BELL_TING sound
12677 Client.Sound.SendSoundTrigger(Sounds.BELL_TING);
12678
12679 // handle the response data
12680 private void Sound_SoundTrigger(object sender, SoundTriggerEventArgs e)
12681 {
12682 Console.WriteLine("{0} played the sound {1} at volume {2}",
12683 e.OwnerID, e.SoundID, e.Gain);
12684 }
12685 </code>
12686 </example>
14143 </member> 12687 </member>
14144 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.ButtonPrices"> 12688 <member name="M:OpenMetaverse.SoundTriggerEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,System.UInt64,OpenMetaverse.Vector3)">
14145 <summary> 12689 <summary>
12690 Construct a new instance of the SoundTriggerEventArgs class
14146 </summary> 12691 </summary>
12692 <param name="sim">Simulator where the event originated</param>
12693 <param name="soundID">The sound asset id</param>
12694 <param name="ownerID">The ID of the owner</param>
12695 <param name="objectID">The ID of the object</param>
12696 <param name="parentID">The ID of the objects parent</param>
12697 <param name="gain">The volume level</param>
12698 <param name="regionHandle">The regionhandle</param>
12699 <param name="position">The source position</param>
14147 </member> 12700 </member>
14148 <member name="P:OpenMetaverse.ObjectMediaEventArgs.Success"> 12701 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Simulator">
14149 <summary> 12702 <summary>Simulator where the event originated</summary>
14150 Indicates if the operation was successful
14151 </summary>
14152 </member> 12703 </member>
14153 <member name="P:OpenMetaverse.ObjectMediaEventArgs.Version"> 12704 <member name="P:OpenMetaverse.SoundTriggerEventArgs.SoundID">
14154 <summary> 12705 <summary>Get the sound asset id</summary>
14155 Media version string
14156 </summary>
14157 </member> 12706 </member>
14158 <member name="P:OpenMetaverse.ObjectMediaEventArgs.FaceMedia"> 12707 <member name="P:OpenMetaverse.SoundTriggerEventArgs.OwnerID">
14159 <summary> 12708 <summary>Get the ID of the owner</summary>
14160 Array of media entries indexed by face number
14161 </summary>
14162 </member> 12709 </member>
14163 <member name="T:OpenMetaverse.PhysicsPropertiesEventArgs"> 12710 <member name="P:OpenMetaverse.SoundTriggerEventArgs.ObjectID">
14164 <summary> 12711 <summary>Get the ID of the Object</summary>
14165 Set when simulator sends us infomation on primitive's physical properties
14166 </summary>
14167 </member> 12712 </member>
14168 <member name="M:OpenMetaverse.PhysicsPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive.PhysicsProperties)"> 12713 <member name="P:OpenMetaverse.SoundTriggerEventArgs.ParentID">
14169 <summary> 12714 <summary>Get the ID of the objects parent</summary>
14170 Constructor
14171 </summary>
14172 <param name="sim">Simulator where the message originated</param>
14173 <param name="props">Updated physical properties</param>
14174 </member> 12715 </member>
14175 <member name="F:OpenMetaverse.PhysicsPropertiesEventArgs.Simulator"> 12716 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Gain">
14176 <summary>Simulator where the message originated</summary> 12717 <summary>Get the volume level</summary>
14177 </member> 12718 </member>
14178 <member name="F:OpenMetaverse.PhysicsPropertiesEventArgs.PhysicsProperties"> 12719 <member name="P:OpenMetaverse.SoundTriggerEventArgs.RegionHandle">
14179 <summary>Updated physical properties</summary> 12720 <summary>Get the regionhandle</summary>
14180 </member> 12721 </member>
14181 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor"> 12722 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Position">
14182 <summary> 12723 <summary>Get the source position</summary>
14183 Create an allocated UDP packet buffer for receiving a packet
14184 </summary>
14185 </member> 12724 </member>
14186 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor(System.Net.IPEndPoint)"> 12725 <member name="T:OpenMetaverse.PreloadSoundEventArgs">
14187 <summary> 12726 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance"/> event</summary>
14188 Create an allocated UDP packet buffer for sending a packet 12727 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance"/> event occurs when the simulator sends
14189 </summary> 12728 the appearance data for an avatar</remarks>
14190 <param name="endPoint">EndPoint of the remote host</param> 12729 <example>
12730 The following code example uses the <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID"/> and <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams"/>
12731 properties to display the selected shape of an avatar on the <see cref="T:System.Console"/> window.
12732 <code>
12733 // subscribe to the event
12734 Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance;
12735
12736 // handle the data when the event is raised
12737 void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e)
12738 {
12739 Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] &gt; 0) : "male" ? "female")
12740 }
12741 </code>
12742 </example>
14191 </member> 12743 </member>
14192 <member name="M:OpenMetaverse.UDPPacketBuffer.#ctor(System.Net.IPEndPoint,System.Int32)"> 12744 <member name="M:OpenMetaverse.PreloadSoundEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
14193 <summary> 12745 <summary>
14194 Create an allocated UDP packet buffer for sending a packet 12746 Construct a new instance of the PreloadSoundEventArgs class
14195 </summary> 12747 </summary>
14196 <param name="endPoint">EndPoint of the remote host</param> 12748 <param name="sim">Simulator where the event originated</param>
14197 <param name="bufferSize">Size of the buffer to allocate for packet data</param> 12749 <param name="soundID">The sound asset id</param>
12750 <param name="ownerID">The ID of the owner</param>
12751 <param name="objectID">The ID of the object</param>
14198 </member> 12752 </member>
14199 <member name="F:OpenMetaverse.UDPPacketBuffer.BUFFER_SIZE"> 12753 <member name="P:OpenMetaverse.PreloadSoundEventArgs.Simulator">
14200 <summary>Size of the byte array used to store raw packet data</summary> 12754 <summary>Simulator where the event originated</summary>
14201 </member> 12755 </member>
14202 <member name="F:OpenMetaverse.UDPPacketBuffer.Data"> 12756 <member name="P:OpenMetaverse.PreloadSoundEventArgs.SoundID">
14203 <summary>Raw packet data buffer</summary> 12757 <summary>Get the sound asset id</summary>
14204 </member> 12758 </member>
14205 <member name="F:OpenMetaverse.UDPPacketBuffer.DataLength"> 12759 <member name="P:OpenMetaverse.PreloadSoundEventArgs.OwnerID">
14206 <summary>Length of the data to transmit</summary> 12760 <summary>Get the ID of the owner</summary>
14207 </member> 12761 </member>
14208 <member name="F:OpenMetaverse.UDPPacketBuffer.RemoteEndPoint"> 12762 <member name="P:OpenMetaverse.PreloadSoundEventArgs.ObjectID">
14209 <summary>EndPoint of the remote host</summary> 12763 <summary>Get the ID of the Object</summary>
14210 </member> 12764 </member>
14211 <member name="T:OpenMetaverse.PacketBufferPool"> 12765 <member name="F:OpenMetaverse.Voice.VoicePosition.Position">
14212 <summary> 12766 <summary>Positional vector of the users position</summary>
14213 Object pool for packet buffers. This is used to allocate memory for all
14214 incoming and outgoing packets, and zerocoding buffers for those packets
14215 </summary>
14216 </member> 12767 </member>
14217 <member name="M:OpenMetaverse.PacketBufferPool.#ctor(System.Net.IPEndPoint,System.Int32,System.Int32)"> 12768 <member name="F:OpenMetaverse.Voice.VoicePosition.Velocity">
14218 <summary> 12769 <summary>Velocity vector of the position</summary>
14219 Initialize the object pool in client mode
14220 </summary>
14221 <param name="endPoint">Server to connect to</param>
14222 <param name="itemsPerSegment">
14223 </param>
14224 <param name="minSegments">
14225 </param>
14226 </member> 12770 </member>
14227 <member name="M:OpenMetaverse.PacketBufferPool.#ctor(System.Int32,System.Int32)"> 12771 <member name="F:OpenMetaverse.Voice.VoicePosition.AtOrientation">
14228 <summary> 12772 <summary>At Orientation (X axis) of the position</summary>
14229 Initialize the object pool in server mode
14230 </summary>
14231 <param name="itemsPerSegment">
14232 </param>
14233 <param name="minSegments">
14234 </param>
14235 </member> 12773 </member>
14236 <member name="M:OpenMetaverse.PacketBufferPool.GetObjectInstance"> 12774 <member name="F:OpenMetaverse.Voice.VoicePosition.UpOrientation">
14237 <summary> 12775 <summary>Up Orientation (Y axis) of the position</summary>
14238 Returns a packet buffer with EndPoint set if the buffer is in
14239 client mode, or with EndPoint set to null in server mode
14240 </summary>
14241 <returns>Initialized UDPPacketBuffer object</returns>
14242 </member> 12776 </member>
14243 <member name="M:OpenMetaverse.Pool.#ctor"> 12777 <member name="F:OpenMetaverse.Voice.VoicePosition.LeftOrientation">
14244 <summary> 12778 <summary>Left Orientation (Z axis) of the position</summary>
14245 Default constructor
14246 </summary>
14247 </member> 12779 </member>
14248 <member name="M:OpenMetaverse.Pool.CheckOut"> 12780 <member name="T:OpenMetaverse.Rendering.FacetedMesh">
14249 <summary> 12781 <summary>
14250 Check a packet buffer out of the pool 12782 Contains all mesh faces that belong to a prim
14251 </summary> 12783 </summary>
14252 <returns>A packet buffer object</returns>
14253 </member> 12784 </member>
14254 <member name="P:OpenMetaverse.WrappedObject`1.Instance"> 12785 <member name="F:OpenMetaverse.Rendering.FacetedMesh.Faces">
14255 <summary> 12786 <summary>List of primitive faces</summary>
14256 Returns an instance of the class that has been checked out of the Object Pool.
14257 </summary>
14258 </member> 12787 </member>
14259 <member name="M:OpenMetaverse.WrappedObject`1.Dispose"> 12788 <member name="M:OpenMetaverse.Rendering.FacetedMesh.TryDecodeFromAsset(OpenMetaverse.Primitive,OpenMetaverse.Assets.AssetMesh,OpenMetaverse.Rendering.DetailLevel,OpenMetaverse.Rendering.FacetedMesh@)">
14260 <summary> 12789 <summary>
14261 Checks the instance back into the object pool 12790 Decodes mesh asset into FacetedMesh
14262 </summary> 12791 </summary>
12792 <param name="prim">Mesh primitive</param>
12793 <param name="meshAsset">Asset retrieved from the asset server</param>
12794 <param name="LOD">Level of detail</param>
12795 <param name="mesh">Resulting decoded FacetedMesh</param>
12796 <returns>True if mesh asset decoding was successful</returns>
14263 </member> 12797 </member>
14264 <member name="M:OpenMetaverse.ObjectPoolBase`1.#ctor"> 12798 <member name="T:OpenMetaverse.Assets.GestureStepType">
14265 <summary> 12799 <summary>
14266 Creates a new instance of the ObjectPoolBase class. Initialize MUST be called 12800 Type of gesture step
14267 after using this constructor.
14268 </summary> 12801 </summary>
14269 </member> 12802 </member>
14270 <member name="M:OpenMetaverse.ObjectPoolBase`1.#ctor(System.Int32,System.Int32,System.Boolean,System.Int32)"> 12803 <member name="T:OpenMetaverse.Assets.GestureStep">
14271 <summary> 12804 <summary>
14272 Creates a new instance of the ObjectPool Base class. 12805 Base class for gesture steps
14273 </summary> 12806 </summary>
14274 <param name="itemsPerSegment">The object pool is composed of segments, which
14275 are allocated whenever the size of the pool is exceeded. The number of items
14276 in a segment should be large enough that allocating a new segmeng is a rare
14277 thing. For example, on a server that will have 10k people logged in at once,
14278 the receive buffer object pool should have segment sizes of at least 1000
14279 byte arrays per segment.
14280 </param>
14281 <param name="minimumSegmentCount">The minimun number of segments that may exist.</param>
14282 <param name="gcOnPoolGrowth">Perform a full GC.Collect whenever a segment is allocated, and then again after allocation to compact the heap.</param>
14283 <param name="cleanupFrequenceMS">The frequency which segments are checked to see if they're eligible for cleanup.</param>
14284 </member> 12807 </member>
14285 <member name="P:OpenMetaverse.ObjectPoolBase`1.TotalSegments"> 12808 <member name="P:OpenMetaverse.Assets.GestureStep.GestureStepType">
14286 <summary> 12809 <summary>
14287 The total number of segments created. Intended to be used by the Unit Tests. 12810 Retururns what kind of gesture step this is
14288 </summary> 12811 </summary>
14289 </member> 12812 </member>
14290 <member name="P:OpenMetaverse.ObjectPoolBase`1.ItemsPerSegment"> 12813 <member name="T:OpenMetaverse.Assets.GestureStepAnimation">
14291 <summary> 12814 <summary>
14292 The number of items that are in a segment. Items in a segment 12815 Describes animation step of a gesture
14293 are all allocated at the same time, and are hopefully close to
14294 each other in the managed heap.
14295 </summary> 12816 </summary>
14296 </member> 12817 </member>
14297 <member name="P:OpenMetaverse.ObjectPoolBase`1.MinimumSegmentCount"> 12818 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.AnimationStart">
14298 <summary> 12819 <summary>
14299 The minimum number of segments. When segments are reclaimed, 12820 If true, this step represents start of animation, otherwise animation stop
14300 this number of segments will always be left alone. These
14301 segments are allocated at startup.
14302 </summary> 12821 </summary>
14303 </member> 12822 </member>
14304 <member name="P:OpenMetaverse.ObjectPoolBase`1.MinimumSegmentAgePriorToCleanup"> 12823 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.ID">
14305 <summary> 12824 <summary>
14306 The age a segment must be before it's eligible for cleanup. 12825 Animation asset <see cref="T:OpenMetaverse.UUID"/>
14307 This is used to prevent thrash, and typical values are in
14308 the 5 minute range.
14309 </summary> 12826 </summary>
14310 </member> 12827 </member>
14311 <member name="P:OpenMetaverse.ObjectPoolBase`1.CleanupFrequencyMilliseconds"> 12828 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.Name">
14312 <summary> 12829 <summary>
14313 The frequence which the cleanup thread runs. This is typically 12830 Animation inventory name
14314 expected to be in the 5 minute range.
14315 </summary> 12831 </summary>
14316 </member> 12832 </member>
14317 <member name="M:OpenMetaverse.ObjectPoolBase`1.ForceCleanup"> 12833 <member name="P:OpenMetaverse.Assets.GestureStepAnimation.GestureStepType">
14318 <summary> 12834 <summary>
14319 Forces the segment cleanup algorithm to be run. This method is intended 12835 Returns what kind of gesture step this is
14320 primarly for use from the Unit Test libraries.
14321 </summary> 12836 </summary>
14322 </member> 12837 </member>
14323 <member name="M:OpenMetaverse.ObjectPoolBase`1.GetObjectInstance"> 12838 <member name="T:OpenMetaverse.Assets.GestureStepSound">
14324 <summary> 12839 <summary>
14325 Responsible for allocate 1 instance of an object that will be stored in a segment. 12840 Describes sound step of a gesture
14326 </summary> 12841 </summary>
14327 <returns>An instance of whatever objec the pool is pooling.</returns>
14328 </member> 12842 </member>
14329 <member name="M:OpenMetaverse.ObjectPoolBase`1.CheckIn(OpenMetaverse.ObjectPoolSegment{`0},`0)"> 12843 <member name="F:OpenMetaverse.Assets.GestureStepSound.ID">
14330 <summary> 12844 <summary>
14331 Checks in an instance of T owned by the object pool. This method is only intended to be called 12845 Sound asset <see cref="T:OpenMetaverse.UUID"/>
14332 by the <c>WrappedObject</c> class.
14333 </summary> 12846 </summary>
14334 <param name="owningSegment">The segment from which the instance is checked out.</param>
14335 <param name="instance">The instance of <c>T</c> to check back into the segment.</param>
14336 </member> 12847 </member>
14337 <member name="M:OpenMetaverse.ObjectPoolBase`1.CheckOut"> 12848 <member name="F:OpenMetaverse.Assets.GestureStepSound.Name">
14338 <summary> 12849 <summary>
14339 Checks an instance of <c>T</c> from the pool. If the pool is not sufficient to 12850 Sound inventory name
14340 allow the checkout, a new segment is created.
14341 </summary> 12851 </summary>
14342 <returns>A <c>WrappedObject</c> around the instance of <c>T</c>. To check
14343 the instance back into the segment, be sureto dispose the WrappedObject
14344 when finished. </returns>
14345 </member> 12852 </member>
14346 <member name="T:OpenMetaverse.DictionaryEventAction"> 12853 <member name="P:OpenMetaverse.Assets.GestureStepSound.GestureStepType">
14347 <summary> 12854 <summary>
12855 Returns what kind of gesture step this is
14348 </summary> 12856 </summary>
14349 </member> 12857 </member>
14350 <member name="F:OpenMetaverse.DictionaryEventAction.Add"> 12858 <member name="T:OpenMetaverse.Assets.GestureStepChat">
14351 <summary> 12859 <summary>
12860 Describes sound step of a gesture
14352 </summary> 12861 </summary>
14353 </member> 12862 </member>
14354 <member name="F:OpenMetaverse.DictionaryEventAction.Remove"> 12863 <member name="F:OpenMetaverse.Assets.GestureStepChat.Text">
14355 <summary> 12864 <summary>
12865 Text to output in chat
14356 </summary> 12866 </summary>
14357 </member> 12867 </member>
14358 <member name="F:OpenMetaverse.DictionaryEventAction.Change"> 12868 <member name="P:OpenMetaverse.Assets.GestureStepChat.GestureStepType">
14359 <summary> 12869 <summary>
12870 Returns what kind of gesture step this is
14360 </summary> 12871 </summary>
14361 </member> 12872 </member>
14362 <member name="T:OpenMetaverse.ObservableDictionary`2"> 12873 <member name="T:OpenMetaverse.Assets.GestureStepWait">
14363 <summary> 12874 <summary>
14364 The ObservableDictionary class is used for storing key/value pairs. It has methods for firing 12875 Describes sound step of a gesture
14365 events to subscribers when items are added, removed, or changed.
14366 </summary> 12876 </summary>
14367 <typeparam name="TKey">Key <see langword="Tkey" /></typeparam>
14368 <typeparam name="TValue">Value <see langword="TValue" /></typeparam>
14369 </member> 12877 </member>
14370 <member name="M:OpenMetaverse.ObservableDictionary`2.#ctor"> 12878 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitForAnimation">
14371 <summary> 12879 <summary>
14372 Initializes a new instance of the <seealso cref="T:ObservableDictionary" /> Class 12880 If true in this step we wait for all animations to finish
14373 with the specified key/value, has the default initial capacity.
14374 </summary> 12881 </summary>
14375 <example>
14376 <code>
14377 // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value.
14378 public ObservableDictionary&lt;string, int&gt; testDict = new ObservableDictionary&lt;string, int&gt;();
14379 </code>
14380 </example>
14381 </member> 12882 </member>
14382 <member name="M:OpenMetaverse.ObservableDictionary`2.#ctor(System.Int32)"> 12883 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitForTime">
14383 <summary> 12884 <summary>
14384 Initializes a new instance of the <seealso cref="T:OpenMetaverse.ObservableDictionary" /> Class 12885 If true gesture player should wait for the specified amount of time
14385 with the specified key/value, With its initial capacity specified.
14386 </summary> 12886 </summary>
14387 <param name="capacity">Initial size of dictionary</param>
14388 <example>
14389 <code>
14390 // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value,
14391 // initially allocated room for 10 entries.
14392 public ObservableDictionary&lt;string, int&gt; testDict = new ObservableDictionary&lt;string, int&gt;(10);
14393 </code>
14394 </example>
14395 </member> 12887 </member>
14396 <member name="F:OpenMetaverse.ObservableDictionary`2.Delegates"> 12888 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitTime">
14397 <summary> 12889 <summary>
14398 A dictionary of callbacks to fire when specified action occurs 12890 Time in seconds to wait if WaitForAnimation is false
14399 </summary> 12891 </summary>
14400 </member> 12892 </member>
14401 <member name="F:OpenMetaverse.ObservableDictionary`2.Dictionary"> 12893 <member name="P:OpenMetaverse.Assets.GestureStepWait.GestureStepType">
14402 <summary>Internal dictionary that this class wraps around. Do not
14403 modify or enumerate the contents of this dictionary without locking</summary>
14404 </member>
14405 <member name="P:OpenMetaverse.ObservableDictionary`2.Item(`0)">
14406 <summary> 12894 <summary>
14407 Indexer for the dictionary 12895 Returns what kind of gesture step this is
14408 </summary> 12896 </summary>
14409 <param name="key">The key</param>
14410 <returns>The value</returns>
14411 </member>
14412 <member name="P:OpenMetaverse.ObservableDictionary`2.Count">
14413 <summary>
14414 Gets the number of Key/Value pairs contained in the <seealso cref="T:ObservableDictionary" /></summary>
14415 </member> 12897 </member>
14416 <member name="M:OpenMetaverse.ObservableDictionary`2.AddDelegate(OpenMetaverse.DictionaryEventAction,OpenMetaverse.DictionaryChangeCallback)"> 12898 <member name="T:OpenMetaverse.Assets.GestureStepEOF">
14417 <summary> 12899 <summary>
14418 Register a callback to be fired when an action occurs 12900 Describes the final step of a gesture
14419 </summary> 12901 </summary>
14420 <param name="action">The action</param>
14421 <param name="callback">The callback to fire</param>
14422 </member> 12902 </member>
14423 <member name="M:OpenMetaverse.ObservableDictionary`2.RemoveDelegate(OpenMetaverse.DictionaryEventAction,OpenMetaverse.DictionaryChangeCallback)"> 12903 <member name="P:OpenMetaverse.Assets.GestureStepEOF.GestureStepType">
14424 <summary> 12904 <summary>
14425 Unregister a callback 12905 Returns what kind of gesture step this is
14426 </summary> 12906 </summary>
14427 <param name="action">The action</param>
14428 <param name="callback">The callback to fire</param>
14429 </member> 12907 </member>
14430 <member name="M:OpenMetaverse.ObservableDictionary`2.FireChangeEvent(OpenMetaverse.DictionaryEventAction,System.Collections.DictionaryEntry)"> 12908 <member name="T:OpenMetaverse.Assets.AssetGesture">
14431 <summary> 12909 <summary>
12910 Represents a sequence of animations, sounds, and chat actions
14432 </summary> 12911 </summary>
14433 <param name="action">
14434 </param>
14435 <param name="entry">
14436 </param>
14437 </member> 12912 </member>
14438 <member name="M:OpenMetaverse.ObservableDictionary`2.TryGetValue(`0,`1@)"> 12913 <member name="F:OpenMetaverse.Assets.AssetGesture.TriggerKey">
14439 <summary> 12914 <summary>
14440 Try to get entry from the <seealso cref="!:ObservableDictionary" /> with specified key 12915 Keyboard key that triggers the gestyre
14441 </summary> 12916 </summary>
14442 <param name="key">Key to use for lookup</param>
14443 <param name="value">Value returned</param>
14444 <returns>
14445 <see langword="true" /> if specified key exists, <see langword="false" /> if not found</returns>
14446 <example>
14447 <code>
14448 // find your avatar using the Simulator.ObjectsAvatars ObservableDictionary:
14449 Avatar av;
14450 if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av))
14451 Console.WriteLine("Found Avatar {0}", av.Name);
14452 </code>
14453 <seealso cref="F:OpenMetaverse.Simulator.ObjectsAvatars" />
14454 </example>
14455 </member> 12917 </member>
14456 <member name="M:OpenMetaverse.ObservableDictionary`2.Find(System.Predicate{`1})"> 12918 <member name="F:OpenMetaverse.Assets.AssetGesture.TriggerKeyMask">
14457 <summary> 12919 <summary>
14458 Finds the specified match. 12920 Modifier to the trigger key
14459 </summary> 12921 </summary>
14460 <param name="match">The match.</param>
14461 <returns>Matched value</returns>
14462 <example>
14463 <code>
14464 // use a delegate to find a prim in the ObjectsPrimitives ObservableDictionary
14465 // with the ID 95683496
14466 uint findID = 95683496;
14467 Primitive findPrim = sim.ObjectsPrimitives.Find(
14468 delegate(Primitive prim) { return prim.ID == findID; });
14469 </code>
14470 </example>
14471 </member>
14472 <member name="M:OpenMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`1})">
14473 <summary>Find All items in an <seealso cref="T:ObservableDictionary" /></summary>
14474 <param name="match">return matching items.</param>
14475 <returns>a <seealso cref="T:System.Collections.Generic.List" /> containing found items.</returns>
14476 <example>
14477 Find All prims within 20 meters and store them in a List
14478 <code>
14479 int radius = 20;
14480 List&lt;Primitive&gt; prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll(
14481 delegate(Primitive prim) {
14482 Vector3 pos = prim.Position;
14483 return ((prim.ParentID == 0) &amp;&amp; (pos != Vector3.Zero) &amp;&amp; (Vector3.Distance(pos, location) &lt; radius));
14484 }
14485 );
14486 </code></example>
14487 </member>
14488 <member name="M:OpenMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`0})">
14489 <summary>Find All items in an <seealso cref="T:ObservableDictionary" /></summary>
14490 <param name="match">return matching keys.</param>
14491 <returns>a <seealso cref="T:System.Collections.Generic.List" /> containing found keys.</returns>
14492 <example>
14493 Find All keys which also exist in another dictionary
14494 <code>
14495 List&lt;UUID&gt; matches = myDict.FindAll(
14496 delegate(UUID id) {
14497 return myOtherDict.ContainsKey(id);
14498 }
14499 );
14500 </code></example>
14501 </member>
14502 <member name="M:OpenMetaverse.ObservableDictionary`2.ContainsKey(`0)">
14503 <summary>Check if Key exists in Dictionary</summary>
14504 <param name="key">Key to check for</param>
14505 <returns>
14506 <see langword="true" /> if found, <see langword="false" /> otherwise</returns>
14507 </member>
14508 <member name="M:OpenMetaverse.ObservableDictionary`2.ContainsValue(`1)">
14509 <summary>Check if Value exists in Dictionary</summary>
14510 <param name="value">Value to check for</param>
14511 <returns>
14512 <see langword="true" /> if found, <see langword="false" /> otherwise</returns>
14513 </member> 12922 </member>
14514 <member name="M:OpenMetaverse.ObservableDictionary`2.Add(`0,`1)"> 12923 <member name="F:OpenMetaverse.Assets.AssetGesture.Trigger">
14515 <summary>
14516 Adds the specified key to the dictionary, dictionary locking is not performed,
14517 <see cref="!:SafeAdd" /></summary>
14518 <param name="key">The key</param>
14519 <param name="value">The value</param>
14520 </member>
14521 <member name="M:OpenMetaverse.ObservableDictionary`2.Remove(`0)">
14522 <summary> 12924 <summary>
14523 Removes the specified key, dictionary locking is not performed 12925 String that triggers playing of the gesture sequence
14524 </summary> 12926 </summary>
14525 <param name="key">The key.</param>
14526 <returns>
14527 <see langword="true" /> if successful, <see langword="false" /> otherwise</returns>
14528 </member> 12927 </member>
14529 <member name="M:OpenMetaverse.ObservableDictionary`2.Clear"> 12928 <member name="F:OpenMetaverse.Assets.AssetGesture.ReplaceWith">
14530 <summary> 12929 <summary>
14531 Clear the contents of the dictionary 12930 Text that replaces trigger in chat once gesture is triggered
14532 </summary> 12931 </summary>
14533 </member> 12932 </member>
14534 <member name="M:OpenMetaverse.ObservableDictionary`2.GetEnumerator"> 12933 <member name="F:OpenMetaverse.Assets.AssetGesture.Sequence">
14535 <summary> 12934 <summary>
14536 Enumerator for iterating dictionary entries 12935 Sequence of gesture steps
14537 </summary> 12936 </summary>
14538 <returns>
14539 </returns>
14540 </member> 12937 </member>
14541 <member name="T:OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder"> 12938 <member name="M:OpenMetaverse.Assets.AssetGesture.#ctor">
14542 <summary> 12939 <summary>
14543 A custom decoder callback 12940 Constructs guesture asset
14544 </summary> 12941 </summary>
14545 <param name="fieldName">The key of the object</param>
14546 <param name="fieldData">the data to decode</param>
14547 <returns>A string represending the fieldData</returns>
14548 </member> 12942 </member>
14549 <member name="M:OpenMetaverse.Packets.PacketDecoder.AddCallback(System.String,OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder)"> 12943 <member name="M:OpenMetaverse.Assets.AssetGesture.#ctor(OpenMetaverse.UUID,System.Byte[])">
14550 <summary> 12944 <summary>
14551 Add a custom decoder callback 12945 Constructs guesture asset
14552 </summary> 12946 </summary>
14553 <param name="key">The key of the field to decode</param> 12947 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
14554 <param name="customPacketHandler">The custom decode handler</param> 12948 <param name="assetData">A byte array containing the raw asset data</param>
14555 </member> 12949 </member>
14556 <member name="M:OpenMetaverse.Packets.PacketDecoder.RemoveCustomHandler(System.String,OpenMetaverse.Packets.PacketDecoder.CustomPacketDecoder)"> 12950 <member name="M:OpenMetaverse.Assets.AssetGesture.Encode">
14557 <summary> 12951 <summary>
14558 Remove a custom decoder callback 12952 Encodes gesture asset suitable for uplaod
14559 </summary> 12953 </summary>
14560 <param name="key">The key of the field to decode</param>
14561 <param name="customPacketHandler">The custom decode handler</param>
14562 </member> 12954 </member>
14563 <member name="M:OpenMetaverse.Packets.PacketDecoder.PacketToString(OpenMetaverse.Packets.Packet)"> 12955 <member name="M:OpenMetaverse.Assets.AssetGesture.Decode">
14564 <summary> 12956 <summary>
14565 Creates a formatted string containing the values of a Packet 12957 Decodes gesture assset into play sequence
14566 </summary> 12958 </summary>
14567 <param name="packet">The Packet</param> 12959 <returns>true if the asset data was decoded successfully</returns>
14568 <returns>A formatted string of values of the nested items in the Packet object</returns>
14569 </member> 12960 </member>
14570 <member name="M:OpenMetaverse.Packets.PacketDecoder.MessageToString(System.Object,System.Int32)"> 12961 <member name="P:OpenMetaverse.Assets.AssetGesture.AssetType">
14571 <summary> 12962 <summary>
14572 Decode an IMessage object into a beautifully formatted string 12963 Returns asset type
14573 </summary> 12964 </summary>
14574 <param name="message">The IMessage object</param>
14575 <param name="recurseLevel">Recursion level (used for indenting)</param>
14576 <returns>A formatted string containing the names and values of the source object</returns>
14577 </member> 12965 </member>
14578 <member name="T:OpenMetaverse.ObjectReturnType"> 12966 <member name="T:OpenMetaverse.ObjectReturnType">
14579 <summary> 12967 <summary>
@@ -14581,8 +12969,7 @@
14581 </summary> 12969 </summary>
14582 </member> 12970 </member>
14583 <member name="F:OpenMetaverse.ObjectReturnType.None"> 12971 <member name="F:OpenMetaverse.ObjectReturnType.None">
14584 <summary> 12972 <summary></summary>
14585 </summary>
14586 </member> 12973 </member>
14587 <member name="F:OpenMetaverse.ObjectReturnType.Owner"> 12974 <member name="F:OpenMetaverse.ObjectReturnType.Owner">
14588 <summary>Return objects owned by parcel owner</summary> 12975 <summary>Return objects owned by parcel owner</summary>
@@ -14817,11 +13204,11 @@
14817 <summary>If Deeded, owner contributes required tier to group parcel is deeded to</summary> 13204 <summary>If Deeded, owner contributes required tier to group parcel is deeded to</summary>
14818 </member> 13205 </member>
14819 <member name="F:OpenMetaverse.ParcelFlags.SoundLocal"> 13206 <member name="F:OpenMetaverse.ParcelFlags.SoundLocal">
14820 <summary>Restrict sounds originating on this parcel to the 13207 <summary>Restrict sounds originating on this parcel to the
14821 parcel boundaries</summary> 13208 parcel boundaries</summary>
14822 </member> 13209 </member>
14823 <member name="F:OpenMetaverse.ParcelFlags.SellParcelObjects"> 13210 <member name="F:OpenMetaverse.ParcelFlags.SellParcelObjects">
14824 <summary>Objects on this parcel are sold when the land is 13211 <summary>Objects on this parcel are sold when the land is
14825 purchsaed</summary> 13212 purchsaed</summary>
14826 </member> 13213 </member>
14827 <member name="F:OpenMetaverse.ParcelFlags.AllowPublish"> 13214 <member name="F:OpenMetaverse.ParcelFlags.AllowPublish">
@@ -14846,7 +13233,7 @@
14846 <summary>Allow group-owned scripts to run</summary> 13233 <summary>Allow group-owned scripts to run</summary>
14847 </member> 13234 </member>
14848 <member name="F:OpenMetaverse.ParcelFlags.CreateGroupObjects"> 13235 <member name="F:OpenMetaverse.ParcelFlags.CreateGroupObjects">
14849 <summary>Allow object creation by group members or group 13236 <summary>Allow object creation by group members or group
14850 objects</summary> 13237 objects</summary>
14851 </member> 13238 </member>
14852 <member name="F:OpenMetaverse.ParcelFlags.AllowAPrimitiveEntry"> 13239 <member name="F:OpenMetaverse.ParcelFlags.AllowAPrimitiveEntry">
@@ -14961,12 +13348,12 @@
14961 <summary>Start the current media stream playing and stop when the end is reached</summary> 13348 <summary>Start the current media stream playing and stop when the end is reached</summary>
14962 </member> 13349 </member>
14963 <member name="F:OpenMetaverse.ParcelMediaCommand.Loop"> 13350 <member name="F:OpenMetaverse.ParcelMediaCommand.Loop">
14964 <summary>Start the current media stream playing, 13351 <summary>Start the current media stream playing,
14965 loop to the beginning when the end is reached and continue to play</summary> 13352 loop to the beginning when the end is reached and continue to play</summary>
14966 </member> 13353 </member>
14967 <member name="F:OpenMetaverse.ParcelMediaCommand.Texture"> 13354 <member name="F:OpenMetaverse.ParcelMediaCommand.Texture">
14968 <summary>Specifies the texture to replace with video</summary> 13355 <summary>Specifies the texture to replace with video</summary>
14969 <remarks>If passing the key of a texture, it must be explicitly typecast as a key, 13356 <remarks>If passing the key of a texture, it must be explicitly typecast as a key,
14970 not just passed within double quotes.</remarks> 13357 not just passed within double quotes.</remarks>
14971 </member> 13358 </member>
14972 <member name="F:OpenMetaverse.ParcelMediaCommand.URL"> 13359 <member name="F:OpenMetaverse.ParcelMediaCommand.URL">
@@ -14979,15 +13366,15 @@
14979 <summary>Specifies a single agent to apply the media command to</summary> 13366 <summary>Specifies a single agent to apply the media command to</summary>
14980 </member> 13367 </member>
14981 <member name="F:OpenMetaverse.ParcelMediaCommand.Unload"> 13368 <member name="F:OpenMetaverse.ParcelMediaCommand.Unload">
14982 <summary>Unloads the stream. While the stop command sets the texture to the first frame of the movie, 13369 <summary>Unloads the stream. While the stop command sets the texture to the first frame of the movie,
14983 unload resets it to the real texture that the movie was replacing.</summary> 13370 unload resets it to the real texture that the movie was replacing.</summary>
14984 </member> 13371 </member>
14985 <member name="F:OpenMetaverse.ParcelMediaCommand.AutoAlign"> 13372 <member name="F:OpenMetaverse.ParcelMediaCommand.AutoAlign">
14986 <summary>Turn on/off the auto align feature, similar to the auto align checkbox in the parcel media properties 13373 <summary>Turn on/off the auto align feature, similar to the auto align checkbox in the parcel media properties
14987 (NOT to be confused with the "align" function in the textures view of the editor!) Takes TRUE or FALSE as parameter.</summary> 13374 (NOT to be confused with the "align" function in the textures view of the editor!) Takes TRUE or FALSE as parameter.</summary>
14988 </member> 13375 </member>
14989 <member name="F:OpenMetaverse.ParcelMediaCommand.Type"> 13376 <member name="F:OpenMetaverse.ParcelMediaCommand.Type">
14990 <summary>Allows a Web page or image to be placed on a prim (1.19.1 RC0 and later only). 13377 <summary>Allows a Web page or image to be placed on a prim (1.19.1 RC0 and later only).
14991 Use "text/html" for HTML.</summary> 13378 Use "text/html" for HTML.</summary>
14992 </member> 13379 </member>
14993 <member name="F:OpenMetaverse.ParcelMediaCommand.Size"> 13380 <member name="F:OpenMetaverse.ParcelMediaCommand.Size">
@@ -15006,7 +13393,7 @@
15006 <summary>Global Key of record</summary> 13393 <summary>Global Key of record</summary>
15007 </member> 13394 </member>
15008 <member name="F:OpenMetaverse.ParcelInfo.OwnerID"> 13395 <member name="F:OpenMetaverse.ParcelInfo.OwnerID">
15009 <summary>Parcel Owners <seealso cref="T:OpenMetaverse.UUID" /></summary> 13396 <summary>Parcel Owners <seealso cref="T:OpenMetaverse.UUID"/></summary>
15010 </member> 13397 </member>
15011 <member name="F:OpenMetaverse.ParcelInfo.Name"> 13398 <member name="F:OpenMetaverse.ParcelInfo.Name">
15012 <summary>Name field of parcel, limited to 128 characters</summary> 13399 <summary>Name field of parcel, limited to 128 characters</summary>
@@ -15036,7 +13423,7 @@
15036 <summary>Name of simulator parcel is located in</summary> 13423 <summary>Name of simulator parcel is located in</summary>
15037 </member> 13424 </member>
15038 <member name="F:OpenMetaverse.ParcelInfo.SnapshotID"> 13425 <member name="F:OpenMetaverse.ParcelInfo.SnapshotID">
15039 <summary>Texture <seealso cref="T:OpenMetaverse.UUID" /> of parcels display picture</summary> 13426 <summary>Texture <seealso cref="T:OpenMetaverse.UUID"/> of parcels display picture</summary>
15040 </member> 13427 </member>
15041 <member name="F:OpenMetaverse.ParcelInfo.Dwell"> 13428 <member name="F:OpenMetaverse.ParcelInfo.Dwell">
15042 <summary>Float representing calculated traffic based on time spent on parcel by avatars</summary> 13429 <summary>Float representing calculated traffic based on time spent on parcel by avatars</summary>
@@ -15059,7 +13446,7 @@
15059 <summary>A boolean, if true the viewer should loop the media</summary> 13446 <summary>A boolean, if true the viewer should loop the media</summary>
15060 </member> 13447 </member>
15061 <member name="F:OpenMetaverse.ParcelMedia.MediaID"> 13448 <member name="F:OpenMetaverse.ParcelMedia.MediaID">
15062 <summary>The Asset UUID of the Texture which when applied to a 13449 <summary>The Asset UUID of the Texture which when applied to a
15063 primitive will display the media</summary> 13450 primitive will display the media</summary>
15064 </member> 13451 </member>
15065 <member name="F:OpenMetaverse.ParcelMedia.MediaURL"> 13452 <member name="F:OpenMetaverse.ParcelMedia.MediaURL">
@@ -15082,14 +13469,8 @@
15082 Parcel of land, a portion of virtual real estate in a simulator 13469 Parcel of land, a portion of virtual real estate in a simulator
15083 </summary> 13470 </summary>
15084 </member> 13471 </member>
15085 <member name="M:OpenMetaverse.Parcel.#ctor(System.Int32)">
15086 <summary>
15087 Defalt constructor
15088 </summary>
15089 <param name="localID">Local ID of this parcel</param>
15090 </member>
15091 <member name="F:OpenMetaverse.Parcel.SelfCount"> 13472 <member name="F:OpenMetaverse.Parcel.SelfCount">
15092 <summary>The total number of contiguous 4x4 meter blocks your agent owns within this parcel</summary> 13473 <summary>The total number of contiguous 4x4 meter blocks your agent owns within this parcel</summary>
15093 </member> 13474 </member>
15094 <member name="F:OpenMetaverse.Parcel.OtherCount"> 13475 <member name="F:OpenMetaverse.Parcel.OtherCount">
15095 <summary>The total number of contiguous 4x4 meter blocks contained in this parcel owned by a group or agent other than your own</summary> 13476 <summary>The total number of contiguous 4x4 meter blocks contained in this parcel owned by a group or agent other than your own</summary>
@@ -15107,8 +13488,7 @@
15107 <summary>Whether the land is deeded to a group or not</summary> 13488 <summary>Whether the land is deeded to a group or not</summary>
15108 </member> 13489 </member>
15109 <member name="F:OpenMetaverse.Parcel.AuctionID"> 13490 <member name="F:OpenMetaverse.Parcel.AuctionID">
15110 <summary> 13491 <summary></summary>
15111 </summary>
15112 </member> 13492 </member>
15113 <member name="F:OpenMetaverse.Parcel.ClaimDate"> 13493 <member name="F:OpenMetaverse.Parcel.ClaimDate">
15114 <summary>Date land was claimed</summary> 13494 <summary>Date land was claimed</summary>
@@ -15128,15 +13508,14 @@
15128 parcel</summary> 13508 parcel</summary>
15129 </member> 13509 </member>
15130 <member name="F:OpenMetaverse.Parcel.Bitmap"> 13510 <member name="F:OpenMetaverse.Parcel.Bitmap">
15131 <summary>Bitmap describing land layout in 4x4m squares across the 13511 <summary>Bitmap describing land layout in 4x4m squares across the
15132 entire region</summary> 13512 entire region</summary>
15133 </member> 13513 </member>
15134 <member name="F:OpenMetaverse.Parcel.Area"> 13514 <member name="F:OpenMetaverse.Parcel.Area">
15135 <summary>Total parcel land area</summary> 13515 <summary>Total parcel land area</summary>
15136 </member> 13516 </member>
15137 <member name="F:OpenMetaverse.Parcel.Status"> 13517 <member name="F:OpenMetaverse.Parcel.Status">
15138 <summary> 13518 <summary></summary>
15139 </summary>
15140 </member> 13519 </member>
15141 <member name="F:OpenMetaverse.Parcel.SimWideMaxPrims"> 13520 <member name="F:OpenMetaverse.Parcel.SimWideMaxPrims">
15142 <summary>Maximum primitives across the entire simulator owned by the same agent or group that owns this parcel that can be used</summary> 13521 <summary>Maximum primitives across the entire simulator owned by the same agent or group that owns this parcel that can be used</summary>
@@ -15156,7 +13535,7 @@
15156 for parcels owned by an individual this inicates the number of prims owned by the individual</summary> 13535 for parcels owned by an individual this inicates the number of prims owned by the individual</summary>
15157 </member> 13536 </member>
15158 <member name="F:OpenMetaverse.Parcel.GroupPrims"> 13537 <member name="F:OpenMetaverse.Parcel.GroupPrims">
15159 <summary>Total number of primitives owned by the parcel group on 13538 <summary>Total number of primitives owned by the parcel group on
15160 this parcel, or for parcels owned by an individual with a group set the 13539 this parcel, or for parcels owned by an individual with a group set the
15161 total number of prims set to that group.</summary> 13540 total number of prims set to that group.</summary>
15162 </member> 13541 </member>
@@ -15171,8 +13550,7 @@
15171 <summary>Autoreturn value in minutes for others' objects</summary> 13550 <summary>Autoreturn value in minutes for others' objects</summary>
15172 </member> 13551 </member>
15173 <member name="F:OpenMetaverse.Parcel.Flags"> 13552 <member name="F:OpenMetaverse.Parcel.Flags">
15174 <summary> 13553 <summary></summary>
15175 </summary>
15176 </member> 13554 </member>
15177 <member name="F:OpenMetaverse.Parcel.SalePrice"> 13555 <member name="F:OpenMetaverse.Parcel.SalePrice">
15178 <summary>Sale price of the parcel, only useful if ForSale is set</summary> 13556 <summary>Sale price of the parcel, only useful if ForSale is set</summary>
@@ -15190,8 +13568,7 @@
15190 <summary>URL For Music Stream</summary> 13568 <summary>URL For Music Stream</summary>
15191 </member> 13569 </member>
15192 <member name="F:OpenMetaverse.Parcel.GroupID"> 13570 <member name="F:OpenMetaverse.Parcel.GroupID">
15193 <summary> 13571 <summary></summary>
15194 </summary>
15195 </member> 13572 </member>
15196 <member name="F:OpenMetaverse.Parcel.PassPrice"> 13573 <member name="F:OpenMetaverse.Parcel.PassPrice">
15197 <summary>Price for a temporary pass</summary> 13574 <summary>Price for a temporary pass</summary>
@@ -15200,8 +13577,7 @@
15200 <summary>How long is pass valid for</summary> 13577 <summary>How long is pass valid for</summary>
15201 </member> 13578 </member>
15202 <member name="F:OpenMetaverse.Parcel.Category"> 13579 <member name="F:OpenMetaverse.Parcel.Category">
15203 <summary> 13580 <summary></summary>
15204 </summary>
15205 </member> 13581 </member>
15206 <member name="F:OpenMetaverse.Parcel.AuthBuyerID"> 13582 <member name="F:OpenMetaverse.Parcel.AuthBuyerID">
15207 <summary>Key of authorized buyer</summary> 13583 <summary>Key of authorized buyer</summary>
@@ -15216,19 +13592,16 @@
15216 <summary>The landing point LookAt</summary> 13592 <summary>The landing point LookAt</summary>
15217 </member> 13593 </member>
15218 <member name="F:OpenMetaverse.Parcel.Landing"> 13594 <member name="F:OpenMetaverse.Parcel.Landing">
15219 <summary>The type of landing enforced from the <see cref="T:OpenMetaverse.LandingType" /> enum</summary> 13595 <summary>The type of landing enforced from the <see cref="T:OpenMetaverse.LandingType"/> enum</summary>
15220 </member> 13596 </member>
15221 <member name="F:OpenMetaverse.Parcel.Dwell"> 13597 <member name="F:OpenMetaverse.Parcel.Dwell">
15222 <summary> 13598 <summary></summary>
15223 </summary>
15224 </member> 13599 </member>
15225 <member name="F:OpenMetaverse.Parcel.RegionDenyAnonymous"> 13600 <member name="F:OpenMetaverse.Parcel.RegionDenyAnonymous">
15226 <summary> 13601 <summary></summary>
15227 </summary>
15228 </member> 13602 </member>
15229 <member name="F:OpenMetaverse.Parcel.RegionPushOverride"> 13603 <member name="F:OpenMetaverse.Parcel.RegionPushOverride">
15230 <summary> 13604 <summary></summary>
15231 </summary>
15232 </member> 13605 </member>
15233 <member name="F:OpenMetaverse.Parcel.AccessWhiteList"> 13606 <member name="F:OpenMetaverse.Parcel.AccessWhiteList">
15234 <summary>Access list of who is whitelisted on this 13607 <summary>Access list of who is whitelisted on this
@@ -15256,6 +13629,12 @@
15256 </summary> 13629 </summary>
15257 <returns>string containing key=value pairs of a parcel object</returns> 13630 <returns>string containing key=value pairs of a parcel object</returns>
15258 </member> 13631 </member>
13632 <member name="M:OpenMetaverse.Parcel.#ctor(System.Int32)">
13633 <summary>
13634 Defalt constructor
13635 </summary>
13636 <param name="localID">Local ID of this parcel</param>
13637 </member>
15259 <member name="M:OpenMetaverse.Parcel.Update(OpenMetaverse.Simulator,System.Boolean)"> 13638 <member name="M:OpenMetaverse.Parcel.Update(OpenMetaverse.Simulator,System.Boolean)">
15260 <summary> 13639 <summary>
15261 Update the simulator with any local changes to this Parcel object 13640 Update the simulator with any local changes to this Parcel object
@@ -15275,180 +13654,111 @@
15275 Parcel (subdivided simulator lots) subsystem 13654 Parcel (subdivided simulator lots) subsystem
15276 </summary> 13655 </summary>
15277 </member> 13656 </member>
15278 <member name="M:OpenMetaverse.ParcelManager.#ctor(OpenMetaverse.GridClient)">
15279 <summary>
15280 Default constructor
15281 </summary>
15282 <param name="client">A reference to the GridClient object</param>
15283 </member>
15284 <member name="T:OpenMetaverse.ParcelManager.ParcelAccessEntry">
15285 <summary>
15286 Parcel Accesslist
15287 </summary>
15288 </member>
15289 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.AgentID">
15290 <summary>Agents <seealso cref="T:OpenMetaverse.UUID" /></summary>
15291 </member>
15292 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.Time">
15293 <summary>
15294 </summary>
15295 </member>
15296 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.Flags">
15297 <summary>Flags for specific entry in white/black lists</summary>
15298 </member>
15299 <member name="T:OpenMetaverse.ParcelManager.ParcelPrimOwners">
15300 <summary>
15301 Owners of primitives on parcel
15302 </summary>
15303 </member>
15304 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.OwnerID">
15305 <summary>Prim Owners <seealso cref="T:OpenMetaverse.UUID" /></summary>
15306 </member>
15307 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.IsGroupOwned">
15308 <summary>True of owner is group</summary>
15309 </member>
15310 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.Count">
15311 <summary>Total count of prims owned by OwnerID</summary>
15312 </member>
15313 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.OnlineStatus">
15314 <summary>true of OwnerID is currently online and is not a group</summary>
15315 </member>
15316 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.NewestPrim">
15317 <summary>The date of the most recent prim left by OwnerID</summary>
15318 </member>
15319 <member name="T:OpenMetaverse.ParcelManager.LandResourcesCallback">
15320 <summary>
15321 Called once parcel resource usage information has been collected
15322 </summary>
15323 <param name="success">Indicates if operation was successfull</param>
15324 <param name="info">Parcel resource usage information</param>
15325 </member>
15326 <member name="F:OpenMetaverse.ParcelManager.m_DwellReply"> 13657 <member name="F:OpenMetaverse.ParcelManager.m_DwellReply">
15327 <summary>The event subscribers. null if no subcribers</summary> 13658 <summary>The event subscribers. null if no subcribers</summary>
15328 </member> 13659 </member>
13660 <member name="M:OpenMetaverse.ParcelManager.OnParcelDwellReply(OpenMetaverse.ParcelDwellReplyEventArgs)">
13661 <summary>Raises the ParcelDwellReply event</summary>
13662 <param name="e">A ParcelDwellReplyEventArgs object containing the
13663 data returned from the simulator</param>
13664 </member>
15329 <member name="F:OpenMetaverse.ParcelManager.m_DwellReplyLock"> 13665 <member name="F:OpenMetaverse.ParcelManager.m_DwellReplyLock">
15330 <summary>Thread sync lock object</summary> 13666 <summary>Thread sync lock object</summary>
15331 </member> 13667 </member>
15332 <member name="F:OpenMetaverse.ParcelManager.m_ParcelInfo"> 13668 <member name="F:OpenMetaverse.ParcelManager.m_ParcelInfo">
15333 <summary>The event subscribers. null if no subcribers</summary> 13669 <summary>The event subscribers. null if no subcribers</summary>
15334 </member> 13670 </member>
13671 <member name="M:OpenMetaverse.ParcelManager.OnParcelInfoReply(OpenMetaverse.ParcelInfoReplyEventArgs)">
13672 <summary>Raises the ParcelInfoReply event</summary>
13673 <param name="e">A ParcelInfoReplyEventArgs object containing the
13674 data returned from the simulator</param>
13675 </member>
15335 <member name="F:OpenMetaverse.ParcelManager.m_ParcelInfoLock"> 13676 <member name="F:OpenMetaverse.ParcelManager.m_ParcelInfoLock">
15336 <summary>Thread sync lock object</summary> 13677 <summary>Thread sync lock object</summary>
15337 </member> 13678 </member>
15338 <member name="F:OpenMetaverse.ParcelManager.m_ParcelProperties"> 13679 <member name="F:OpenMetaverse.ParcelManager.m_ParcelProperties">
15339 <summary>The event subscribers. null if no subcribers</summary> 13680 <summary>The event subscribers. null if no subcribers</summary>
15340 </member> 13681 </member>
13682 <member name="M:OpenMetaverse.ParcelManager.OnParcelProperties(OpenMetaverse.ParcelPropertiesEventArgs)">
13683 <summary>Raises the ParcelProperties event</summary>
13684 <param name="e">A ParcelPropertiesEventArgs object containing the
13685 data returned from the simulator</param>
13686 </member>
15341 <member name="F:OpenMetaverse.ParcelManager.m_ParcelPropertiesLock"> 13687 <member name="F:OpenMetaverse.ParcelManager.m_ParcelPropertiesLock">
15342 <summary>Thread sync lock object</summary> 13688 <summary>Thread sync lock object</summary>
15343 </member> 13689 </member>
15344 <member name="F:OpenMetaverse.ParcelManager.m_ParcelACL"> 13690 <member name="F:OpenMetaverse.ParcelManager.m_ParcelACL">
15345 <summary>The event subscribers. null if no subcribers</summary> 13691 <summary>The event subscribers. null if no subcribers</summary>
15346 </member> 13692 </member>
13693 <member name="M:OpenMetaverse.ParcelManager.OnParcelAccessListReply(OpenMetaverse.ParcelAccessListReplyEventArgs)">
13694 <summary>Raises the ParcelAccessListReply event</summary>
13695 <param name="e">A ParcelAccessListReplyEventArgs object containing the
13696 data returned from the simulator</param>
13697 </member>
15347 <member name="F:OpenMetaverse.ParcelManager.m_ParcelACLLock"> 13698 <member name="F:OpenMetaverse.ParcelManager.m_ParcelACLLock">
15348 <summary>Thread sync lock object</summary> 13699 <summary>Thread sync lock object</summary>
15349 </member> 13700 </member>
15350 <member name="F:OpenMetaverse.ParcelManager.m_ParcelObjectOwnersReply"> 13701 <member name="F:OpenMetaverse.ParcelManager.m_ParcelObjectOwnersReply">
15351 <summary>The event subscribers. null if no subcribers</summary> 13702 <summary>The event subscribers. null if no subcribers</summary>
15352 </member> 13703 </member>
13704 <member name="M:OpenMetaverse.ParcelManager.OnParcelObjectOwnersReply(OpenMetaverse.ParcelObjectOwnersReplyEventArgs)">
13705 <summary>Raises the ParcelObjectOwnersReply event</summary>
13706 <param name="e">A ParcelObjectOwnersReplyEventArgs object containing the
13707 data returned from the simulator</param>
13708 </member>
15353 <member name="F:OpenMetaverse.ParcelManager.m_ParcelObjectOwnersLock"> 13709 <member name="F:OpenMetaverse.ParcelManager.m_ParcelObjectOwnersLock">
15354 <summary>Thread sync lock object</summary> 13710 <summary>Thread sync lock object</summary>
15355 </member> 13711 </member>
15356 <member name="F:OpenMetaverse.ParcelManager.m_SimParcelsDownloaded"> 13712 <member name="F:OpenMetaverse.ParcelManager.m_SimParcelsDownloaded">
15357 <summary>The event subscribers. null if no subcribers</summary> 13713 <summary>The event subscribers. null if no subcribers</summary>
15358 </member> 13714 </member>
13715 <member name="M:OpenMetaverse.ParcelManager.OnSimParcelsDownloaded(OpenMetaverse.SimParcelsDownloadedEventArgs)">
13716 <summary>Raises the SimParcelsDownloaded event</summary>
13717 <param name="e">A SimParcelsDownloadedEventArgs object containing the
13718 data returned from the simulator</param>
13719 </member>
15359 <member name="F:OpenMetaverse.ParcelManager.m_SimParcelsDownloadedLock"> 13720 <member name="F:OpenMetaverse.ParcelManager.m_SimParcelsDownloadedLock">
15360 <summary>Thread sync lock object</summary> 13721 <summary>Thread sync lock object</summary>
15361 </member> 13722 </member>
15362 <member name="F:OpenMetaverse.ParcelManager.m_ForceSelectObjects"> 13723 <member name="F:OpenMetaverse.ParcelManager.m_ForceSelectObjects">
15363 <summary>The event subscribers. null if no subcribers</summary> 13724 <summary>The event subscribers. null if no subcribers</summary>
15364 </member> 13725 </member>
13726 <member name="M:OpenMetaverse.ParcelManager.OnForceSelectObjectsReply(OpenMetaverse.ForceSelectObjectsReplyEventArgs)">
13727 <summary>Raises the ForceSelectObjectsReply event</summary>
13728 <param name="e">A ForceSelectObjectsReplyEventArgs object containing the
13729 data returned from the simulator</param>
13730 </member>
15365 <member name="F:OpenMetaverse.ParcelManager.m_ForceSelectObjectsLock"> 13731 <member name="F:OpenMetaverse.ParcelManager.m_ForceSelectObjectsLock">
15366 <summary>Thread sync lock object</summary> 13732 <summary>Thread sync lock object</summary>
15367 </member> 13733 </member>
15368 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaUpdateReply"> 13734 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaUpdateReply">
15369 <summary>The event subscribers. null if no subcribers</summary> 13735 <summary>The event subscribers. null if no subcribers</summary>
15370 </member> 13736 </member>
13737 <member name="M:OpenMetaverse.ParcelManager.OnParcelMediaUpdateReply(OpenMetaverse.ParcelMediaUpdateReplyEventArgs)">
13738 <summary>Raises the ParcelMediaUpdateReply event</summary>
13739 <param name="e">A ParcelMediaUpdateReplyEventArgs object containing the
13740 data returned from the simulator</param>
13741 </member>
15371 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaUpdateReplyLock"> 13742 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaUpdateReplyLock">
15372 <summary>Thread sync lock object</summary> 13743 <summary>Thread sync lock object</summary>
15373 </member> 13744 </member>
15374 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaCommand"> 13745 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaCommand">
15375 <summary>The event subscribers. null if no subcribers</summary> 13746 <summary>The event subscribers. null if no subcribers</summary>
15376 </member> 13747 </member>
15377 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaCommandLock">
15378 <summary>Thread sync lock object</summary>
15379 </member>
15380 <member name="E:OpenMetaverse.ParcelManager.ParcelDwellReply">
15381 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestDwell(OpenMetaverse.Simulator,System.Int32)" /> request</summary>
15382 </member>
15383 <member name="E:OpenMetaverse.ParcelManager.ParcelInfoReply">
15384 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelInfo(OpenMetaverse.UUID)" /> request</summary>
15385 </member>
15386 <member name="E:OpenMetaverse.ParcelManager.ParcelProperties">
15387 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelProperties(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single,System.Int32,System.Boolean)" /> request</summary>
15388 </member>
15389 <member name="E:OpenMetaverse.ParcelManager.ParcelAccessListReply">
15390 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelAccessList(OpenMetaverse.Simulator,System.Int32,OpenMetaverse.AccessList,System.Int32)" /> request</summary>
15391 </member>
15392 <member name="E:OpenMetaverse.ParcelManager.ParcelObjectOwnersReply">
15393 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestObjectOwners(OpenMetaverse.Simulator,System.Int32)" /> request</summary>
15394 </member>
15395 <member name="E:OpenMetaverse.ParcelManager.SimParcelsDownloaded">
15396 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator,System.Boolean,System.Int32)" /> request</summary>
15397 </member>
15398 <member name="E:OpenMetaverse.ParcelManager.ForceSelectObjectsReply">
15399 <summary>Raised when the simulator responds to a <see cref="!:RequestForceSelectObjects" /> request</summary>
15400 </member>
15401 <member name="E:OpenMetaverse.ParcelManager.ParcelMediaUpdateReply">
15402 <summary>Raised when the simulator responds to a Parcel Update request</summary>
15403 </member>
15404 <member name="E:OpenMetaverse.ParcelManager.ParcelMediaCommand">
15405 <summary>Raised when the parcel your agent is located sends a ParcelMediaCommand</summary>
15406 </member>
15407 <member name="M:OpenMetaverse.ParcelManager.OnParcelDwellReply(OpenMetaverse.ParcelDwellReplyEventArgs)">
15408 <summary>Raises the ParcelDwellReply event</summary>
15409 <param name="e">A ParcelDwellReplyEventArgs object containing the
15410 data returned from the simulator</param>
15411 </member>
15412 <member name="M:OpenMetaverse.ParcelManager.OnParcelInfoReply(OpenMetaverse.ParcelInfoReplyEventArgs)">
15413 <summary>Raises the ParcelInfoReply event</summary>
15414 <param name="e">A ParcelInfoReplyEventArgs object containing the
15415 data returned from the simulator</param>
15416 </member>
15417 <member name="M:OpenMetaverse.ParcelManager.OnParcelProperties(OpenMetaverse.ParcelPropertiesEventArgs)">
15418 <summary>Raises the ParcelProperties event</summary>
15419 <param name="e">A ParcelPropertiesEventArgs object containing the
15420 data returned from the simulator</param>
15421 </member>
15422 <member name="M:OpenMetaverse.ParcelManager.OnParcelAccessListReply(OpenMetaverse.ParcelAccessListReplyEventArgs)">
15423 <summary>Raises the ParcelAccessListReply event</summary>
15424 <param name="e">A ParcelAccessListReplyEventArgs object containing the
15425 data returned from the simulator</param>
15426 </member>
15427 <member name="M:OpenMetaverse.ParcelManager.OnParcelObjectOwnersReply(OpenMetaverse.ParcelObjectOwnersReplyEventArgs)">
15428 <summary>Raises the ParcelObjectOwnersReply event</summary>
15429 <param name="e">A ParcelObjectOwnersReplyEventArgs object containing the
15430 data returned from the simulator</param>
15431 </member>
15432 <member name="M:OpenMetaverse.ParcelManager.OnSimParcelsDownloaded(OpenMetaverse.SimParcelsDownloadedEventArgs)">
15433 <summary>Raises the SimParcelsDownloaded event</summary>
15434 <param name="e">A SimParcelsDownloadedEventArgs object containing the
15435 data returned from the simulator</param>
15436 </member>
15437 <member name="M:OpenMetaverse.ParcelManager.OnForceSelectObjectsReply(OpenMetaverse.ForceSelectObjectsReplyEventArgs)">
15438 <summary>Raises the ForceSelectObjectsReply event</summary>
15439 <param name="e">A ForceSelectObjectsReplyEventArgs object containing the
15440 data returned from the simulator</param>
15441 </member>
15442 <member name="M:OpenMetaverse.ParcelManager.OnParcelMediaUpdateReply(OpenMetaverse.ParcelMediaUpdateReplyEventArgs)">
15443 <summary>Raises the ParcelMediaUpdateReply event</summary>
15444 <param name="e">A ParcelMediaUpdateReplyEventArgs object containing the
15445 data returned from the simulator</param>
15446 </member>
15447 <member name="M:OpenMetaverse.ParcelManager.OnParcelMediaCommand(OpenMetaverse.ParcelMediaCommandEventArgs)"> 13748 <member name="M:OpenMetaverse.ParcelManager.OnParcelMediaCommand(OpenMetaverse.ParcelMediaCommandEventArgs)">
15448 <summary>Raises the ParcelMediaCommand event</summary> 13749 <summary>Raises the ParcelMediaCommand event</summary>
15449 <param name="e">A ParcelMediaCommandEventArgs object containing the 13750 <param name="e">A ParcelMediaCommandEventArgs object containing the
15450 data returned from the simulator</param> 13751 data returned from the simulator</param>
15451 </member> 13752 </member>
13753 <member name="F:OpenMetaverse.ParcelManager.m_ParcelMediaCommandLock">
13754 <summary>Thread sync lock object</summary>
13755 </member>
13756 <member name="M:OpenMetaverse.ParcelManager.#ctor(OpenMetaverse.GridClient)">
13757 <summary>
13758 Default constructor
13759 </summary>
13760 <param name="client">A reference to the GridClient object</param>
13761 </member>
15452 <member name="M:OpenMetaverse.ParcelManager.RequestParcelInfo(OpenMetaverse.UUID)"> 13762 <member name="M:OpenMetaverse.ParcelManager.RequestParcelInfo(OpenMetaverse.UUID)">
15453 <summary> 13763 <summary>
15454 Request basic information for a single parcel 13764 Request basic information for a single parcel
@@ -15474,8 +13784,7 @@
15474 <param name="sequenceID">An arbitrary integer that will be returned 13784 <param name="sequenceID">An arbitrary integer that will be returned
15475 with the ParcelAccessList reply, useful for distinguishing between 13785 with the ParcelAccessList reply, useful for distinguishing between
15476 multiple simultaneous requests</param> 13786 multiple simultaneous requests</param>
15477 <param name="flags"> 13787 <param name="flags"></param>
15478 </param>
15479 </member> 13788 </member>
15480 <member name="M:OpenMetaverse.ParcelManager.RequestParcelProperties(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single,System.Int32,System.Boolean)"> 13789 <member name="M:OpenMetaverse.ParcelManager.RequestParcelProperties(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single,System.Int32,System.Boolean)">
15481 <summary> 13790 <summary>
@@ -15495,14 +13804,14 @@
15495 </member> 13804 </member>
15496 <member name="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator)"> 13805 <member name="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator)">
15497 <summary> 13806 <summary>
15498 Request all simulator parcel properties (used for populating the <code>Simulator.Parcels</code> 13807 Request all simulator parcel properties (used for populating the <code>Simulator.Parcels</code>
15499 dictionary) 13808 dictionary)
15500 </summary> 13809 </summary>
15501 <param name="simulator">Simulator to request parcels from (must be connected)</param> 13810 <param name="simulator">Simulator to request parcels from (must be connected)</param>
15502 </member> 13811 </member>
15503 <member name="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator,System.Boolean,System.Int32)"> 13812 <member name="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator,System.Boolean,System.Int32)">
15504 <summary> 13813 <summary>
15505 Request all simulator parcel properties (used for populating the <code>Simulator.Parcels</code> 13814 Request all simulator parcel properties (used for populating the <code>Simulator.Parcels</code>
15506 dictionary) 13815 dictionary)
15507 </summary> 13816 </summary>
15508 <param name="simulator">Simulator to request parcels from (must be connected)</param> 13817 <param name="simulator">Simulator to request parcels from (must be connected)</param>
@@ -15523,12 +13832,11 @@
15523 <param name="simulator">The Simulator the parcel is located in</param> 13832 <param name="simulator">The Simulator the parcel is located in</param>
15524 <param name="localID">The parcels region specific local ID</param> 13833 <param name="localID">The parcels region specific local ID</param>
15525 <param name="forGroup">true if this parcel is being purchased by a group</param> 13834 <param name="forGroup">true if this parcel is being purchased by a group</param>
15526 <param name="groupID">The groups <seealso cref="T:OpenMetaverse.UUID" /></param> 13835 <param name="groupID">The groups <seealso cref="T:OpenMetaverse.UUID"/></param>
15527 <param name="removeContribution">true to remove tier contribution if purchase is successful</param> 13836 <param name="removeContribution">true to remove tier contribution if purchase is successful</param>
15528 <param name="parcelArea">The parcels size</param> 13837 <param name="parcelArea">The parcels size</param>
15529 <param name="parcelPrice">The purchase price of the parcel</param> 13838 <param name="parcelPrice">The purchase price of the parcel</param>
15530 <returns> 13839 <returns></returns>
15531 </returns>
15532 </member> 13840 </member>
15533 <member name="M:OpenMetaverse.ParcelManager.Reclaim(OpenMetaverse.Simulator,System.Int32)"> 13841 <member name="M:OpenMetaverse.ParcelManager.Reclaim(OpenMetaverse.Simulator,System.Int32)">
15534 <summary> 13842 <summary>
@@ -15543,7 +13851,7 @@
15543 </summary> 13851 </summary>
15544 <param name="simulator">The simulator the parcel is in</param> 13852 <param name="simulator">The simulator the parcel is in</param>
15545 <param name="localID">The parcels region specific local ID</param> 13853 <param name="localID">The parcels region specific local ID</param>
15546 <param name="groupID">The groups <seealso cref="T:OpenMetaverse.UUID" /></param> 13854 <param name="groupID">The groups <seealso cref="T:OpenMetaverse.UUID"/></param>
15547 </member> 13855 </member>
15548 <member name="M:OpenMetaverse.ParcelManager.RequestObjectOwners(OpenMetaverse.Simulator,System.Int32)"> 13856 <member name="M:OpenMetaverse.ParcelManager.RequestObjectOwners(OpenMetaverse.Simulator,System.Int32)">
15549 <summary> 13857 <summary>
@@ -15558,38 +13866,28 @@
15558 </summary> 13866 </summary>
15559 <param name="simulator">Simulator parcel is in</param> 13867 <param name="simulator">Simulator parcel is in</param>
15560 <param name="localID">The parcels region specific local ID</param> 13868 <param name="localID">The parcels region specific local ID</param>
15561 <param name="type">the type of objects to return, <seealso cref="T:OpenMetaverse.ObjectReturnType" /></param> 13869 <param name="type">the type of objects to return, <seealso cref="T:OpenMetaverse.ObjectReturnType"/></param>
15562 <param name="ownerIDs">A list containing object owners <seealso cref="T:OpenMetaverse.UUID" />s to return</param> 13870 <param name="ownerIDs">A list containing object owners <seealso cref="T:OpenMetaverse.UUID"/>s to return</param>
15563 </member> 13871 </member>
15564 <member name="M:OpenMetaverse.ParcelManager.ParcelSubdivide(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single)"> 13872 <member name="M:OpenMetaverse.ParcelManager.ParcelSubdivide(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single)">
15565 <summary> 13873 <summary>
15566 Subdivide (split) a parcel 13874 Subdivide (split) a parcel
15567 </summary> 13875 </summary>
15568 <param name="simulator"> 13876 <param name="simulator"></param>
15569 </param> 13877 <param name="west"></param>
15570 <param name="west"> 13878 <param name="south"></param>
15571 </param> 13879 <param name="east"></param>
15572 <param name="south"> 13880 <param name="north"></param>
15573 </param>
15574 <param name="east">
15575 </param>
15576 <param name="north">
15577 </param>
15578 </member> 13881 </member>
15579 <member name="M:OpenMetaverse.ParcelManager.ParcelJoin(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single)"> 13882 <member name="M:OpenMetaverse.ParcelManager.ParcelJoin(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single)">
15580 <summary> 13883 <summary>
15581 Join two parcels of land creating a single parcel 13884 Join two parcels of land creating a single parcel
15582 </summary> 13885 </summary>
15583 <param name="simulator"> 13886 <param name="simulator"></param>
15584 </param> 13887 <param name="west"></param>
15585 <param name="west"> 13888 <param name="south"></param>
15586 </param> 13889 <param name="east"></param>
15587 <param name="south"> 13890 <param name="north"></param>
15588 </param>
15589 <param name="east">
15590 </param>
15591 <param name="north">
15592 </param>
15593 </member> 13891 </member>
15594 <member name="M:OpenMetaverse.ParcelManager.GetParcelLocalID(OpenMetaverse.Simulator,OpenMetaverse.Vector3)"> 13892 <member name="M:OpenMetaverse.ParcelManager.GetParcelLocalID(OpenMetaverse.Simulator,OpenMetaverse.Vector3)">
15595 <summary> 13893 <summary>
@@ -15610,7 +13908,7 @@
15610 <param name="action">From Enum, Raise, Lower, Level, Smooth, Etc.</param> 13908 <param name="action">From Enum, Raise, Lower, Level, Smooth, Etc.</param>
15611 <param name="brushSize">Size of area to modify</param> 13909 <param name="brushSize">Size of area to modify</param>
15612 <returns>true on successful request sent.</returns> 13910 <returns>true on successful request sent.</returns>
15613 <remarks>Settings.STORE_LAND_PATCHES must be true, 13911 <remarks>Settings.STORE_LAND_PATCHES must be true,
15614 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks> 13912 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks>
15615 </member> 13913 </member>
15616 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize)"> 13914 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize)">
@@ -15625,7 +13923,7 @@
15625 <param name="action">From Enum, Raise, Lower, Level, Smooth, Etc.</param> 13923 <param name="action">From Enum, Raise, Lower, Level, Smooth, Etc.</param>
15626 <param name="brushSize">Size of area to modify</param> 13924 <param name="brushSize">Size of area to modify</param>
15627 <returns>true on successful request sent.</returns> 13925 <returns>true on successful request sent.</returns>
15628 <remarks>Settings.STORE_LAND_PATCHES must be true, 13926 <remarks>Settings.STORE_LAND_PATCHES must be true,
15629 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks> 13927 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks>
15630 </member> 13928 </member>
15631 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Int32,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize,System.Int32)"> 13929 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Int32,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize,System.Int32)">
@@ -15642,7 +13940,7 @@
15642 <param name="brushSize">Size of area to modify</param> 13940 <param name="brushSize">Size of area to modify</param>
15643 <param name="seconds">How many meters + or - to lower, 1 = 1 meter</param> 13941 <param name="seconds">How many meters + or - to lower, 1 = 1 meter</param>
15644 <returns>true on successful request sent.</returns> 13942 <returns>true on successful request sent.</returns>
15645 <remarks>Settings.STORE_LAND_PATCHES must be true, 13943 <remarks>Settings.STORE_LAND_PATCHES must be true,
15646 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks> 13944 Parcel information must be downloaded using <code>RequestAllSimParcels()</code></remarks>
15647 </member> 13945 </member>
15648 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Int32,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize,System.Int32,System.Single)"> 13946 <member name="M:OpenMetaverse.ParcelManager.Terraform(OpenMetaverse.Simulator,System.Int32,System.Single,System.Single,System.Single,System.Single,OpenMetaverse.TerraformAction,OpenMetaverse.TerraformBrushSize,System.Int32,System.Single)">
@@ -15666,9 +13964,9 @@
15666 </summary> 13964 </summary>
15667 <param name="localID">Simulator local ID of parcel</param> 13965 <param name="localID">Simulator local ID of parcel</param>
15668 <param name="selectType">Owners, Others, Etc</param> 13966 <param name="selectType">Owners, Others, Etc</param>
15669 <param name="ownerID">List containing keys of avatars objects to select; 13967 <param name="ownerID">List containing keys of avatars objects to select;
15670 if List is null will return Objects of type <c>selectType</c></param> 13968 if List is null will return Objects of type <c>selectType</c></param>
15671 <remarks>Response data is returned in the event <seealso cref="E:ForceSelectObjectsReply" /></remarks> 13969 <remarks>Response data is returned in the event <seealso cref="E:ForceSelectObjectsReply"/></remarks>
15672 </member> 13970 </member>
15673 <member name="M:OpenMetaverse.ParcelManager.EjectUser(OpenMetaverse.UUID,System.Boolean)"> 13971 <member name="M:OpenMetaverse.ParcelManager.EjectUser(OpenMetaverse.UUID,System.Boolean)">
15674 <summary> 13972 <summary>
@@ -15712,31 +14010,31 @@
15712 <summary>Process an incoming packet and raise the appropriate events</summary> 14010 <summary>Process an incoming packet and raise the appropriate events</summary>
15713 <param name="sender">The sender</param> 14011 <param name="sender">The sender</param>
15714 <param name="e">The EventArgs object containing the packet data</param> 14012 <param name="e">The EventArgs object containing the packet data</param>
15715 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelDwellReply" /> event</remarks> 14013 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelDwellReply"/> event</remarks>
15716 </member> 14014 </member>
15717 <member name="M:OpenMetaverse.ParcelManager.ParcelInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 14015 <member name="M:OpenMetaverse.ParcelManager.ParcelInfoReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
15718 <summary>Process an incoming packet and raise the appropriate events</summary> 14016 <summary>Process an incoming packet and raise the appropriate events</summary>
15719 <param name="sender">The sender</param> 14017 <param name="sender">The sender</param>
15720 <param name="e">The EventArgs object containing the packet data</param> 14018 <param name="e">The EventArgs object containing the packet data</param>
15721 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelInfoReply" /> event</remarks> 14019 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelInfoReply"/> event</remarks>
15722 </member> 14020 </member>
15723 <member name="M:OpenMetaverse.ParcelManager.ParcelAccessListReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 14021 <member name="M:OpenMetaverse.ParcelManager.ParcelAccessListReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
15724 <summary>Process an incoming packet and raise the appropriate events</summary> 14022 <summary>Process an incoming packet and raise the appropriate events</summary>
15725 <param name="sender">The sender</param> 14023 <param name="sender">The sender</param>
15726 <param name="e">The EventArgs object containing the packet data</param> 14024 <param name="e">The EventArgs object containing the packet data</param>
15727 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelAccessListReply" /> event</remarks> 14025 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelAccessListReply"/> event</remarks>
15728 </member> 14026 </member>
15729 <member name="M:OpenMetaverse.ParcelManager.SelectParcelObjectsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 14027 <member name="M:OpenMetaverse.ParcelManager.SelectParcelObjectsReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
15730 <summary>Process an incoming packet and raise the appropriate events</summary> 14028 <summary>Process an incoming packet and raise the appropriate events</summary>
15731 <param name="sender">The sender</param> 14029 <param name="sender">The sender</param>
15732 <param name="e">The EventArgs object containing the packet data</param> 14030 <param name="e">The EventArgs object containing the packet data</param>
15733 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ForceSelectObjectsReply" /> event</remarks> 14031 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ForceSelectObjectsReply"/> event</remarks>
15734 </member> 14032 </member>
15735 <member name="M:OpenMetaverse.ParcelManager.ParcelMediaUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 14033 <member name="M:OpenMetaverse.ParcelManager.ParcelMediaUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
15736 <summary>Process an incoming packet and raise the appropriate events</summary> 14034 <summary>Process an incoming packet and raise the appropriate events</summary>
15737 <param name="sender">The sender</param> 14035 <param name="sender">The sender</param>
15738 <param name="e">The EventArgs object containing the packet data</param> 14036 <param name="e">The EventArgs object containing the packet data</param>
15739 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelMediaUpdateReply" /> event</remarks> 14037 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelMediaUpdateReply"/> event</remarks>
15740 </member> 14038 </member>
15741 <member name="M:OpenMetaverse.ParcelManager.ParcelOverlayHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 14039 <member name="M:OpenMetaverse.ParcelManager.ParcelOverlayHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
15742 <summary>Process an incoming packet and raise the appropriate events</summary> 14040 <summary>Process an incoming packet and raise the appropriate events</summary>
@@ -15747,10 +14045,78 @@
15747 <summary>Process an incoming packet and raise the appropriate events</summary> 14045 <summary>Process an incoming packet and raise the appropriate events</summary>
15748 <param name="sender">The sender</param> 14046 <param name="sender">The sender</param>
15749 <param name="e">The EventArgs object containing the packet data</param> 14047 <param name="e">The EventArgs object containing the packet data</param>
15750 <remarks>Raises the <see cref="T:OpenMetaverse.ParcelMediaCommand" /> event</remarks> 14048 <remarks>Raises the <see cref="E:OpenMetaverse.ParcelManager.ParcelMediaCommand"/> event</remarks>
14049 </member>
14050 <member name="E:OpenMetaverse.ParcelManager.ParcelDwellReply">
14051 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestDwell(OpenMetaverse.Simulator,System.Int32)"/> request</summary>
14052 </member>
14053 <member name="E:OpenMetaverse.ParcelManager.ParcelInfoReply">
14054 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelInfo(OpenMetaverse.UUID)"/> request</summary>
14055 </member>
14056 <member name="E:OpenMetaverse.ParcelManager.ParcelProperties">
14057 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelProperties(OpenMetaverse.Simulator,System.Int32,System.Int32)"/> request</summary>
14058 </member>
14059 <member name="E:OpenMetaverse.ParcelManager.ParcelAccessListReply">
14060 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestParcelAccessList(OpenMetaverse.Simulator,System.Int32,OpenMetaverse.AccessList,System.Int32)"/> request</summary>
14061 </member>
14062 <member name="E:OpenMetaverse.ParcelManager.ParcelObjectOwnersReply">
14063 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestObjectOwners(OpenMetaverse.Simulator,System.Int32)"/> request</summary>
14064 </member>
14065 <member name="E:OpenMetaverse.ParcelManager.SimParcelsDownloaded">
14066 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.ParcelManager.RequestAllSimParcels(OpenMetaverse.Simulator)"/> request</summary>
14067 </member>
14068 <member name="E:OpenMetaverse.ParcelManager.ForceSelectObjectsReply">
14069 <summary>Raised when the simulator responds to a <see cref="!:RequestForceSelectObjects"/> request</summary>
14070 </member>
14071 <member name="E:OpenMetaverse.ParcelManager.ParcelMediaUpdateReply">
14072 <summary>Raised when the simulator responds to a Parcel Update request</summary>
14073 </member>
14074 <member name="E:OpenMetaverse.ParcelManager.ParcelMediaCommand">
14075 <summary>Raised when the parcel your agent is located sends a ParcelMediaCommand</summary>
14076 </member>
14077 <member name="T:OpenMetaverse.ParcelManager.ParcelAccessEntry">
14078 <summary>
14079 Parcel Accesslist
14080 </summary>
14081 </member>
14082 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.AgentID">
14083 <summary>Agents <seealso cref="T:OpenMetaverse.UUID"/></summary>
14084 </member>
14085 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.Time">
14086 <summary></summary>
14087 </member>
14088 <member name="F:OpenMetaverse.ParcelManager.ParcelAccessEntry.Flags">
14089 <summary>Flags for specific entry in white/black lists</summary>
14090 </member>
14091 <member name="T:OpenMetaverse.ParcelManager.ParcelPrimOwners">
14092 <summary>
14093 Owners of primitives on parcel
14094 </summary>
14095 </member>
14096 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.OwnerID">
14097 <summary>Prim Owners <seealso cref="T:OpenMetaverse.UUID"/></summary>
14098 </member>
14099 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.IsGroupOwned">
14100 <summary>True of owner is group</summary>
14101 </member>
14102 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.Count">
14103 <summary>Total count of prims owned by OwnerID</summary>
14104 </member>
14105 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.OnlineStatus">
14106 <summary>true of OwnerID is currently online and is not a group</summary>
14107 </member>
14108 <member name="F:OpenMetaverse.ParcelManager.ParcelPrimOwners.NewestPrim">
14109 <summary>The date of the most recent prim left by OwnerID</summary>
14110 </member>
14111 <member name="T:OpenMetaverse.ParcelManager.LandResourcesCallback">
14112 <summary>
14113 Called once parcel resource usage information has been collected
14114 </summary>
14115 <param name="success">Indicates if operation was successfull</param>
14116 <param name="info">Parcel resource usage information</param>
15751 </member> 14117 </member>
15752 <member name="T:OpenMetaverse.ParcelDwellReplyEventArgs"> 14118 <member name="T:OpenMetaverse.ParcelDwellReplyEventArgs">
15753 <summary>Contains a parcels dwell data returned from the simulator in response to an <see cref="!:RequestParcelDwell" /></summary> 14119 <summary>Contains a parcels dwell data returned from the simulator in response to an <see cref="!:RequestParcelDwell"/></summary>
15754 </member> 14120 </member>
15755 <member name="M:OpenMetaverse.ParcelDwellReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Int32,System.Single)"> 14121 <member name="M:OpenMetaverse.ParcelDwellReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Int32,System.Single)">
15756 <summary> 14122 <summary>
@@ -15770,29 +14136,29 @@
15770 <summary>Get the calculated dwell</summary> 14136 <summary>Get the calculated dwell</summary>
15771 </member> 14137 </member>
15772 <member name="T:OpenMetaverse.ParcelInfoReplyEventArgs"> 14138 <member name="T:OpenMetaverse.ParcelInfoReplyEventArgs">
15773 <summary>Contains basic parcel information data returned from the 14139 <summary>Contains basic parcel information data returned from the
15774 simulator in response to an <see cref="!:RequestParcelInfo" /> request</summary> 14140 simulator in response to an <see cref="!:RequestParcelInfo"/> request</summary>
15775 </member> 14141 </member>
15776 <member name="M:OpenMetaverse.ParcelInfoReplyEventArgs.#ctor(OpenMetaverse.ParcelInfo)"> 14142 <member name="M:OpenMetaverse.ParcelInfoReplyEventArgs.#ctor(OpenMetaverse.ParcelInfo)">
15777 <summary> 14143 <summary>
15778 Construct a new instance of the ParcelInfoReplyEventArgs class 14144 Construct a new instance of the ParcelInfoReplyEventArgs class
15779 </summary> 14145 </summary>
15780 <param name="parcel">The <see cref="T:OpenMetaverse.ParcelInfo" /> object containing basic parcel info</param> 14146 <param name="parcel">The <see cref="T:OpenMetaverse.ParcelInfo"/> object containing basic parcel info</param>
15781 </member> 14147 </member>
15782 <member name="P:OpenMetaverse.ParcelInfoReplyEventArgs.Parcel"> 14148 <member name="P:OpenMetaverse.ParcelInfoReplyEventArgs.Parcel">
15783 <summary>Get the <see cref="T:OpenMetaverse.ParcelInfo" /> object containing basic parcel info</summary> 14149 <summary>Get the <see cref="T:OpenMetaverse.ParcelInfo"/> object containing basic parcel info</summary>
15784 </member> 14150 </member>
15785 <member name="T:OpenMetaverse.ParcelPropertiesEventArgs"> 14151 <member name="T:OpenMetaverse.ParcelPropertiesEventArgs">
15786 <summary>Contains basic parcel information data returned from the simulator in response to an <see cref="!:RequestParcelInfo" /> request</summary> 14152 <summary>Contains basic parcel information data returned from the simulator in response to an <see cref="!:RequestParcelInfo"/> request</summary>
15787 </member> 14153 </member>
15788 <member name="M:OpenMetaverse.ParcelPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Parcel,OpenMetaverse.ParcelResult,System.Int32,System.Int32,System.Boolean)"> 14154 <member name="M:OpenMetaverse.ParcelPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Parcel,OpenMetaverse.ParcelResult,System.Int32,System.Int32,System.Boolean)">
15789 <summary> 14155 <summary>
15790 Construct a new instance of the ParcelPropertiesEventArgs class 14156 Construct a new instance of the ParcelPropertiesEventArgs class
15791 </summary> 14157 </summary>
15792 <param name="simulator">The <see cref="T:OpenMetaverse.Parcel" /> object containing the details</param> 14158 <param name="simulator">The <see cref="P:OpenMetaverse.ParcelPropertiesEventArgs.Parcel"/> object containing the details</param>
15793 <param name="parcel">The <see cref="T:OpenMetaverse.Parcel" /> object containing the details</param> 14159 <param name="parcel">The <see cref="P:OpenMetaverse.ParcelPropertiesEventArgs.Parcel"/> object containing the details</param>
15794 <param name="result">The result of the request</param> 14160 <param name="result">The result of the request</param>
15795 <param name="selectedPrims">The number of primitieves your agent is 14161 <param name="selectedPrims">The number of primitieves your agent is
15796 currently selecting and or sitting on in this parcel</param> 14162 currently selecting and or sitting on in this parcel</param>
15797 <param name="sequenceID">The user assigned ID used to correlate a request with 14163 <param name="sequenceID">The user assigned ID used to correlate a request with
15798 these results</param> 14164 these results</param>
@@ -15802,14 +14168,14 @@
15802 <summary>Get the simulator the parcel is located in</summary> 14168 <summary>Get the simulator the parcel is located in</summary>
15803 </member> 14169 </member>
15804 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.Parcel"> 14170 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.Parcel">
15805 <summary>Get the <see cref="T:OpenMetaverse.Parcel" /> object containing the details</summary> 14171 <summary>Get the <see cref="P:OpenMetaverse.ParcelPropertiesEventArgs.Parcel"/> object containing the details</summary>
15806 <remarks>If Result is NoData, this object will not contain valid data</remarks> 14172 <remarks>If Result is NoData, this object will not contain valid data</remarks>
15807 </member> 14173 </member>
15808 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.Result"> 14174 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.Result">
15809 <summary>Get the result of the request</summary> 14175 <summary>Get the result of the request</summary>
15810 </member> 14176 </member>
15811 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.SelectedPrims"> 14177 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.SelectedPrims">
15812 <summary>Get the number of primitieves your agent is 14178 <summary>Get the number of primitieves your agent is
15813 currently selecting and or sitting on in this parcel</summary> 14179 currently selecting and or sitting on in this parcel</summary>
15814 </member> 14180 </member>
15815 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.SequenceID"> 14181 <member name="P:OpenMetaverse.ParcelPropertiesEventArgs.SequenceID">
@@ -15820,7 +14186,7 @@
15820 <summary>TODO:</summary> 14186 <summary>TODO:</summary>
15821 </member> 14187 </member>
15822 <member name="T:OpenMetaverse.ParcelAccessListReplyEventArgs"> 14188 <member name="T:OpenMetaverse.ParcelAccessListReplyEventArgs">
15823 <summary>Contains blacklist and whitelist data returned from the simulator in response to an <see cref="!:RequestParcelAccesslist" /> request</summary> 14189 <summary>Contains blacklist and whitelist data returned from the simulator in response to an <see cref="!:RequestParcelAccesslist"/> request</summary>
15824 </member> 14190 </member>
15825 <member name="M:OpenMetaverse.ParcelAccessListReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Int32,System.Int32,System.UInt32,System.Collections.Generic.List{OpenMetaverse.ParcelManager.ParcelAccessEntry})"> 14191 <member name="M:OpenMetaverse.ParcelAccessListReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Int32,System.Int32,System.UInt32,System.Collections.Generic.List{OpenMetaverse.ParcelManager.ParcelAccessEntry})">
15826 <summary> 14192 <summary>
@@ -15850,8 +14216,8 @@
15850 <summary>Get the list containing the white/blacklisted agents for the parcel</summary> 14216 <summary>Get the list containing the white/blacklisted agents for the parcel</summary>
15851 </member> 14217 </member>
15852 <member name="T:OpenMetaverse.ParcelObjectOwnersReplyEventArgs"> 14218 <member name="T:OpenMetaverse.ParcelObjectOwnersReplyEventArgs">
15853 <summary>Contains blacklist and whitelist data returned from the 14219 <summary>Contains blacklist and whitelist data returned from the
15854 simulator in response to an <see cref="!:RequestParcelAccesslist" /> request</summary> 14220 simulator in response to an <see cref="!:RequestParcelAccesslist"/> request</summary>
15855 </member> 14221 </member>
15856 <member name="M:OpenMetaverse.ParcelObjectOwnersReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Collections.Generic.List{OpenMetaverse.ParcelManager.ParcelPrimOwners})"> 14222 <member name="M:OpenMetaverse.ParcelObjectOwnersReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Collections.Generic.List{OpenMetaverse.ParcelManager.ParcelPrimOwners})">
15857 <summary> 14223 <summary>
@@ -15869,7 +14235,7 @@
15869 <member name="T:OpenMetaverse.SimParcelsDownloadedEventArgs"> 14235 <member name="T:OpenMetaverse.SimParcelsDownloadedEventArgs">
15870 <summary>Contains the data returned when all parcel data has been retrieved from a simulator</summary> 14236 <summary>Contains the data returned when all parcel data has been retrieved from a simulator</summary>
15871 </member> 14237 </member>
15872 <member name="M:OpenMetaverse.SimParcelsDownloadedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.InternalDictionary{System.Int32,OpenMetaverse.Parcel},System.Int32[,])"> 14238 <member name="M:OpenMetaverse.SimParcelsDownloadedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.InternalDictionary{System.Int32,OpenMetaverse.Parcel},System.Int32[0:,0:])">
15873 <summary> 14239 <summary>
15874 Construct a new instance of the SimParcelsDownloadedEventArgs class 14240 Construct a new instance of the SimParcelsDownloadedEventArgs class
15875 </summary> 14241 </summary>
@@ -15889,7 +14255,7 @@
15889 to each 64x64 parcel's LocalID.</summary> 14255 to each 64x64 parcel's LocalID.</summary>
15890 </member> 14256 </member>
15891 <member name="T:OpenMetaverse.ForceSelectObjectsReplyEventArgs"> 14257 <member name="T:OpenMetaverse.ForceSelectObjectsReplyEventArgs">
15892 <summary>Contains the data returned when a <see cref="!:RequestForceSelectObjects" /> request</summary> 14258 <summary>Contains the data returned when a <see cref="!:RequestForceSelectObjects"/> request</summary>
15893 </member> 14259 </member>
15894 <member name="M:OpenMetaverse.ForceSelectObjectsReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},System.Boolean)"> 14260 <member name="M:OpenMetaverse.ForceSelectObjectsReplyEventArgs.#ctor(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},System.Boolean)">
15895 <summary> 14261 <summary>
@@ -15934,6724 +14300,7412 @@
15934 Construct a new instance of the ParcelMediaCommandEventArgs class 14300 Construct a new instance of the ParcelMediaCommandEventArgs class
15935 </summary> 14301 </summary>
15936 <param name="simulator">The simulator the parcel media command was issued in</param> 14302 <param name="simulator">The simulator the parcel media command was issued in</param>
15937 <param name="sequence"> 14303 <param name="sequence"></param>
15938 </param> 14304 <param name="flags"></param>
15939 <param name="flags">
15940 </param>
15941 <param name="command">The media command that was sent</param> 14305 <param name="command">The media command that was sent</param>
15942 <param name="time"> 14306 <param name="time"></param>
15943 </param>
15944 </member> 14307 </member>
15945 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Simulator"> 14308 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Simulator">
15946 <summary>Get the simulator the parcel media command was issued in</summary> 14309 <summary>Get the simulator the parcel media command was issued in</summary>
15947 </member> 14310 </member>
15948 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Sequence"> 14311 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Sequence">
15949 <summary> 14312 <summary></summary>
15950 </summary>
15951 </member> 14313 </member>
15952 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.ParcelFlags"> 14314 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.ParcelFlags">
15953 <summary> 14315 <summary></summary>
15954 </summary>
15955 </member> 14316 </member>
15956 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.MediaCommand"> 14317 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.MediaCommand">
15957 <summary>Get the media command that was sent</summary> 14318 <summary>Get the media command that was sent</summary>
15958 </member> 14319 </member>
15959 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Time"> 14320 <member name="P:OpenMetaverse.ParcelMediaCommandEventArgs.Time">
15960 <summary> 14321 <summary></summary>
15961 </summary>
15962 </member>
15963 <member name="T:OpenMetaverse.PermissionMask">
15964 <summary>
15965 </summary>
15966 </member>
15967 <member name="T:OpenMetaverse.PermissionWho">
15968 <summary>
15969 </summary>
15970 </member>
15971 <member name="F:OpenMetaverse.PermissionWho.Base">
15972 <summary>
15973 </summary>
15974 </member>
15975 <member name="F:OpenMetaverse.PermissionWho.Owner">
15976 <summary>
15977 </summary>
15978 </member>
15979 <member name="F:OpenMetaverse.PermissionWho.Group">
15980 <summary>
15981 </summary>
15982 </member>
15983 <member name="F:OpenMetaverse.PermissionWho.Everyone">
15984 <summary>
15985 </summary>
15986 </member>
15987 <member name="F:OpenMetaverse.PermissionWho.NextOwner">
15988 <summary>
15989 </summary>
15990 </member>
15991 <member name="F:OpenMetaverse.PermissionWho.All">
15992 <summary>
15993 </summary>
15994 </member> 14322 </member>
15995 <member name="T:OpenMetaverse.Permissions"> 14323 <member name="T:OpenMetaverse.NameValue">
15996 <summary>
15997 </summary>
15998 </member>
15999 <member name="T:OpenMetaverse.FieldType">
16000 <summary>
16001 </summary>
16002 </member>
16003 <member name="F:OpenMetaverse.FieldType.U8">
16004 <summary>
16005 </summary>
16006 </member>
16007 <member name="F:OpenMetaverse.FieldType.U16">
16008 <summary>
16009 </summary>
16010 </member>
16011 <member name="F:OpenMetaverse.FieldType.U32">
16012 <summary>
16013 </summary>
16014 </member>
16015 <member name="F:OpenMetaverse.FieldType.U64">
16016 <summary>
16017 </summary>
16018 </member>
16019 <member name="F:OpenMetaverse.FieldType.S8">
16020 <summary> 14324 <summary>
14325 A Name Value pair with additional settings, used in the protocol
14326 primarily to transmit avatar names and active group in object packets
16021 </summary> 14327 </summary>
16022 </member> 14328 </member>
16023 <member name="F:OpenMetaverse.FieldType.S16"> 14329 <member name="F:OpenMetaverse.NameValue.Name">
16024 <summary> 14330 <summary></summary>
16025 </summary>
16026 </member> 14331 </member>
16027 <member name="F:OpenMetaverse.FieldType.S32"> 14332 <member name="F:OpenMetaverse.NameValue.Type">
16028 <summary> 14333 <summary></summary>
16029 </summary>
16030 </member> 14334 </member>
16031 <member name="F:OpenMetaverse.FieldType.F32"> 14335 <member name="F:OpenMetaverse.NameValue.Class">
16032 <summary> 14336 <summary></summary>
16033 </summary>
16034 </member> 14337 </member>
16035 <member name="F:OpenMetaverse.FieldType.F64"> 14338 <member name="F:OpenMetaverse.NameValue.Sendto">
16036 <summary> 14339 <summary></summary>
16037 </summary>
16038 </member> 14340 </member>
16039 <member name="F:OpenMetaverse.FieldType.UUID"> 14341 <member name="F:OpenMetaverse.NameValue.Value">
16040 <summary> 14342 <summary></summary>
16041 </summary>
16042 </member> 14343 </member>
16043 <member name="F:OpenMetaverse.FieldType.BOOL"> 14344 <member name="M:OpenMetaverse.NameValue.#ctor(System.String,OpenMetaverse.NameValue.ValueType,OpenMetaverse.NameValue.ClassType,OpenMetaverse.NameValue.SendtoType,System.Object)">
16044 <summary> 14345 <summary>
14346 Constructor that takes all the fields as parameters
16045 </summary> 14347 </summary>
14348 <param name="name"></param>
14349 <param name="valueType"></param>
14350 <param name="classType"></param>
14351 <param name="sendtoType"></param>
14352 <param name="value"></param>
16046 </member> 14353 </member>
16047 <member name="F:OpenMetaverse.FieldType.Vector3"> 14354 <member name="M:OpenMetaverse.NameValue.#ctor(System.String)">
16048 <summary> 14355 <summary>
14356 Constructor that takes a single line from a NameValue field
16049 </summary> 14357 </summary>
14358 <param name="data"></param>
16050 </member> 14359 </member>
16051 <member name="F:OpenMetaverse.FieldType.Vector3d"> 14360 <member name="T:OpenMetaverse.NameValue.ValueType">
16052 <summary> 14361 <summary>Type of the value</summary>
16053 </summary>
16054 </member> 14362 </member>
16055 <member name="F:OpenMetaverse.FieldType.Vector4"> 14363 <member name="F:OpenMetaverse.NameValue.ValueType.Unknown">
16056 <summary> 14364 <summary>Unknown</summary>
16057 </summary>
16058 </member> 14365 </member>
16059 <member name="F:OpenMetaverse.FieldType.Quaternion"> 14366 <member name="F:OpenMetaverse.NameValue.ValueType.String">
16060 <summary> 14367 <summary>String value</summary>
16061 </summary>
16062 </member> 14368 </member>
16063 <member name="F:OpenMetaverse.FieldType.IPADDR"> 14369 <member name="F:OpenMetaverse.NameValue.ValueType.F32">
16064 <summary> 14370 <summary></summary>
16065 </summary>
16066 </member> 14371 </member>
16067 <member name="F:OpenMetaverse.FieldType.IPPORT"> 14372 <member name="F:OpenMetaverse.NameValue.ValueType.S32">
16068 <summary> 14373 <summary></summary>
16069 </summary>
16070 </member> 14374 </member>
16071 <member name="F:OpenMetaverse.FieldType.Variable"> 14375 <member name="F:OpenMetaverse.NameValue.ValueType.VEC3">
16072 <summary> 14376 <summary></summary>
16073 </summary>
16074 </member> 14377 </member>
16075 <member name="F:OpenMetaverse.FieldType.Fixed"> 14378 <member name="F:OpenMetaverse.NameValue.ValueType.U32">
16076 <summary> 14379 <summary></summary>
16077 </summary>
16078 </member> 14380 </member>
16079 <member name="F:OpenMetaverse.FieldType.Single"> 14381 <member name="F:OpenMetaverse.NameValue.ValueType.CAMERA">
16080 <summary> 14382 <summary>Deprecated</summary>
16081 </summary>
16082 </member> 14383 </member>
16083 <member name="F:OpenMetaverse.FieldType.Multiple"> 14384 <member name="F:OpenMetaverse.NameValue.ValueType.Asset">
16084 <summary> 14385 <summary>String value, but designated as an asset</summary>
16085 </summary>
16086 </member> 14386 </member>
16087 <member name="T:OpenMetaverse.MapField"> 14387 <member name="F:OpenMetaverse.NameValue.ValueType.U64">
16088 <summary> 14388 <summary></summary>
16089 </summary>
16090 </member> 14389 </member>
16091 <member name="F:OpenMetaverse.MapField.KeywordPosition"> 14390 <member name="T:OpenMetaverse.NameValue.ClassType">
16092 <summary> 14391 <summary>
14392
16093 </summary> 14393 </summary>
16094 </member> 14394 </member>
16095 <member name="F:OpenMetaverse.MapField.Name"> 14395 <member name="F:OpenMetaverse.NameValue.ClassType.Unknown">
16096 <summary> 14396 <summary></summary>
16097 </summary>
16098 </member> 14397 </member>
16099 <member name="F:OpenMetaverse.MapField.Type"> 14398 <member name="F:OpenMetaverse.NameValue.ClassType.ReadOnly">
16100 <summary> 14399 <summary></summary>
16101 </summary>
16102 </member> 14400 </member>
16103 <member name="F:OpenMetaverse.MapField.Count"> 14401 <member name="F:OpenMetaverse.NameValue.ClassType.ReadWrite">
16104 <summary> 14402 <summary></summary>
16105 </summary>
16106 </member> 14403 </member>
16107 <member name="M:OpenMetaverse.MapField.CompareTo(System.Object)"> 14404 <member name="F:OpenMetaverse.NameValue.ClassType.Callback">
16108 <summary> 14405 <summary></summary>
16109 </summary>
16110 <param name="obj">
16111 </param>
16112 <returns>
16113 </returns>
16114 </member> 14406 </member>
16115 <member name="T:OpenMetaverse.MapBlock"> 14407 <member name="T:OpenMetaverse.NameValue.SendtoType">
16116 <summary> 14408 <summary>
14409
16117 </summary> 14410 </summary>
16118 </member> 14411 </member>
16119 <member name="F:OpenMetaverse.MapBlock.KeywordPosition"> 14412 <member name="F:OpenMetaverse.NameValue.SendtoType.Unknown">
16120 <summary> 14413 <summary></summary>
16121 </summary>
16122 </member> 14414 </member>
16123 <member name="F:OpenMetaverse.MapBlock.Name"> 14415 <member name="F:OpenMetaverse.NameValue.SendtoType.Sim">
16124 <summary> 14416 <summary></summary>
16125 </summary>
16126 </member> 14417 </member>
16127 <member name="F:OpenMetaverse.MapBlock.Count"> 14418 <member name="F:OpenMetaverse.NameValue.SendtoType.DataSim">
16128 <summary> 14419 <summary></summary>
16129 </summary>
16130 </member> 14420 </member>
16131 <member name="F:OpenMetaverse.MapBlock.Fields"> 14421 <member name="F:OpenMetaverse.NameValue.SendtoType.SimViewer">
16132 <summary> 14422 <summary></summary>
16133 </summary>
16134 </member> 14423 </member>
16135 <member name="M:OpenMetaverse.MapBlock.CompareTo(System.Object)"> 14424 <member name="F:OpenMetaverse.NameValue.SendtoType.DataSimViewer">
16136 <summary> 14425 <summary></summary>
16137 </summary>
16138 <param name="obj">
16139 </param>
16140 <returns>
16141 </returns>
16142 </member> 14426 </member>
16143 <member name="T:OpenMetaverse.MapPacket"> 14427 <member name="T:OpenMetaverse.Rendering.LindenMesh.LODMesh">
16144 <summary> 14428 <summary>
14429 Level of Detail mesh
16145 </summary> 14430 </summary>
16146 </member> 14431 </member>
16147 <member name="F:OpenMetaverse.MapPacket.ID"> 14432 <member name="T:OpenMetaverse.Assets.TarArchiveWriter">
16148 <summary> 14433 <summary>
14434 Temporary code to produce a tar archive in tar v7 format
16149 </summary> 14435 </summary>
16150 </member> 14436 </member>
16151 <member name="F:OpenMetaverse.MapPacket.Name"> 14437 <member name="F:OpenMetaverse.Assets.TarArchiveWriter.m_bw">
16152 <summary> 14438 <summary>
14439 Binary writer for the underlying stream
16153 </summary> 14440 </summary>
16154 </member> 14441 </member>
16155 <member name="F:OpenMetaverse.MapPacket.Frequency"> 14442 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteDir(System.String)">
16156 <summary> 14443 <summary>
14444 Write a directory entry to the tar archive. We can only handle one path level right now!
16157 </summary> 14445 </summary>
14446 <param name="dirName"></param>
16158 </member> 14447 </member>
16159 <member name="F:OpenMetaverse.MapPacket.Trusted"> 14448 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteFile(System.String,System.String)">
16160 <summary> 14449 <summary>
14450 Write a file to the tar archive
16161 </summary> 14451 </summary>
14452 <param name="filePath"></param>
14453 <param name="data"></param>
16162 </member> 14454 </member>
16163 <member name="F:OpenMetaverse.MapPacket.Encoded"> 14455 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteFile(System.String,System.Byte[])">
16164 <summary> 14456 <summary>
14457 Write a file to the tar archive
16165 </summary> 14458 </summary>
14459 <param name="filePath"></param>
14460 <param name="data"></param>
16166 </member> 14461 </member>
16167 <member name="F:OpenMetaverse.MapPacket.Blocks"> 14462 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.Close">
16168 <summary> 14463 <summary>
14464 Finish writing the raw tar archive data to a stream. The stream will be closed on completion.
16169 </summary> 14465 </summary>
16170 </member> 14466 </member>
16171 <member name="T:OpenMetaverse.ProtocolManager"> 14467 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteEntry(System.String,System.Byte[],System.Char)">
16172 <summary> 14468 <summary>
14469 Write a particular entry
16173 </summary> 14470 </summary>
14471 <param name="filePath"></param>
14472 <param name="data"></param>
14473 <param name="fileType"></param>
16174 </member> 14474 </member>
16175 <member name="M:OpenMetaverse.ProtocolManager.#ctor(System.String,OpenMetaverse.GridClient)"> 14475 <member name="T:OpenMetaverse.Assets.TarArchiveReader">
16176 <summary> 14476 <summary>
14477 Temporary code to do the bare minimum required to read a tar archive for our purposes
16177 </summary> 14478 </summary>
16178 <param name="mapFile">
16179 </param>
16180 <param name="client">
16181 </param>
16182 </member> 14479 </member>
16183 <member name="F:OpenMetaverse.ProtocolManager.TypeSizes"> 14480 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_br">
16184 <summary> 14481 <summary>
14482 Binary reader for the underlying stream
16185 </summary> 14483 </summary>
16186 </member> 14484 </member>
16187 <member name="F:OpenMetaverse.ProtocolManager.KeywordPositions"> 14485 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_nullCharArray">
16188 <summary> 14486 <summary>
14487 Used to trim off null chars
16189 </summary> 14488 </summary>
16190 </member> 14489 </member>
16191 <member name="F:OpenMetaverse.ProtocolManager.LowMaps"> 14490 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_spaceCharArray">
16192 <summary> 14491 <summary>
14492 Used to trim off space chars
16193 </summary> 14493 </summary>
16194 </member> 14494 </member>
16195 <member name="F:OpenMetaverse.ProtocolManager.MediumMaps"> 14495 <member name="M:OpenMetaverse.Assets.TarArchiveReader.#ctor(System.IO.Stream)">
16196 <summary> 14496 <summary>
14497 Generate a tar reader which reads from the given stream.
16197 </summary> 14498 </summary>
14499 <param name="s"></param>
16198 </member> 14500 </member>
16199 <member name="F:OpenMetaverse.ProtocolManager.HighMaps"> 14501 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadEntry(System.String@,OpenMetaverse.Assets.TarArchiveReader.TarEntryType@)">
16200 <summary> 14502 <summary>
14503 Read the next entry in the tar file.
16201 </summary> 14504 </summary>
14505 <param name="filePath"></param>
14506 <param name="entryType"></param>
14507 <returns>the data for the entry. Returns null if there are no more entries</returns>
16202 </member> 14508 </member>
16203 <member name="M:OpenMetaverse.ProtocolManager.Command(System.String)"> 14509 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadHeader">
16204 <summary> 14510 <summary>
14511 Read the next 512 byte chunk of data as a tar header.
16205 </summary> 14512 </summary>
16206 <param name="command"> 14513 <returns>A tar header struct. null if we have reached the end of the archive.</returns>
16207 </param>
16208 <returns>
16209 </returns>
16210 </member> 14514 </member>
16211 <member name="M:OpenMetaverse.ProtocolManager.Command(System.Byte[])"> 14515 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadData(System.Int32)">
16212 <summary> 14516 <summary>
14517 Read data following a header
16213 </summary> 14518 </summary>
16214 <param name="data"> 14519 <param name="fileSize"></param>
16215 </param> 14520 <returns></returns>
16216 <returns>
16217 </returns>
16218 </member> 14521 </member>
16219 <member name="M:OpenMetaverse.ProtocolManager.Command(System.UInt16,OpenMetaverse.PacketFrequency)"> 14522 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ConvertOctalBytesToDecimal(System.Byte[],System.Int32,System.Int32)">
16220 <summary> 14523 <summary>
14524 Convert octal bytes to a decimal representation
16221 </summary> 14525 </summary>
16222 <param name="command"> 14526 <param name="bytes"></param>
16223 </param> 14527 <param name="count"></param>
16224 <param name="frequency"> 14528 <param name="startIndex"></param>
16225 </param> 14529 <returns></returns>
16226 <returns>
16227 </returns>
16228 </member> 14530 </member>
16229 <member name="M:OpenMetaverse.ProtocolManager.PrintMap"> 14531 <member name="T:OpenMetaverse.VisualColorOperation">
16230 <summary> 14532 <summary>
14533 Operation to apply when applying color to texture
16231 </summary> 14534 </summary>
16232 </member> 14535 </member>
16233 <member name="M:OpenMetaverse.ProtocolManager.PrintOneMap(OpenMetaverse.MapPacket[],System.String)"> 14536 <member name="T:OpenMetaverse.VisualColorParam">
16234 <summary> 14537 <summary>
14538 Information needed to translate visual param value to RGBA color
16235 </summary> 14539 </summary>
16236 <param name="map">
16237 </param>
16238 <param name="frequency">
16239 </param>
16240 </member> 14540 </member>
16241 <member name="M:OpenMetaverse.ProtocolManager.DecodeMapFile(System.String,System.String)"> 14541 <member name="M:OpenMetaverse.VisualColorParam.#ctor(OpenMetaverse.VisualColorOperation,OpenMetaverse.Color4[])">
16242 <summary> 14542 <summary>
14543 Construct VisualColorParam
16243 </summary> 14544 </summary>
16244 <param name="mapFile"> 14545 <param name="operation">Operation to apply when applying color to texture</param>
16245 </param> 14546 <param name="colors">Colors</param>
16246 <param name="outputFile">
16247 </param>
16248 </member> 14547 </member>
16249 <member name="M:OpenMetaverse.ProtocolManager.LoadMapFile(System.String)"> 14548 <member name="T:OpenMetaverse.VisualAlphaParam">
16250 <summary> 14549 <summary>
14550 Represents alpha blending and bump infor for a visual parameter
14551 such as sleive length
16251 </summary> 14552 </summary>
16252 <param name="mapFile">
16253 </param>
16254 </member> 14553 </member>
16255 <member name="T:OpenMetaverse.Settings"> 14554 <member name="F:OpenMetaverse.VisualAlphaParam.Domain">
16256 <summary> 14555 <summary>Stregth of the alpha to apply</summary>
16257 Class for controlling various system settings.
16258 </summary>
16259 <remarks>Some values are readonly because they affect things that
16260 happen when the GridClient object is initialized, so changing them at
16261 runtime won't do any good. Non-readonly values may affect things that
16262 happen at login or dynamically</remarks>
16263 </member> 14556 </member>
16264 <member name="M:OpenMetaverse.Settings.#ctor(OpenMetaverse.GridClient)"> 14557 <member name="F:OpenMetaverse.VisualAlphaParam.TGAFile">
16265 <summary>Constructor</summary> 14558 <summary>File containing the alpha channel</summary>
16266 <param name="client">Reference to a GridClient object</param>
16267 </member> 14559 </member>
16268 <member name="F:OpenMetaverse.Settings.AGNI_LOGIN_SERVER"> 14560 <member name="F:OpenMetaverse.VisualAlphaParam.SkipIfZero">
16269 <summary>Main grid login server</summary> 14561 <summary>Skip blending if parameter value is 0</summary>
16270 </member> 14562 </member>
16271 <member name="F:OpenMetaverse.Settings.ADITI_LOGIN_SERVER"> 14563 <member name="F:OpenMetaverse.VisualAlphaParam.MultiplyBlend">
16272 <summary>Beta grid login server</summary> 14564 <summary>Use miltiply insted of alpha blending</summary>
16273 </member> 14565 </member>
16274 <member name="F:OpenMetaverse.Settings.ENABLE_INVENTORY_STORE"> 14566 <member name="M:OpenMetaverse.VisualAlphaParam.#ctor(System.Single,System.String,System.Boolean,System.Boolean)">
16275 <summary> 14567 <summary>
16276 InventoryManager requests inventory information on login, 14568 Create new alhpa information for a visual param
16277 GridClient initializes an Inventory store for main inventory.
16278 </summary> 14569 </summary>
14570 <param name="domain">Stregth of the alpha to apply</param>
14571 <param name="tgaFile">File containing the alpha channel</param>
14572 <param name="skipIfZero">Skip blending if parameter value is 0</param>
14573 <param name="multiplyBlend">Use miltiply insted of alpha blending</param>
16279 </member> 14574 </member>
16280 <member name="F:OpenMetaverse.Settings.ENABLE_LIBRARY_STORE"> 14575 <member name="T:OpenMetaverse.VisualParam">
16281 <summary> 14576 <summary>
16282 InventoryManager requests library information on login, 14577 A single visual characteristic of an avatar mesh, such as eyebrow height
16283 GridClient initializes an Inventory store for the library.
16284 </summary> 14578 </summary>
16285 </member> 14579 </member>
16286 <member name="F:OpenMetaverse.Settings.PING_INTERVAL"> 14580 <member name="F:OpenMetaverse.VisualParam.ParamID">
16287 <summary>Number of milliseconds between sending pings to each sim</summary> 14581 <summary>Index of this visual param</summary>
16288 </member>
16289 <member name="F:OpenMetaverse.Settings.DEFAULT_AGENT_UPDATE_INTERVAL">
16290 <summary>Number of milliseconds between sending camera updates</summary>
16291 </member>
16292 <member name="F:OpenMetaverse.Settings.INTERPOLATION_INTERVAL">
16293 <summary>Number of milliseconds between updating the current
16294 positions of moving, non-accelerating and non-colliding objects</summary>
16295 </member>
16296 <member name="F:OpenMetaverse.Settings.NETWORK_TICK_INTERVAL">
16297 <summary>Millisecond interval between ticks, where all ACKs are
16298 sent out and the age of unACKed packets is checked</summary>
16299 </member>
16300 <member name="F:OpenMetaverse.Settings.PACKET_INBOX_SIZE">
16301 <summary>The initial size of the packet inbox, where packets are
16302 stored before processing</summary>
16303 </member>
16304 <member name="F:OpenMetaverse.Settings.MAX_PACKET_SIZE">
16305 <summary>Maximum size of packet that we want to send over the wire</summary>
16306 </member>
16307 <member name="F:OpenMetaverse.Settings.MAX_SEQUENCE">
16308 <summary>The maximum value of a packet sequence number before it
16309 rolls over back to one</summary>
16310 </member>
16311 <member name="F:OpenMetaverse.Settings.PACKET_ARCHIVE_SIZE">
16312 <summary>The maximum size of the sequence number archive, used to
16313 check for resent and/or duplicate packets</summary>
16314 </member>
16315 <member name="F:OpenMetaverse.Settings.RESOURCE_DIR">
16316 <summary>The relative directory where external resources are kept</summary>
16317 </member>
16318 <member name="F:OpenMetaverse.Settings.LOGIN_SERVER">
16319 <summary>Login server to connect to</summary>
16320 </member>
16321 <member name="F:OpenMetaverse.Settings.BIND_ADDR">
16322 <summary>IP Address the client will bind to</summary>
16323 </member>
16324 <member name="F:OpenMetaverse.Settings.USE_LLSD_LOGIN">
16325 <summary>Use XML-RPC Login or LLSD Login, default is XML-RPC Login</summary>
16326 </member>
16327 <member name="F:OpenMetaverse.Settings.TRANSFER_TIMEOUT">
16328 <summary>Number of milliseconds before an asset transfer will time
16329 out</summary>
16330 </member>
16331 <member name="F:OpenMetaverse.Settings.TELEPORT_TIMEOUT">
16332 <summary>Number of milliseconds before a teleport attempt will time
16333 out</summary>
16334 </member>
16335 <member name="F:OpenMetaverse.Settings.LOGOUT_TIMEOUT">
16336 <summary>Number of milliseconds before NetworkManager.Logout() will
16337 time out</summary>
16338 </member>
16339 <member name="F:OpenMetaverse.Settings.CAPS_TIMEOUT">
16340 <summary>Number of milliseconds before a CAPS call will time out</summary>
16341 <remarks>Setting this too low will cause web requests time out and
16342 possibly retry repeatedly</remarks>
16343 </member>
16344 <member name="F:OpenMetaverse.Settings.LOGIN_TIMEOUT">
16345 <summary>Number of milliseconds for xml-rpc to timeout</summary>
16346 </member>
16347 <member name="F:OpenMetaverse.Settings.RESEND_TIMEOUT">
16348 <summary>Milliseconds before a packet is assumed lost and resent</summary>
16349 </member>
16350 <member name="F:OpenMetaverse.Settings.SIMULATOR_TIMEOUT">
16351 <summary>Milliseconds without receiving a packet before the
16352 connection to a simulator is assumed lost</summary>
16353 </member>
16354 <member name="F:OpenMetaverse.Settings.MAP_REQUEST_TIMEOUT">
16355 <summary>Milliseconds to wait for a simulator info request through
16356 the grid interface</summary>
16357 </member>
16358 <member name="F:OpenMetaverse.Settings.MAX_PENDING_ACKS">
16359 <summary>Maximum number of queued ACKs to be sent before SendAcks()
16360 is forced</summary>
16361 </member>
16362 <member name="F:OpenMetaverse.Settings.STATS_QUEUE_SIZE">
16363 <summary>Network stats queue length (seconds)</summary>
16364 </member>
16365 <member name="F:OpenMetaverse.Settings.STORE_LAND_PATCHES">
16366 <summary>Enable/disable storing terrain heightmaps in the
16367 TerrainManager</summary>
16368 </member>
16369 <member name="F:OpenMetaverse.Settings.SEND_AGENT_UPDATES">
16370 <summary>Enable/disable sending periodic camera updates</summary>
16371 </member>
16372 <member name="F:OpenMetaverse.Settings.SEND_AGENT_APPEARANCE">
16373 <summary>Enable/disable automatically setting agent appearance at
16374 login and after sim crossing</summary>
16375 </member>
16376 <member name="F:OpenMetaverse.Settings.SEND_AGENT_THROTTLE">
16377 <summary>Enable/disable automatically setting the bandwidth throttle
16378 after connecting to each simulator</summary>
16379 <remarks>The default throttle uses the equivalent of the maximum
16380 bandwidth setting in the official client. If you do not set a
16381 throttle your connection will by default be throttled well below
16382 the minimum values and you may experience connection problems</remarks>
16383 </member>
16384 <member name="F:OpenMetaverse.Settings.SEND_PINGS">
16385 <summary>Enable/disable the sending of pings to monitor lag and
16386 packet loss</summary>
16387 </member> 14582 </member>
16388 <member name="F:OpenMetaverse.Settings.MULTIPLE_SIMS"> 14583 <member name="F:OpenMetaverse.VisualParam.Name">
16389 <summary>Should we connect to multiple sims? This will allow 14584 <summary>Internal name</summary>
16390 viewing in to neighboring simulators and sim crossings
16391 (Experimental)</summary>
16392 </member> 14585 </member>
16393 <member name="F:OpenMetaverse.Settings.ALWAYS_DECODE_OBJECTS"> 14586 <member name="F:OpenMetaverse.VisualParam.Group">
16394 <summary>If true, all object update packets will be decoded in to 14587 <summary>Group ID this parameter belongs to</summary>
16395 native objects. If false, only updates for our own agent will be
16396 decoded. Registering an event handler will force objects for that
16397 type to always be decoded. If this is disabled the object tracking
16398 will have missing or partial prim and avatar information</summary>
16399 </member> 14588 </member>
16400 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_OBJECTS"> 14589 <member name="F:OpenMetaverse.VisualParam.Wearable">
16401 <summary>If true, when a cached object check is received from the 14590 <summary>Name of the wearable this parameter belongs to</summary>
16402 server the full object info will automatically be requested</summary>
16403 </member> 14591 </member>
16404 <member name="F:OpenMetaverse.Settings.ENABLE_CAPS"> 14592 <member name="F:OpenMetaverse.VisualParam.Label">
16405 <summary>Whether to establish connections to HTTP capabilities 14593 <summary>Displayable label of this characteristic</summary>
16406 servers for simulators</summary>
16407 </member> 14594 </member>
16408 <member name="F:OpenMetaverse.Settings.ENABLE_SIMSTATS"> 14595 <member name="F:OpenMetaverse.VisualParam.LabelMin">
16409 <summary>Whether to decode sim stats</summary> 14596 <summary>Displayable label for the minimum value of this characteristic</summary>
16410 </member> 14597 </member>
16411 <member name="F:OpenMetaverse.Settings.LOG_ALL_CAPS_ERRORS"> 14598 <member name="F:OpenMetaverse.VisualParam.LabelMax">
16412 <summary>The capabilities servers are currently designed to 14599 <summary>Displayable label for the maximum value of this characteristic</summary>
16413 periodically return a 502 error which signals for the client to
16414 re-establish a connection. Set this to true to log those 502 errors</summary>
16415 </member> 14600 </member>
16416 <member name="F:OpenMetaverse.Settings.FETCH_MISSING_INVENTORY"> 14601 <member name="F:OpenMetaverse.VisualParam.DefaultValue">
16417 <summary>If true, any reference received for a folder or item 14602 <summary>Default value</summary>
16418 the library is not aware of will automatically be fetched</summary>
16419 </member> 14603 </member>
16420 <member name="F:OpenMetaverse.Settings.DISABLE_AGENT_UPDATE_DUPLICATE_CHECK"> 14604 <member name="F:OpenMetaverse.VisualParam.MinValue">
16421 <summary>If true, and <code>SEND_AGENT_UPDATES</code> is true, 14605 <summary>Minimum value</summary>
16422 AgentUpdate packets will continuously be sent out to give the bot
16423 smoother movement and autopiloting</summary>
16424 </member> 14606 </member>
16425 <member name="F:OpenMetaverse.Settings.AVATAR_TRACKING"> 14607 <member name="F:OpenMetaverse.VisualParam.MaxValue">
16426 <summary>If true, currently visible avatars will be stored 14608 <summary>Maximum value</summary>
16427 in dictionaries inside <code>Simulator.ObjectAvatars</code>.
16428 If false, a new Avatar or Primitive object will be created
16429 each time an object update packet is received</summary>
16430 </member> 14609 </member>
16431 <member name="F:OpenMetaverse.Settings.OBJECT_TRACKING"> 14610 <member name="F:OpenMetaverse.VisualParam.IsBumpAttribute">
16432 <summary>If true, currently visible avatars will be stored 14611 <summary>Is this param used for creation of bump layer?</summary>
16433 in dictionaries inside <code>Simulator.ObjectPrimitives</code>.
16434 If false, a new Avatar or Primitive object will be created
16435 each time an object update packet is received</summary>
16436 </member> 14612 </member>
16437 <member name="F:OpenMetaverse.Settings.USE_INTERPOLATION_TIMER"> 14613 <member name="F:OpenMetaverse.VisualParam.AlphaParams">
16438 <summary>If true, position and velocity will periodically be 14614 <summary>Alpha blending/bump info</summary>
16439 interpolated (extrapolated, technically) for objects and
16440 avatars that are being tracked by the library. This is
16441 necessary to increase the accuracy of speed and position
16442 estimates for simulated objects</summary>
16443 </member> 14615 </member>
16444 <member name="F:OpenMetaverse.Settings.TRACK_UTILIZATION"> 14616 <member name="F:OpenMetaverse.VisualParam.ColorParams">
16445 <summary> 14617 <summary>Color information</summary>
16446 If true, utilization statistics will be tracked. There is a minor penalty
16447 in CPU time for enabling this option.
16448 </summary>
16449 </member> 14618 </member>
16450 <member name="F:OpenMetaverse.Settings.PARCEL_TRACKING"> 14619 <member name="F:OpenMetaverse.VisualParam.Drivers">
16451 <summary>If true, parcel details will be stored in the 14620 <summary>Array of param IDs that are drivers for this parameter</summary>
16452 <code>Simulator.Parcels</code> dictionary as they are received</summary>
16453 </member> 14621 </member>
16454 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_PARCEL_ACL"> 14622 <member name="M:OpenMetaverse.VisualParam.#ctor(System.Int32,System.String,System.Int32,System.String,System.String,System.String,System.String,System.Single,System.Single,System.Single,System.Boolean,System.Int32[],System.Nullable{OpenMetaverse.VisualAlphaParam},System.Nullable{OpenMetaverse.VisualColorParam})">
16455 <summary> 14623 <summary>
16456 If true, an incoming parcel properties reply will automatically send 14624 Set all the values through the constructor
16457 a request for the parcel access list
16458 </summary> 14625 </summary>
14626 <param name="paramID">Index of this visual param</param>
14627 <param name="name">Internal name</param>
14628 <param name="group"></param>
14629 <param name="wearable"></param>
14630 <param name="label">Displayable label of this characteristic</param>
14631 <param name="labelMin">Displayable label for the minimum value of this characteristic</param>
14632 <param name="labelMax">Displayable label for the maximum value of this characteristic</param>
14633 <param name="def">Default value</param>
14634 <param name="min">Minimum value</param>
14635 <param name="max">Maximum value</param>
14636 <param name="isBumpAttribute">Is this param used for creation of bump layer?</param>
14637 <param name="drivers">Array of param IDs that are drivers for this parameter</param>
14638 <param name="alpha">Alpha blending/bump info</param>
14639 <param name="colorParams">Color information</param>
16459 </member> 14640 </member>
16460 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_PARCEL_DWELL"> 14641 <member name="T:OpenMetaverse.VisualParams">
16461 <summary> 14642 <summary>
16462 if true, an incoming parcel properties reply will automatically send 14643 Holds the Params array of all the avatar appearance parameters
16463 a request for the traffic count.
16464 </summary> 14644 </summary>
16465 </member> 14645 </member>
16466 <member name="F:OpenMetaverse.Settings.USE_ASSET_CACHE"> 14646 <member name="T:OpenMetaverse.UDPBase">
16467 <summary> 14647 <summary>
16468 If true, images, and other assets downloaded from the server 14648
16469 will be cached in a local directory
16470 </summary> 14649 </summary>
16471 </member> 14650 </member>
16472 <member name="F:OpenMetaverse.Settings.ASSET_CACHE_DIR"> 14651 <member name="M:OpenMetaverse.UDPBase.#ctor(System.Int32)">
16473 <summary>Path to store cached texture data</summary>
16474 </member>
16475 <member name="F:OpenMetaverse.Settings.ASSET_CACHE_MAX_SIZE">
16476 <summary>Maximum size cached files are allowed to take on disk (bytes)</summary>
16477 </member>
16478 <member name="F:OpenMetaverse.Settings.DEFAULT_EFFECT_COLOR">
16479 <summary>Default color used for viewer particle effects</summary>
16480 </member>
16481 <member name="F:OpenMetaverse.Settings.MAX_RESEND_COUNT">
16482 <summary>Maximum number of times to resend a failed packet</summary>
16483 </member>
16484 <member name="F:OpenMetaverse.Settings.THROTTLE_OUTGOING_PACKETS">
16485 <summary>Throttle outgoing packet rate</summary>
16486 </member>
16487 <member name="F:OpenMetaverse.Settings.CLIENT_IDENTIFICATION_TAG">
16488 <summary>UUID of a texture used by some viewers to indentify type of client used</summary>
16489 </member>
16490 <member name="F:OpenMetaverse.Settings.USE_HTTP_TEXTURES">
16491 <summary> 14652 <summary>
16492 Download textures using GetTexture capability when available 14653 Initialize the UDP packet handler in server mode
16493 </summary> 14654 </summary>
14655 <param name="port">Port to listening for incoming UDP packets on</param>
16494 </member> 14656 </member>
16495 <member name="F:OpenMetaverse.Settings.MAX_CONCURRENT_TEXTURE_DOWNLOADS"> 14657 <member name="M:OpenMetaverse.UDPBase.#ctor(System.Net.IPEndPoint)">
16496 <summary>The maximum number of concurrent texture downloads allowed</summary>
16497 <remarks>Increasing this number will not necessarily increase texture retrieval times due to
16498 simulator throttles</remarks>
16499 </member>
16500 <member name="F:OpenMetaverse.Settings.PIPELINE_REFRESH_INTERVAL">
16501 <summary> 14658 <summary>
16502 The Refresh timer inteval is used to set the delay between checks for stalled texture downloads 14659 Initialize the UDP packet handler in client mode
16503 </summary> 14660 </summary>
16504 <remarks>This is a static variable which applies to all instances</remarks> 14661 <param name="endPoint">Remote UDP server to connect to</param>
16505 </member> 14662 </member>
16506 <member name="F:OpenMetaverse.Settings.PIPELINE_REQUEST_TIMEOUT"> 14663 <member name="M:OpenMetaverse.UDPBase.Start">
16507 <summary> 14664 <summary>
16508 Textures taking longer than this value will be flagged as timed out and removed from the pipeline 14665
16509 </summary> 14666 </summary>
16510 </member> 14667 </member>
16511 <member name="F:OpenMetaverse.Settings.LOG_LEVEL"> 14668 <member name="M:OpenMetaverse.UDPBase.Stop">
16512 <summary> 14669 <summary>
16513 Get or set the minimum log level to output to the console by default 14670
16514 If the library is not compiled with DEBUG defined and this level is set to DEBUG
16515 You will get no output on the console. This behavior can be overriden by creating
16516 a logger configuration file for log4net
16517 </summary> 14671 </summary>
16518 </member> 14672 </member>
16519 <member name="F:OpenMetaverse.Settings.LOG_NAMES"> 14673 <member name="P:OpenMetaverse.UDPBase.IsRunning">
16520 <summary>Attach avatar names to log messages</summary>
16521 </member>
16522 <member name="F:OpenMetaverse.Settings.LOG_RESENDS">
16523 <summary>Log packet retransmission info</summary>
16524 </member>
16525 <member name="P:OpenMetaverse.Settings.UPLOAD_COST">
16526 <summary>Cost of uploading an asset</summary>
16527 <remarks>Read-only since this value is dynamically fetched at login</remarks>
16528 </member>
16529 <member name="M:OpenMetaverse.Settings.EconomyDataHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
16530 <summary>Process an incoming packet and raise the appropriate events</summary>
16531 <param name="sender">The sender</param>
16532 <param name="e">The EventArgs object containing the packet data</param>
16533 </member>
16534 <member name="T:OpenMetaverse.RegionFlags">
16535 <summary> 14674 <summary>
16536 Simulator (region) properties 14675
16537 </summary> 14676 </summary>
16538 </member> 14677 </member>
16539 <member name="F:OpenMetaverse.RegionFlags.None"> 14678 <member name="T:OpenMetaverse.Helpers">
16540 <summary>No flags set</summary>
16541 </member>
16542 <member name="F:OpenMetaverse.RegionFlags.AllowDamage">
16543 <summary>Agents can take damage and be killed</summary>
16544 </member>
16545 <member name="F:OpenMetaverse.RegionFlags.AllowLandmark">
16546 <summary>Landmarks can be created here</summary>
16547 </member>
16548 <member name="F:OpenMetaverse.RegionFlags.AllowSetHome">
16549 <summary>Home position can be set in this sim</summary>
16550 </member>
16551 <member name="F:OpenMetaverse.RegionFlags.ResetHomeOnTeleport">
16552 <summary>Home position is reset when an agent teleports away</summary>
16553 </member>
16554 <member name="F:OpenMetaverse.RegionFlags.SunFixed">
16555 <summary>Sun does not move</summary>
16556 </member>
16557 <member name="F:OpenMetaverse.RegionFlags.TaxFree">
16558 <summary>No object, land, etc. taxes</summary>
16559 </member>
16560 <member name="F:OpenMetaverse.RegionFlags.BlockTerraform">
16561 <summary>Disable heightmap alterations (agents can still plant
16562 foliage)</summary>
16563 </member>
16564 <member name="F:OpenMetaverse.RegionFlags.BlockLandResell">
16565 <summary>Land cannot be released, sold, or purchased</summary>
16566 </member>
16567 <member name="F:OpenMetaverse.RegionFlags.Sandbox">
16568 <summary>All content is wiped nightly</summary>
16569 </member>
16570 <member name="F:OpenMetaverse.RegionFlags.NullLayer">
16571 <summary>Unknown: Related to the availability of an overview world map tile.(Think mainland images when zoomed out.)</summary>
16572 </member>
16573 <member name="F:OpenMetaverse.RegionFlags.SkipAgentAction">
16574 <summary>Unknown: Related to region debug flags. Possibly to skip processing of agent interaction with world. </summary>
16575 </member>
16576 <member name="F:OpenMetaverse.RegionFlags.SkipUpdateInterestList">
16577 <summary>Region does not update agent prim interest lists. Internal debugging option.</summary>
16578 </member>
16579 <member name="F:OpenMetaverse.RegionFlags.SkipCollisions">
16580 <summary>No collision detection for non-agent objects</summary>
16581 </member>
16582 <member name="F:OpenMetaverse.RegionFlags.SkipScripts">
16583 <summary>No scripts are ran</summary>
16584 </member>
16585 <member name="F:OpenMetaverse.RegionFlags.SkipPhysics">
16586 <summary>All physics processing is turned off</summary>
16587 </member>
16588 <member name="F:OpenMetaverse.RegionFlags.ExternallyVisible">
16589 <summary>Region can be seen from other regions on world map. (Legacy world map option?) </summary>
16590 </member>
16591 <member name="F:OpenMetaverse.RegionFlags.MainlandVisible">
16592 <summary>Region can be seen from mainland on world map. (Legacy world map option?) </summary>
16593 </member>
16594 <member name="F:OpenMetaverse.RegionFlags.PublicAllowed">
16595 <summary>Agents not explicitly on the access list can visit the region. </summary>
16596 </member>
16597 <member name="F:OpenMetaverse.RegionFlags.BlockDwell">
16598 <summary>Traffic calculations are not run across entire region, overrides parcel settings. </summary>
16599 </member>
16600 <member name="F:OpenMetaverse.RegionFlags.NoFly">
16601 <summary>Flight is disabled (not currently enforced by the sim)</summary>
16602 </member>
16603 <member name="F:OpenMetaverse.RegionFlags.AllowDirectTeleport">
16604 <summary>Allow direct (p2p) teleporting</summary>
16605 </member>
16606 <member name="F:OpenMetaverse.RegionFlags.EstateSkipScripts">
16607 <summary>Estate owner has temporarily disabled scripting</summary>
16608 </member>
16609 <member name="F:OpenMetaverse.RegionFlags.RestrictPushObject">
16610 <summary>Restricts the usage of the LSL llPushObject function, applies to whole region.</summary>
16611 </member>
16612 <member name="F:OpenMetaverse.RegionFlags.DenyAnonymous">
16613 <summary>Deny agents with no payment info on file</summary>
16614 </member>
16615 <member name="F:OpenMetaverse.RegionFlags.DenyIdentified">
16616 <summary>Deny agents with payment info on file</summary>
16617 </member>
16618 <member name="F:OpenMetaverse.RegionFlags.DenyTransacted">
16619 <summary>Deny agents who have made a monetary transaction</summary>
16620 </member>
16621 <member name="F:OpenMetaverse.RegionFlags.AllowParcelChanges">
16622 <summary>Parcels within the region may be joined or divided by anyone, not just estate owners/managers. </summary>
16623 </member>
16624 <member name="F:OpenMetaverse.RegionFlags.AbuseEmailToEstateOwner">
16625 <summary>Abuse reports sent from within this region are sent to the estate owner defined email. </summary>
16626 </member>
16627 <member name="F:OpenMetaverse.RegionFlags.AllowVoice">
16628 <summary>Region is Voice Enabled</summary>
16629 </member>
16630 <member name="F:OpenMetaverse.RegionFlags.BlockParcelSearch">
16631 <summary>Removes the ability from parcel owners to set their parcels to show in search.</summary>
16632 </member>
16633 <member name="F:OpenMetaverse.RegionFlags.DenyAgeUnverified">
16634 <summary>Deny agents who have not been age verified from entering the region.</summary>
16635 </member>
16636 <member name="T:OpenMetaverse.SimAccess">
16637 <summary> 14679 <summary>
16638 Access level for a simulator 14680 Static helper functions and global variables
16639 </summary> 14681 </summary>
16640 </member> 14682 </member>
16641 <member name="F:OpenMetaverse.SimAccess.Unknown"> 14683 <member name="F:OpenMetaverse.Helpers.MSG_APPENDED_ACKS">
16642 <summary>Unknown or invalid access level</summary> 14684 <summary>This header flag signals that ACKs are appended to the packet</summary>
16643 </member>
16644 <member name="F:OpenMetaverse.SimAccess.Trial">
16645 <summary>Trial accounts allowed</summary>
16646 </member>
16647 <member name="F:OpenMetaverse.SimAccess.PG">
16648 <summary>PG rating</summary>
16649 </member>
16650 <member name="F:OpenMetaverse.SimAccess.Mature">
16651 <summary>Mature rating</summary>
16652 </member>
16653 <member name="F:OpenMetaverse.SimAccess.Adult">
16654 <summary>Adult rating</summary>
16655 </member> 14685 </member>
16656 <member name="F:OpenMetaverse.SimAccess.Down"> 14686 <member name="F:OpenMetaverse.Helpers.MSG_RESENT">
16657 <summary>Simulator is offline</summary> 14687 <summary>This header flag signals that this packet has been sent before</summary>
16658 </member> 14688 </member>
16659 <member name="F:OpenMetaverse.SimAccess.NonExistent"> 14689 <member name="F:OpenMetaverse.Helpers.MSG_RELIABLE">
16660 <summary>Simulator does not exist</summary> 14690 <summary>This header flags signals that an ACK is expected for this packet</summary>
16661 </member> 14691 </member>
16662 <member name="T:OpenMetaverse.Simulator"> 14692 <member name="F:OpenMetaverse.Helpers.MSG_ZEROCODED">
16663 <summary> 14693 <summary>This header flag signals that the message is compressed using zerocoding</summary>
16664 </summary>
16665 </member> 14694 </member>
16666 <member name="M:OpenMetaverse.Simulator.#ctor(OpenMetaverse.GridClient,System.Net.IPEndPoint,System.UInt64)"> 14695 <member name="M:OpenMetaverse.Helpers.TEOffsetShort(System.Single)">
16667 <summary> 14696 <summary>
14697
16668 </summary> 14698 </summary>
16669 <param name="client">Reference to the GridClient object</param> 14699 <param name="offset"></param>
16670 <param name="address">IPEndPoint of the simulator</param> 14700 <returns></returns>
16671 <param name="handle">handle of the simulator</param>
16672 </member> 14701 </member>
16673 <member name="T:OpenMetaverse.Simulator.SimStats"> 14702 <member name="M:OpenMetaverse.Helpers.TEOffsetFloat(System.Byte[],System.Int32)">
16674 <summary> 14703 <summary>
16675 Simulator Statistics 14704
16676 </summary> 14705 </summary>
14706 <param name="bytes"></param>
14707 <param name="pos"></param>
14708 <returns></returns>
16677 </member> 14709 </member>
16678 <member name="F:OpenMetaverse.Simulator.SimStats.SentPackets"> 14710 <member name="M:OpenMetaverse.Helpers.TERotationShort(System.Single)">
16679 <summary>Total number of packets sent by this simulator to this agent</summary>
16680 </member>
16681 <member name="F:OpenMetaverse.Simulator.SimStats.RecvPackets">
16682 <summary>Total number of packets received by this simulator to this agent</summary>
16683 </member>
16684 <member name="F:OpenMetaverse.Simulator.SimStats.SentBytes">
16685 <summary>Total number of bytes sent by this simulator to this agent</summary>
16686 </member>
16687 <member name="F:OpenMetaverse.Simulator.SimStats.RecvBytes">
16688 <summary>Total number of bytes received by this simulator to this agent</summary>
16689 </member>
16690 <member name="F:OpenMetaverse.Simulator.SimStats.ConnectTime">
16691 <summary>Time in seconds agent has been connected to simulator</summary>
16692 </member>
16693 <member name="F:OpenMetaverse.Simulator.SimStats.ResentPackets">
16694 <summary>Total number of packets that have been resent</summary>
16695 </member>
16696 <member name="F:OpenMetaverse.Simulator.SimStats.ReceivedResends">
16697 <summary>Total number of resent packets recieved</summary>
16698 </member>
16699 <member name="F:OpenMetaverse.Simulator.SimStats.SentPings">
16700 <summary>Total number of pings sent to this simulator by this agent</summary>
16701 </member>
16702 <member name="F:OpenMetaverse.Simulator.SimStats.ReceivedPongs">
16703 <summary>Total number of ping replies sent to this agent by this simulator</summary>
16704 </member>
16705 <member name="F:OpenMetaverse.Simulator.SimStats.IncomingBPS">
16706 <summary> 14711 <summary>
16707 Incoming bytes per second 14712
16708 </summary> 14713 </summary>
16709 <remarks>It would be nice to have this claculated on the fly, but 14714 <param name="rotation"></param>
16710 this is far, far easier</remarks> 14715 <returns></returns>
16711 </member> 14716 </member>
16712 <member name="F:OpenMetaverse.Simulator.SimStats.OutgoingBPS"> 14717 <member name="M:OpenMetaverse.Helpers.TERotationFloat(System.Byte[],System.Int32)">
16713 <summary> 14718 <summary>
16714 Outgoing bytes per second 14719
16715 </summary> 14720 </summary>
16716 <remarks>It would be nice to have this claculated on the fly, but 14721 <param name="bytes"></param>
16717 this is far, far easier</remarks> 14722 <param name="pos"></param>
14723 <returns></returns>
16718 </member> 14724 </member>
16719 <member name="F:OpenMetaverse.Simulator.SimStats.LastPingSent"> 14725 <member name="M:OpenMetaverse.Helpers.GlobalPosToRegionHandle(System.Single,System.Single,System.Single@,System.Single@)">
16720 <summary>Time last ping was sent</summary>
16721 </member>
16722 <member name="F:OpenMetaverse.Simulator.SimStats.LastPingID">
16723 <summary>ID of last Ping sent</summary>
16724 </member>
16725 <member name="F:OpenMetaverse.Simulator.SimStats.LastLag">
16726 <summary> 14726 <summary>
14727 Given an X/Y location in absolute (grid-relative) terms, a region
14728 handle is returned along with the local X/Y location in that region
16727 </summary> 14729 </summary>
14730 <param name="globalX">The absolute X location, a number such as
14731 255360.35</param>
14732 <param name="globalY">The absolute Y location, a number such as
14733 255360.35</param>
14734 <param name="localX">The sim-local X position of the global X
14735 position, a value from 0.0 to 256.0</param>
14736 <param name="localY">The sim-local Y position of the global Y
14737 position, a value from 0.0 to 256.0</param>
14738 <returns>A 64-bit region handle that can be used to teleport to</returns>
16728 </member> 14739 </member>
16729 <member name="F:OpenMetaverse.Simulator.SimStats.MissedPings"> 14740 <member name="M:OpenMetaverse.Helpers.FloatToTerseString(System.Single)">
16730 <summary> 14741 <summary>
14742 Converts a floating point number to a terse string format used for
14743 transmitting numbers in wearable asset files
16731 </summary> 14744 </summary>
14745 <param name="val">Floating point number to convert to a string</param>
14746 <returns>A terse string representation of the input number</returns>
16732 </member> 14747 </member>
16733 <member name="F:OpenMetaverse.Simulator.SimStats.Dilation"> 14748 <member name="M:OpenMetaverse.Helpers.FieldToString(System.Text.StringBuilder,System.Byte[],System.String)">
16734 <summary>Current time dilation of this simulator</summary>
16735 </member>
16736 <member name="F:OpenMetaverse.Simulator.SimStats.FPS">
16737 <summary>Current Frames per second of simulator</summary>
16738 </member>
16739 <member name="F:OpenMetaverse.Simulator.SimStats.PhysicsFPS">
16740 <summary>Current Physics frames per second of simulator</summary>
16741 </member>
16742 <member name="F:OpenMetaverse.Simulator.SimStats.AgentUpdates">
16743 <summary> 14749 <summary>
14750 Convert a variable length field (byte array) to a string, with a
14751 field name prepended to each line of the output
16744 </summary> 14752 </summary>
14753 <remarks>If the byte array has unprintable characters in it, a
14754 hex dump will be written instead</remarks>
14755 <param name="output">The StringBuilder object to write to</param>
14756 <param name="bytes">The byte array to convert to a string</param>
14757 <param name="fieldName">A field name to prepend to each line of output</param>
16745 </member> 14758 </member>
16746 <member name="F:OpenMetaverse.Simulator.SimStats.FrameTime"> 14759 <member name="M:OpenMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])">
16747 <summary> 14760 <summary>
14761 Decode a zerocoded byte array, used to decompress packets marked
14762 with the zerocoded flag
16748 </summary> 14763 </summary>
14764 <remarks>Any time a zero is encountered, the next byte is a count
14765 of how many zeroes to expand. One zero is encoded with 0x00 0x01,
14766 two zeroes is 0x00 0x02, three zeroes is 0x00 0x03, etc. The
14767 first four bytes are copied directly to the output buffer.
14768 </remarks>
14769 <param name="src">The byte array to decode</param>
14770 <param name="srclen">The length of the byte array to decode. This
14771 would be the length of the packet up to (but not including) any
14772 appended ACKs</param>
14773 <param name="dest">The output byte array to decode to</param>
14774 <returns>The length of the output buffer</returns>
16749 </member> 14775 </member>
16750 <member name="F:OpenMetaverse.Simulator.SimStats.NetTime"> 14776 <member name="M:OpenMetaverse.Helpers.ZeroEncode(System.Byte[],System.Int32,System.Byte[])">
16751 <summary> 14777 <summary>
14778 Encode a byte array with zerocoding. Used to compress packets marked
14779 with the zerocoded flag. Any zeroes in the array are compressed down
14780 to a single zero byte followed by a count of how many zeroes to expand
14781 out. A single zero becomes 0x00 0x01, two zeroes becomes 0x00 0x02,
14782 three zeroes becomes 0x00 0x03, etc. The first four bytes are copied
14783 directly to the output buffer.
16752 </summary> 14784 </summary>
14785 <param name="src">The byte array to encode</param>
14786 <param name="srclen">The length of the byte array to encode</param>
14787 <param name="dest">The output byte array to encode to</param>
14788 <returns>The length of the output buffer</returns>
16753 </member> 14789 </member>
16754 <member name="F:OpenMetaverse.Simulator.SimStats.PhysicsTime"> 14790 <member name="M:OpenMetaverse.Helpers.InventoryCRC(System.Int32,System.Byte,System.SByte,System.SByte,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Int32,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.UInt32,System.UInt32,System.UInt32,System.UInt32,System.UInt32)">
16755 <summary> 14791 <summary>
14792 Calculates the CRC (cyclic redundancy check) needed to upload inventory.
16756 </summary> 14793 </summary>
14794 <param name="creationDate">Creation date</param>
14795 <param name="saleType">Sale type</param>
14796 <param name="invType">Inventory type</param>
14797 <param name="type">Type</param>
14798 <param name="assetID">Asset ID</param>
14799 <param name="groupID">Group ID</param>
14800 <param name="salePrice">Sale price</param>
14801 <param name="ownerID">Owner ID</param>
14802 <param name="creatorID">Creator ID</param>
14803 <param name="itemID">Item ID</param>
14804 <param name="folderID">Folder ID</param>
14805 <param name="everyoneMask">Everyone mask (permissions)</param>
14806 <param name="flags">Flags</param>
14807 <param name="nextOwnerMask">Next owner mask (permissions)</param>
14808 <param name="groupMask">Group mask (permissions)</param>
14809 <param name="ownerMask">Owner mask (permissions)</param>
14810 <returns>The calculated CRC</returns>
16757 </member> 14811 </member>
16758 <member name="F:OpenMetaverse.Simulator.SimStats.ImageTime"> 14812 <member name="M:OpenMetaverse.Helpers.GetResourceStream(System.String)">
16759 <summary> 14813 <summary>
14814 Attempts to load a file embedded in the assembly
16760 </summary> 14815 </summary>
14816 <param name="resourceName">The filename of the resource to load</param>
14817 <returns>A Stream for the requested file, or null if the resource
14818 was not successfully loaded</returns>
16761 </member> 14819 </member>
16762 <member name="F:OpenMetaverse.Simulator.SimStats.ScriptTime"> 14820 <member name="M:OpenMetaverse.Helpers.GetResourceStream(System.String,System.String)">
16763 <summary> 14821 <summary>
14822 Attempts to load a file either embedded in the assembly or found in
14823 a given search path
16764 </summary> 14824 </summary>
14825 <param name="resourceName">The filename of the resource to load</param>
14826 <param name="searchPath">An optional path that will be searched if
14827 the asset is not found embedded in the assembly</param>
14828 <returns>A Stream for the requested file, or null if the resource
14829 was not successfully loaded</returns>
16765 </member> 14830 </member>
16766 <member name="F:OpenMetaverse.Simulator.SimStats.AgentTime"> 14831 <member name="M:OpenMetaverse.Helpers.PrimListToOSD(System.Collections.Generic.List{OpenMetaverse.Primitive})">
16767 <summary> 14832 <summary>
14833 Converts a list of primitives to an object that can be serialized
14834 with the LLSD system
16768 </summary> 14835 </summary>
14836 <param name="prims">Primitives to convert to a serializable object</param>
14837 <returns>An object that can be serialized with LLSD</returns>
16769 </member> 14838 </member>
16770 <member name="F:OpenMetaverse.Simulator.SimStats.OtherTime"> 14839 <member name="M:OpenMetaverse.Helpers.OSDToPrimList(OpenMetaverse.StructuredData.OSD)">
16771 <summary> 14840 <summary>
14841 Deserializes OSD in to a list of primitives
16772 </summary> 14842 </summary>
14843 <param name="osd">Structure holding the serialized primitive list,
14844 must be of the SDMap type</param>
14845 <returns>A list of deserialized primitives</returns>
16773 </member> 14846 </member>
16774 <member name="F:OpenMetaverse.Simulator.SimStats.Objects"> 14847 <member name="M:OpenMetaverse.Helpers.StructToString(System.Object)">
16775 <summary>Total number of objects Simulator is simulating</summary> 14848 <summary>
16776 </member> 14849 Converts a struct or class object containing fields only into a key value separated string
16777 <member name="F:OpenMetaverse.Simulator.SimStats.ScriptedObjects"> 14850 </summary>
16778 <summary>Total number of Active (Scripted) objects running</summary> 14851 <param name="t">The struct object</param>
16779 </member> 14852 <returns>A string containing the struct fields as the keys, and the field value as the value separated</returns>
16780 <member name="F:OpenMetaverse.Simulator.SimStats.Agents"> 14853 <example>
16781 <summary>Number of agents currently in this simulator</summary> 14854 <code>
16782 </member> 14855 // Add the following code to any struct or class containing only fields to override the ToString()
16783 <member name="F:OpenMetaverse.Simulator.SimStats.ChildAgents"> 14856 // method to display the values of the passed object
16784 <summary>Number of agents in neighbor simulators</summary> 14857
16785 </member> 14858 /// <summary>Print the struct data as a string</summary>
16786 <member name="F:OpenMetaverse.Simulator.SimStats.ActiveScripts"> 14859 ///<returns>A string containing the field name, and field value</returns>
16787 <summary>Number of Active scripts running in this simulator</summary> 14860 public override string ToString()
16788 </member> 14861 {
16789 <member name="F:OpenMetaverse.Simulator.SimStats.LSLIPS"> 14862 return Helpers.StructToString(this);
16790 <summary> 14863 }
16791 </summary> 14864 </code>
14865 </example>
16792 </member> 14866 </member>
16793 <member name="F:OpenMetaverse.Simulator.SimStats.INPPS"> 14867 <member name="T:OpenMetaverse.Helpers.LogLevel">
16794 <summary> 14868 <summary>
14869 Passed to Logger.Log() to identify the severity of a log entry
16795 </summary> 14870 </summary>
16796 </member> 14871 </member>
16797 <member name="F:OpenMetaverse.Simulator.SimStats.OUTPPS"> 14872 <member name="F:OpenMetaverse.Helpers.LogLevel.None">
16798 <summary> 14873 <summary>No logging information will be output</summary>
16799 </summary>
16800 </member> 14874 </member>
16801 <member name="F:OpenMetaverse.Simulator.SimStats.PendingDownloads"> 14875 <member name="F:OpenMetaverse.Helpers.LogLevel.Info">
16802 <summary>Number of downloads pending</summary> 14876 <summary>Non-noisy useful information, may be helpful in
14877 debugging a problem</summary>
16803 </member> 14878 </member>
16804 <member name="F:OpenMetaverse.Simulator.SimStats.PendingUploads"> 14879 <member name="F:OpenMetaverse.Helpers.LogLevel.Warning">
16805 <summary>Number of uploads pending</summary> 14880 <summary>A non-critical error occurred. A warning will not
14881 prevent the rest of the library from operating as usual,
14882 although it may be indicative of an underlying issue</summary>
16806 </member> 14883 </member>
16807 <member name="F:OpenMetaverse.Simulator.SimStats.VirtualSize"> 14884 <member name="F:OpenMetaverse.Helpers.LogLevel.Error">
16808 <summary> 14885 <summary>A critical error has occurred. Generally this will
16809 </summary> 14886 be followed by the network layer shutting down, although the
14887 stability of the library after an error is uncertain</summary>
16810 </member> 14888 </member>
16811 <member name="F:OpenMetaverse.Simulator.SimStats.ResidentSize"> 14889 <member name="F:OpenMetaverse.Helpers.LogLevel.Debug">
16812 <summary> 14890 <summary>Used for internal testing, this logging level can
14891 generate very noisy (long and/or repetitive) messages. Don't
14892 pass this to the Log() function, use DebugLog() instead.
16813 </summary> 14893 </summary>
16814 </member> 14894 </member>
16815 <member name="F:OpenMetaverse.Simulator.SimStats.PendingLocalUploads"> 14895 <member name="F:OpenMetaverse.Http.EventQueueClient.REQUEST_TIMEOUT">
16816 <summary>Number of local uploads pending</summary> 14896 <summary>=</summary>
16817 </member>
16818 <member name="F:OpenMetaverse.Simulator.SimStats.UnackedBytes">
16819 <summary>Unacknowledged bytes in queue</summary>
16820 </member>
16821 <member name="F:OpenMetaverse.Simulator.Client">
16822 <summary>A public reference to the client that this Simulator object
16823 is attached to</summary>
16824 </member>
16825 <member name="F:OpenMetaverse.Simulator.ID">
16826 <summary>A Unique Cache identifier for this simulator</summary>
16827 </member>
16828 <member name="F:OpenMetaverse.Simulator.Caps">
16829 <summary>The capabilities for this simulator</summary>
16830 </member> 14897 </member>
16831 <member name="F:OpenMetaverse.Simulator.Handle"> 14898 <member name="F:OpenMetaverse.Http.EventQueueClient._errorCount">
16832 <summary> 14899 <summary>Number of times we've received an unknown CAPS exception in series.</summary>
16833 </summary>
16834 </member> 14900 </member>
16835 <member name="F:OpenMetaverse.Simulator.SimVersion"> 14901 <member name="F:OpenMetaverse.Http.EventQueueClient._random">
16836 <summary>The current version of software this simulator is running</summary> 14902 <summary>For exponential backoff on error.</summary>
16837 </member> 14903 </member>
16838 <member name="F:OpenMetaverse.Simulator.Name"> 14904 <member name="T:OpenMetaverse.Bumpiness">
16839 <summary> 14905 <summary>
14906 The type of bump-mapping applied to a face
16840 </summary> 14907 </summary>
16841 </member> 14908 </member>
16842 <member name="F:OpenMetaverse.Simulator.ParcelOverlay"> 14909 <member name="F:OpenMetaverse.Bumpiness.None">
16843 <summary>A 64x64 grid of parcel coloring values. The values stored 14910 <summary></summary>
16844 in this array are of the <seealso cref="!:ParcelArrayType" /> type</summary>
16845 </member> 14911 </member>
16846 <member name="F:OpenMetaverse.Simulator.ParcelOverlaysReceived"> 14912 <member name="F:OpenMetaverse.Bumpiness.Brightness">
16847 <summary> 14913 <summary></summary>
16848 </summary>
16849 </member> 14914 </member>
16850 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange00"> 14915 <member name="F:OpenMetaverse.Bumpiness.Darkness">
16851 <summary> 14916 <summary></summary>
16852 </summary>
16853 </member> 14917 </member>
16854 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange01"> 14918 <member name="F:OpenMetaverse.Bumpiness.Woodgrain">
16855 <summary> 14919 <summary></summary>
16856 </summary>
16857 </member> 14920 </member>
16858 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange10"> 14921 <member name="F:OpenMetaverse.Bumpiness.Bark">
16859 <summary> 14922 <summary></summary>
16860 </summary>
16861 </member> 14923 </member>
16862 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange11"> 14924 <member name="F:OpenMetaverse.Bumpiness.Bricks">
16863 <summary> 14925 <summary></summary>
16864 </summary>
16865 </member> 14926 </member>
16866 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight00"> 14927 <member name="F:OpenMetaverse.Bumpiness.Checker">
16867 <summary> 14928 <summary></summary>
16868 </summary>
16869 </member> 14929 </member>
16870 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight01"> 14930 <member name="F:OpenMetaverse.Bumpiness.Concrete">
16871 <summary> 14931 <summary></summary>
16872 </summary>
16873 </member> 14932 </member>
16874 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight10"> 14933 <member name="F:OpenMetaverse.Bumpiness.Crustytile">
16875 <summary> 14934 <summary></summary>
16876 </summary>
16877 </member> 14935 </member>
16878 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight11"> 14936 <member name="F:OpenMetaverse.Bumpiness.Cutstone">
16879 <summary> 14937 <summary></summary>
16880 </summary>
16881 </member> 14938 </member>
16882 <member name="F:OpenMetaverse.Simulator.WaterHeight"> 14939 <member name="F:OpenMetaverse.Bumpiness.Discs">
16883 <summary> 14940 <summary></summary>
16884 </summary>
16885 </member> 14941 </member>
16886 <member name="F:OpenMetaverse.Simulator.SimOwner"> 14942 <member name="F:OpenMetaverse.Bumpiness.Gravel">
16887 <summary> 14943 <summary></summary>
16888 </summary>
16889 </member> 14944 </member>
16890 <member name="F:OpenMetaverse.Simulator.TerrainBase0"> 14945 <member name="F:OpenMetaverse.Bumpiness.Petridish">
16891 <summary> 14946 <summary></summary>
16892 </summary>
16893 </member> 14947 </member>
16894 <member name="F:OpenMetaverse.Simulator.TerrainBase1"> 14948 <member name="F:OpenMetaverse.Bumpiness.Siding">
16895 <summary> 14949 <summary></summary>
16896 </summary>
16897 </member> 14950 </member>
16898 <member name="F:OpenMetaverse.Simulator.TerrainBase2"> 14951 <member name="F:OpenMetaverse.Bumpiness.Stonetile">
16899 <summary> 14952 <summary></summary>
16900 </summary>
16901 </member> 14953 </member>
16902 <member name="F:OpenMetaverse.Simulator.TerrainBase3"> 14954 <member name="F:OpenMetaverse.Bumpiness.Stucco">
16903 <summary> 14955 <summary></summary>
16904 </summary>
16905 </member> 14956 </member>
16906 <member name="F:OpenMetaverse.Simulator.TerrainDetail0"> 14957 <member name="F:OpenMetaverse.Bumpiness.Suction">
16907 <summary> 14958 <summary></summary>
16908 </summary>
16909 </member> 14959 </member>
16910 <member name="F:OpenMetaverse.Simulator.TerrainDetail1"> 14960 <member name="F:OpenMetaverse.Bumpiness.Weave">
16911 <summary> 14961 <summary></summary>
16912 </summary>
16913 </member> 14962 </member>
16914 <member name="F:OpenMetaverse.Simulator.TerrainDetail2"> 14963 <member name="T:OpenMetaverse.Shininess">
16915 <summary> 14964 <summary>
14965 The level of shininess applied to a face
16916 </summary> 14966 </summary>
16917 </member> 14967 </member>
16918 <member name="F:OpenMetaverse.Simulator.TerrainDetail3"> 14968 <member name="F:OpenMetaverse.Shininess.None">
16919 <summary> 14969 <summary></summary>
16920 </summary>
16921 </member> 14970 </member>
16922 <member name="F:OpenMetaverse.Simulator.IsEstateManager"> 14971 <member name="F:OpenMetaverse.Shininess.Low">
16923 <summary>true if your agent has Estate Manager rights on this region</summary> 14972 <summary></summary>
16924 </member> 14973 </member>
16925 <member name="F:OpenMetaverse.Simulator.Flags"> 14974 <member name="F:OpenMetaverse.Shininess.Medium">
16926 <summary> 14975 <summary></summary>
16927 </summary>
16928 </member> 14976 </member>
16929 <member name="F:OpenMetaverse.Simulator.Access"> 14977 <member name="F:OpenMetaverse.Shininess.High">
16930 <summary> 14978 <summary></summary>
16931 </summary>
16932 </member> 14979 </member>
16933 <member name="F:OpenMetaverse.Simulator.BillableFactor"> 14980 <member name="T:OpenMetaverse.MappingType">
16934 <summary> 14981 <summary>
14982 The texture mapping style used for a face
16935 </summary> 14983 </summary>
16936 </member> 14984 </member>
16937 <member name="F:OpenMetaverse.Simulator.Stats"> 14985 <member name="F:OpenMetaverse.MappingType.Default">
16938 <summary>Statistics information for this simulator and the 14986 <summary></summary>
16939 connection to the simulator, calculated by the simulator itself
16940 and the library</summary>
16941 </member>
16942 <member name="F:OpenMetaverse.Simulator.RegionID">
16943 <summary>The regions Unique ID</summary>
16944 </member>
16945 <member name="F:OpenMetaverse.Simulator.ColoLocation">
16946 <summary>The physical data center the simulator is located</summary>
16947 <remarks>Known values are:
16948 <list type="table"><item>Dallas</item><item>Chandler</item><item>SF</item></list></remarks>
16949 </member>
16950 <member name="F:OpenMetaverse.Simulator.CPUClass">
16951 <summary>The CPU Class of the simulator</summary>
16952 <remarks>Most full mainland/estate sims appear to be 5,
16953 Homesteads and Openspace appear to be 501</remarks>
16954 </member>
16955 <member name="F:OpenMetaverse.Simulator.CPURatio">
16956 <summary>The number of regions sharing the same CPU as this one</summary>
16957 <remarks>"Full Sims" appear to be 1, Homesteads appear to be 4</remarks>
16958 </member>
16959 <member name="F:OpenMetaverse.Simulator.ProductName">
16960 <summary>The billing product name</summary>
16961 <remarks>Known values are:
16962 <list type="table"><item>Mainland / Full Region (Sku: 023)</item><item>Estate / Full Region (Sku: 024)</item><item>Estate / Openspace (Sku: 027)</item><item>Estate / Homestead (Sku: 029)</item><item>Mainland / Homestead (Sku: 129) (Linden Owned)</item><item>Mainland / Linden Homes (Sku: 131)</item></list></remarks>
16963 </member>
16964 <member name="F:OpenMetaverse.Simulator.ProductSku">
16965 <summary>The billing product SKU</summary>
16966 <remarks>Known values are:
16967 <list type="table"><item>023 Mainland / Full Region</item><item>024 Estate / Full Region</item><item>027 Estate / Openspace</item><item>029 Estate / Homestead</item><item>129 Mainland / Homestead (Linden Owned)</item><item>131 Linden Homes / Full Region</item></list></remarks>
16968 </member>
16969 <member name="F:OpenMetaverse.Simulator.Sequence">
16970 <summary>The current sequence number for packets sent to this
16971 simulator. Must be Interlocked before modifying. Only
16972 useful for applications manipulating sequence numbers</summary>
16973 </member> 14987 </member>
16974 <member name="F:OpenMetaverse.Simulator.ObjectsAvatars"> 14988 <member name="F:OpenMetaverse.MappingType.Planar">
16975 <summary> 14989 <summary></summary>
16976 A thread-safe dictionary containing avatars in a simulator
16977 </summary>
16978 </member> 14990 </member>
16979 <member name="F:OpenMetaverse.Simulator.ObjectsPrimitives"> 14991 <member name="F:OpenMetaverse.MappingType.Spherical">
16980 <summary> 14992 <summary></summary>
16981 A thread-safe dictionary containing primitives in a simulator
16982 </summary>
16983 </member> 14993 </member>
16984 <member name="F:OpenMetaverse.Simulator.Parcels"> 14994 <member name="F:OpenMetaverse.MappingType.Cylindrical">
16985 <summary> 14995 <summary></summary>
16986 Provides access to an internal thread-safe dictionary containing parcel
16987 information found in this simulator
16988 </summary>
16989 </member> 14996 </member>
16990 <member name="F:OpenMetaverse.Simulator.AgentMovementComplete"> 14997 <member name="T:OpenMetaverse.TextureAttributes">
16991 <summary> 14998 <summary>
16992 Is it safe to send agent updates to this sim 14999 Flags in the TextureEntry block that describe which properties are
16993 AgentMovementComplete message received 15000 set
16994 </summary> 15001 </summary>
16995 </member> 15002 </member>
16996 <member name="F:OpenMetaverse.Simulator.DisconnectCandidate"> 15003 <member name="F:OpenMetaverse.TextureAttributes.None">
16997 <summary>Used internally to track sim disconnections</summary> 15004 <summary></summary>
16998 </member>
16999 <member name="F:OpenMetaverse.Simulator.ConnectedEvent">
17000 <summary>Event that is triggered when the simulator successfully
17001 establishes a connection</summary>
17002 </member>
17003 <member name="F:OpenMetaverse.Simulator.connected">
17004 <summary>Whether this sim is currently connected or not. Hooked up
17005 to the property Connected</summary>
17006 </member>
17007 <member name="F:OpenMetaverse.Simulator.avatarPositions">
17008 <summary>Coarse locations of avatars in this simulator</summary>
17009 </member>
17010 <member name="F:OpenMetaverse.Simulator.preyID">
17011 <summary>AvatarPositions key representing TrackAgent target</summary>
17012 </member> 15005 </member>
17013 <member name="F:OpenMetaverse.Simulator.PacketArchive"> 15006 <member name="F:OpenMetaverse.TextureAttributes.TextureID">
17014 <summary>Sequence numbers of packets we've received 15007 <summary></summary>
17015 (for duplicate checking)</summary>
17016 </member> 15008 </member>
17017 <member name="F:OpenMetaverse.Simulator.NeedAck"> 15009 <member name="F:OpenMetaverse.TextureAttributes.RGBA">
17018 <summary>Packets we sent out that need ACKs from the simulator</summary> 15010 <summary></summary>
17019 </member> 15011 </member>
17020 <member name="F:OpenMetaverse.Simulator.pauseSerial"> 15012 <member name="F:OpenMetaverse.TextureAttributes.RepeatU">
17021 <summary>Sequence number for pause/resume</summary> 15013 <summary></summary>
17022 </member> 15014 </member>
17023 <member name="F:OpenMetaverse.Simulator.handshakeComplete"> 15015 <member name="F:OpenMetaverse.TextureAttributes.RepeatV">
17024 <summary>Indicates if UDP connection to the sim is fully established</summary> 15016 <summary></summary>
17025 </member> 15017 </member>
17026 <member name="P:OpenMetaverse.Simulator.ParcelMap"> 15018 <member name="F:OpenMetaverse.TextureAttributes.OffsetU">
17027 <summary> 15019 <summary></summary>
17028 Provides access to an internal thread-safe multidimensional array containing a x,y grid mapped
17029 to each 64x64 parcel's LocalID.
17030 </summary>
17031 </member> 15020 </member>
17032 <member name="P:OpenMetaverse.Simulator.IPEndPoint"> 15021 <member name="F:OpenMetaverse.TextureAttributes.OffsetV">
17033 <summary>The IP address and port of the server</summary> 15022 <summary></summary>
17034 </member> 15023 </member>
17035 <member name="P:OpenMetaverse.Simulator.Connected"> 15024 <member name="F:OpenMetaverse.TextureAttributes.Rotation">
17036 <summary>Whether there is a working connection to the simulator or 15025 <summary></summary>
17037 not</summary>
17038 </member> 15026 </member>
17039 <member name="P:OpenMetaverse.Simulator.AvatarPositions"> 15027 <member name="F:OpenMetaverse.TextureAttributes.Material">
17040 <summary>Coarse locations of avatars in this simulator</summary> 15028 <summary></summary>
17041 </member> 15029 </member>
17042 <member name="P:OpenMetaverse.Simulator.PreyID"> 15030 <member name="F:OpenMetaverse.TextureAttributes.Media">
17043 <summary>AvatarPositions key representing TrackAgent target</summary> 15031 <summary></summary>
17044 </member> 15032 </member>
17045 <member name="P:OpenMetaverse.Simulator.HandshakeComplete"> 15033 <member name="F:OpenMetaverse.TextureAttributes.Glow">
17046 <summary>Indicates if UDP connection to the sim is fully established</summary> 15034 <summary></summary>
17047 </member> 15035 </member>
17048 <member name="M:OpenMetaverse.Simulator.IsParcelMapFull"> 15036 <member name="F:OpenMetaverse.TextureAttributes.MaterialID">
17049 <summary> 15037 <summary></summary>
17050 Checks simulator parcel map to make sure it has downloaded all data successfully
17051 </summary>
17052 <returns>true if map is full (contains no 0's)</returns>
17053 </member> 15038 </member>
17054 <member name="M:OpenMetaverse.Simulator.Dispose"> 15039 <member name="F:OpenMetaverse.TextureAttributes.All">
17055 <summary> 15040 <summary></summary>
17056 Called when this Simulator object is being destroyed
17057 </summary>
17058 </member> 15041 </member>
17059 <member name="M:OpenMetaverse.Simulator.Connect(System.Boolean)"> 15042 <member name="T:OpenMetaverse.BitPack">
17060 <summary> 15043 <summary>
17061 Attempt to connect to this simulator 15044 Wrapper around a byte array that allows bit to be packed and unpacked
15045 one at a time or by a variable amount. Useful for very tightly packed
15046 data like LayerData packets
17062 </summary> 15047 </summary>
17063 <param name="moveToSim">Whether to move our agent in to this sim or not</param>
17064 <returns>True if the connection succeeded or connection status is
17065 unknown, false if there was a failure</returns>
17066 </member> 15048 </member>
17067 <member name="M:OpenMetaverse.Simulator.UseCircuitCode(System.Boolean)"> 15049 <member name="F:OpenMetaverse.BitPack.Data">
17068 <summary> 15050 <summary></summary>
17069 Initiates connection to the simulator
17070 </summary>
17071 <param name="waitForAck">Should we block until ack for this packet is recieved</param>
17072 </member> 15051 </member>
17073 <member name="M:OpenMetaverse.Simulator.Disconnect(System.Boolean)"> 15052 <member name="M:OpenMetaverse.BitPack.#ctor(System.Byte[],System.Int32)">
17074 <summary> 15053 <summary>
17075 Disconnect from this simulator 15054 Default constructor, initialize the bit packer / bit unpacker
15055 with a byte array and starting position
17076 </summary> 15056 </summary>
15057 <param name="data">Byte array to pack bits in to or unpack from</param>
15058 <param name="pos">Starting position in the byte array</param>
17077 </member> 15059 </member>
17078 <member name="M:OpenMetaverse.Simulator.Pause"> 15060 <member name="M:OpenMetaverse.BitPack.PackFloat(System.Single)">
17079 <summary> 15061 <summary>
17080 Instructs the simulator to stop sending update (and possibly other) packets 15062 Pack a floating point value in to the data
17081 </summary> 15063 </summary>
15064 <param name="data">Floating point value to pack</param>
17082 </member> 15065 </member>
17083 <member name="M:OpenMetaverse.Simulator.Resume"> 15066 <member name="M:OpenMetaverse.BitPack.PackBits(System.Int32,System.Int32)">
17084 <summary> 15067 <summary>
17085 Instructs the simulator to resume sending update packets (unpause) 15068 Pack part or all of an integer in to the data
17086 </summary> 15069 </summary>
15070 <param name="data">Integer containing the data to pack</param>
15071 <param name="totalCount">Number of bits of the integer to pack</param>
17087 </member> 15072 </member>
17088 <member name="M:OpenMetaverse.Simulator.TerrainHeightAtPoint(System.Int32,System.Int32,System.Single@)"> 15073 <member name="M:OpenMetaverse.BitPack.PackBits(System.UInt32,System.Int32)">
17089 <summary> 15074 <summary>
17090 Retrieve the terrain height at a given coordinate 15075 Pack part or all of an unsigned integer in to the data
17091 </summary> 15076 </summary>
17092 <param name="x">Sim X coordinate, valid range is from 0 to 255</param> 15077 <param name="data">Unsigned integer containing the data to pack</param>
17093 <param name="y">Sim Y coordinate, valid range is from 0 to 255</param> 15078 <param name="totalCount">Number of bits of the integer to pack</param>
17094 <param name="height">The terrain height at the given point if the
17095 lookup was successful, otherwise 0.0f</param>
17096 <returns>True if the lookup was successful, otherwise false</returns>
17097 </member> 15079 </member>
17098 <member name="M:OpenMetaverse.Simulator.SendPacket(OpenMetaverse.Packets.Packet)"> 15080 <member name="M:OpenMetaverse.BitPack.PackBit(System.Boolean)">
17099 <summary> 15081 <summary>
17100 Sends a packet 15082 Pack a single bit in to the data
17101 </summary> 15083 </summary>
17102 <param name="packet">Packet to be sent</param> 15084 <param name="bit">Bit to pack</param>
17103 </member> 15085 </member>
17104 <member name="M:OpenMetaverse.Simulator.SendPing"> 15086 <member name="M:OpenMetaverse.BitPack.PackFixed(System.Single,System.Boolean,System.Int32,System.Int32)">
17105 <summary> 15087 <summary>
15088
17106 </summary> 15089 </summary>
15090 <param name="data"></param>
15091 <param name="isSigned"></param>
15092 <param name="intBits"></param>
15093 <param name="fracBits"></param>
17107 </member> 15094 </member>
17108 <member name="M:OpenMetaverse.Simulator.ToString"> 15095 <member name="M:OpenMetaverse.BitPack.PackUUID(OpenMetaverse.UUID)">
17109 <summary> 15096 <summary>
17110 Returns Simulator Name as a String 15097
17111 </summary> 15098 </summary>
17112 <returns> 15099 <param name="data"></param>
17113 </returns>
17114 </member> 15100 </member>
17115 <member name="M:OpenMetaverse.Simulator.GetHashCode"> 15101 <member name="M:OpenMetaverse.BitPack.PackColor(OpenMetaverse.Color4)">
17116 <summary> 15102 <summary>
15103
17117 </summary> 15104 </summary>
17118 <returns> 15105 <param name="data"></param>
17119 </returns>
17120 </member> 15106 </member>
17121 <member name="M:OpenMetaverse.Simulator.Equals(System.Object)"> 15107 <member name="M:OpenMetaverse.BitPack.UnpackFloat">
17122 <summary> 15108 <summary>
15109 Unpacking a floating point value from the data
17123 </summary> 15110 </summary>
17124 <param name="obj"> 15111 <returns>Unpacked floating point value</returns>
17125 </param>
17126 <returns>
17127 </returns>
17128 </member> 15112 </member>
17129 <member name="M:OpenMetaverse.Simulator.SendAcks"> 15113 <member name="M:OpenMetaverse.BitPack.UnpackBits(System.Int32)">
17130 <summary> 15114 <summary>
17131 Sends out pending acknowledgements 15115 Unpack a variable number of bits from the data in to integer format
17132 </summary> 15116 </summary>
17133 <returns>Number of ACKs sent</returns> 15117 <param name="totalCount">Number of bits to unpack</param>
15118 <returns>An integer containing the unpacked bits</returns>
15119 <remarks>This function is only useful up to 32 bits</remarks>
17134 </member> 15120 </member>
17135 <member name="M:OpenMetaverse.Simulator.ResendUnacked"> 15121 <member name="M:OpenMetaverse.BitPack.UnpackUBits(System.Int32)">
17136 <summary> 15122 <summary>
17137 Resend unacknowledged packets 15123 Unpack a variable number of bits from the data in to unsigned
15124 integer format
17138 </summary> 15125 </summary>
15126 <param name="totalCount">Number of bits to unpack</param>
15127 <returns>An unsigned integer containing the unpacked bits</returns>
15128 <remarks>This function is only useful up to 32 bits</remarks>
17139 </member> 15129 </member>
17140 <member name="T:OpenMetaverse.SoundManager"> 15130 <member name="M:OpenMetaverse.BitPack.UnpackShort">
17141 <summary> 15131 <summary>
15132 Unpack a 16-bit signed integer
17142 </summary> 15133 </summary>
15134 <returns>16-bit signed integer</returns>
17143 </member> 15135 </member>
17144 <member name="M:OpenMetaverse.SoundManager.#ctor(OpenMetaverse.GridClient)"> 15136 <member name="M:OpenMetaverse.BitPack.UnpackUShort">
17145 <summary> 15137 <summary>
17146 Construct a new instance of the SoundManager class, used for playing and receiving 15138 Unpack a 16-bit unsigned integer
17147 sound assets
17148 </summary> 15139 </summary>
17149 <param name="client">A reference to the current GridClient instance</param> 15140 <returns>16-bit unsigned integer</returns>
17150 </member>
17151 <member name="F:OpenMetaverse.SoundManager.m_AttachedSound">
17152 <summary>The event subscribers, null of no subscribers</summary>
17153 </member>
17154 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundLock">
17155 <summary>Thread sync lock object</summary>
17156 </member>
17157 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundGainChange">
17158 <summary>The event subscribers, null of no subscribers</summary>
17159 </member>
17160 <member name="F:OpenMetaverse.SoundManager.m_AttachedSoundGainChangeLock">
17161 <summary>Thread sync lock object</summary>
17162 </member>
17163 <member name="F:OpenMetaverse.SoundManager.m_SoundTrigger">
17164 <summary>The event subscribers, null of no subscribers</summary>
17165 </member>
17166 <member name="F:OpenMetaverse.SoundManager.m_SoundTriggerLock">
17167 <summary>Thread sync lock object</summary>
17168 </member>
17169 <member name="F:OpenMetaverse.SoundManager.m_PreloadSound">
17170 <summary>The event subscribers, null of no subscribers</summary>
17171 </member>
17172 <member name="F:OpenMetaverse.SoundManager.m_PreloadSoundLock">
17173 <summary>Thread sync lock object</summary>
17174 </member>
17175 <member name="E:OpenMetaverse.SoundManager.AttachedSound">
17176 <summary>Raised when the simulator sends us data containing
17177 sound</summary>
17178 </member>
17179 <member name="E:OpenMetaverse.SoundManager.AttachedSoundGainChange">
17180 <summary>Raised when the simulator sends us data containing
17181 ...</summary>
17182 </member>
17183 <member name="E:OpenMetaverse.SoundManager.SoundTrigger">
17184 <summary>Raised when the simulator sends us data containing
17185 ...</summary>
17186 </member>
17187 <member name="E:OpenMetaverse.SoundManager.PreloadSound">
17188 <summary>Raised when the simulator sends us data containing
17189 ...</summary>
17190 </member>
17191 <member name="M:OpenMetaverse.SoundManager.OnAttachedSound(OpenMetaverse.AttachedSoundEventArgs)">
17192 <summary>Raises the AttachedSound Event</summary>
17193 <param name="e">A AttachedSoundEventArgs object containing
17194 the data sent from the simulator</param>
17195 </member>
17196 <member name="M:OpenMetaverse.SoundManager.OnAttachedSoundGainChange(OpenMetaverse.AttachedSoundGainChangeEventArgs)">
17197 <summary>Raises the AttachedSoundGainChange Event</summary>
17198 <param name="e">A AttachedSoundGainChangeEventArgs object containing
17199 the data sent from the simulator</param>
17200 </member>
17201 <member name="M:OpenMetaverse.SoundManager.OnSoundTrigger(OpenMetaverse.SoundTriggerEventArgs)">
17202 <summary>Raises the SoundTrigger Event</summary>
17203 <param name="e">A SoundTriggerEventArgs object containing
17204 the data sent from the simulator</param>
17205 </member>
17206 <member name="M:OpenMetaverse.SoundManager.OnPreloadSound(OpenMetaverse.PreloadSoundEventArgs)">
17207 <summary>Raises the PreloadSound Event</summary>
17208 <param name="e">A PreloadSoundEventArgs object containing
17209 the data sent from the simulator</param>
17210 </member> 15141 </member>
17211 <member name="M:OpenMetaverse.SoundManager.PlaySound(OpenMetaverse.UUID)"> 15142 <member name="M:OpenMetaverse.BitPack.UnpackInt">
17212 <summary> 15143 <summary>
17213 Plays a sound in the current region at full volume from avatar position 15144 Unpack a 32-bit signed integer
17214 </summary> 15145 </summary>
17215 <param name="soundID">UUID of the sound to be played</param> 15146 <returns>32-bit signed integer</returns>
17216 </member> 15147 </member>
17217 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Vector3)"> 15148 <member name="M:OpenMetaverse.BitPack.UnpackUInt">
17218 <summary> 15149 <summary>
17219 Plays a sound in the current region at full volume 15150 Unpack a 32-bit unsigned integer
17220 </summary> 15151 </summary>
17221 <param name="soundID">UUID of the sound to be played.</param> 15152 <returns>32-bit unsigned integer</returns>
17222 <param name="position">position for the sound to be played at. Normally the avatar.</param>
17223 </member> 15153 </member>
17224 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Vector3,System.Single)"> 15154 <member name="P:OpenMetaverse.BitPack.BytePos">
17225 <summary> 15155 <summary></summary>
17226 Plays a sound in the current region
17227 </summary>
17228 <param name="soundID">UUID of the sound to be played.</param>
17229 <param name="position">position for the sound to be played at. Normally the avatar.</param>
17230 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
17231 </member> 15156 </member>
17232 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,OpenMetaverse.Simulator,OpenMetaverse.Vector3,System.Single)"> 15157 <member name="P:OpenMetaverse.BitPack.BitPos">
17233 <summary> 15158 <summary></summary>
17234 Plays a sound in the specified sim
17235 </summary>
17236 <param name="soundID">UUID of the sound to be played.</param>
17237 <param name="sim">UUID of the sound to be played.</param>
17238 <param name="position">position for the sound to be played at. Normally the avatar.</param>
17239 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
17240 </member> 15159 </member>
17241 <member name="M:OpenMetaverse.SoundManager.SendSoundTrigger(OpenMetaverse.UUID,System.UInt64,OpenMetaverse.Vector3,System.Single)"> 15160 <member name="T:OpenMetaverse.ScriptPermission">
17242 <summary> 15161 <summary>
17243 Play a sound asset 15162 Permission request flags, asked when a script wants to control an Avatar
17244 </summary> 15163 </summary>
17245 <param name="soundID">UUID of the sound to be played.</param>
17246 <param name="handle">handle id for the sim to be played in.</param>
17247 <param name="position">position for the sound to be played at. Normally the avatar.</param>
17248 <param name="gain">volume of the sound, from 0.0 to 1.0</param>
17249 </member> 15164 </member>
17250 <member name="M:OpenMetaverse.SoundManager.AttachedSoundHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15165 <member name="F:OpenMetaverse.ScriptPermission.None">
17251 <summary>Process an incoming packet and raise the appropriate events</summary> 15166 <summary>Placeholder for empty values, shouldn't ever see this</summary>
17252 <param name="sender">The sender</param>
17253 <param name="e">The EventArgs object containing the packet data</param>
17254 </member> 15167 </member>
17255 <member name="M:OpenMetaverse.SoundManager.AttachedSoundGainChangeHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15168 <member name="F:OpenMetaverse.ScriptPermission.Debit">
17256 <summary>Process an incoming packet and raise the appropriate events</summary> 15169 <summary>Script wants ability to take money from you</summary>
17257 <param name="sender">The sender</param>
17258 <param name="e">The EventArgs object containing the packet data</param>
17259 </member> 15170 </member>
17260 <member name="M:OpenMetaverse.SoundManager.PreloadSoundHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15171 <member name="F:OpenMetaverse.ScriptPermission.TakeControls">
17261 <summary>Process an incoming packet and raise the appropriate events</summary> 15172 <summary>Script wants to take camera controls for you</summary>
17262 <param name="sender">The sender</param>
17263 <param name="e">The EventArgs object containing the packet data</param>
17264 </member> 15173 </member>
17265 <member name="M:OpenMetaverse.SoundManager.SoundTriggerHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15174 <member name="F:OpenMetaverse.ScriptPermission.RemapControls">
17266 <summary>Process an incoming packet and raise the appropriate events</summary> 15175 <summary>Script wants to remap avatars controls</summary>
17267 <param name="sender">The sender</param>
17268 <param name="e">The EventArgs object containing the packet data</param>
17269 </member> 15176 </member>
17270 <member name="T:OpenMetaverse.AttachedSoundEventArgs"> 15177 <member name="F:OpenMetaverse.ScriptPermission.TriggerAnimation">
17271 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.AttachedSound" /> event</summary> 15178 <summary>Script wants to trigger avatar animations</summary>
17272 <remarks>The <see cref="E:OpenMetaverse.SoundManager.AttachedSound" /> event occurs when the simulator sends 15179 <remarks>This function is not implemented on the grid</remarks>
17273 the sound data which emits from an agents attachment</remarks>
17274 <example>
17275 The following code example shows the process to subscribe to the <see cref="E:OpenMetaverse.SoundManager.AttachedSound" /> event
17276 and a stub to handle the data passed from the simulator
17277 <code>
17278 // Subscribe to the AttachedSound event
17279 Client.Sound.AttachedSound += Sound_AttachedSound;
17280 // process the data raised in the event here
17281 private void Sound_AttachedSound(object sender, AttachedSoundEventArgs e)
17282 {
17283 // ... Process AttachedSoundEventArgs here ...
17284 }
17285 </code></example>
17286 </member> 15180 </member>
17287 <member name="M:OpenMetaverse.AttachedSoundEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,OpenMetaverse.SoundFlags)"> 15181 <member name="F:OpenMetaverse.ScriptPermission.Attach">
17288 <summary> 15182 <summary>Script wants to attach or detach the prim or primset to your avatar</summary>
17289 Construct a new instance of the SoundTriggerEventArgs class
17290 </summary>
17291 <param name="sim">Simulator where the event originated</param>
17292 <param name="soundID">The sound asset id</param>
17293 <param name="ownerID">The ID of the owner</param>
17294 <param name="objectID">The ID of the object</param>
17295 <param name="gain">The volume level</param>
17296 <param name="flags">The <see cref="T:OpenMetaverse.SoundFlags" /></param>
17297 </member> 15183 </member>
17298 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Simulator"> 15184 <member name="F:OpenMetaverse.ScriptPermission.ReleaseOwnership">
17299 <summary>Simulator where the event originated</summary> 15185 <summary>Script wants permission to release ownership</summary>
15186 <remarks>This function is not implemented on the grid
15187 The concept of "public" objects does not exist anymore.</remarks>
17300 </member> 15188 </member>
17301 <member name="P:OpenMetaverse.AttachedSoundEventArgs.SoundID"> 15189 <member name="F:OpenMetaverse.ScriptPermission.ChangeLinks">
17302 <summary>Get the sound asset id</summary> 15190 <summary>Script wants ability to link/delink with other prims</summary>
17303 </member> 15191 </member>
17304 <member name="P:OpenMetaverse.AttachedSoundEventArgs.OwnerID"> 15192 <member name="F:OpenMetaverse.ScriptPermission.ChangeJoints">
17305 <summary>Get the ID of the owner</summary> 15193 <summary>Script wants permission to change joints</summary>
15194 <remarks>This function is not implemented on the grid</remarks>
17306 </member> 15195 </member>
17307 <member name="P:OpenMetaverse.AttachedSoundEventArgs.ObjectID"> 15196 <member name="F:OpenMetaverse.ScriptPermission.ChangePermissions">
17308 <summary>Get the ID of the Object</summary> 15197 <summary>Script wants permissions to change permissions</summary>
15198 <remarks>This function is not implemented on the grid</remarks>
17309 </member> 15199 </member>
17310 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Gain"> 15200 <member name="F:OpenMetaverse.ScriptPermission.TrackCamera">
17311 <summary>Get the volume level</summary> 15201 <summary>Script wants to track avatars camera position and rotation </summary>
17312 </member> 15202 </member>
17313 <member name="P:OpenMetaverse.AttachedSoundEventArgs.Flags"> 15203 <member name="F:OpenMetaverse.ScriptPermission.ControlCamera">
17314 <summary>Get the <see cref="T:OpenMetaverse.SoundFlags" /></summary> 15204 <summary>Script wants to control your camera</summary>
17315 </member> 15205 </member>
17316 <member name="T:OpenMetaverse.AttachedSoundGainChangeEventArgs"> 15206 <member name="F:OpenMetaverse.ScriptPermission.Teleport">
17317 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.AttachedSoundGainChange" /> event</summary> 15207 <summary>Script wants the ability to teleport you</summary>
17318 <remarks>The <see cref="E:OpenMetaverse.SoundManager.AttachedSoundGainChange" /> event occurs when an attached sound
17319 changes its volume level</remarks>
17320 </member> 15208 </member>
17321 <member name="M:OpenMetaverse.AttachedSoundGainChangeEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Single)"> 15209 <member name="T:OpenMetaverse.InstantMessageDialog">
17322 <summary> 15210 <summary>
17323 Construct a new instance of the AttachedSoundGainChangedEventArgs class 15211 Special commands used in Instant Messages
17324 </summary> 15212 </summary>
17325 <param name="sim">Simulator where the event originated</param>
17326 <param name="objectID">The ID of the Object</param>
17327 <param name="gain">The new volume level</param>
17328 </member> 15213 </member>
17329 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.Simulator"> 15214 <member name="F:OpenMetaverse.InstantMessageDialog.MessageFromAgent">
17330 <summary>Simulator where the event originated</summary> 15215 <summary>Indicates a regular IM from another agent</summary>
17331 </member> 15216 </member>
17332 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.ObjectID"> 15217 <member name="F:OpenMetaverse.InstantMessageDialog.MessageBox">
17333 <summary>Get the ID of the Object</summary> 15218 <summary>Simple notification box with an OK button</summary>
17334 </member> 15219 </member>
17335 <member name="P:OpenMetaverse.AttachedSoundGainChangeEventArgs.Gain"> 15220 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitation">
17336 <summary>Get the volume level</summary> 15221 <summary>You've been invited to join a group.</summary>
17337 </member> 15222 </member>
17338 <member name="T:OpenMetaverse.SoundTriggerEventArgs"> 15223 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryOffered">
17339 <summary>Provides data for the <see cref="E:OpenMetaverse.SoundManager.SoundTrigger" /> event</summary> 15224 <summary>Inventory offer</summary>
17340 <remarks>
17341 <para>The <see cref="E:OpenMetaverse.SoundManager.SoundTrigger" /> event occurs when the simulator forwards
17342 a request made by yourself or another agent to play either an asset sound or a built in sound</para>
17343 <para>Requests to play sounds where the <see cref="P:OpenMetaverse.SoundTriggerEventArgs.SoundID" /> is not one of the built-in
17344 <see cref="T:OpenMetaverse.Sounds" /> will require sending a request to download the sound asset before it can be played</para>
17345 </remarks>
17346 <example>
17347 The following code example uses the <see cref="P:OpenMetaverse.SoundTriggerEventArgs.OwnerID" />, <see cref="P:OpenMetaverse.SoundTriggerEventArgs.SoundID" />
17348 and <see cref="P:OpenMetaverse.SoundTriggerEventArgs.Gain" />
17349 properties to display some information on a sound request on the <see cref="T:System.Console" /> window.
17350 <code>
17351 // subscribe to the event
17352 Client.Sound.SoundTrigger += Sound_SoundTrigger;
17353 // play the pre-defined BELL_TING sound
17354 Client.Sound.SendSoundTrigger(Sounds.BELL_TING);
17355 // handle the response data
17356 private void Sound_SoundTrigger(object sender, SoundTriggerEventArgs e)
17357 {
17358 Console.WriteLine("{0} played the sound {1} at volume {2}",
17359 e.OwnerID, e.SoundID, e.Gain);
17360 }
17361 </code></example>
17362 </member> 15225 </member>
17363 <member name="M:OpenMetaverse.SoundTriggerEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,System.UInt64,OpenMetaverse.Vector3)"> 15226 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryAccepted">
17364 <summary> 15227 <summary>Accepted inventory offer</summary>
17365 Construct a new instance of the SoundTriggerEventArgs class
17366 </summary>
17367 <param name="sim">Simulator where the event originated</param>
17368 <param name="soundID">The sound asset id</param>
17369 <param name="ownerID">The ID of the owner</param>
17370 <param name="objectID">The ID of the object</param>
17371 <param name="parentID">The ID of the objects parent</param>
17372 <param name="gain">The volume level</param>
17373 <param name="regionHandle">The regionhandle</param>
17374 <param name="position">The source position</param>
17375 </member> 15228 </member>
17376 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Simulator"> 15229 <member name="F:OpenMetaverse.InstantMessageDialog.InventoryDeclined">
17377 <summary>Simulator where the event originated</summary> 15230 <summary>Declined inventory offer</summary>
17378 </member> 15231 </member>
17379 <member name="P:OpenMetaverse.SoundTriggerEventArgs.SoundID"> 15232 <member name="F:OpenMetaverse.InstantMessageDialog.GroupVote">
17380 <summary>Get the sound asset id</summary> 15233 <summary>Group vote</summary>
17381 </member> 15234 </member>
17382 <member name="P:OpenMetaverse.SoundTriggerEventArgs.OwnerID"> 15235 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryOffered">
17383 <summary>Get the ID of the owner</summary> 15236 <summary>An object is offering its inventory</summary>
17384 </member> 15237 </member>
17385 <member name="P:OpenMetaverse.SoundTriggerEventArgs.ObjectID"> 15238 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryAccepted">
17386 <summary>Get the ID of the Object</summary> 15239 <summary>Accept an inventory offer from an object</summary>
17387 </member> 15240 </member>
17388 <member name="P:OpenMetaverse.SoundTriggerEventArgs.ParentID"> 15241 <member name="F:OpenMetaverse.InstantMessageDialog.TaskInventoryDeclined">
17389 <summary>Get the ID of the objects parent</summary> 15242 <summary>Decline an inventory offer from an object</summary>
17390 </member> 15243 </member>
17391 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Gain"> 15244 <member name="F:OpenMetaverse.InstantMessageDialog.NewUserDefault">
17392 <summary>Get the volume level</summary> 15245 <summary>Unknown</summary>
17393 </member> 15246 </member>
17394 <member name="P:OpenMetaverse.SoundTriggerEventArgs.RegionHandle"> 15247 <member name="F:OpenMetaverse.InstantMessageDialog.SessionAdd">
17395 <summary>Get the regionhandle</summary> 15248 <summary>Start a session, or add users to a session</summary>
17396 </member> 15249 </member>
17397 <member name="P:OpenMetaverse.SoundTriggerEventArgs.Position"> 15250 <member name="F:OpenMetaverse.InstantMessageDialog.SessionOfflineAdd">
17398 <summary>Get the source position</summary> 15251 <summary>Start a session, but don't prune offline users</summary>
17399 </member> 15252 </member>
17400 <member name="T:OpenMetaverse.PreloadSoundEventArgs"> 15253 <member name="F:OpenMetaverse.InstantMessageDialog.SessionGroupStart">
17401 <summary>Provides data for the <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance" /> event</summary> 15254 <summary>Start a session with your group</summary>
17402 <remarks>The <see cref="E:OpenMetaverse.AvatarManager.AvatarAppearance" /> event occurs when the simulator sends
17403 the appearance data for an avatar</remarks>
17404 <example>
17405 The following code example uses the <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.AvatarID" /> and <see cref="P:OpenMetaverse.AvatarAppearanceEventArgs.VisualParams" />
17406 properties to display the selected shape of an avatar on the <see cref="T:System.Console" /> window.
17407 <code>
17408 // subscribe to the event
17409 Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance;
17410 // handle the data when the event is raised
17411 void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e)
17412 {
17413 Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] &gt; 0) : "male" ? "female")
17414 }
17415 </code></example>
17416 </member> 15255 </member>
17417 <member name="M:OpenMetaverse.PreloadSoundEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)"> 15256 <member name="F:OpenMetaverse.InstantMessageDialog.SessionCardlessStart">
17418 <summary> 15257 <summary>Start a session without a calling card (finder or objects)</summary>
17419 Construct a new instance of the PreloadSoundEventArgs class
17420 </summary>
17421 <param name="sim">Simulator where the event originated</param>
17422 <param name="soundID">The sound asset id</param>
17423 <param name="ownerID">The ID of the owner</param>
17424 <param name="objectID">The ID of the object</param>
17425 </member> 15258 </member>
17426 <member name="P:OpenMetaverse.PreloadSoundEventArgs.Simulator"> 15259 <member name="F:OpenMetaverse.InstantMessageDialog.SessionSend">
17427 <summary>Simulator where the event originated</summary> 15260 <summary>Send a message to a session</summary>
17428 </member> 15261 </member>
17429 <member name="P:OpenMetaverse.PreloadSoundEventArgs.SoundID"> 15262 <member name="F:OpenMetaverse.InstantMessageDialog.SessionDrop">
17430 <summary>Get the sound asset id</summary> 15263 <summary>Leave a session</summary>
17431 </member> 15264 </member>
17432 <member name="P:OpenMetaverse.PreloadSoundEventArgs.OwnerID"> 15265 <member name="F:OpenMetaverse.InstantMessageDialog.MessageFromObject">
17433 <summary>Get the ID of the owner</summary> 15266 <summary>Indicates that the IM is from an object</summary>
17434 </member> 15267 </member>
17435 <member name="P:OpenMetaverse.PreloadSoundEventArgs.ObjectID"> 15268 <member name="F:OpenMetaverse.InstantMessageDialog.BusyAutoResponse">
17436 <summary>Get the ID of the Object</summary> 15269 <summary>Sent an IM to a busy user, this is the auto response</summary>
17437 </member> 15270 </member>
17438 <member name="T:OpenMetaverse.Sounds"> 15271 <member name="F:OpenMetaverse.InstantMessageDialog.ConsoleAndChatHistory">
17439 <summary> 15272 <summary>Shows the message in the console and chat history</summary>
17440 pre-defined built in sounds
17441 </summary>
17442 </member> 15273 </member>
17443 <member name="F:OpenMetaverse.Sounds.BELL_TING"> 15274 <member name="F:OpenMetaverse.InstantMessageDialog.RequestTeleport">
17444 <summary> 15275 <summary>Send a teleport lure</summary>
17445 </summary>
17446 </member> 15276 </member>
17447 <member name="F:OpenMetaverse.Sounds.CLICK"> 15277 <member name="F:OpenMetaverse.InstantMessageDialog.AcceptTeleport">
17448 <summary> 15278 <summary>Response sent to the agent which inititiated a teleport invitation</summary>
17449 </summary>
17450 </member> 15279 </member>
17451 <member name="F:OpenMetaverse.Sounds.HEALTH_REDUCTION_FEMALE"> 15280 <member name="F:OpenMetaverse.InstantMessageDialog.DenyTeleport">
17452 <summary> 15281 <summary>Response sent to the agent which inititiated a teleport invitation</summary>
17453 </summary>
17454 </member> 15282 </member>
17455 <member name="F:OpenMetaverse.Sounds.HEALTH_REDUCTION_MALE"> 15283 <member name="F:OpenMetaverse.InstantMessageDialog.GodLikeRequestTeleport">
17456 <summary> 15284 <summary>Only useful if you have Linden permissions</summary>
17457 </summary>
17458 </member> 15285 </member>
17459 <member name="F:OpenMetaverse.Sounds.IM_START"> 15286 <member name="F:OpenMetaverse.InstantMessageDialog.RequestLure">
17460 <summary> 15287 <summary>Request a teleport lure</summary>
17461 </summary>
17462 </member> 15288 </member>
17463 <member name="F:OpenMetaverse.Sounds.INSTANT_MESSAGE_NOTIFICATION"> 15289 <member name="F:OpenMetaverse.InstantMessageDialog.GotoUrl">
17464 <summary> 15290 <summary>IM to tell the user to go to an URL</summary>
17465 </summary>
17466 </member> 15291 </member>
17467 <member name="F:OpenMetaverse.Sounds.INVALID_OPERATION"> 15292 <member name="F:OpenMetaverse.InstantMessageDialog.Session911Start">
17468 <summary> 15293 <summary>IM for help</summary>
17469 </summary>
17470 </member> 15294 </member>
17471 <member name="F:OpenMetaverse.Sounds.KEYBOARD_LOOP"> 15295 <member name="F:OpenMetaverse.InstantMessageDialog.Lure911">
17472 <summary> 15296 <summary>IM sent automatically on call for help, sends a lure
17473 </summary> 15297 to each Helper reached</summary>
17474 </member> 15298 </member>
17475 <member name="F:OpenMetaverse.Sounds.MONEY_REDUCTION_COINS"> 15299 <member name="F:OpenMetaverse.InstantMessageDialog.FromTaskAsAlert">
17476 <summary>coins</summary> 15300 <summary>Like an IM but won't go to email</summary>
17477 </member> 15301 </member>
17478 <member name="F:OpenMetaverse.Sounds.MONEY_INCREASE_CASH_REGISTER_BELL"> 15302 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNotice">
17479 <summary>cash register bell</summary> 15303 <summary>IM from a group officer to all group members</summary>
17480 </member> 15304 </member>
17481 <member name="F:OpenMetaverse.Sounds.NULL_KEYSTROKE"> 15305 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeInventoryAccepted">
17482 <summary> 15306 <summary>Unknown</summary>
17483 </summary>
17484 </member> 15307 </member>
17485 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION"> 15308 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeInventoryDeclined">
17486 <summary> 15309 <summary>Unknown</summary>
17487 </summary>
17488 </member> 15310 </member>
17489 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_RUBBER"> 15311 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitationAccept">
17490 <summary>rubber</summary> 15312 <summary>Accept a group invitation</summary>
17491 </member> 15313 </member>
17492 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_PLASTIC"> 15314 <member name="F:OpenMetaverse.InstantMessageDialog.GroupInvitationDecline">
17493 <summary>plastic</summary> 15315 <summary>Decline a group invitation</summary>
17494 </member> 15316 </member>
17495 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_FLESH"> 15317 <member name="F:OpenMetaverse.InstantMessageDialog.GroupNoticeRequested">
17496 <summary>flesh</summary> 15318 <summary>Unknown</summary>
17497 </member> 15319 </member>
17498 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_WOOD_SPLINTERING"> 15320 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipOffered">
17499 <summary>wood splintering?</summary> 15321 <summary>An avatar is offering you friendship</summary>
17500 </member> 15322 </member>
17501 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_GLASS_BREAK"> 15323 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipAccepted">
17502 <summary>glass break</summary> 15324 <summary>An avatar has accepted your friendship offer</summary>
17503 </member> 15325 </member>
17504 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_METAL_CLUNK"> 15326 <member name="F:OpenMetaverse.InstantMessageDialog.FriendshipDeclined">
17505 <summary>metal clunk</summary> 15327 <summary>An avatar has declined your friendship offer</summary>
17506 </member> 15328 </member>
17507 <member name="F:OpenMetaverse.Sounds.OBJECT_CREATE_WHOOSH"> 15329 <member name="F:OpenMetaverse.InstantMessageDialog.StartTyping">
17508 <summary>whoosh</summary> 15330 <summary>Indicates that a user has started typing</summary>
17509 </member> 15331 </member>
17510 <member name="F:OpenMetaverse.Sounds.OBJECT_DELETE_SHAKE"> 15332 <member name="F:OpenMetaverse.InstantMessageDialog.StopTyping">
17511 <summary>shake</summary> 15333 <summary>Indicates that a user has stopped typing</summary>
17512 </member> 15334 </member>
17513 <member name="F:OpenMetaverse.Sounds.OBJECT_REZ"> 15335 <member name="T:OpenMetaverse.InstantMessageOnline">
17514 <summary> 15336 <summary>
15337 Flag in Instant Messages, whether the IM should be delivered to
15338 offline avatars as well
17515 </summary> 15339 </summary>
17516 </member> 15340 </member>
17517 <member name="F:OpenMetaverse.Sounds.PIE_MENU_APPEAR_DING"> 15341 <member name="F:OpenMetaverse.InstantMessageOnline.Online">
17518 <summary>ding</summary> 15342 <summary>Only deliver to online avatars</summary>
17519 </member> 15343 </member>
17520 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT"> 15344 <member name="F:OpenMetaverse.InstantMessageOnline.Offline">
17521 <summary> 15345 <summary>If the avatar is offline the message will be held until
17522 </summary> 15346 they login next, and possibly forwarded to their e-mail account</summary>
17523 </member> 15347 </member>
17524 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT1"> 15348 <member name="T:OpenMetaverse.ChatType">
17525 <summary> 15349 <summary>
15350 Conversion type to denote Chat Packet types in an easier-to-understand format
17526 </summary> 15351 </summary>
17527 </member> 15352 </member>
17528 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT2"> 15353 <member name="F:OpenMetaverse.ChatType.Whisper">
17529 <summary> 15354 <summary>Whisper (5m radius)</summary>
17530 </summary>
17531 </member> 15355 </member>
17532 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT3"> 15356 <member name="F:OpenMetaverse.ChatType.Normal">
17533 <summary> 15357 <summary>Normal chat (10/20m radius), what the official viewer typically sends</summary>
17534 </summary>
17535 </member> 15358 </member>
17536 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT4"> 15359 <member name="F:OpenMetaverse.ChatType.Shout">
17537 <summary> 15360 <summary>Shouting! (100m radius)</summary>
17538 </summary>
17539 </member> 15361 </member>
17540 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT5"> 15362 <member name="F:OpenMetaverse.ChatType.StartTyping">
17541 <summary> 15363 <summary>Event message when an Avatar has begun to type</summary>
17542 </summary>
17543 </member> 15364 </member>
17544 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT6"> 15365 <member name="F:OpenMetaverse.ChatType.StopTyping">
17545 <summary> 15366 <summary>Event message when an Avatar has stopped typing</summary>
17546 </summary>
17547 </member> 15367 </member>
17548 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT7"> 15368 <member name="F:OpenMetaverse.ChatType.Debug">
17549 <summary> 15369 <summary>Send the message to the debug channel</summary>
17550 </summary>
17551 </member> 15370 </member>
17552 <member name="F:OpenMetaverse.Sounds.SNAPSHOT"> 15371 <member name="F:OpenMetaverse.ChatType.OwnerSay">
17553 <summary> 15372 <summary>Event message when an object uses llOwnerSay</summary>
17554 </summary>
17555 </member> 15373 </member>
17556 <member name="F:OpenMetaverse.Sounds.TELEPORT_TEXTURE_APPLY"> 15374 <member name="F:OpenMetaverse.ChatType.RegionSay">
17557 <summary> 15375 <summary>Special value to support llRegionSay, never sent to the client</summary>
17558 </summary>
17559 </member> 15376 </member>
17560 <member name="F:OpenMetaverse.Sounds.THUNDER"> 15377 <member name="T:OpenMetaverse.ChatSourceType">
17561 <summary> 15378 <summary>
15379 Identifies the source of a chat message
17562 </summary> 15380 </summary>
17563 </member> 15381 </member>
17564 <member name="F:OpenMetaverse.Sounds.WINDOW_CLOSE"> 15382 <member name="F:OpenMetaverse.ChatSourceType.System">
17565 <summary> 15383 <summary>Chat from the grid or simulator</summary>
17566 </summary>
17567 </member> 15384 </member>
17568 <member name="F:OpenMetaverse.Sounds.WINDOW_OPEN"> 15385 <member name="F:OpenMetaverse.ChatSourceType.Agent">
17569 <summary> 15386 <summary>Chat from another avatar</summary>
17570 </summary>
17571 </member> 15387 </member>
17572 <member name="F:OpenMetaverse.Sounds.ZIPPER"> 15388 <member name="F:OpenMetaverse.ChatSourceType.Object">
17573 <summary> 15389 <summary>Chat from an object</summary>
17574 </summary>
17575 </member> 15390 </member>
17576 <member name="M:OpenMetaverse.Sounds.ToDictionary"> 15391 <member name="T:OpenMetaverse.ChatAudibleLevel">
17577 <summary> 15392 <summary>
17578 A dictionary containing all pre-defined sounds 15393
17579 </summary> 15394 </summary>
17580 <returns>A dictionary containing the pre-defined sounds,
17581 where the key is the sounds ID, and the value is a string
17582 containing a name to identify the purpose of the sound</returns>
17583 </member> 15395 </member>
17584 <member name="F:OpenMetaverse.TerrainPatch.X"> 15396 <member name="F:OpenMetaverse.ChatAudibleLevel.Not">
17585 <summary>X position of this patch</summary> 15397 <summary></summary>
17586 </member>
17587 <member name="F:OpenMetaverse.TerrainPatch.Y">
17588 <summary>Y position of this patch</summary>
17589 </member>
17590 <member name="F:OpenMetaverse.TerrainPatch.Data">
17591 <summary>A 16x16 array of floats holding decompressed layer data</summary>
17592 </member> 15398 </member>
17593 <member name="M:OpenMetaverse.TerrainCompressor.CreateLandPacket(System.Single[],System.Int32[])"> 15399 <member name="F:OpenMetaverse.ChatAudibleLevel.Barely">
17594 <summary> 15400 <summary></summary>
17595 Creates a LayerData packet for compressed land data given a full
17596 simulator heightmap and an array of indices of patches to compress
17597 </summary>
17598 <param name="heightmap">A 256 * 256 array of floating point values
17599 specifying the height at each meter in the simulator</param>
17600 <param name="patches">Array of indexes in the 16x16 grid of patches
17601 for this simulator. For example if 1 and 17 are specified, patches
17602 x=1,y=0 and x=1,y=1 are sent</param>
17603 <returns>
17604 </returns>
17605 </member> 15401 </member>
17606 <member name="M:OpenMetaverse.TerrainCompressor.CreatePatchFromHeightmap(OpenMetaverse.BitPack,System.Single[],System.Int32,System.Int32)"> 15402 <member name="F:OpenMetaverse.ChatAudibleLevel.Fully">
17607 <summary> 15403 <summary></summary>
17608 Add a patch of terrain to a BitPacker
17609 </summary>
17610 <param name="output">BitPacker to write the patch to</param>
17611 <param name="heightmap">Heightmap of the simulator, must be a 256 *
17612 256 float array</param>
17613 <param name="x">X offset of the patch to create, valid values are
17614 from 0 to 15</param>
17615 <param name="y">Y offset of the patch to create, valid values are
17616 from 0 to 15</param>
17617 </member> 15404 </member>
17618 <member name="M:OpenMetaverse.TerrainManager.#ctor(OpenMetaverse.GridClient)"> 15405 <member name="T:OpenMetaverse.EffectType">
17619 <summary> 15406 <summary>
17620 Default constructor 15407 Effect type used in ViewerEffect packets
17621 </summary> 15408 </summary>
17622 <param name="client">
17623 </param>
17624 </member> 15409 </member>
17625 <member name="F:OpenMetaverse.TerrainManager.m_LandPatchReceivedEvent"> 15410 <member name="F:OpenMetaverse.EffectType.Text">
17626 <summary>The event subscribers. null if no subcribers</summary> 15411 <summary></summary>
17627 </member>
17628 <member name="F:OpenMetaverse.TerrainManager.m_LandPatchReceivedLock">
17629 <summary>Thread sync lock object</summary>
17630 </member>
17631 <member name="E:OpenMetaverse.TerrainManager.LandPatchReceived">
17632 <summary>Raised when the simulator responds sends </summary>
17633 </member> 15412 </member>
17634 <member name="M:OpenMetaverse.TerrainManager.OnLandPatchReceived(OpenMetaverse.LandPatchReceivedEventArgs)"> 15413 <member name="F:OpenMetaverse.EffectType.Icon">
17635 <summary>Raises the LandPatchReceived event</summary> 15414 <summary></summary>
17636 <param name="e">A LandPatchReceivedEventArgs object containing the
17637 data returned from the simulator</param>
17638 </member> 15415 </member>
17639 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.Simulator"> 15416 <member name="F:OpenMetaverse.EffectType.Connector">
17640 <summary>Simulator from that sent tha data</summary> 15417 <summary></summary>
17641 </member> 15418 </member>
17642 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.X"> 15419 <member name="F:OpenMetaverse.EffectType.FlexibleObject">
17643 <summary>Sim coordinate of the patch</summary> 15420 <summary></summary>
17644 </member> 15421 </member>
17645 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.Y"> 15422 <member name="F:OpenMetaverse.EffectType.AnimalControls">
17646 <summary>Sim coordinate of the patch</summary> 15423 <summary></summary>
17647 </member> 15424 </member>
17648 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.PatchSize"> 15425 <member name="F:OpenMetaverse.EffectType.AnimationObject">
17649 <summary>Size of tha patch</summary> 15426 <summary></summary>
17650 </member> 15427 </member>
17651 <member name="P:OpenMetaverse.LandPatchReceivedEventArgs.HeightMap"> 15428 <member name="F:OpenMetaverse.EffectType.Cloth">
17652 <summary>Heightmap for the patch</summary> 15429 <summary></summary>
17653 </member> 15430 </member>
17654 <member name="T:OpenMetaverse.TextureRequestState"> 15431 <member name="F:OpenMetaverse.EffectType.Beam">
17655 <summary> 15432 <summary>Project a beam from a source to a destination, such as
17656 The current status of a texture request as it moves through the pipeline or final result of a texture request. 15433 the one used when editing an object</summary>
17657 </summary>
17658 </member> 15434 </member>
17659 <member name="F:OpenMetaverse.TextureRequestState.Pending"> 15435 <member name="F:OpenMetaverse.EffectType.Glow">
17660 <summary>The initial state given to a request. Requests in this state 15436 <summary></summary>
17661 are waiting for an available slot in the pipeline</summary>
17662 </member> 15437 </member>
17663 <member name="F:OpenMetaverse.TextureRequestState.Started"> 15438 <member name="F:OpenMetaverse.EffectType.Point">
17664 <summary>A request that has been added to the pipeline and the request packet 15439 <summary></summary>
17665 has been sent to the simulator</summary>
17666 </member> 15440 </member>
17667 <member name="F:OpenMetaverse.TextureRequestState.Progress"> 15441 <member name="F:OpenMetaverse.EffectType.Trail">
17668 <summary>A request that has received one or more packets back from the simulator</summary> 15442 <summary></summary>
17669 </member> 15443 </member>
17670 <member name="F:OpenMetaverse.TextureRequestState.Finished"> 15444 <member name="F:OpenMetaverse.EffectType.Sphere">
17671 <summary>A request that has received all packets back from the simulator</summary> 15445 <summary>Create a swirl of particles around an object</summary>
17672 </member> 15446 </member>
17673 <member name="F:OpenMetaverse.TextureRequestState.Timeout"> 15447 <member name="F:OpenMetaverse.EffectType.Spiral">
17674 <summary>A request that has taken longer than <seealso cref="F:OpenMetaverse.Settings.PIPELINE_REQUEST_TIMEOUT" /> 15448 <summary></summary>
17675 to download OR the initial packet containing the packet information was never received</summary>
17676 </member> 15449 </member>
17677 <member name="F:OpenMetaverse.TextureRequestState.Aborted"> 15450 <member name="F:OpenMetaverse.EffectType.Edit">
17678 <summary>The texture request was aborted by request of the agent</summary> 15451 <summary></summary>
17679 </member> 15452 </member>
17680 <member name="F:OpenMetaverse.TextureRequestState.NotFound"> 15453 <member name="F:OpenMetaverse.EffectType.LookAt">
17681 <summary>The simulator replied to the request that it was not able to find the requested texture</summary> 15454 <summary>Cause an avatar to look at an object</summary>
17682 </member> 15455 </member>
17683 <member name="T:OpenMetaverse.TexturePipeline"> 15456 <member name="F:OpenMetaverse.EffectType.PointAt">
17684 <summary> 15457 <summary>Cause an avatar to point at an object</summary>
17685 Texture request download handler, allows a configurable number of download slots which manage multiple
17686 concurrent texture downloads from the <seealso cref="T:OpenMetaverse.Simulator" /></summary>
17687 <remarks>This class makes full use of the internal <seealso cref="!:TextureCache" />
17688 system for full texture downloads.</remarks>
17689 </member> 15458 </member>
17690 <member name="M:OpenMetaverse.TexturePipeline.#ctor(OpenMetaverse.GridClient)"> 15459 <member name="T:OpenMetaverse.LookAtType">
17691 <summary> 15460 <summary>
17692 Default constructor, Instantiates a new copy of the TexturePipeline class 15461 The action an avatar is doing when looking at something, used in
15462 ViewerEffect packets for the LookAt effect
17693 </summary> 15463 </summary>
17694 <param name="client">Reference to the instantiated <see cref="T:OpenMetaverse.GridClient" /> object</param>
17695 </member>
17696 <member name="T:OpenMetaverse.TexturePipeline.TaskInfo">
17697 <summary>
17698 A request task containing information and status of a request as it is processed through the <see cref="T:OpenMetaverse.TexturePipeline" /></summary>
17699 </member>
17700 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.State">
17701 <summary>The current <seealso cref="T:OpenMetaverse.TextureRequestState" /> which identifies the current status of the request</summary>
17702 </member>
17703 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.RequestID">
17704 <summary>The Unique Request ID, This is also the Asset ID of the texture being requested</summary>
17705 </member>
17706 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.RequestSlot">
17707 <summary>The slot this request is occupying in the threadpoolSlots array</summary>
17708 </member>
17709 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Type">
17710 <summary>The ImageType of the request.</summary>
17711 </member>
17712 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Callbacks">
17713 <summary>The callback to fire when the request is complete, will include
17714 the <seealso cref="T:OpenMetaverse.TextureRequestState" /> and the <see cref="T:OpenMetaverse.Assets.AssetTexture" />
17715 object containing the result data</summary>
17716 </member>
17717 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.ReportProgress">
17718 <summary>If true, indicates the callback will be fired whenever new data is returned from the simulator.
17719 This is used to progressively render textures as portions of the texture are received.</summary>
17720 </member>
17721 <member name="F:OpenMetaverse.TexturePipeline.TaskInfo.Transfer">
17722 <summary>An object that maintains the data of an request thats in-process.</summary>
17723 </member>
17724 <member name="F:OpenMetaverse.TexturePipeline._Transfers">
17725 <summary>A dictionary containing all pending and in-process transfer requests where the Key is both the RequestID
17726 and also the Asset Texture ID, and the value is an object containing the current state of the request and also
17727 the asset data as it is being re-assembled</summary>
17728 </member>
17729 <member name="F:OpenMetaverse.TexturePipeline._Client">
17730 <summary>Holds the reference to the <see cref="T:OpenMetaverse.GridClient" /> client object</summary>
17731 </member> 15464 </member>
17732 <member name="F:OpenMetaverse.TexturePipeline.maxTextureRequests"> 15465 <member name="F:OpenMetaverse.LookAtType.None">
17733 <summary>Maximum concurrent texture requests allowed at a time</summary> 15466 <summary></summary>
17734 </member>
17735 <member name="F:OpenMetaverse.TexturePipeline.resetEvents">
17736 <summary>An array of <see cref="T:System.Threading.AutoResetEvent" /> objects used to manage worker request threads</summary>
17737 </member>
17738 <member name="F:OpenMetaverse.TexturePipeline.threadpoolSlots">
17739 <summary>An array of worker slots which shows the availablity status of the slot</summary>
17740 </member>
17741 <member name="F:OpenMetaverse.TexturePipeline.downloadMaster">
17742 <summary>The primary thread which manages the requests.</summary>
17743 </member>
17744 <member name="F:OpenMetaverse.TexturePipeline._Running">
17745 <summary>true if the TexturePipeline is currently running</summary>
17746 </member>
17747 <member name="F:OpenMetaverse.TexturePipeline.lockerObject">
17748 <summary>A synchronization object used by the primary thread</summary>
17749 </member>
17750 <member name="F:OpenMetaverse.TexturePipeline.RefreshDownloadsTimer">
17751 <summary>A refresh timer used to increase the priority of stalled requests</summary>
17752 </member>
17753 <member name="P:OpenMetaverse.TexturePipeline.TransferCount">
17754 <summary>Current number of pending and in-process transfers</summary>
17755 </member> 15467 </member>
17756 <member name="M:OpenMetaverse.TexturePipeline.Startup"> 15468 <member name="F:OpenMetaverse.LookAtType.Idle">
17757 <summary> 15469 <summary></summary>
17758 Initialize callbacks required for the TexturePipeline to operate
17759 </summary>
17760 </member> 15470 </member>
17761 <member name="M:OpenMetaverse.TexturePipeline.Shutdown"> 15471 <member name="F:OpenMetaverse.LookAtType.AutoListen">
17762 <summary> 15472 <summary></summary>
17763 Shutdown the TexturePipeline and cleanup any callbacks or transfers
17764 </summary>
17765 </member> 15473 </member>
17766 <member name="M:OpenMetaverse.TexturePipeline.RequestTexture(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32,OpenMetaverse.TextureDownloadCallback,System.Boolean)"> 15474 <member name="F:OpenMetaverse.LookAtType.FreeLook">
17767 <summary> 15475 <summary></summary>
17768 Request a texture asset from the simulator using the <see cref="T:OpenMetaverse.TexturePipeline" /> system to
17769 manage the requests and re-assemble the image from the packets received from the simulator
17770 </summary>
17771 <param name="textureID">The <see cref="T:OpenMetaverse.UUID" /> of the texture asset to download</param>
17772 <param name="imageType">The <see cref="T:OpenMetaverse.ImageType" /> of the texture asset.
17773 Use <see cref="F:OpenMetaverse.ImageType.Normal" /> for most textures, or <see cref="F:OpenMetaverse.ImageType.Baked" /> for baked layer texture assets</param>
17774 <param name="priority">A float indicating the requested priority for the transfer. Higher priority values tell the simulator
17775 to prioritize the request before lower valued requests. An image already being transferred using the <see cref="T:OpenMetaverse.TexturePipeline" /> can have
17776 its priority changed by resending the request with the new priority value</param>
17777 <param name="discardLevel">Number of quality layers to discard.
17778 This controls the end marker of the data sent</param>
17779 <param name="packetStart">The packet number to begin the request at. A value of 0 begins the request
17780 from the start of the asset texture</param>
17781 <param name="callback">The <see cref="T:OpenMetaverse.TextureDownloadCallback" /> callback to fire when the image is retrieved. The callback
17782 will contain the result of the request and the texture asset data</param>
17783 <param name="progressive">If true, the callback will be fired for each chunk of the downloaded image.
17784 The callback asset parameter will contain all previously received chunks of the texture asset starting
17785 from the beginning of the request</param>
17786 </member> 15476 </member>
17787 <member name="M:OpenMetaverse.TexturePipeline.RequestImage(OpenMetaverse.UUID,OpenMetaverse.ImageType,System.Single,System.Int32,System.UInt32)"> 15477 <member name="F:OpenMetaverse.LookAtType.Respond">
17788 <summary> 15478 <summary></summary>
17789 Sends the actual request packet to the simulator
17790 </summary>
17791 <param name="imageID">The image to download</param>
17792 <param name="type">Type of the image to download, either a baked
17793 avatar texture or a normal texture</param>
17794 <param name="priority">Priority level of the download. Default is
17795 <c>1,013,000.0f</c></param>
17796 <param name="discardLevel">Number of quality layers to discard.
17797 This controls the end marker of the data sent</param>
17798 <param name="packetNum">Packet number to start the download at.
17799 This controls the start marker of the data sent</param>
17800 <remarks>Sending a priority of 0 and a discardlevel of -1 aborts
17801 download</remarks>
17802 </member> 15479 </member>
17803 <member name="M:OpenMetaverse.TexturePipeline.AbortTextureRequest(OpenMetaverse.UUID)"> 15480 <member name="F:OpenMetaverse.LookAtType.Hover">
17804 <summary> 15481 <summary></summary>
17805 Cancel a pending or in process texture request
17806 </summary>
17807 <param name="textureID">The texture assets unique ID</param>
17808 </member> 15482 </member>
17809 <member name="M:OpenMetaverse.TexturePipeline.DownloadThread"> 15483 <member name="F:OpenMetaverse.LookAtType.Conversation">
17810 <summary> 15484 <summary>Deprecated</summary>
17811 Master Download Thread, Queues up downloads in the threadpool
17812 </summary>
17813 </member> 15485 </member>
17814 <member name="M:OpenMetaverse.TexturePipeline.TextureRequestDoWork(System.Object)"> 15486 <member name="F:OpenMetaverse.LookAtType.Select">
17815 <summary> 15487 <summary></summary>
17816 The worker thread that sends the request and handles timeouts
17817 </summary>
17818 <param name="threadContext">A <see cref="T:OpenMetaverse.TexturePipeline.TaskInfo" /> object containing the request details</param>
17819 </member> 15488 </member>
17820 <member name="M:OpenMetaverse.TexturePipeline.ImageNotInDatabaseHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15489 <member name="F:OpenMetaverse.LookAtType.Focus">
17821 <summary> 15490 <summary></summary>
17822 Handle responses from the simulator that tell us a texture we have requested is unable to be located
17823 or no longer exists. This will remove the request from the pipeline and free up a slot if one is in use
17824 </summary>
17825 <param name="sender">The sender</param>
17826 <param name="e">The EventArgs object containing the packet data</param>
17827 </member> 15491 </member>
17828 <member name="M:OpenMetaverse.TexturePipeline.ImagePacketHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15492 <member name="F:OpenMetaverse.LookAtType.Mouselook">
17829 <summary> 15493 <summary></summary>
17830 Handles the remaining Image data that did not fit in the initial ImageData packet
17831 </summary>
17832 <param name="sender">The sender</param>
17833 <param name="e">The EventArgs object containing the packet data</param>
17834 </member> 15494 </member>
17835 <member name="M:OpenMetaverse.TexturePipeline.ImageDataHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)"> 15495 <member name="F:OpenMetaverse.LookAtType.Clear">
17836 <summary> 15496 <summary></summary>
17837 Handle the initial ImageDataPacket sent from the simulator
17838 </summary>
17839 <param name="sender">The sender</param>
17840 <param name="e">The EventArgs object containing the packet data</param>
17841 </member> 15497 </member>
17842 <member name="T:ThreadUtil"> 15498 <member name="T:OpenMetaverse.PointAtType">
17843 <summary> 15499 <summary>
15500 The action an avatar is doing when pointing at something, used in
15501 ViewerEffect packets for the PointAt effect
17844 </summary> 15502 </summary>
17845 </member> 15503 </member>
17846 <member name="T:ThreadUtil.DelegateWrapper"> 15504 <member name="F:OpenMetaverse.PointAtType.None">
17847 <summary> 15505 <summary></summary>
17848 Delegate to wrap another delegate and its arguments
17849 </summary>
17850 <param name="d">
17851 </param>
17852 <param name="args">
17853 </param>
17854 </member> 15506 </member>
17855 <member name="F:ThreadUtil.wrapperInstance"> 15507 <member name="F:OpenMetaverse.PointAtType.Select">
17856 <summary> 15508 <summary></summary>
17857 An instance of DelegateWrapper which calls InvokeWrappedDelegate,
17858 which in turn calls the DynamicInvoke method of the wrapped
17859 delegate
17860 </summary>
17861 </member> 15509 </member>
17862 <member name="F:ThreadUtil.callback"> 15510 <member name="F:OpenMetaverse.PointAtType.Grab">
17863 <summary> 15511 <summary></summary>
17864 Callback used to call EndInvoke on the asynchronously
17865 invoked DelegateWrapper
17866 </summary>
17867 </member> 15512 </member>
17868 <member name="M:ThreadUtil.FireAndForget(System.Delegate,System.Object[])"> 15513 <member name="F:OpenMetaverse.PointAtType.Clear">
17869 <summary> 15514 <summary></summary>
17870 Executes the specified delegate with the specified arguments
17871 asynchronously on a thread pool thread
17872 </summary>
17873 <param name="d">
17874 </param>
17875 <param name="args">
17876 </param>
17877 </member> 15515 </member>
17878 <member name="M:ThreadUtil.InvokeWrappedDelegate(System.Delegate,System.Object[])"> 15516 <member name="T:OpenMetaverse.MoneyTransactionType">
17879 <summary> 15517 <summary>
17880 Invokes the wrapped delegate synchronously 15518 Money transaction types
17881 </summary> 15519 </summary>
17882 <param name="d">
17883 </param>
17884 <param name="args">
17885 </param>
17886 </member> 15520 </member>
17887 <member name="M:ThreadUtil.EndWrapperInvoke(System.IAsyncResult)"> 15521 <member name="F:OpenMetaverse.MoneyTransactionType.None">
17888 <summary> 15522 <summary></summary>
17889 Calls EndInvoke on the wrapper and Close on the resulting WaitHandle
17890 to prevent resource leaks
17891 </summary>
17892 <param name="ar">
17893 </param>
17894 </member> 15523 </member>
17895 <member name="T:OpenMetaverse.UDPBase"> 15524 <member name="F:OpenMetaverse.MoneyTransactionType.FailSimulatorTimeout">
17896 <summary> 15525 <summary></summary>
17897 </summary>
17898 </member> 15526 </member>
17899 <member name="M:OpenMetaverse.UDPBase.#ctor(System.Int32)"> 15527 <member name="F:OpenMetaverse.MoneyTransactionType.FailDataserverTimeout">
17900 <summary> 15528 <summary></summary>
17901 Initialize the UDP packet handler in server mode
17902 </summary>
17903 <param name="port">Port to listening for incoming UDP packets on</param>
17904 </member> 15529 </member>
17905 <member name="M:OpenMetaverse.UDPBase.#ctor(System.Net.IPEndPoint)"> 15530 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectClaim">
17906 <summary> 15531 <summary></summary>
17907 Initialize the UDP packet handler in client mode
17908 </summary>
17909 <param name="endPoint">Remote UDP server to connect to</param>
17910 </member> 15532 </member>
17911 <member name="P:OpenMetaverse.UDPBase.IsRunning"> 15533 <member name="F:OpenMetaverse.MoneyTransactionType.LandClaim">
17912 <summary> 15534 <summary></summary>
17913 </summary>
17914 </member> 15535 </member>
17915 <member name="M:OpenMetaverse.UDPBase.Start"> 15536 <member name="F:OpenMetaverse.MoneyTransactionType.GroupCreate">
17916 <summary> 15537 <summary></summary>
17917 </summary>
17918 </member> 15538 </member>
17919 <member name="M:OpenMetaverse.UDPBase.Stop"> 15539 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicClaim">
17920 <summary> 15540 <summary></summary>
17921 </summary>
17922 </member> 15541 </member>
17923 <member name="T:OpenMetaverse.PacketFrequency"> 15542 <member name="F:OpenMetaverse.MoneyTransactionType.GroupJoin">
17924 <summary> 15543 <summary></summary>
17925 </summary>
17926 </member> 15544 </member>
17927 <member name="F:OpenMetaverse.PacketFrequency.Low"> 15545 <member name="F:OpenMetaverse.MoneyTransactionType.TeleportCharge">
17928 <summary> 15546 <summary></summary>
17929 </summary>
17930 </member> 15547 </member>
17931 <member name="F:OpenMetaverse.PacketFrequency.Medium"> 15548 <member name="F:OpenMetaverse.MoneyTransactionType.UploadCharge">
17932 <summary> 15549 <summary></summary>
17933 </summary>
17934 </member> 15550 </member>
17935 <member name="F:OpenMetaverse.PacketFrequency.High"> 15551 <member name="F:OpenMetaverse.MoneyTransactionType.LandAuction">
17936 <summary> 15552 <summary></summary>
17937 </summary>
17938 </member> 15553 </member>
17939 <member name="T:OpenMetaverse.Packets.MalformedDataException"> 15554 <member name="F:OpenMetaverse.MoneyTransactionType.ClassifiedCharge">
17940 <summary> 15555 <summary></summary>
17941 Thrown when a packet could not be successfully deserialized
17942 </summary>
17943 </member> 15556 </member>
17944 <member name="M:OpenMetaverse.Packets.MalformedDataException.#ctor"> 15557 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectTax">
17945 <summary> 15558 <summary></summary>
17946 Default constructor
17947 </summary>
17948 </member> 15559 </member>
17949 <member name="M:OpenMetaverse.Packets.MalformedDataException.#ctor(System.String)"> 15560 <member name="F:OpenMetaverse.MoneyTransactionType.LandTax">
17950 <summary> 15561 <summary></summary>
17951 Constructor that takes an additional error message
17952 </summary>
17953 <param name="Message">An error message to attach to this exception</param>
17954 </member> 15562 </member>
17955 <member name="T:OpenMetaverse.Packets.Header"> 15563 <member name="F:OpenMetaverse.MoneyTransactionType.LightTax">
17956 <summary> 15564 <summary></summary>
17957 The header of a message template packet. Holds packet flags, sequence
17958 number, packet ID, and any ACKs that will be appended at the end of
17959 the packet
17960 </summary>
17961 </member> 15565 </member>
17962 <member name="M:OpenMetaverse.Packets.Header.AcksToBytes(System.Byte[],System.Int32@)"> 15566 <member name="F:OpenMetaverse.MoneyTransactionType.ParcelDirFee">
17963 <summary> 15567 <summary></summary>
17964 Convert the AckList to a byte array, used for packet serializing
17965 </summary>
17966 <param name="bytes">Reference to the target byte array</param>
17967 <param name="i">Beginning position to start writing to in the byte
17968 array, will be updated with the ending position of the ACK list</param>
17969 </member> 15568 </member>
17970 <member name="M:OpenMetaverse.Packets.Header.BuildHeader(System.Byte[],System.Int32@,System.Int32@)"> 15569 <member name="F:OpenMetaverse.MoneyTransactionType.GroupTax">
17971 <summary> 15570 <summary></summary>
17972 </summary>
17973 <param name="bytes">
17974 </param>
17975 <param name="pos">
17976 </param>
17977 <param name="packetEnd">
17978 </param>
17979 <returns>
17980 </returns>
17981 </member> 15571 </member>
17982 <member name="M:OpenMetaverse.Packets.Header.CreateAckList(OpenMetaverse.Packets.Header@,System.Byte[],System.Int32@)"> 15572 <member name="F:OpenMetaverse.MoneyTransactionType.ClassifiedRenew">
17983 <summary> 15573 <summary></summary>
17984 </summary>
17985 <param name="header">
17986 </param>
17987 <param name="bytes">
17988 </param>
17989 <param name="packetEnd">
17990 </param>
17991 </member> 15574 </member>
17992 <member name="T:OpenMetaverse.Packets.PacketBlock"> 15575 <member name="F:OpenMetaverse.MoneyTransactionType.GiveInventory">
17993 <summary> 15576 <summary></summary>
17994 A block of data in a packet. Packets are composed of one or more blocks,
17995 each block containing one or more fields
17996 </summary>
17997 </member> 15577 </member>
17998 <member name="P:OpenMetaverse.Packets.PacketBlock.Length"> 15578 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectSale">
17999 <summary>Current length of the data in this packet</summary> 15579 <summary></summary>
18000 </member> 15580 </member>
18001 <member name="M:OpenMetaverse.Packets.PacketBlock.FromBytes(System.Byte[],System.Int32@)"> 15581 <member name="F:OpenMetaverse.MoneyTransactionType.Gift">
18002 <summary> 15582 <summary></summary>
18003 Create a block from a byte array
18004 </summary>
18005 <param name="bytes">Byte array containing the serialized block</param>
18006 <param name="i">Starting position of the block in the byte array.
18007 This will point to the data after the end of the block when the
18008 call returns</param>
18009 </member> 15583 </member>
18010 <member name="M:OpenMetaverse.Packets.PacketBlock.ToBytes(System.Byte[],System.Int32@)"> 15584 <member name="F:OpenMetaverse.MoneyTransactionType.LandSale">
18011 <summary> 15585 <summary></summary>
18012 Serialize this block into a byte array
18013 </summary>
18014 <param name="bytes">Byte array to serialize this block into</param>
18015 <param name="i">Starting position in the byte array to serialize to.
18016 This will point to the position directly after the end of the
18017 serialized block when the call returns</param>
18018 </member> 15586 </member>
18019 <member name="F:OpenMetaverse.Packets.PacketType.Default"> 15587 <member name="F:OpenMetaverse.MoneyTransactionType.ReferBonus">
18020 <summary>A generic value, not an actual packet type</summary> 15588 <summary></summary>
18021 </member> 15589 </member>
18022 <member name="T:OpenMetaverse.Packets.TestMessagePacket"> 15590 <member name="F:OpenMetaverse.MoneyTransactionType.InventorySale">
18023 <exclude /> 15591 <summary></summary>
18024 </member> 15592 </member>
18025 <member name="T:OpenMetaverse.Packets.TestMessagePacket.TestBlock1Block"> 15593 <member name="F:OpenMetaverse.MoneyTransactionType.RefundPurchase">
18026 <exclude /> 15594 <summary></summary>
18027 </member> 15595 </member>
18028 <member name="T:OpenMetaverse.Packets.TestMessagePacket.NeighborBlockBlock"> 15596 <member name="F:OpenMetaverse.MoneyTransactionType.LandPassSale">
18029 <exclude /> 15597 <summary></summary>
18030 </member> 15598 </member>
18031 <member name="T:OpenMetaverse.Packets.UseCircuitCodePacket"> 15599 <member name="F:OpenMetaverse.MoneyTransactionType.DwellBonus">
18032 <exclude /> 15600 <summary></summary>
18033 </member> 15601 </member>
18034 <member name="T:OpenMetaverse.Packets.UseCircuitCodePacket.CircuitCodeBlock"> 15602 <member name="F:OpenMetaverse.MoneyTransactionType.PayObject">
18035 <exclude /> 15603 <summary></summary>
18036 </member> 15604 </member>
18037 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket"> 15605 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPays">
18038 <exclude /> 15606 <summary></summary>
18039 </member> 15607 </member>
18040 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket.TelehubBlockBlock"> 15608 <member name="F:OpenMetaverse.MoneyTransactionType.GroupLandDeed">
18041 <exclude /> 15609 <summary></summary>
18042 </member> 15610 </member>
18043 <member name="T:OpenMetaverse.Packets.TelehubInfoPacket.SpawnPointBlockBlock"> 15611 <member name="F:OpenMetaverse.MoneyTransactionType.GroupObjectDeed">
18044 <exclude /> 15612 <summary></summary>
18045 </member> 15613 </member>
18046 <member name="T:OpenMetaverse.Packets.EconomyDataRequestPacket"> 15614 <member name="F:OpenMetaverse.MoneyTransactionType.GroupLiability">
18047 <exclude /> 15615 <summary></summary>
18048 </member> 15616 </member>
18049 <member name="T:OpenMetaverse.Packets.EconomyDataPacket"> 15617 <member name="F:OpenMetaverse.MoneyTransactionType.GroupDividend">
18050 <exclude /> 15618 <summary></summary>
18051 </member> 15619 </member>
18052 <member name="T:OpenMetaverse.Packets.EconomyDataPacket.InfoBlock"> 15620 <member name="F:OpenMetaverse.MoneyTransactionType.GroupMembershipDues">
18053 <exclude /> 15621 <summary></summary>
18054 </member> 15622 </member>
18055 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket"> 15623 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectRelease">
18056 <exclude /> 15624 <summary></summary>
18057 </member> 15625 </member>
18058 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket.AgentDataBlock"> 15626 <member name="F:OpenMetaverse.MoneyTransactionType.LandRelease">
18059 <exclude /> 15627 <summary></summary>
18060 </member> 15628 </member>
18061 <member name="T:OpenMetaverse.Packets.AvatarPickerRequestPacket.DataBlock"> 15629 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectDelete">
18062 <exclude /> 15630 <summary></summary>
18063 </member> 15631 </member>
18064 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket"> 15632 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicDecay">
18065 <exclude /> 15633 <summary></summary>
18066 </member> 15634 </member>
18067 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket.AgentDataBlock"> 15635 <member name="F:OpenMetaverse.MoneyTransactionType.ObjectPublicDelete">
18068 <exclude /> 15636 <summary></summary>
18069 </member> 15637 </member>
18070 <member name="T:OpenMetaverse.Packets.AvatarPickerReplyPacket.DataBlock"> 15638 <member name="F:OpenMetaverse.MoneyTransactionType.LindenAdjustment">
18071 <exclude /> 15639 <summary></summary>
18072 </member> 15640 </member>
18073 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket"> 15641 <member name="F:OpenMetaverse.MoneyTransactionType.LindenGrant">
18074 <exclude /> 15642 <summary></summary>
18075 </member> 15643 </member>
18076 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.AgentDataBlock"> 15644 <member name="F:OpenMetaverse.MoneyTransactionType.LindenPenalty">
18077 <exclude /> 15645 <summary></summary>
18078 </member> 15646 </member>
18079 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.TransactionDataBlock"> 15647 <member name="F:OpenMetaverse.MoneyTransactionType.EventFee">
18080 <exclude /> 15648 <summary></summary>
18081 </member> 15649 </member>
18082 <member name="T:OpenMetaverse.Packets.PlacesQueryPacket.QueryDataBlock"> 15650 <member name="F:OpenMetaverse.MoneyTransactionType.EventPrize">
18083 <exclude /> 15651 <summary></summary>
18084 </member> 15652 </member>
18085 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket"> 15653 <member name="F:OpenMetaverse.MoneyTransactionType.StipendBasic">
18086 <exclude /> 15654 <summary></summary>
18087 </member> 15655 </member>
18088 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.AgentDataBlock"> 15656 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDeveloper">
18089 <exclude /> 15657 <summary></summary>
18090 </member> 15658 </member>
18091 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.TransactionDataBlock"> 15659 <member name="F:OpenMetaverse.MoneyTransactionType.StipendAlways">
18092 <exclude /> 15660 <summary></summary>
18093 </member> 15661 </member>
18094 <member name="T:OpenMetaverse.Packets.PlacesReplyPacket.QueryDataBlock"> 15662 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDaily">
18095 <exclude /> 15663 <summary></summary>
18096 </member> 15664 </member>
18097 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket"> 15665 <member name="F:OpenMetaverse.MoneyTransactionType.StipendRating">
18098 <exclude /> 15666 <summary></summary>
18099 </member> 15667 </member>
18100 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket.AgentDataBlock"> 15668 <member name="F:OpenMetaverse.MoneyTransactionType.StipendDelta">
18101 <exclude /> 15669 <summary></summary>
18102 </member> 15670 </member>
18103 <member name="T:OpenMetaverse.Packets.DirFindQueryPacket.QueryDataBlock"> 15671 <member name="T:OpenMetaverse.TransactionFlags">
18104 <exclude /> 15672 <summary>
15673
15674 </summary>
18105 </member> 15675 </member>
18106 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket"> 15676 <member name="F:OpenMetaverse.TransactionFlags.None">
18107 <exclude /> 15677 <summary></summary>
18108 </member> 15678 </member>
18109 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket.AgentDataBlock"> 15679 <member name="F:OpenMetaverse.TransactionFlags.SourceGroup">
18110 <exclude /> 15680 <summary></summary>
18111 </member> 15681 </member>
18112 <member name="T:OpenMetaverse.Packets.DirPlacesQueryPacket.QueryDataBlock"> 15682 <member name="F:OpenMetaverse.TransactionFlags.DestGroup">
18113 <exclude /> 15683 <summary></summary>
18114 </member> 15684 </member>
18115 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket"> 15685 <member name="F:OpenMetaverse.TransactionFlags.OwnerGroup">
18116 <exclude /> 15686 <summary></summary>
18117 </member> 15687 </member>
18118 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.AgentDataBlock"> 15688 <member name="F:OpenMetaverse.TransactionFlags.SimultaneousContribution">
18119 <exclude /> 15689 <summary></summary>
18120 </member> 15690 </member>
18121 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.QueryDataBlock"> 15691 <member name="F:OpenMetaverse.TransactionFlags.ContributionRemoval">
18122 <exclude /> 15692 <summary></summary>
18123 </member> 15693 </member>
18124 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.QueryRepliesBlock"> 15694 <member name="T:OpenMetaverse.MeanCollisionType">
18125 <exclude /> 15695 <summary>
15696
15697 </summary>
18126 </member> 15698 </member>
18127 <member name="T:OpenMetaverse.Packets.DirPlacesReplyPacket.StatusDataBlock"> 15699 <member name="F:OpenMetaverse.MeanCollisionType.None">
18128 <exclude /> 15700 <summary></summary>
18129 </member> 15701 </member>
18130 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket"> 15702 <member name="F:OpenMetaverse.MeanCollisionType.Bump">
18131 <exclude /> 15703 <summary></summary>
18132 </member> 15704 </member>
18133 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.AgentDataBlock"> 15705 <member name="F:OpenMetaverse.MeanCollisionType.LLPushObject">
18134 <exclude /> 15706 <summary></summary>
18135 </member> 15707 </member>
18136 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.QueryDataBlock"> 15708 <member name="F:OpenMetaverse.MeanCollisionType.SelectedObjectCollide">
18137 <exclude /> 15709 <summary></summary>
18138 </member> 15710 </member>
18139 <member name="T:OpenMetaverse.Packets.DirPeopleReplyPacket.QueryRepliesBlock"> 15711 <member name="F:OpenMetaverse.MeanCollisionType.ScriptedObjectCollide">
18140 <exclude /> 15712 <summary></summary>
18141 </member> 15713 </member>
18142 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket"> 15714 <member name="F:OpenMetaverse.MeanCollisionType.PhysicalObjectCollide">
18143 <exclude /> 15715 <summary></summary>
18144 </member> 15716 </member>
18145 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.AgentDataBlock"> 15717 <member name="T:OpenMetaverse.ScriptControlChange">
18146 <exclude /> 15718 <summary>
15719 Flags sent when a script takes or releases a control
15720 </summary>
15721 <remarks>NOTE: (need to verify) These might be a subset of the ControlFlags enum in Movement,</remarks>
18147 </member> 15722 </member>
18148 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.QueryDataBlock"> 15723 <member name="F:OpenMetaverse.ScriptControlChange.None">
18149 <exclude /> 15724 <summary>No Flags set</summary>
18150 </member> 15725 </member>
18151 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.QueryRepliesBlock"> 15726 <member name="F:OpenMetaverse.ScriptControlChange.Forward">
18152 <exclude /> 15727 <summary>Forward (W or up Arrow)</summary>
18153 </member> 15728 </member>
18154 <member name="T:OpenMetaverse.Packets.DirEventsReplyPacket.StatusDataBlock"> 15729 <member name="F:OpenMetaverse.ScriptControlChange.Back">
18155 <exclude /> 15730 <summary>Back (S or down arrow)</summary>
18156 </member> 15731 </member>
18157 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket"> 15732 <member name="F:OpenMetaverse.ScriptControlChange.Left">
18158 <exclude /> 15733 <summary>Move left (shift+A or left arrow)</summary>
18159 </member> 15734 </member>
18160 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.AgentDataBlock"> 15735 <member name="F:OpenMetaverse.ScriptControlChange.Right">
18161 <exclude /> 15736 <summary>Move right (shift+D or right arrow)</summary>
18162 </member> 15737 </member>
18163 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.QueryDataBlock"> 15738 <member name="F:OpenMetaverse.ScriptControlChange.Up">
18164 <exclude /> 15739 <summary>Up (E or PgUp)</summary>
18165 </member> 15740 </member>
18166 <member name="T:OpenMetaverse.Packets.DirGroupsReplyPacket.QueryRepliesBlock"> 15741 <member name="F:OpenMetaverse.ScriptControlChange.Down">
18167 <exclude /> 15742 <summary>Down (C or PgDown)</summary>
18168 </member> 15743 </member>
18169 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket"> 15744 <member name="F:OpenMetaverse.ScriptControlChange.RotateLeft">
18170 <exclude /> 15745 <summary>Rotate left (A or left arrow)</summary>
18171 </member> 15746 </member>
18172 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket.AgentDataBlock"> 15747 <member name="F:OpenMetaverse.ScriptControlChange.RotateRight">
18173 <exclude /> 15748 <summary>Rotate right (D or right arrow)</summary>
18174 </member> 15749 </member>
18175 <member name="T:OpenMetaverse.Packets.DirClassifiedQueryPacket.QueryDataBlock"> 15750 <member name="F:OpenMetaverse.ScriptControlChange.LeftButton">
18176 <exclude /> 15751 <summary>Left Mouse Button</summary>
18177 </member> 15752 </member>
18178 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket"> 15753 <member name="F:OpenMetaverse.ScriptControlChange.MouseLookLeftButton">
18179 <exclude /> 15754 <summary>Left Mouse button in MouseLook</summary>
18180 </member> 15755 </member>
18181 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.AgentDataBlock"> 15756 <member name="T:OpenMetaverse.AgentFlags">
18182 <exclude /> 15757 <summary>
15758 Currently only used to hide your group title
15759 </summary>
18183 </member> 15760 </member>
18184 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.QueryDataBlock"> 15761 <member name="F:OpenMetaverse.AgentFlags.None">
18185 <exclude /> 15762 <summary>No flags set</summary>
18186 </member> 15763 </member>
18187 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.QueryRepliesBlock"> 15764 <member name="F:OpenMetaverse.AgentFlags.HideTitle">
18188 <exclude /> 15765 <summary>Hide your group title</summary>
18189 </member> 15766 </member>
18190 <member name="T:OpenMetaverse.Packets.DirClassifiedReplyPacket.StatusDataBlock"> 15767 <member name="T:OpenMetaverse.AgentState">
18191 <exclude /> 15768 <summary>
15769 Action state of the avatar, which can currently be typing and
15770 editing
15771 </summary>
18192 </member> 15772 </member>
18193 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket"> 15773 <member name="F:OpenMetaverse.AgentState.None">
18194 <exclude /> 15774 <summary></summary>
18195 </member> 15775 </member>
18196 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket.AgentDataBlock"> 15776 <member name="F:OpenMetaverse.AgentState.Typing">
18197 <exclude /> 15777 <summary></summary>
18198 </member> 15778 </member>
18199 <member name="T:OpenMetaverse.Packets.AvatarClassifiedReplyPacket.DataBlock"> 15779 <member name="F:OpenMetaverse.AgentState.Editing">
18200 <exclude /> 15780 <summary></summary>
18201 </member> 15781 </member>
18202 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket"> 15782 <member name="T:OpenMetaverse.TeleportStatus">
18203 <exclude /> 15783 <summary>
15784 Current teleport status
15785 </summary>
18204 </member> 15786 </member>
18205 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket.AgentDataBlock"> 15787 <member name="F:OpenMetaverse.TeleportStatus.None">
18206 <exclude /> 15788 <summary>Unknown status</summary>
18207 </member> 15789 </member>
18208 <member name="T:OpenMetaverse.Packets.ClassifiedInfoRequestPacket.DataBlock"> 15790 <member name="F:OpenMetaverse.TeleportStatus.Start">
18209 <exclude /> 15791 <summary>Teleport initialized</summary>
18210 </member> 15792 </member>
18211 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket"> 15793 <member name="F:OpenMetaverse.TeleportStatus.Progress">
18212 <exclude /> 15794 <summary>Teleport in progress</summary>
18213 </member> 15795 </member>
18214 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket.AgentDataBlock"> 15796 <member name="F:OpenMetaverse.TeleportStatus.Failed">
18215 <exclude /> 15797 <summary>Teleport failed</summary>
18216 </member> 15798 </member>
18217 <member name="T:OpenMetaverse.Packets.ClassifiedInfoReplyPacket.DataBlock"> 15799 <member name="F:OpenMetaverse.TeleportStatus.Finished">
18218 <exclude /> 15800 <summary>Teleport completed</summary>
18219 </member> 15801 </member>
18220 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket"> 15802 <member name="F:OpenMetaverse.TeleportStatus.Cancelled">
18221 <exclude /> 15803 <summary>Teleport cancelled</summary>
18222 </member> 15804 </member>
18223 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket.AgentDataBlock"> 15805 <member name="T:OpenMetaverse.TeleportFlags">
18224 <exclude /> 15806 <summary>
15807
15808 </summary>
18225 </member> 15809 </member>
18226 <member name="T:OpenMetaverse.Packets.ClassifiedInfoUpdatePacket.DataBlock"> 15810 <member name="F:OpenMetaverse.TeleportFlags.Default">
18227 <exclude /> 15811 <summary>No flags set, or teleport failed</summary>
18228 </member> 15812 </member>
18229 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket"> 15813 <member name="F:OpenMetaverse.TeleportFlags.SetHomeToTarget">
18230 <exclude /> 15814 <summary>Set when newbie leaves help island for first time</summary>
18231 </member> 15815 </member>
18232 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket.AgentDataBlock"> 15816 <member name="F:OpenMetaverse.TeleportFlags.SetLastToTarget">
18233 <exclude /> 15817 <summary></summary>
18234 </member> 15818 </member>
18235 <member name="T:OpenMetaverse.Packets.ClassifiedDeletePacket.DataBlock"> 15819 <member name="F:OpenMetaverse.TeleportFlags.ViaLure">
18236 <exclude /> 15820 <summary>Via Lure</summary>
18237 </member> 15821 </member>
18238 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket"> 15822 <member name="F:OpenMetaverse.TeleportFlags.ViaLandmark">
18239 <exclude /> 15823 <summary>Via Landmark</summary>
18240 </member> 15824 </member>
18241 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket.AgentDataBlock"> 15825 <member name="F:OpenMetaverse.TeleportFlags.ViaLocation">
18242 <exclude /> 15826 <summary>Via Location</summary>
18243 </member> 15827 </member>
18244 <member name="T:OpenMetaverse.Packets.ClassifiedGodDeletePacket.DataBlock"> 15828 <member name="F:OpenMetaverse.TeleportFlags.ViaHome">
18245 <exclude /> 15829 <summary>Via Home</summary>
18246 </member> 15830 </member>
18247 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket"> 15831 <member name="F:OpenMetaverse.TeleportFlags.ViaTelehub">
18248 <exclude /> 15832 <summary>Via Telehub</summary>
18249 </member> 15833 </member>
18250 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket.AgentDataBlock"> 15834 <member name="F:OpenMetaverse.TeleportFlags.ViaLogin">
18251 <exclude /> 15835 <summary>Via Login</summary>
18252 </member> 15836 </member>
18253 <member name="T:OpenMetaverse.Packets.DirLandQueryPacket.QueryDataBlock"> 15837 <member name="F:OpenMetaverse.TeleportFlags.ViaGodlikeLure">
18254 <exclude /> 15838 <summary>Linden Summoned</summary>
18255 </member> 15839 </member>
18256 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket"> 15840 <member name="F:OpenMetaverse.TeleportFlags.Godlike">
18257 <exclude /> 15841 <summary>Linden Forced me</summary>
18258 </member> 15842 </member>
18259 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.AgentDataBlock"> 15843 <member name="F:OpenMetaverse.TeleportFlags.NineOneOne">
18260 <exclude /> 15844 <summary></summary>
18261 </member> 15845 </member>
18262 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.QueryDataBlock"> 15846 <member name="F:OpenMetaverse.TeleportFlags.DisableCancel">
18263 <exclude /> 15847 <summary>Agent Teleported Home via Script</summary>
18264 </member> 15848 </member>
18265 <member name="T:OpenMetaverse.Packets.DirLandReplyPacket.QueryRepliesBlock"> 15849 <member name="F:OpenMetaverse.TeleportFlags.ViaRegionID">
18266 <exclude /> 15850 <summary></summary>
18267 </member> 15851 </member>
18268 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket"> 15852 <member name="F:OpenMetaverse.TeleportFlags.IsFlying">
18269 <exclude /> 15853 <summary></summary>
18270 </member> 15854 </member>
18271 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket.AgentDataBlock"> 15855 <member name="F:OpenMetaverse.TeleportFlags.ResetHome">
18272 <exclude /> 15856 <summary></summary>
18273 </member> 15857 </member>
18274 <member name="T:OpenMetaverse.Packets.DirPopularQueryPacket.QueryDataBlock"> 15858 <member name="F:OpenMetaverse.TeleportFlags.ForceRedirect">
18275 <exclude /> 15859 <summary>forced to new location for example when avatar is banned or ejected</summary>
18276 </member> 15860 </member>
18277 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket"> 15861 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaLure">
18278 <exclude /> 15862 <summary>Teleport Finished via a Lure</summary>
18279 </member> 15863 </member>
18280 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.AgentDataBlock"> 15864 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaNewSim">
18281 <exclude /> 15865 <summary>Finished, Sim Changed</summary>
18282 </member> 15866 </member>
18283 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.QueryDataBlock"> 15867 <member name="F:OpenMetaverse.TeleportFlags.FinishedViaSameSim">
18284 <exclude /> 15868 <summary>Finished, Same Sim</summary>
18285 </member> 15869 </member>
18286 <member name="T:OpenMetaverse.Packets.DirPopularReplyPacket.QueryRepliesBlock"> 15870 <member name="T:OpenMetaverse.TeleportLureFlags">
18287 <exclude /> 15871 <summary>
15872
15873 </summary>
18288 </member> 15874 </member>
18289 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket"> 15875 <member name="F:OpenMetaverse.TeleportLureFlags.NormalLure">
18290 <exclude /> 15876 <summary></summary>
18291 </member> 15877 </member>
18292 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket.AgentDataBlock"> 15878 <member name="F:OpenMetaverse.TeleportLureFlags.GodlikeLure">
18293 <exclude /> 15879 <summary></summary>
18294 </member> 15880 </member>
18295 <member name="T:OpenMetaverse.Packets.ParcelInfoRequestPacket.DataBlock"> 15881 <member name="F:OpenMetaverse.TeleportLureFlags.GodlikePursuit">
18296 <exclude /> 15882 <summary></summary>
18297 </member> 15883 </member>
18298 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket"> 15884 <member name="T:OpenMetaverse.ScriptSensorTypeFlags">
18299 <exclude /> 15885 <summary>
15886
15887 </summary>
18300 </member> 15888 </member>
18301 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket.AgentDataBlock"> 15889 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Agent">
18302 <exclude /> 15890 <summary></summary>
18303 </member> 15891 </member>
18304 <member name="T:OpenMetaverse.Packets.ParcelInfoReplyPacket.DataBlock"> 15892 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Active">
18305 <exclude /> 15893 <summary></summary>
18306 </member> 15894 </member>
18307 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket"> 15895 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Passive">
18308 <exclude /> 15896 <summary></summary>
18309 </member> 15897 </member>
18310 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket.AgentDataBlock"> 15898 <member name="F:OpenMetaverse.ScriptSensorTypeFlags.Scripted">
18311 <exclude /> 15899 <summary></summary>
18312 </member> 15900 </member>
18313 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersRequestPacket.ParcelDataBlock"> 15901 <member name="T:OpenMetaverse.MuteType">
18314 <exclude /> 15902 <summary>
15903 Type of mute entry
15904 </summary>
18315 </member> 15905 </member>
18316 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersReplyPacket"> 15906 <member name="F:OpenMetaverse.MuteType.ByName">
18317 <exclude /> 15907 <summary>Object muted by name</summary>
18318 </member> 15908 </member>
18319 <member name="T:OpenMetaverse.Packets.ParcelObjectOwnersReplyPacket.DataBlock"> 15909 <member name="F:OpenMetaverse.MuteType.Resident">
18320 <exclude /> 15910 <summary>Muted residet</summary>
18321 </member> 15911 </member>
18322 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket"> 15912 <member name="F:OpenMetaverse.MuteType.Object">
18323 <exclude /> 15913 <summary>Object muted by UUID</summary>
18324 </member> 15914 </member>
18325 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket.AgentDataBlock"> 15915 <member name="F:OpenMetaverse.MuteType.Group">
18326 <exclude /> 15916 <summary>Muted group</summary>
18327 </member> 15917 </member>
18328 <member name="T:OpenMetaverse.Packets.GroupNoticesListRequestPacket.DataBlock"> 15918 <member name="F:OpenMetaverse.MuteType.External">
18329 <exclude /> 15919 <summary>Muted external entry</summary>
18330 </member> 15920 </member>
18331 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket"> 15921 <member name="T:OpenMetaverse.MuteFlags">
18332 <exclude /> 15922 <summary>
15923 Flags of mute entry
15924 </summary>
18333 </member> 15925 </member>
18334 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket.AgentDataBlock"> 15926 <member name="F:OpenMetaverse.MuteFlags.Default">
18335 <exclude /> 15927 <summary>No exceptions</summary>
18336 </member> 15928 </member>
18337 <member name="T:OpenMetaverse.Packets.GroupNoticesListReplyPacket.DataBlock"> 15929 <member name="F:OpenMetaverse.MuteFlags.TextChat">
18338 <exclude /> 15930 <summary>Don't mute text chat</summary>
18339 </member> 15931 </member>
18340 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket"> 15932 <member name="F:OpenMetaverse.MuteFlags.VoiceChat">
18341 <exclude /> 15933 <summary>Don't mute voice chat</summary>
18342 </member> 15934 </member>
18343 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket.AgentDataBlock"> 15935 <member name="F:OpenMetaverse.MuteFlags.Particles">
18344 <exclude /> 15936 <summary>Don't mute particles</summary>
18345 </member> 15937 </member>
18346 <member name="T:OpenMetaverse.Packets.GroupNoticeRequestPacket.DataBlock"> 15938 <member name="F:OpenMetaverse.MuteFlags.ObjectSounds">
18347 <exclude /> 15939 <summary>Don't mute sounds</summary>
18348 </member> 15940 </member>
18349 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket"> 15941 <member name="F:OpenMetaverse.MuteFlags.All">
18350 <exclude /> 15942 <summary>Don't mute</summary>
18351 </member> 15943 </member>
18352 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket.AgentDataBlock"> 15944 <member name="T:OpenMetaverse.InstantMessage">
18353 <exclude /> 15945 <summary>
15946 Instant Message
15947 </summary>
18354 </member> 15948 </member>
18355 <member name="T:OpenMetaverse.Packets.TeleportRequestPacket.InfoBlock"> 15949 <member name="F:OpenMetaverse.InstantMessage.FromAgentID">
18356 <exclude /> 15950 <summary>Key of sender</summary>
18357 </member> 15951 </member>
18358 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket"> 15952 <member name="F:OpenMetaverse.InstantMessage.FromAgentName">
18359 <exclude /> 15953 <summary>Name of sender</summary>
18360 </member> 15954 </member>
18361 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket.AgentDataBlock"> 15955 <member name="F:OpenMetaverse.InstantMessage.ToAgentID">
18362 <exclude /> 15956 <summary>Key of destination avatar</summary>
18363 </member> 15957 </member>
18364 <member name="T:OpenMetaverse.Packets.TeleportLocationRequestPacket.InfoBlock"> 15958 <member name="F:OpenMetaverse.InstantMessage.ParentEstateID">
18365 <exclude /> 15959 <summary>ID of originating estate</summary>
18366 </member> 15960 </member>
18367 <member name="T:OpenMetaverse.Packets.TeleportLocalPacket"> 15961 <member name="F:OpenMetaverse.InstantMessage.RegionID">
18368 <exclude /> 15962 <summary>Key of originating region</summary>
18369 </member> 15963 </member>
18370 <member name="T:OpenMetaverse.Packets.TeleportLocalPacket.InfoBlock"> 15964 <member name="F:OpenMetaverse.InstantMessage.Position">
18371 <exclude /> 15965 <summary>Coordinates in originating region</summary>
18372 </member> 15966 </member>
18373 <member name="T:OpenMetaverse.Packets.TeleportLandmarkRequestPacket"> 15967 <member name="F:OpenMetaverse.InstantMessage.Dialog">
18374 <exclude /> 15968 <summary>Instant message type</summary>
18375 </member> 15969 </member>
18376 <member name="T:OpenMetaverse.Packets.TeleportLandmarkRequestPacket.InfoBlock"> 15970 <member name="F:OpenMetaverse.InstantMessage.GroupIM">
18377 <exclude /> 15971 <summary>Group IM session toggle</summary>
18378 </member> 15972 </member>
18379 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket"> 15973 <member name="F:OpenMetaverse.InstantMessage.IMSessionID">
18380 <exclude /> 15974 <summary>Key of IM session, for Group Messages, the groups UUID</summary>
18381 </member> 15975 </member>
18382 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket.AgentDataBlock"> 15976 <member name="F:OpenMetaverse.InstantMessage.Timestamp">
18383 <exclude /> 15977 <summary>Timestamp of the instant message</summary>
18384 </member> 15978 </member>
18385 <member name="T:OpenMetaverse.Packets.TeleportProgressPacket.InfoBlock"> 15979 <member name="F:OpenMetaverse.InstantMessage.Message">
18386 <exclude /> 15980 <summary>Instant message text</summary>
18387 </member> 15981 </member>
18388 <member name="T:OpenMetaverse.Packets.TeleportFinishPacket"> 15982 <member name="F:OpenMetaverse.InstantMessage.Offline">
18389 <exclude /> 15983 <summary>Whether this message is held for offline avatars</summary>
18390 </member> 15984 </member>
18391 <member name="T:OpenMetaverse.Packets.TeleportFinishPacket.InfoBlock"> 15985 <member name="F:OpenMetaverse.InstantMessage.BinaryBucket">
18392 <exclude /> 15986 <summary>Context specific packed data</summary>
18393 </member> 15987 </member>
18394 <member name="T:OpenMetaverse.Packets.StartLurePacket"> 15988 <member name="M:OpenMetaverse.InstantMessage.ToString">
18395 <exclude /> 15989 <summary>Print the struct data as a string</summary>
15990 <returns>A string containing the field name, and field value</returns>
18396 </member> 15991 </member>
18397 <member name="T:OpenMetaverse.Packets.StartLurePacket.AgentDataBlock"> 15992 <member name="T:OpenMetaverse.MuteEntry">
18398 <exclude /> 15993 <summary>Represents muted object or resident</summary>
18399 </member> 15994 </member>
18400 <member name="T:OpenMetaverse.Packets.StartLurePacket.InfoBlock"> 15995 <member name="F:OpenMetaverse.MuteEntry.Type">
18401 <exclude /> 15996 <summary>Type of the mute entry</summary>
18402 </member> 15997 </member>
18403 <member name="T:OpenMetaverse.Packets.StartLurePacket.TargetDataBlock"> 15998 <member name="F:OpenMetaverse.MuteEntry.ID">
18404 <exclude /> 15999 <summary>UUID of the mute etnry</summary>
18405 </member> 16000 </member>
18406 <member name="T:OpenMetaverse.Packets.TeleportLureRequestPacket"> 16001 <member name="F:OpenMetaverse.MuteEntry.Name">
18407 <exclude /> 16002 <summary>Mute entry name</summary>
18408 </member> 16003 </member>
18409 <member name="T:OpenMetaverse.Packets.TeleportLureRequestPacket.InfoBlock"> 16004 <member name="F:OpenMetaverse.MuteEntry.Flags">
18410 <exclude /> 16005 <summary>Mute flags</summary>
18411 </member> 16006 </member>
18412 <member name="T:OpenMetaverse.Packets.TeleportCancelPacket"> 16007 <member name="T:OpenMetaverse.TransactionInfo">
18413 <exclude /> 16008 <summary>Transaction detail sent with MoneyBalanceReply message</summary>
18414 </member> 16009 </member>
18415 <member name="T:OpenMetaverse.Packets.TeleportCancelPacket.InfoBlock"> 16010 <member name="F:OpenMetaverse.TransactionInfo.TransactionType">
18416 <exclude /> 16011 <summary>Type of the transaction</summary>
18417 </member> 16012 </member>
18418 <member name="T:OpenMetaverse.Packets.TeleportStartPacket"> 16013 <member name="F:OpenMetaverse.TransactionInfo.SourceID">
18419 <exclude /> 16014 <summary>UUID of the transaction source</summary>
18420 </member> 16015 </member>
18421 <member name="T:OpenMetaverse.Packets.TeleportStartPacket.InfoBlock"> 16016 <member name="F:OpenMetaverse.TransactionInfo.IsSourceGroup">
18422 <exclude /> 16017 <summary>Is the transaction source a group</summary>
18423 </member> 16018 </member>
18424 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket"> 16019 <member name="F:OpenMetaverse.TransactionInfo.DestID">
18425 <exclude /> 16020 <summary>UUID of the transaction destination</summary>
18426 </member> 16021 </member>
18427 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket.InfoBlock"> 16022 <member name="F:OpenMetaverse.TransactionInfo.IsDestGroup">
18428 <exclude /> 16023 <summary>Is transaction destination a group</summary>
18429 </member> 16024 </member>
18430 <member name="T:OpenMetaverse.Packets.TeleportFailedPacket.AlertInfoBlock"> 16025 <member name="F:OpenMetaverse.TransactionInfo.Amount">
18431 <exclude /> 16026 <summary>Transaction amount</summary>
18432 </member> 16027 </member>
18433 <member name="T:OpenMetaverse.Packets.UndoPacket"> 16028 <member name="F:OpenMetaverse.TransactionInfo.ItemDescription">
18434 <exclude /> 16029 <summary>Transaction description</summary>
18435 </member> 16030 </member>
18436 <member name="T:OpenMetaverse.Packets.UndoPacket.AgentDataBlock"> 16031 <member name="T:OpenMetaverse.ChatEventArgs">
18437 <exclude /> 16032 <summary>
16033
16034 </summary>
18438 </member> 16035 </member>
18439 <member name="T:OpenMetaverse.Packets.UndoPacket.ObjectDataBlock"> 16036 <member name="M:OpenMetaverse.ChatEventArgs.#ctor(OpenMetaverse.Simulator,System.String,OpenMetaverse.ChatAudibleLevel,OpenMetaverse.ChatType,OpenMetaverse.ChatSourceType,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3)">
18440 <exclude /> 16037 <summary>
16038 Construct a new instance of the ChatEventArgs object
16039 </summary>
16040 <param name="simulator">Sim from which the message originates</param>
16041 <param name="message">The message sent</param>
16042 <param name="audible">The audible level of the message</param>
16043 <param name="type">The type of message sent: whisper, shout, etc</param>
16044 <param name="sourceType">The source type of the message sender</param>
16045 <param name="fromName">The name of the agent or object sending the message</param>
16046 <param name="sourceId">The ID of the agent or object sending the message</param>
16047 <param name="ownerid">The ID of the object owner, or the agent ID sending the message</param>
16048 <param name="position">The position of the agent or object sending the message</param>
18441 </member> 16049 </member>
18442 <member name="T:OpenMetaverse.Packets.RedoPacket"> 16050 <member name="P:OpenMetaverse.ChatEventArgs.Simulator">
18443 <exclude /> 16051 <summary>Get the simulator sending the message</summary>
18444 </member> 16052 </member>
18445 <member name="T:OpenMetaverse.Packets.RedoPacket.AgentDataBlock"> 16053 <member name="P:OpenMetaverse.ChatEventArgs.Message">
18446 <exclude /> 16054 <summary>Get the message sent</summary>
18447 </member> 16055 </member>
18448 <member name="T:OpenMetaverse.Packets.RedoPacket.ObjectDataBlock"> 16056 <member name="P:OpenMetaverse.ChatEventArgs.AudibleLevel">
18449 <exclude /> 16057 <summary>Get the audible level of the message</summary>
18450 </member> 16058 </member>
18451 <member name="T:OpenMetaverse.Packets.UndoLandPacket"> 16059 <member name="P:OpenMetaverse.ChatEventArgs.Type">
18452 <exclude /> 16060 <summary>Get the type of message sent: whisper, shout, etc</summary>
18453 </member> 16061 </member>
18454 <member name="T:OpenMetaverse.Packets.UndoLandPacket.AgentDataBlock"> 16062 <member name="P:OpenMetaverse.ChatEventArgs.SourceType">
18455 <exclude /> 16063 <summary>Get the source type of the message sender</summary>
18456 </member> 16064 </member>
18457 <member name="T:OpenMetaverse.Packets.AgentPausePacket"> 16065 <member name="P:OpenMetaverse.ChatEventArgs.FromName">
18458 <exclude /> 16066 <summary>Get the name of the agent or object sending the message</summary>
18459 </member> 16067 </member>
18460 <member name="T:OpenMetaverse.Packets.AgentPausePacket.AgentDataBlock"> 16068 <member name="P:OpenMetaverse.ChatEventArgs.SourceID">
18461 <exclude /> 16069 <summary>Get the ID of the agent or object sending the message</summary>
18462 </member> 16070 </member>
18463 <member name="T:OpenMetaverse.Packets.AgentResumePacket"> 16071 <member name="P:OpenMetaverse.ChatEventArgs.OwnerID">
18464 <exclude /> 16072 <summary>Get the ID of the object owner, or the agent ID sending the message</summary>
18465 </member> 16073 </member>
18466 <member name="T:OpenMetaverse.Packets.AgentResumePacket.AgentDataBlock"> 16074 <member name="P:OpenMetaverse.ChatEventArgs.Position">
18467 <exclude /> 16075 <summary>Get the position of the agent or object sending the message</summary>
18468 </member> 16076 </member>
18469 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket"> 16077 <member name="T:OpenMetaverse.ScriptDialogEventArgs">
18470 <exclude /> 16078 <summary>Contains the data sent when a primitive opens a dialog with this agent</summary>
18471 </member> 16079 </member>
18472 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket.AgentDataBlock"> 16080 <member name="M:OpenMetaverse.ScriptDialogEventArgs.#ctor(System.String,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,System.Int32,System.Collections.Generic.List{System.String},OpenMetaverse.UUID)">
18473 <exclude /> 16081 <summary>
16082 Construct a new instance of the ScriptDialogEventArgs
16083 </summary>
16084 <param name="message">The dialog message</param>
16085 <param name="objectName">The name of the object that sent the dialog request</param>
16086 <param name="imageID">The ID of the image to be displayed</param>
16087 <param name="objectID">The ID of the primitive sending the dialog</param>
16088 <param name="firstName">The first name of the senders owner</param>
16089 <param name="lastName">The last name of the senders owner</param>
16090 <param name="chatChannel">The communication channel the dialog was sent on</param>
16091 <param name="buttons">The string labels containing the options presented in this dialog</param>
16092 <param name="ownerID">UUID of the scritped object owner</param>
18474 </member> 16093 </member>
18475 <member name="T:OpenMetaverse.Packets.ChatFromViewerPacket.ChatDataBlock"> 16094 <member name="P:OpenMetaverse.ScriptDialogEventArgs.Message">
18476 <exclude /> 16095 <summary>Get the dialog message</summary>
18477 </member> 16096 </member>
18478 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket"> 16097 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ObjectName">
18479 <exclude /> 16098 <summary>Get the name of the object that sent the dialog request</summary>
18480 </member> 16099 </member>
18481 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket.AgentDataBlock"> 16100 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ImageID">
18482 <exclude /> 16101 <summary>Get the ID of the image to be displayed</summary>
18483 </member> 16102 </member>
18484 <member name="T:OpenMetaverse.Packets.AgentThrottlePacket.ThrottleBlock"> 16103 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ObjectID">
18485 <exclude /> 16104 <summary>Get the ID of the primitive sending the dialog</summary>
18486 </member> 16105 </member>
18487 <member name="T:OpenMetaverse.Packets.AgentFOVPacket"> 16106 <member name="P:OpenMetaverse.ScriptDialogEventArgs.FirstName">
18488 <exclude /> 16107 <summary>Get the first name of the senders owner</summary>
18489 </member> 16108 </member>
18490 <member name="T:OpenMetaverse.Packets.AgentFOVPacket.AgentDataBlock"> 16109 <member name="P:OpenMetaverse.ScriptDialogEventArgs.LastName">
18491 <exclude /> 16110 <summary>Get the last name of the senders owner</summary>
18492 </member> 16111 </member>
18493 <member name="T:OpenMetaverse.Packets.AgentFOVPacket.FOVBlockBlock"> 16112 <member name="P:OpenMetaverse.ScriptDialogEventArgs.Channel">
18494 <exclude /> 16113 <summary>Get the communication channel the dialog was sent on, responses
16114 should also send responses on this same channel</summary>
18495 </member> 16115 </member>
18496 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket"> 16116 <member name="P:OpenMetaverse.ScriptDialogEventArgs.ButtonLabels">
18497 <exclude /> 16117 <summary>Get the string labels containing the options presented in this dialog</summary>
18498 </member> 16118 </member>
18499 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket.AgentDataBlock"> 16119 <member name="P:OpenMetaverse.ScriptDialogEventArgs.OwnerID">
18500 <exclude /> 16120 <summary>UUID of the scritped object owner</summary>
18501 </member> 16121 </member>
18502 <member name="T:OpenMetaverse.Packets.AgentHeightWidthPacket.HeightWidthBlockBlock"> 16122 <member name="T:OpenMetaverse.ScriptQuestionEventArgs">
18503 <exclude /> 16123 <summary>Contains the data sent when a primitive requests debit or other permissions
16124 requesting a YES or NO answer</summary>
18504 </member> 16125 </member>
18505 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket"> 16126 <member name="M:OpenMetaverse.ScriptQuestionEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.ScriptPermission)">
18506 <exclude /> 16127 <summary>
16128 Construct a new instance of the ScriptQuestionEventArgs
16129 </summary>
16130 <param name="simulator">The simulator containing the object sending the request</param>
16131 <param name="taskID">The ID of the script making the request</param>
16132 <param name="itemID">The ID of the primitive containing the script making the request</param>
16133 <param name="objectName">The name of the primitive making the request</param>
16134 <param name="objectOwner">The name of the owner of the object making the request</param>
16135 <param name="questions">The permissions being requested</param>
18507 </member> 16136 </member>
18508 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.AgentDataBlock"> 16137 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.Simulator">
18509 <exclude /> 16138 <summary>Get the simulator containing the object sending the request</summary>
18510 </member> 16139 </member>
18511 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.WearableDataBlock"> 16140 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.TaskID">
18512 <exclude /> 16141 <summary>Get the ID of the script making the request</summary>
18513 </member> 16142 </member>
18514 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.ObjectDataBlock"> 16143 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ItemID">
18515 <exclude /> 16144 <summary>Get the ID of the primitive containing the script making the request</summary>
18516 </member> 16145 </member>
18517 <member name="T:OpenMetaverse.Packets.AgentSetAppearancePacket.VisualParamBlock"> 16146 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ObjectName">
18518 <exclude /> 16147 <summary>Get the name of the primitive making the request</summary>
18519 </member> 16148 </member>
18520 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket"> 16149 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.ObjectOwnerName">
18521 <exclude /> 16150 <summary>Get the name of the owner of the object making the request</summary>
18522 </member> 16151 </member>
18523 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket.AgentDataBlock"> 16152 <member name="P:OpenMetaverse.ScriptQuestionEventArgs.Questions">
18524 <exclude /> 16153 <summary>Get the permissions being requested</summary>
18525 </member> 16154 </member>
18526 <member name="T:OpenMetaverse.Packets.AgentQuitCopyPacket.FuseBlockBlock"> 16155 <member name="T:OpenMetaverse.LoadUrlEventArgs">
18527 <exclude /> 16156 <summary>Contains the data sent when a primitive sends a request
16157 to an agent to open the specified URL</summary>
18528 </member> 16158 </member>
18529 <member name="T:OpenMetaverse.Packets.ImageNotInDatabasePacket"> 16159 <member name="M:OpenMetaverse.LoadUrlEventArgs.#ctor(System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.String,System.String)">
18530 <exclude /> 16160 <summary>
16161 Construct a new instance of the LoadUrlEventArgs
16162 </summary>
16163 <param name="objectName">The name of the object sending the request</param>
16164 <param name="objectID">The ID of the object sending the request</param>
16165 <param name="ownerID">The ID of the owner of the object sending the request</param>
16166 <param name="ownerIsGroup">True if the object is owned by a group</param>
16167 <param name="message">The message sent with the request</param>
16168 <param name="URL">The URL the object sent</param>
18531 </member> 16169 </member>
18532 <member name="T:OpenMetaverse.Packets.ImageNotInDatabasePacket.ImageIDBlock"> 16170 <member name="P:OpenMetaverse.LoadUrlEventArgs.ObjectName">
18533 <exclude /> 16171 <summary>Get the name of the object sending the request</summary>
18534 </member> 16172 </member>
18535 <member name="T:OpenMetaverse.Packets.RebakeAvatarTexturesPacket"> 16173 <member name="P:OpenMetaverse.LoadUrlEventArgs.ObjectID">
18536 <exclude /> 16174 <summary>Get the ID of the object sending the request</summary>
18537 </member> 16175 </member>
18538 <member name="T:OpenMetaverse.Packets.RebakeAvatarTexturesPacket.TextureDataBlock"> 16176 <member name="P:OpenMetaverse.LoadUrlEventArgs.OwnerID">
18539 <exclude /> 16177 <summary>Get the ID of the owner of the object sending the request</summary>
18540 </member> 16178 </member>
18541 <member name="T:OpenMetaverse.Packets.SetAlwaysRunPacket"> 16179 <member name="P:OpenMetaverse.LoadUrlEventArgs.OwnerIsGroup">
18542 <exclude /> 16180 <summary>True if the object is owned by a group</summary>
18543 </member> 16181 </member>
18544 <member name="T:OpenMetaverse.Packets.SetAlwaysRunPacket.AgentDataBlock"> 16182 <member name="P:OpenMetaverse.LoadUrlEventArgs.Message">
18545 <exclude /> 16183 <summary>Get the message sent with the request</summary>
18546 </member> 16184 </member>
18547 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket"> 16185 <member name="P:OpenMetaverse.LoadUrlEventArgs.URL">
18548 <exclude /> 16186 <summary>Get the URL the object sent</summary>
18549 </member> 16187 </member>
18550 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket.AgentDataBlock"> 16188 <member name="T:OpenMetaverse.InstantMessageEventArgs">
18551 <exclude /> 16189 <summary>The date received from an ImprovedInstantMessage</summary>
18552 </member> 16190 </member>
18553 <member name="T:OpenMetaverse.Packets.ObjectDeletePacket.ObjectDataBlock"> 16191 <member name="M:OpenMetaverse.InstantMessageEventArgs.#ctor(OpenMetaverse.InstantMessage,OpenMetaverse.Simulator)">
18554 <exclude /> 16192 <summary>
16193 Construct a new instance of the InstantMessageEventArgs object
16194 </summary>
16195 <param name="im">the InstantMessage object</param>
16196 <param name="simulator">the simulator where the InstantMessage origniated</param>
18555 </member> 16197 </member>
18556 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket"> 16198 <member name="P:OpenMetaverse.InstantMessageEventArgs.IM">
18557 <exclude /> 16199 <summary>Get the InstantMessage object</summary>
18558 </member> 16200 </member>
18559 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.AgentDataBlock"> 16201 <member name="P:OpenMetaverse.InstantMessageEventArgs.Simulator">
18560 <exclude /> 16202 <summary>Get the simulator where the InstantMessage origniated</summary>
18561 </member> 16203 </member>
18562 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.SharedDataBlock"> 16204 <member name="T:OpenMetaverse.BalanceEventArgs">
18563 <exclude /> 16205 <summary>Contains the currency balance</summary>
18564 </member> 16206 </member>
18565 <member name="T:OpenMetaverse.Packets.ObjectDuplicatePacket.ObjectDataBlock"> 16207 <member name="M:OpenMetaverse.BalanceEventArgs.#ctor(System.Int32)">
18566 <exclude /> 16208 <summary>
16209 Construct a new BalanceEventArgs object
16210 </summary>
16211 <param name="balance">The currenct balance</param>
18567 </member> 16212 </member>
18568 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket"> 16213 <member name="P:OpenMetaverse.BalanceEventArgs.Balance">
18569 <exclude /> 16214 <summary>
16215 Get the currenct balance
16216 </summary>
18570 </member> 16217 </member>
18571 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket.AgentDataBlock"> 16218 <member name="T:OpenMetaverse.MoneyBalanceReplyEventArgs">
18572 <exclude /> 16219 <summary>Contains the transaction summary when an item is purchased,
16220 money is given, or land is purchased</summary>
18573 </member> 16221 </member>
18574 <member name="T:OpenMetaverse.Packets.ObjectDuplicateOnRayPacket.ObjectDataBlock"> 16222 <member name="M:OpenMetaverse.MoneyBalanceReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,System.Int32,System.Int32,System.Int32,System.String,OpenMetaverse.TransactionInfo)">
18575 <exclude /> 16223 <summary>
16224 Construct a new instance of the MoneyBalanceReplyEventArgs object
16225 </summary>
16226 <param name="transactionID">The ID of the transaction</param>
16227 <param name="transactionSuccess">True of the transaction was successful</param>
16228 <param name="balance">The current currency balance</param>
16229 <param name="metersCredit">The meters credited</param>
16230 <param name="metersCommitted">The meters comitted</param>
16231 <param name="description">A brief description of the transaction</param>
16232 <param name="transactionInfo">Transaction info</param>
18576 </member> 16233 </member>
18577 <member name="T:OpenMetaverse.Packets.ObjectScalePacket"> 16234 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.TransactionID">
18578 <exclude /> 16235 <summary>Get the ID of the transaction</summary>
18579 </member> 16236 </member>
18580 <member name="T:OpenMetaverse.Packets.ObjectScalePacket.AgentDataBlock"> 16237 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Success">
18581 <exclude /> 16238 <summary>True of the transaction was successful</summary>
18582 </member> 16239 </member>
18583 <member name="T:OpenMetaverse.Packets.ObjectScalePacket.ObjectDataBlock"> 16240 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Balance">
18584 <exclude /> 16241 <summary>Get the remaining currency balance</summary>
18585 </member> 16242 </member>
18586 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket"> 16243 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.MetersCredit">
18587 <exclude /> 16244 <summary>Get the meters credited</summary>
18588 </member> 16245 </member>
18589 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket.AgentDataBlock"> 16246 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.MetersCommitted">
18590 <exclude /> 16247 <summary>Get the meters comitted</summary>
18591 </member> 16248 </member>
18592 <member name="T:OpenMetaverse.Packets.ObjectRotationPacket.ObjectDataBlock"> 16249 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.Description">
18593 <exclude /> 16250 <summary>Get the description of the transaction</summary>
18594 </member> 16251 </member>
18595 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket"> 16252 <member name="P:OpenMetaverse.MoneyBalanceReplyEventArgs.TransactionInfo">
18596 <exclude /> 16253 <summary>Detailed transaction information</summary>
18597 </member> 16254 </member>
18598 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket.AgentDataBlock"> 16255 <member name="T:OpenMetaverse.AgentDataReplyEventArgs">
18599 <exclude /> 16256 <summary>Data sent from the simulator containing information about your agent and active group information</summary>
18600 </member> 16257 </member>
18601 <member name="T:OpenMetaverse.Packets.ObjectFlagUpdatePacket.ExtraPhysicsBlock"> 16258 <member name="M:OpenMetaverse.AgentDataReplyEventArgs.#ctor(System.String,System.String,OpenMetaverse.UUID,System.String,OpenMetaverse.GroupPowers,System.String)">
18602 <exclude /> 16259 <summary>
16260 Construct a new instance of the AgentDataReplyEventArgs object
16261 </summary>
16262 <param name="firstName">The agents first name</param>
16263 <param name="lastName">The agents last name</param>
16264 <param name="activeGroupID">The agents active group ID</param>
16265 <param name="groupTitle">The group title of the agents active group</param>
16266 <param name="groupPowers">The combined group powers the agent has in the active group</param>
16267 <param name="groupName">The name of the group the agent has currently active</param>
18603 </member> 16268 </member>
18604 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket"> 16269 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.FirstName">
18605 <exclude /> 16270 <summary>Get the agents first name</summary>
18606 </member> 16271 </member>
18607 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket.AgentDataBlock"> 16272 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.LastName">
18608 <exclude /> 16273 <summary>Get the agents last name</summary>
18609 </member> 16274 </member>
18610 <member name="T:OpenMetaverse.Packets.ObjectClickActionPacket.ObjectDataBlock"> 16275 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.ActiveGroupID">
18611 <exclude /> 16276 <summary>Get the active group ID of your agent</summary>
18612 </member> 16277 </member>
18613 <member name="T:OpenMetaverse.Packets.ObjectImagePacket"> 16278 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupTitle">
18614 <exclude /> 16279 <summary>Get the active groups title of your agent</summary>
18615 </member> 16280 </member>
18616 <member name="T:OpenMetaverse.Packets.ObjectImagePacket.AgentDataBlock"> 16281 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupPowers">
18617 <exclude /> 16282 <summary>Get the combined group powers of your agent</summary>
18618 </member> 16283 </member>
18619 <member name="T:OpenMetaverse.Packets.ObjectImagePacket.ObjectDataBlock"> 16284 <member name="P:OpenMetaverse.AgentDataReplyEventArgs.GroupName">
18620 <exclude /> 16285 <summary>Get the active group name of your agent</summary>
18621 </member> 16286 </member>
18622 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket"> 16287 <member name="T:OpenMetaverse.AnimationsChangedEventArgs">
18623 <exclude /> 16288 <summary>Data sent by the simulator to indicate the active/changed animations
16289 applied to your agent</summary>
18624 </member> 16290 </member>
18625 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket.AgentDataBlock"> 16291 <member name="M:OpenMetaverse.AnimationsChangedEventArgs.#ctor(OpenMetaverse.InternalDictionary{OpenMetaverse.UUID,System.Int32})">
18626 <exclude /> 16292 <summary>
16293 Construct a new instance of the AnimationsChangedEventArgs class
16294 </summary>
16295 <param name="agentAnimations">The dictionary that contains the changed animations</param>
18627 </member> 16296 </member>
18628 <member name="T:OpenMetaverse.Packets.ObjectMaterialPacket.ObjectDataBlock"> 16297 <member name="P:OpenMetaverse.AnimationsChangedEventArgs.Animations">
18629 <exclude /> 16298 <summary>Get the dictionary that contains the changed animations</summary>
18630 </member> 16299 </member>
18631 <member name="T:OpenMetaverse.Packets.ObjectShapePacket"> 16300 <member name="T:OpenMetaverse.MeanCollisionEventArgs">
18632 <exclude /> 16301 <summary>
16302 Data sent from a simulator indicating a collision with your agent
16303 </summary>
18633 </member> 16304 </member>
18634 <member name="T:OpenMetaverse.Packets.ObjectShapePacket.AgentDataBlock"> 16305 <member name="M:OpenMetaverse.MeanCollisionEventArgs.#ctor(OpenMetaverse.MeanCollisionType,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Single,System.DateTime)">
18635 <exclude /> 16306 <summary>
16307 Construct a new instance of the MeanCollisionEventArgs class
16308 </summary>
16309 <param name="type">The type of collision that occurred</param>
16310 <param name="perp">The ID of the agent or object that perpetrated the agression</param>
16311 <param name="victim">The ID of the Victim</param>
16312 <param name="magnitude">The strength of the collision</param>
16313 <param name="time">The Time the collision occurred</param>
18636 </member> 16314 </member>
18637 <member name="T:OpenMetaverse.Packets.ObjectShapePacket.ObjectDataBlock"> 16315 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Type">
18638 <exclude /> 16316 <summary>Get the Type of collision</summary>
18639 </member> 16317 </member>
18640 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket"> 16318 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Aggressor">
18641 <exclude /> 16319 <summary>Get the ID of the agent or object that collided with your agent</summary>
18642 </member> 16320 </member>
18643 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket.AgentDataBlock"> 16321 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Victim">
18644 <exclude /> 16322 <summary>Get the ID of the agent that was attacked</summary>
18645 </member> 16323 </member>
18646 <member name="T:OpenMetaverse.Packets.ObjectExtraParamsPacket.ObjectDataBlock"> 16324 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Magnitude">
18647 <exclude /> 16325 <summary>A value indicating the strength of the collision</summary>
18648 </member> 16326 </member>
18649 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket"> 16327 <member name="P:OpenMetaverse.MeanCollisionEventArgs.Time">
18650 <exclude /> 16328 <summary>Get the time the collision occurred</summary>
18651 </member> 16329 </member>
18652 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.AgentDataBlock"> 16330 <member name="T:OpenMetaverse.RegionCrossedEventArgs">
18653 <exclude /> 16331 <summary>Data sent to your agent when it crosses region boundaries</summary>
18654 </member> 16332 </member>
18655 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.HeaderDataBlock"> 16333 <member name="M:OpenMetaverse.RegionCrossedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Simulator)">
18656 <exclude /> 16334 <summary>
16335 Construct a new instance of the RegionCrossedEventArgs class
16336 </summary>
16337 <param name="oldSim">The simulator your agent just left</param>
16338 <param name="newSim">The simulator your agent is now in</param>
18657 </member> 16339 </member>
18658 <member name="T:OpenMetaverse.Packets.ObjectOwnerPacket.ObjectDataBlock"> 16340 <member name="P:OpenMetaverse.RegionCrossedEventArgs.OldSimulator">
18659 <exclude /> 16341 <summary>Get the simulator your agent just left</summary>
18660 </member> 16342 </member>
18661 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket"> 16343 <member name="P:OpenMetaverse.RegionCrossedEventArgs.NewSimulator">
18662 <exclude /> 16344 <summary>Get the simulator your agent is now in</summary>
18663 </member> 16345 </member>
18664 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket.AgentDataBlock"> 16346 <member name="T:OpenMetaverse.GroupChatJoinedEventArgs">
18665 <exclude /> 16347 <summary>Data sent from the simulator when your agent joins a group chat session</summary>
18666 </member> 16348 </member>
18667 <member name="T:OpenMetaverse.Packets.ObjectGroupPacket.ObjectDataBlock"> 16349 <member name="M:OpenMetaverse.GroupChatJoinedEventArgs.#ctor(OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,System.Boolean)">
18668 <exclude /> 16350 <summary>
16351 Construct a new instance of the GroupChatJoinedEventArgs class
16352 </summary>
16353 <param name="groupChatSessionID">The ID of the session</param>
16354 <param name="sessionName">The name of the session</param>
16355 <param name="tmpSessionID">A temporary session id used for establishing new sessions</param>
16356 <param name="success">True of your agent successfully joined the session</param>
18669 </member> 16357 </member>
18670 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket"> 16358 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.SessionID">
18671 <exclude /> 16359 <summary>Get the ID of the group chat session</summary>
18672 </member> 16360 </member>
18673 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket.AgentDataBlock"> 16361 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.SessionName">
18674 <exclude /> 16362 <summary>Get the name of the session</summary>
18675 </member> 16363 </member>
18676 <member name="T:OpenMetaverse.Packets.ObjectBuyPacket.ObjectDataBlock"> 16364 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.TmpSessionID">
18677 <exclude /> 16365 <summary>Get the temporary session ID used for establishing new sessions</summary>
18678 </member> 16366 </member>
18679 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket"> 16367 <member name="P:OpenMetaverse.GroupChatJoinedEventArgs.Success">
18680 <exclude /> 16368 <summary>True if your agent successfully joined the session</summary>
18681 </member> 16369 </member>
18682 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket.AgentDataBlock"> 16370 <member name="T:OpenMetaverse.AlertMessageEventArgs">
18683 <exclude /> 16371 <summary>Data sent by the simulator containing urgent messages</summary>
18684 </member> 16372 </member>
18685 <member name="T:OpenMetaverse.Packets.BuyObjectInventoryPacket.DataBlock"> 16373 <member name="M:OpenMetaverse.AlertMessageEventArgs.#ctor(System.String)">
18686 <exclude /> 16374 <summary>
16375 Construct a new instance of the AlertMessageEventArgs class
16376 </summary>
16377 <param name="message">The alert message</param>
18687 </member> 16378 </member>
18688 <member name="T:OpenMetaverse.Packets.DerezContainerPacket"> 16379 <member name="P:OpenMetaverse.AlertMessageEventArgs.Message">
18689 <exclude /> 16380 <summary>Get the alert message</summary>
18690 </member> 16381 </member>
18691 <member name="T:OpenMetaverse.Packets.DerezContainerPacket.DataBlock"> 16382 <member name="T:OpenMetaverse.ScriptControlEventArgs">
18692 <exclude /> 16383 <summary>Data sent by a script requesting to take or release specified controls to your agent</summary>
18693 </member> 16384 </member>
18694 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket"> 16385 <member name="M:OpenMetaverse.ScriptControlEventArgs.#ctor(OpenMetaverse.ScriptControlChange,System.Boolean,System.Boolean)">
18695 <exclude /> 16386 <summary>
16387 Construct a new instance of the ScriptControlEventArgs class
16388 </summary>
16389 <param name="controls">The controls the script is attempting to take or release to the agent</param>
16390 <param name="pass">True if the script is passing controls back to the agent</param>
16391 <param name="take">True if the script is requesting controls be released to the script</param>
18696 </member> 16392 </member>
18697 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.AgentDataBlock"> 16393 <member name="P:OpenMetaverse.ScriptControlEventArgs.Controls">
18698 <exclude /> 16394 <summary>Get the controls the script is attempting to take or release to the agent</summary>
18699 </member> 16395 </member>
18700 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.HeaderDataBlock"> 16396 <member name="P:OpenMetaverse.ScriptControlEventArgs.Pass">
18701 <exclude /> 16397 <summary>True if the script is passing controls back to the agent</summary>
18702 </member> 16398 </member>
18703 <member name="T:OpenMetaverse.Packets.ObjectPermissionsPacket.ObjectDataBlock"> 16399 <member name="P:OpenMetaverse.ScriptControlEventArgs.Take">
18704 <exclude /> 16400 <summary>True if the script is requesting controls be released to the script</summary>
18705 </member> 16401 </member>
18706 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket"> 16402 <member name="T:OpenMetaverse.CameraConstraintEventArgs">
18707 <exclude /> 16403 <summary>
16404 Data sent from the simulator to an agent to indicate its view limits
16405 </summary>
18708 </member> 16406 </member>
18709 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket.AgentDataBlock"> 16407 <member name="M:OpenMetaverse.CameraConstraintEventArgs.#ctor(OpenMetaverse.Vector4)">
18710 <exclude /> 16408 <summary>
16409 Construct a new instance of the CameraConstraintEventArgs class
16410 </summary>
16411 <param name="collidePlane">The collision plane</param>
18711 </member> 16412 </member>
18712 <member name="T:OpenMetaverse.Packets.ObjectSaleInfoPacket.ObjectDataBlock"> 16413 <member name="P:OpenMetaverse.CameraConstraintEventArgs.CollidePlane">
18713 <exclude /> 16414 <summary>Get the collision plane</summary>
18714 </member> 16415 </member>
18715 <member name="T:OpenMetaverse.Packets.ObjectNamePacket"> 16416 <member name="T:OpenMetaverse.ScriptSensorReplyEventArgs">
18716 <exclude /> 16417 <summary>
16418 Data containing script sensor requests which allow an agent to know the specific details
16419 of a primitive sending script sensor requests
16420 </summary>
18717 </member> 16421 </member>
18718 <member name="T:OpenMetaverse.Packets.ObjectNamePacket.AgentDataBlock"> 16422 <member name="M:OpenMetaverse.ScriptSensorReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Vector3,System.Single,OpenMetaverse.Quaternion,OpenMetaverse.ScriptSensorTypeFlags,OpenMetaverse.Vector3)">
18719 <exclude /> 16423 <summary>
16424 Construct a new instance of the ScriptSensorReplyEventArgs
16425 </summary>
16426 <param name="requestorID">The ID of the primitive sending the sensor</param>
16427 <param name="groupID">The ID of the group associated with the primitive</param>
16428 <param name="name">The name of the primitive sending the sensor</param>
16429 <param name="objectID">The ID of the primitive sending the sensor</param>
16430 <param name="ownerID">The ID of the owner of the primitive sending the sensor</param>
16431 <param name="position">The position of the primitive sending the sensor</param>
16432 <param name="range">The range the primitive specified to scan</param>
16433 <param name="rotation">The rotation of the primitive sending the sensor</param>
16434 <param name="type">The type of sensor the primitive sent</param>
16435 <param name="velocity">The velocity of the primitive sending the sensor</param>
18720 </member> 16436 </member>
18721 <member name="T:OpenMetaverse.Packets.ObjectNamePacket.ObjectDataBlock"> 16437 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.RequestorID">
18722 <exclude /> 16438 <summary>Get the ID of the primitive sending the sensor</summary>
18723 </member> 16439 </member>
18724 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket"> 16440 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.GroupID">
18725 <exclude /> 16441 <summary>Get the ID of the group associated with the primitive</summary>
18726 </member> 16442 </member>
18727 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket.AgentDataBlock"> 16443 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Name">
18728 <exclude /> 16444 <summary>Get the name of the primitive sending the sensor</summary>
18729 </member> 16445 </member>
18730 <member name="T:OpenMetaverse.Packets.ObjectDescriptionPacket.ObjectDataBlock"> 16446 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.ObjectID">
18731 <exclude /> 16447 <summary>Get the ID of the primitive sending the sensor</summary>
18732 </member> 16448 </member>
18733 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket"> 16449 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.OwnerID">
18734 <exclude /> 16450 <summary>Get the ID of the owner of the primitive sending the sensor</summary>
18735 </member> 16451 </member>
18736 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket.AgentDataBlock"> 16452 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Position">
18737 <exclude /> 16453 <summary>Get the position of the primitive sending the sensor</summary>
18738 </member> 16454 </member>
18739 <member name="T:OpenMetaverse.Packets.ObjectCategoryPacket.ObjectDataBlock"> 16455 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Range">
18740 <exclude /> 16456 <summary>Get the range the primitive specified to scan</summary>
18741 </member> 16457 </member>
18742 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket"> 16458 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Rotation">
18743 <exclude /> 16459 <summary>Get the rotation of the primitive sending the sensor</summary>
18744 </member> 16460 </member>
18745 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket.AgentDataBlock"> 16461 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Type">
18746 <exclude /> 16462 <summary>Get the type of sensor the primitive sent</summary>
18747 </member> 16463 </member>
18748 <member name="T:OpenMetaverse.Packets.ObjectSelectPacket.ObjectDataBlock"> 16464 <member name="P:OpenMetaverse.ScriptSensorReplyEventArgs.Velocity">
18749 <exclude /> 16465 <summary>Get the velocity of the primitive sending the sensor</summary>
18750 </member> 16466 </member>
18751 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket"> 16467 <member name="T:OpenMetaverse.AvatarSitResponseEventArgs">
18752 <exclude /> 16468 <summary>Contains the response data returned from the simulator in response to a <see cref="!:RequestSit"/></summary>
18753 </member> 16469 </member>
18754 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket.AgentDataBlock"> 16470 <member name="M:OpenMetaverse.AvatarSitResponseEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Boolean,OpenMetaverse.Vector3,OpenMetaverse.Quaternion)">
18755 <exclude /> 16471 <summary>Construct a new instance of the AvatarSitResponseEventArgs object</summary>
18756 </member> 16472 </member>
18757 <member name="T:OpenMetaverse.Packets.ObjectDeselectPacket.ObjectDataBlock"> 16473 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.ObjectID">
18758 <exclude /> 16474 <summary>Get the ID of the primitive the agent will be sitting on</summary>
18759 </member> 16475 </member>
18760 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket"> 16476 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.Autopilot">
18761 <exclude /> 16477 <summary>True if the simulator Autopilot functions were involved</summary>
18762 </member> 16478 </member>
18763 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket.AgentDataBlock"> 16479 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.CameraAtOffset">
18764 <exclude /> 16480 <summary>Get the camera offset of the agent when seated</summary>
18765 </member> 16481 </member>
18766 <member name="T:OpenMetaverse.Packets.ObjectAttachPacket.ObjectDataBlock"> 16482 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.CameraEyeOffset">
18767 <exclude /> 16483 <summary>Get the camera eye offset of the agent when seated</summary>
18768 </member> 16484 </member>
18769 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket"> 16485 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.ForceMouselook">
18770 <exclude /> 16486 <summary>True of the agent will be in mouselook mode when seated</summary>
18771 </member> 16487 </member>
18772 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket.AgentDataBlock"> 16488 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.SitPosition">
18773 <exclude /> 16489 <summary>Get the position of the agent when seated</summary>
18774 </member> 16490 </member>
18775 <member name="T:OpenMetaverse.Packets.ObjectDetachPacket.ObjectDataBlock"> 16491 <member name="P:OpenMetaverse.AvatarSitResponseEventArgs.SitRotation">
18776 <exclude /> 16492 <summary>Get the rotation of the agent when seated</summary>
18777 </member> 16493 </member>
18778 <member name="T:OpenMetaverse.Packets.ObjectDropPacket"> 16494 <member name="T:OpenMetaverse.ChatSessionMemberAddedEventArgs">
18779 <exclude /> 16495 <summary>Data sent when an agent joins a chat session your agent is currently participating in</summary>
18780 </member> 16496 </member>
18781 <member name="T:OpenMetaverse.Packets.ObjectDropPacket.AgentDataBlock"> 16497 <member name="M:OpenMetaverse.ChatSessionMemberAddedEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID)">
18782 <exclude /> 16498 <summary>
16499 Construct a new instance of the ChatSessionMemberAddedEventArgs object
16500 </summary>
16501 <param name="sessionID">The ID of the chat session</param>
16502 <param name="agentID">The ID of the agent joining</param>
18783 </member> 16503 </member>
18784 <member name="T:OpenMetaverse.Packets.ObjectDropPacket.ObjectDataBlock"> 16504 <member name="P:OpenMetaverse.ChatSessionMemberAddedEventArgs.SessionID">
18785 <exclude /> 16505 <summary>Get the ID of the chat session</summary>
18786 </member> 16506 </member>
18787 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket"> 16507 <member name="P:OpenMetaverse.ChatSessionMemberAddedEventArgs.AgentID">
18788 <exclude /> 16508 <summary>Get the ID of the agent that joined</summary>
18789 </member> 16509 </member>
18790 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket.AgentDataBlock"> 16510 <member name="T:OpenMetaverse.ChatSessionMemberLeftEventArgs">
18791 <exclude /> 16511 <summary>Data sent when an agent exits a chat session your agent is currently participating in</summary>
18792 </member> 16512 </member>
18793 <member name="T:OpenMetaverse.Packets.ObjectLinkPacket.ObjectDataBlock"> 16513 <member name="M:OpenMetaverse.ChatSessionMemberLeftEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID)">
18794 <exclude /> 16514 <summary>
16515 Construct a new instance of the ChatSessionMemberLeftEventArgs object
16516 </summary>
16517 <param name="sessionID">The ID of the chat session</param>
16518 <param name="agentID">The ID of the Agent that left</param>
18795 </member> 16519 </member>
18796 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket"> 16520 <member name="P:OpenMetaverse.ChatSessionMemberLeftEventArgs.SessionID">
18797 <exclude /> 16521 <summary>Get the ID of the chat session</summary>
18798 </member> 16522 </member>
18799 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket.AgentDataBlock"> 16523 <member name="P:OpenMetaverse.ChatSessionMemberLeftEventArgs.AgentID">
18800 <exclude /> 16524 <summary>Get the ID of the agent that left</summary>
18801 </member> 16525 </member>
18802 <member name="T:OpenMetaverse.Packets.ObjectDelinkPacket.ObjectDataBlock"> 16526 <member name="T:OpenMetaverse.SetDisplayNameReplyEventArgs">
18803 <exclude /> 16527 <summary>Event arguments with the result of setting display name operation</summary>
18804 </member> 16528 </member>
18805 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket"> 16529 <member name="M:OpenMetaverse.SetDisplayNameReplyEventArgs.#ctor(System.Int32,System.String,OpenMetaverse.AgentDisplayName)">
18806 <exclude /> 16530 <summary>Default constructor</summary>
18807 </member> 16531 </member>
18808 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.AgentDataBlock"> 16532 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.Status">
18809 <exclude /> 16533 <summary>Status code, 200 indicates settign display name was successful</summary>
18810 </member> 16534 </member>
18811 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.ObjectDataBlock"> 16535 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.Reason">
18812 <exclude /> 16536 <summary>Textual description of the status</summary>
18813 </member> 16537 </member>
18814 <member name="T:OpenMetaverse.Packets.ObjectGrabPacket.SurfaceInfoBlock"> 16538 <member name="P:OpenMetaverse.SetDisplayNameReplyEventArgs.DisplayName">
18815 <exclude /> 16539 <summary>Details of the newly set display name</summary>
18816 </member> 16540 </member>
18817 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket"> 16541 <member name="T:OpenMetaverse.Rendering.IRendering">
18818 <exclude /> 16542 <summary>
16543 Abstract base for rendering plugins
16544 </summary>
18819 </member> 16545 </member>
18820 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.AgentDataBlock"> 16546 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateSimpleMesh(OpenMetaverse.Primitive,OpenMetaverse.Rendering.DetailLevel)">
18821 <exclude /> 16547 <summary>
16548 Generates a basic mesh structure from a primitive
16549 </summary>
16550 <param name="prim">Primitive to generate the mesh from</param>
16551 <param name="lod">Level of detail to generate the mesh at</param>
16552 <returns>The generated mesh</returns>
18822 </member> 16553 </member>
18823 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.ObjectDataBlock"> 16554 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateSimpleSculptMesh(OpenMetaverse.Primitive,System.Drawing.Bitmap,OpenMetaverse.Rendering.DetailLevel)">
18824 <exclude /> 16555 <summary>
16556 Generates a basic mesh structure from a sculpted primitive and
16557 texture
16558 </summary>
16559 <param name="prim">Sculpted primitive to generate the mesh from</param>
16560 <param name="sculptTexture">Sculpt texture</param>
16561 <param name="lod">Level of detail to generate the mesh at</param>
16562 <returns>The generated mesh</returns>
18825 </member> 16563 </member>
18826 <member name="T:OpenMetaverse.Packets.ObjectGrabUpdatePacket.SurfaceInfoBlock"> 16564 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateFacetedMesh(OpenMetaverse.Primitive,OpenMetaverse.Rendering.DetailLevel)">
18827 <exclude /> 16565 <summary>
16566 Generates a series of faces, each face containing a mesh and
16567 metadata
16568 </summary>
16569 <param name="prim">Primitive to generate the mesh from</param>
16570 <param name="lod">Level of detail to generate the mesh at</param>
16571 <returns>The generated mesh</returns>
18828 </member> 16572 </member>
18829 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket"> 16573 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateFacetedSculptMesh(OpenMetaverse.Primitive,System.Drawing.Bitmap,OpenMetaverse.Rendering.DetailLevel)">
18830 <exclude /> 16574 <summary>
16575 Generates a series of faces for a sculpted prim, each face
16576 containing a mesh and metadata
16577 </summary>
16578 <param name="prim">Sculpted primitive to generate the mesh from</param>
16579 <param name="sculptTexture">Sculpt texture</param>
16580 <param name="lod">Level of detail to generate the mesh at</param>
16581 <returns>The generated mesh</returns>
18831 </member> 16582 </member>
18832 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.AgentDataBlock"> 16583 <member name="M:OpenMetaverse.Rendering.IRendering.TransformTexCoords(System.Collections.Generic.List{OpenMetaverse.Rendering.Vertex},OpenMetaverse.Vector3,OpenMetaverse.Primitive.TextureEntryFace,OpenMetaverse.Vector3)">
18833 <exclude /> 16584 <summary>
16585 Apply texture coordinate modifications from a
16586 <seealso cref="!:TextureEntryFace"/> to a list of vertices
16587 </summary>
16588 <param name="vertices">Vertex list to modify texture coordinates for</param>
16589 <param name="center">Center-point of the face</param>
16590 <param name="teFace">Face texture parameters</param>
16591 <param name="primScale">Scale of the prim</param>
18834 </member> 16592 </member>
18835 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.ObjectDataBlock"> 16593 <member name="T:OpenMetaverse.Assets.AssetMesh">
18836 <exclude /> 16594 <summary>
16595 Represents Mesh asset
16596 </summary>
18837 </member> 16597 </member>
18838 <member name="T:OpenMetaverse.Packets.ObjectDeGrabPacket.SurfaceInfoBlock"> 16598 <member name="F:OpenMetaverse.Assets.AssetMesh.MeshData">
18839 <exclude /> 16599 <summary>
16600 Decoded mesh data
16601 </summary>
18840 </member> 16602 </member>
18841 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket"> 16603 <member name="M:OpenMetaverse.Assets.AssetMesh.#ctor">
18842 <exclude /> 16604 <summary>Initializes a new instance of an AssetMesh object</summary>
18843 </member> 16605 </member>
18844 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket.AgentDataBlock"> 16606 <member name="M:OpenMetaverse.Assets.AssetMesh.#ctor(OpenMetaverse.UUID,System.Byte[])">
18845 <exclude /> 16607 <summary>Initializes a new instance of an AssetMesh object with parameters</summary>
16608 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
16609 <param name="assetData">A byte array containing the raw asset data</param>
18846 </member> 16610 </member>
18847 <member name="T:OpenMetaverse.Packets.ObjectSpinStartPacket.ObjectDataBlock"> 16611 <member name="M:OpenMetaverse.Assets.AssetMesh.Encode">
18848 <exclude /> 16612 <summary>
16613 TODO: Encodes Collada file into LLMesh format
16614 </summary>
18849 </member> 16615 </member>
18850 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket"> 16616 <member name="M:OpenMetaverse.Assets.AssetMesh.Decode">
18851 <exclude /> 16617 <summary>
16618 Decodes mesh asset. See <see cref="M:OpenMetaverse.Rendering.FacetedMesh.TryDecodeFromAsset(OpenMetaverse.Primitive,OpenMetaverse.Assets.AssetMesh,OpenMetaverse.Rendering.DetailLevel,OpenMetaverse.Rendering.FacetedMesh@)"/>
16619 to furter decode it for rendering</summary>
16620 <returns>true</returns>
18852 </member> 16621 </member>
18853 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket.AgentDataBlock"> 16622 <member name="P:OpenMetaverse.Assets.AssetMesh.AssetType">
18854 <exclude /> 16623 <summary>Override the base classes AssetType</summary>
18855 </member> 16624 </member>
18856 <member name="T:OpenMetaverse.Packets.ObjectSpinUpdatePacket.ObjectDataBlock"> 16625 <member name="T:OpenMetaverse.Assets.AssetsArchiver">
18857 <exclude /> 16626 <summary>
16627 Archives assets
16628 </summary>
18858 </member> 16629 </member>
18859 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket"> 16630 <member name="F:OpenMetaverse.Assets.AssetsArchiver.m_assets">
18860 <exclude /> 16631 <summary>
16632 Archive assets
16633 </summary>
18861 </member> 16634 </member>
18862 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket.AgentDataBlock"> 16635 <member name="M:OpenMetaverse.Assets.AssetsArchiver.Archive(OpenMetaverse.Assets.TarArchiveWriter)">
18863 <exclude /> 16636 <summary>
16637 Archive the assets given to this archiver to the given archive.
16638 </summary>
16639 <param name="archive"></param>
18864 </member> 16640 </member>
18865 <member name="T:OpenMetaverse.Packets.ObjectSpinStopPacket.ObjectDataBlock"> 16641 <member name="M:OpenMetaverse.Assets.AssetsArchiver.WriteMetadata(OpenMetaverse.Assets.TarArchiveWriter)">
18866 <exclude /> 16642 <summary>
16643 Write an assets metadata file to the given archive
16644 </summary>
16645 <param name="archive"></param>
18867 </member> 16646 </member>
18868 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket"> 16647 <member name="M:OpenMetaverse.Assets.AssetsArchiver.WriteData(OpenMetaverse.Assets.TarArchiveWriter)">
18869 <exclude /> 16648 <summary>
16649 Write asset data files to the given archive
16650 </summary>
16651 <param name="archive"></param>
18870 </member> 16652 </member>
18871 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket.AgentDataBlock"> 16653 <member name="T:OpenMetaverse.GroupMember">
18872 <exclude /> 16654 <summary>
16655 Avatar group management
16656 </summary>
18873 </member> 16657 </member>
18874 <member name="T:OpenMetaverse.Packets.ObjectExportSelectedPacket.ObjectDataBlock"> 16658 <member name="F:OpenMetaverse.GroupMember.ID">
18875 <exclude /> 16659 <summary>Key of Group Member</summary>
18876 </member> 16660 </member>
18877 <member name="T:OpenMetaverse.Packets.ModifyLandPacket"> 16661 <member name="F:OpenMetaverse.GroupMember.Contribution">
18878 <exclude /> 16662 <summary>Total land contribution</summary>
18879 </member> 16663 </member>
18880 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.AgentDataBlock"> 16664 <member name="F:OpenMetaverse.GroupMember.OnlineStatus">
18881 <exclude /> 16665 <summary>Online status information</summary>
18882 </member> 16666 </member>
18883 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ModifyBlockBlock"> 16667 <member name="F:OpenMetaverse.GroupMember.Powers">
18884 <exclude /> 16668 <summary>Abilities that the Group Member has</summary>
18885 </member> 16669 </member>
18886 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ParcelDataBlock"> 16670 <member name="F:OpenMetaverse.GroupMember.Title">
18887 <exclude /> 16671 <summary>Current group title</summary>
18888 </member> 16672 </member>
18889 <member name="T:OpenMetaverse.Packets.ModifyLandPacket.ModifyBlockExtendedBlock"> 16673 <member name="F:OpenMetaverse.GroupMember.IsOwner">
18890 <exclude /> 16674 <summary>Is a group owner</summary>
18891 </member> 16675 </member>
18892 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOnPacket"> 16676 <member name="T:OpenMetaverse.GroupRole">
18893 <exclude /> 16677 <summary>
16678 Role manager for a group
16679 </summary>
18894 </member> 16680 </member>
18895 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOnPacket.AgentDataBlock"> 16681 <member name="F:OpenMetaverse.GroupRole.GroupID">
18896 <exclude /> 16682 <summary>Key of the group</summary>
18897 </member> 16683 </member>
18898 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOffPacket"> 16684 <member name="F:OpenMetaverse.GroupRole.ID">
18899 <exclude /> 16685 <summary>Key of Role</summary>
18900 </member> 16686 </member>
18901 <member name="T:OpenMetaverse.Packets.VelocityInterpolateOffPacket.AgentDataBlock"> 16687 <member name="F:OpenMetaverse.GroupRole.Name">
18902 <exclude /> 16688 <summary>Name of Role</summary>
18903 </member> 16689 </member>
18904 <member name="T:OpenMetaverse.Packets.StateSavePacket"> 16690 <member name="F:OpenMetaverse.GroupRole.Title">
18905 <exclude /> 16691 <summary>Group Title associated with Role</summary>
18906 </member> 16692 </member>
18907 <member name="T:OpenMetaverse.Packets.StateSavePacket.AgentDataBlock"> 16693 <member name="F:OpenMetaverse.GroupRole.Description">
18908 <exclude /> 16694 <summary>Description of Role</summary>
18909 </member> 16695 </member>
18910 <member name="T:OpenMetaverse.Packets.StateSavePacket.DataBlockBlock"> 16696 <member name="F:OpenMetaverse.GroupRole.Powers">
18911 <exclude /> 16697 <summary>Abilities Associated with Role</summary>
18912 </member> 16698 </member>
18913 <member name="T:OpenMetaverse.Packets.ReportAutosaveCrashPacket"> 16699 <member name="M:OpenMetaverse.GroupRole.ToString">
18914 <exclude /> 16700 <summary>Returns the role's title</summary>
16701 <returns>The role's title</returns>
18915 </member> 16702 </member>
18916 <member name="T:OpenMetaverse.Packets.ReportAutosaveCrashPacket.AutosaveDataBlock"> 16703 <member name="T:OpenMetaverse.GroupTitle">
18917 <exclude /> 16704 <summary>
16705 Class to represent Group Title
16706 </summary>
18918 </member> 16707 </member>
18919 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket"> 16708 <member name="F:OpenMetaverse.GroupTitle.GroupID">
18920 <exclude /> 16709 <summary>Key of the group</summary>
18921 </member> 16710 </member>
18922 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket.AgentDataBlock"> 16711 <member name="F:OpenMetaverse.GroupTitle.RoleID">
18923 <exclude /> 16712 <summary>ID of the role title belongs to</summary>
18924 </member> 16713 </member>
18925 <member name="T:OpenMetaverse.Packets.SimWideDeletesPacket.DataBlockBlock"> 16714 <member name="F:OpenMetaverse.GroupTitle.Title">
18926 <exclude /> 16715 <summary>Group Title</summary>
18927 </member> 16716 </member>
18928 <member name="T:OpenMetaverse.Packets.TrackAgentPacket"> 16717 <member name="F:OpenMetaverse.GroupTitle.Selected">
18929 <exclude /> 16718 <summary>Whether title is Active</summary>
18930 </member> 16719 </member>
18931 <member name="T:OpenMetaverse.Packets.TrackAgentPacket.AgentDataBlock"> 16720 <member name="M:OpenMetaverse.GroupTitle.ToString">
18932 <exclude /> 16721 <summary>Returns group title</summary>
18933 </member> 16722 </member>
18934 <member name="T:OpenMetaverse.Packets.TrackAgentPacket.TargetDataBlock"> 16723 <member name="T:OpenMetaverse.Group">
18935 <exclude /> 16724 <summary>
16725 Represents a group on the grid
16726 </summary>
18936 </member> 16727 </member>
18937 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket"> 16728 <member name="F:OpenMetaverse.Group.ID">
18938 <exclude /> 16729 <summary>Key of Group</summary>
18939 </member> 16730 </member>
18940 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.AgentDataBlock"> 16731 <member name="F:OpenMetaverse.Group.InsigniaID">
18941 <exclude /> 16732 <summary>Key of Group Insignia</summary>
18942 </member> 16733 </member>
18943 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.DownloadTotalsBlock"> 16734 <member name="F:OpenMetaverse.Group.FounderID">
18944 <exclude /> 16735 <summary>Key of Group Founder</summary>
18945 </member> 16736 </member>
18946 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.NetStatsBlock"> 16737 <member name="F:OpenMetaverse.Group.OwnerRole">
18947 <exclude /> 16738 <summary>Key of Group Role for Owners</summary>
18948 </member> 16739 </member>
18949 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.FailStatsBlock"> 16740 <member name="F:OpenMetaverse.Group.Name">
18950 <exclude /> 16741 <summary>Name of Group</summary>
18951 </member> 16742 </member>
18952 <member name="T:OpenMetaverse.Packets.ViewerStatsPacket.MiscStatsBlock"> 16743 <member name="F:OpenMetaverse.Group.Charter">
18953 <exclude /> 16744 <summary>Text of Group Charter</summary>
18954 </member> 16745 </member>
18955 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket"> 16746 <member name="F:OpenMetaverse.Group.MemberTitle">
18956 <exclude /> 16747 <summary>Title of "everyone" role</summary>
18957 </member> 16748 </member>
18958 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket.AgentDataBlock"> 16749 <member name="F:OpenMetaverse.Group.OpenEnrollment">
18959 <exclude /> 16750 <summary>Is the group open for enrolement to everyone</summary>
18960 </member> 16751 </member>
18961 <member name="T:OpenMetaverse.Packets.ScriptAnswerYesPacket.DataBlock"> 16752 <member name="F:OpenMetaverse.Group.ShowInList">
18962 <exclude /> 16753 <summary>Will group show up in search</summary>
18963 </member> 16754 </member>
18964 <member name="T:OpenMetaverse.Packets.UserReportPacket"> 16755 <member name="F:OpenMetaverse.Group.Powers">
18965 <exclude /> 16756 <summary></summary>
18966 </member> 16757 </member>
18967 <member name="T:OpenMetaverse.Packets.UserReportPacket.AgentDataBlock"> 16758 <member name="F:OpenMetaverse.Group.AcceptNotices">
18968 <exclude /> 16759 <summary></summary>
18969 </member> 16760 </member>
18970 <member name="T:OpenMetaverse.Packets.UserReportPacket.ReportDataBlock"> 16761 <member name="F:OpenMetaverse.Group.AllowPublish">
18971 <exclude /> 16762 <summary></summary>
18972 </member> 16763 </member>
18973 <member name="T:OpenMetaverse.Packets.AlertMessagePacket"> 16764 <member name="F:OpenMetaverse.Group.MaturePublish">
18974 <exclude /> 16765 <summary>Is the group Mature</summary>
18975 </member> 16766 </member>
18976 <member name="T:OpenMetaverse.Packets.AlertMessagePacket.AlertDataBlock"> 16767 <member name="F:OpenMetaverse.Group.MembershipFee">
18977 <exclude /> 16768 <summary>Cost of group membership</summary>
18978 </member> 16769 </member>
18979 <member name="T:OpenMetaverse.Packets.AlertMessagePacket.AlertInfoBlock"> 16770 <member name="F:OpenMetaverse.Group.Money">
18980 <exclude /> 16771 <summary></summary>
18981 </member> 16772 </member>
18982 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket"> 16773 <member name="F:OpenMetaverse.Group.Contribution">
18983 <exclude /> 16774 <summary></summary>
18984 </member> 16775 </member>
18985 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket.AgentDataBlock"> 16776 <member name="F:OpenMetaverse.Group.GroupMembershipCount">
18986 <exclude /> 16777 <summary>The total number of current members this group has</summary>
18987 </member> 16778 </member>
18988 <member name="T:OpenMetaverse.Packets.AgentAlertMessagePacket.AlertDataBlock"> 16779 <member name="F:OpenMetaverse.Group.GroupRolesCount">
18989 <exclude /> 16780 <summary>The number of roles this group has configured</summary>
18990 </member> 16781 </member>
18991 <member name="T:OpenMetaverse.Packets.MeanCollisionAlertPacket"> 16782 <member name="F:OpenMetaverse.Group.ListInProfile">
18992 <exclude /> 16783 <summary>Show this group in agent's profile</summary>
18993 </member> 16784 </member>
18994 <member name="T:OpenMetaverse.Packets.MeanCollisionAlertPacket.MeanCollisionBlock"> 16785 <member name="M:OpenMetaverse.Group.ToString">
18995 <exclude /> 16786 <summary>Returns the name of the group</summary>
16787 <returns>A string containing the name of the group</returns>
18996 </member> 16788 </member>
18997 <member name="T:OpenMetaverse.Packets.ViewerFrozenMessagePacket"> 16789 <member name="T:OpenMetaverse.Vote">
18998 <exclude /> 16790 <summary>
16791 A group Vote
16792 </summary>
18999 </member> 16793 </member>
19000 <member name="T:OpenMetaverse.Packets.ViewerFrozenMessagePacket.FrozenDataBlock"> 16794 <member name="F:OpenMetaverse.Vote.Candidate">
19001 <exclude /> 16795 <summary>Key of Avatar who created Vote</summary>
19002 </member> 16796 </member>
19003 <member name="T:OpenMetaverse.Packets.HealthMessagePacket"> 16797 <member name="F:OpenMetaverse.Vote.VoteString">
19004 <exclude /> 16798 <summary>Text of the Vote proposal</summary>
19005 </member> 16799 </member>
19006 <member name="T:OpenMetaverse.Packets.HealthMessagePacket.HealthDataBlock"> 16800 <member name="F:OpenMetaverse.Vote.NumVotes">
19007 <exclude /> 16801 <summary>Total number of votes</summary>
19008 </member> 16802 </member>
19009 <member name="T:OpenMetaverse.Packets.ChatFromSimulatorPacket"> 16803 <member name="T:OpenMetaverse.GroupProposal">
19010 <exclude /> 16804 <summary>
16805 A group proposal
16806 </summary>
19011 </member> 16807 </member>
19012 <member name="T:OpenMetaverse.Packets.ChatFromSimulatorPacket.ChatDataBlock"> 16808 <member name="F:OpenMetaverse.GroupProposal.VoteText">
19013 <exclude /> 16809 <summary>The Text of the proposal</summary>
19014 </member> 16810 </member>
19015 <member name="T:OpenMetaverse.Packets.SimStatsPacket"> 16811 <member name="F:OpenMetaverse.GroupProposal.Quorum">
19016 <exclude /> 16812 <summary>The minimum number of members that must vote before proposal passes or failes</summary>
19017 </member> 16813 </member>
19018 <member name="T:OpenMetaverse.Packets.SimStatsPacket.RegionBlock"> 16814 <member name="F:OpenMetaverse.GroupProposal.Majority">
19019 <exclude /> 16815 <summary>The required ration of yes/no votes required for vote to pass</summary>
16816 <remarks>The three options are Simple Majority, 2/3 Majority, and Unanimous</remarks>
16817 TODO: this should be an enum
19020 </member> 16818 </member>
19021 <member name="T:OpenMetaverse.Packets.SimStatsPacket.StatBlock"> 16819 <member name="F:OpenMetaverse.GroupProposal.Duration">
19022 <exclude /> 16820 <summary>The duration in days votes are accepted</summary>
19023 </member> 16821 </member>
19024 <member name="T:OpenMetaverse.Packets.SimStatsPacket.PidStatBlock"> 16822 <member name="T:OpenMetaverse.GroupAccountSummary">
19025 <exclude /> 16823 <summary>
16824
16825 </summary>
19026 </member> 16826 </member>
19027 <member name="T:OpenMetaverse.Packets.RequestRegionInfoPacket"> 16827 <member name="F:OpenMetaverse.GroupAccountSummary.IntervalDays">
19028 <exclude /> 16828 <summary></summary>
19029 </member> 16829 </member>
19030 <member name="T:OpenMetaverse.Packets.RequestRegionInfoPacket.AgentDataBlock"> 16830 <member name="F:OpenMetaverse.GroupAccountSummary.CurrentInterval">
19031 <exclude /> 16831 <summary></summary>
19032 </member> 16832 </member>
19033 <member name="T:OpenMetaverse.Packets.RegionInfoPacket"> 16833 <member name="F:OpenMetaverse.GroupAccountSummary.StartDate">
19034 <exclude /> 16834 <summary></summary>
19035 </member> 16835 </member>
19036 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.AgentDataBlock"> 16836 <member name="F:OpenMetaverse.GroupAccountSummary.Balance">
19037 <exclude /> 16837 <summary></summary>
19038 </member> 16838 </member>
19039 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.RegionInfoBlock"> 16839 <member name="F:OpenMetaverse.GroupAccountSummary.TotalCredits">
19040 <exclude /> 16840 <summary></summary>
19041 </member> 16841 </member>
19042 <member name="T:OpenMetaverse.Packets.RegionInfoPacket.RegionInfo2Block"> 16842 <member name="F:OpenMetaverse.GroupAccountSummary.TotalDebits">
19043 <exclude /> 16843 <summary></summary>
19044 </member> 16844 </member>
19045 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket"> 16845 <member name="F:OpenMetaverse.GroupAccountSummary.ObjectTaxCurrent">
19046 <exclude /> 16846 <summary></summary>
19047 </member> 16847 </member>
19048 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket.AgentDataBlock"> 16848 <member name="F:OpenMetaverse.GroupAccountSummary.LightTaxCurrent">
19049 <exclude /> 16849 <summary></summary>
19050 </member> 16850 </member>
19051 <member name="T:OpenMetaverse.Packets.GodUpdateRegionInfoPacket.RegionInfoBlock"> 16851 <member name="F:OpenMetaverse.GroupAccountSummary.LandTaxCurrent">
19052 <exclude /> 16852 <summary></summary>
19053 </member> 16853 </member>
19054 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket"> 16854 <member name="F:OpenMetaverse.GroupAccountSummary.GroupTaxCurrent">
19055 <exclude /> 16855 <summary></summary>
19056 </member> 16856 </member>
19057 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfoBlock"> 16857 <member name="F:OpenMetaverse.GroupAccountSummary.ParcelDirFeeCurrent">
19058 <exclude /> 16858 <summary></summary>
19059 </member> 16859 </member>
19060 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfo2Block"> 16860 <member name="F:OpenMetaverse.GroupAccountSummary.ObjectTaxEstimate">
19061 <exclude /> 16861 <summary></summary>
19062 </member> 16862 </member>
19063 <member name="T:OpenMetaverse.Packets.RegionHandshakePacket.RegionInfo3Block"> 16863 <member name="F:OpenMetaverse.GroupAccountSummary.LightTaxEstimate">
19064 <exclude /> 16864 <summary></summary>
19065 </member> 16865 </member>
19066 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket"> 16866 <member name="F:OpenMetaverse.GroupAccountSummary.LandTaxEstimate">
19067 <exclude /> 16867 <summary></summary>
19068 </member> 16868 </member>
19069 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket.AgentDataBlock"> 16869 <member name="F:OpenMetaverse.GroupAccountSummary.GroupTaxEstimate">
19070 <exclude /> 16870 <summary></summary>
19071 </member> 16871 </member>
19072 <member name="T:OpenMetaverse.Packets.RegionHandshakeReplyPacket.RegionInfoBlock"> 16872 <member name="F:OpenMetaverse.GroupAccountSummary.ParcelDirFeeEstimate">
19073 <exclude /> 16873 <summary></summary>
19074 </member> 16874 </member>
19075 <member name="T:OpenMetaverse.Packets.SimulatorViewerTimeMessagePacket"> 16875 <member name="F:OpenMetaverse.GroupAccountSummary.NonExemptMembers">
19076 <exclude /> 16876 <summary></summary>
19077 </member> 16877 </member>
19078 <member name="T:OpenMetaverse.Packets.SimulatorViewerTimeMessagePacket.TimeInfoBlock"> 16878 <member name="F:OpenMetaverse.GroupAccountSummary.LastTaxDate">
19079 <exclude /> 16879 <summary></summary>
19080 </member> 16880 </member>
19081 <member name="T:OpenMetaverse.Packets.EnableSimulatorPacket"> 16881 <member name="F:OpenMetaverse.GroupAccountSummary.TaxDate">
19082 <exclude /> 16882 <summary></summary>
19083 </member> 16883 </member>
19084 <member name="T:OpenMetaverse.Packets.EnableSimulatorPacket.SimulatorInfoBlock"> 16884 <member name="T:OpenMetaverse.GroupNotice">
19085 <exclude /> 16885 <summary>
16886 Struct representing a group notice
16887 </summary>
19086 </member> 16888 </member>
19087 <member name="T:OpenMetaverse.Packets.DisableSimulatorPacket"> 16889 <member name="F:OpenMetaverse.GroupNotice.Subject">
19088 <exclude /> 16890 <summary></summary>
19089 </member> 16891 </member>
19090 <member name="T:OpenMetaverse.Packets.TransferRequestPacket"> 16892 <member name="F:OpenMetaverse.GroupNotice.Message">
19091 <exclude /> 16893 <summary></summary>
19092 </member> 16894 </member>
19093 <member name="T:OpenMetaverse.Packets.TransferRequestPacket.TransferInfoBlock"> 16895 <member name="F:OpenMetaverse.GroupNotice.AttachmentID">
19094 <exclude /> 16896 <summary></summary>
19095 </member> 16897 </member>
19096 <member name="T:OpenMetaverse.Packets.TransferInfoPacket"> 16898 <member name="F:OpenMetaverse.GroupNotice.OwnerID">
19097 <exclude /> 16899 <summary></summary>
19098 </member> 16900 </member>
19099 <member name="T:OpenMetaverse.Packets.TransferInfoPacket.TransferInfoBlock"> 16901 <member name="M:OpenMetaverse.GroupNotice.SerializeAttachment">
19100 <exclude /> 16902 <summary>
16903
16904 </summary>
16905 <returns></returns>
19101 </member> 16906 </member>
19102 <member name="T:OpenMetaverse.Packets.TransferAbortPacket"> 16907 <member name="T:OpenMetaverse.GroupNoticesListEntry">
19103 <exclude /> 16908 <summary>
16909 Struct representing a group notice list entry
16910 </summary>
19104 </member> 16911 </member>
19105 <member name="T:OpenMetaverse.Packets.TransferAbortPacket.TransferInfoBlock"> 16912 <member name="F:OpenMetaverse.GroupNoticesListEntry.NoticeID">
19106 <exclude /> 16913 <summary>Notice ID</summary>
19107 </member> 16914 </member>
19108 <member name="T:OpenMetaverse.Packets.RequestXferPacket"> 16915 <member name="F:OpenMetaverse.GroupNoticesListEntry.Timestamp">
19109 <exclude /> 16916 <summary>Creation timestamp of notice</summary>
19110 </member> 16917 </member>
19111 <member name="T:OpenMetaverse.Packets.RequestXferPacket.XferIDBlock"> 16918 <member name="F:OpenMetaverse.GroupNoticesListEntry.FromName">
19112 <exclude /> 16919 <summary>Agent name who created notice</summary>
19113 </member> 16920 </member>
19114 <member name="T:OpenMetaverse.Packets.AbortXferPacket"> 16921 <member name="F:OpenMetaverse.GroupNoticesListEntry.Subject">
19115 <exclude /> 16922 <summary>Notice subject</summary>
19116 </member> 16923 </member>
19117 <member name="T:OpenMetaverse.Packets.AbortXferPacket.XferIDBlock"> 16924 <member name="F:OpenMetaverse.GroupNoticesListEntry.HasAttachment">
19118 <exclude /> 16925 <summary>Is there an attachment?</summary>
19119 </member> 16926 </member>
19120 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket"> 16927 <member name="F:OpenMetaverse.GroupNoticesListEntry.AssetType">
19121 <exclude /> 16928 <summary>Attachment Type</summary>
19122 </member> 16929 </member>
19123 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.SenderBlock"> 16930 <member name="T:OpenMetaverse.ChatSessionMember">
19124 <exclude /> 16931 <summary>
16932 Struct representing a member of a group chat session and their settings
16933 </summary>
19125 </member> 16934 </member>
19126 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.ObjectDataBlock"> 16935 <member name="F:OpenMetaverse.ChatSessionMember.AvatarKey">
19127 <exclude /> 16936 <summary>The <see cref="T:OpenMetaverse.UUID"/> of the Avatar</summary>
19128 </member> 16937 </member>
19129 <member name="T:OpenMetaverse.Packets.AvatarAppearancePacket.VisualParamBlock"> 16938 <member name="F:OpenMetaverse.ChatSessionMember.CanVoiceChat">
19130 <exclude /> 16939 <summary>True if user has voice chat enabled</summary>
19131 </member> 16940 </member>
19132 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket"> 16941 <member name="F:OpenMetaverse.ChatSessionMember.IsModerator">
19133 <exclude /> 16942 <summary>True of Avatar has moderator abilities</summary>
19134 </member> 16943 </member>
19135 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket.ObjectDataBlock"> 16944 <member name="F:OpenMetaverse.ChatSessionMember.MuteText">
19136 <exclude /> 16945 <summary>True if a moderator has muted this avatars chat</summary>
19137 </member> 16946 </member>
19138 <member name="T:OpenMetaverse.Packets.SetFollowCamPropertiesPacket.CameraPropertyBlock"> 16947 <member name="F:OpenMetaverse.ChatSessionMember.MuteVoice">
19139 <exclude /> 16948 <summary>True if a moderator has muted this avatars voice</summary>
19140 </member> 16949 </member>
19141 <member name="T:OpenMetaverse.Packets.ClearFollowCamPropertiesPacket"> 16950 <member name="T:OpenMetaverse.GroupRoleUpdate">
19142 <exclude /> 16951 <summary>
16952 Role update flags
16953 </summary>
19143 </member> 16954 </member>
19144 <member name="T:OpenMetaverse.Packets.ClearFollowCamPropertiesPacket.ObjectDataBlock"> 16955 <member name="F:OpenMetaverse.GroupRoleUpdate.NoUpdate">
19145 <exclude /> 16956 <summary></summary>
19146 </member> 16957 </member>
19147 <member name="T:OpenMetaverse.Packets.RequestPayPricePacket"> 16958 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdateData">
19148 <exclude /> 16959 <summary></summary>
19149 </member> 16960 </member>
19150 <member name="T:OpenMetaverse.Packets.RequestPayPricePacket.ObjectDataBlock"> 16961 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdatePowers">
19151 <exclude /> 16962 <summary></summary>
19152 </member> 16963 </member>
19153 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket"> 16964 <member name="F:OpenMetaverse.GroupRoleUpdate.UpdateAll">
19154 <exclude /> 16965 <summary></summary>
19155 </member> 16966 </member>
19156 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket.ObjectDataBlock"> 16967 <member name="F:OpenMetaverse.GroupRoleUpdate.Create">
19157 <exclude /> 16968 <summary></summary>
19158 </member> 16969 </member>
19159 <member name="T:OpenMetaverse.Packets.PayPriceReplyPacket.ButtonDataBlock"> 16970 <member name="F:OpenMetaverse.GroupRoleUpdate.Delete">
19160 <exclude /> 16971 <summary></summary>
19161 </member> 16972 </member>
19162 <member name="T:OpenMetaverse.Packets.KickUserPacket"> 16973 <member name="F:OpenMetaverse.GroupPowers.None">
19163 <exclude /> 16974 <summary></summary>
19164 </member> 16975 </member>
19165 <member name="T:OpenMetaverse.Packets.KickUserPacket.TargetBlockBlock"> 16976 <member name="F:OpenMetaverse.GroupPowers.Invite">
19166 <exclude /> 16977 <summary>Can send invitations to groups default role</summary>
19167 </member> 16978 </member>
19168 <member name="T:OpenMetaverse.Packets.KickUserPacket.UserInfoBlock"> 16979 <member name="F:OpenMetaverse.GroupPowers.Eject">
19169 <exclude /> 16980 <summary>Can eject members from group</summary>
19170 </member> 16981 </member>
19171 <member name="T:OpenMetaverse.Packets.GodKickUserPacket"> 16982 <member name="F:OpenMetaverse.GroupPowers.ChangeOptions">
19172 <exclude /> 16983 <summary>Can toggle 'Open Enrollment' and change 'Signup fee'</summary>
19173 </member> 16984 </member>
19174 <member name="T:OpenMetaverse.Packets.GodKickUserPacket.UserInfoBlock"> 16985 <member name="F:OpenMetaverse.GroupPowers.MemberVisible">
19175 <exclude /> 16986 <summary>Member is visible in the public member list</summary>
19176 </member> 16987 </member>
19177 <member name="T:OpenMetaverse.Packets.EjectUserPacket"> 16988 <member name="F:OpenMetaverse.GroupPowers.CreateRole">
19178 <exclude /> 16989 <summary>Can create new roles</summary>
19179 </member> 16990 </member>
19180 <member name="T:OpenMetaverse.Packets.EjectUserPacket.AgentDataBlock"> 16991 <member name="F:OpenMetaverse.GroupPowers.DeleteRole">
19181 <exclude /> 16992 <summary>Can delete existing roles</summary>
19182 </member> 16993 </member>
19183 <member name="T:OpenMetaverse.Packets.EjectUserPacket.DataBlock"> 16994 <member name="F:OpenMetaverse.GroupPowers.RoleProperties">
19184 <exclude /> 16995 <summary>Can change Role names, titles and descriptions</summary>
19185 </member> 16996 </member>
19186 <member name="T:OpenMetaverse.Packets.FreezeUserPacket"> 16997 <member name="F:OpenMetaverse.GroupPowers.AssignMemberLimited">
19187 <exclude /> 16998 <summary>Can assign other members to assigners role</summary>
19188 </member> 16999 </member>
19189 <member name="T:OpenMetaverse.Packets.FreezeUserPacket.AgentDataBlock"> 17000 <member name="F:OpenMetaverse.GroupPowers.AssignMember">
19190 <exclude /> 17001 <summary>Can assign other members to any role</summary>
19191 </member> 17002 </member>
19192 <member name="T:OpenMetaverse.Packets.FreezeUserPacket.DataBlock"> 17003 <member name="F:OpenMetaverse.GroupPowers.RemoveMember">
19193 <exclude /> 17004 <summary>Can remove members from roles</summary>
19194 </member> 17005 </member>
19195 <member name="T:OpenMetaverse.Packets.AvatarPropertiesRequestPacket"> 17006 <member name="F:OpenMetaverse.GroupPowers.ChangeActions">
19196 <exclude /> 17007 <summary>Can assign and remove abilities in roles</summary>
19197 </member> 17008 </member>
19198 <member name="T:OpenMetaverse.Packets.AvatarPropertiesRequestPacket.AgentDataBlock"> 17009 <member name="F:OpenMetaverse.GroupPowers.ChangeIdentity">
19199 <exclude /> 17010 <summary>Can change group Charter, Insignia, 'Publish on the web' and which
17011 members are publicly visible in group member listings</summary>
19200 </member> 17012 </member>
19201 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket"> 17013 <member name="F:OpenMetaverse.GroupPowers.LandDeed">
19202 <exclude /> 17014 <summary>Can buy land or deed land to group</summary>
19203 </member> 17015 </member>
19204 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket.AgentDataBlock"> 17016 <member name="F:OpenMetaverse.GroupPowers.LandRelease">
19205 <exclude /> 17017 <summary>Can abandon group owned land to Governor Linden on mainland, or Estate owner for
17018 private estates</summary>
19206 </member> 17019 </member>
19207 <member name="T:OpenMetaverse.Packets.AvatarPropertiesReplyPacket.PropertiesDataBlock"> 17020 <member name="F:OpenMetaverse.GroupPowers.LandSetSale">
19208 <exclude /> 17021 <summary>Can set land for-sale information on group owned parcels</summary>
19209 </member> 17022 </member>
19210 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket"> 17023 <member name="F:OpenMetaverse.GroupPowers.LandDivideJoin">
19211 <exclude /> 17024 <summary>Can subdivide and join parcels</summary>
19212 </member> 17025 </member>
19213 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket.AgentDataBlock"> 17026 <member name="F:OpenMetaverse.GroupPowers.JoinChat">
19214 <exclude /> 17027 <summary>Can join group chat sessions</summary>
19215 </member> 17028 </member>
19216 <member name="T:OpenMetaverse.Packets.AvatarInterestsReplyPacket.PropertiesDataBlock"> 17029 <member name="F:OpenMetaverse.GroupPowers.AllowVoiceChat">
19217 <exclude /> 17030 <summary>Can use voice chat in Group Chat sessions</summary>
19218 </member> 17031 </member>
19219 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket"> 17032 <member name="F:OpenMetaverse.GroupPowers.ModerateChat">
19220 <exclude /> 17033 <summary>Can moderate group chat sessions</summary>
19221 </member> 17034 </member>
19222 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.AgentDataBlock"> 17035 <member name="F:OpenMetaverse.GroupPowers.FindPlaces">
19223 <exclude /> 17036 <summary>Can toggle "Show in Find Places" and set search category</summary>
19224 </member> 17037 </member>
19225 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.GroupDataBlock"> 17038 <member name="F:OpenMetaverse.GroupPowers.LandChangeIdentity">
19226 <exclude /> 17039 <summary>Can change parcel name, description, and 'Publish on web' settings</summary>
19227 </member> 17040 </member>
19228 <member name="T:OpenMetaverse.Packets.AvatarGroupsReplyPacket.NewGroupDataBlock"> 17041 <member name="F:OpenMetaverse.GroupPowers.SetLandingPoint">
19229 <exclude /> 17042 <summary>Can set the landing point and teleport routing on group land</summary>
19230 </member> 17043 </member>
19231 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket"> 17044 <member name="F:OpenMetaverse.GroupPowers.ChangeMedia">
19232 <exclude /> 17045 <summary>Can change music and media settings</summary>
19233 </member> 17046 </member>
19234 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket.AgentDataBlock"> 17047 <member name="F:OpenMetaverse.GroupPowers.LandEdit">
19235 <exclude /> 17048 <summary>Can toggle 'Edit Terrain' option in Land settings</summary>
19236 </member> 17049 </member>
19237 <member name="T:OpenMetaverse.Packets.AvatarPropertiesUpdatePacket.PropertiesDataBlock"> 17050 <member name="F:OpenMetaverse.GroupPowers.LandOptions">
19238 <exclude /> 17051 <summary>Can toggle various About Land > Options settings</summary>
19239 </member> 17052 </member>
19240 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket"> 17053 <member name="F:OpenMetaverse.GroupPowers.AllowEditLand">
19241 <exclude /> 17054 <summary>Can always terraform land, even if parcel settings have it turned off</summary>
19242 </member> 17055 </member>
19243 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket.AgentDataBlock"> 17056 <member name="F:OpenMetaverse.GroupPowers.AllowFly">
19244 <exclude /> 17057 <summary>Can always fly while over group owned land</summary>
19245 </member> 17058 </member>
19246 <member name="T:OpenMetaverse.Packets.AvatarInterestsUpdatePacket.PropertiesDataBlock"> 17059 <member name="F:OpenMetaverse.GroupPowers.AllowRez">
19247 <exclude /> 17060 <summary>Can always rez objects on group owned land</summary>
19248 </member> 17061 </member>
19249 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket"> 17062 <member name="F:OpenMetaverse.GroupPowers.AllowLandmark">
19250 <exclude /> 17063 <summary>Can always create landmarks for group owned parcels</summary>
19251 </member> 17064 </member>
19252 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket.AgentDataBlock"> 17065 <member name="F:OpenMetaverse.GroupPowers.AllowSetHome">
19253 <exclude /> 17066 <summary>Can set home location on any group owned parcel</summary>
19254 </member> 17067 </member>
19255 <member name="T:OpenMetaverse.Packets.AvatarNotesReplyPacket.DataBlock"> 17068 <member name="F:OpenMetaverse.GroupPowers.LandManageAllowed">
19256 <exclude /> 17069 <summary>Can modify public access settings for group owned parcels</summary>
19257 </member> 17070 </member>
19258 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket"> 17071 <member name="F:OpenMetaverse.GroupPowers.LandManageBanned">
19259 <exclude /> 17072 <summary>Can manager parcel ban lists on group owned land</summary>
19260 </member> 17073 </member>
19261 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket.AgentDataBlock"> 17074 <member name="F:OpenMetaverse.GroupPowers.LandManagePasses">
19262 <exclude /> 17075 <summary>Can manage pass list sales information</summary>
19263 </member> 17076 </member>
19264 <member name="T:OpenMetaverse.Packets.AvatarNotesUpdatePacket.DataBlock"> 17077 <member name="F:OpenMetaverse.GroupPowers.LandEjectAndFreeze">
19265 <exclude /> 17078 <summary>Can eject and freeze other avatars on group owned land</summary>
19266 </member> 17079 </member>
19267 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket"> 17080 <member name="F:OpenMetaverse.GroupPowers.ReturnGroupSet">
19268 <exclude /> 17081 <summary>Can return objects set to group</summary>
19269 </member> 17082 </member>
19270 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket.AgentDataBlock"> 17083 <member name="F:OpenMetaverse.GroupPowers.ReturnNonGroup">
19271 <exclude /> 17084 <summary>Can return non-group owned/set objects</summary>
19272 </member> 17085 </member>
19273 <member name="T:OpenMetaverse.Packets.AvatarPicksReplyPacket.DataBlock"> 17086 <member name="F:OpenMetaverse.GroupPowers.ReturnGroupOwned">
19274 <exclude /> 17087 <summary>Can return group owned objects</summary>
19275 </member> 17088 </member>
19276 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket"> 17089 <member name="F:OpenMetaverse.GroupPowers.LandGardening">
19277 <exclude /> 17090 <summary>Can landscape using Linden plants</summary>
19278 </member> 17091 </member>
19279 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket.AgentDataBlock"> 17092 <member name="F:OpenMetaverse.GroupPowers.DeedObject">
19280 <exclude /> 17093 <summary>Can deed objects to group</summary>
19281 </member> 17094 </member>
19282 <member name="T:OpenMetaverse.Packets.EventInfoRequestPacket.EventDataBlock"> 17095 <member name="F:OpenMetaverse.GroupPowers.ObjectManipulate">
19283 <exclude /> 17096 <summary>Can move group owned objects</summary>
19284 </member> 17097 </member>
19285 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket"> 17098 <member name="F:OpenMetaverse.GroupPowers.ObjectSetForSale">
19286 <exclude /> 17099 <summary>Can set group owned objects for-sale</summary>
19287 </member> 17100 </member>
19288 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket.AgentDataBlock"> 17101 <member name="F:OpenMetaverse.GroupPowers.Accountable">
19289 <exclude /> 17102 <summary>Pay group liabilities and receive group dividends</summary>
19290 </member> 17103 </member>
19291 <member name="T:OpenMetaverse.Packets.EventInfoReplyPacket.EventDataBlock"> 17104 <member name="F:OpenMetaverse.GroupPowers.HostEvent">
19292 <exclude /> 17105 <summary>List and Host group events</summary>
19293 </member> 17106 </member>
19294 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket"> 17107 <member name="F:OpenMetaverse.GroupPowers.SendNotices">
19295 <exclude /> 17108 <summary>Can send group notices</summary>
19296 </member> 17109 </member>
19297 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket.AgentDataBlock"> 17110 <member name="F:OpenMetaverse.GroupPowers.ReceiveNotices">
19298 <exclude /> 17111 <summary>Can receive group notices</summary>
19299 </member> 17112 </member>
19300 <member name="T:OpenMetaverse.Packets.EventNotificationAddRequestPacket.EventDataBlock"> 17113 <member name="F:OpenMetaverse.GroupPowers.StartProposal">
19301 <exclude /> 17114 <summary>Can create group proposals</summary>
19302 </member> 17115 </member>
19303 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket"> 17116 <member name="F:OpenMetaverse.GroupPowers.VoteOnProposal">
19304 <exclude /> 17117 <summary>Can vote on group proposals</summary>
19305 </member> 17118 </member>
19306 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket.AgentDataBlock"> 17119 <member name="T:OpenMetaverse.GroupManager">
19307 <exclude /> 17120 <summary>
17121 Handles all network traffic related to reading and writing group
17122 information
17123 </summary>
19308 </member> 17124 </member>
19309 <member name="T:OpenMetaverse.Packets.EventNotificationRemoveRequestPacket.EventDataBlock"> 17125 <member name="F:OpenMetaverse.GroupManager.m_CurrentGroups">
19310 <exclude /> 17126 <summary>The event subscribers. null if no subcribers</summary>
19311 </member> 17127 </member>
19312 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket"> 17128 <member name="M:OpenMetaverse.GroupManager.OnCurrentGroups(OpenMetaverse.CurrentGroupsEventArgs)">
19313 <exclude /> 17129 <summary>Raises the CurrentGroups event</summary>
17130 <param name="e">A CurrentGroupsEventArgs object containing the
17131 data sent from the simulator</param>
19314 </member> 17132 </member>
19315 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.AgentDataBlock"> 17133 <member name="F:OpenMetaverse.GroupManager.m_CurrentGroupsLock">
19316 <exclude /> 17134 <summary>Thread sync lock object</summary>
19317 </member> 17135 </member>
19318 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.EventDataBlock"> 17136 <member name="F:OpenMetaverse.GroupManager.m_GroupNames">
19319 <exclude /> 17137 <summary>The event subscribers. null if no subcribers</summary>
19320 </member> 17138 </member>
19321 <member name="T:OpenMetaverse.Packets.EventGodDeletePacket.QueryDataBlock"> 17139 <member name="M:OpenMetaverse.GroupManager.OnGroupNamesReply(OpenMetaverse.GroupNamesEventArgs)">
19322 <exclude /> 17140 <summary>Raises the GroupNamesReply event</summary>
17141 <param name="e">A GroupNamesEventArgs object containing the
17142 data response from the simulator</param>
19323 </member> 17143 </member>
19324 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket"> 17144 <member name="F:OpenMetaverse.GroupManager.m_GroupNamesLock">
19325 <exclude /> 17145 <summary>Thread sync lock object</summary>
19326 </member> 17146 </member>
19327 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket.AgentDataBlock"> 17147 <member name="F:OpenMetaverse.GroupManager.m_GroupProfile">
19328 <exclude /> 17148 <summary>The event subscribers. null if no subcribers</summary>
19329 </member> 17149 </member>
19330 <member name="T:OpenMetaverse.Packets.PickInfoReplyPacket.DataBlock"> 17150 <member name="M:OpenMetaverse.GroupManager.OnGroupProfile(OpenMetaverse.GroupProfileEventArgs)">
19331 <exclude /> 17151 <summary>Raises the GroupProfile event</summary>
17152 <param name="e">An GroupProfileEventArgs object containing the
17153 data returned from the simulator</param>
19332 </member> 17154 </member>
19333 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket"> 17155 <member name="F:OpenMetaverse.GroupManager.m_GroupProfileLock">
19334 <exclude /> 17156 <summary>Thread sync lock object</summary>
19335 </member> 17157 </member>
19336 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket.AgentDataBlock"> 17158 <member name="F:OpenMetaverse.GroupManager.m_GroupMembers">
19337 <exclude /> 17159 <summary>The event subscribers. null if no subcribers</summary>
19338 </member> 17160 </member>
19339 <member name="T:OpenMetaverse.Packets.PickInfoUpdatePacket.DataBlock"> 17161 <member name="M:OpenMetaverse.GroupManager.OnGroupMembersReply(OpenMetaverse.GroupMembersReplyEventArgs)">
19340 <exclude /> 17162 <summary>Raises the GroupMembers event</summary>
17163 <param name="e">A GroupMembersEventArgs object containing the
17164 data returned from the simulator</param>
19341 </member> 17165 </member>
19342 <member name="T:OpenMetaverse.Packets.PickDeletePacket"> 17166 <member name="F:OpenMetaverse.GroupManager.m_GroupMembersLock">
19343 <exclude /> 17167 <summary>Thread sync lock object</summary>
19344 </member> 17168 </member>
19345 <member name="T:OpenMetaverse.Packets.PickDeletePacket.AgentDataBlock"> 17169 <member name="F:OpenMetaverse.GroupManager.m_GroupRoles">
19346 <exclude /> 17170 <summary>The event subscribers. null if no subcribers</summary>
19347 </member> 17171 </member>
19348 <member name="T:OpenMetaverse.Packets.PickDeletePacket.DataBlock"> 17172 <member name="M:OpenMetaverse.GroupManager.OnGroupRoleDataReply(OpenMetaverse.GroupRolesDataReplyEventArgs)">
19349 <exclude /> 17173 <summary>Raises the GroupRolesDataReply event</summary>
17174 <param name="e">A GroupRolesDataReplyEventArgs object containing the
17175 data returned from the simulator</param>
19350 </member> 17176 </member>
19351 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket"> 17177 <member name="F:OpenMetaverse.GroupManager.m_GroupRolesLock">
19352 <exclude /> 17178 <summary>Thread sync lock object</summary>
19353 </member> 17179 </member>
19354 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket.AgentDataBlock"> 17180 <member name="F:OpenMetaverse.GroupManager.m_GroupRoleMembers">
19355 <exclude /> 17181 <summary>The event subscribers. null if no subcribers</summary>
19356 </member> 17182 </member>
19357 <member name="T:OpenMetaverse.Packets.PickGodDeletePacket.DataBlock"> 17183 <member name="M:OpenMetaverse.GroupManager.OnGroupRoleMembers(OpenMetaverse.GroupRolesMembersReplyEventArgs)">
19358 <exclude /> 17184 <summary>Raises the GroupRoleMembersReply event</summary>
17185 <param name="e">A GroupRolesRoleMembersReplyEventArgs object containing the
17186 data returned from the simulator</param>
19359 </member> 17187 </member>
19360 <member name="T:OpenMetaverse.Packets.ScriptQuestionPacket"> 17188 <member name="F:OpenMetaverse.GroupManager.m_GroupRolesMembersLock">
19361 <exclude /> 17189 <summary>Thread sync lock object</summary>
19362 </member> 17190 </member>
19363 <member name="T:OpenMetaverse.Packets.ScriptQuestionPacket.DataBlock"> 17191 <member name="F:OpenMetaverse.GroupManager.m_GroupTitles">
19364 <exclude /> 17192 <summary>The event subscribers. null if no subcribers</summary>
19365 </member> 17193 </member>
19366 <member name="T:OpenMetaverse.Packets.ScriptControlChangePacket"> 17194 <member name="M:OpenMetaverse.GroupManager.OnGroupTitles(OpenMetaverse.GroupTitlesReplyEventArgs)">
19367 <exclude /> 17195 <summary>Raises the GroupTitlesReply event</summary>
17196 <param name="e">A GroupTitlesReplyEventArgs object containing the
17197 data returned from the simulator</param>
19368 </member> 17198 </member>
19369 <member name="T:OpenMetaverse.Packets.ScriptControlChangePacket.DataBlock"> 17199 <member name="F:OpenMetaverse.GroupManager.m_GroupTitlesLock">
19370 <exclude /> 17200 <summary>Thread sync lock object</summary>
19371 </member> 17201 </member>
19372 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket"> 17202 <member name="F:OpenMetaverse.GroupManager.m_GroupAccountSummary">
19373 <exclude /> 17203 <summary>The event subscribers. null if no subcribers</summary>
19374 </member> 17204 </member>
19375 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.DataBlock"> 17205 <member name="M:OpenMetaverse.GroupManager.OnGroupAccountSummaryReply(OpenMetaverse.GroupAccountSummaryReplyEventArgs)">
19376 <exclude /> 17206 <summary>Raises the GroupAccountSummary event</summary>
17207 <param name="e">A GroupAccountSummaryReplyEventArgs object containing the
17208 data returned from the simulator</param>
19377 </member> 17209 </member>
19378 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.ButtonsBlock"> 17210 <member name="F:OpenMetaverse.GroupManager.m_GroupAccountSummaryLock">
19379 <exclude /> 17211 <summary>Thread sync lock object</summary>
19380 </member> 17212 </member>
19381 <member name="T:OpenMetaverse.Packets.ScriptDialogPacket.OwnerDataBlock"> 17213 <member name="F:OpenMetaverse.GroupManager.m_GroupCreated">
19382 <exclude /> 17214 <summary>The event subscribers. null if no subcribers</summary>
19383 </member> 17215 </member>
19384 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket"> 17216 <member name="M:OpenMetaverse.GroupManager.OnGroupCreatedReply(OpenMetaverse.GroupCreatedReplyEventArgs)">
19385 <exclude /> 17217 <summary>Raises the GroupCreated event</summary>
17218 <param name="e">An GroupCreatedEventArgs object containing the
17219 data returned from the simulator</param>
19386 </member> 17220 </member>
19387 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket.AgentDataBlock"> 17221 <member name="F:OpenMetaverse.GroupManager.m_GroupCreatedLock">
19388 <exclude /> 17222 <summary>Thread sync lock object</summary>
19389 </member> 17223 </member>
19390 <member name="T:OpenMetaverse.Packets.ScriptDialogReplyPacket.DataBlock"> 17224 <member name="F:OpenMetaverse.GroupManager.m_GroupJoined">
19391 <exclude /> 17225 <summary>The event subscribers. null if no subcribers</summary>
19392 </member> 17226 </member>
19393 <member name="T:OpenMetaverse.Packets.ForceScriptControlReleasePacket"> 17227 <member name="M:OpenMetaverse.GroupManager.OnGroupJoinedReply(OpenMetaverse.GroupOperationEventArgs)">
19394 <exclude /> 17228 <summary>Raises the GroupJoined event</summary>
17229 <param name="e">A GroupOperationEventArgs object containing the
17230 result of the operation returned from the simulator</param>
19395 </member> 17231 </member>
19396 <member name="T:OpenMetaverse.Packets.ForceScriptControlReleasePacket.AgentDataBlock"> 17232 <member name="F:OpenMetaverse.GroupManager.m_GroupJoinedLock">
19397 <exclude /> 17233 <summary>Thread sync lock object</summary>
19398 </member> 17234 </member>
19399 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket"> 17235 <member name="F:OpenMetaverse.GroupManager.m_GroupLeft">
19400 <exclude /> 17236 <summary>The event subscribers. null if no subcribers</summary>
19401 </member> 17237 </member>
19402 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket.AgentDataBlock"> 17238 <member name="M:OpenMetaverse.GroupManager.OnGroupLeaveReply(OpenMetaverse.GroupOperationEventArgs)">
19403 <exclude /> 17239 <summary>Raises the GroupLeft event</summary>
17240 <param name="e">A GroupOperationEventArgs object containing the
17241 result of the operation returned from the simulator</param>
19404 </member> 17242 </member>
19405 <member name="T:OpenMetaverse.Packets.RevokePermissionsPacket.DataBlock"> 17243 <member name="F:OpenMetaverse.GroupManager.m_GroupLeftLock">
19406 <exclude /> 17244 <summary>Thread sync lock object</summary>
19407 </member> 17245 </member>
19408 <member name="T:OpenMetaverse.Packets.LoadURLPacket"> 17246 <member name="F:OpenMetaverse.GroupManager.m_GroupDropped">
19409 <exclude /> 17247 <summary>The event subscribers. null if no subcribers</summary>
19410 </member> 17248 </member>
19411 <member name="T:OpenMetaverse.Packets.LoadURLPacket.DataBlock"> 17249 <member name="M:OpenMetaverse.GroupManager.OnGroupDropped(OpenMetaverse.GroupDroppedEventArgs)">
19412 <exclude /> 17250 <summary>Raises the GroupDropped event</summary>
17251 <param name="e">An GroupDroppedEventArgs object containing the
17252 the group your agent left</param>
19413 </member> 17253 </member>
19414 <member name="T:OpenMetaverse.Packets.ScriptTeleportRequestPacket"> 17254 <member name="F:OpenMetaverse.GroupManager.m_GroupDroppedLock">
19415 <exclude /> 17255 <summary>Thread sync lock object</summary>
19416 </member> 17256 </member>
19417 <member name="T:OpenMetaverse.Packets.ScriptTeleportRequestPacket.DataBlock"> 17257 <member name="F:OpenMetaverse.GroupManager.m_GroupMemberEjected">
19418 <exclude /> 17258 <summary>The event subscribers. null if no subcribers</summary>
19419 </member> 17259 </member>
19420 <member name="T:OpenMetaverse.Packets.ParcelOverlayPacket"> 17260 <member name="M:OpenMetaverse.GroupManager.OnGroupMemberEjected(OpenMetaverse.GroupOperationEventArgs)">
19421 <exclude /> 17261 <summary>Raises the GroupMemberEjected event</summary>
17262 <param name="e">An GroupMemberEjectedEventArgs object containing the
17263 data returned from the simulator</param>
19422 </member> 17264 </member>
19423 <member name="T:OpenMetaverse.Packets.ParcelOverlayPacket.ParcelDataBlock"> 17265 <member name="F:OpenMetaverse.GroupManager.m_GroupMemberEjectedLock">
19424 <exclude /> 17266 <summary>Thread sync lock object</summary>
19425 </member> 17267 </member>
19426 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket"> 17268 <member name="F:OpenMetaverse.GroupManager.m_GroupNoticesListReply">
19427 <exclude /> 17269 <summary>The event subscribers. null if no subcribers</summary>
19428 </member> 17270 </member>
19429 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket.AgentDataBlock"> 17271 <member name="M:OpenMetaverse.GroupManager.OnGroupNoticesListReply(OpenMetaverse.GroupNoticesListReplyEventArgs)">
19430 <exclude /> 17272 <summary>Raises the GroupNoticesListReply event</summary>
17273 <param name="e">An GroupNoticesListReplyEventArgs object containing the
17274 data returned from the simulator</param>
19431 </member> 17275 </member>
19432 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestByIDPacket.ParcelDataBlock"> 17276 <member name="F:OpenMetaverse.GroupManager.m_GroupNoticesListReplyLock">
19433 <exclude /> 17277 <summary>Thread sync lock object</summary>
19434 </member> 17278 </member>
19435 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket"> 17279 <member name="F:OpenMetaverse.GroupManager.m_GroupInvitation">
19436 <exclude /> 17280 <summary>The event subscribers. null if no subcribers</summary>
19437 </member> 17281 </member>
19438 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket.AgentDataBlock"> 17282 <member name="M:OpenMetaverse.GroupManager.OnGroupInvitation(OpenMetaverse.GroupInvitationEventArgs)">
19439 <exclude /> 17283 <summary>Raises the GroupInvitation event</summary>
17284 <param name="e">An GroupInvitationEventArgs object containing the
17285 data returned from the simulator</param>
19440 </member> 17286 </member>
19441 <member name="T:OpenMetaverse.Packets.ParcelPropertiesUpdatePacket.ParcelDataBlock"> 17287 <member name="F:OpenMetaverse.GroupManager.m_GroupInvitationLock">
19442 <exclude /> 17288 <summary>Thread sync lock object</summary>
19443 </member> 17289 </member>
19444 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket"> 17290 <member name="F:OpenMetaverse.GroupManager.Client">
19445 <exclude /> 17291 <summary>A reference to the current <seealso cref="T:OpenMetaverse.GridClient"/> instance</summary>
19446 </member> 17292 </member>
19447 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.AgentDataBlock"> 17293 <member name="F:OpenMetaverse.GroupManager.GroupMembersRequests">
19448 <exclude /> 17294 <summary>Currently-active group members requests</summary>
19449 </member> 17295 </member>
19450 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.ParcelDataBlock"> 17296 <member name="F:OpenMetaverse.GroupManager.GroupRolesRequests">
19451 <exclude /> 17297 <summary>Currently-active group roles requests</summary>
19452 </member> 17298 </member>
19453 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.TaskIDsBlock"> 17299 <member name="F:OpenMetaverse.GroupManager.GroupRolesMembersRequests">
19454 <exclude /> 17300 <summary>Currently-active group role-member requests</summary>
19455 </member> 17301 </member>
19456 <member name="T:OpenMetaverse.Packets.ParcelReturnObjectsPacket.OwnerIDsBlock"> 17302 <member name="F:OpenMetaverse.GroupManager.TempGroupMembers">
19457 <exclude /> 17303 <summary>Dictionary keeping group members while request is in progress</summary>
19458 </member> 17304 </member>
19459 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket"> 17305 <member name="F:OpenMetaverse.GroupManager.TempGroupRolesMembers">
19460 <exclude /> 17306 <summary>Dictionary keeping mebmer/role mapping while request is in progress</summary>
19461 </member> 17307 </member>
19462 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket.AgentDataBlock"> 17308 <member name="F:OpenMetaverse.GroupManager.TempGroupRoles">
19463 <exclude /> 17309 <summary>Dictionary keeping GroupRole information while request is in progress</summary>
19464 </member> 17310 </member>
19465 <member name="T:OpenMetaverse.Packets.ParcelSetOtherCleanTimePacket.ParcelDataBlock"> 17311 <member name="F:OpenMetaverse.GroupManager.GroupName2KeyCache">
19466 <exclude /> 17312 <summary>Caches group name lookups</summary>
19467 </member> 17313 </member>
19468 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket"> 17314 <member name="M:OpenMetaverse.GroupManager.#ctor(OpenMetaverse.GridClient)">
19469 <exclude /> 17315 <summary>
17316 Construct a new instance of the GroupManager class
17317 </summary>
17318 <param name="client">A reference to the current <seealso cref="T:OpenMetaverse.GridClient"/> instance</param>
19470 </member> 17319 </member>
19471 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.AgentDataBlock"> 17320 <member name="M:OpenMetaverse.GroupManager.RequestCurrentGroups">
19472 <exclude /> 17321 <summary>
17322 Request a current list of groups the avatar is a member of.
17323 </summary>
17324 <remarks>CAPS Event Queue must be running for this to work since the results
17325 come across CAPS.</remarks>
19473 </member> 17326 </member>
19474 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.ParcelDataBlock"> 17327 <member name="M:OpenMetaverse.GroupManager.RequestGroupName(OpenMetaverse.UUID)">
19475 <exclude /> 17328 <summary>
17329 Lookup name of group based on groupID
17330 </summary>
17331 <param name="groupID">groupID of group to lookup name for.</param>
19476 </member> 17332 </member>
19477 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.TaskIDsBlock"> 17333 <member name="M:OpenMetaverse.GroupManager.RequestGroupNames(System.Collections.Generic.List{OpenMetaverse.UUID})">
19478 <exclude /> 17334 <summary>
17335 Request lookup of multiple group names
17336 </summary>
17337 <param name="groupIDs">List of group IDs to request.</param>
19479 </member> 17338 </member>
19480 <member name="T:OpenMetaverse.Packets.ParcelDisableObjectsPacket.OwnerIDsBlock"> 17339 <member name="M:OpenMetaverse.GroupManager.RequestGroupProfile(OpenMetaverse.UUID)">
19481 <exclude /> 17340 <summary>Lookup group profile data such as name, enrollment, founder, logo, etc</summary>
17341 <remarks>Subscribe to <code>OnGroupProfile</code> event to receive the results.</remarks>
17342 <param name="group">group ID (UUID)</param>
19482 </member> 17343 </member>
19483 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket"> 17344 <member name="M:OpenMetaverse.GroupManager.RequestGroupMembers(OpenMetaverse.UUID)">
19484 <exclude /> 17345 <summary>Request a list of group members.</summary>
17346 <remarks>Subscribe to <code>OnGroupMembers</code> event to receive the results.</remarks>
17347 <param name="group">group ID (UUID)</param>
17348 <returns>UUID of the request, use to index into cache</returns>
19485 </member> 17349 </member>
19486 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.AgentDataBlock"> 17350 <member name="M:OpenMetaverse.GroupManager.RequestGroupRoles(OpenMetaverse.UUID)">
19487 <exclude /> 17351 <summary>Request group roles</summary>
17352 <remarks>Subscribe to <code>OnGroupRoles</code> event to receive the results.</remarks>
17353 <param name="group">group ID (UUID)</param>
17354 <returns>UUID of the request, use to index into cache</returns>
19488 </member> 17355 </member>
19489 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.ParcelDataBlock"> 17356 <member name="M:OpenMetaverse.GroupManager.RequestGroupRolesMembers(OpenMetaverse.UUID)">
19490 <exclude /> 17357 <summary>Request members (members,role) role mapping for a group.</summary>
17358 <remarks>Subscribe to <code>OnGroupRolesMembers</code> event to receive the results.</remarks>
17359 <param name="group">group ID (UUID)</param>
17360 <returns>UUID of the request, use to index into cache</returns>
19491 </member> 17361 </member>
19492 <member name="T:OpenMetaverse.Packets.ParcelSelectObjectsPacket.ReturnIDsBlock"> 17362 <member name="M:OpenMetaverse.GroupManager.RequestGroupTitles(OpenMetaverse.UUID)">
19493 <exclude /> 17363 <summary>Request a groups Titles</summary>
17364 <remarks>Subscribe to <code>OnGroupTitles</code> event to receive the results.</remarks>
17365 <param name="group">group ID (UUID)</param>
17366 <returns>UUID of the request, use to index into cache</returns>
19494 </member> 17367 </member>
19495 <member name="T:OpenMetaverse.Packets.EstateCovenantRequestPacket"> 17368 <member name="M:OpenMetaverse.GroupManager.RequestGroupAccountSummary(OpenMetaverse.UUID,System.Int32,System.Int32)">
19496 <exclude /> 17369 <summary>Begin to get the group account summary</summary>
17370 <remarks>Subscribe to the <code>OnGroupAccountSummary</code> event to receive the results.</remarks>
17371 <param name="group">group ID (UUID)</param>
17372 <param name="intervalDays">How long of an interval</param>
17373 <param name="currentInterval">Which interval (0 for current, 1 for last)</param>
19497 </member> 17374 </member>
19498 <member name="T:OpenMetaverse.Packets.EstateCovenantRequestPacket.AgentDataBlock"> 17375 <member name="M:OpenMetaverse.GroupManager.Invite(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.UUID},OpenMetaverse.UUID)">
19499 <exclude /> 17376 <summary>Invites a user to a group</summary>
17377 <param name="group">The group to invite to</param>
17378 <param name="roles">A list of roles to invite a person to</param>
17379 <param name="personkey">Key of person to invite</param>
19500 </member> 17380 </member>
19501 <member name="T:OpenMetaverse.Packets.EstateCovenantReplyPacket"> 17381 <member name="M:OpenMetaverse.GroupManager.ActivateGroup(OpenMetaverse.UUID)">
19502 <exclude /> 17382 <summary>Set a group as the current active group</summary>
17383 <param name="id">group ID (UUID)</param>
19503 </member> 17384 </member>
19504 <member name="T:OpenMetaverse.Packets.EstateCovenantReplyPacket.DataBlock"> 17385 <member name="M:OpenMetaverse.GroupManager.ActivateTitle(OpenMetaverse.UUID,OpenMetaverse.UUID)">
19505 <exclude /> 17386 <summary>Change the role that determines your active title</summary>
17387 <param name="group">Group ID to use</param>
17388 <param name="role">Role ID to change to</param>
19506 </member> 17389 </member>
19507 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket"> 17390 <member name="M:OpenMetaverse.GroupManager.SetGroupContribution(OpenMetaverse.UUID,System.Int32)">
19508 <exclude /> 17391 <summary>Set this avatar's tier contribution</summary>
17392 <param name="group">Group ID to change tier in</param>
17393 <param name="contribution">amount of tier to donate</param>
19509 </member> 17394 </member>
19510 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket.HeaderBlock"> 17395 <member name="M:OpenMetaverse.GroupManager.SetGroupAcceptNotices(OpenMetaverse.UUID,System.Boolean,System.Boolean)">
19511 <exclude /> 17396 <summary>
17397 Save wheather agent wants to accept group notices and list this group in their profile
17398 </summary>
17399 <param name="groupID">Group <see cref="T:OpenMetaverse.UUID"/></param>
17400 <param name="acceptNotices">Accept notices from this group</param>
17401 <param name="listInProfile">List this group in the profile</param>
19512 </member> 17402 </member>
19513 <member name="T:OpenMetaverse.Packets.ForceObjectSelectPacket.DataBlock"> 17403 <member name="M:OpenMetaverse.GroupManager.RequestJoinGroup(OpenMetaverse.UUID)">
19514 <exclude /> 17404 <summary>Request to join a group</summary>
17405 <remarks>Subscribe to <code>OnGroupJoined</code> event for confirmation.</remarks>
17406 <param name="id">group ID (UUID) to join.</param>
19515 </member> 17407 </member>
19516 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket"> 17408 <member name="M:OpenMetaverse.GroupManager.RequestCreateGroup(OpenMetaverse.Group)">
19517 <exclude /> 17409 <summary>
17410 Request to create a new group. If the group is successfully
17411 created, L$100 will automatically be deducted
17412 </summary>
17413 <remarks>Subscribe to <code>OnGroupCreated</code> event to receive confirmation.</remarks>
17414 <param name="group">Group struct containing the new group info</param>
19518 </member> 17415 </member>
19519 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket.AgentDataBlock"> 17416 <member name="M:OpenMetaverse.GroupManager.UpdateGroup(OpenMetaverse.UUID,OpenMetaverse.Group)">
19520 <exclude /> 17417 <summary>Update a group's profile and other information</summary>
17418 <param name="id">Groups ID (UUID) to update.</param>
17419 <param name="group">Group struct to update.</param>
19521 </member> 17420 </member>
19522 <member name="T:OpenMetaverse.Packets.ParcelBuyPassPacket.ParcelDataBlock"> 17421 <member name="M:OpenMetaverse.GroupManager.EjectUser(OpenMetaverse.UUID,OpenMetaverse.UUID)">
19523 <exclude /> 17422 <summary>Eject a user from a group</summary>
17423 <param name="group">Group ID to eject the user from</param>
17424 <param name="member">Avatar's key to eject</param>
19524 </member> 17425 </member>
19525 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket"> 17426 <member name="M:OpenMetaverse.GroupManager.UpdateRole(OpenMetaverse.GroupRole)">
19526 <exclude /> 17427 <summary>Update role information</summary>
17428 <param name="role">Modified role to be updated</param>
19527 </member> 17429 </member>
19528 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket.AgentDataBlock"> 17430 <member name="M:OpenMetaverse.GroupManager.CreateRole(OpenMetaverse.UUID,OpenMetaverse.GroupRole)">
19529 <exclude /> 17431 <summary>Create a new group role</summary>
17432 <param name="group">Group ID to update</param>
17433 <param name="role">Role to create</param>
19530 </member> 17434 </member>
19531 <member name="T:OpenMetaverse.Packets.ParcelDeedToGroupPacket.DataBlock"> 17435 <member name="M:OpenMetaverse.GroupManager.DeleteRole(OpenMetaverse.UUID,OpenMetaverse.UUID)">
19532 <exclude /> 17436 <summary>Delete a group role</summary>
17437 <param name="group">Group ID to update</param>
17438 <param name="roleID">Role to delete</param>
19533 </member> 17439 </member>
19534 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket"> 17440 <member name="M:OpenMetaverse.GroupManager.RemoveFromRole(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
19535 <exclude /> 17441 <summary>Remove an avatar from a role</summary>
17442 <param name="group">Group ID to update</param>
17443 <param name="role">Role ID to be removed from</param>
17444 <param name="member">Avatar's Key to remove</param>
19536 </member> 17445 </member>
19537 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket.AgentDataBlock"> 17446 <member name="M:OpenMetaverse.GroupManager.AddToRole(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID)">
19538 <exclude /> 17447 <summary>Assign an avatar to a role</summary>
17448 <param name="group">Group ID to update</param>
17449 <param name="role">Role ID to assign to</param>
17450 <param name="member">Avatar's ID to assign to role</param>
19539 </member> 17451 </member>
19540 <member name="T:OpenMetaverse.Packets.ParcelReclaimPacket.DataBlock"> 17452 <member name="M:OpenMetaverse.GroupManager.RequestGroupNoticesList(OpenMetaverse.UUID)">
19541 <exclude /> 17453 <summary>Request the group notices list</summary>
17454 <param name="group">Group ID to fetch notices for</param>
19542 </member> 17455 </member>
19543 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket"> 17456 <member name="M:OpenMetaverse.GroupManager.RequestGroupNotice(OpenMetaverse.UUID)">
19544 <exclude /> 17457 <summary>Request a group notice by key</summary>
17458 <param name="noticeID">ID of group notice</param>
19545 </member> 17459 </member>
19546 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.AgentDataBlock"> 17460 <member name="M:OpenMetaverse.GroupManager.SendGroupNotice(OpenMetaverse.UUID,OpenMetaverse.GroupNotice)">
19547 <exclude /> 17461 <summary>Send out a group notice</summary>
17462 <param name="group">Group ID to update</param>
17463 <param name="notice"><code>GroupNotice</code> structure containing notice data</param>
19548 </member> 17464 </member>
19549 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.DataBlock"> 17465 <member name="M:OpenMetaverse.GroupManager.StartProposal(OpenMetaverse.UUID,OpenMetaverse.GroupProposal)">
19550 <exclude /> 17466 <summary>Start a group proposal (vote)</summary>
17467 <param name="group">The Group ID to send proposal to</param>
17468 <param name="prop"><code>GroupProposal</code> structure containing the proposal</param>
19551 </member> 17469 </member>
19552 <member name="T:OpenMetaverse.Packets.ParcelClaimPacket.ParcelDataBlock"> 17470 <member name="M:OpenMetaverse.GroupManager.LeaveGroup(OpenMetaverse.UUID)">
19553 <exclude /> 17471 <summary>Request to leave a group</summary>
17472 <remarks>Subscribe to <code>OnGroupLeft</code> event to receive confirmation</remarks>
17473 <param name="groupID">The group to leave</param>
19554 </member> 17474 </member>
19555 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket"> 17475 <member name="M:OpenMetaverse.GroupManager.AgentDropGroupHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19556 <exclude /> 17476 <summary>Process an incoming packet and raise the appropriate events</summary>
17477 <param name="sender">The sender</param>
17478 <param name="e">The EventArgs object containing the packet data</param>
19557 </member> 17479 </member>
19558 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket.AgentDataBlock"> 17480 <member name="M:OpenMetaverse.GroupManager.GroupProfileReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19559 <exclude /> 17481 <summary>Process an incoming packet and raise the appropriate events</summary>
17482 <param name="sender">The sender</param>
17483 <param name="e">The EventArgs object containing the packet data</param>
19560 </member> 17484 </member>
19561 <member name="T:OpenMetaverse.Packets.ParcelJoinPacket.ParcelDataBlock"> 17485 <member name="M:OpenMetaverse.GroupManager.GroupNoticesListReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19562 <exclude /> 17486 <summary>Process an incoming packet and raise the appropriate events</summary>
17487 <param name="sender">The sender</param>
17488 <param name="e">The EventArgs object containing the packet data</param>
19563 </member> 17489 </member>
19564 <member name="T:OpenMetaverse.Packets.ParcelDividePacket"> 17490 <member name="M:OpenMetaverse.GroupManager.GroupTitlesReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19565 <exclude /> 17491 <summary>Process an incoming packet and raise the appropriate events</summary>
17492 <param name="sender">The sender</param>
17493 <param name="e">The EventArgs object containing the packet data</param>
19566 </member> 17494 </member>
19567 <member name="T:OpenMetaverse.Packets.ParcelDividePacket.AgentDataBlock"> 17495 <member name="M:OpenMetaverse.GroupManager.GroupMembersHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19568 <exclude /> 17496 <summary>Process an incoming packet and raise the appropriate events</summary>
17497 <param name="sender">The sender</param>
17498 <param name="e">The EventArgs object containing the packet data</param>
19569 </member> 17499 </member>
19570 <member name="T:OpenMetaverse.Packets.ParcelDividePacket.ParcelDataBlock"> 17500 <member name="M:OpenMetaverse.GroupManager.GroupRoleDataReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19571 <exclude /> 17501 <summary>Process an incoming packet and raise the appropriate events</summary>
17502 <param name="sender">The sender</param>
17503 <param name="e">The EventArgs object containing the packet data</param>
19572 </member> 17504 </member>
19573 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket"> 17505 <member name="M:OpenMetaverse.GroupManager.GroupRoleMembersReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19574 <exclude /> 17506 <summary>Process an incoming packet and raise the appropriate events</summary>
17507 <param name="sender">The sender</param>
17508 <param name="e">The EventArgs object containing the packet data</param>
19575 </member> 17509 </member>
19576 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket.AgentDataBlock"> 17510 <member name="M:OpenMetaverse.GroupManager.GroupActiveProposalItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19577 <exclude /> 17511 <summary>Process an incoming packet and raise the appropriate events</summary>
17512 <param name="sender">The sender</param>
17513 <param name="e">The EventArgs object containing the packet data</param>
19578 </member> 17514 </member>
19579 <member name="T:OpenMetaverse.Packets.ParcelReleasePacket.DataBlock"> 17515 <member name="M:OpenMetaverse.GroupManager.GroupVoteHistoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19580 <exclude /> 17516 <summary>Process an incoming packet and raise the appropriate events</summary>
17517 <param name="sender">The sender</param>
17518 <param name="e">The EventArgs object containing the packet data</param>
19581 </member> 17519 </member>
19582 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket"> 17520 <member name="M:OpenMetaverse.GroupManager.GroupAccountSummaryReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19583 <exclude /> 17521 <summary>Process an incoming packet and raise the appropriate events</summary>
17522 <param name="sender">The sender</param>
17523 <param name="e">The EventArgs object containing the packet data</param>
19584 </member> 17524 </member>
19585 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.AgentDataBlock"> 17525 <member name="M:OpenMetaverse.GroupManager.CreateGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19586 <exclude /> 17526 <summary>Process an incoming packet and raise the appropriate events</summary>
17527 <param name="sender">The sender</param>
17528 <param name="e">The EventArgs object containing the packet data</param>
19587 </member> 17529 </member>
19588 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.DataBlock"> 17530 <member name="M:OpenMetaverse.GroupManager.JoinGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19589 <exclude /> 17531 <summary>Process an incoming packet and raise the appropriate events</summary>
17532 <param name="sender">The sender</param>
17533 <param name="e">The EventArgs object containing the packet data</param>
19590 </member> 17534 </member>
19591 <member name="T:OpenMetaverse.Packets.ParcelBuyPacket.ParcelDataBlock"> 17535 <member name="M:OpenMetaverse.GroupManager.LeaveGroupReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19592 <exclude /> 17536 <summary>Process an incoming packet and raise the appropriate events</summary>
17537 <param name="sender">The sender</param>
17538 <param name="e">The EventArgs object containing the packet data</param>
19593 </member> 17539 </member>
19594 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket"> 17540 <member name="M:OpenMetaverse.GroupManager.UUIDGroupNameReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19595 <exclude /> 17541 <summary>Process an incoming packet and raise the appropriate events</summary>
17542 <param name="sender">The sender</param>
17543 <param name="e">The EventArgs object containing the packet data</param>
19596 </member> 17544 </member>
19597 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket.AgentDataBlock"> 17545 <member name="M:OpenMetaverse.GroupManager.EjectGroupMemberReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
19598 <exclude /> 17546 <summary>Process an incoming packet and raise the appropriate events</summary>
17547 <param name="sender">The sender</param>
17548 <param name="e">The EventArgs object containing the packet data</param>
19599 </member> 17549 </member>
19600 <member name="T:OpenMetaverse.Packets.ParcelGodForceOwnerPacket.DataBlock"> 17550 <member name="E:OpenMetaverse.GroupManager.CurrentGroups">
19601 <exclude /> 17551 <summary>Raised when the simulator sends us data containing
17552 our current group membership</summary>
19602 </member> 17553 </member>
19603 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket"> 17554 <member name="E:OpenMetaverse.GroupManager.GroupNamesReply">
19604 <exclude /> 17555 <summary>Raised when the simulator responds to a RequestGroupName
17556 or RequestGroupNames request</summary>
19605 </member> 17557 </member>
19606 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket.AgentDataBlock"> 17558 <member name="E:OpenMetaverse.GroupManager.GroupProfile">
19607 <exclude /> 17559 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupProfile(OpenMetaverse.UUID)"/> request</summary>
19608 </member> 17560 </member>
19609 <member name="T:OpenMetaverse.Packets.ParcelAccessListRequestPacket.DataBlock"> 17561 <member name="E:OpenMetaverse.GroupManager.GroupMembersReply">
19610 <exclude /> 17562 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupMembers(OpenMetaverse.UUID)"/> request</summary>
19611 </member> 17563 </member>
19612 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket"> 17564 <member name="E:OpenMetaverse.GroupManager.GroupRoleDataReply">
19613 <exclude /> 17565 <summary>Raised when the simulator responds to a <see cref="!:RequestGroupRoleData"/> request</summary>
19614 </member> 17566 </member>
19615 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket.DataBlock"> 17567 <member name="E:OpenMetaverse.GroupManager.GroupRoleMembersReply">
19616 <exclude /> 17568 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupRolesMembers(OpenMetaverse.UUID)"/> request</summary>
19617 </member> 17569 </member>
19618 <member name="T:OpenMetaverse.Packets.ParcelAccessListReplyPacket.ListBlock"> 17570 <member name="E:OpenMetaverse.GroupManager.GroupTitlesReply">
19619 <exclude /> 17571 <summary>Raised when the simulator responds to a <see cref="M:OpenMetaverse.GroupManager.RequestGroupTitles(OpenMetaverse.UUID)"/> request</summary>
19620 </member> 17572 </member>
19621 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket"> 17573 <member name="E:OpenMetaverse.GroupManager.GroupAccountSummaryReply">
19622 <exclude /> 17574 <summary>Raised when a response to a RequestGroupAccountSummary is returned
17575 by the simulator</summary>
19623 </member> 17576 </member>
19624 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.AgentDataBlock"> 17577 <member name="E:OpenMetaverse.GroupManager.GroupCreatedReply">
19625 <exclude /> 17578 <summary>Raised when a request to create a group is successful</summary>
19626 </member> 17579 </member>
19627 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.DataBlock"> 17580 <member name="E:OpenMetaverse.GroupManager.GroupJoinedReply">
19628 <exclude /> 17581 <summary>Raised when a request to join a group either
17582 fails or succeeds</summary>
19629 </member> 17583 </member>
19630 <member name="T:OpenMetaverse.Packets.ParcelAccessListUpdatePacket.ListBlock"> 17584 <member name="E:OpenMetaverse.GroupManager.GroupLeaveReply">
19631 <exclude /> 17585 <summary>Raised when a request to leave a group either
17586 fails or succeeds</summary>
19632 </member> 17587 </member>
19633 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket"> 17588 <member name="E:OpenMetaverse.GroupManager.GroupDropped">
19634 <exclude /> 17589 <summary>Raised when A group is removed from the group server</summary>
19635 </member> 17590 </member>
19636 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket.AgentDataBlock"> 17591 <member name="E:OpenMetaverse.GroupManager.GroupMemberEjected">
19637 <exclude /> 17592 <summary>Raised when a request to eject a member from a group either
17593 fails or succeeds</summary>
19638 </member> 17594 </member>
19639 <member name="T:OpenMetaverse.Packets.ParcelDwellRequestPacket.DataBlock"> 17595 <member name="E:OpenMetaverse.GroupManager.GroupNoticesListReply">
19640 <exclude /> 17596 <summary>Raised when the simulator sends us group notices</summary>
17597 <seealso cref="M:OpenMetaverse.GroupManager.RequestGroupNoticesList(OpenMetaverse.UUID)"/>
19641 </member> 17598 </member>
19642 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket"> 17599 <member name="E:OpenMetaverse.GroupManager.GroupInvitation">
19643 <exclude /> 17600 <summary>Raised when another agent invites our avatar to join a group</summary>
19644 </member> 17601 </member>
19645 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket.AgentDataBlock"> 17602 <member name="T:OpenMetaverse.CurrentGroupsEventArgs">
19646 <exclude /> 17603 <summary>Contains the current groups your agent is a member of</summary>
19647 </member> 17604 </member>
19648 <member name="T:OpenMetaverse.Packets.ParcelDwellReplyPacket.DataBlock"> 17605 <member name="M:OpenMetaverse.CurrentGroupsEventArgs.#ctor(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.Group})">
19649 <exclude /> 17606 <summary>Construct a new instance of the CurrentGroupsEventArgs class</summary>
17607 <param name="groups">The current groups your agent is a member of</param>
19650 </member> 17608 </member>
19651 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket"> 17609 <member name="P:OpenMetaverse.CurrentGroupsEventArgs.Groups">
19652 <exclude /> 17610 <summary>Get the current groups your agent is a member of</summary>
19653 </member> 17611 </member>
19654 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket.AgentDataBlock"> 17612 <member name="T:OpenMetaverse.GroupNamesEventArgs">
19655 <exclude /> 17613 <summary>A Dictionary of group names, where the Key is the groups ID and the value is the groups name</summary>
19656 </member> 17614 </member>
19657 <member name="T:OpenMetaverse.Packets.ParcelGodMarkAsContentPacket.ParcelDataBlock"> 17615 <member name="M:OpenMetaverse.GroupNamesEventArgs.#ctor(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,System.String})">
19658 <exclude /> 17616 <summary>Construct a new instance of the GroupNamesEventArgs class</summary>
17617 <param name="groupNames">The Group names dictionary</param>
19659 </member> 17618 </member>
19660 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket"> 17619 <member name="P:OpenMetaverse.GroupNamesEventArgs.GroupNames">
19661 <exclude /> 17620 <summary>Get the Group Names dictionary</summary>
19662 </member> 17621 </member>
19663 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket.AgentDataBlock"> 17622 <member name="T:OpenMetaverse.GroupMembersReplyEventArgs">
19664 <exclude /> 17623 <summary>Represents the members of a group</summary>
19665 </member> 17624 </member>
19666 <member name="T:OpenMetaverse.Packets.ViewerStartAuctionPacket.ParcelDataBlock"> 17625 <member name="M:OpenMetaverse.GroupMembersReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupMember})">
19667 <exclude /> 17626 <summary>
17627 Construct a new instance of the GroupMembersReplyEventArgs class
17628 </summary>
17629 <param name="requestID">The ID of the request</param>
17630 <param name="groupID">The ID of the group</param>
17631 <param name="members">The membership list of the group</param>
19668 </member> 17632 </member>
19669 <member name="T:OpenMetaverse.Packets.UUIDNameRequestPacket"> 17633 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.RequestID">
19670 <exclude /> 17634 <summary>Get the ID as returned by the request to correlate
17635 this result set and the request</summary>
19671 </member> 17636 </member>
19672 <member name="T:OpenMetaverse.Packets.UUIDNameRequestPacket.UUIDNameBlockBlock"> 17637 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.GroupID">
19673 <exclude /> 17638 <summary>Get the ID of the group</summary>
19674 </member> 17639 </member>
19675 <member name="T:OpenMetaverse.Packets.UUIDNameReplyPacket"> 17640 <member name="P:OpenMetaverse.GroupMembersReplyEventArgs.Members">
19676 <exclude /> 17641 <summary>Get the dictionary of members</summary>
19677 </member> 17642 </member>
19678 <member name="T:OpenMetaverse.Packets.UUIDNameReplyPacket.UUIDNameBlockBlock"> 17643 <member name="T:OpenMetaverse.GroupRolesDataReplyEventArgs">
19679 <exclude /> 17644 <summary>Represents the roles associated with a group</summary>
19680 </member> 17645 </member>
19681 <member name="T:OpenMetaverse.Packets.UUIDGroupNameRequestPacket"> 17646 <member name="M:OpenMetaverse.GroupRolesDataReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupRole})">
19682 <exclude /> 17647 <summary>Construct a new instance of the GroupRolesDataReplyEventArgs class</summary>
17648 <param name="requestID">The ID as returned by the request to correlate
17649 this result set and the request</param>
17650 <param name="groupID">The ID of the group</param>
17651 <param name="roles">The dictionary containing the roles</param>
19683 </member> 17652 </member>
19684 <member name="T:OpenMetaverse.Packets.UUIDGroupNameRequestPacket.UUIDNameBlockBlock"> 17653 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.RequestID">
19685 <exclude /> 17654 <summary>Get the ID as returned by the request to correlate
17655 this result set and the request</summary>
19686 </member> 17656 </member>
19687 <member name="T:OpenMetaverse.Packets.UUIDGroupNameReplyPacket"> 17657 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.GroupID">
19688 <exclude /> 17658 <summary>Get the ID of the group</summary>
19689 </member> 17659 </member>
19690 <member name="T:OpenMetaverse.Packets.UUIDGroupNameReplyPacket.UUIDNameBlockBlock"> 17660 <member name="P:OpenMetaverse.GroupRolesDataReplyEventArgs.Roles">
19691 <exclude /> 17661 <summary>Get the dictionary containing the roles</summary>
19692 </member> 17662 </member>
19693 <member name="T:OpenMetaverse.Packets.ChildAgentDyingPacket"> 17663 <member name="T:OpenMetaverse.GroupRolesMembersReplyEventArgs">
19694 <exclude /> 17664 <summary>Represents the Role to Member mappings for a group</summary>
19695 </member> 17665 </member>
19696 <member name="T:OpenMetaverse.Packets.ChildAgentDyingPacket.AgentDataBlock"> 17666 <member name="M:OpenMetaverse.GroupRolesMembersReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.List{System.Collections.Generic.KeyValuePair{OpenMetaverse.UUID,OpenMetaverse.UUID}})">
19697 <exclude /> 17667 <summary>Construct a new instance of the GroupRolesMembersReplyEventArgs class</summary>
17668 <param name="requestID">The ID as returned by the request to correlate
17669 this result set and the request</param>
17670 <param name="groupID">The ID of the group</param>
17671 <param name="rolesMembers">The member to roles map</param>
19698 </member> 17672 </member>
19699 <member name="T:OpenMetaverse.Packets.ChildAgentUnknownPacket"> 17673 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.RequestID">
19700 <exclude /> 17674 <summary>Get the ID as returned by the request to correlate
17675 this result set and the request</summary>
19701 </member> 17676 </member>
19702 <member name="T:OpenMetaverse.Packets.ChildAgentUnknownPacket.AgentDataBlock"> 17677 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.GroupID">
19703 <exclude /> 17678 <summary>Get the ID of the group</summary>
19704 </member> 17679 </member>
19705 <member name="T:OpenMetaverse.Packets.GetScriptRunningPacket"> 17680 <member name="P:OpenMetaverse.GroupRolesMembersReplyEventArgs.RolesMembers">
19706 <exclude /> 17681 <summary>Get the member to roles map</summary>
19707 </member> 17682 </member>
19708 <member name="T:OpenMetaverse.Packets.GetScriptRunningPacket.ScriptBlock"> 17683 <member name="T:OpenMetaverse.GroupTitlesReplyEventArgs">
19709 <exclude /> 17684 <summary>Represents the titles for a group</summary>
19710 </member> 17685 </member>
19711 <member name="T:OpenMetaverse.Packets.ScriptRunningReplyPacket"> 17686 <member name="M:OpenMetaverse.GroupTitlesReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.GroupTitle})">
19712 <exclude /> 17687 <summary>Construct a new instance of the GroupTitlesReplyEventArgs class</summary>
17688 <param name="requestID">The ID as returned by the request to correlate
17689 this result set and the request</param>
17690 <param name="groupID">The ID of the group</param>
17691 <param name="titles">The titles</param>
19713 </member> 17692 </member>
19714 <member name="T:OpenMetaverse.Packets.ScriptRunningReplyPacket.ScriptBlock"> 17693 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.RequestID">
19715 <exclude /> 17694 <summary>Get the ID as returned by the request to correlate
17695 this result set and the request</summary>
19716 </member> 17696 </member>
19717 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket"> 17697 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.GroupID">
19718 <exclude /> 17698 <summary>Get the ID of the group</summary>
19719 </member> 17699 </member>
19720 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket.AgentDataBlock"> 17700 <member name="P:OpenMetaverse.GroupTitlesReplyEventArgs.Titles">
19721 <exclude /> 17701 <summary>Get the titles</summary>
19722 </member> 17702 </member>
19723 <member name="T:OpenMetaverse.Packets.SetScriptRunningPacket.ScriptBlock"> 17703 <member name="T:OpenMetaverse.GroupAccountSummaryReplyEventArgs">
19724 <exclude /> 17704 <summary>Represents the summary data for a group</summary>
19725 </member> 17705 </member>
19726 <member name="T:OpenMetaverse.Packets.ScriptResetPacket"> 17706 <member name="M:OpenMetaverse.GroupAccountSummaryReplyEventArgs.#ctor(OpenMetaverse.UUID,OpenMetaverse.GroupAccountSummary)">
19727 <exclude /> 17707 <summary>Construct a new instance of the GroupAccountSummaryReplyEventArgs class</summary>
17708 <param name="groupID">The ID of the group</param>
17709 <param name="summary">The summary data</param>
19728 </member> 17710 </member>
19729 <member name="T:OpenMetaverse.Packets.ScriptResetPacket.AgentDataBlock"> 17711 <member name="P:OpenMetaverse.GroupAccountSummaryReplyEventArgs.GroupID">
19730 <exclude /> 17712 <summary>Get the ID of the group</summary>
19731 </member> 17713 </member>
19732 <member name="T:OpenMetaverse.Packets.ScriptResetPacket.ScriptBlock"> 17714 <member name="P:OpenMetaverse.GroupAccountSummaryReplyEventArgs.Summary">
19733 <exclude /> 17715 <summary>Get the summary data</summary>
19734 </member> 17716 </member>
19735 <member name="T:OpenMetaverse.Packets.ScriptSensorRequestPacket"> 17717 <member name="T:OpenMetaverse.GroupCreatedReplyEventArgs">
19736 <exclude /> 17718 <summary>A response to a group create request</summary>
19737 </member> 17719 </member>
19738 <member name="T:OpenMetaverse.Packets.ScriptSensorRequestPacket.RequesterBlock"> 17720 <member name="M:OpenMetaverse.GroupCreatedReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean,System.String)">
19739 <exclude /> 17721 <summary>Construct a new instance of the GroupCreatedReplyEventArgs class</summary>
17722 <param name="groupID">The ID of the group</param>
17723 <param name="success">the success or faulure of the request</param>
17724 <param name="messsage">A string containing additional information</param>
19740 </member> 17725 </member>
19741 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket"> 17726 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.GroupID">
19742 <exclude /> 17727 <summary>Get the ID of the group</summary>
19743 </member> 17728 </member>
19744 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket.RequesterBlock"> 17729 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.Success">
19745 <exclude /> 17730 <summary>true of the group was created successfully</summary>
19746 </member> 17731 </member>
19747 <member name="T:OpenMetaverse.Packets.ScriptSensorReplyPacket.SensedDataBlock"> 17732 <member name="P:OpenMetaverse.GroupCreatedReplyEventArgs.Message">
19748 <exclude /> 17733 <summary>A string containing the message</summary>
19749 </member> 17734 </member>
19750 <member name="T:OpenMetaverse.Packets.CompleteAgentMovementPacket"> 17735 <member name="T:OpenMetaverse.GroupOperationEventArgs">
19751 <exclude /> 17736 <summary>Represents a response to a request</summary>
19752 </member> 17737 </member>
19753 <member name="T:OpenMetaverse.Packets.CompleteAgentMovementPacket.AgentDataBlock"> 17738 <member name="M:OpenMetaverse.GroupOperationEventArgs.#ctor(OpenMetaverse.UUID,System.Boolean)">
19754 <exclude /> 17739 <summary>Construct a new instance of the GroupOperationEventArgs class</summary>
17740 <param name="groupID">The ID of the group</param>
17741 <param name="success">true of the request was successful</param>
19755 </member> 17742 </member>
19756 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket"> 17743 <member name="P:OpenMetaverse.GroupOperationEventArgs.GroupID">
19757 <exclude /> 17744 <summary>Get the ID of the group</summary>
19758 </member> 17745 </member>
19759 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.AgentDataBlock"> 17746 <member name="P:OpenMetaverse.GroupOperationEventArgs.Success">
19760 <exclude /> 17747 <summary>true of the request was successful</summary>
19761 </member> 17748 </member>
19762 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.DataBlock"> 17749 <member name="T:OpenMetaverse.GroupDroppedEventArgs">
19763 <exclude /> 17750 <summary>Represents your agent leaving a group</summary>
19764 </member> 17751 </member>
19765 <member name="T:OpenMetaverse.Packets.AgentMovementCompletePacket.SimDataBlock"> 17752 <member name="M:OpenMetaverse.GroupDroppedEventArgs.#ctor(OpenMetaverse.UUID)">
19766 <exclude /> 17753 <summary>Construct a new instance of the GroupDroppedEventArgs class</summary>
17754 <param name="groupID">The ID of the group</param>
19767 </member> 17755 </member>
19768 <member name="T:OpenMetaverse.Packets.LogoutRequestPacket"> 17756 <member name="P:OpenMetaverse.GroupDroppedEventArgs.GroupID">
19769 <exclude /> 17757 <summary>Get the ID of the group</summary>
19770 </member> 17758 </member>
19771 <member name="T:OpenMetaverse.Packets.LogoutRequestPacket.AgentDataBlock"> 17759 <member name="T:OpenMetaverse.GroupNoticesListReplyEventArgs">
19772 <exclude /> 17760 <summary>Represents a list of active group notices</summary>
19773 </member> 17761 </member>
19774 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket"> 17762 <member name="M:OpenMetaverse.GroupNoticesListReplyEventArgs.#ctor(OpenMetaverse.UUID,System.Collections.Generic.List{OpenMetaverse.GroupNoticesListEntry})">
19775 <exclude /> 17763 <summary>Construct a new instance of the GroupNoticesListReplyEventArgs class</summary>
17764 <param name="groupID">The ID of the group</param>
17765 <param name="notices">The list containing active notices</param>
19776 </member> 17766 </member>
19777 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket.AgentDataBlock"> 17767 <member name="P:OpenMetaverse.GroupNoticesListReplyEventArgs.GroupID">
19778 <exclude /> 17768 <summary>Get the ID of the group</summary>
19779 </member> 17769 </member>
19780 <member name="T:OpenMetaverse.Packets.LogoutReplyPacket.InventoryDataBlock"> 17770 <member name="P:OpenMetaverse.GroupNoticesListReplyEventArgs.Notices">
19781 <exclude /> 17771 <summary>Get the notices list</summary>
19782 </member> 17772 </member>
19783 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket"> 17773 <member name="T:OpenMetaverse.GroupProfileEventArgs">
19784 <exclude /> 17774 <summary>Represents the profile of a group</summary>
19785 </member> 17775 </member>
19786 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket.AgentDataBlock"> 17776 <member name="M:OpenMetaverse.GroupProfileEventArgs.#ctor(OpenMetaverse.Group)">
19787 <exclude /> 17777 <summary>Construct a new instance of the GroupProfileEventArgs class</summary>
17778 <param name="group">The group profile</param>
19788 </member> 17779 </member>
19789 <member name="T:OpenMetaverse.Packets.ImprovedInstantMessagePacket.MessageBlockBlock"> 17780 <member name="P:OpenMetaverse.GroupProfileEventArgs.Group">
19790 <exclude /> 17781 <summary>Get the group profile</summary>
19791 </member> 17782 </member>
19792 <member name="T:OpenMetaverse.Packets.RetrieveInstantMessagesPacket"> 17783 <member name="T:OpenMetaverse.GroupInvitationEventArgs">
19793 <exclude /> 17784 <summary>
17785 Provides notification of a group invitation request sent by another Avatar
17786 </summary>
17787 <remarks>The <see cref="!:GroupInvitation"/> invitation is raised when another avatar makes an offer for our avatar
17788 to join a group.</remarks>
19794 </member> 17789 </member>
19795 <member name="T:OpenMetaverse.Packets.RetrieveInstantMessagesPacket.AgentDataBlock"> 17790 <member name="P:OpenMetaverse.GroupInvitationEventArgs.AgentID">
19796 <exclude /> 17791 <summary>The ID of the Avatar sending the group invitation</summary>
19797 </member> 17792 </member>
19798 <member name="T:OpenMetaverse.Packets.FindAgentPacket"> 17793 <member name="P:OpenMetaverse.GroupInvitationEventArgs.FromName">
19799 <exclude /> 17794 <summary>The name of the Avatar sending the group invitation</summary>
19800 </member> 17795 </member>
19801 <member name="T:OpenMetaverse.Packets.FindAgentPacket.AgentBlockBlock"> 17796 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Message">
19802 <exclude /> 17797 <summary>A message containing the request information which includes
17798 the name of the group, the groups charter and the fee to join details</summary>
19803 </member> 17799 </member>
19804 <member name="T:OpenMetaverse.Packets.FindAgentPacket.LocationBlockBlock"> 17800 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Simulator">
19805 <exclude /> 17801 <summary>The Simulator</summary>
19806 </member> 17802 </member>
19807 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket"> 17803 <member name="P:OpenMetaverse.GroupInvitationEventArgs.Accept">
19808 <exclude /> 17804 <summary>Set to true to accept invitation, false to decline</summary>
19809 </member> 17805 </member>
19810 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket.AgentDataBlock"> 17806 <member name="T:OpenMetaverse.Imaging.Baker">
19811 <exclude /> 17807 <summary>
17808 A set of textures that are layered on texture of each other and "baked"
17809 in to a single texture, for avatar appearances
17810 </summary>
19812 </member> 17811 </member>
19813 <member name="T:OpenMetaverse.Packets.RequestGodlikePowersPacket.RequestBlockBlock"> 17812 <member name="F:OpenMetaverse.Imaging.Baker.bakedTexture">
19814 <exclude /> 17813 <summary>Final baked texture</summary>
19815 </member> 17814 </member>
19816 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket"> 17815 <member name="F:OpenMetaverse.Imaging.Baker.textures">
19817 <exclude /> 17816 <summary>Component layers</summary>
19818 </member> 17817 </member>
19819 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket.AgentDataBlock"> 17818 <member name="F:OpenMetaverse.Imaging.Baker.bakeWidth">
19820 <exclude /> 17819 <summary>Width of the final baked image and scratchpad</summary>
19821 </member> 17820 </member>
19822 <member name="T:OpenMetaverse.Packets.GrantGodlikePowersPacket.GrantDataBlock"> 17821 <member name="F:OpenMetaverse.Imaging.Baker.bakeHeight">
19823 <exclude /> 17822 <summary>Height of the final baked image and scratchpad</summary>
19824 </member> 17823 </member>
19825 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket"> 17824 <member name="F:OpenMetaverse.Imaging.Baker.bakeType">
19826 <exclude /> 17825 <summary>Bake type</summary>
19827 </member> 17826 </member>
19828 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.AgentDataBlock"> 17827 <member name="M:OpenMetaverse.Imaging.Baker.#ctor(OpenMetaverse.BakeType)">
19829 <exclude /> 17828 <summary>
17829 Default constructor
17830 </summary>
17831 <param name="bakeType">Bake type</param>
19830 </member> 17832 </member>
19831 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.MethodDataBlock"> 17833 <member name="M:OpenMetaverse.Imaging.Baker.AddTexture(OpenMetaverse.AppearanceManager.TextureData)">
19832 <exclude /> 17834 <summary>
17835 Adds layer for baking
17836 </summary>
17837 <param name="tdata">TexturaData struct that contains texture and its params</param>
19833 </member> 17838 </member>
19834 <member name="T:OpenMetaverse.Packets.GodlikeMessagePacket.ParamListBlock"> 17839 <member name="M:OpenMetaverse.Imaging.Baker.BakeTypeFor(OpenMetaverse.AvatarTextureIndex)">
19835 <exclude /> 17840 <summary>
17841 Converts avatar texture index (face) to Bake type
17842 </summary>
17843 <param name="index">Face number (AvatarTextureIndex)</param>
17844 <returns>BakeType, layer to which this texture belongs to</returns>
19836 </member> 17845 </member>
19837 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket"> 17846 <member name="M:OpenMetaverse.Imaging.Baker.SanitizeLayers(OpenMetaverse.Imaging.ManagedImage,OpenMetaverse.Imaging.ManagedImage)">
19838 <exclude /> 17847 <summary>
17848 Make sure images exist, resize source if needed to match the destination
17849 </summary>
17850 <param name="dest">Destination image</param>
17851 <param name="src">Source image</param>
17852 <returns>Sanitization was succefull</returns>
19839 </member> 17853 </member>
19840 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.AgentDataBlock"> 17854 <member name="M:OpenMetaverse.Imaging.Baker.InitBakedLayerColor(OpenMetaverse.Color4)">
19841 <exclude /> 17855 <summary>
17856 Fills a baked layer as a solid *appearing* color. The colors are
17857 subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from
17858 compressing it too far since it seems to cause upload failures if
17859 the image is a pure solid color
17860 </summary>
17861 <param name="color">Color of the base of this layer</param>
19842 </member> 17862 </member>
19843 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.MethodDataBlock"> 17863 <member name="M:OpenMetaverse.Imaging.Baker.InitBakedLayerColor(System.Single,System.Single,System.Single)">
19844 <exclude /> 17864 <summary>
17865 Fills a baked layer as a solid *appearing* color. The colors are
17866 subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from
17867 compressing it too far since it seems to cause upload failures if
17868 the image is a pure solid color
17869 </summary>
17870 <param name="r">Red value</param>
17871 <param name="g">Green value</param>
17872 <param name="b">Blue value</param>
19845 </member> 17873 </member>
19846 <member name="T:OpenMetaverse.Packets.EstateOwnerMessagePacket.ParamListBlock"> 17874 <member name="P:OpenMetaverse.Imaging.Baker.BakedTexture">
19847 <exclude /> 17875 <summary>Final baked texture</summary>
19848 </member> 17876 </member>
19849 <member name="T:OpenMetaverse.Packets.GenericMessagePacket"> 17877 <member name="P:OpenMetaverse.Imaging.Baker.Textures">
19850 <exclude /> 17878 <summary>Component layers</summary>
19851 </member> 17879 </member>
19852 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.AgentDataBlock"> 17880 <member name="P:OpenMetaverse.Imaging.Baker.BakeWidth">
19853 <exclude /> 17881 <summary>Width of the final baked image and scratchpad</summary>
19854 </member> 17882 </member>
19855 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.MethodDataBlock"> 17883 <member name="P:OpenMetaverse.Imaging.Baker.BakeHeight">
19856 <exclude /> 17884 <summary>Height of the final baked image and scratchpad</summary>
19857 </member> 17885 </member>
19858 <member name="T:OpenMetaverse.Packets.GenericMessagePacket.ParamListBlock"> 17886 <member name="P:OpenMetaverse.Imaging.Baker.BakeType">
19859 <exclude /> 17887 <summary>Bake type</summary>
19860 </member> 17888 </member>
19861 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket"> 17889 <member name="P:OpenMetaverse.Imaging.Baker.IsSkin">
19862 <exclude /> 17890 <summary>Is this one of the 3 skin bakes</summary>
19863 </member> 17891 </member>
19864 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket.AgentDataBlock"> 17892 <member name="T:OpenMetaverse.Assets.AssetSound">
19865 <exclude /> 17893 <summary>
17894 Represents a Sound Asset
17895 </summary>
19866 </member> 17896 </member>
19867 <member name="T:OpenMetaverse.Packets.MuteListRequestPacket.MuteDataBlock"> 17897 <member name="M:OpenMetaverse.Assets.AssetSound.#ctor">
19868 <exclude /> 17898 <summary>Initializes a new instance of an AssetSound object</summary>
19869 </member> 17899 </member>
19870 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket"> 17900 <member name="M:OpenMetaverse.Assets.AssetSound.#ctor(OpenMetaverse.UUID,System.Byte[])">
19871 <exclude /> 17901 <summary>Initializes a new instance of an AssetSound object with parameters</summary>
17902 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
17903 <param name="assetData">A byte array containing the raw asset data</param>
19872 </member> 17904 </member>
19873 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket.AgentDataBlock"> 17905 <member name="M:OpenMetaverse.Assets.AssetSound.Encode">
19874 <exclude /> 17906 <summary>
17907 TODO: Encodes a sound file
17908 </summary>
19875 </member> 17909 </member>
19876 <member name="T:OpenMetaverse.Packets.UpdateMuteListEntryPacket.MuteDataBlock"> 17910 <member name="M:OpenMetaverse.Assets.AssetSound.Decode">
19877 <exclude /> 17911 <summary>
17912 TODO: Decode a sound file
17913 </summary>
17914 <returns>true</returns>
19878 </member> 17915 </member>
19879 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket"> 17916 <member name="P:OpenMetaverse.Assets.AssetSound.AssetType">
19880 <exclude /> 17917 <summary>Override the base classes AssetType</summary>
19881 </member> 17918 </member>
19882 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket.AgentDataBlock"> 17919 <member name="T:OpenMetaverse.Assets.AssetBodypart">
19883 <exclude /> 17920 <summary>
17921 Represents an <seealso cref="T:OpenMetaverse.Assets.AssetWearable"/> that represents an avatars body ie: Hair, Etc.
17922 </summary>
19884 </member> 17923 </member>
19885 <member name="T:OpenMetaverse.Packets.RemoveMuteListEntryPacket.MuteDataBlock"> 17924 <member name="M:OpenMetaverse.Assets.AssetBodypart.#ctor">
19886 <exclude /> 17925 <summary>Initializes a new instance of an AssetBodyPart object</summary>
19887 </member> 17926 </member>
19888 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket"> 17927 <member name="M:OpenMetaverse.Assets.AssetBodypart.#ctor(OpenMetaverse.UUID,System.Byte[])">
19889 <exclude /> 17928 <summary>Initializes a new instance of an AssetBodyPart object with parameters</summary>
17929 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
17930 <param name="assetData">A byte array containing the raw asset data</param>
19890 </member> 17931 </member>
19891 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.AgentDataBlock"> 17932 <member name="P:OpenMetaverse.Assets.AssetBodypart.AssetType">
19892 <exclude /> 17933 <summary>Override the base classes AssetType</summary>
19893 </member> 17934 </member>
19894 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.NotecardDataBlock"> 17935 <member name="T:OpenMetaverse.ProfileFlags">
19895 <exclude /> 17936 <summary>
17937 Avatar profile flags
17938 </summary>
19896 </member> 17939 </member>
19897 <member name="T:OpenMetaverse.Packets.CopyInventoryFromNotecardPacket.InventoryDataBlock"> 17940 <member name="T:OpenMetaverse.Avatar">
19898 <exclude /> 17941 <summary>
17942 Represents an avatar (other than your own)
17943 </summary>
19899 </member> 17944 </member>
19900 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket"> 17945 <member name="F:OpenMetaverse.Avatar.Groups">
19901 <exclude /> 17946 <summary>Groups that this avatar is a member of</summary>
19902 </member> 17947 </member>
19903 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket.AgentDataBlock"> 17948 <member name="F:OpenMetaverse.Avatar.ProfileStatistics">
19904 <exclude /> 17949 <summary>Positive and negative ratings</summary>
19905 </member> 17950 </member>
19906 <member name="T:OpenMetaverse.Packets.UpdateInventoryItemPacket.InventoryDataBlock"> 17951 <member name="F:OpenMetaverse.Avatar.ProfileProperties">
19907 <exclude /> 17952 <summary>Avatar properties including about text, profile URL, image IDs and
17953 publishing settings</summary>
19908 </member> 17954 </member>
19909 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket"> 17955 <member name="F:OpenMetaverse.Avatar.ProfileInterests">
19910 <exclude /> 17956 <summary>Avatar interests including spoken languages, skills, and "want to"
17957 choices</summary>
19911 </member> 17958 </member>
19912 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket.AgentDataBlock"> 17959 <member name="F:OpenMetaverse.Avatar.ControlFlags">
19913 <exclude /> 17960 <summary>Movement control flags for avatars. Typically not set or used by
17961 clients. To move your avatar, use Client.Self.Movement instead</summary>
19914 </member> 17962 </member>
19915 <member name="T:OpenMetaverse.Packets.UpdateCreateInventoryItemPacket.InventoryDataBlock"> 17963 <member name="F:OpenMetaverse.Avatar.VisualParameters">
19916 <exclude /> 17964 <summary>
17965 Contains the visual parameters describing the deformation of the avatar
17966 </summary>
19917 </member> 17967 </member>
19918 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket"> 17968 <member name="F:OpenMetaverse.Avatar.AppearanceVersion">
19919 <exclude /> 17969 <summary>
17970 Appearance version. Value greater than 0 indicates using server side baking
17971 </summary>
19920 </member> 17972 </member>
19921 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket.AgentDataBlock"> 17973 <member name="F:OpenMetaverse.Avatar.COFVersion">
19922 <exclude /> 17974 <summary>
17975 Version of the Current Outfit Folder that the appearance is based on
17976 </summary>
19923 </member> 17977 </member>
19924 <member name="T:OpenMetaverse.Packets.MoveInventoryItemPacket.InventoryDataBlock"> 17978 <member name="F:OpenMetaverse.Avatar.AppearanceFlags">
19925 <exclude /> 17979 <summary>
17980 Appearance flags. Introduced with server side baking, currently unused.
17981 </summary>
19926 </member> 17982 </member>
19927 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket"> 17983 <member name="F:OpenMetaverse.Avatar.Animations">
19928 <exclude /> 17984 <summary>
17985 List of current avatar animations
17986 </summary>
19929 </member> 17987 </member>
19930 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket.AgentDataBlock"> 17988 <member name="M:OpenMetaverse.Avatar.#ctor">
19931 <exclude /> 17989 <summary>
17990 Default constructor
17991 </summary>
19932 </member> 17992 </member>
19933 <member name="T:OpenMetaverse.Packets.CopyInventoryItemPacket.InventoryDataBlock"> 17993 <member name="P:OpenMetaverse.Avatar.FirstName">
19934 <exclude /> 17994 <summary>First name</summary>
19935 </member> 17995 </member>
19936 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket"> 17996 <member name="P:OpenMetaverse.Avatar.LastName">
19937 <exclude /> 17997 <summary>Last name</summary>
19938 </member> 17998 </member>
19939 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket.AgentDataBlock"> 17999 <member name="P:OpenMetaverse.Avatar.Name">
19940 <exclude /> 18000 <summary>Full name</summary>
19941 </member> 18001 </member>
19942 <member name="T:OpenMetaverse.Packets.RemoveInventoryItemPacket.InventoryDataBlock"> 18002 <member name="P:OpenMetaverse.Avatar.GroupName">
19943 <exclude /> 18003 <summary>Active group</summary>
19944 </member> 18004 </member>
19945 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket"> 18005 <member name="T:OpenMetaverse.Avatar.Statistics">
19946 <exclude /> 18006 <summary>
18007 Positive and negative ratings
18008 </summary>
19947 </member> 18009 </member>
19948 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket.AgentDataBlock"> 18010 <member name="F:OpenMetaverse.Avatar.Statistics.BehaviorPositive">
19949 <exclude /> 18011 <summary>Positive ratings for Behavior</summary>
19950 </member> 18012 </member>
19951 <member name="T:OpenMetaverse.Packets.ChangeInventoryItemFlagsPacket.InventoryDataBlock"> 18013 <member name="F:OpenMetaverse.Avatar.Statistics.BehaviorNegative">
19952 <exclude /> 18014 <summary>Negative ratings for Behavior</summary>
19953 </member> 18015 </member>
19954 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket"> 18016 <member name="F:OpenMetaverse.Avatar.Statistics.AppearancePositive">
19955 <exclude /> 18017 <summary>Positive ratings for Appearance</summary>
19956 </member> 18018 </member>
19957 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket.AgentDataBlock"> 18019 <member name="F:OpenMetaverse.Avatar.Statistics.AppearanceNegative">
19958 <exclude /> 18020 <summary>Negative ratings for Appearance</summary>
19959 </member> 18021 </member>
19960 <member name="T:OpenMetaverse.Packets.SaveAssetIntoInventoryPacket.InventoryDataBlock"> 18022 <member name="F:OpenMetaverse.Avatar.Statistics.BuildingPositive">
19961 <exclude /> 18023 <summary>Positive ratings for Building</summary>
19962 </member> 18024 </member>
19963 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket"> 18025 <member name="F:OpenMetaverse.Avatar.Statistics.BuildingNegative">
19964 <exclude /> 18026 <summary>Negative ratings for Building</summary>
19965 </member> 18027 </member>
19966 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket.AgentDataBlock"> 18028 <member name="F:OpenMetaverse.Avatar.Statistics.GivenPositive">
19967 <exclude /> 18029 <summary>Positive ratings given by this avatar</summary>
19968 </member> 18030 </member>
19969 <member name="T:OpenMetaverse.Packets.CreateInventoryFolderPacket.FolderDataBlock"> 18031 <member name="F:OpenMetaverse.Avatar.Statistics.GivenNegative">
19970 <exclude /> 18032 <summary>Negative ratings given by this avatar</summary>
19971 </member> 18033 </member>
19972 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket"> 18034 <member name="T:OpenMetaverse.Avatar.AvatarProperties">
19973 <exclude /> 18035 <summary>
18036 Avatar properties including about text, profile URL, image IDs and
18037 publishing settings
18038 </summary>
19974 </member> 18039 </member>
19975 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket.AgentDataBlock"> 18040 <member name="F:OpenMetaverse.Avatar.AvatarProperties.FirstLifeText">
19976 <exclude /> 18041 <summary>First Life about text</summary>
19977 </member> 18042 </member>
19978 <member name="T:OpenMetaverse.Packets.UpdateInventoryFolderPacket.FolderDataBlock"> 18043 <member name="F:OpenMetaverse.Avatar.AvatarProperties.FirstLifeImage">
19979 <exclude /> 18044 <summary>First Life image ID</summary>
19980 </member> 18045 </member>
19981 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket"> 18046 <member name="F:OpenMetaverse.Avatar.AvatarProperties.Partner">
19982 <exclude /> 18047 <summary></summary>
19983 </member> 18048 </member>
19984 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket.AgentDataBlock"> 18049 <member name="F:OpenMetaverse.Avatar.AvatarProperties.AboutText">
19985 <exclude /> 18050 <summary></summary>
19986 </member> 18051 </member>
19987 <member name="T:OpenMetaverse.Packets.MoveInventoryFolderPacket.InventoryDataBlock"> 18052 <member name="F:OpenMetaverse.Avatar.AvatarProperties.BornOn">
19988 <exclude /> 18053 <summary></summary>
19989 </member> 18054 </member>
19990 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket"> 18055 <member name="F:OpenMetaverse.Avatar.AvatarProperties.CharterMember">
19991 <exclude /> 18056 <summary></summary>
19992 </member> 18057 </member>
19993 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket.AgentDataBlock"> 18058 <member name="F:OpenMetaverse.Avatar.AvatarProperties.ProfileImage">
19994 <exclude /> 18059 <summary>Profile image ID</summary>
19995 </member> 18060 </member>
19996 <member name="T:OpenMetaverse.Packets.RemoveInventoryFolderPacket.FolderDataBlock"> 18061 <member name="F:OpenMetaverse.Avatar.AvatarProperties.Flags">
19997 <exclude /> 18062 <summary>Flags of the profile</summary>
19998 </member> 18063 </member>
19999 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket"> 18064 <member name="F:OpenMetaverse.Avatar.AvatarProperties.ProfileURL">
20000 <exclude /> 18065 <summary>Web URL for this profile</summary>
20001 </member> 18066 </member>
20002 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket.AgentDataBlock"> 18067 <member name="P:OpenMetaverse.Avatar.AvatarProperties.AllowPublish">
20003 <exclude /> 18068 <summary>Should this profile be published on the web</summary>
20004 </member> 18069 </member>
20005 <member name="T:OpenMetaverse.Packets.FetchInventoryDescendentsPacket.InventoryDataBlock"> 18070 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Online">
20006 <exclude /> 18071 <summary>Avatar Online Status</summary>
20007 </member> 18072 </member>
20008 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket"> 18073 <member name="P:OpenMetaverse.Avatar.AvatarProperties.MaturePublish">
20009 <exclude /> 18074 <summary>Is this a mature profile</summary>
20010 </member> 18075 </member>
20011 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.AgentDataBlock"> 18076 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Identified">
20012 <exclude /> 18077 <summary></summary>
20013 </member> 18078 </member>
20014 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.FolderDataBlock"> 18079 <member name="P:OpenMetaverse.Avatar.AvatarProperties.Transacted">
20015 <exclude /> 18080 <summary></summary>
20016 </member> 18081 </member>
20017 <member name="T:OpenMetaverse.Packets.InventoryDescendentsPacket.ItemDataBlock"> 18082 <member name="T:OpenMetaverse.Avatar.Interests">
20018 <exclude /> 18083 <summary>
18084 Avatar interests including spoken languages, skills, and "want to"
18085 choices
18086 </summary>
20019 </member> 18087 </member>
20020 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket"> 18088 <member name="F:OpenMetaverse.Avatar.Interests.LanguagesText">
20021 <exclude /> 18089 <summary>Languages profile field</summary>
20022 </member> 18090 </member>
20023 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket.AgentDataBlock"> 18091 <member name="F:OpenMetaverse.Avatar.Interests.SkillsMask">
20024 <exclude /> 18092 <summary></summary>
20025 </member> 18093 </member>
20026 <member name="T:OpenMetaverse.Packets.FetchInventoryPacket.InventoryDataBlock"> 18094 <member name="F:OpenMetaverse.Avatar.Interests.SkillsText">
20027 <exclude /> 18095 <summary></summary>
20028 </member> 18096 </member>
20029 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket"> 18097 <member name="F:OpenMetaverse.Avatar.Interests.WantToMask">
20030 <exclude /> 18098 <summary></summary>
20031 </member> 18099 </member>
20032 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket.AgentDataBlock"> 18100 <member name="F:OpenMetaverse.Avatar.Interests.WantToText">
20033 <exclude /> 18101 <summary></summary>
20034 </member> 18102 </member>
20035 <member name="T:OpenMetaverse.Packets.FetchInventoryReplyPacket.InventoryDataBlock"> 18103 <member name="T:OpenMetaverse.AvatarTextureIndex">
20036 <exclude /> 18104 <summary>
18105 Index of TextureEntry slots for avatar appearances
18106 </summary>
20037 </member> 18107 </member>
20038 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket"> 18108 <member name="T:OpenMetaverse.BakeType">
20039 <exclude /> 18109 <summary>
18110 Bake layers for avatar appearance
18111 </summary>
20040 </member> 18112 </member>
20041 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.AgentDataBlock"> 18113 <member name="T:OpenMetaverse.AppearanceFlags">
20042 <exclude /> 18114 <summary>
18115 Appearance Flags, introdued with server side baking, currently unused
18116 </summary>
20043 </member> 18117 </member>
20044 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.FolderDataBlock"> 18118 <member name="F:OpenMetaverse.AppearanceManager.MAX_CONCURRENT_DOWNLOADS">
20045 <exclude /> 18119 <summary>Maximum number of concurrent downloads for wearable assets and textures</summary>
20046 </member> 18120 </member>
20047 <member name="T:OpenMetaverse.Packets.BulkUpdateInventoryPacket.ItemDataBlock"> 18121 <member name="F:OpenMetaverse.AppearanceManager.MAX_CONCURRENT_UPLOADS">
20048 <exclude /> 18122 <summary>Maximum number of concurrent uploads for baked textures</summary>
20049 </member> 18123 </member>
20050 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket"> 18124 <member name="F:OpenMetaverse.AppearanceManager.INVENTORY_TIMEOUT">
20051 <exclude /> 18125 <summary>Timeout for fetching inventory listings</summary>
20052 </member> 18126 </member>
20053 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.AgentDataBlock"> 18127 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_TIMEOUT">
20054 <exclude /> 18128 <summary>Timeout for fetching a single wearable, or receiving a single packet response</summary>
20055 </member> 18129 </member>
20056 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.FolderDataBlock"> 18130 <member name="F:OpenMetaverse.AppearanceManager.TEXTURE_TIMEOUT">
20057 <exclude /> 18131 <summary>Timeout for fetching a single texture</summary>
20058 </member> 18132 </member>
20059 <member name="T:OpenMetaverse.Packets.RemoveInventoryObjectsPacket.ItemDataBlock"> 18133 <member name="F:OpenMetaverse.AppearanceManager.UPLOAD_TIMEOUT">
20060 <exclude /> 18134 <summary>Timeout for uploading a single baked texture</summary>
20061 </member> 18135 </member>
20062 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket"> 18136 <member name="F:OpenMetaverse.AppearanceManager.UPLOAD_RETRIES">
20063 <exclude /> 18137 <summary>Number of times to retry bake upload</summary>
20064 </member> 18138 </member>
20065 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket.AgentDataBlock"> 18139 <member name="F:OpenMetaverse.AppearanceManager.REBAKE_DELAY">
20066 <exclude /> 18140 <summary>When changing outfit, kick off rebake after
18141 20 seconds has passed since the last change</summary>
20067 </member> 18142 </member>
20068 <member name="T:OpenMetaverse.Packets.PurgeInventoryDescendentsPacket.InventoryDataBlock"> 18143 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_COUNT">
20069 <exclude /> 18144 <summary>Total number of wearables for each avatar</summary>
20070 </member> 18145 </member>
20071 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket"> 18146 <member name="F:OpenMetaverse.AppearanceManager.BAKED_TEXTURE_COUNT">
20072 <exclude /> 18147 <summary>Total number of baked textures on each avatar</summary>
20073 </member> 18148 </member>
20074 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.AgentDataBlock"> 18149 <member name="F:OpenMetaverse.AppearanceManager.WEARABLES_PER_LAYER">
20075 <exclude /> 18150 <summary>Total number of wearables per bake layer</summary>
20076 </member> 18151 </member>
20077 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.UpdateDataBlock"> 18152 <member name="F:OpenMetaverse.AppearanceManager.ATTACHMENT_ADD">
20078 <exclude /> 18153 <summary>Mask for multiple attachments</summary>
20079 </member> 18154 </member>
20080 <member name="T:OpenMetaverse.Packets.UpdateTaskInventoryPacket.InventoryDataBlock"> 18155 <member name="F:OpenMetaverse.AppearanceManager.BakeIndexToTextureIndex">
20081 <exclude /> 18156 <summary>Mapping between BakeType and AvatarTextureIndex</summary>
20082 </member> 18157 </member>
20083 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket"> 18158 <member name="F:OpenMetaverse.AppearanceManager.WEARABLE_BAKE_MAP">
20084 <exclude /> 18159 <summary>Map of what wearables are included in each bake</summary>
20085 </member> 18160 </member>
20086 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket.AgentDataBlock"> 18161 <member name="F:OpenMetaverse.AppearanceManager.BAKED_TEXTURE_HASH">
20087 <exclude /> 18162 <summary>Magic values to finalize the cache check hashes for each
18163 bake</summary>
20088 </member> 18164 </member>
20089 <member name="T:OpenMetaverse.Packets.RemoveTaskInventoryPacket.InventoryDataBlock"> 18165 <member name="F:OpenMetaverse.AppearanceManager.DEFAULT_AVATAR_TEXTURE">
20090 <exclude /> 18166 <summary>Default avatar texture, used to detect when a custom
18167 texture is not set for a face</summary>
20091 </member> 18168 </member>
20092 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket"> 18169 <member name="F:OpenMetaverse.AppearanceManager.m_AgentWearablesReply">
20093 <exclude /> 18170 <summary>The event subscribers. null if no subcribers</summary>
20094 </member> 18171 </member>
20095 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket.AgentDataBlock"> 18172 <member name="M:OpenMetaverse.AppearanceManager.OnAgentWearables(OpenMetaverse.AgentWearablesReplyEventArgs)">
20096 <exclude /> 18173 <summary>Raises the AgentWearablesReply event</summary>
18174 <param name="e">An AgentWearablesReplyEventArgs object containing the
18175 data returned from the data server</param>
20097 </member> 18176 </member>
20098 <member name="T:OpenMetaverse.Packets.MoveTaskInventoryPacket.InventoryDataBlock"> 18177 <member name="F:OpenMetaverse.AppearanceManager.m_AgentWearablesLock">
20099 <exclude /> 18178 <summary>Thread sync lock object</summary>
20100 </member> 18179 </member>
20101 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket"> 18180 <member name="F:OpenMetaverse.AppearanceManager.m_AgentCachedBakesReply">
20102 <exclude /> 18181 <summary>The event subscribers. null if no subcribers</summary>
20103 </member> 18182 </member>
20104 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket.AgentDataBlock"> 18183 <member name="M:OpenMetaverse.AppearanceManager.OnAgentCachedBakes(OpenMetaverse.AgentCachedBakesReplyEventArgs)">
20105 <exclude /> 18184 <summary>Raises the CachedBakesReply event</summary>
18185 <param name="e">An AgentCachedBakesReplyEventArgs object containing the
18186 data returned from the data server AgentCachedTextureResponse</param>
20106 </member> 18187 </member>
20107 <member name="T:OpenMetaverse.Packets.RequestTaskInventoryPacket.InventoryDataBlock"> 18188 <member name="F:OpenMetaverse.AppearanceManager.m_AgentCachedBakesLock">
20108 <exclude /> 18189 <summary>Thread sync lock object</summary>
20109 </member> 18190 </member>
20110 <member name="T:OpenMetaverse.Packets.ReplyTaskInventoryPacket"> 18191 <member name="F:OpenMetaverse.AppearanceManager.m_AppearanceSet">
20111 <exclude /> 18192 <summary>The event subscribers. null if no subcribers</summary>
20112 </member> 18193 </member>
20113 <member name="T:OpenMetaverse.Packets.ReplyTaskInventoryPacket.InventoryDataBlock"> 18194 <member name="M:OpenMetaverse.AppearanceManager.OnAppearanceSet(OpenMetaverse.AppearanceSetEventArgs)">
20114 <exclude /> 18195 <summary>Raises the AppearanceSet event</summary>
18196 <param name="e">An AppearanceSetEventArgs object indicating if the operatin was successfull</param>
20115 </member> 18197 </member>
20116 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket"> 18198 <member name="F:OpenMetaverse.AppearanceManager.m_AppearanceSetLock">
20117 <exclude /> 18199 <summary>Thread sync lock object</summary>
20118 </member> 18200 </member>
20119 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.AgentDataBlock"> 18201 <member name="F:OpenMetaverse.AppearanceManager.m_RebakeAvatarReply">
20120 <exclude /> 18202 <summary>The event subscribers. null if no subcribers</summary>
20121 </member> 18203 </member>
20122 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.AgentBlockBlock"> 18204 <member name="M:OpenMetaverse.AppearanceManager.OnRebakeAvatar(OpenMetaverse.RebakeAvatarTexturesEventArgs)">
20123 <exclude /> 18205 <summary>Raises the RebakeAvatarRequested event</summary>
18206 <param name="e">An RebakeAvatarTexturesEventArgs object containing the
18207 data returned from the data server</param>
20124 </member> 18208 </member>
20125 <member name="T:OpenMetaverse.Packets.DeRezObjectPacket.ObjectDataBlock"> 18209 <member name="F:OpenMetaverse.AppearanceManager.m_RebakeAvatarLock">
20126 <exclude /> 18210 <summary>Thread sync lock object</summary>
20127 </member> 18211 </member>
20128 <member name="T:OpenMetaverse.Packets.DeRezAckPacket"> 18212 <member name="F:OpenMetaverse.AppearanceManager.MyVisualParameters">
20129 <exclude /> 18213 <summary>Visual parameters last sent to the sim</summary>
20130 </member> 18214 </member>
20131 <member name="T:OpenMetaverse.Packets.DeRezAckPacket.TransactionDataBlock"> 18215 <member name="F:OpenMetaverse.AppearanceManager.MyTextures">
20132 <exclude /> 18216 <summary>Textures about this client sent to the sim</summary>
20133 </member> 18217 </member>
20134 <member name="T:OpenMetaverse.Packets.RezObjectPacket"> 18218 <member name="F:OpenMetaverse.AppearanceManager.Wearables">
20135 <exclude /> 18219 <summary>A cache of wearables currently being worn</summary>
20136 </member> 18220 </member>
20137 <member name="T:OpenMetaverse.Packets.RezObjectPacket.AgentDataBlock"> 18221 <member name="F:OpenMetaverse.AppearanceManager.Textures">
20138 <exclude /> 18222 <summary>A cache of textures currently being worn</summary>
20139 </member> 18223 </member>
20140 <member name="T:OpenMetaverse.Packets.RezObjectPacket.RezDataBlock"> 18224 <member name="F:OpenMetaverse.AppearanceManager.CacheCheckSerialNum">
20141 <exclude /> 18225 <summary>Incrementing serial number for AgentCachedTexture packets</summary>
20142 </member> 18226 </member>
20143 <member name="T:OpenMetaverse.Packets.RezObjectPacket.InventoryDataBlock"> 18227 <member name="F:OpenMetaverse.AppearanceManager.SetAppearanceSerialNum">
20144 <exclude /> 18228 <summary>Incrementing serial number for AgentSetAppearance packets</summary>
20145 </member> 18229 </member>
20146 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket"> 18230 <member name="F:OpenMetaverse.AppearanceManager.GotWearables">
20147 <exclude /> 18231 <summary>Indicates if WearablesRequest succeeded</summary>
20148 </member> 18232 </member>
20149 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.AgentDataBlock"> 18233 <member name="F:OpenMetaverse.AppearanceManager.AppearanceThreadRunning">
20150 <exclude /> 18234 <summary>Indicates whether or not the appearance thread is currently
18235 running, to prevent multiple appearance threads from running
18236 simultaneously</summary>
20151 </member> 18237 </member>
20152 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.RezDataBlock"> 18238 <member name="F:OpenMetaverse.AppearanceManager.Client">
20153 <exclude /> 18239 <summary>Reference to our agent</summary>
20154 </member> 18240 </member>
20155 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.NotecardDataBlock"> 18241 <member name="F:OpenMetaverse.AppearanceManager.RebakeScheduleTimer">
20156 <exclude /> 18242 <summary>
18243 Timer used for delaying rebake on changing outfit
18244 </summary>
20157 </member> 18245 </member>
20158 <member name="T:OpenMetaverse.Packets.RezObjectFromNotecardPacket.InventoryDataBlock"> 18246 <member name="F:OpenMetaverse.AppearanceManager.AppearanceThread">
20159 <exclude /> 18247 <summary>
18248 Main appearance thread
18249 </summary>
20160 </member> 18250 </member>
20161 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket"> 18251 <member name="F:OpenMetaverse.AppearanceManager.ServerBakingDone">
20162 <exclude /> 18252 <summary>
18253 Is server baking complete. It needs doing only once
18254 </summary>
20163 </member> 18255 </member>
20164 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.AgentDataBlock"> 18256 <member name="M:OpenMetaverse.AppearanceManager.#ctor(OpenMetaverse.GridClient)">
20165 <exclude /> 18257 <summary>
18258 Default constructor
18259 </summary>
18260 <param name="client">A reference to our agent</param>
20166 </member> 18261 </member>
20167 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.TransactionBlockBlock"> 18262 <member name="M:OpenMetaverse.AppearanceManager.SetPreviousAppearance">
20168 <exclude /> 18263 <summary>
18264 Obsolete method for setting appearance. This function no longer does anything.
18265 Use RequestSetAppearance() to manually start the appearance thread
18266 </summary>
20169 </member> 18267 </member>
20170 <member name="T:OpenMetaverse.Packets.AcceptFriendshipPacket.FolderDataBlock"> 18268 <member name="M:OpenMetaverse.AppearanceManager.SetPreviousAppearance(System.Boolean)">
20171 <exclude /> 18269 <summary>
18270 Obsolete method for setting appearance. This function no longer does anything.
18271 Use RequestSetAppearance() to manually start the appearance thread
18272 </summary>
18273 <param name="allowBake">Unused parameter</param>
20172 </member> 18274 </member>
20173 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket"> 18275 <member name="M:OpenMetaverse.AppearanceManager.RequestSetAppearance">
20174 <exclude /> 18276 <summary>
18277 Starts the appearance setting thread
18278 </summary>
20175 </member> 18279 </member>
20176 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket.AgentDataBlock"> 18280 <member name="M:OpenMetaverse.AppearanceManager.RequestSetAppearance(System.Boolean)">
20177 <exclude /> 18281 <summary>
18282 Starts the appearance setting thread
18283 </summary>
18284 <param name="forceRebake">True to force rebaking, otherwise false</param>
20178 </member> 18285 </member>
20179 <member name="T:OpenMetaverse.Packets.DeclineFriendshipPacket.TransactionBlockBlock"> 18286 <member name="M:OpenMetaverse.AppearanceManager.ServerBakingRegion">
20180 <exclude /> 18287 <summary>
18288 Check if current region supports server side baking
18289 </summary>
18290 <returns>True if server side baking support is detected</returns>
20181 </member> 18291 </member>
20182 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket"> 18292 <member name="M:OpenMetaverse.AppearanceManager.RequestAgentWearables">
20183 <exclude /> 18293 <summary>
18294 Ask the server what textures our agent is currently wearing
18295 </summary>
20184 </member> 18296 </member>
20185 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket.AgentDataBlock"> 18297 <member name="M:OpenMetaverse.AppearanceManager.RequestCachedBakes">
20186 <exclude /> 18298 <summary>
18299 Build hashes out of the texture assetIDs for each baking layer to
18300 ask the simulator whether it has cached copies of each baked texture
18301 </summary>
20187 </member> 18302 </member>
20188 <member name="T:OpenMetaverse.Packets.TerminateFriendshipPacket.ExBlockBlock"> 18303 <member name="M:OpenMetaverse.AppearanceManager.GetWearableAsset(OpenMetaverse.WearableType)">
20189 <exclude /> 18304 <summary>
18305 Returns the AssetID of the asset that is currently being worn in a
18306 given WearableType slot
18307 </summary>
18308 <param name="type">WearableType slot to get the AssetID for</param>
18309 <returns>The UUID of the asset being worn in the given slot, or
18310 UUID.Zero if no wearable is attached to the given slot or wearables
18311 have not been downloaded yet</returns>
20190 </member> 18312 </member>
20191 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket"> 18313 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(OpenMetaverse.InventoryItem)">
20192 <exclude /> 18314 <summary>
18315 Add a wearable to the current outfit and set appearance
18316 </summary>
18317 <param name="wearableItem">Wearable to be added to the outfit</param>
20193 </member> 18318 </member>
20194 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket.AgentDataBlock"> 18319 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(OpenMetaverse.InventoryItem,System.Boolean)">
20195 <exclude /> 18320 <summary>
18321 Add a wearable to the current outfit and set appearance
18322 </summary>
18323 <param name="wearableItem">Wearable to be added to the outfit</param>
18324 <param name="replace">Should existing item on the same point or of the same type be replaced</param>
20196 </member> 18325 </member>
20197 <member name="T:OpenMetaverse.Packets.OfferCallingCardPacket.AgentBlockBlock"> 18326 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})">
20198 <exclude /> 18327 <summary>
18328 Add a list of wearables to the current outfit and set appearance
18329 </summary>
18330 <param name="wearableItems">List of wearable inventory items to
18331 be added to the outfit</param>
18332 <param name="replace">Should existing item on the same point or of the same type be replaced</param>
20199 </member> 18333 </member>
20200 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket"> 18334 <member name="M:OpenMetaverse.AppearanceManager.AddToOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean)">
20201 <exclude /> 18335 <summary>
18336 Add a list of wearables to the current outfit and set appearance
18337 </summary>
18338 <param name="wearableItems">List of wearable inventory items to
18339 be added to the outfit</param>
18340 <param name="replace">Should existing item on the same point or of the same type be replaced</param>
20202 </member> 18341 </member>
20203 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.AgentDataBlock"> 18342 <member name="M:OpenMetaverse.AppearanceManager.RemoveFromOutfit(OpenMetaverse.InventoryItem)">
20204 <exclude /> 18343 <summary>
18344 Remove a wearable from the current outfit and set appearance
18345 </summary>
18346 <param name="wearableItem">Wearable to be removed from the outfit</param>
20205 </member> 18347 </member>
20206 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.TransactionBlockBlock"> 18348 <member name="M:OpenMetaverse.AppearanceManager.RemoveFromOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})">
20207 <exclude /> 18349 <summary>
18350 Removes a list of wearables from the current outfit and set appearance
18351 </summary>
18352 <param name="wearableItems">List of wearable inventory items to
18353 be removed from the outfit</param>
20208 </member> 18354 </member>
20209 <member name="T:OpenMetaverse.Packets.AcceptCallingCardPacket.FolderDataBlock"> 18355 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})">
20210 <exclude /> 18356 <summary>
18357 Replace the current outfit with a list of wearables and set appearance
18358 </summary>
18359 <param name="wearableItems">List of wearable inventory items that
18360 define a new outfit</param>
20211 </member> 18361 </member>
20212 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket"> 18362 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean)">
20213 <exclude /> 18363 <summary>
18364 Replace the current outfit with a list of wearables and set appearance
18365 </summary>
18366 <param name="wearableItems">List of wearable inventory items that
18367 define a new outfit</param>
18368 <param name="safe">Check if we have all body parts, set this to false only
18369 if you know what you're doing</param>
20214 </member> 18370 </member>
20215 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket.AgentDataBlock"> 18371 <member name="M:OpenMetaverse.AppearanceManager.IsItemWorn(OpenMetaverse.InventoryItem)">
20216 <exclude /> 18372 <summary>
18373 Checks if an inventory item is currently being worn
18374 </summary>
18375 <param name="item">The inventory item to check against the agent
18376 wearables</param>
18377 <returns>The WearableType slot that the item is being worn in,
18378 or WearbleType.Invalid if it is not currently being worn</returns>
20217 </member> 18379 </member>
20218 <member name="T:OpenMetaverse.Packets.DeclineCallingCardPacket.TransactionBlockBlock"> 18380 <member name="M:OpenMetaverse.AppearanceManager.GetWearables">
20219 <exclude /> 18381 <summary>
18382 Returns a copy of the agents currently worn wearables
18383 </summary>
18384 <returns>A copy of the agents currently worn wearables</returns>
18385 <remarks>Avoid calling this function multiple times as it will make
18386 a copy of all of the wearable data each time</remarks>
20220 </member> 18387 </member>
20221 <member name="T:OpenMetaverse.Packets.RezScriptPacket"> 18388 <member name="M:OpenMetaverse.AppearanceManager.WearOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryBase},System.Boolean)">
20222 <exclude /> 18389 <summary>
18390 Calls either <seealso cref="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryItem})"/> or
18391 <seealso cref="M:OpenMetaverse.AppearanceManager.AddToOutfit(OpenMetaverse.InventoryItem)"/> depending on the value of
18392 replaceItems
18393 </summary>
18394 <param name="wearables">List of wearable inventory items to add
18395 to the outfit or become a new outfit</param>
18396 <param name="replaceItems">True to replace existing items with the
18397 new list of items, false to add these items to the existing outfit</param>
20223 </member> 18398 </member>
20224 <member name="T:OpenMetaverse.Packets.RezScriptPacket.AgentDataBlock"> 18399 <member name="M:OpenMetaverse.AppearanceManager.AddAttachments(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean)">
20225 <exclude /> 18400 <summary>
18401 Adds a list of attachments to our agent
18402 </summary>
18403 <param name="attachments">A List containing the attachments to add</param>
18404 <param name="removeExistingFirst">If true, tells simulator to remove existing attachment
18405 first</param>
20226 </member> 18406 </member>
20227 <member name="T:OpenMetaverse.Packets.RezScriptPacket.UpdateBlockBlock"> 18407 <member name="M:OpenMetaverse.AppearanceManager.AddAttachments(System.Collections.Generic.List{OpenMetaverse.InventoryItem},System.Boolean,System.Boolean)">
20228 <exclude /> 18408 <summary>
18409 Adds a list of attachments to our agent
18410 </summary>
18411 <param name="attachments">A List containing the attachments to add</param>
18412 <param name="removeExistingFirst">If true, tells simulator to remove existing attachment
18413 <param name="replace">If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments)</param>
18414 first</param>
20229 </member> 18415 </member>
20230 <member name="T:OpenMetaverse.Packets.RezScriptPacket.InventoryBlockBlock"> 18416 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.InventoryItem,OpenMetaverse.AttachmentPoint)">
20231 <exclude /> 18417 <summary>
18418 Attach an item to our agent at a specific attach point
18419 </summary>
18420 <param name="item">A <seealso cref="T:OpenMetaverse.InventoryItem"/> to attach</param>
18421 <param name="attachPoint">the <seealso cref="T:OpenMetaverse.AttachmentPoint"/> on the avatar
18422 to attach the item to</param>
20232 </member> 18423 </member>
20233 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket"> 18424 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.InventoryItem,OpenMetaverse.AttachmentPoint,System.Boolean)">
20234 <exclude /> 18425 <summary>
18426 Attach an item to our agent at a specific attach point
18427 </summary>
18428 <param name="item">A <seealso cref="T:OpenMetaverse.InventoryItem"/> to attach</param>
18429 <param name="attachPoint">the <seealso cref="T:OpenMetaverse.AttachmentPoint"/> on the avatar
18430 <param name="replace">If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments)</param>
18431 to attach the item to</param>
20235 </member> 18432 </member>
20236 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket.AgentDataBlock"> 18433 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.Permissions,System.UInt32,OpenMetaverse.AttachmentPoint)">
20237 <exclude /> 18434 <summary>
18435 Attach an item to our agent specifying attachment details
18436 </summary>
18437 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the item to attach</param>
18438 <param name="ownerID">The <seealso cref="T:OpenMetaverse.UUID"/> attachments owner</param>
18439 <param name="name">The name of the attachment</param>
18440 <param name="description">The description of the attahment</param>
18441 <param name="perms">The <seealso cref="T:OpenMetaverse.Permissions"/> to apply when attached</param>
18442 <param name="itemFlags">The <seealso cref="T:OpenMetaverse.InventoryItemFlags"/> of the attachment</param>
18443 <param name="attachPoint">The <seealso cref="T:OpenMetaverse.AttachmentPoint"/> on the agent
18444 to attach the item to</param>
20238 </member> 18445 </member>
20239 <member name="T:OpenMetaverse.Packets.CreateInventoryItemPacket.InventoryBlockBlock"> 18446 <member name="M:OpenMetaverse.AppearanceManager.Attach(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.Permissions,System.UInt32,OpenMetaverse.AttachmentPoint,System.Boolean)">
20240 <exclude /> 18447 <summary>
18448 Attach an item to our agent specifying attachment details
18449 </summary>
18450 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the item to attach</param>
18451 <param name="ownerID">The <seealso cref="T:OpenMetaverse.UUID"/> attachments owner</param>
18452 <param name="name">The name of the attachment</param>
18453 <param name="description">The description of the attahment</param>
18454 <param name="perms">The <seealso cref="T:OpenMetaverse.Permissions"/> to apply when attached</param>
18455 <param name="itemFlags">The <seealso cref="T:OpenMetaverse.InventoryItemFlags"/> of the attachment</param>
18456 <param name="attachPoint">The <seealso cref="T:OpenMetaverse.AttachmentPoint"/> on the agent
18457 <param name="replace">If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments)</param>
18458 to attach the item to</param>
20241 </member> 18459 </member>
20242 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket"> 18460 <member name="M:OpenMetaverse.AppearanceManager.Detach(OpenMetaverse.InventoryItem)">
20243 <exclude /> 18461 <summary>
18462 Detach an item from our agent using an <seealso cref="T:OpenMetaverse.InventoryItem"/> object
18463 </summary>
18464 <param name="item">An <seealso cref="T:OpenMetaverse.InventoryItem"/> object</param>
20244 </member> 18465 </member>
20245 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.AgentDataBlock"> 18466 <member name="M:OpenMetaverse.AppearanceManager.Detach(OpenMetaverse.UUID)">
20246 <exclude /> 18467 <summary>
18468 Detach an item from our agent
18469 </summary>
18470 <param name="itemID">The inventory itemID of the item to detach</param>
20247 </member> 18471 </member>
20248 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.EventDataBlock"> 18472 <member name="M:OpenMetaverse.AppearanceManager.SendAgentIsNowWearing">
20249 <exclude /> 18473 <summary>
18474 Inform the sim which wearables are part of our current outfit
18475 </summary>
20250 </member> 18476 </member>
20251 <member name="T:OpenMetaverse.Packets.CreateLandmarkForEventPacket.InventoryBlockBlock"> 18477 <member name="M:OpenMetaverse.AppearanceManager.ReplaceOutfit(System.Collections.Generic.List{OpenMetaverse.InventoryWearable})">
20252 <exclude /> 18478 <summary>
18479 Replaces the Wearables collection with a list of new wearable items
18480 </summary>
18481 <param name="wearableItems">Wearable items to replace the Wearables collection with</param>
20253 </member> 18482 </member>
20254 <member name="T:OpenMetaverse.Packets.RegionHandleRequestPacket"> 18483 <member name="M:OpenMetaverse.AppearanceManager.GetColorFromParams(System.Collections.Generic.List{OpenMetaverse.AppearanceManager.ColorParamInfo})">
20255 <exclude /> 18484 <summary>
18485 Calculates base color/tint for a specific wearable
18486 based on its params
18487 </summary>
18488 <param name="param">All the color info gathered from wearable's VisualParams
18489 passed as list of ColorParamInfo tuples</param>
18490 <returns>Base color/tint for the wearable</returns>
20256 </member> 18491 </member>
20257 <member name="T:OpenMetaverse.Packets.RegionHandleRequestPacket.RequestBlockBlock"> 18492 <member name="M:OpenMetaverse.AppearanceManager.GetAgentWearables">
20258 <exclude /> 18493 <summary>
18494 Blocking method to populate the Wearables dictionary
18495 </summary>
18496 <returns>True on success, otherwise false</returns>
20259 </member> 18497 </member>
20260 <member name="T:OpenMetaverse.Packets.RegionIDAndHandleReplyPacket"> 18498 <member name="M:OpenMetaverse.AppearanceManager.GetCachedBakes">
20261 <exclude /> 18499 <summary>
18500 Blocking method to populate the Textures array with cached bakes
18501 </summary>
18502 <returns>True on success, otherwise false</returns>
20262 </member> 18503 </member>
20263 <member name="T:OpenMetaverse.Packets.RegionIDAndHandleReplyPacket.ReplyBlockBlock"> 18504 <member name="M:OpenMetaverse.AppearanceManager.DecodeWearableParams(OpenMetaverse.AppearanceManager.WearableData)">
20264 <exclude /> 18505 <summary>
18506 Populates textures and visual params from a decoded asset
18507 </summary>
18508 <param name="wearable">Wearable to decode</param>
20265 </member> 18509 </member>
20266 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket"> 18510 <member name="M:OpenMetaverse.AppearanceManager.DownloadWearables">
20267 <exclude /> 18511 <summary>
18512 Blocking method to download and parse currently worn wearable assets
18513 </summary>
18514 <returns>True on success, otherwise false</returns>
20268 </member> 18515 </member>
20269 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket.AgentDataBlock"> 18516 <member name="M:OpenMetaverse.AppearanceManager.GetTextureDownloadList(OpenMetaverse.BakeType)">
20270 <exclude /> 18517 <summary>
18518 Get a list of all of the textures that need to be downloaded for a
18519 single bake layer
18520 </summary>
18521 <param name="bakeType">Bake layer to get texture AssetIDs for</param>
18522 <returns>A list of texture AssetIDs to download</returns>
20271 </member> 18523 </member>
20272 <member name="T:OpenMetaverse.Packets.MoneyTransferRequestPacket.MoneyDataBlock"> 18524 <member name="M:OpenMetaverse.AppearanceManager.AddTextureDownload(OpenMetaverse.AvatarTextureIndex,System.Collections.Generic.List{OpenMetaverse.UUID})">
20273 <exclude /> 18525 <summary>
18526 Helper method to lookup the TextureID for a single layer and add it
18527 to a list if it is not already present
18528 </summary>
18529 <param name="index"></param>
18530 <param name="textures"></param>
20274 </member> 18531 </member>
20275 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket"> 18532 <member name="M:OpenMetaverse.AppearanceManager.DownloadTextures(System.Collections.Generic.List{OpenMetaverse.BakeType})">
20276 <exclude /> 18533 <summary>
18534 Blocking method to download all of the textures needed for baking
18535 the given bake layers
18536 </summary>
18537 <param name="bakeLayers">A list of layers that need baking</param>
18538 <remarks>No return value is given because the baking will happen
18539 whether or not all textures are successfully downloaded</remarks>
20277 </member> 18540 </member>
20278 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket.AgentDataBlock"> 18541 <member name="M:OpenMetaverse.AppearanceManager.CreateBakes">
20279 <exclude /> 18542 <summary>
18543 Blocking method to create and upload baked textures for all of the
18544 missing bakes
18545 </summary>
18546 <returns>True on success, otherwise false</returns>
20280 </member> 18547 </member>
20281 <member name="T:OpenMetaverse.Packets.MoneyBalanceRequestPacket.MoneyDataBlock"> 18548 <member name="M:OpenMetaverse.AppearanceManager.CreateBake(OpenMetaverse.BakeType)">
20282 <exclude /> 18549 <summary>
18550 Blocking method to create and upload a baked texture for a single
18551 bake layer
18552 </summary>
18553 <param name="bakeType">Layer to bake</param>
18554 <returns>True on success, otherwise false</returns>
20283 </member> 18555 </member>
20284 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket"> 18556 <member name="M:OpenMetaverse.AppearanceManager.UploadBake(System.Byte[])">
20285 <exclude /> 18557 <summary>
18558 Blocking method to upload a baked texture
18559 </summary>
18560 <param name="textureData">Five channel JPEG2000 texture data to upload</param>
18561 <returns>UUID of the newly created asset on success, otherwise UUID.Zero</returns>
20286 </member> 18562 </member>
20287 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket.MoneyDataBlock"> 18563 <member name="M:OpenMetaverse.AppearanceManager.MakeParamValues">
20288 <exclude /> 18564 <summary>
18565 Creates a dictionary of visual param values from the downloaded wearables
18566 </summary>
18567 <returns>A dictionary of visual param indices mapping to visual param
18568 values for our agent that can be fed to the Baker class</returns>
20289 </member> 18569 </member>
20290 <member name="T:OpenMetaverse.Packets.MoneyBalanceReplyPacket.TransactionInfoBlock"> 18570 <member name="M:OpenMetaverse.AppearanceManager.UpdateAvatarAppearance">
20291 <exclude /> 18571 <summary>
18572 Initate server baking process
18573 </summary>
18574 <returns>True if the server baking was successful</returns>
20292 </member> 18575 </member>
20293 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket"> 18576 <member name="M:OpenMetaverse.AppearanceManager.GetCOF">
20294 <exclude /> 18577 <summary>
18578 Get the latest version of COF
18579 </summary>
18580 <returns>Current Outfit Folder (or null if getting the data failed)</returns>
20295 </member> 18581 </member>
20296 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.TargetBlockBlock"> 18582 <member name="M:OpenMetaverse.AppearanceManager.RequestAgentSetAppearance">
20297 <exclude /> 18583 <summary>
18584 Create an AgentSetAppearance packet from Wearables data and the
18585 Textures array and send it
18586 </summary>
20298 </member> 18587 </member>
20299 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.MoneyDataBlock"> 18588 <member name="M:OpenMetaverse.AppearanceManager.WearableTypeToAssetType(OpenMetaverse.WearableType)">
20300 <exclude /> 18589 <summary>
18590 Converts a WearableType to a bodypart or clothing WearableType
18591 </summary>
18592 <param name="type">A WearableType</param>
18593 <returns>AssetType.Bodypart or AssetType.Clothing or AssetType.Unknown</returns>
20301 </member> 18594 </member>
20302 <member name="T:OpenMetaverse.Packets.RoutedMoneyBalanceReplyPacket.TransactionInfoBlock"> 18595 <member name="M:OpenMetaverse.AppearanceManager.BakeTypeToAgentTextureIndex(OpenMetaverse.BakeType)">
20303 <exclude /> 18596 <summary>
18597 Converts a BakeType to the corresponding baked texture slot in AvatarTextureIndex
18598 </summary>
18599 <param name="index">A BakeType</param>
18600 <returns>The AvatarTextureIndex slot that holds the given BakeType</returns>
20304 </member> 18601 </member>
20305 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket"> 18602 <member name="M:OpenMetaverse.AppearanceManager.MorphLayerForBakeType(OpenMetaverse.BakeType)">
20306 <exclude /> 18603 <summary>
18604 Gives the layer number that is used for morph mask
18605 </summary>
18606 <param name="bakeType">>A BakeType</param>
18607 <returns>Which layer number as defined in BakeTypeToTextures is used for morph mask</returns>
20307 </member> 18608 </member>
20308 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket.AgentDataBlock"> 18609 <member name="M:OpenMetaverse.AppearanceManager.BakeTypeToTextures(OpenMetaverse.BakeType)">
20309 <exclude /> 18610 <summary>
18611 Converts a BakeType to a list of the texture slots that make up that bake
18612 </summary>
18613 <param name="bakeType">A BakeType</param>
18614 <returns>A list of texture slots that are inputs for the given bake</returns>
20310 </member> 18615 </member>
20311 <member name="T:OpenMetaverse.Packets.ActivateGesturesPacket.DataBlock"> 18616 <member name="E:OpenMetaverse.AppearanceManager.AgentWearablesReply">
20312 <exclude /> 18617 <summary>Triggered when an AgentWearablesUpdate packet is received,
18618 telling us what our avatar is currently wearing
18619 <see cref="M:OpenMetaverse.AppearanceManager.RequestAgentWearables"/> request.</summary>
20313 </member> 18620 </member>
20314 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket"> 18621 <member name="E:OpenMetaverse.AppearanceManager.CachedBakesReply">
20315 <exclude /> 18622 <summary>Raised when an AgentCachedTextureResponse packet is
18623 received, giving a list of cached bakes that were found on the
18624 simulator
18625 <seealso cref="M:OpenMetaverse.AppearanceManager.RequestCachedBakes"/> request.</summary>
20316 </member> 18626 </member>
20317 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket.AgentDataBlock"> 18627 <member name="E:OpenMetaverse.AppearanceManager.AppearanceSet">
20318 <exclude /> 18628 <summary>
18629 Raised when appearance data is sent to the simulator, also indicates
18630 the main appearance thread is finished.
18631 </summary>
18632 <seealso cref="M:OpenMetaverse.AppearanceManager.RequestAgentSetAppearance"/> request.
20319 </member> 18633 </member>
20320 <member name="T:OpenMetaverse.Packets.DeactivateGesturesPacket.DataBlock"> 18634 <member name="E:OpenMetaverse.AppearanceManager.RebakeAvatarRequested">
20321 <exclude /> 18635 <summary>
18636 Triggered when the simulator requests the agent rebake its appearance.
18637 </summary>
18638 <seealso cref="!:RebakeAvatarRequest"/>
20322 </member> 18639 </member>
20323 <member name="T:OpenMetaverse.Packets.MuteListUpdatePacket"> 18640 <member name="P:OpenMetaverse.AppearanceManager.ManagerBusy">
20324 <exclude /> 18641 <summary>
18642 Returns true if AppearanceManager is busy and trying to set or change appearance will fail
18643 </summary>
20325 </member> 18644 </member>
20326 <member name="T:OpenMetaverse.Packets.MuteListUpdatePacket.MuteDataBlock"> 18645 <member name="T:OpenMetaverse.AppearanceManager.WearableData">
20327 <exclude /> 18646 <summary>
18647 Contains information about a wearable inventory item
18648 </summary>
20328 </member> 18649 </member>
20329 <member name="T:OpenMetaverse.Packets.UseCachedMuteListPacket"> 18650 <member name="F:OpenMetaverse.AppearanceManager.WearableData.ItemID">
20330 <exclude /> 18651 <summary>Inventory ItemID of the wearable</summary>
20331 </member> 18652 </member>
20332 <member name="T:OpenMetaverse.Packets.UseCachedMuteListPacket.AgentDataBlock"> 18653 <member name="F:OpenMetaverse.AppearanceManager.WearableData.AssetID">
20333 <exclude /> 18654 <summary>AssetID of the wearable asset</summary>
20334 </member> 18655 </member>
20335 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket"> 18656 <member name="F:OpenMetaverse.AppearanceManager.WearableData.WearableType">
20336 <exclude /> 18657 <summary>WearableType of the wearable</summary>
20337 </member> 18658 </member>
20338 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket.AgentDataBlock"> 18659 <member name="F:OpenMetaverse.AppearanceManager.WearableData.AssetType">
20339 <exclude /> 18660 <summary>AssetType of the wearable</summary>
20340 </member> 18661 </member>
20341 <member name="T:OpenMetaverse.Packets.GrantUserRightsPacket.RightsBlock"> 18662 <member name="F:OpenMetaverse.AppearanceManager.WearableData.Asset">
20342 <exclude /> 18663 <summary>Asset data for the wearable</summary>
20343 </member> 18664 </member>
20344 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket"> 18665 <member name="T:OpenMetaverse.AppearanceManager.ColorParamInfo">
20345 <exclude /> 18666 <summary>
18667 Data collected from visual params for each wearable
18668 needed for the calculation of the color
18669 </summary>
20346 </member> 18670 </member>
20347 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket.AgentDataBlock"> 18671 <member name="T:OpenMetaverse.AppearanceManager.TextureData">
20348 <exclude /> 18672 <summary>
18673 Holds a texture assetID and the data needed to bake this layer into
18674 an outfit texture. Used to keep track of currently worn textures
18675 and baking data
18676 </summary>
20349 </member> 18677 </member>
20350 <member name="T:OpenMetaverse.Packets.ChangeUserRightsPacket.RightsBlock"> 18678 <member name="F:OpenMetaverse.AppearanceManager.TextureData.TextureID">
20351 <exclude /> 18679 <summary>A texture AssetID</summary>
20352 </member> 18680 </member>
20353 <member name="T:OpenMetaverse.Packets.OnlineNotificationPacket"> 18681 <member name="F:OpenMetaverse.AppearanceManager.TextureData.Texture">
20354 <exclude /> 18682 <summary>Asset data for the texture</summary>
20355 </member> 18683 </member>
20356 <member name="T:OpenMetaverse.Packets.OnlineNotificationPacket.AgentBlockBlock"> 18684 <member name="F:OpenMetaverse.AppearanceManager.TextureData.AlphaMasks">
20357 <exclude /> 18685 <summary>Collection of alpha masks that needs applying</summary>
20358 </member> 18686 </member>
20359 <member name="T:OpenMetaverse.Packets.OfflineNotificationPacket"> 18687 <member name="F:OpenMetaverse.AppearanceManager.TextureData.Color">
20360 <exclude /> 18688 <summary>Tint that should be applied to the texture</summary>
20361 </member> 18689 </member>
20362 <member name="T:OpenMetaverse.Packets.OfflineNotificationPacket.AgentBlockBlock"> 18690 <member name="F:OpenMetaverse.AppearanceManager.TextureData.TextureIndex">
20363 <exclude /> 18691 <summary>Where on avatar does this texture belong</summary>
20364 </member> 18692 </member>
20365 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket"> 18693 <member name="T:OpenMetaverse.AgentWearablesReplyEventArgs">
20366 <exclude /> 18694 <summary>Contains the Event data returned from the data server from an AgentWearablesRequest</summary>
20367 </member> 18695 </member>
20368 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket.AgentDataBlock"> 18696 <member name="M:OpenMetaverse.AgentWearablesReplyEventArgs.#ctor">
20369 <exclude /> 18697 <summary>Construct a new instance of the AgentWearablesReplyEventArgs class</summary>
20370 </member> 18698 </member>
20371 <member name="T:OpenMetaverse.Packets.SetStartLocationRequestPacket.StartLocationDataBlock"> 18699 <member name="T:OpenMetaverse.AgentCachedBakesReplyEventArgs">
20372 <exclude /> 18700 <summary>Contains the Event data returned from the data server from an AgentCachedTextureResponse</summary>
20373 </member> 18701 </member>
20374 <member name="T:OpenMetaverse.Packets.AssetUploadRequestPacket"> 18702 <member name="M:OpenMetaverse.AgentCachedBakesReplyEventArgs.#ctor">
20375 <exclude /> 18703 <summary>Construct a new instance of the AgentCachedBakesReplyEventArgs class</summary>
20376 </member> 18704 </member>
20377 <member name="T:OpenMetaverse.Packets.AssetUploadRequestPacket.AssetBlockBlock"> 18705 <member name="T:OpenMetaverse.AppearanceSetEventArgs">
20378 <exclude /> 18706 <summary>Contains the Event data returned from an AppearanceSetRequest</summary>
20379 </member> 18707 </member>
20380 <member name="T:OpenMetaverse.Packets.AssetUploadCompletePacket"> 18708 <member name="M:OpenMetaverse.AppearanceSetEventArgs.#ctor(System.Boolean)">
20381 <exclude /> 18709 <summary>
18710 Triggered when appearance data is sent to the sim and
18711 the main appearance thread is done.</summary>
18712 <param name="success">Indicates whether appearance setting was successful</param>
20382 </member> 18713 </member>
20383 <member name="T:OpenMetaverse.Packets.AssetUploadCompletePacket.AssetBlockBlock"> 18714 <member name="P:OpenMetaverse.AppearanceSetEventArgs.Success">
20384 <exclude /> 18715 <summary>Indicates whether appearance setting was successful</summary>
20385 </member> 18716 </member>
20386 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket"> 18717 <member name="T:OpenMetaverse.RebakeAvatarTexturesEventArgs">
20387 <exclude /> 18718 <summary>Contains the Event data returned from the data server from an RebakeAvatarTextures</summary>
20388 </member> 18719 </member>
20389 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket.AgentDataBlock"> 18720 <member name="M:OpenMetaverse.RebakeAvatarTexturesEventArgs.#ctor(OpenMetaverse.UUID)">
20390 <exclude /> 18721 <summary>
18722 Triggered when the simulator sends a request for this agent to rebake
18723 its appearance
18724 </summary>
18725 <param name="textureID">The ID of the Texture Layer to bake</param>
20391 </member> 18726 </member>
20392 <member name="T:OpenMetaverse.Packets.CreateGroupRequestPacket.GroupDataBlock"> 18727 <member name="P:OpenMetaverse.RebakeAvatarTexturesEventArgs.TextureID">
20393 <exclude /> 18728 <summary>The ID of the Texture Layer to bake</summary>
20394 </member> 18729 </member>
20395 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket"> 18730 <member name="T:OpenMetaverse.Assets.AssetAnimation">
20396 <exclude /> 18731 <summary>
18732 Represents an Animation
18733 </summary>
20397 </member> 18734 </member>
20398 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket.AgentDataBlock"> 18735 <member name="M:OpenMetaverse.Assets.AssetAnimation.#ctor">
20399 <exclude /> 18736 <summary>Default Constructor</summary>
20400 </member> 18737 </member>
20401 <member name="T:OpenMetaverse.Packets.CreateGroupReplyPacket.ReplyDataBlock"> 18738 <member name="M:OpenMetaverse.Assets.AssetAnimation.#ctor(OpenMetaverse.UUID,System.Byte[])">
20402 <exclude /> 18739 <summary>
18740 Construct an Asset object of type Animation
18741 </summary>
18742 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
18743 <param name="assetData">A byte array containing the raw asset data</param>
20403 </member> 18744 </member>
20404 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket"> 18745 <member name="P:OpenMetaverse.Assets.AssetAnimation.AssetType">
20405 <exclude /> 18746 <summary>Override the base classes AssetType</summary>
20406 </member> 18747 </member>
20407 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket.AgentDataBlock"> 18748 <member name="T:OpenMetaverse.DictionaryEventAction">
20408 <exclude /> 18749 <summary>
18750
18751 </summary>
20409 </member> 18752 </member>
20410 <member name="T:OpenMetaverse.Packets.UpdateGroupInfoPacket.GroupDataBlock"> 18753 <member name="F:OpenMetaverse.DictionaryEventAction.Add">
20411 <exclude /> 18754 <summary>
18755
18756 </summary>
20412 </member> 18757 </member>
20413 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket"> 18758 <member name="F:OpenMetaverse.DictionaryEventAction.Remove">
20414 <exclude /> 18759 <summary>
18760
18761 </summary>
20415 </member> 18762 </member>
20416 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket.AgentDataBlock"> 18763 <member name="F:OpenMetaverse.DictionaryEventAction.Change">
20417 <exclude /> 18764 <summary>
18765
18766 </summary>
20418 </member> 18767 </member>
20419 <member name="T:OpenMetaverse.Packets.GroupRoleChangesPacket.RoleChangeBlock"> 18768 <member name="T:OpenMetaverse.DictionaryChangeCallback">
20420 <exclude /> 18769 <summary>
18770
18771 </summary>
18772 <param name="action"></param>
18773 <param name="entry"></param>
20421 </member> 18774 </member>
20422 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket"> 18775 <member name="T:OpenMetaverse.ObservableDictionary`2">
20423 <exclude /> 18776 <summary>
18777 The ObservableDictionary class is used for storing key/value pairs. It has methods for firing
18778 events to subscribers when items are added, removed, or changed.
18779 </summary>
18780 <typeparam name="TKey">Key <see langword="Tkey"/></typeparam>
18781 <typeparam name="TValue">Value <see langword="TValue"/></typeparam>
20424 </member> 18782 </member>
20425 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket.AgentDataBlock"> 18783 <member name="F:OpenMetaverse.ObservableDictionary`2.Delegates">
20426 <exclude /> 18784 <summary>
18785 A dictionary of callbacks to fire when specified action occurs
18786 </summary>
20427 </member> 18787 </member>
20428 <member name="T:OpenMetaverse.Packets.JoinGroupRequestPacket.GroupDataBlock"> 18788 <member name="M:OpenMetaverse.ObservableDictionary`2.AddDelegate(OpenMetaverse.DictionaryEventAction,OpenMetaverse.DictionaryChangeCallback)">
20429 <exclude /> 18789 <summary>
18790 Register a callback to be fired when an action occurs
18791 </summary>
18792 <param name="action">The action</param>
18793 <param name="callback">The callback to fire</param>
20430 </member> 18794 </member>
20431 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket"> 18795 <member name="M:OpenMetaverse.ObservableDictionary`2.RemoveDelegate(OpenMetaverse.DictionaryEventAction,OpenMetaverse.DictionaryChangeCallback)">
20432 <exclude /> 18796 <summary>
18797 Unregister a callback
18798 </summary>
18799 <param name="action">The action</param>
18800 <param name="callback">The callback to fire</param>
20433 </member> 18801 </member>
20434 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket.AgentDataBlock"> 18802 <member name="M:OpenMetaverse.ObservableDictionary`2.FireChangeEvent(OpenMetaverse.DictionaryEventAction,System.Collections.DictionaryEntry)">
20435 <exclude /> 18803 <summary>
18804
18805 </summary>
18806 <param name="action"></param>
18807 <param name="entry"></param>
20436 </member> 18808 </member>
20437 <member name="T:OpenMetaverse.Packets.JoinGroupReplyPacket.GroupDataBlock"> 18809 <member name="F:OpenMetaverse.ObservableDictionary`2.Dictionary">
20438 <exclude /> 18810 <summary>Internal dictionary that this class wraps around. Do not
18811 modify or enumerate the contents of this dictionary without locking</summary>
20439 </member> 18812 </member>
20440 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket"> 18813 <member name="M:OpenMetaverse.ObservableDictionary`2.#ctor">
20441 <exclude /> 18814 <summary>
18815 Initializes a new instance of the <seealso cref="T:ObservableDictionary"/> Class
18816 with the specified key/value, has the default initial capacity.
18817 </summary>
18818 <example>
18819 <code>
18820 // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value.
18821 public ObservableDictionary&lt;string, int&gt; testDict = new ObservableDictionary&lt;string, int&gt;();
18822 </code>
18823 </example>
20442 </member> 18824 </member>
20443 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.AgentDataBlock"> 18825 <member name="M:OpenMetaverse.ObservableDictionary`2.#ctor(System.Int32)">
20444 <exclude /> 18826 <summary>
18827 Initializes a new instance of the <seealso cref="T:OpenMetaverse.ObservableDictionary"/> Class
18828 with the specified key/value, With its initial capacity specified.
18829 </summary>
18830 <param name="capacity">Initial size of dictionary</param>
18831 <example>
18832 <code>
18833 // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value,
18834 // initially allocated room for 10 entries.
18835 public ObservableDictionary&lt;string, int&gt; testDict = new ObservableDictionary&lt;string, int&gt;(10);
18836 </code>
18837 </example>
20445 </member> 18838 </member>
20446 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.GroupDataBlock"> 18839 <member name="M:OpenMetaverse.ObservableDictionary`2.TryGetValue(`0,`1@)">
20447 <exclude /> 18840 <summary>
18841 Try to get entry from the <seealso cref="!:ObservableDictionary"/> with specified key
18842 </summary>
18843 <param name="key">Key to use for lookup</param>
18844 <param name="value">Value returned</param>
18845 <returns><see langword="true"/> if specified key exists, <see langword="false"/> if not found</returns>
18846 <example>
18847 <code>
18848 // find your avatar using the Simulator.ObjectsAvatars ObservableDictionary:
18849 Avatar av;
18850 if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av))
18851 Console.WriteLine("Found Avatar {0}", av.Name);
18852 </code>
18853 <seealso cref="F:OpenMetaverse.Simulator.ObjectsAvatars"/>
18854 </example>
20448 </member> 18855 </member>
20449 <member name="T:OpenMetaverse.Packets.EjectGroupMemberRequestPacket.EjectDataBlock"> 18856 <member name="M:OpenMetaverse.ObservableDictionary`2.Find(System.Predicate{`1})">
20450 <exclude /> 18857 <summary>
18858 Finds the specified match.
18859 </summary>
18860 <param name="match">The match.</param>
18861 <returns>Matched value</returns>
18862 <example>
18863 <code>
18864 // use a delegate to find a prim in the ObjectsPrimitives ObservableDictionary
18865 // with the ID 95683496
18866 uint findID = 95683496;
18867 Primitive findPrim = sim.ObjectsPrimitives.Find(
18868 delegate(Primitive prim) { return prim.ID == findID; });
18869 </code>
18870 </example>
20451 </member> 18871 </member>
20452 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket"> 18872 <member name="M:OpenMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`1})">
20453 <exclude /> 18873 <summary>Find All items in an <seealso cref="T:ObservableDictionary"/></summary>
18874 <param name="match">return matching items.</param>
18875 <returns>a <seealso cref="T:System.Collections.Generic.List"/> containing found items.</returns>
18876 <example>
18877 Find All prims within 20 meters and store them in a List
18878 <code>
18879 int radius = 20;
18880 List&lt;Primitive&gt; prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll(
18881 delegate(Primitive prim) {
18882 Vector3 pos = prim.Position;
18883 return ((prim.ParentID == 0) &amp;&amp; (pos != Vector3.Zero) &amp;&amp; (Vector3.Distance(pos, location) &lt; radius));
18884 }
18885 );
18886 </code>
18887 </example>
20454 </member> 18888 </member>
20455 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.AgentDataBlock"> 18889 <member name="M:OpenMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`0})">
20456 <exclude /> 18890 <summary>Find All items in an <seealso cref="T:ObservableDictionary"/></summary>
18891 <param name="match">return matching keys.</param>
18892 <returns>a <seealso cref="T:System.Collections.Generic.List"/> containing found keys.</returns>
18893 <example>
18894 Find All keys which also exist in another dictionary
18895 <code>
18896 List&lt;UUID&gt; matches = myDict.FindAll(
18897 delegate(UUID id) {
18898 return myOtherDict.ContainsKey(id);
18899 }
18900 );
18901 </code>
18902 </example>
20457 </member> 18903 </member>
20458 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.GroupDataBlock"> 18904 <member name="M:OpenMetaverse.ObservableDictionary`2.ContainsKey(`0)">
20459 <exclude /> 18905 <summary>Check if Key exists in Dictionary</summary>
18906 <param name="key">Key to check for</param>
18907 <returns><see langword="true"/> if found, <see langword="false"/> otherwise</returns>
20460 </member> 18908 </member>
20461 <member name="T:OpenMetaverse.Packets.EjectGroupMemberReplyPacket.EjectDataBlock"> 18909 <member name="M:OpenMetaverse.ObservableDictionary`2.ContainsValue(`1)">
20462 <exclude /> 18910 <summary>Check if Value exists in Dictionary</summary>
18911 <param name="value">Value to check for</param>
18912 <returns><see langword="true"/> if found, <see langword="false"/> otherwise</returns>
20463 </member> 18913 </member>
20464 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket"> 18914 <member name="M:OpenMetaverse.ObservableDictionary`2.Add(`0,`1)">
20465 <exclude /> 18915 <summary>
18916 Adds the specified key to the dictionary, dictionary locking is not performed,
18917 <see cref="!:SafeAdd"/>
18918 </summary>
18919 <param name="key">The key</param>
18920 <param name="value">The value</param>
20466 </member> 18921 </member>
20467 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket.AgentDataBlock"> 18922 <member name="M:OpenMetaverse.ObservableDictionary`2.Remove(`0)">
20468 <exclude /> 18923 <summary>
18924 Removes the specified key, dictionary locking is not performed
18925 </summary>
18926 <param name="key">The key.</param>
18927 <returns><see langword="true"/> if successful, <see langword="false"/> otherwise</returns>
20469 </member> 18928 </member>
20470 <member name="T:OpenMetaverse.Packets.LeaveGroupRequestPacket.GroupDataBlock"> 18929 <member name="M:OpenMetaverse.ObservableDictionary`2.Clear">
20471 <exclude /> 18930 <summary>
18931 Clear the contents of the dictionary
18932 </summary>
20472 </member> 18933 </member>
20473 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket"> 18934 <member name="M:OpenMetaverse.ObservableDictionary`2.GetEnumerator">
20474 <exclude /> 18935 <summary>
18936 Enumerator for iterating dictionary entries
18937 </summary>
18938 <returns></returns>
20475 </member> 18939 </member>
20476 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket.AgentDataBlock"> 18940 <member name="P:OpenMetaverse.ObservableDictionary`2.Count">
20477 <exclude /> 18941 <summary>
18942 Gets the number of Key/Value pairs contained in the <seealso cref="T:ObservableDictionary"/>
18943 </summary>
20478 </member> 18944 </member>
20479 <member name="T:OpenMetaverse.Packets.LeaveGroupReplyPacket.GroupDataBlock"> 18945 <member name="P:OpenMetaverse.ObservableDictionary`2.Item(`0)">
20480 <exclude /> 18946 <summary>
18947 Indexer for the dictionary
18948 </summary>
18949 <param name="key">The key</param>
18950 <returns>The value</returns>
20481 </member> 18951 </member>
20482 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket"> 18952 <member name="M:OpenMetaverse.InventoryNode.#ctor">
20483 <exclude /> 18953 <summary>
18954
18955 </summary>
20484 </member> 18956 </member>
20485 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.AgentDataBlock"> 18957 <member name="M:OpenMetaverse.InventoryNode.#ctor(OpenMetaverse.InventoryBase)">
20486 <exclude /> 18958 <summary>
18959
18960 </summary>
18961 <param name="data"></param>
20487 </member> 18962 </member>
20488 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.GroupDataBlock"> 18963 <member name="M:OpenMetaverse.InventoryNode.#ctor(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryNode)">
20489 <exclude /> 18964 <summary>
18965 De-serialization constructor for the InventoryNode Class
18966 </summary>
20490 </member> 18967 </member>
20491 <member name="T:OpenMetaverse.Packets.InviteGroupRequestPacket.InviteDataBlock"> 18968 <member name="M:OpenMetaverse.InventoryNode.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
20492 <exclude /> 18969 <summary>
18970 Serialization handler for the InventoryNode Class
18971 </summary>
20493 </member> 18972 </member>
20494 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket"> 18973 <member name="M:OpenMetaverse.InventoryNode.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
20495 <exclude /> 18974 <summary>
18975 De-serialization handler for the InventoryNode Class
18976 </summary>
20496 </member> 18977 </member>
20497 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket.AgentDataBlock"> 18978 <member name="M:OpenMetaverse.InventoryNode.ToString">
20498 <exclude /> 18979 <summary>
18980
18981 </summary>
18982 <returns></returns>
20499 </member> 18983 </member>
20500 <member name="T:OpenMetaverse.Packets.GroupProfileRequestPacket.GroupDataBlock"> 18984 <member name="P:OpenMetaverse.InventoryNode.Data">
20501 <exclude /> 18985 <summary></summary>
20502 </member> 18986 </member>
20503 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket"> 18987 <member name="P:OpenMetaverse.InventoryNode.Parent">
20504 <exclude /> 18988 <summary></summary>
20505 </member> 18989 </member>
20506 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket.AgentDataBlock"> 18990 <member name="P:OpenMetaverse.InventoryNode.ParentID">
20507 <exclude /> 18991 <summary></summary>
20508 </member> 18992 </member>
20509 <member name="T:OpenMetaverse.Packets.GroupProfileReplyPacket.GroupDataBlock"> 18993 <member name="P:OpenMetaverse.InventoryNode.Nodes">
20510 <exclude /> 18994 <summary></summary>
20511 </member> 18995 </member>
20512 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket"> 18996 <member name="P:OpenMetaverse.InventoryNode.NeedsUpdate">
20513 <exclude /> 18997 <summary>
18998 For inventory folder nodes specifies weather the folder needs to be
18999 refreshed from the server
19000 </summary>
20514 </member> 19001 </member>
20515 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket.AgentDataBlock"> 19002 <member name="T:OpenMetaverse.Imaging.LoadTGAClass">
20516 <exclude /> 19003 <summary>
19004 Capability to load TGAs to Bitmap
19005 </summary>
20517 </member> 19006 </member>
20518 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryRequestPacket.MoneyDataBlock"> 19007 <member name="T:OpenMetaverse.Assets.AssetNotecard">
20519 <exclude /> 19008 <summary>
19009 Represents a string of characters encoded with specific formatting properties
19010 </summary>
20520 </member> 19011 </member>
20521 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket"> 19012 <member name="F:OpenMetaverse.Assets.AssetNotecard.BodyText">
20522 <exclude /> 19013 <summary>A text string containing main text of the notecard</summary>
20523 </member> 19014 </member>
20524 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket.AgentDataBlock"> 19015 <member name="F:OpenMetaverse.Assets.AssetNotecard.EmbeddedItems">
20525 <exclude /> 19016 <summary>List of <see cref="T:OpenMetaverse.InventoryItem"/>s embedded on the notecard</summary>
20526 </member> 19017 </member>
20527 <member name="T:OpenMetaverse.Packets.GroupAccountSummaryReplyPacket.MoneyDataBlock"> 19018 <member name="M:OpenMetaverse.Assets.AssetNotecard.#ctor">
20528 <exclude /> 19019 <summary>Construct an Asset of type Notecard</summary>
20529 </member> 19020 </member>
20530 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket"> 19021 <member name="M:OpenMetaverse.Assets.AssetNotecard.#ctor(OpenMetaverse.UUID,System.Byte[])">
20531 <exclude /> 19022 <summary>
19023 Construct an Asset object of type Notecard
19024 </summary>
19025 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
19026 <param name="assetData">A byte array containing the raw asset data</param>
20532 </member> 19027 </member>
20533 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket.AgentDataBlock"> 19028 <member name="M:OpenMetaverse.Assets.AssetNotecard.Encode">
20534 <exclude /> 19029 <summary>
19030 Encode the raw contents of a string with the specific Linden Text properties
19031 </summary>
20535 </member> 19032 </member>
20536 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsRequestPacket.MoneyDataBlock"> 19033 <member name="M:OpenMetaverse.Assets.AssetNotecard.Decode">
20537 <exclude /> 19034 <summary>
19035 Decode the raw asset data including the Linden Text properties
19036 </summary>
19037 <returns>true if the AssetData was successfully decoded</returns>
20538 </member> 19038 </member>
20539 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket"> 19039 <member name="P:OpenMetaverse.Assets.AssetNotecard.AssetType">
20540 <exclude /> 19040 <summary>Override the base classes AssetType</summary>
20541 </member> 19041 </member>
20542 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.AgentDataBlock"> 19042 <member name="T:OpenMetaverse.RegionFlags">
20543 <exclude /> 19043 <summary>
19044 Simulator (region) properties
19045 </summary>
20544 </member> 19046 </member>
20545 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.MoneyDataBlock"> 19047 <member name="F:OpenMetaverse.RegionFlags.None">
20546 <exclude /> 19048 <summary>No flags set</summary>
20547 </member> 19049 </member>
20548 <member name="T:OpenMetaverse.Packets.GroupAccountDetailsReplyPacket.HistoryDataBlock"> 19050 <member name="F:OpenMetaverse.RegionFlags.AllowDamage">
20549 <exclude /> 19051 <summary>Agents can take damage and be killed</summary>
20550 </member> 19052 </member>
20551 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket"> 19053 <member name="F:OpenMetaverse.RegionFlags.AllowLandmark">
20552 <exclude /> 19054 <summary>Landmarks can be created here</summary>
20553 </member> 19055 </member>
20554 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket.AgentDataBlock"> 19056 <member name="F:OpenMetaverse.RegionFlags.AllowSetHome">
20555 <exclude /> 19057 <summary>Home position can be set in this sim</summary>
20556 </member> 19058 </member>
20557 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsRequestPacket.MoneyDataBlock"> 19059 <member name="F:OpenMetaverse.RegionFlags.ResetHomeOnTeleport">
20558 <exclude /> 19060 <summary>Home position is reset when an agent teleports away</summary>
20559 </member> 19061 </member>
20560 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket"> 19062 <member name="F:OpenMetaverse.RegionFlags.SunFixed">
20561 <exclude /> 19063 <summary>Sun does not move</summary>
20562 </member> 19064 </member>
20563 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.AgentDataBlock"> 19065 <member name="F:OpenMetaverse.RegionFlags.TaxFree">
20564 <exclude /> 19066 <summary>No object, land, etc. taxes</summary>
20565 </member> 19067 </member>
20566 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.MoneyDataBlock"> 19068 <member name="F:OpenMetaverse.RegionFlags.BlockTerraform">
20567 <exclude /> 19069 <summary>Disable heightmap alterations (agents can still plant
19070 foliage)</summary>
20568 </member> 19071 </member>
20569 <member name="T:OpenMetaverse.Packets.GroupAccountTransactionsReplyPacket.HistoryDataBlock"> 19072 <member name="F:OpenMetaverse.RegionFlags.BlockLandResell">
20570 <exclude /> 19073 <summary>Land cannot be released, sold, or purchased</summary>
20571 </member> 19074 </member>
20572 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket"> 19075 <member name="F:OpenMetaverse.RegionFlags.Sandbox">
20573 <exclude /> 19076 <summary>All content is wiped nightly</summary>
20574 </member> 19077 </member>
20575 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.AgentDataBlock"> 19078 <member name="F:OpenMetaverse.RegionFlags.NullLayer">
20576 <exclude /> 19079 <summary>Unknown: Related to the availability of an overview world map tile.(Think mainland images when zoomed out.)</summary>
20577 </member> 19080 </member>
20578 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.GroupDataBlock"> 19081 <member name="F:OpenMetaverse.RegionFlags.SkipAgentAction">
20579 <exclude /> 19082 <summary>Unknown: Related to region debug flags. Possibly to skip processing of agent interaction with world. </summary>
20580 </member> 19083 </member>
20581 <member name="T:OpenMetaverse.Packets.GroupActiveProposalsRequestPacket.TransactionDataBlock"> 19084 <member name="F:OpenMetaverse.RegionFlags.SkipUpdateInterestList">
20582 <exclude /> 19085 <summary>Region does not update agent prim interest lists. Internal debugging option.</summary>
20583 </member> 19086 </member>
20584 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket"> 19087 <member name="F:OpenMetaverse.RegionFlags.SkipCollisions">
20585 <exclude /> 19088 <summary>No collision detection for non-agent objects</summary>
20586 </member> 19089 </member>
20587 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.AgentDataBlock"> 19090 <member name="F:OpenMetaverse.RegionFlags.SkipScripts">
20588 <exclude /> 19091 <summary>No scripts are ran</summary>
20589 </member> 19092 </member>
20590 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.TransactionDataBlock"> 19093 <member name="F:OpenMetaverse.RegionFlags.SkipPhysics">
20591 <exclude /> 19094 <summary>All physics processing is turned off</summary>
20592 </member> 19095 </member>
20593 <member name="T:OpenMetaverse.Packets.GroupActiveProposalItemReplyPacket.ProposalDataBlock"> 19096 <member name="F:OpenMetaverse.RegionFlags.ExternallyVisible">
20594 <exclude /> 19097 <summary>Region can be seen from other regions on world map. (Legacy world map option?) </summary>
20595 </member> 19098 </member>
20596 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket"> 19099 <member name="F:OpenMetaverse.RegionFlags.MainlandVisible">
20597 <exclude /> 19100 <summary>Region can be seen from mainland on world map. (Legacy world map option?) </summary>
20598 </member> 19101 </member>
20599 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.AgentDataBlock"> 19102 <member name="F:OpenMetaverse.RegionFlags.PublicAllowed">
20600 <exclude /> 19103 <summary>Agents not explicitly on the access list can visit the region. </summary>
20601 </member> 19104 </member>
20602 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.GroupDataBlock"> 19105 <member name="F:OpenMetaverse.RegionFlags.BlockDwell">
20603 <exclude /> 19106 <summary>Traffic calculations are not run across entire region, overrides parcel settings. </summary>
20604 </member> 19107 </member>
20605 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryRequestPacket.TransactionDataBlock"> 19108 <member name="F:OpenMetaverse.RegionFlags.NoFly">
20606 <exclude /> 19109 <summary>Flight is disabled (not currently enforced by the sim)</summary>
20607 </member> 19110 </member>
20608 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket"> 19111 <member name="F:OpenMetaverse.RegionFlags.AllowDirectTeleport">
20609 <exclude /> 19112 <summary>Allow direct (p2p) teleporting</summary>
20610 </member> 19113 </member>
20611 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.AgentDataBlock"> 19114 <member name="F:OpenMetaverse.RegionFlags.EstateSkipScripts">
20612 <exclude /> 19115 <summary>Estate owner has temporarily disabled scripting</summary>
20613 </member> 19116 </member>
20614 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.TransactionDataBlock"> 19117 <member name="F:OpenMetaverse.RegionFlags.RestrictPushObject">
20615 <exclude /> 19118 <summary>Restricts the usage of the LSL llPushObject function, applies to whole region.</summary>
20616 </member> 19119 </member>
20617 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.HistoryItemDataBlock"> 19120 <member name="F:OpenMetaverse.RegionFlags.DenyAnonymous">
20618 <exclude /> 19121 <summary>Deny agents with no payment info on file</summary>
20619 </member> 19122 </member>
20620 <member name="T:OpenMetaverse.Packets.GroupVoteHistoryItemReplyPacket.VoteItemBlock"> 19123 <member name="F:OpenMetaverse.RegionFlags.DenyIdentified">
20621 <exclude /> 19124 <summary>Deny agents with payment info on file</summary>
20622 </member> 19125 </member>
20623 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket"> 19126 <member name="F:OpenMetaverse.RegionFlags.DenyTransacted">
20624 <exclude /> 19127 <summary>Deny agents who have made a monetary transaction</summary>
20625 </member> 19128 </member>
20626 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket.AgentDataBlock"> 19129 <member name="F:OpenMetaverse.RegionFlags.AllowParcelChanges">
20627 <exclude /> 19130 <summary>Parcels within the region may be joined or divided by anyone, not just estate owners/managers. </summary>
20628 </member> 19131 </member>
20629 <member name="T:OpenMetaverse.Packets.StartGroupProposalPacket.ProposalDataBlock"> 19132 <member name="F:OpenMetaverse.RegionFlags.AbuseEmailToEstateOwner">
20630 <exclude /> 19133 <summary>Abuse reports sent from within this region are sent to the estate owner defined email. </summary>
20631 </member> 19134 </member>
20632 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket"> 19135 <member name="F:OpenMetaverse.RegionFlags.AllowVoice">
20633 <exclude /> 19136 <summary>Region is Voice Enabled</summary>
20634 </member> 19137 </member>
20635 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket.AgentDataBlock"> 19138 <member name="F:OpenMetaverse.RegionFlags.BlockParcelSearch">
20636 <exclude /> 19139 <summary>Removes the ability from parcel owners to set their parcels to show in search.</summary>
20637 </member> 19140 </member>
20638 <member name="T:OpenMetaverse.Packets.GroupProposalBallotPacket.ProposalDataBlock"> 19141 <member name="F:OpenMetaverse.RegionFlags.DenyAgeUnverified">
20639 <exclude /> 19142 <summary>Deny agents who have not been age verified from entering the region.</summary>
20640 </member> 19143 </member>
20641 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket"> 19144 <member name="T:OpenMetaverse.RegionProtocols">
20642 <exclude /> 19145 <summary>
19146 Region protocol flags
19147 </summary>
20643 </member> 19148 </member>
20644 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket.AgentDataBlock"> 19149 <member name="T:OpenMetaverse.SimAccess">
20645 <exclude /> 19150 <summary>
19151 Access level for a simulator
19152 </summary>
20646 </member> 19153 </member>
20647 <member name="T:OpenMetaverse.Packets.GroupMembersRequestPacket.GroupDataBlock"> 19154 <member name="F:OpenMetaverse.SimAccess.Unknown">
20648 <exclude /> 19155 <summary>Unknown or invalid access level</summary>
20649 </member> 19156 </member>
20650 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket"> 19157 <member name="F:OpenMetaverse.SimAccess.Trial">
20651 <exclude /> 19158 <summary>Trial accounts allowed</summary>
20652 </member> 19159 </member>
20653 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.AgentDataBlock"> 19160 <member name="F:OpenMetaverse.SimAccess.PG">
20654 <exclude /> 19161 <summary>PG rating</summary>
20655 </member> 19162 </member>
20656 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.GroupDataBlock"> 19163 <member name="F:OpenMetaverse.SimAccess.Mature">
20657 <exclude /> 19164 <summary>Mature rating</summary>
20658 </member> 19165 </member>
20659 <member name="T:OpenMetaverse.Packets.GroupMembersReplyPacket.MemberDataBlock"> 19166 <member name="F:OpenMetaverse.SimAccess.Adult">
20660 <exclude /> 19167 <summary>Adult rating</summary>
20661 </member> 19168 </member>
20662 <member name="T:OpenMetaverse.Packets.ActivateGroupPacket"> 19169 <member name="F:OpenMetaverse.SimAccess.Down">
20663 <exclude /> 19170 <summary>Simulator is offline</summary>
20664 </member> 19171 </member>
20665 <member name="T:OpenMetaverse.Packets.ActivateGroupPacket.AgentDataBlock"> 19172 <member name="F:OpenMetaverse.SimAccess.NonExistent">
20666 <exclude /> 19173 <summary>Simulator does not exist</summary>
20667 </member> 19174 </member>
20668 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket"> 19175 <member name="T:OpenMetaverse.Simulator">
20669 <exclude /> 19176 <summary>
19177
19178 </summary>
20670 </member> 19179 </member>
20671 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket.AgentDataBlock"> 19180 <member name="F:OpenMetaverse.Simulator.Client">
20672 <exclude /> 19181 <summary>A public reference to the client that this Simulator object
19182 is attached to</summary>
20673 </member> 19183 </member>
20674 <member name="T:OpenMetaverse.Packets.SetGroupContributionPacket.DataBlock"> 19184 <member name="F:OpenMetaverse.Simulator.ID">
20675 <exclude /> 19185 <summary>A Unique Cache identifier for this simulator</summary>
20676 </member> 19186 </member>
20677 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket"> 19187 <member name="F:OpenMetaverse.Simulator.Caps">
20678 <exclude /> 19188 <summary>The capabilities for this simulator</summary>
20679 </member> 19189 </member>
20680 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.AgentDataBlock"> 19190 <member name="F:OpenMetaverse.Simulator.Handle">
20681 <exclude /> 19191 <summary></summary>
20682 </member> 19192 </member>
20683 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.DataBlock"> 19193 <member name="F:OpenMetaverse.Simulator.SimVersion">
20684 <exclude /> 19194 <summary>The current version of software this simulator is running</summary>
20685 </member> 19195 </member>
20686 <member name="T:OpenMetaverse.Packets.SetGroupAcceptNoticesPacket.NewDataBlock"> 19196 <member name="F:OpenMetaverse.Simulator.Name">
20687 <exclude /> 19197 <summary></summary>
20688 </member> 19198 </member>
20689 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket"> 19199 <member name="F:OpenMetaverse.Simulator.ParcelOverlay">
20690 <exclude /> 19200 <summary>A 64x64 grid of parcel coloring values. The values stored
19201 in this array are of the <seealso cref="!:ParcelArrayType"/> type</summary>
20691 </member> 19202 </member>
20692 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket.AgentDataBlock"> 19203 <member name="F:OpenMetaverse.Simulator.ParcelOverlaysReceived">
20693 <exclude /> 19204 <summary></summary>
20694 </member> 19205 </member>
20695 <member name="T:OpenMetaverse.Packets.GroupRoleDataRequestPacket.GroupDataBlock"> 19206 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange00">
20696 <exclude /> 19207 <summary></summary>
20697 </member> 19208 </member>
20698 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket"> 19209 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange01">
20699 <exclude /> 19210 <summary></summary>
20700 </member> 19211 </member>
20701 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.AgentDataBlock"> 19212 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange10">
20702 <exclude /> 19213 <summary></summary>
20703 </member> 19214 </member>
20704 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.GroupDataBlock"> 19215 <member name="F:OpenMetaverse.Simulator.TerrainHeightRange11">
20705 <exclude /> 19216 <summary></summary>
20706 </member> 19217 </member>
20707 <member name="T:OpenMetaverse.Packets.GroupRoleDataReplyPacket.RoleDataBlock"> 19218 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight00">
20708 <exclude /> 19219 <summary></summary>
20709 </member> 19220 </member>
20710 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket"> 19221 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight01">
20711 <exclude /> 19222 <summary></summary>
20712 </member> 19223 </member>
20713 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket.AgentDataBlock"> 19224 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight10">
20714 <exclude /> 19225 <summary></summary>
20715 </member> 19226 </member>
20716 <member name="T:OpenMetaverse.Packets.GroupRoleMembersRequestPacket.GroupDataBlock"> 19227 <member name="F:OpenMetaverse.Simulator.TerrainStartHeight11">
20717 <exclude /> 19228 <summary></summary>
20718 </member> 19229 </member>
20719 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket"> 19230 <member name="F:OpenMetaverse.Simulator.WaterHeight">
20720 <exclude /> 19231 <summary></summary>
20721 </member> 19232 </member>
20722 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket.AgentDataBlock"> 19233 <member name="F:OpenMetaverse.Simulator.SimOwner">
20723 <exclude /> 19234 <summary></summary>
20724 </member> 19235 </member>
20725 <member name="T:OpenMetaverse.Packets.GroupRoleMembersReplyPacket.MemberDataBlock"> 19236 <member name="F:OpenMetaverse.Simulator.TerrainBase0">
20726 <exclude /> 19237 <summary></summary>
20727 </member> 19238 </member>
20728 <member name="T:OpenMetaverse.Packets.GroupTitlesRequestPacket"> 19239 <member name="F:OpenMetaverse.Simulator.TerrainBase1">
20729 <exclude /> 19240 <summary></summary>
20730 </member> 19241 </member>
20731 <member name="T:OpenMetaverse.Packets.GroupTitlesRequestPacket.AgentDataBlock"> 19242 <member name="F:OpenMetaverse.Simulator.TerrainBase2">
20732 <exclude /> 19243 <summary></summary>
20733 </member> 19244 </member>
20734 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket"> 19245 <member name="F:OpenMetaverse.Simulator.TerrainBase3">
20735 <exclude /> 19246 <summary></summary>
20736 </member> 19247 </member>
20737 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket.AgentDataBlock"> 19248 <member name="F:OpenMetaverse.Simulator.TerrainDetail0">
20738 <exclude /> 19249 <summary></summary>
20739 </member> 19250 </member>
20740 <member name="T:OpenMetaverse.Packets.GroupTitlesReplyPacket.GroupDataBlock"> 19251 <member name="F:OpenMetaverse.Simulator.TerrainDetail1">
20741 <exclude /> 19252 <summary></summary>
20742 </member> 19253 </member>
20743 <member name="T:OpenMetaverse.Packets.GroupTitleUpdatePacket"> 19254 <member name="F:OpenMetaverse.Simulator.TerrainDetail2">
20744 <exclude /> 19255 <summary></summary>
20745 </member> 19256 </member>
20746 <member name="T:OpenMetaverse.Packets.GroupTitleUpdatePacket.AgentDataBlock"> 19257 <member name="F:OpenMetaverse.Simulator.TerrainDetail3">
20747 <exclude /> 19258 <summary></summary>
20748 </member> 19259 </member>
20749 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket"> 19260 <member name="F:OpenMetaverse.Simulator.IsEstateManager">
20750 <exclude /> 19261 <summary>true if your agent has Estate Manager rights on this region</summary>
20751 </member> 19262 </member>
20752 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket.AgentDataBlock"> 19263 <member name="F:OpenMetaverse.Simulator.Flags">
20753 <exclude /> 19264 <summary></summary>
20754 </member> 19265 </member>
20755 <member name="T:OpenMetaverse.Packets.GroupRoleUpdatePacket.RoleDataBlock"> 19266 <member name="F:OpenMetaverse.Simulator.Access">
20756 <exclude /> 19267 <summary></summary>
20757 </member> 19268 </member>
20758 <member name="T:OpenMetaverse.Packets.LiveHelpGroupRequestPacket"> 19269 <member name="F:OpenMetaverse.Simulator.BillableFactor">
20759 <exclude /> 19270 <summary></summary>
20760 </member> 19271 </member>
20761 <member name="T:OpenMetaverse.Packets.LiveHelpGroupRequestPacket.RequestDataBlock"> 19272 <member name="F:OpenMetaverse.Simulator.Stats">
20762 <exclude /> 19273 <summary>Statistics information for this simulator and the
19274 connection to the simulator, calculated by the simulator itself
19275 and the library</summary>
20763 </member> 19276 </member>
20764 <member name="T:OpenMetaverse.Packets.LiveHelpGroupReplyPacket"> 19277 <member name="F:OpenMetaverse.Simulator.RegionID">
20765 <exclude /> 19278 <summary>The regions Unique ID</summary>
20766 </member> 19279 </member>
20767 <member name="T:OpenMetaverse.Packets.LiveHelpGroupReplyPacket.ReplyDataBlock"> 19280 <member name="F:OpenMetaverse.Simulator.ColoLocation">
20768 <exclude /> 19281 <summary>The physical data center the simulator is located</summary>
19282 <remarks>Known values are:
19283 <list type="table">
19284 <item>Dallas</item>
19285 <item>Chandler</item>
19286 <item>SF</item>
19287 </list>
19288 </remarks>
20769 </member> 19289 </member>
20770 <member name="T:OpenMetaverse.Packets.AgentWearablesRequestPacket"> 19290 <member name="F:OpenMetaverse.Simulator.CPUClass">
20771 <exclude /> 19291 <summary>The CPU Class of the simulator</summary>
19292 <remarks>Most full mainland/estate sims appear to be 5,
19293 Homesteads and Openspace appear to be 501</remarks>
20772 </member> 19294 </member>
20773 <member name="T:OpenMetaverse.Packets.AgentWearablesRequestPacket.AgentDataBlock"> 19295 <member name="F:OpenMetaverse.Simulator.CPURatio">
20774 <exclude /> 19296 <summary>The number of regions sharing the same CPU as this one</summary>
19297 <remarks>"Full Sims" appear to be 1, Homesteads appear to be 4</remarks>
20775 </member> 19298 </member>
20776 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket"> 19299 <member name="F:OpenMetaverse.Simulator.ProductName">
20777 <exclude /> 19300 <summary>The billing product name</summary>
19301 <remarks>Known values are:
19302 <list type="table">
19303 <item>Mainland / Full Region (Sku: 023)</item>
19304 <item>Estate / Full Region (Sku: 024)</item>
19305 <item>Estate / Openspace (Sku: 027)</item>
19306 <item>Estate / Homestead (Sku: 029)</item>
19307 <item>Mainland / Homestead (Sku: 129) (Linden Owned)</item>
19308 <item>Mainland / Linden Homes (Sku: 131)</item>
19309 </list>
19310 </remarks>
20778 </member> 19311 </member>
20779 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket.AgentDataBlock"> 19312 <member name="F:OpenMetaverse.Simulator.ProductSku">
20780 <exclude /> 19313 <summary>The billing product SKU</summary>
19314 <remarks>Known values are:
19315 <list type="table">
19316 <item>023 Mainland / Full Region</item>
19317 <item>024 Estate / Full Region</item>
19318 <item>027 Estate / Openspace</item>
19319 <item>029 Estate / Homestead</item>
19320 <item>129 Mainland / Homestead (Linden Owned)</item>
19321 <item>131 Linden Homes / Full Region</item>
19322 </list>
19323 </remarks>
20781 </member> 19324 </member>
20782 <member name="T:OpenMetaverse.Packets.AgentWearablesUpdatePacket.WearableDataBlock"> 19325 <member name="F:OpenMetaverse.Simulator.Protocols">
20783 <exclude /> 19326 <summary>
19327 Flags indicating which protocols this region supports
19328 </summary>
20784 </member> 19329 </member>
20785 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket"> 19330 <member name="F:OpenMetaverse.Simulator.Sequence">
20786 <exclude /> 19331 <summary>The current sequence number for packets sent to this
19332 simulator. Must be Interlocked before modifying. Only
19333 useful for applications manipulating sequence numbers</summary>
20787 </member> 19334 </member>
20788 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket.AgentDataBlock"> 19335 <member name="F:OpenMetaverse.Simulator.ObjectsAvatars">
20789 <exclude /> 19336 <summary>
19337 A thread-safe dictionary containing avatars in a simulator
19338 </summary>
20790 </member> 19339 </member>
20791 <member name="T:OpenMetaverse.Packets.AgentIsNowWearingPacket.WearableDataBlock"> 19340 <member name="F:OpenMetaverse.Simulator.ObjectsPrimitives">
20792 <exclude /> 19341 <summary>
19342 A thread-safe dictionary containing primitives in a simulator
19343 </summary>
20793 </member> 19344 </member>
20794 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket"> 19345 <member name="M:OpenMetaverse.Simulator.IsParcelMapFull">
20795 <exclude /> 19346 <summary>
19347 Checks simulator parcel map to make sure it has downloaded all data successfully
19348 </summary>
19349 <returns>true if map is full (contains no 0's)</returns>
20796 </member> 19350 </member>
20797 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket.AgentDataBlock"> 19351 <member name="F:OpenMetaverse.Simulator.AgentMovementComplete">
20798 <exclude /> 19352 <summary>
19353 Is it safe to send agent updates to this sim
19354 AgentMovementComplete message received
19355 </summary>
20799 </member> 19356 </member>
20800 <member name="T:OpenMetaverse.Packets.AgentCachedTexturePacket.WearableDataBlock"> 19357 <member name="F:OpenMetaverse.Simulator.DisconnectCandidate">
20801 <exclude /> 19358 <summary>Used internally to track sim disconnections</summary>
20802 </member> 19359 </member>
20803 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket"> 19360 <member name="F:OpenMetaverse.Simulator.ConnectedEvent">
20804 <exclude /> 19361 <summary>Event that is triggered when the simulator successfully
19362 establishes a connection</summary>
20805 </member> 19363 </member>
20806 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket.AgentDataBlock"> 19364 <member name="F:OpenMetaverse.Simulator.connected">
20807 <exclude /> 19365 <summary>Whether this sim is currently connected or not. Hooked up
19366 to the property Connected</summary>
20808 </member> 19367 </member>
20809 <member name="T:OpenMetaverse.Packets.AgentCachedTextureResponsePacket.WearableDataBlock"> 19368 <member name="F:OpenMetaverse.Simulator.avatarPositions">
20810 <exclude /> 19369 <summary>Coarse locations of avatars in this simulator</summary>
20811 </member> 19370 </member>
20812 <member name="T:OpenMetaverse.Packets.AgentDataUpdateRequestPacket"> 19371 <member name="F:OpenMetaverse.Simulator.preyID">
20813 <exclude /> 19372 <summary>AvatarPositions key representing TrackAgent target</summary>
20814 </member> 19373 </member>
20815 <member name="T:OpenMetaverse.Packets.AgentDataUpdateRequestPacket.AgentDataBlock"> 19374 <member name="F:OpenMetaverse.Simulator.PacketArchive">
20816 <exclude /> 19375 <summary>Sequence numbers of packets we've received
19376 (for duplicate checking)</summary>
20817 </member> 19377 </member>
20818 <member name="T:OpenMetaverse.Packets.AgentDataUpdatePacket"> 19378 <member name="F:OpenMetaverse.Simulator.NeedAck">
20819 <exclude /> 19379 <summary>Packets we sent out that need ACKs from the simulator</summary>
20820 </member> 19380 </member>
20821 <member name="T:OpenMetaverse.Packets.AgentDataUpdatePacket.AgentDataBlock"> 19381 <member name="F:OpenMetaverse.Simulator.pauseSerial">
20822 <exclude /> 19382 <summary>Sequence number for pause/resume</summary>
20823 </member> 19383 </member>
20824 <member name="T:OpenMetaverse.Packets.GroupDataUpdatePacket"> 19384 <member name="F:OpenMetaverse.Simulator.handshakeComplete">
20825 <exclude /> 19385 <summary>Indicates if UDP connection to the sim is fully established</summary>
20826 </member> 19386 </member>
20827 <member name="T:OpenMetaverse.Packets.GroupDataUpdatePacket.AgentGroupDataBlock"> 19387 <member name="M:OpenMetaverse.Simulator.#ctor(OpenMetaverse.GridClient,System.Net.IPEndPoint,System.UInt64)">
20828 <exclude /> 19388 <summary>
19389
19390 </summary>
19391 <param name="client">Reference to the GridClient object</param>
19392 <param name="address">IPEndPoint of the simulator</param>
19393 <param name="handle">handle of the simulator</param>
20829 </member> 19394 </member>
20830 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket"> 19395 <member name="M:OpenMetaverse.Simulator.Dispose">
20831 <exclude /> 19396 <summary>
19397 Called when this Simulator object is being destroyed
19398 </summary>
20832 </member> 19399 </member>
20833 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket.AgentDataBlock"> 19400 <member name="M:OpenMetaverse.Simulator.Connect(System.Boolean)">
20834 <exclude /> 19401 <summary>
19402 Attempt to connect to this simulator
19403 </summary>
19404 <param name="moveToSim">Whether to move our agent in to this sim or not</param>
19405 <returns>True if the connection succeeded or connection status is
19406 unknown, false if there was a failure</returns>
20835 </member> 19407 </member>
20836 <member name="T:OpenMetaverse.Packets.AgentGroupDataUpdatePacket.GroupDataBlock"> 19408 <member name="M:OpenMetaverse.Simulator.UseCircuitCode(System.Boolean)">
20837 <exclude /> 19409 <summary>
19410 Initiates connection to the simulator
19411 </summary>
19412 <param name="waitForAck">Should we block until ack for this packet is recieved</param>
20838 </member> 19413 </member>
20839 <member name="T:OpenMetaverse.Packets.AgentDropGroupPacket"> 19414 <member name="M:OpenMetaverse.Simulator.Disconnect(System.Boolean)">
20840 <exclude /> 19415 <summary>
19416 Disconnect from this simulator
19417 </summary>
20841 </member> 19418 </member>
20842 <member name="T:OpenMetaverse.Packets.AgentDropGroupPacket.AgentDataBlock"> 19419 <member name="M:OpenMetaverse.Simulator.Pause">
20843 <exclude /> 19420 <summary>
19421 Instructs the simulator to stop sending update (and possibly other) packets
19422 </summary>
20844 </member> 19423 </member>
20845 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket"> 19424 <member name="M:OpenMetaverse.Simulator.Resume">
20846 <exclude /> 19425 <summary>
19426 Instructs the simulator to resume sending update packets (unpause)
19427 </summary>
20847 </member> 19428 </member>
20848 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket.AgentDataBlock"> 19429 <member name="M:OpenMetaverse.Simulator.TerrainHeightAtPoint(System.Int32,System.Int32,System.Single@)">
20849 <exclude /> 19430 <summary>
19431 Retrieve the terrain height at a given coordinate
19432 </summary>
19433 <param name="x">Sim X coordinate, valid range is from 0 to 255</param>
19434 <param name="y">Sim Y coordinate, valid range is from 0 to 255</param>
19435 <param name="height">The terrain height at the given point if the
19436 lookup was successful, otherwise 0.0f</param>
19437 <returns>True if the lookup was successful, otherwise false</returns>
20850 </member> 19438 </member>
20851 <member name="T:OpenMetaverse.Packets.RezSingleAttachmentFromInvPacket.ObjectDataBlock"> 19439 <member name="M:OpenMetaverse.Simulator.SendPacket(OpenMetaverse.Packets.Packet)">
20852 <exclude /> 19440 <summary>
19441 Sends a packet
19442 </summary>
19443 <param name="packet">Packet to be sent</param>
20853 </member> 19444 </member>
20854 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket"> 19445 <member name="M:OpenMetaverse.Simulator.SendPing">
20855 <exclude /> 19446 <summary>
19447
19448 </summary>
20856 </member> 19449 </member>
20857 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.AgentDataBlock"> 19450 <member name="M:OpenMetaverse.Simulator.ToString">
20858 <exclude /> 19451 <summary>
19452 Returns Simulator Name as a String
19453 </summary>
19454 <returns></returns>
20859 </member> 19455 </member>
20860 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.HeaderDataBlock"> 19456 <member name="M:OpenMetaverse.Simulator.GetHashCode">
20861 <exclude /> 19457 <summary>
19458
19459 </summary>
19460 <returns></returns>
20862 </member> 19461 </member>
20863 <member name="T:OpenMetaverse.Packets.RezMultipleAttachmentsFromInvPacket.ObjectDataBlock"> 19462 <member name="M:OpenMetaverse.Simulator.Equals(System.Object)">
20864 <exclude /> 19463 <summary>
19464
19465 </summary>
19466 <param name="obj"></param>
19467 <returns></returns>
20865 </member> 19468 </member>
20866 <member name="T:OpenMetaverse.Packets.DetachAttachmentIntoInvPacket"> 19469 <member name="M:OpenMetaverse.Simulator.SendAcks">
20867 <exclude /> 19470 <summary>
19471 Sends out pending acknowledgements
19472 </summary>
19473 <returns>Number of ACKs sent</returns>
20868 </member> 19474 </member>
20869 <member name="T:OpenMetaverse.Packets.DetachAttachmentIntoInvPacket.ObjectDataBlock"> 19475 <member name="M:OpenMetaverse.Simulator.ResendUnacked">
20870 <exclude /> 19476 <summary>
19477 Resend unacknowledged packets
19478 </summary>
20871 </member> 19479 </member>
20872 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket"> 19480 <member name="P:OpenMetaverse.Simulator.Parcels">
20873 <exclude /> 19481 <summary>
19482 Provides access to an internal thread-safe dictionary containing parcel
19483 information found in this simulator
19484 </summary>
20874 </member> 19485 </member>
20875 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.AgentDataBlock"> 19486 <member name="P:OpenMetaverse.Simulator.ParcelMap">
20876 <exclude /> 19487 <summary>
19488 Provides access to an internal thread-safe multidimensional array containing a x,y grid mapped
19489 to each 64x64 parcel's LocalID.
19490 </summary>
20877 </member> 19491 </member>
20878 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.HeaderDataBlock"> 19492 <member name="P:OpenMetaverse.Simulator.IPEndPoint">
20879 <exclude /> 19493 <summary>The IP address and port of the server</summary>
20880 </member> 19494 </member>
20881 <member name="T:OpenMetaverse.Packets.CreateNewOutfitAttachmentsPacket.ObjectDataBlock"> 19495 <member name="P:OpenMetaverse.Simulator.Connected">
20882 <exclude /> 19496 <summary>Whether there is a working connection to the simulator or
19497 not</summary>
20883 </member> 19498 </member>
20884 <member name="T:OpenMetaverse.Packets.UserInfoRequestPacket"> 19499 <member name="P:OpenMetaverse.Simulator.AvatarPositions">
20885 <exclude /> 19500 <summary>Coarse locations of avatars in this simulator</summary>
20886 </member> 19501 </member>
20887 <member name="T:OpenMetaverse.Packets.UserInfoRequestPacket.AgentDataBlock"> 19502 <member name="P:OpenMetaverse.Simulator.PreyID">
20888 <exclude /> 19503 <summary>AvatarPositions key representing TrackAgent target</summary>
20889 </member> 19504 </member>
20890 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket"> 19505 <member name="P:OpenMetaverse.Simulator.HandshakeComplete">
20891 <exclude /> 19506 <summary>Indicates if UDP connection to the sim is fully established</summary>
20892 </member> 19507 </member>
20893 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket.AgentDataBlock"> 19508 <member name="T:OpenMetaverse.Simulator.SimStats">
20894 <exclude /> 19509 <summary>
19510 Simulator Statistics
19511 </summary>
20895 </member> 19512 </member>
20896 <member name="T:OpenMetaverse.Packets.UserInfoReplyPacket.UserDataBlock"> 19513 <member name="F:OpenMetaverse.Simulator.SimStats.SentPackets">
20897 <exclude /> 19514 <summary>Total number of packets sent by this simulator to this agent</summary>
20898 </member> 19515 </member>
20899 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket"> 19516 <member name="F:OpenMetaverse.Simulator.SimStats.RecvPackets">
20900 <exclude /> 19517 <summary>Total number of packets received by this simulator to this agent</summary>
20901 </member> 19518 </member>
20902 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket.AgentDataBlock"> 19519 <member name="F:OpenMetaverse.Simulator.SimStats.SentBytes">
20903 <exclude /> 19520 <summary>Total number of bytes sent by this simulator to this agent</summary>
20904 </member> 19521 </member>
20905 <member name="T:OpenMetaverse.Packets.UpdateUserInfoPacket.UserDataBlock"> 19522 <member name="F:OpenMetaverse.Simulator.SimStats.RecvBytes">
20906 <exclude /> 19523 <summary>Total number of bytes received by this simulator to this agent</summary>
20907 </member> 19524 </member>
20908 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket"> 19525 <member name="F:OpenMetaverse.Simulator.SimStats.ConnectTime">
20909 <exclude /> 19526 <summary>Time in seconds agent has been connected to simulator</summary>
20910 </member> 19527 </member>
20911 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket.AgentDataBlock"> 19528 <member name="F:OpenMetaverse.Simulator.SimStats.ResentPackets">
20912 <exclude /> 19529 <summary>Total number of packets that have been resent</summary>
20913 </member> 19530 </member>
20914 <member name="T:OpenMetaverse.Packets.InitiateDownloadPacket.FileDataBlock"> 19531 <member name="F:OpenMetaverse.Simulator.SimStats.ReceivedResends">
20915 <exclude /> 19532 <summary>Total number of resent packets recieved</summary>
20916 </member> 19533 </member>
20917 <member name="T:OpenMetaverse.Packets.MapLayerRequestPacket"> 19534 <member name="F:OpenMetaverse.Simulator.SimStats.SentPings">
20918 <exclude /> 19535 <summary>Total number of pings sent to this simulator by this agent</summary>
20919 </member> 19536 </member>
20920 <member name="T:OpenMetaverse.Packets.MapLayerRequestPacket.AgentDataBlock"> 19537 <member name="F:OpenMetaverse.Simulator.SimStats.ReceivedPongs">
20921 <exclude /> 19538 <summary>Total number of ping replies sent to this agent by this simulator</summary>
20922 </member> 19539 </member>
20923 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket"> 19540 <member name="F:OpenMetaverse.Simulator.SimStats.IncomingBPS">
20924 <exclude /> 19541 <summary>
19542 Incoming bytes per second
19543 </summary>
19544 <remarks>It would be nice to have this claculated on the fly, but
19545 this is far, far easier</remarks>
20925 </member> 19546 </member>
20926 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket.AgentDataBlock"> 19547 <member name="F:OpenMetaverse.Simulator.SimStats.OutgoingBPS">
20927 <exclude /> 19548 <summary>
19549 Outgoing bytes per second
19550 </summary>
19551 <remarks>It would be nice to have this claculated on the fly, but
19552 this is far, far easier</remarks>
20928 </member> 19553 </member>
20929 <member name="T:OpenMetaverse.Packets.MapLayerReplyPacket.LayerDataBlock"> 19554 <member name="F:OpenMetaverse.Simulator.SimStats.LastPingSent">
20930 <exclude /> 19555 <summary>Time last ping was sent</summary>
20931 </member> 19556 </member>
20932 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket"> 19557 <member name="F:OpenMetaverse.Simulator.SimStats.LastPingID">
20933 <exclude /> 19558 <summary>ID of last Ping sent</summary>
20934 </member> 19559 </member>
20935 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket.AgentDataBlock"> 19560 <member name="F:OpenMetaverse.Simulator.SimStats.LastLag">
20936 <exclude /> 19561 <summary></summary>
20937 </member> 19562 </member>
20938 <member name="T:OpenMetaverse.Packets.MapBlockRequestPacket.PositionDataBlock"> 19563 <member name="F:OpenMetaverse.Simulator.SimStats.MissedPings">
20939 <exclude /> 19564 <summary></summary>
20940 </member> 19565 </member>
20941 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket"> 19566 <member name="F:OpenMetaverse.Simulator.SimStats.Dilation">
20942 <exclude /> 19567 <summary>Current time dilation of this simulator</summary>
20943 </member> 19568 </member>
20944 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket.AgentDataBlock"> 19569 <member name="F:OpenMetaverse.Simulator.SimStats.FPS">
20945 <exclude /> 19570 <summary>Current Frames per second of simulator</summary>
20946 </member> 19571 </member>
20947 <member name="T:OpenMetaverse.Packets.MapNameRequestPacket.NameDataBlock"> 19572 <member name="F:OpenMetaverse.Simulator.SimStats.PhysicsFPS">
20948 <exclude /> 19573 <summary>Current Physics frames per second of simulator</summary>
20949 </member> 19574 </member>
20950 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket"> 19575 <member name="F:OpenMetaverse.Simulator.SimStats.AgentUpdates">
20951 <exclude /> 19576 <summary></summary>
20952 </member> 19577 </member>
20953 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket.AgentDataBlock"> 19578 <member name="F:OpenMetaverse.Simulator.SimStats.FrameTime">
20954 <exclude /> 19579 <summary></summary>
20955 </member> 19580 </member>
20956 <member name="T:OpenMetaverse.Packets.MapBlockReplyPacket.DataBlock"> 19581 <member name="F:OpenMetaverse.Simulator.SimStats.NetTime">
20957 <exclude /> 19582 <summary></summary>
20958 </member> 19583 </member>
20959 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket"> 19584 <member name="F:OpenMetaverse.Simulator.SimStats.PhysicsTime">
20960 <exclude /> 19585 <summary></summary>
20961 </member> 19586 </member>
20962 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket.AgentDataBlock"> 19587 <member name="F:OpenMetaverse.Simulator.SimStats.ImageTime">
20963 <exclude /> 19588 <summary></summary>
20964 </member> 19589 </member>
20965 <member name="T:OpenMetaverse.Packets.MapItemRequestPacket.RequestDataBlock"> 19590 <member name="F:OpenMetaverse.Simulator.SimStats.ScriptTime">
20966 <exclude /> 19591 <summary></summary>
20967 </member> 19592 </member>
20968 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket"> 19593 <member name="F:OpenMetaverse.Simulator.SimStats.AgentTime">
20969 <exclude /> 19594 <summary></summary>
20970 </member> 19595 </member>
20971 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.AgentDataBlock"> 19596 <member name="F:OpenMetaverse.Simulator.SimStats.OtherTime">
20972 <exclude /> 19597 <summary></summary>
20973 </member> 19598 </member>
20974 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.RequestDataBlock"> 19599 <member name="F:OpenMetaverse.Simulator.SimStats.Objects">
20975 <exclude /> 19600 <summary>Total number of objects Simulator is simulating</summary>
20976 </member> 19601 </member>
20977 <member name="T:OpenMetaverse.Packets.MapItemReplyPacket.DataBlock"> 19602 <member name="F:OpenMetaverse.Simulator.SimStats.ScriptedObjects">
20978 <exclude /> 19603 <summary>Total number of Active (Scripted) objects running</summary>
20979 </member> 19604 </member>
20980 <member name="T:OpenMetaverse.Packets.SendPostcardPacket"> 19605 <member name="F:OpenMetaverse.Simulator.SimStats.Agents">
20981 <exclude /> 19606 <summary>Number of agents currently in this simulator</summary>
20982 </member> 19607 </member>
20983 <member name="T:OpenMetaverse.Packets.SendPostcardPacket.AgentDataBlock"> 19608 <member name="F:OpenMetaverse.Simulator.SimStats.ChildAgents">
20984 <exclude /> 19609 <summary>Number of agents in neighbor simulators</summary>
20985 </member> 19610 </member>
20986 <member name="T:OpenMetaverse.Packets.ParcelMediaCommandMessagePacket"> 19611 <member name="F:OpenMetaverse.Simulator.SimStats.ActiveScripts">
20987 <exclude /> 19612 <summary>Number of Active scripts running in this simulator</summary>
20988 </member> 19613 </member>
20989 <member name="T:OpenMetaverse.Packets.ParcelMediaCommandMessagePacket.CommandBlockBlock"> 19614 <member name="F:OpenMetaverse.Simulator.SimStats.LSLIPS">
20990 <exclude /> 19615 <summary></summary>
20991 </member> 19616 </member>
20992 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket"> 19617 <member name="F:OpenMetaverse.Simulator.SimStats.INPPS">
20993 <exclude /> 19618 <summary></summary>
20994 </member> 19619 </member>
20995 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket.DataBlockBlock"> 19620 <member name="F:OpenMetaverse.Simulator.SimStats.OUTPPS">
20996 <exclude /> 19621 <summary></summary>
20997 </member> 19622 </member>
20998 <member name="T:OpenMetaverse.Packets.ParcelMediaUpdatePacket.DataBlockExtendedBlock"> 19623 <member name="F:OpenMetaverse.Simulator.SimStats.PendingDownloads">
20999 <exclude /> 19624 <summary>Number of downloads pending</summary>
21000 </member> 19625 </member>
21001 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket"> 19626 <member name="F:OpenMetaverse.Simulator.SimStats.PendingUploads">
21002 <exclude /> 19627 <summary>Number of uploads pending</summary>
21003 </member> 19628 </member>
21004 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket.AgentDataBlock"> 19629 <member name="F:OpenMetaverse.Simulator.SimStats.VirtualSize">
21005 <exclude /> 19630 <summary></summary>
21006 </member> 19631 </member>
21007 <member name="T:OpenMetaverse.Packets.LandStatRequestPacket.RequestDataBlock"> 19632 <member name="F:OpenMetaverse.Simulator.SimStats.ResidentSize">
21008 <exclude /> 19633 <summary></summary>
21009 </member> 19634 </member>
21010 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket"> 19635 <member name="F:OpenMetaverse.Simulator.SimStats.PendingLocalUploads">
21011 <exclude /> 19636 <summary>Number of local uploads pending</summary>
21012 </member> 19637 </member>
21013 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket.RequestDataBlock"> 19638 <member name="F:OpenMetaverse.Simulator.SimStats.UnackedBytes">
21014 <exclude /> 19639 <summary>Unacknowledged bytes in queue</summary>
21015 </member> 19640 </member>
21016 <member name="T:OpenMetaverse.Packets.LandStatReplyPacket.ReportDataBlock"> 19641 <member name="F:OpenMetaverse.SimulatorDataPool.Handle">
21017 <exclude /> 19642 <summary>
19643 Simulator handle
19644 </summary>
21018 </member> 19645 </member>
21019 <member name="T:OpenMetaverse.Packets.ErrorPacket"> 19646 <member name="F:OpenMetaverse.SimulatorDataPool.ActiveClients">
21020 <exclude /> 19647 <summary>
19648 Number of GridClients using this datapool
19649 </summary>
21021 </member> 19650 </member>
21022 <member name="T:OpenMetaverse.Packets.ErrorPacket.AgentDataBlock"> 19651 <member name="F:OpenMetaverse.SimulatorDataPool.InactiveSince">
21023 <exclude /> 19652 <summary>
19653 Time that the last client disconnected from the simulator
19654 </summary>
21024 </member> 19655 </member>
21025 <member name="T:OpenMetaverse.Packets.ErrorPacket.DataBlock"> 19656 <member name="F:OpenMetaverse.SimulatorDataPool.PrimCache">
21026 <exclude /> 19657 <summary>
19658 The cache of prims used and unused in this simulator
19659 </summary>
21027 </member> 19660 </member>
21028 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket"> 19661 <member name="F:OpenMetaverse.SimulatorDataPool.Parcels">
21029 <exclude /> 19662 <summary>
19663 Shared parcel info only when POOL_PARCEL_DATA == true
19664 </summary>
21030 </member> 19665 </member>
21031 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket.AgentDataBlock"> 19666 <member name="T:OpenMetaverse.FieldType">
21032 <exclude /> 19667 <summary>
19668
19669 </summary>
21033 </member> 19670 </member>
21034 <member name="T:OpenMetaverse.Packets.ObjectIncludeInSearchPacket.ObjectDataBlock"> 19671 <member name="F:OpenMetaverse.FieldType.U8">
21035 <exclude /> 19672 <summary></summary>
21036 </member> 19673 </member>
21037 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket"> 19674 <member name="F:OpenMetaverse.FieldType.U16">
21038 <exclude /> 19675 <summary></summary>
21039 </member> 19676 </member>
21040 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket.AgentDataBlock"> 19677 <member name="F:OpenMetaverse.FieldType.U32">
21041 <exclude /> 19678 <summary></summary>
21042 </member> 19679 </member>
21043 <member name="T:OpenMetaverse.Packets.RezRestoreToWorldPacket.InventoryDataBlock"> 19680 <member name="F:OpenMetaverse.FieldType.U64">
21044 <exclude /> 19681 <summary></summary>
21045 </member> 19682 </member>
21046 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket"> 19683 <member name="F:OpenMetaverse.FieldType.S8">
21047 <exclude /> 19684 <summary></summary>
21048 </member> 19685 </member>
21049 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket.AgentDataBlock"> 19686 <member name="F:OpenMetaverse.FieldType.S16">
21050 <exclude /> 19687 <summary></summary>
21051 </member> 19688 </member>
21052 <member name="T:OpenMetaverse.Packets.LinkInventoryItemPacket.InventoryBlockBlock"> 19689 <member name="F:OpenMetaverse.FieldType.S32">
21053 <exclude /> 19690 <summary></summary>
21054 </member> 19691 </member>
21055 <member name="T:OpenMetaverse.Packets.PacketAckPacket"> 19692 <member name="F:OpenMetaverse.FieldType.F32">
21056 <exclude /> 19693 <summary></summary>
21057 </member> 19694 </member>
21058 <member name="T:OpenMetaverse.Packets.PacketAckPacket.PacketsBlock"> 19695 <member name="F:OpenMetaverse.FieldType.F64">
21059 <exclude /> 19696 <summary></summary>
21060 </member> 19697 </member>
21061 <member name="T:OpenMetaverse.Packets.OpenCircuitPacket"> 19698 <member name="F:OpenMetaverse.FieldType.UUID">
21062 <exclude /> 19699 <summary></summary>
21063 </member> 19700 </member>
21064 <member name="T:OpenMetaverse.Packets.OpenCircuitPacket.CircuitInfoBlock"> 19701 <member name="F:OpenMetaverse.FieldType.BOOL">
21065 <exclude /> 19702 <summary></summary>
21066 </member> 19703 </member>
21067 <member name="T:OpenMetaverse.Packets.CloseCircuitPacket"> 19704 <member name="F:OpenMetaverse.FieldType.Vector3">
21068 <exclude /> 19705 <summary></summary>
21069 </member> 19706 </member>
21070 <member name="T:OpenMetaverse.Packets.ObjectAddPacket"> 19707 <member name="F:OpenMetaverse.FieldType.Vector3d">
21071 <exclude /> 19708 <summary></summary>
21072 </member> 19709 </member>
21073 <member name="T:OpenMetaverse.Packets.ObjectAddPacket.AgentDataBlock"> 19710 <member name="F:OpenMetaverse.FieldType.Vector4">
21074 <exclude /> 19711 <summary></summary>
21075 </member> 19712 </member>
21076 <member name="T:OpenMetaverse.Packets.ObjectAddPacket.ObjectDataBlock"> 19713 <member name="F:OpenMetaverse.FieldType.Quaternion">
21077 <exclude /> 19714 <summary></summary>
21078 </member> 19715 </member>
21079 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket"> 19716 <member name="F:OpenMetaverse.FieldType.IPADDR">
21080 <exclude /> 19717 <summary></summary>
21081 </member> 19718 </member>
21082 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket.AgentDataBlock"> 19719 <member name="F:OpenMetaverse.FieldType.IPPORT">
21083 <exclude /> 19720 <summary></summary>
21084 </member> 19721 </member>
21085 <member name="T:OpenMetaverse.Packets.MultipleObjectUpdatePacket.ObjectDataBlock"> 19722 <member name="F:OpenMetaverse.FieldType.Variable">
21086 <exclude /> 19723 <summary></summary>
21087 </member> 19724 </member>
21088 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket"> 19725 <member name="F:OpenMetaverse.FieldType.Fixed">
21089 <exclude /> 19726 <summary></summary>
21090 </member> 19727 </member>
21091 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket.AgentDataBlock"> 19728 <member name="F:OpenMetaverse.FieldType.Single">
21092 <exclude /> 19729 <summary></summary>
21093 </member> 19730 </member>
21094 <member name="T:OpenMetaverse.Packets.RequestMultipleObjectsPacket.ObjectDataBlock"> 19731 <member name="F:OpenMetaverse.FieldType.Multiple">
21095 <exclude /> 19732 <summary></summary>
21096 </member> 19733 </member>
21097 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket"> 19734 <member name="T:OpenMetaverse.MapField">
21098 <exclude /> 19735 <summary>
19736
19737 </summary>
21099 </member> 19738 </member>
21100 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket.AgentDataBlock"> 19739 <member name="F:OpenMetaverse.MapField.KeywordPosition">
21101 <exclude /> 19740 <summary></summary>
21102 </member> 19741 </member>
21103 <member name="T:OpenMetaverse.Packets.ObjectPositionPacket.ObjectDataBlock"> 19742 <member name="F:OpenMetaverse.MapField.Name">
21104 <exclude /> 19743 <summary></summary>
21105 </member> 19744 </member>
21106 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket"> 19745 <member name="F:OpenMetaverse.MapField.Type">
21107 <exclude /> 19746 <summary></summary>
21108 </member> 19747 </member>
21109 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket.AgentDataBlock"> 19748 <member name="F:OpenMetaverse.MapField.Count">
21110 <exclude /> 19749 <summary></summary>
21111 </member> 19750 </member>
21112 <member name="T:OpenMetaverse.Packets.RequestObjectPropertiesFamilyPacket.ObjectDataBlock"> 19751 <member name="M:OpenMetaverse.MapField.CompareTo(System.Object)">
21113 <exclude /> 19752 <summary>
19753
19754 </summary>
19755 <param name="obj"></param>
19756 <returns></returns>
21114 </member> 19757 </member>
21115 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket"> 19758 <member name="T:OpenMetaverse.MapBlock">
21116 <exclude /> 19759 <summary>
19760
19761 </summary>
21117 </member> 19762 </member>
21118 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.LocationBlock"> 19763 <member name="F:OpenMetaverse.MapBlock.KeywordPosition">
21119 <exclude /> 19764 <summary></summary>
21120 </member> 19765 </member>
21121 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.IndexBlock"> 19766 <member name="F:OpenMetaverse.MapBlock.Name">
21122 <exclude /> 19767 <summary></summary>
21123 </member> 19768 </member>
21124 <member name="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket.AgentDataBlock"> 19769 <member name="F:OpenMetaverse.MapBlock.Count">
21125 <exclude /> 19770 <summary></summary>
21126 </member> 19771 </member>
21127 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket"> 19772 <member name="F:OpenMetaverse.MapBlock.Fields">
21128 <exclude /> 19773 <summary></summary>
21129 </member> 19774 </member>
21130 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.AgentDataBlock"> 19775 <member name="M:OpenMetaverse.MapBlock.CompareTo(System.Object)">
21131 <exclude /> 19776 <summary>
19777
19778 </summary>
19779 <param name="obj"></param>
19780 <returns></returns>
21132 </member> 19781 </member>
21133 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.RegionDataBlock"> 19782 <member name="T:OpenMetaverse.MapPacket">
21134 <exclude /> 19783 <summary>
19784
19785 </summary>
21135 </member> 19786 </member>
21136 <member name="T:OpenMetaverse.Packets.CrossedRegionPacket.InfoBlock"> 19787 <member name="F:OpenMetaverse.MapPacket.ID">
21137 <exclude /> 19788 <summary></summary>
21138 </member> 19789 </member>
21139 <member name="T:OpenMetaverse.Packets.ConfirmEnableSimulatorPacket"> 19790 <member name="F:OpenMetaverse.MapPacket.Name">
21140 <exclude /> 19791 <summary></summary>
21141 </member> 19792 </member>
21142 <member name="T:OpenMetaverse.Packets.ConfirmEnableSimulatorPacket.AgentDataBlock"> 19793 <member name="F:OpenMetaverse.MapPacket.Frequency">
21143 <exclude /> 19794 <summary></summary>
21144 </member> 19795 </member>
21145 <member name="T:OpenMetaverse.Packets.ObjectPropertiesPacket"> 19796 <member name="F:OpenMetaverse.MapPacket.Trusted">
21146 <exclude /> 19797 <summary></summary>
21147 </member> 19798 </member>
21148 <member name="T:OpenMetaverse.Packets.ObjectPropertiesPacket.ObjectDataBlock"> 19799 <member name="F:OpenMetaverse.MapPacket.Encoded">
21149 <exclude /> 19800 <summary></summary>
21150 </member> 19801 </member>
21151 <member name="T:OpenMetaverse.Packets.ObjectPropertiesFamilyPacket"> 19802 <member name="F:OpenMetaverse.MapPacket.Blocks">
21152 <exclude /> 19803 <summary></summary>
21153 </member> 19804 </member>
21154 <member name="T:OpenMetaverse.Packets.ObjectPropertiesFamilyPacket.ObjectDataBlock"> 19805 <member name="T:OpenMetaverse.ProtocolManager">
21155 <exclude /> 19806 <summary>
19807
19808 </summary>
21156 </member> 19809 </member>
21157 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket"> 19810 <member name="F:OpenMetaverse.ProtocolManager.TypeSizes">
21158 <exclude /> 19811 <summary></summary>
21159 </member> 19812 </member>
21160 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket.AgentDataBlock"> 19813 <member name="F:OpenMetaverse.ProtocolManager.KeywordPositions">
21161 <exclude /> 19814 <summary></summary>
21162 </member> 19815 </member>
21163 <member name="T:OpenMetaverse.Packets.ParcelPropertiesRequestPacket.ParcelDataBlock"> 19816 <member name="F:OpenMetaverse.ProtocolManager.LowMaps">
21164 <exclude /> 19817 <summary></summary>
21165 </member> 19818 </member>
21166 <member name="T:OpenMetaverse.Packets.AttachedSoundPacket"> 19819 <member name="F:OpenMetaverse.ProtocolManager.MediumMaps">
21167 <exclude /> 19820 <summary></summary>
21168 </member> 19821 </member>
21169 <member name="T:OpenMetaverse.Packets.AttachedSoundPacket.DataBlockBlock"> 19822 <member name="F:OpenMetaverse.ProtocolManager.HighMaps">
21170 <exclude /> 19823 <summary></summary>
21171 </member> 19824 </member>
21172 <member name="T:OpenMetaverse.Packets.AttachedSoundGainChangePacket"> 19825 <member name="M:OpenMetaverse.ProtocolManager.#ctor(System.String,OpenMetaverse.GridClient)">
21173 <exclude /> 19826 <summary>
19827
19828 </summary>
19829 <param name="mapFile"></param>
19830 <param name="client"></param>
21174 </member> 19831 </member>
21175 <member name="T:OpenMetaverse.Packets.AttachedSoundGainChangePacket.DataBlockBlock"> 19832 <member name="M:OpenMetaverse.ProtocolManager.Command(System.String)">
21176 <exclude /> 19833 <summary>
19834
19835 </summary>
19836 <param name="command"></param>
19837 <returns></returns>
21177 </member> 19838 </member>
21178 <member name="T:OpenMetaverse.Packets.PreloadSoundPacket"> 19839 <member name="M:OpenMetaverse.ProtocolManager.Command(System.Byte[])">
21179 <exclude /> 19840 <summary>
19841
19842 </summary>
19843 <param name="data"></param>
19844 <returns></returns>
21180 </member> 19845 </member>
21181 <member name="T:OpenMetaverse.Packets.PreloadSoundPacket.DataBlockBlock"> 19846 <member name="M:OpenMetaverse.ProtocolManager.Command(System.UInt16,OpenMetaverse.PacketFrequency)">
21182 <exclude /> 19847 <summary>
19848
19849 </summary>
19850 <param name="command"></param>
19851 <param name="frequency"></param>
19852 <returns></returns>
21183 </member> 19853 </member>
21184 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket"> 19854 <member name="M:OpenMetaverse.ProtocolManager.PrintMap">
21185 <exclude /> 19855 <summary>
19856
19857 </summary>
21186 </member> 19858 </member>
21187 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket.AgentDataBlock"> 19859 <member name="M:OpenMetaverse.ProtocolManager.PrintOneMap(OpenMetaverse.MapPacket[],System.String)">
21188 <exclude /> 19860 <summary>
19861
19862 </summary>
19863 <param name="map"></param>
19864 <param name="frequency"></param>
21189 </member> 19865 </member>
21190 <member name="T:OpenMetaverse.Packets.ViewerEffectPacket.EffectBlock"> 19866 <member name="M:OpenMetaverse.ProtocolManager.DecodeMapFile(System.String,System.String)">
21191 <exclude /> 19867 <summary>
19868
19869 </summary>
19870 <param name="mapFile"></param>
19871 <param name="outputFile"></param>
21192 </member> 19872 </member>
21193 <member name="T:OpenMetaverse.Packets.StartPingCheckPacket"> 19873 <member name="M:OpenMetaverse.ProtocolManager.LoadMapFile(System.String)">
21194 <exclude /> 19874 <summary>
19875
19876 </summary>
19877 <param name="mapFile"></param>
21195 </member> 19878 </member>
21196 <member name="T:OpenMetaverse.Packets.StartPingCheckPacket.PingIDBlock"> 19879 <member name="T:OpenMetaverse.ReportType">
21197 <exclude /> 19880 <summary>
19881
19882 </summary>
21198 </member> 19883 </member>
21199 <member name="T:OpenMetaverse.Packets.CompletePingCheckPacket"> 19884 <member name="F:OpenMetaverse.ReportType.None">
21200 <exclude /> 19885 <summary>No report</summary>
21201 </member> 19886 </member>
21202 <member name="T:OpenMetaverse.Packets.CompletePingCheckPacket.PingIDBlock"> 19887 <member name="F:OpenMetaverse.ReportType.Unknown">
21203 <exclude /> 19888 <summary>Unknown report type</summary>
21204 </member> 19889 </member>
21205 <member name="T:OpenMetaverse.Packets.AgentUpdatePacket"> 19890 <member name="F:OpenMetaverse.ReportType.Bug">
21206 <exclude /> 19891 <summary>Bug report</summary>
21207 </member> 19892 </member>
21208 <member name="T:OpenMetaverse.Packets.AgentUpdatePacket.AgentDataBlock"> 19893 <member name="F:OpenMetaverse.ReportType.Complaint">
21209 <exclude /> 19894 <summary>Complaint report</summary>
21210 </member> 19895 </member>
21211 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket"> 19896 <member name="F:OpenMetaverse.ReportType.CustomerServiceRequest">
21212 <exclude /> 19897 <summary>Customer service report</summary>
21213 </member> 19898 </member>
21214 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.AgentDataBlock"> 19899 <member name="T:OpenMetaverse.CompressedFlags">
21215 <exclude /> 19900 <summary>
19901 Bitflag field for ObjectUpdateCompressed data blocks, describing
19902 which options are present for each object
19903 </summary>
21216 </member> 19904 </member>
21217 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.AnimationListBlock"> 19905 <member name="F:OpenMetaverse.CompressedFlags.ScratchPad">
21218 <exclude /> 19906 <summary>Unknown</summary>
21219 </member> 19907 </member>
21220 <member name="T:OpenMetaverse.Packets.AgentAnimationPacket.PhysicalAvatarEventListBlock"> 19908 <member name="F:OpenMetaverse.CompressedFlags.Tree">
21221 <exclude /> 19909 <summary>Whether the object has a TreeSpecies</summary>
21222 </member> 19910 </member>
21223 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket"> 19911 <member name="F:OpenMetaverse.CompressedFlags.HasText">
21224 <exclude /> 19912 <summary>Whether the object has floating text ala llSetText</summary>
21225 </member> 19913 </member>
21226 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket.AgentDataBlock"> 19914 <member name="F:OpenMetaverse.CompressedFlags.HasParticles">
21227 <exclude /> 19915 <summary>Whether the object has an active particle system</summary>
21228 </member> 19916 </member>
21229 <member name="T:OpenMetaverse.Packets.AgentRequestSitPacket.TargetObjectBlock"> 19917 <member name="F:OpenMetaverse.CompressedFlags.HasSound">
21230 <exclude /> 19918 <summary>Whether the object has sound attached to it</summary>
21231 </member> 19919 </member>
21232 <member name="T:OpenMetaverse.Packets.AgentSitPacket"> 19920 <member name="F:OpenMetaverse.CompressedFlags.HasParent">
21233 <exclude /> 19921 <summary>Whether the object is attached to a root object or not</summary>
21234 </member> 19922 </member>
21235 <member name="T:OpenMetaverse.Packets.AgentSitPacket.AgentDataBlock"> 19923 <member name="F:OpenMetaverse.CompressedFlags.TextureAnimation">
21236 <exclude /> 19924 <summary>Whether the object has texture animation settings</summary>
21237 </member> 19925 </member>
21238 <member name="T:OpenMetaverse.Packets.RequestImagePacket"> 19926 <member name="F:OpenMetaverse.CompressedFlags.HasAngularVelocity">
21239 <exclude /> 19927 <summary>Whether the object has an angular velocity</summary>
21240 </member> 19928 </member>
21241 <member name="T:OpenMetaverse.Packets.RequestImagePacket.AgentDataBlock"> 19929 <member name="F:OpenMetaverse.CompressedFlags.HasNameValues">
21242 <exclude /> 19930 <summary>Whether the object has a name value pairs string</summary>
21243 </member> 19931 </member>
21244 <member name="T:OpenMetaverse.Packets.RequestImagePacket.RequestImageBlock"> 19932 <member name="F:OpenMetaverse.CompressedFlags.MediaURL">
21245 <exclude /> 19933 <summary>Whether the object has a Media URL set</summary>
21246 </member> 19934 </member>
21247 <member name="T:OpenMetaverse.Packets.ImageDataPacket"> 19935 <member name="T:OpenMetaverse.UpdateType">
21248 <exclude /> 19936 <summary>
19937 Specific Flags for MultipleObjectUpdate requests
19938 </summary>
21249 </member> 19939 </member>
21250 <member name="T:OpenMetaverse.Packets.ImageDataPacket.ImageIDBlock"> 19940 <member name="F:OpenMetaverse.UpdateType.None">
21251 <exclude /> 19941 <summary>None</summary>
21252 </member> 19942 </member>
21253 <member name="T:OpenMetaverse.Packets.ImageDataPacket.ImageDataBlock"> 19943 <member name="F:OpenMetaverse.UpdateType.Position">
21254 <exclude /> 19944 <summary>Change position of prims</summary>
21255 </member> 19945 </member>
21256 <member name="T:OpenMetaverse.Packets.ImagePacketPacket"> 19946 <member name="F:OpenMetaverse.UpdateType.Rotation">
21257 <exclude /> 19947 <summary>Change rotation of prims</summary>
21258 </member> 19948 </member>
21259 <member name="T:OpenMetaverse.Packets.ImagePacketPacket.ImageIDBlock"> 19949 <member name="F:OpenMetaverse.UpdateType.Scale">
21260 <exclude /> 19950 <summary>Change size of prims</summary>
21261 </member> 19951 </member>
21262 <member name="T:OpenMetaverse.Packets.ImagePacketPacket.ImageDataBlock"> 19952 <member name="F:OpenMetaverse.UpdateType.Linked">
21263 <exclude /> 19953 <summary>Perform operation on link set</summary>
21264 </member> 19954 </member>
21265 <member name="T:OpenMetaverse.Packets.LayerDataPacket"> 19955 <member name="F:OpenMetaverse.UpdateType.Uniform">
21266 <exclude /> 19956 <summary>Scale prims uniformly, same as selecing ctrl+shift in the
19957 viewer. Used in conjunction with Scale</summary>
21267 </member> 19958 </member>
21268 <member name="T:OpenMetaverse.Packets.LayerDataPacket.LayerIDBlock"> 19959 <member name="T:OpenMetaverse.PayPriceType">
21269 <exclude /> 19960 <summary>
19961 Special values in PayPriceReply. If the price is not one of these
19962 literal value of the price should be use
19963 </summary>
21270 </member> 19964 </member>
21271 <member name="T:OpenMetaverse.Packets.LayerDataPacket.LayerDataBlock"> 19965 <member name="F:OpenMetaverse.PayPriceType.Hide">
21272 <exclude /> 19966 <summary>
19967 Indicates that this pay option should be hidden
19968 </summary>
21273 </member> 19969 </member>
21274 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket"> 19970 <member name="F:OpenMetaverse.PayPriceType.Default">
21275 <exclude /> 19971 <summary>
19972 Indicates that this pay option should have the default value
19973 </summary>
21276 </member> 19974 </member>
21277 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket.RegionDataBlock"> 19975 <member name="T:OpenMetaverse.ObjectMovementUpdate">
21278 <exclude /> 19976 <summary>
19977 Contains the variables sent in an object update packet for objects.
19978 Used to track position and movement of prims and avatars
19979 </summary>
21279 </member> 19980 </member>
21280 <member name="T:OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock"> 19981 <member name="F:OpenMetaverse.ObjectMovementUpdate.Avatar">
21281 <exclude /> 19982 <summary></summary>
21282 </member> 19983 </member>
21283 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket"> 19984 <member name="F:OpenMetaverse.ObjectMovementUpdate.CollisionPlane">
21284 <exclude /> 19985 <summary></summary>
21285 </member> 19986 </member>
21286 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket.RegionDataBlock"> 19987 <member name="F:OpenMetaverse.ObjectMovementUpdate.State">
21287 <exclude /> 19988 <summary></summary>
21288 </member> 19989 </member>
21289 <member name="T:OpenMetaverse.Packets.ObjectUpdateCompressedPacket.ObjectDataBlock"> 19990 <member name="F:OpenMetaverse.ObjectMovementUpdate.LocalID">
21290 <exclude /> 19991 <summary></summary>
21291 </member> 19992 </member>
21292 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket"> 19993 <member name="F:OpenMetaverse.ObjectMovementUpdate.Position">
21293 <exclude /> 19994 <summary></summary>
21294 </member> 19995 </member>
21295 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket.RegionDataBlock"> 19996 <member name="F:OpenMetaverse.ObjectMovementUpdate.Velocity">
21296 <exclude /> 19997 <summary></summary>
21297 </member> 19998 </member>
21298 <member name="T:OpenMetaverse.Packets.ObjectUpdateCachedPacket.ObjectDataBlock"> 19999 <member name="F:OpenMetaverse.ObjectMovementUpdate.Acceleration">
21299 <exclude /> 20000 <summary></summary>
21300 </member> 20001 </member>
21301 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket"> 20002 <member name="F:OpenMetaverse.ObjectMovementUpdate.Rotation">
21302 <exclude /> 20003 <summary></summary>
21303 </member> 20004 </member>
21304 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket.RegionDataBlock"> 20005 <member name="F:OpenMetaverse.ObjectMovementUpdate.AngularVelocity">
21305 <exclude /> 20006 <summary></summary>
21306 </member> 20007 </member>
21307 <member name="T:OpenMetaverse.Packets.ImprovedTerseObjectUpdatePacket.ObjectDataBlock"> 20008 <member name="F:OpenMetaverse.ObjectMovementUpdate.Textures">
21308 <exclude /> 20009 <summary></summary>
21309 </member> 20010 </member>
21310 <member name="T:OpenMetaverse.Packets.KillObjectPacket"> 20011 <member name="T:OpenMetaverse.ObjectManager">
21311 <exclude /> 20012 <summary>
20013 Handles all network traffic related to prims and avatar positions and
20014 movement.
20015 </summary>
21312 </member> 20016 </member>
21313 <member name="T:OpenMetaverse.Packets.KillObjectPacket.ObjectDataBlock"> 20017 <member name="F:OpenMetaverse.ObjectManager.m_ObjectUpdate">
21314 <exclude /> 20018 <summary>The event subscribers, null of no subscribers</summary>
21315 </member> 20019 </member>
21316 <member name="T:OpenMetaverse.Packets.TransferPacketPacket"> 20020 <member name="F:OpenMetaverse.ObjectManager.m_ObjectUpdateLock">
21317 <exclude /> 20021 <summary>Thread sync lock object</summary>
21318 </member> 20022 </member>
21319 <member name="T:OpenMetaverse.Packets.TransferPacketPacket.TransferDataBlock"> 20023 <member name="F:OpenMetaverse.ObjectManager.m_ObjectProperties">
21320 <exclude /> 20024 <summary>The event subscribers, null of no subscribers</summary>
21321 </member> 20025 </member>
21322 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket"> 20026 <member name="M:OpenMetaverse.ObjectManager.OnObjectProperties(OpenMetaverse.ObjectPropertiesEventArgs)">
21323 <exclude /> 20027 <summary>Raises the ObjectProperties Event</summary>
20028 <param name="e">A ObjectPropertiesEventArgs object containing
20029 the data sent from the simulator</param>
21324 </member> 20030 </member>
21325 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket.XferIDBlock"> 20031 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesLock">
21326 <exclude /> 20032 <summary>Thread sync lock object</summary>
21327 </member> 20033 </member>
21328 <member name="T:OpenMetaverse.Packets.SendXferPacketPacket.DataPacketBlock"> 20034 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesUpdated">
21329 <exclude /> 20035 <summary>The event subscribers, null of no subscribers</summary>
21330 </member> 20036 </member>
21331 <member name="T:OpenMetaverse.Packets.ConfirmXferPacketPacket"> 20037 <member name="M:OpenMetaverse.ObjectManager.OnObjectPropertiesUpdated(OpenMetaverse.ObjectPropertiesUpdatedEventArgs)">
21332 <exclude /> 20038 <summary>Raises the ObjectPropertiesUpdated Event</summary>
20039 <param name="e">A ObjectPropertiesUpdatedEventArgs object containing
20040 the data sent from the simulator</param>
21333 </member> 20041 </member>
21334 <member name="T:OpenMetaverse.Packets.ConfirmXferPacketPacket.XferIDBlock"> 20042 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesUpdatedLock">
21335 <exclude /> 20043 <summary>Thread sync lock object</summary>
21336 </member> 20044 </member>
21337 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket"> 20045 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesFamily">
21338 <exclude /> 20046 <summary>The event subscribers, null of no subscribers</summary>
21339 </member> 20047 </member>
21340 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.SenderBlock"> 20048 <member name="M:OpenMetaverse.ObjectManager.OnObjectPropertiesFamily(OpenMetaverse.ObjectPropertiesFamilyEventArgs)">
21341 <exclude /> 20049 <summary>Raises the ObjectPropertiesFamily Event</summary>
20050 <param name="e">A ObjectPropertiesFamilyEventArgs object containing
20051 the data sent from the simulator</param>
21342 </member> 20052 </member>
21343 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.AnimationListBlock"> 20053 <member name="F:OpenMetaverse.ObjectManager.m_ObjectPropertiesFamilyLock">
21344 <exclude /> 20054 <summary>Thread sync lock object</summary>
21345 </member> 20055 </member>
21346 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.AnimationSourceListBlock"> 20056 <member name="F:OpenMetaverse.ObjectManager.m_AvatarUpdate">
21347 <exclude /> 20057 <summary>The event subscribers, null of no subscribers</summary>
21348 </member> 20058 </member>
21349 <member name="T:OpenMetaverse.Packets.AvatarAnimationPacket.PhysicalAvatarEventListBlock"> 20059 <member name="M:OpenMetaverse.ObjectManager.OnAvatarUpdate(OpenMetaverse.AvatarUpdateEventArgs)">
21350 <exclude /> 20060 <summary>Raises the AvatarUpdate Event</summary>
20061 <param name="e">A AvatarUpdateEventArgs object containing
20062 the data sent from the simulator</param>
21351 </member> 20063 </member>
21352 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket"> 20064 <member name="F:OpenMetaverse.ObjectManager.m_AvatarUpdateLock">
21353 <exclude /> 20065 <summary>Thread sync lock object</summary>
21354 </member> 20066 </member>
21355 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket.SitObjectBlock"> 20067 <member name="F:OpenMetaverse.ObjectManager.m_TerseObjectUpdate">
21356 <exclude /> 20068 <summary>The event subscribers, null of no subscribers</summary>
21357 </member> 20069 </member>
21358 <member name="T:OpenMetaverse.Packets.AvatarSitResponsePacket.SitTransformBlock"> 20070 <member name="F:OpenMetaverse.ObjectManager.m_TerseObjectUpdateLock">
21359 <exclude /> 20071 <summary>Thread sync lock object</summary>
21360 </member> 20072 </member>
21361 <member name="T:OpenMetaverse.Packets.CameraConstraintPacket"> 20073 <member name="F:OpenMetaverse.ObjectManager.m_ObjectDataBlockUpdate">
21362 <exclude /> 20074 <summary>The event subscribers, null of no subscribers</summary>
21363 </member> 20075 </member>
21364 <member name="T:OpenMetaverse.Packets.CameraConstraintPacket.CameraCollidePlaneBlock"> 20076 <member name="M:OpenMetaverse.ObjectManager.OnObjectDataBlockUpdate(OpenMetaverse.ObjectDataBlockUpdateEventArgs)">
21365 <exclude /> 20077 <summary>Raises the ObjectDataBlockUpdate Event</summary>
20078 <param name="e">A ObjectDataBlockUpdateEventArgs object containing
20079 the data sent from the simulator</param>
21366 </member> 20080 </member>
21367 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket"> 20081 <member name="F:OpenMetaverse.ObjectManager.m_ObjectDataBlockUpdateLock">
21368 <exclude /> 20082 <summary>Thread sync lock object</summary>
21369 </member> 20083 </member>
21370 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket.ParcelDataBlock"> 20084 <member name="F:OpenMetaverse.ObjectManager.m_KillObject">
21371 <exclude /> 20085 <summary>The event subscribers, null of no subscribers</summary>
21372 </member> 20086 </member>
21373 <member name="T:OpenMetaverse.Packets.ParcelPropertiesPacket.AgeVerificationBlockBlock"> 20087 <member name="M:OpenMetaverse.ObjectManager.OnKillObject(OpenMetaverse.KillObjectEventArgs)">
21374 <exclude /> 20088 <summary>Raises the KillObject Event</summary>
20089 <param name="e">A KillObjectEventArgs object containing
20090 the data sent from the simulator</param>
21375 </member> 20091 </member>
21376 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket"> 20092 <member name="F:OpenMetaverse.ObjectManager.m_KillObjectLock">
21377 <exclude /> 20093 <summary>Thread sync lock object</summary>
21378 </member> 20094 </member>
21379 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentDataBlock"> 20095 <member name="F:OpenMetaverse.ObjectManager.m_KillObjects">
21380 <exclude /> 20096 <summary>The event subscribers, null of no subscribers</summary>
21381 </member> 20097 </member>
21382 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.GroupDataBlock"> 20098 <member name="M:OpenMetaverse.ObjectManager.OnKillObjects(OpenMetaverse.KillObjectsEventArgs)">
21383 <exclude /> 20099 <summary>Raises the KillObjects Event</summary>
20100 <param name="e">A KillObjectsEventArgs object containing
20101 the data sent from the simulator</param>
21384 </member> 20102 </member>
21385 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AnimationDataBlock"> 20103 <member name="F:OpenMetaverse.ObjectManager.m_KillObjectsLock">
21386 <exclude /> 20104 <summary>Thread sync lock object</summary>
21387 </member> 20105 </member>
21388 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.GranterBlockBlock"> 20106 <member name="F:OpenMetaverse.ObjectManager.m_AvatarSitChanged">
21389 <exclude /> 20107 <summary>The event subscribers, null of no subscribers</summary>
21390 </member> 20108 </member>
21391 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.NVPairDataBlock"> 20109 <member name="M:OpenMetaverse.ObjectManager.OnAvatarSitChanged(OpenMetaverse.AvatarSitChangedEventArgs)">
21392 <exclude /> 20110 <summary>Raises the AvatarSitChanged Event</summary>
20111 <param name="e">A AvatarSitChangedEventArgs object containing
20112 the data sent from the simulator</param>
21393 </member> 20113 </member>
21394 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.VisualParamBlock"> 20114 <member name="F:OpenMetaverse.ObjectManager.m_AvatarSitChangedLock">
21395 <exclude /> 20115 <summary>Thread sync lock object</summary>
21396 </member> 20116 </member>
21397 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentAccessBlock"> 20117 <member name="F:OpenMetaverse.ObjectManager.m_PayPriceReply">
21398 <exclude /> 20118 <summary>The event subscribers, null of no subscribers</summary>
21399 </member> 20119 </member>
21400 <member name="T:OpenMetaverse.Packets.ChildAgentUpdatePacket.AgentInfoBlock"> 20120 <member name="M:OpenMetaverse.ObjectManager.OnPayPriceReply(OpenMetaverse.PayPriceReplyEventArgs)">
21401 <exclude /> 20121 <summary>Raises the PayPriceReply Event</summary>
20122 <param name="e">A PayPriceReplyEventArgs object containing
20123 the data sent from the simulator</param>
21402 </member> 20124 </member>
21403 <member name="T:OpenMetaverse.Packets.ChildAgentAlivePacket"> 20125 <member name="F:OpenMetaverse.ObjectManager.m_PayPriceReplyLock">
21404 <exclude /> 20126 <summary>Thread sync lock object</summary>
21405 </member> 20127 </member>
21406 <member name="T:OpenMetaverse.Packets.ChildAgentAlivePacket.AgentDataBlock"> 20128 <member name="F:OpenMetaverse.ObjectManager.m_PhysicsProperties">
21407 <exclude /> 20129 <summary>The event subscribers, null of no subscribers</summary>
21408 </member> 20130 </member>
21409 <member name="T:OpenMetaverse.Packets.ChildAgentPositionUpdatePacket"> 20131 <member name="M:OpenMetaverse.ObjectManager.OnPhysicsProperties(OpenMetaverse.PhysicsPropertiesEventArgs)">
21410 <exclude /> 20132 <summary>Raises the PhysicsProperties Event</summary>
20133 <param name="e">A PhysicsPropertiesEventArgs object containing
20134 the data sent from the simulator</param>
21411 </member> 20135 </member>
21412 <member name="T:OpenMetaverse.Packets.ChildAgentPositionUpdatePacket.AgentDataBlock"> 20136 <member name="F:OpenMetaverse.ObjectManager.m_PhysicsPropertiesLock">
21413 <exclude /> 20137 <summary>Thread sync lock object</summary>
21414 </member> 20138 </member>
21415 <member name="T:OpenMetaverse.Packets.SoundTriggerPacket"> 20139 <member name="F:OpenMetaverse.ObjectManager.Client">
21416 <exclude /> 20140 <summary>Reference to the GridClient object</summary>
21417 </member> 20141 </member>
21418 <member name="T:OpenMetaverse.Packets.SoundTriggerPacket.SoundDataBlock"> 20142 <member name="F:OpenMetaverse.ObjectManager.InterpolationTimer">
21419 <exclude /> 20143 <summary>Does periodic dead reckoning calculation to convert
20144 velocity and acceleration to new positions for objects</summary>
21420 </member> 20145 </member>
21421 <member name="T:OpenMetaverse.VisualColorOperation"> 20146 <member name="M:OpenMetaverse.ObjectManager.#ctor(OpenMetaverse.GridClient)">
21422 <summary> 20147 <summary>
21423 Operation to apply when applying color to texture 20148 Construct a new instance of the ObjectManager class
21424 </summary> 20149 </summary>
20150 <param name="client">A reference to the <see cref="T:OpenMetaverse.GridClient"/> instance</param>
21425 </member> 20151 </member>
21426 <member name="T:OpenMetaverse.VisualColorParam"> 20152 <member name="M:OpenMetaverse.ObjectManager.RequestObject(OpenMetaverse.Simulator,System.UInt32)">
21427 <summary> 20153 <summary>
21428 Information needed to translate visual param value to RGBA color 20154 Request information for a single object from a <see cref="T:OpenMetaverse.Simulator"/>
20155 you are currently connected to
21429 </summary> 20156 </summary>
20157 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20158 <param name="localID">The Local ID of the object</param>
21430 </member> 20159 </member>
21431 <member name="M:OpenMetaverse.VisualColorParam.#ctor(OpenMetaverse.VisualColorOperation,OpenMetaverse.Color4[])"> 20160 <member name="M:OpenMetaverse.ObjectManager.RequestObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
21432 <summary> 20161 <summary>
21433 Construct VisualColorParam 20162 Request information for multiple objects contained in
20163 the same simulator
21434 </summary> 20164 </summary>
21435 <param name="operation">Operation to apply when applying color to texture</param> 20165 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the objects are located</param>
21436 <param name="colors">Colors</param> 20166 <param name="localIDs">An array containing the Local IDs of the objects</param>
21437 </member> 20167 </member>
21438 <member name="T:OpenMetaverse.VisualAlphaParam"> 20168 <member name="M:OpenMetaverse.ObjectManager.BuyObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.SaleType,System.Int32,OpenMetaverse.UUID,OpenMetaverse.UUID)">
21439 <summary> 20169 <summary>
21440 Represents alpha blending and bump infor for a visual parameter 20170 Attempt to purchase an original object, a copy, or the contents of
21441 such as sleive length 20171 an object
21442 </summary> 20172 </summary>
20173 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20174 <param name="localID">The Local ID of the object</param>
20175 <param name="saleType">Whether the original, a copy, or the object
20176 contents are on sale. This is used for verification, if the this
20177 sale type is not valid for the object the purchase will fail</param>
20178 <param name="price">Price of the object. This is used for
20179 verification, if it does not match the actual price the purchase
20180 will fail</param>
20181 <param name="groupID">Group ID that will be associated with the new
20182 purchase</param>
20183 <param name="categoryID">Inventory folder UUID where the object or objects
20184 purchased should be placed</param>
20185 <example>
20186 <code>
20187 BuyObject(Client.Network.CurrentSim, 500, SaleType.Copy,
20188 100, UUID.Zero, Client.Self.InventoryRootFolderUUID);
20189 </code>
20190 </example>
21443 </member> 20191 </member>
21444 <member name="M:OpenMetaverse.VisualAlphaParam.#ctor(System.Single,System.String,System.Boolean,System.Boolean)"> 20192 <member name="M:OpenMetaverse.ObjectManager.RequestPayPrice(OpenMetaverse.Simulator,OpenMetaverse.UUID)">
21445 <summary> 20193 <summary>
21446 Create new alhpa information for a visual param 20194 Request prices that should be displayed in pay dialog. This will triggger the simulator
20195 to send us back a PayPriceReply which can be handled by OnPayPriceReply event
21447 </summary> 20196 </summary>
21448 <param name="domain">Stregth of the alpha to apply</param> 20197 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
21449 <param name="tgaFile">File containing the alpha channel</param> 20198 <param name="objectID">The ID of the object</param>
21450 <param name="skipIfZero">Skip blending if parameter value is 0</param> 20199 <remarks>The result is raised in the <see cref="E:OpenMetaverse.ObjectManager.PayPriceReply"/> event</remarks>
21451 <param name="multiplyBlend">Use miltiply insted of alpha blending</param>
21452 </member>
21453 <member name="F:OpenMetaverse.VisualAlphaParam.Domain">
21454 <summary>Stregth of the alpha to apply</summary>
21455 </member>
21456 <member name="F:OpenMetaverse.VisualAlphaParam.TGAFile">
21457 <summary>File containing the alpha channel</summary>
21458 </member>
21459 <member name="F:OpenMetaverse.VisualAlphaParam.SkipIfZero">
21460 <summary>Skip blending if parameter value is 0</summary>
21461 </member>
21462 <member name="F:OpenMetaverse.VisualAlphaParam.MultiplyBlend">
21463 <summary>Use miltiply insted of alpha blending</summary>
21464 </member> 20200 </member>
21465 <member name="T:OpenMetaverse.VisualParam"> 20201 <member name="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)">
21466 <summary> 20202 <summary>
21467 A single visual characteristic of an avatar mesh, such as eyebrow height 20203 Select a single object. This will cause the <see cref="T:OpenMetaverse.Simulator"/> to send us
20204 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event
21468 </summary> 20205 </summary>
20206 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20207 <param name="localID">The Local ID of the object</param>
20208 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs"/>
21469 </member> 20209 </member>
21470 <member name="M:OpenMetaverse.VisualParam.#ctor(System.Int32,System.String,System.Int32,System.String,System.String,System.String,System.String,System.Single,System.Single,System.Single,System.Boolean,System.Int32[],System.Nullable{OpenMetaverse.VisualAlphaParam},System.Nullable{OpenMetaverse.VisualColorParam})"> 20210 <member name="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32,System.Boolean)">
21471 <summary> 20211 <summary>
21472 Set all the values through the constructor 20212 Select a single object. This will cause the <see cref="T:OpenMetaverse.Simulator"/> to send us
20213 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event
21473 </summary> 20214 </summary>
21474 <param name="paramID">Index of this visual param</param> 20215 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
21475 <param name="name">Internal name</param> 20216 <param name="localID">The Local ID of the object</param>
21476 <param name="group"> 20217 <param name="automaticDeselect">if true, a call to <see cref="M:OpenMetaverse.ObjectManager.DeselectObject(OpenMetaverse.Simulator,System.UInt32)"/> is
21477 </param> 20218 made immediately following the request</param>
21478 <param name="wearable"> 20219 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs"/>
21479 </param>
21480 <param name="label">Displayable label of this characteristic</param>
21481 <param name="labelMin">Displayable label for the minimum value of this characteristic</param>
21482 <param name="labelMax">Displayable label for the maximum value of this characteristic</param>
21483 <param name="def">Default value</param>
21484 <param name="min">Minimum value</param>
21485 <param name="max">Maximum value</param>
21486 <param name="isBumpAttribute">Is this param used for creation of bump layer?</param>
21487 <param name="drivers">Array of param IDs that are drivers for this parameter</param>
21488 <param name="alpha">Alpha blending/bump info</param>
21489 <param name="colorParams">Color information</param>
21490 </member>
21491 <member name="F:OpenMetaverse.VisualParam.ParamID">
21492 <summary>Index of this visual param</summary>
21493 </member>
21494 <member name="F:OpenMetaverse.VisualParam.Name">
21495 <summary>Internal name</summary>
21496 </member>
21497 <member name="F:OpenMetaverse.VisualParam.Group">
21498 <summary>Group ID this parameter belongs to</summary>
21499 </member>
21500 <member name="F:OpenMetaverse.VisualParam.Wearable">
21501 <summary>Name of the wearable this parameter belongs to</summary>
21502 </member>
21503 <member name="F:OpenMetaverse.VisualParam.Label">
21504 <summary>Displayable label of this characteristic</summary>
21505 </member>
21506 <member name="F:OpenMetaverse.VisualParam.LabelMin">
21507 <summary>Displayable label for the minimum value of this characteristic</summary>
21508 </member>
21509 <member name="F:OpenMetaverse.VisualParam.LabelMax">
21510 <summary>Displayable label for the maximum value of this characteristic</summary>
21511 </member>
21512 <member name="F:OpenMetaverse.VisualParam.DefaultValue">
21513 <summary>Default value</summary>
21514 </member>
21515 <member name="F:OpenMetaverse.VisualParam.MinValue">
21516 <summary>Minimum value</summary>
21517 </member>
21518 <member name="F:OpenMetaverse.VisualParam.MaxValue">
21519 <summary>Maximum value</summary>
21520 </member>
21521 <member name="F:OpenMetaverse.VisualParam.IsBumpAttribute">
21522 <summary>Is this param used for creation of bump layer?</summary>
21523 </member>
21524 <member name="F:OpenMetaverse.VisualParam.AlphaParams">
21525 <summary>Alpha blending/bump info</summary>
21526 </member>
21527 <member name="F:OpenMetaverse.VisualParam.ColorParams">
21528 <summary>Color information</summary>
21529 </member> 20220 </member>
21530 <member name="F:OpenMetaverse.VisualParam.Drivers"> 20221 <member name="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[],System.Boolean)">
21531 <summary>Array of param IDs that are drivers for this parameter</summary> 20222 <summary>
20223 Select multiple objects. This will cause the <see cref="T:OpenMetaverse.Simulator"/> to send us
20224 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event
20225 </summary>
20226 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the objects are located</param>
20227 <param name="localIDs">An array containing the Local IDs of the objects</param>
20228 <param name="automaticDeselect">Should objects be deselected immediately after selection</param>
20229 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs"/>
21532 </member> 20230 </member>
21533 <member name="T:OpenMetaverse.VisualParams"> 20231 <member name="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[])">
21534 <summary> 20232 <summary>
21535 Holds the Params array of all the avatar appearance parameters 20233 Select multiple objects. This will cause the <see cref="T:OpenMetaverse.Simulator"/> to send us
21536 </summary> 20234 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> which will raise the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event
20235 </summary>
20236 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the objects are located</param>
20237 <param name="localIDs">An array containing the Local IDs of the objects</param>
20238 <seealso cref="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs"/>
21537 </member> 20239 </member>
21538 <member name="T:OpenMetaverse.Assets.Asset"> 20240 <member name="M:OpenMetaverse.ObjectManager.SetFlags(OpenMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean)">
21539 <summary> 20241 <summary>
21540 Base class for all Asset types 20242 Update the properties of an object
21541 </summary> 20243 </summary>
20244 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20245 <param name="localID">The Local ID of the object</param>
20246 <param name="physical">true to turn the objects physical property on</param>
20247 <param name="temporary">true to turn the objects temporary property on</param>
20248 <param name="phantom">true to turn the objects phantom property on</param>
20249 <param name="castsShadow">true to turn the objects cast shadows property on</param>
21542 </member> 20250 </member>
21543 <member name="M:OpenMetaverse.Assets.Asset.#ctor"> 20251 <member name="M:OpenMetaverse.ObjectManager.SetFlags(OpenMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean,OpenMetaverse.PhysicsShapeType,System.Single,System.Single,System.Single,System.Single)">
21544 <summary> 20252 <summary>
21545 Construct a new Asset object 20253 Update the properties of an object
21546 </summary> 20254 </summary>
20255 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20256 <param name="localID">The Local ID of the object</param>
20257 <param name="physical">true to turn the objects physical property on</param>
20258 <param name="temporary">true to turn the objects temporary property on</param>
20259 <param name="phantom">true to turn the objects phantom property on</param>
20260 <param name="castsShadow">true to turn the objects cast shadows property on</param>
20261 <param name="physicsType">Type of the represetnation prim will have in the physics engine</param>
20262 <param name="density">Density - normal value 1000</param>
20263 <param name="friction">Friction - normal value 0.6</param>
20264 <param name="restitution">Restitution - standard value 0.5</param>
20265 <param name="gravityMultiplier">Gravity multiplier - standar value 1.0</param>
21547 </member> 20266 </member>
21548 <member name="M:OpenMetaverse.Assets.Asset.#ctor(OpenMetaverse.UUID,System.Byte[])"> 20267 <member name="M:OpenMetaverse.ObjectManager.SetSaleInfo(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.SaleType,System.Int32)">
21549 <summary> 20268 <summary>
21550 Construct a new Asset object 20269 Sets the sale properties of a single object
21551 </summary> 20270 </summary>
21552 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param> 20271 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
21553 <param name="assetData">A byte array containing the raw asset data</param> 20272 <param name="localID">The Local ID of the object</param>
21554 </member> 20273 <param name="saleType">One of the options from the <see cref="T:OpenMetaverse.SaleType"/> enum</param>
21555 <member name="F:OpenMetaverse.Assets.Asset.AssetData"> 20274 <param name="price">The price of the object</param>
21556 <summary>A byte array containing the raw asset data</summary>
21557 </member>
21558 <member name="F:OpenMetaverse.Assets.Asset.Temporary">
21559 <summary>True if the asset it only stored on the server temporarily</summary>
21560 </member>
21561 <member name="F:OpenMetaverse.Assets.Asset._AssetID">
21562 <summary>A unique ID</summary>
21563 </member>
21564 <member name="P:OpenMetaverse.Assets.Asset.AssetID">
21565 <summary>The assets unique ID</summary>
21566 </member> 20275 </member>
21567 <member name="P:OpenMetaverse.Assets.Asset.AssetType"> 20276 <member name="M:OpenMetaverse.ObjectManager.SetSaleInfo(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.SaleType,System.Int32)">
21568 <summary> 20277 <summary>
21569 The "type" of asset, Notecard, Animation, etc 20278 Sets the sale properties of multiple objects
21570 </summary> 20279 </summary>
20280 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the objects are located</param>
20281 <param name="localIDs">An array containing the Local IDs of the objects</param>
20282 <param name="saleType">One of the options from the <see cref="T:OpenMetaverse.SaleType"/> enum</param>
20283 <param name="price">The price of the object</param>
21571 </member> 20284 </member>
21572 <member name="M:OpenMetaverse.Assets.Asset.Encode"> 20285 <member name="M:OpenMetaverse.ObjectManager.DeselectObject(OpenMetaverse.Simulator,System.UInt32)">
21573 <summary> 20286 <summary>
21574 Regenerates the <code>AssetData</code> byte array from the properties 20287 Deselect a single object
21575 of the derived class.
21576 </summary> 20288 </summary>
20289 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20290 <param name="localID">The Local ID of the object</param>
21577 </member> 20291 </member>
21578 <member name="M:OpenMetaverse.Assets.Asset.Decode"> 20292 <member name="M:OpenMetaverse.ObjectManager.DeselectObjects(OpenMetaverse.Simulator,System.UInt32[])">
21579 <summary> 20293 <summary>
21580 Decodes the AssetData, placing it in appropriate properties of the derived 20294 Deselect multiple objects.
21581 class.
21582 </summary> 20295 </summary>
21583 <returns>True if the asset decoding succeeded, otherwise false</returns> 20296 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the objects are located</param>
20297 <param name="localIDs">An array containing the Local IDs of the objects</param>
21584 </member> 20298 </member>
21585 <member name="T:OpenMetaverse.Assets.ArchiveConstants"> 20299 <member name="M:OpenMetaverse.ObjectManager.ClickObject(OpenMetaverse.Simulator,System.UInt32)">
21586 <summary> 20300 <summary>
21587 Constants for the archiving module 20301 Perform a click action on an object
21588 </summary> 20302 </summary>
20303 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20304 <param name="localID">The Local ID of the object</param>
21589 </member> 20305 </member>
21590 <member name="F:OpenMetaverse.Assets.ArchiveConstants.CONTROL_FILE_PATH"> 20306 <member name="M:OpenMetaverse.ObjectManager.ClickObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Int32,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
21591 <summary> 20307 <summary>
21592 The location of the archive control file 20308 Perform a click action (Grab) on a single object
21593 </summary> 20309 </summary>
20310 <param name="simulator">The <see cref="T:OpenMetaverse.Simulator"/> the object is located</param>
20311 <param name="localID">The Local ID of the object</param>
20312 <param name="uvCoord">The texture coordinates to touch</param>
20313 <param name="stCoord">The surface coordinates to touch</param>
20314 <param name="faceIndex">The face of the position to touch</param>
20315 <param name="position">The region coordinates of the position to touch</param>
20316 <param name="normal">The surface normal of the position to touch (A normal is a vector perpindicular to the surface)</param>
20317 <param name="binormal">The surface binormal of the position to touch (A binormal is a vector tangen to the surface
20318 pointing along the U direction of the tangent space</param>
21594 </member> 20319 </member>
21595 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSETS_PATH"> 20320 <member name="M:OpenMetaverse.ObjectManager.AddPrim(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ConstructionData,OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion)">
21596 <summary> 20321 <summary>
21597 Path for the assets held in an archive 20322 Create (rez) a new prim object in a simulator
21598 </summary> 20323 </summary>
20324 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object to place the object in</param>
20325 <param name="prim">Data describing the prim object to rez</param>
20326 <param name="groupID">Group ID that this prim will be set to, or UUID.Zero if you
20327 do not want the object to be associated with a specific group</param>
20328 <param name="position">An approximation of the position at which to rez the prim</param>
20329 <param name="scale">Scale vector to size this prim</param>
20330 <param name="rotation">Rotation quaternion to rotate this prim</param>
20331 <remarks>Due to the way client prim rezzing is done on the server,
20332 the requested position for an object is only close to where the prim
20333 actually ends up. If you desire exact placement you'll need to
20334 follow up by moving the object after it has been created. This
20335 function will not set textures, light and flexible data, or other
20336 extended primitive properties</remarks>
21599 </member> 20337 </member>
21600 <member name="F:OpenMetaverse.Assets.ArchiveConstants.OBJECTS_PATH"> 20338 <member name="M:OpenMetaverse.ObjectManager.AddPrim(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ConstructionData,OpenMetaverse.UUID,OpenMetaverse.Vector3,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.PrimFlags)">
21601 <summary> 20339 <summary>
21602 Path for the prims file 20340 Create (rez) a new prim object in a simulator
21603 </summary> 20341 </summary>
20342 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object to place the object in</param>
20343 <param name="prim">Data describing the prim object to rez</param>
20344 <param name="groupID">Group ID that this prim will be set to, or UUID.Zero if you
20345 do not want the object to be associated with a specific group</param>
20346 <param name="position">An approximation of the position at which to rez the prim</param>
20347 <param name="scale">Scale vector to size this prim</param>
20348 <param name="rotation">Rotation quaternion to rotate this prim</param>
20349 <param name="createFlags">Specify the <seealso cref="T:OpenMetaverse.PrimFlags"/></param>
20350 <remarks>Due to the way client prim rezzing is done on the server,
20351 the requested position for an object is only close to where the prim
20352 actually ends up. If you desire exact placement you'll need to
20353 follow up by moving the object after it has been created. This
20354 function will not set textures, light and flexible data, or other
20355 extended primitive properties</remarks>
21604 </member> 20356 </member>
21605 <member name="F:OpenMetaverse.Assets.ArchiveConstants.TERRAINS_PATH"> 20357 <member name="M:OpenMetaverse.ObjectManager.AddTree(OpenMetaverse.Simulator,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.Tree,OpenMetaverse.UUID,System.Boolean)">
21606 <summary> 20358 <summary>
21607 Path for terrains. Technically these may be assets, but I think it's quite nice to split them out. 20359 Rez a Linden tree
21608 </summary> 20360 </summary>
20361 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20362 <param name="scale">The size of the tree</param>
20363 <param name="rotation">The rotation of the tree</param>
20364 <param name="position">The position of the tree</param>
20365 <param name="treeType">The Type of tree</param>
20366 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID"/> of the group to set the tree to,
20367 or UUID.Zero if no group is to be set</param>
20368 <param name="newTree">true to use the "new" Linden trees, false to use the old</param>
21609 </member> 20369 </member>
21610 <member name="F:OpenMetaverse.Assets.ArchiveConstants.SETTINGS_PATH"> 20370 <member name="M:OpenMetaverse.ObjectManager.AddGrass(OpenMetaverse.Simulator,OpenMetaverse.Vector3,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.Grass,OpenMetaverse.UUID)">
21611 <summary> 20371 <summary>
21612 Path for region settings. 20372 Rez grass and ground cover
21613 </summary> 20373 </summary>
20374 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20375 <param name="scale">The size of the grass</param>
20376 <param name="rotation">The rotation of the grass</param>
20377 <param name="position">The position of the grass</param>
20378 <param name="grassType">The type of grass from the <seealso cref="T:OpenMetaverse.Grass"/> enum</param>
20379 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID"/> of the group to set the tree to,
20380 or UUID.Zero if no group is to be set</param>
21614 </member> 20381 </member>
21615 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSET_EXTENSION_SEPARATOR"> 20382 <member name="M:OpenMetaverse.ObjectManager.SetTextures(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.TextureEntry)">
21616 <summary> 20383 <summary>
21617 The character the separates the uuid from extension information in an archived asset filename 20384 Set the textures to apply to the faces of an object
21618 </summary> 20385 </summary>
20386 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20387 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20388 <param name="textures">The texture data to apply</param>
21619 </member> 20389 </member>
21620 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSET_TYPE_TO_EXTENSION"> 20390 <member name="M:OpenMetaverse.ObjectManager.SetTextures(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.TextureEntry,System.String)">
21621 <summary> 20391 <summary>
21622 Extensions used for asset types in the archive 20392 Set the textures to apply to the faces of an object
21623 </summary> 20393 </summary>
20394 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20395 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20396 <param name="textures">The texture data to apply</param>
20397 <param name="mediaUrl">A media URL (not used)</param>
21624 </member> 20398 </member>
21625 <member name="T:OpenMetaverse.Assets.AssetsArchiver"> 20399 <member name="M:OpenMetaverse.ObjectManager.SetLight(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.LightData)">
21626 <summary> 20400 <summary>
21627 Archives assets 20401 Set the Light data on an object
21628 </summary> 20402 </summary>
20403 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20404 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20405 <param name="light">A <seealso cref="T:OpenMetaverse.Primitive.LightData"/> object containing the data to set</param>
21629 </member> 20406 </member>
21630 <member name="F:OpenMetaverse.Assets.AssetsArchiver.m_assets"> 20407 <member name="M:OpenMetaverse.ObjectManager.SetFlexible(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.FlexibleData)">
21631 <summary> 20408 <summary>
21632 Archive assets 20409 Set the flexible data on an object
21633 </summary> 20410 </summary>
20411 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20412 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20413 <param name="flexible">A <seealso cref="T:OpenMetaverse.Primitive.FlexibleData"/> object containing the data to set</param>
21634 </member> 20414 </member>
21635 <member name="M:OpenMetaverse.Assets.AssetsArchiver.Archive(OpenMetaverse.Assets.TarArchiveWriter)"> 20415 <member name="M:OpenMetaverse.ObjectManager.SetSculpt(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.SculptData)">
21636 <summary> 20416 <summary>
21637 Archive the assets given to this archiver to the given archive. 20417 Set the sculptie texture and data on an object
21638 </summary> 20418 </summary>
21639 <param name="archive"> 20419 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21640 </param> 20420 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20421 <param name="sculpt">A <seealso cref="T:OpenMetaverse.Primitive.SculptData"/> object containing the data to set</param>
21641 </member> 20422 </member>
21642 <member name="M:OpenMetaverse.Assets.AssetsArchiver.WriteMetadata(OpenMetaverse.Assets.TarArchiveWriter)"> 20423 <member name="M:OpenMetaverse.ObjectManager.SetExtraParamOff(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.ExtraParamType)">
21643 <summary> 20424 <summary>
21644 Write an assets metadata file to the given archive 20425 Unset additional primitive parameters on an object
21645 </summary> 20426 </summary>
21646 <param name="archive"> 20427 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21647 </param> 20428 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20429 <param name="type">The extra parameters to set</param>
21648 </member> 20430 </member>
21649 <member name="M:OpenMetaverse.Assets.AssetsArchiver.WriteData(OpenMetaverse.Assets.TarArchiveWriter)"> 20431 <member name="M:OpenMetaverse.ObjectManager.LinkPrims(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
21650 <summary> 20432 <summary>
21651 Write asset data files to the given archive 20433 Link multiple prims into a linkset
21652 </summary> 20434 </summary>
21653 <param name="archive"> 20435 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
21654 </param> 20436 <param name="localIDs">An array which contains the IDs of the objects to link</param>
20437 <remarks>The last object in the array will be the root object of the linkset TODO: Is this true?</remarks>
21655 </member> 20438 </member>
21656 <member name="T:OpenMetaverse.Assets.TarArchiveReader"> 20439 <member name="M:OpenMetaverse.ObjectManager.DelinkPrims(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
21657 <summary> 20440 <summary>
21658 Temporary code to do the bare minimum required to read a tar archive for our purposes 20441 Delink/Unlink multiple prims from a linkset
21659 </summary> 20442 </summary>
20443 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
20444 <param name="localIDs">An array which contains the IDs of the objects to delink</param>
21660 </member> 20445 </member>
21661 <member name="M:OpenMetaverse.Assets.TarArchiveReader.#ctor(System.IO.Stream)"> 20446 <member name="M:OpenMetaverse.ObjectManager.SetRotation(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Quaternion)">
21662 <summary> 20447 <summary>
21663 Generate a tar reader which reads from the given stream. 20448 Change the rotation of an object
21664 </summary> 20449 </summary>
21665 <param name="s"> 20450 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21666 </param> 20451 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20452 <param name="rotation">The new rotation of the object</param>
21667 </member> 20453 </member>
21668 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_br"> 20454 <member name="M:OpenMetaverse.ObjectManager.SetName(OpenMetaverse.Simulator,System.UInt32,System.String)">
21669 <summary> 20455 <summary>
21670 Binary reader for the underlying stream 20456 Set the name of an object
21671 </summary> 20457 </summary>
20458 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20459 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20460 <param name="name">A string containing the new name of the object</param>
21672 </member> 20461 </member>
21673 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_nullCharArray"> 20462 <member name="M:OpenMetaverse.ObjectManager.SetNames(OpenMetaverse.Simulator,System.UInt32[],System.String[])">
21674 <summary> 20463 <summary>
21675 Used to trim off null chars 20464 Set the name of multiple objects
21676 </summary> 20465 </summary>
20466 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
20467 <param name="localIDs">An array which contains the IDs of the objects to change the name of</param>
20468 <param name="names">An array which contains the new names of the objects</param>
21677 </member> 20469 </member>
21678 <member name="F:OpenMetaverse.Assets.TarArchiveReader.m_spaceCharArray"> 20470 <member name="M:OpenMetaverse.ObjectManager.SetDescription(OpenMetaverse.Simulator,System.UInt32,System.String)">
21679 <summary> 20471 <summary>
21680 Used to trim off space chars 20472 Set the description of an object
21681 </summary> 20473 </summary>
20474 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20475 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20476 <param name="description">A string containing the new description of the object</param>
21682 </member> 20477 </member>
21683 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadEntry(System.String@,OpenMetaverse.Assets.TarArchiveReader.TarEntryType@)"> 20478 <member name="M:OpenMetaverse.ObjectManager.SetDescriptions(OpenMetaverse.Simulator,System.UInt32[],System.String[])">
21684 <summary> 20479 <summary>
21685 Read the next entry in the tar file. 20480 Set the descriptions of multiple objects
21686 </summary> 20481 </summary>
21687 <param name="filePath"> 20482 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
21688 </param> 20483 <param name="localIDs">An array which contains the IDs of the objects to change the description of</param>
21689 <param name="entryType"> 20484 <param name="descriptions">An array which contains the new descriptions of the objects</param>
21690 </param>
21691 <returns>the data for the entry. Returns null if there are no more entries</returns>
21692 </member> 20485 </member>
21693 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadHeader"> 20486 <member name="M:OpenMetaverse.ObjectManager.AttachObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.AttachmentPoint,OpenMetaverse.Quaternion)">
21694 <summary> 20487 <summary>
21695 Read the next 512 byte chunk of data as a tar header. 20488 Attach an object to this avatar
21696 </summary> 20489 </summary>
21697 <returns>A tar header struct. null if we have reached the end of the archive.</returns> 20490 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20491 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20492 <param name="attachPoint">The point on the avatar the object will be attached</param>
20493 <param name="rotation">The rotation of the attached object</param>
21698 </member> 20494 </member>
21699 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ReadData(System.Int32)"> 20495 <member name="M:OpenMetaverse.ObjectManager.DropObject(OpenMetaverse.Simulator,System.UInt32)">
21700 <summary> 20496 <summary>
21701 Read data following a header 20497 Drop an attached object from this avatar
21702 </summary> 20498 </summary>
21703 <param name="fileSize"> 20499 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/>
20500 object where the objects reside. This will always be the simulator the avatar is currently in
21704 </param> 20501 </param>
21705 <returns> 20502 <param name="localID">The object's ID which is local to the simulator the object is in</param>
21706 </returns>
21707 </member> 20503 </member>
21708 <member name="M:OpenMetaverse.Assets.TarArchiveReader.ConvertOctalBytesToDecimal(System.Byte[],System.Int32,System.Int32)"> 20504 <member name="M:OpenMetaverse.ObjectManager.DetachObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})">
21709 <summary> 20505 <summary>
21710 Convert octal bytes to a decimal representation 20506 Detach an object from yourself
21711 </summary> 20507 </summary>
21712 <param name="bytes"> 20508 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/>
21713 </param> 20509 object where the objects reside
21714 <param name="count"> 20510
21715 </param> 20511 This will always be the simulator the avatar is currently in
21716 <param name="startIndex">
21717 </param> 20512 </param>
21718 <returns> 20513 <param name="localIDs">An array which contains the IDs of the objects to detach</param>
21719 </returns>
21720 </member> 20514 </member>
21721 <member name="T:OpenMetaverse.Assets.TarArchiveWriter"> 20515 <member name="M:OpenMetaverse.ObjectManager.SetPosition(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3)">
21722 <summary> 20516 <summary>
21723 Temporary code to produce a tar archive in tar v7 format 20517 Change the position of an object, Will change position of entire linkset
21724 </summary> 20518 </summary>
20519 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20520 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20521 <param name="position">The new position of the object</param>
21725 </member> 20522 </member>
21726 <member name="F:OpenMetaverse.Assets.TarArchiveWriter.m_bw"> 20523 <member name="M:OpenMetaverse.ObjectManager.SetPosition(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,System.Boolean)">
21727 <summary> 20524 <summary>
21728 Binary writer for the underlying stream 20525 Change the position of an object
21729 </summary> 20526 </summary>
20527 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20528 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20529 <param name="position">The new position of the object</param>
20530 <param name="childOnly">if true, will change position of (this) child prim only, not entire linkset</param>
21730 </member> 20531 </member>
21731 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteDir(System.String)"> 20532 <member name="M:OpenMetaverse.ObjectManager.SetScale(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,System.Boolean,System.Boolean)">
21732 <summary> 20533 <summary>
21733 Write a directory entry to the tar archive. We can only handle one path level right now! 20534 Change the Scale (size) of an object
21734 </summary> 20535 </summary>
21735 <param name="dirName"> 20536 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21736 </param> 20537 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20538 <param name="scale">The new scale of the object</param>
20539 <param name="childOnly">If true, will change scale of this prim only, not entire linkset</param>
20540 <param name="uniform">True to resize prims uniformly</param>
21737 </member> 20541 </member>
21738 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteFile(System.String,System.String)"> 20542 <member name="M:OpenMetaverse.ObjectManager.SetRotation(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Quaternion,System.Boolean)">
21739 <summary> 20543 <summary>
21740 Write a file to the tar archive 20544 Change the Rotation of an object that is either a child or a whole linkset
21741 </summary> 20545 </summary>
21742 <param name="filePath"> 20546 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21743 </param> 20547 <param name="localID">The objects ID which is local to the simulator the object is in</param>
21744 <param name="data"> 20548 <param name="quat">The new scale of the object</param>
21745 </param> 20549 <param name="childOnly">If true, will change rotation of this prim only, not entire linkset</param>
21746 </member> 20550 </member>
21747 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteFile(System.String,System.Byte[])"> 20551 <member name="M:OpenMetaverse.ObjectManager.UpdateObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Vector3,OpenMetaverse.UpdateType)">
21748 <summary> 20552 <summary>
21749 Write a file to the tar archive 20553 Send a Multiple Object Update packet to change the size, scale or rotation of a primitive
21750 </summary> 20554 </summary>
21751 <param name="filePath"> 20555 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21752 </param> 20556 <param name="localID">The objects ID which is local to the simulator the object is in</param>
21753 <param name="data"> 20557 <param name="data">The new rotation, size, or position of the target object</param>
21754 </param> 20558 <param name="type">The flags from the <seealso cref="T:OpenMetaverse.UpdateType"/> Enum</param>
21755 </member> 20559 </member>
21756 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.Close"> 20560 <member name="M:OpenMetaverse.ObjectManager.DeedObject(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
21757 <summary> 20561 <summary>
21758 Finish writing the raw tar archive data to a stream. The stream will be closed on completion. 20562 Deed an object (prim) to a group, Object must be shared with group which
20563 can be accomplished with SetPermissions()
21759 </summary> 20564 </summary>
20565 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20566 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20567 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID"/> of the group to deed the object to</param>
21760 </member> 20568 </member>
21761 <member name="M:OpenMetaverse.Assets.TarArchiveWriter.WriteEntry(System.String,System.Byte[],System.Char)"> 20569 <member name="M:OpenMetaverse.ObjectManager.DeedObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.UUID)">
21762 <summary> 20570 <summary>
21763 Write a particular entry 20571 Deed multiple objects (prims) to a group, Objects must be shared with group which
20572 can be accomplished with SetPermissions()
21764 </summary> 20573 </summary>
21765 <param name="filePath"> 20574 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21766 </param> 20575 <param name="localIDs">An array which contains the IDs of the objects to deed</param>
21767 <param name="data"> 20576 <param name="groupOwner">The <seealso cref="T:OpenMetaverse.UUID"/> of the group to deed the object to</param>
21768 </param>
21769 <param name="fileType">
21770 </param>
21771 </member> 20577 </member>
21772 <member name="T:OpenMetaverse.Assets.AssetAnimation"> 20578 <member name="M:OpenMetaverse.ObjectManager.SetPermissions(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.PermissionWho,OpenMetaverse.PermissionMask,System.Boolean)">
21773 <summary> 20579 <summary>
21774 Represents an Animation 20580 Set the permissions on multiple objects
21775 </summary> 20581 </summary>
20582 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
20583 <param name="localIDs">An array which contains the IDs of the objects to set the permissions on</param>
20584 <param name="who">The new Who mask to set</param>
20585 <param name="permissions">Which permission to modify</param>
20586 <param name="set">The new state of permission</param>
21776 </member> 20587 </member>
21777 <member name="M:OpenMetaverse.Assets.AssetAnimation.#ctor"> 20588 <member name="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID)">
21778 <summary>Default Constructor</summary>
21779 </member>
21780 <member name="M:OpenMetaverse.Assets.AssetAnimation.#ctor(OpenMetaverse.UUID,System.Byte[])">
21781 <summary> 20589 <summary>
21782 Construct an Asset object of type Animation 20590 Request additional properties for an object
21783 </summary> 20591 </summary>
21784 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param> 20592 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
21785 <param name="assetData">A byte array containing the raw asset data</param> 20593 <param name="objectID"></param>
21786 </member> 20594 </member>
21787 <member name="P:OpenMetaverse.Assets.AssetAnimation.AssetType"> 20595 <member name="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID,System.Boolean)">
21788 <summary>Override the base classes AssetType</summary>
21789 </member>
21790 <member name="T:OpenMetaverse.Assets.AssetBodypart">
21791 <summary> 20596 <summary>
21792 Represents an <seealso cref="T:OpenMetaverse.Assets.AssetWearable" /> that represents an avatars body ie: Hair, Etc. 20597 Request additional properties for an object
21793 </summary> 20598 </summary>
20599 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20600 <param name="objectID">Absolute UUID of the object</param>
20601 <param name="reliable">Whether to require server acknowledgement of this request</param>
21794 </member> 20602 </member>
21795 <member name="M:OpenMetaverse.Assets.AssetBodypart.#ctor"> 20603 <member name="M:OpenMetaverse.ObjectManager.SetObjectsGroup(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},OpenMetaverse.UUID)">
21796 <summary>Initializes a new instance of an AssetBodyPart object</summary>
21797 </member>
21798 <member name="M:OpenMetaverse.Assets.AssetBodypart.#ctor(OpenMetaverse.UUID,System.Byte[])">
21799 <summary>Initializes a new instance of an AssetBodyPart object with parameters</summary>
21800 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
21801 <param name="assetData">A byte array containing the raw asset data</param>
21802 </member>
21803 <member name="P:OpenMetaverse.Assets.AssetBodypart.AssetType">
21804 <summary>Override the base classes AssetType</summary>
21805 </member>
21806 <member name="T:OpenMetaverse.Assets.AssetClothing">
21807 <summary> 20604 <summary>
21808 Represents an <seealso cref="T:OpenMetaverse.Assets.AssetWearable" /> that can be worn on an avatar 20605 Set the ownership of a list of objects to the specified group
21809 such as a Shirt, Pants, etc.
21810 </summary> 20606 </summary>
20607 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the objects reside</param>
20608 <param name="localIds">An array which contains the IDs of the objects to set the group id on</param>
20609 <param name="groupID">The Groups ID</param>
21811 </member> 20610 </member>
21812 <member name="M:OpenMetaverse.Assets.AssetClothing.#ctor"> 20611 <member name="M:OpenMetaverse.ObjectManager.NavigateObjectMedia(OpenMetaverse.UUID,System.Int32,System.String,OpenMetaverse.Simulator)">
21813 <summary>Initializes a new instance of an AssetScriptBinary object</summary>
21814 </member>
21815 <member name="M:OpenMetaverse.Assets.AssetClothing.#ctor(OpenMetaverse.UUID,System.Byte[])">
21816 <summary>Initializes a new instance of an AssetScriptBinary object with parameters</summary>
21817 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
21818 <param name="assetData">A byte array containing the raw asset data</param>
21819 </member>
21820 <member name="P:OpenMetaverse.Assets.AssetClothing.AssetType">
21821 <summary>Override the base classes AssetType</summary>
21822 </member>
21823 <member name="T:OpenMetaverse.Assets.GestureStepType">
21824 <summary> 20612 <summary>
21825 Type of gesture step 20613 Update current URL of the previously set prim media
21826 </summary> 20614 </summary>
20615 <param name="primID">UUID of the prim</param>
20616 <param name="newURL">Set current URL to this</param>
20617 <param name="face">Prim face number</param>
20618 <param name="sim">Simulator in which prim is located</param>
21827 </member> 20619 </member>
21828 <member name="T:OpenMetaverse.Assets.GestureStep"> 20620 <member name="M:OpenMetaverse.ObjectManager.UpdateObjectMedia(OpenMetaverse.UUID,OpenMetaverse.MediaEntry[],OpenMetaverse.Simulator)">
21829 <summary> 20621 <summary>
21830 Base class for gesture steps 20622 Set object media
21831 </summary> 20623 </summary>
20624 <param name="primID">UUID of the prim</param>
20625 <param name="faceMedia">Array the length of prims number of faces. Null on face indexes where there is
20626 no media, <seealso cref="T:OpenMetaverse.MediaEntry"/> on faces which contain the media</param>
20627 <param name="sim">Simulatior in which prim is located</param>
21832 </member> 20628 </member>
21833 <member name="P:OpenMetaverse.Assets.GestureStep.GestureStepType"> 20629 <member name="M:OpenMetaverse.ObjectManager.RequestObjectMedia(OpenMetaverse.UUID,OpenMetaverse.Simulator,OpenMetaverse.ObjectManager.ObjectMediaCallback)">
21834 <summary> 20630 <summary>
21835 Retururns what kind of gesture step this is 20631 Retrieve information about object media
21836 </summary> 20632 </summary>
20633 <param name="primID">UUID of the primitive</param>
20634 <param name="sim">Simulator where prim is located</param>
20635 <param name="callback">Call this callback when done</param>
21837 </member> 20636 </member>
21838 <member name="T:OpenMetaverse.Assets.GestureStepAnimation"> 20637 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21839 <summary> 20638 <summary>Process an incoming packet and raise the appropriate events</summary>
21840 Describes animation step of a gesture 20639 <param name="sender">The sender</param>
21841 </summary> 20640 <param name="e">The EventArgs object containing the packet data</param>
21842 </member> 20641 </member>
21843 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.AnimationStart"> 20642 <member name="M:OpenMetaverse.ObjectManager.ImprovedTerseObjectUpdateHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21844 <summary> 20643 <summary>
21845 If true, this step represents start of animation, otherwise animation stop 20644 A terse object update, used when a transformation matrix or
20645 velocity/acceleration for an object changes but nothing else
20646 (scale/position/rotation/acceleration/velocity)
21846 </summary> 20647 </summary>
20648 <param name="sender">The sender</param>
20649 <param name="e">The EventArgs object containing the packet data</param>
21847 </member> 20650 </member>
21848 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.ID"> 20651 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateCompressedHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21849 <summary> 20652 <summary>Process an incoming packet and raise the appropriate events</summary>
21850 Animation asset <see cref="T:OpenMetaverse.UUID" /></summary> 20653 <param name="sender">The sender</param>
20654 <param name="e">The EventArgs object containing the packet data</param>
21851 </member> 20655 </member>
21852 <member name="F:OpenMetaverse.Assets.GestureStepAnimation.Name"> 20656 <member name="M:OpenMetaverse.ObjectManager.ObjectUpdateCachedHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21853 <summary> 20657 <summary>Process an incoming packet and raise the appropriate events</summary>
21854 Animation inventory name 20658 <param name="sender">The sender</param>
21855 </summary> 20659 <param name="e">The EventArgs object containing the packet data</param>
21856 </member> 20660 </member>
21857 <member name="P:OpenMetaverse.Assets.GestureStepAnimation.GestureStepType"> 20661 <member name="M:OpenMetaverse.ObjectManager.KillObjectHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21858 <summary> 20662 <summary>Process an incoming packet and raise the appropriate events</summary>
21859 Returns what kind of gesture step this is 20663 <param name="sender">The sender</param>
21860 </summary> 20664 <param name="e">The EventArgs object containing the packet data</param>
21861 </member> 20665 </member>
21862 <member name="T:OpenMetaverse.Assets.GestureStepSound"> 20666 <member name="M:OpenMetaverse.ObjectManager.ObjectPropertiesHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21863 <summary> 20667 <summary>Process an incoming packet and raise the appropriate events</summary>
21864 Describes sound step of a gesture 20668 <param name="sender">The sender</param>
21865 </summary> 20669 <param name="e">The EventArgs object containing the packet data</param>
21866 </member> 20670 </member>
21867 <member name="F:OpenMetaverse.Assets.GestureStepSound.ID"> 20671 <member name="M:OpenMetaverse.ObjectManager.ObjectPropertiesFamilyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21868 <summary> 20672 <summary>Process an incoming packet and raise the appropriate events</summary>
21869 Sound asset <see cref="T:OpenMetaverse.UUID" /></summary> 20673 <param name="sender">The sender</param>
20674 <param name="e">The EventArgs object containing the packet data</param>
21870 </member> 20675 </member>
21871 <member name="F:OpenMetaverse.Assets.GestureStepSound.Name"> 20676 <member name="M:OpenMetaverse.ObjectManager.PayPriceReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
21872 <summary> 20677 <summary>Process an incoming packet and raise the appropriate events</summary>
21873 Sound inventory name 20678 <param name="sender">The sender</param>
21874 </summary> 20679 <param name="e">The EventArgs object containing the packet data</param>
21875 </member> 20680 </member>
21876 <member name="P:OpenMetaverse.Assets.GestureStepSound.GestureStepType"> 20681 <member name="M:OpenMetaverse.ObjectManager.ObjectPhysicsPropertiesHandler(System.String,OpenMetaverse.Interfaces.IMessage,OpenMetaverse.Simulator)">
21877 <summary> 20682 <summary>
21878 Returns what kind of gesture step this is 20683
21879 </summary> 20684 </summary>
20685 <param name="capsKey"></param>
20686 <param name="message"></param>
20687 <param name="simulator"></param>
21880 </member> 20688 </member>
21881 <member name="T:OpenMetaverse.Assets.GestureStepChat"> 20689 <member name="M:OpenMetaverse.ObjectManager.BuildBasicShape(OpenMetaverse.PrimType)">
21882 <summary> 20690 <summary>
21883 Describes sound step of a gesture 20691 Setup construction data for a basic primitive shape
21884 </summary> 20692 </summary>
20693 <param name="type">Primitive shape to construct</param>
20694 <returns>Construction data that can be plugged into a <seealso cref="T:OpenMetaverse.Primitive"/></returns>
21885 </member> 20695 </member>
21886 <member name="F:OpenMetaverse.Assets.GestureStepChat.Text"> 20696 <member name="M:OpenMetaverse.ObjectManager.SetAvatarSittingOn(OpenMetaverse.Simulator,OpenMetaverse.Avatar,System.UInt32,System.UInt32)">
21887 <summary> 20697 <summary>
21888 Text to output in chat 20698
21889 </summary> 20699 </summary>
20700 <param name="sim"></param>
20701 <param name="av"></param>
20702 <param name="localid"></param>
20703 <param name="oldSeatID"></param>
21890 </member> 20704 </member>
21891 <member name="P:OpenMetaverse.Assets.GestureStepChat.GestureStepType"> 20705 <member name="M:OpenMetaverse.ObjectManager.UpdateDilation(OpenMetaverse.Simulator,System.UInt32)">
21892 <summary> 20706 <summary>
21893 Returns what kind of gesture step this is 20707
21894 </summary> 20708 </summary>
20709 <param name="s"></param>
20710 <param name="dilation"></param>
21895 </member> 20711 </member>
21896 <member name="T:OpenMetaverse.Assets.GestureStepWait"> 20712 <member name="M:OpenMetaverse.ObjectManager.SetShape(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Primitive.ConstructionData)">
21897 <summary> 20713 <summary>
21898 Describes sound step of a gesture 20714 Set the Shape data of an object
21899 </summary> 20715 </summary>
20716 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20717 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20718 <param name="prim">Data describing the prim shape</param>
21900 </member> 20719 </member>
21901 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitForAnimation"> 20720 <member name="M:OpenMetaverse.ObjectManager.SetMaterial(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.Material)">
21902 <summary> 20721 <summary>
21903 If true in this step we wait for all animations to finish 20722 Set the Material data of an object
21904 </summary> 20723 </summary>
20724 <param name="simulator">A reference to the <seealso cref="T:OpenMetaverse.Simulator"/> object where the object resides</param>
20725 <param name="localID">The objects ID which is local to the simulator the object is in</param>
20726 <param name="material">The new material of the object</param>
21905 </member> 20727 </member>
21906 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitForTime"> 20728 <member name="M:OpenMetaverse.ObjectManager.GetPrimitive(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
21907 <summary> 20729 <summary>
21908 If true gesture player should wait for the specified amount of time 20730
21909 </summary> 20731 </summary>
20732 <param name="simulator"></param>
20733 <param name="localID"></param>
20734 <param name="fullID"></param>
20735 <returns></returns>
21910 </member> 20736 </member>
21911 <member name="F:OpenMetaverse.Assets.GestureStepWait.WaitTime"> 20737 <member name="M:OpenMetaverse.ObjectManager.GetPrimitive(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID,System.Boolean)">
21912 <summary> 20738 <summary>
21913 Time in seconds to wait if WaitForAnimation is false 20739
21914 </summary> 20740 </summary>
20741 <param name="simulator"></param>
20742 <param name="localID"></param>
20743 <param name="fullID"></param>
20744 <param name="createIfMissing"></param>
20745 <returns></returns>
21915 </member> 20746 </member>
21916 <member name="P:OpenMetaverse.Assets.GestureStepWait.GestureStepType"> 20747 <member name="M:OpenMetaverse.ObjectManager.GetAvatar(OpenMetaverse.Simulator,System.UInt32,OpenMetaverse.UUID)">
21917 <summary> 20748 <summary>
21918 Returns what kind of gesture step this is 20749
21919 </summary> 20750 </summary>
20751 <param name="simulator"></param>
20752 <param name="localID"></param>
20753 <param name="fullID"></param>
20754 <returns></returns>
21920 </member> 20755 </member>
21921 <member name="T:OpenMetaverse.Assets.GestureStepEOF"> 20756 <member name="E:OpenMetaverse.ObjectManager.ObjectUpdate">
21922 <summary> 20757 <summary>Raised when the simulator sends us data containing
21923 Describes the final step of a gesture 20758 A <see cref="T:OpenMetaverse.Primitive"/>, Foliage or Attachment</summary>
21924 </summary> 20759 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObject(OpenMetaverse.Simulator,System.UInt32)"/>
20760 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObjects(OpenMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})"/>
21925 </member> 20761 </member>
21926 <member name="P:OpenMetaverse.Assets.GestureStepEOF.GestureStepType"> 20762 <member name="E:OpenMetaverse.ObjectManager.ObjectProperties">
21927 <summary> 20763 <summary>Raised when the simulator sends us data containing
21928 Returns what kind of gesture step this is 20764 additional <seea cref="T:OpenMetaverse.Primitive"/> information</summary>
21929 </summary> 20765 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)"/>
20766 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[],System.Boolean)"/>
21930 </member> 20767 </member>
21931 <member name="T:OpenMetaverse.Assets.AssetGesture"> 20768 <member name="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated">
21932 <summary> 20769 <summary>Raised when the simulator sends us data containing
21933 Represents a sequence of animations, sounds, and chat actions 20770 Primitive.ObjectProperties for an object we are currently tracking</summary>
21934 </summary>
21935 </member> 20771 </member>
21936 <member name="M:OpenMetaverse.Assets.AssetGesture.#ctor"> 20772 <member name="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily">
21937 <summary> 20773 <summary>Raised when the simulator sends us data containing
21938 Constructs guesture asset 20774 additional <seea cref="T:OpenMetaverse.Primitive"/> and <see cref="T:OpenMetaverse.Avatar"/> details</summary>
21939 </summary> 20775 <seealso cref="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID)"/>
21940 </member> 20776 </member>
21941 <member name="M:OpenMetaverse.Assets.AssetGesture.#ctor(OpenMetaverse.UUID,System.Byte[])"> 20777 <member name="E:OpenMetaverse.ObjectManager.AvatarUpdate">
21942 <summary> 20778 <summary>Raised when the simulator sends us data containing
21943 Constructs guesture asset 20779 updated information for an <see cref="T:OpenMetaverse.Avatar"/></summary>
21944 </summary>
21945 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
21946 <param name="assetData">A byte array containing the raw asset data</param>
21947 </member> 20780 </member>
21948 <member name="F:OpenMetaverse.Assets.AssetGesture.TriggerKey"> 20781 <member name="E:OpenMetaverse.ObjectManager.TerseObjectUpdate">
21949 <summary> 20782 <summary>Raised when the simulator sends us data containing
21950 Keyboard key that triggers the gestyre 20783 <see cref="T:OpenMetaverse.Primitive"/> and <see cref="T:OpenMetaverse.Avatar"/> movement changes</summary>
21951 </summary>
21952 </member> 20784 </member>
21953 <member name="F:OpenMetaverse.Assets.AssetGesture.TriggerKeyMask"> 20785 <member name="E:OpenMetaverse.ObjectManager.ObjectDataBlockUpdate">
21954 <summary> 20786 <summary>Raised when the simulator sends us data containing
21955 Modifier to the trigger key 20787 updates to an Objects DataBlock</summary>
21956 </summary>
21957 </member> 20788 </member>
21958 <member name="F:OpenMetaverse.Assets.AssetGesture.Trigger"> 20789 <member name="E:OpenMetaverse.ObjectManager.KillObject">
21959 <summary> 20790 <summary>Raised when the simulator informs us an <see cref="T:OpenMetaverse.Primitive"/>
21960 String that triggers playing of the gesture sequence 20791 or <see cref="T:OpenMetaverse.Avatar"/> is no longer within view</summary>
21961 </summary>
21962 </member> 20792 </member>
21963 <member name="F:OpenMetaverse.Assets.AssetGesture.ReplaceWith"> 20793 <member name="E:OpenMetaverse.ObjectManager.KillObjects">
21964 <summary> 20794 <summary>Raised when the simulator informs us when a group of <see cref="T:OpenMetaverse.Primitive"/>
21965 Text that replaces trigger in chat once gesture is triggered 20795 or <see cref="T:OpenMetaverse.Avatar"/> is no longer within view</summary>
21966 </summary>
21967 </member> 20796 </member>
21968 <member name="F:OpenMetaverse.Assets.AssetGesture.Sequence"> 20797 <member name="E:OpenMetaverse.ObjectManager.AvatarSitChanged">
21969 <summary> 20798 <summary>Raised when the simulator sends us data containing
21970 Sequence of gesture steps 20799 updated sit information for our <see cref="T:OpenMetaverse.Avatar"/></summary>
21971 </summary>
21972 </member> 20800 </member>
21973 <member name="P:OpenMetaverse.Assets.AssetGesture.AssetType"> 20801 <member name="E:OpenMetaverse.ObjectManager.PayPriceReply">
21974 <summary> 20802 <summary>Raised when the simulator sends us data containing
21975 Returns asset type 20803 purchase price information for a <see cref="T:OpenMetaverse.Primitive"/></summary>
21976 </summary>
21977 </member> 20804 </member>
21978 <member name="M:OpenMetaverse.Assets.AssetGesture.Encode"> 20805 <member name="E:OpenMetaverse.ObjectManager.PhysicsProperties">
21979 <summary> 20806 <summary>Raised when the simulator sends us data containing
21980 Encodes gesture asset suitable for uplaod 20807 additional <seea cref="T:OpenMetaverse.Primitive"/> information</summary>
21981 </summary> 20808 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)"/>
20809 <seealso cref="M:OpenMetaverse.ObjectManager.SelectObjects(OpenMetaverse.Simulator,System.UInt32[],System.Boolean)"/>
21982 </member> 20810 </member>
21983 <member name="M:OpenMetaverse.Assets.AssetGesture.Decode"> 20811 <member name="T:OpenMetaverse.ObjectManager.ObjectMediaCallback">
21984 <summary> 20812 <summary>
21985 Decodes gesture assset into play sequence 20813 Callback for getting object media data via CAP
21986 </summary> 20814 </summary>
21987 <returns>true if the asset data was decoded successfully</returns> 20815 <param name="success">Indicates if the operation was succesfull</param>
20816 <param name="version">Object media version string</param>
20817 <param name="faceMedia">Array indexed on prim face of media entry data</param>
21988 </member> 20818 </member>
21989 <member name="T:OpenMetaverse.Assets.AssetLandmark"> 20819 <member name="T:OpenMetaverse.PrimEventArgs">
20820 <summary>Provides data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/> event</summary>
20821 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/> event occurs when the simulator sends
20822 an <see cref="T:OpenMetaverse.Packets.ObjectUpdatePacket"/> containing a Primitive, Foliage or Attachment data</para>
20823 <para>Note 1: The <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/> event will not be raised when the object is an Avatar</para>
20824 <para>Note 2: It is possible for the <see cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/> to be
20825 raised twice for the same object if for example the primitive moved to a new simulator, then returned to the current simulator or
20826 if an Avatar crosses the border into a new simulator and returns to the current simulator</para>
20827 </remarks>
20828 <example>
20829 The following code example uses the <see cref="P:OpenMetaverse.PrimEventArgs.Prim"/>, <see cref="P:OpenMetaverse.PrimEventArgs.Simulator"/>, and <see cref="P:OpenMetaverse.PrimEventArgs.IsAttachment"/>
20830 properties to display new Primitives and Attachments on the <see cref="T:System.Console"/> window.
20831 <code>
20832 // Subscribe to the event that gives us prim and foliage information
20833 Client.Objects.ObjectUpdate += Objects_ObjectUpdate;
20834
20835
20836 private void Objects_ObjectUpdate(object sender, PrimEventArgs e)
20837 {
20838 Console.WriteLine("Primitive {0} {1} in {2} is an attachment {3}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name, e.IsAttachment);
20839 }
20840 </code>
20841 </example>
20842 <seealso cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/>
20843 <seealso cref="E:OpenMetaverse.ObjectManager.AvatarUpdate"/>
20844 <seealso cref="T:OpenMetaverse.AvatarUpdateEventArgs"/>
20845 </member>
20846 <member name="M:OpenMetaverse.PrimEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive,System.UInt16,System.Boolean,System.Boolean)">
21990 <summary> 20847 <summary>
21991 Represents a Landmark with RegionID and Position vector 20848 Construct a new instance of the PrimEventArgs class
21992 </summary> 20849 </summary>
20850 <param name="simulator">The simulator the object originated from</param>
20851 <param name="prim">The Primitive</param>
20852 <param name="timeDilation">The simulator time dilation</param>
20853 <param name="isNew">The prim was not in the dictionary before this update</param>
20854 <param name="isAttachment">true if the primitive represents an attachment to an agent</param>
21993 </member> 20855 </member>
21994 <member name="M:OpenMetaverse.Assets.AssetLandmark.#ctor"> 20856 <member name="P:OpenMetaverse.PrimEventArgs.Simulator">
21995 <summary>Construct an Asset of type Landmark</summary> 20857 <summary>Get the simulator the <see cref="T:OpenMetaverse.Primitive"/> originated from</summary>
21996 </member> 20858 </member>
21997 <member name="M:OpenMetaverse.Assets.AssetLandmark.#ctor(OpenMetaverse.UUID,System.Byte[])"> 20859 <member name="P:OpenMetaverse.PrimEventArgs.Prim">
21998 <summary> 20860 <summary>Get the <see cref="T:OpenMetaverse.Primitive"/> details</summary>
21999 Construct an Asset object of type Landmark
22000 </summary>
22001 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22002 <param name="assetData">A byte array containing the raw asset data</param>
22003 </member> 20861 </member>
22004 <member name="F:OpenMetaverse.Assets.AssetLandmark.RegionID"> 20862 <member name="P:OpenMetaverse.PrimEventArgs.IsNew">
22005 <summary>UUID of the Landmark target region</summary> 20863 <summary>true if the <see cref="T:OpenMetaverse.Primitive"/> did not exist in the dictionary before this update (always true if object tracking has been disabled)</summary>
22006 </member> 20864 </member>
22007 <member name="F:OpenMetaverse.Assets.AssetLandmark.Position"> 20865 <member name="P:OpenMetaverse.PrimEventArgs.IsAttachment">
22008 <summary> Local position of the target </summary> 20866 <summary>true if the <see cref="T:OpenMetaverse.Primitive"/> is attached to an <see cref="T:OpenMetaverse.Avatar"/></summary>
22009 </member> 20867 </member>
22010 <member name="P:OpenMetaverse.Assets.AssetLandmark.AssetType"> 20868 <member name="P:OpenMetaverse.PrimEventArgs.TimeDilation">
22011 <summary>Override the base classes AssetType</summary> 20869 <summary>Get the simulator Time Dilation</summary>
22012 </member> 20870 </member>
22013 <member name="M:OpenMetaverse.Assets.AssetLandmark.Encode"> 20871 <member name="T:OpenMetaverse.AvatarUpdateEventArgs">
22014 <summary> 20872 <summary>Provides data for the <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate"/> event</summary>
22015 Encode the raw contents of a string with the specific Landmark format 20873 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate"/> event occurs when the simulator sends
22016 </summary> 20874 an <see cref="T:OpenMetaverse.Packets.ObjectUpdatePacket"/> containing Avatar data</para>
20875 <para>Note 1: The <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate"/> event will not be raised when the object is an Avatar</para>
20876 <para>Note 2: It is possible for the <see cref="E:OpenMetaverse.ObjectManager.AvatarUpdate"/> to be
20877 raised twice for the same avatar if for example the avatar moved to a new simulator, then returned to the current simulator</para>
20878 </remarks>
20879 <example>
20880 The following code example uses the <see cref="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar"/> property to make a request for the top picks
20881 using the <see cref="M:OpenMetaverse.AvatarManager.RequestAvatarPicks(OpenMetaverse.UUID)"/> method in the <see cref="T:OpenMetaverse.AvatarManager"/> class to display the names
20882 of our own agents picks listings on the <see cref="T:System.Console"/> window.
20883 <code>
20884 // subscribe to the AvatarUpdate event to get our information
20885 Client.Objects.AvatarUpdate += Objects_AvatarUpdate;
20886 Client.Avatars.AvatarPicksReply += Avatars_AvatarPicksReply;
20887
20888 private void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e)
20889 {
20890 // we only want our own data
20891 if (e.Avatar.LocalID == Client.Self.LocalID)
20892 {
20893 // Unsubscribe from the avatar update event to prevent a loop
20894 // where we continually request the picks every time we get an update for ourselves
20895 Client.Objects.AvatarUpdate -= Objects_AvatarUpdate;
20896 // make the top picks request through AvatarManager
20897 Client.Avatars.RequestAvatarPicks(e.Avatar.ID);
20898 }
20899 }
20900
20901 private void Avatars_AvatarPicksReply(object sender, AvatarPicksReplyEventArgs e)
20902 {
20903 // we'll unsubscribe from the AvatarPicksReply event since we now have the data
20904 // we were looking for
20905 Client.Avatars.AvatarPicksReply -= Avatars_AvatarPicksReply;
20906 // loop through the dictionary and extract the names of the top picks from our profile
20907 foreach (var pickName in e.Picks.Values)
20908 {
20909 Console.WriteLine(pickName);
20910 }
20911 }
20912 </code>
20913 </example>
20914 <seealso cref="E:OpenMetaverse.ObjectManager.ObjectUpdate"/>
20915 <seealso cref="T:OpenMetaverse.PrimEventArgs"/>
22017 </member> 20916 </member>
22018 <member name="M:OpenMetaverse.Assets.AssetLandmark.Decode"> 20917 <member name="M:OpenMetaverse.AvatarUpdateEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Avatar,System.UInt16,System.Boolean)">
22019 <summary> 20918 <summary>
22020 Decode the raw asset data, populating the RegionID and Position 20919 Construct a new instance of the AvatarUpdateEventArgs class
22021 </summary> 20920 </summary>
22022 <returns>true if the AssetData was successfully decoded to a UUID and Vector</returns> 20921 <param name="simulator">The simulator the packet originated from</param>
20922 <param name="avatar">The <see cref="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar"/> data</param>
20923 <param name="timeDilation">The simulator time dilation</param>
20924 <param name="isNew">The avatar was not in the dictionary before this update</param>
22023 </member> 20925 </member>
22024 <member name="T:OpenMetaverse.Assets.AssetMesh"> 20926 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.Simulator">
22025 <summary> 20927 <summary>Get the simulator the object originated from</summary>
22026 Represents Mesh asset
22027 </summary>
22028 </member> 20928 </member>
22029 <member name="M:OpenMetaverse.Assets.AssetMesh.#ctor"> 20929 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar">
22030 <summary>Initializes a new instance of an AssetMesh object</summary> 20930 <summary>Get the <see cref="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar"/> data</summary>
22031 </member> 20931 </member>
22032 <member name="M:OpenMetaverse.Assets.AssetMesh.#ctor(OpenMetaverse.UUID,System.Byte[])"> 20932 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.TimeDilation">
22033 <summary>Initializes a new instance of an AssetMesh object with parameters</summary> 20933 <summary>Get the simulator time dilation</summary>
22034 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22035 <param name="assetData">A byte array containing the raw asset data</param>
22036 </member> 20934 </member>
22037 <member name="F:OpenMetaverse.Assets.AssetMesh.MeshData"> 20935 <member name="P:OpenMetaverse.AvatarUpdateEventArgs.IsNew">
22038 <summary> 20936 <summary>true if the <see cref="P:OpenMetaverse.AvatarUpdateEventArgs.Avatar"/> did not exist in the dictionary before this update (always true if avatar tracking has been disabled)</summary>
22039 Decoded mesh data
22040 </summary>
22041 </member> 20937 </member>
22042 <member name="P:OpenMetaverse.Assets.AssetMesh.AssetType"> 20938 <member name="T:OpenMetaverse.ObjectPropertiesEventArgs">
22043 <summary>Override the base classes AssetType</summary> 20939 <summary>Provides additional primitive data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event</summary>
20940 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event occurs when the simulator sends
20941 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> containing additional details for a Primitive, Foliage data or Attachment data</para>
20942 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)"/> request is
20943 made.</para>
20944 </remarks>
20945 <example>
20946 The following code example uses the <see cref="P:OpenMetaverse.PrimEventArgs.Prim"/>, <see cref="P:OpenMetaverse.PrimEventArgs.Simulator"/> and
20947 <see cref="P:OpenMetaverse.ObjectPropertiesEventArgs.Properties"/>
20948 properties to display new attachments and send a request for additional properties containing the name of the
20949 attachment then display it on the <see cref="T:System.Console"/> window.
20950 <code>
20951 // Subscribe to the event that provides additional primitive details
20952 Client.Objects.ObjectProperties += Objects_ObjectProperties;
20953
20954 // handle the properties data that arrives
20955 private void Objects_ObjectProperties(object sender, ObjectPropertiesEventArgs e)
20956 {
20957 Console.WriteLine("Primitive Properties: {0} Name is {1}", e.Properties.ObjectID, e.Properties.Name);
20958 }
20959 </code>
20960 </example>
22044 </member> 20961 </member>
22045 <member name="M:OpenMetaverse.Assets.AssetMesh.Encode"> 20962 <member name="M:OpenMetaverse.ObjectPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive.ObjectProperties)">
22046 <summary> 20963 <summary>
22047 TODO: Encodes Collada file into LLMesh format 20964 Construct a new instance of the ObjectPropertiesEventArgs class
22048 </summary> 20965 </summary>
20966 <param name="simulator">The simulator the object is located</param>
20967 <param name="props">The primitive Properties</param>
22049 </member> 20968 </member>
22050 <member name="M:OpenMetaverse.Assets.AssetMesh.Decode"> 20969 <member name="P:OpenMetaverse.ObjectPropertiesEventArgs.Simulator">
22051 <summary> 20970 <summary>Get the simulator the object is located</summary>
22052 Decodes mesh asset. See <see cref="M:OpenMetaverse.Rendering.FacetedMesh.TryDecodeFromAsset(OpenMetaverse.Primitive,OpenMetaverse.Assets.AssetMesh,OpenMetaverse.Rendering.DetailLevel,OpenMetaverse.Rendering.FacetedMesh)" />
22053 to furter decode it for rendering</summary>
22054 <returns>true</returns>
22055 </member> 20971 </member>
22056 <member name="T:OpenMetaverse.Assets.AssetNotecard"> 20972 <member name="P:OpenMetaverse.ObjectPropertiesEventArgs.Properties">
22057 <summary> 20973 <summary>Get the primitive properties</summary>
22058 Represents a string of characters encoded with specific formatting properties
22059 </summary>
22060 </member> 20974 </member>
22061 <member name="M:OpenMetaverse.Assets.AssetNotecard.#ctor"> 20975 <member name="T:OpenMetaverse.ObjectPropertiesUpdatedEventArgs">
22062 <summary>Construct an Asset of type Notecard</summary> 20976 <summary>Provides additional primitive data for the <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated"/> event</summary>
20977 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated"/> event occurs when the simulator sends
20978 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> containing additional details for a Primitive or Foliage data that is currently
20979 being tracked in the <see cref="F:OpenMetaverse.Simulator.ObjectsPrimitives"/> dictionary</para>
20980 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesUpdated"/> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.SelectObject(OpenMetaverse.Simulator,System.UInt32)"/> request is
20981 made and <see cref="F:OpenMetaverse.Settings.OBJECT_TRACKING"/> is enabled</para>
20982 </remarks>
22063 </member> 20983 </member>
22064 <member name="M:OpenMetaverse.Assets.AssetNotecard.#ctor(OpenMetaverse.UUID,System.Byte[])"> 20984 <member name="M:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive,OpenMetaverse.Primitive.ObjectProperties)">
22065 <summary> 20985 <summary>
22066 Construct an Asset object of type Notecard 20986 Construct a new instance of the ObjectPropertiesUpdatedEvenrArgs class
22067 </summary> 20987 </summary>
22068 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param> 20988 <param name="simulator">The simulator the object is located</param>
22069 <param name="assetData">A byte array containing the raw asset data</param> 20989 <param name="prim">The Primitive</param>
22070 </member> 20990 <param name="props">The primitive Properties</param>
22071 <member name="F:OpenMetaverse.Assets.AssetNotecard.BodyText">
22072 <summary>A text string containing main text of the notecard</summary>
22073 </member>
22074 <member name="F:OpenMetaverse.Assets.AssetNotecard.EmbeddedItems">
22075 <summary>List of <see cref="T:OpenMetaverse.InventoryItem" />s embedded on the notecard</summary>
22076 </member> 20991 </member>
22077 <member name="P:OpenMetaverse.Assets.AssetNotecard.AssetType"> 20992 <member name="P:OpenMetaverse.ObjectPropertiesUpdatedEventArgs.Prim">
22078 <summary>Override the base classes AssetType</summary> 20993 <summary>Get the primitive details</summary>
22079 </member> 20994 </member>
22080 <member name="M:OpenMetaverse.Assets.AssetNotecard.Encode"> 20995 <member name="T:OpenMetaverse.ObjectPropertiesFamilyEventArgs">
22081 <summary> 20996 <summary>Provides additional primitive data, permissions and sale info for the <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily"/> event</summary>
22082 Encode the raw contents of a string with the specific Linden Text properties 20997 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectPropertiesFamily"/> event occurs when the simulator sends
22083 </summary> 20998 an <see cref="T:OpenMetaverse.Packets.ObjectPropertiesPacket"/> containing additional details for a Primitive, Foliage data or Attachment. This includes
20999 Permissions, Sale info, and other basic details on an object</para>
21000 <para>The <see cref="E:OpenMetaverse.ObjectManager.ObjectProperties"/> event is also raised when a <see cref="M:OpenMetaverse.ObjectManager.RequestObjectPropertiesFamily(OpenMetaverse.Simulator,OpenMetaverse.UUID)"/> request is
21001 made, the viewer equivalent is hovering the mouse cursor over an object</para>
21002 </remarks>
22084 </member> 21003 </member>
22085 <member name="M:OpenMetaverse.Assets.AssetNotecard.Decode"> 21004 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Simulator">
22086 <summary> 21005 <summary>Get the simulator the object is located</summary>
22087 Decode the raw asset data including the Linden Text properties
22088 </summary>
22089 <returns>true if the AssetData was successfully decoded</returns>
22090 </member> 21006 </member>
22091 <member name="T:OpenMetaverse.Assets.AssetPrim"> 21007 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Properties">
22092 <summary> 21008 <summary></summary>
22093 A linkset asset, containing a parent primitive and zero or more children
22094 </summary>
22095 </member> 21009 </member>
22096 <member name="M:OpenMetaverse.Assets.AssetPrim.#ctor"> 21010 <member name="P:OpenMetaverse.ObjectPropertiesFamilyEventArgs.Type">
22097 <summary>Initializes a new instance of an AssetPrim object</summary> 21011 <summary></summary>
22098 </member> 21012 </member>
22099 <member name="M:OpenMetaverse.Assets.AssetPrim.#ctor(OpenMetaverse.UUID,System.Byte[])"> 21013 <member name="T:OpenMetaverse.TerseObjectUpdateEventArgs">
22100 <summary> 21014 <summary>Provides primitive data containing updated location, velocity, rotation, textures for the <see cref="E:OpenMetaverse.ObjectManager.TerseObjectUpdate"/> event</summary>
22101 Initializes a new instance of an AssetPrim object 21015 <remarks><para>The <see cref="E:OpenMetaverse.ObjectManager.TerseObjectUpdate"/> event occurs when the simulator sends updated location, velocity, rotation, etc</para>
22102 </summary> 21016 </remarks>
22103 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22104 <param name="assetData">A byte array containing the raw asset data</param>
22105 </member> 21017 </member>
22106 <member name="T:OpenMetaverse.Assets.AssetPrim.ProfileShape"> 21018 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Simulator">
22107 <summary> 21019 <summary>Get the simulator the object is located</summary>
22108 Only used internally for XML serialization/deserialization
22109 </summary>
22110 </member> 21020 </member>
22111 <member name="P:OpenMetaverse.Assets.AssetPrim.AssetType"> 21021 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Prim">
22112 <summary>Override the base classes AssetType</summary> 21022 <summary>Get the primitive details</summary>
22113 </member> 21023 </member>
22114 <member name="M:OpenMetaverse.Assets.AssetPrim.Encode"> 21024 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.Update">
22115 <summary> 21025 <summary></summary>
22116 </summary>
22117 </member> 21026 </member>
22118 <member name="M:OpenMetaverse.Assets.AssetPrim.Decode"> 21027 <member name="P:OpenMetaverse.TerseObjectUpdateEventArgs.TimeDilation">
22119 <summary> 21028 <summary></summary>
22120 </summary>
22121 <returns>
22122 </returns>
22123 </member> 21029 </member>
22124 <member name="T:OpenMetaverse.Assets.PrimObject"> 21030 <member name="T:OpenMetaverse.ObjectDataBlockUpdateEventArgs">
22125 <summary> 21031 <summary>
22126 The deserialized form of a single primitive in a linkset asset 21032
22127 </summary> 21033 </summary>
22128 </member> 21034 </member>
22129 <member name="T:OpenMetaverse.Assets.AssetScriptBinary"> 21035 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Simulator">
22130 <summary> 21036 <summary>Get the simulator the object is located</summary>
22131 Represents an AssetScriptBinary object containing the
22132 LSO compiled bytecode of an LSL script
22133 </summary>
22134 </member> 21037 </member>
22135 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.#ctor"> 21038 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Prim">
22136 <summary>Initializes a new instance of an AssetScriptBinary object</summary> 21039 <summary>Get the primitive details</summary>
22137 </member> 21040 </member>
22138 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.#ctor(OpenMetaverse.UUID,System.Byte[])"> 21041 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.ConstructionData">
22139 <summary>Initializes a new instance of an AssetScriptBinary object with parameters</summary> 21042 <summary></summary>
22140 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22141 <param name="assetData">A byte array containing the raw asset data</param>
22142 </member> 21043 </member>
22143 <member name="P:OpenMetaverse.Assets.AssetScriptBinary.AssetType"> 21044 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Block">
22144 <summary>Override the base classes AssetType</summary> 21045 <summary></summary>
22145 </member> 21046 </member>
22146 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.Encode"> 21047 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.Update">
22147 <summary> 21048 <summary></summary>
22148 TODO: Encodes a scripts contents into a LSO Bytecode file
22149 </summary>
22150 </member> 21049 </member>
22151 <member name="M:OpenMetaverse.Assets.AssetScriptBinary.Decode"> 21050 <member name="P:OpenMetaverse.ObjectDataBlockUpdateEventArgs.NameValues">
22152 <summary> 21051 <summary></summary>
22153 TODO: Decode LSO Bytecode into a string
22154 </summary>
22155 <returns>true</returns>
22156 </member> 21052 </member>
22157 <member name="T:OpenMetaverse.Assets.AssetScriptText"> 21053 <member name="T:OpenMetaverse.KillObjectEventArgs">
22158 <summary> 21054 <summary>Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the
22159 Represents an LSL Text object containing a string of UTF encoded characters 21055 <see cref="E:OpenMetaverse.ObjectManager.KillObject"/> event</summary>
22160 </summary>
22161 </member> 21056 </member>
22162 <member name="M:OpenMetaverse.Assets.AssetScriptText.#ctor"> 21057 <member name="P:OpenMetaverse.KillObjectEventArgs.Simulator">
22163 <summary>Initializes a new AssetScriptText object</summary> 21058 <summary>Get the simulator the object is located</summary>
22164 </member> 21059 </member>
22165 <member name="M:OpenMetaverse.Assets.AssetScriptText.#ctor(OpenMetaverse.UUID,System.Byte[])"> 21060 <member name="P:OpenMetaverse.KillObjectEventArgs.ObjectLocalID">
22166 <summary> 21061 <summary>The LocalID of the object</summary>
22167 Initializes a new AssetScriptText object with parameters
22168 </summary>
22169 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22170 <param name="assetData">A byte array containing the raw asset data</param>
22171 </member> 21062 </member>
22172 <member name="F:OpenMetaverse.Assets.AssetScriptText.Source"> 21063 <member name="T:OpenMetaverse.KillObjectsEventArgs">
22173 <summary>A string of characters represting the script contents</summary> 21064 <summary>Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the
21065 <see cref="E:OpenMetaverse.ObjectManager.KillObjects"/> event</summary>
22174 </member> 21066 </member>
22175 <member name="P:OpenMetaverse.Assets.AssetScriptText.AssetType"> 21067 <member name="P:OpenMetaverse.KillObjectsEventArgs.Simulator">
22176 <summary>Override the base classes AssetType</summary> 21068 <summary>Get the simulator the object is located</summary>
22177 </member> 21069 </member>
22178 <member name="M:OpenMetaverse.Assets.AssetScriptText.Encode"> 21070 <member name="P:OpenMetaverse.KillObjectsEventArgs.ObjectLocalIDs">
22179 <summary> 21071 <summary>The LocalID of the object</summary>
22180 Encode a string containing the scripts contents into byte encoded AssetData
22181 </summary>
22182 </member> 21072 </member>
22183 <member name="M:OpenMetaverse.Assets.AssetScriptText.Decode"> 21073 <member name="T:OpenMetaverse.AvatarSitChangedEventArgs">
22184 <summary> 21074 <summary>
22185 Decode a byte array containing the scripts contents into a string 21075 Provides updates sit position data
22186 </summary> 21076 </summary>
22187 <returns>true if decoding is successful</returns>
22188 </member> 21077 </member>
22189 <member name="T:OpenMetaverse.Assets.AssetSound"> 21078 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.Simulator">
22190 <summary> 21079 <summary>Get the simulator the object is located</summary>
22191 Represents a Sound Asset
22192 </summary>
22193 </member> 21080 </member>
22194 <member name="M:OpenMetaverse.Assets.AssetSound.#ctor"> 21081 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.Avatar">
22195 <summary>Initializes a new instance of an AssetSound object</summary> 21082 <summary></summary>
22196 </member> 21083 </member>
22197 <member name="M:OpenMetaverse.Assets.AssetSound.#ctor(OpenMetaverse.UUID,System.Byte[])"> 21084 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.SittingOn">
22198 <summary>Initializes a new instance of an AssetSound object with parameters</summary> 21085 <summary></summary>
22199 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22200 <param name="assetData">A byte array containing the raw asset data</param>
22201 </member> 21086 </member>
22202 <member name="P:OpenMetaverse.Assets.AssetSound.AssetType"> 21087 <member name="P:OpenMetaverse.AvatarSitChangedEventArgs.OldSeat">
22203 <summary>Override the base classes AssetType</summary> 21088 <summary></summary>
22204 </member> 21089 </member>
22205 <member name="M:OpenMetaverse.Assets.AssetSound.Encode"> 21090 <member name="T:OpenMetaverse.PayPriceReplyEventArgs">
22206 <summary> 21091 <summary>
22207 TODO: Encodes a sound file 21092
22208 </summary> 21093 </summary>
22209 </member> 21094 </member>
22210 <member name="M:OpenMetaverse.Assets.AssetSound.Decode"> 21095 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.Simulator">
22211 <summary> 21096 <summary>Get the simulator the object is located</summary>
22212 TODO: Decode a sound file
22213 </summary>
22214 <returns>true</returns>
22215 </member> 21097 </member>
22216 <member name="T:OpenMetaverse.Assets.AssetTexture"> 21098 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.ObjectID">
22217 <summary> 21099 <summary></summary>
22218 Represents a texture
22219 </summary>
22220 </member> 21100 </member>
22221 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor"> 21101 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.DefaultPrice">
22222 <summary>Initializes a new instance of an AssetTexture object</summary> 21102 <summary></summary>
22223 </member> 21103 </member>
22224 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor(OpenMetaverse.UUID,System.Byte[])"> 21104 <member name="P:OpenMetaverse.PayPriceReplyEventArgs.ButtonPrices">
21105 <summary></summary>
21106 </member>
21107 <member name="P:OpenMetaverse.ObjectMediaEventArgs.Success">
22225 <summary> 21108 <summary>
22226 Initializes a new instance of an AssetTexture object 21109 Indicates if the operation was successful
22227 </summary> 21110 </summary>
22228 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22229 <param name="assetData">A byte array containing the raw asset data</param>
22230 </member> 21111 </member>
22231 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor(OpenMetaverse.Imaging.ManagedImage)"> 21112 <member name="P:OpenMetaverse.ObjectMediaEventArgs.Version">
22232 <summary> 21113 <summary>
22233 Initializes a new instance of an AssetTexture object 21114 Media version string
22234 </summary> 21115 </summary>
22235 <param name="image">A <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object containing texture data</param>
22236 </member>
22237 <member name="F:OpenMetaverse.Assets.AssetTexture.Image">
22238 <summary>A <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object containing image data</summary>
22239 </member> 21116 </member>
22240 <member name="F:OpenMetaverse.Assets.AssetTexture.LayerInfo"> 21117 <member name="P:OpenMetaverse.ObjectMediaEventArgs.FaceMedia">
22241 <summary> 21118 <summary>
21119 Array of media entries indexed by face number
22242 </summary> 21120 </summary>
22243 </member> 21121 </member>
22244 <member name="F:OpenMetaverse.Assets.AssetTexture.Components"> 21122 <member name="T:OpenMetaverse.PhysicsPropertiesEventArgs">
22245 <summary> 21123 <summary>
21124 Set when simulator sends us infomation on primitive's physical properties
22246 </summary> 21125 </summary>
22247 </member> 21126 </member>
22248 <member name="P:OpenMetaverse.Assets.AssetTexture.AssetType"> 21127 <member name="F:OpenMetaverse.PhysicsPropertiesEventArgs.Simulator">
22249 <summary>Override the base classes AssetType</summary> 21128 <summary>Simulator where the message originated</summary>
22250 </member> 21129 </member>
22251 <member name="M:OpenMetaverse.Assets.AssetTexture.Encode"> 21130 <member name="F:OpenMetaverse.PhysicsPropertiesEventArgs.PhysicsProperties">
22252 <summary> 21131 <summary>Updated physical properties</summary>
22253 Populates the <seealso cref="F:OpenMetaverse.Assets.AssetTexture.AssetData" /> byte array with a JPEG2000
22254 encoded image created from the data in <seealso cref="F:OpenMetaverse.Assets.AssetTexture.Image" /></summary>
22255 </member> 21132 </member>
22256 <member name="M:OpenMetaverse.Assets.AssetTexture.Decode"> 21133 <member name="M:OpenMetaverse.PhysicsPropertiesEventArgs.#ctor(OpenMetaverse.Simulator,OpenMetaverse.Primitive.PhysicsProperties)">
22257 <summary> 21134 <summary>
22258 Decodes the JPEG2000 data in <code>AssetData</code> to the 21135 Constructor
22259 <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object <seealso cref="F:OpenMetaverse.Assets.AssetTexture.Image" /></summary> 21136 </summary>
22260 <returns>True if the decoding was successful, otherwise false</returns> 21137 <param name="sim">Simulator where the message originated</param>
21138 <param name="props">Updated physical properties</param>
22261 </member> 21139 </member>
22262 <member name="M:OpenMetaverse.Assets.AssetTexture.DecodeLayerBoundaries"> 21140 <member name="T:OpenMetaverse.InventoryException">
22263 <summary> 21141 <summary>
22264 Decodes the begin and end byte positions for each quality layer in 21142 Exception class to identify inventory exceptions
22265 the image
22266 </summary> 21143 </summary>
22267 <returns>
22268 </returns>
22269 </member> 21144 </member>
22270 <member name="T:OpenMetaverse.Assets.AssetWearable"> 21145 <member name="T:OpenMetaverse.Inventory">
22271 <summary> 21146 <summary>
22272 Represents a Wearable Asset, Clothing, Hair, Skin, Etc 21147 Responsible for maintaining inventory structure. Inventory constructs nodes
21148 and manages node children as is necessary to maintain a coherant hirarchy.
21149 Other classes should not manipulate or create InventoryNodes explicitly. When
21150 A node's parent changes (when a folder is moved, for example) simply pass
21151 Inventory the updated InventoryFolder and it will make the appropriate changes
21152 to its internal representation.
22273 </summary> 21153 </summary>
22274 </member> 21154 </member>
22275 <member name="M:OpenMetaverse.Assets.AssetWearable.#ctor"> 21155 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectUpdated">
22276 <summary>Initializes a new instance of an AssetWearable object</summary> 21156 <summary>The event subscribers, null of no subscribers</summary>
22277 </member>
22278 <member name="M:OpenMetaverse.Assets.AssetWearable.#ctor(OpenMetaverse.UUID,System.Byte[])">
22279 <summary>Initializes a new instance of an AssetWearable object with parameters</summary>
22280 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID" /> specific to this asset</param>
22281 <param name="assetData">A byte array containing the raw asset data</param>
22282 </member>
22283 <member name="F:OpenMetaverse.Assets.AssetWearable.Name">
22284 <summary>A string containing the name of the asset</summary>
22285 </member>
22286 <member name="F:OpenMetaverse.Assets.AssetWearable.Description">
22287 <summary>A string containing a short description of the asset</summary>
22288 </member>
22289 <member name="F:OpenMetaverse.Assets.AssetWearable.WearableType">
22290 <summary>The Assets WearableType</summary>
22291 </member>
22292 <member name="F:OpenMetaverse.Assets.AssetWearable.ForSale">
22293 <summary>The For-Sale status of the object</summary>
22294 </member>
22295 <member name="F:OpenMetaverse.Assets.AssetWearable.SalePrice">
22296 <summary>An Integer representing the purchase price of the asset</summary>
22297 </member> 21157 </member>
22298 <member name="F:OpenMetaverse.Assets.AssetWearable.Creator"> 21158 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectUpdated(OpenMetaverse.InventoryObjectUpdatedEventArgs)">
22299 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the assets creator</summary> 21159 <summary>Raises the InventoryObjectUpdated Event</summary>
21160 <param name="e">A InventoryObjectUpdatedEventArgs object containing
21161 the data sent from the simulator</param>
22300 </member> 21162 </member>
22301 <member name="F:OpenMetaverse.Assets.AssetWearable.Owner"> 21163 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectUpdatedLock">
22302 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the assets current owner</summary> 21164 <summary>Thread sync lock object</summary>
22303 </member> 21165 </member>
22304 <member name="F:OpenMetaverse.Assets.AssetWearable.LastOwner"> 21166 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectRemoved">
22305 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the assets prior owner</summary> 21167 <summary>The event subscribers, null of no subscribers</summary>
22306 </member> 21168 </member>
22307 <member name="F:OpenMetaverse.Assets.AssetWearable.Group"> 21169 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectRemoved(OpenMetaverse.InventoryObjectRemovedEventArgs)">
22308 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the Group this asset is set to</summary> 21170 <summary>Raises the InventoryObjectRemoved Event</summary>
21171 <param name="e">A InventoryObjectRemovedEventArgs object containing
21172 the data sent from the simulator</param>
22309 </member> 21173 </member>
22310 <member name="F:OpenMetaverse.Assets.AssetWearable.GroupOwned"> 21174 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectRemovedLock">
22311 <summary>True if the asset is owned by a <seealso cref="T:OpenMetaverse.Group" /></summary> 21175 <summary>Thread sync lock object</summary>
22312 </member> 21176 </member>
22313 <member name="F:OpenMetaverse.Assets.AssetWearable.Permissions"> 21177 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectAdded">
22314 <summary>The Permissions mask of the asset</summary> 21178 <summary>The event subscribers, null of no subscribers</summary>
22315 </member> 21179 </member>
22316 <member name="F:OpenMetaverse.Assets.AssetWearable.Params"> 21180 <member name="M:OpenMetaverse.Inventory.OnInventoryObjectAdded(OpenMetaverse.InventoryObjectAddedEventArgs)">
22317 <summary>A Dictionary containing Key/Value pairs of the objects parameters</summary> 21181 <summary>Raises the InventoryObjectAdded Event</summary>
21182 <param name="e">A InventoryObjectAddedEventArgs object containing
21183 the data sent from the simulator</param>
22318 </member> 21184 </member>
22319 <member name="F:OpenMetaverse.Assets.AssetWearable.Textures"> 21185 <member name="F:OpenMetaverse.Inventory.m_InventoryObjectAddedLock">
22320 <summary>A Dictionary containing Key/Value pairs where the Key is the textures Index and the Value is the Textures <seealso cref="T:OpenMetaverse.UUID" /></summary> 21186 <summary>Thread sync lock object</summary>
22321 </member> 21187 </member>
22322 <member name="M:OpenMetaverse.Assets.AssetWearable.Decode"> 21188 <member name="M:OpenMetaverse.Inventory.GetContents(OpenMetaverse.UUID)">
22323 <summary> 21189 <summary>
22324 Decode an assets byte encoded data to a string 21190 Returns the contents of the specified folder
22325 </summary> 21191 </summary>
22326 <returns>true if the asset data was decoded successfully</returns> 21192 <param name="folder">A folder's UUID</param>
21193 <returns>The contents of the folder corresponding to <code>folder</code></returns>
21194 <exception cref="T:OpenMetaverse.InventoryException">When <code>folder</code> does not exist in the inventory</exception>
22327 </member> 21195 </member>
22328 <member name="M:OpenMetaverse.Assets.AssetWearable.Encode"> 21196 <member name="M:OpenMetaverse.Inventory.UpdateNodeFor(OpenMetaverse.InventoryBase)">
22329 <summary> 21197 <summary>
22330 Encode the assets string represantion into a format consumable by the asset server 21198 Updates the state of the InventoryNode and inventory data structure that
21199 is responsible for the InventoryObject. If the item was previously not added to inventory,
21200 it adds the item, and updates structure accordingly. If it was, it updates the
21201 InventoryNode, changing the parent node if <code>item.parentUUID</code> does
21202 not match <code>node.Parent.Data.UUID</code>.
21203
21204 You can not set the inventory root folder using this method
22331 </summary> 21205 </summary>
21206 <param name="item">The InventoryObject to store</param>
22332 </member> 21207 </member>
22333 <member name="F:OpenMetaverse.Http.EventQueueClient.REQUEST_TIMEOUT"> 21208 <member name="M:OpenMetaverse.Inventory.RemoveNodeFor(OpenMetaverse.InventoryBase)">
22334 <summary>=</summary>
22335 </member>
22336 <member name="F:OpenMetaverse.Http.EventQueueClient._errorCount">
22337 <summary>Number of times we've received an unknown CAPS exception in series.</summary>
22338 </member>
22339 <member name="F:OpenMetaverse.Http.EventQueueClient._random">
22340 <summary>For exponential backoff on error.</summary>
22341 </member>
22342 <member name="T:OpenMetaverse.Imaging.Baker">
22343 <summary> 21209 <summary>
22344 A set of textures that are layered on texture of each other and "baked" 21210 Removes the InventoryObject and all related node data from Inventory.
22345 in to a single texture, for avatar appearances
22346 </summary> 21211 </summary>
21212 <param name="item">The InventoryObject to remove.</param>
22347 </member> 21213 </member>
22348 <member name="M:OpenMetaverse.Imaging.Baker.#ctor(OpenMetaverse.BakeType)"> 21214 <member name="M:OpenMetaverse.Inventory.Contains(OpenMetaverse.UUID)">
22349 <summary> 21215 <summary>
22350 Default constructor 21216 Used to find out if Inventory contains the InventoryObject
21217 specified by <code>uuid</code>.
22351 </summary> 21218 </summary>
22352 <param name="bakeType">Bake type</param> 21219 <param name="uuid">The UUID to check.</param>
22353 </member> 21220 <returns>true if inventory contains uuid, false otherwise</returns>
22354 <member name="F:OpenMetaverse.Imaging.Baker.bakedTexture">
22355 <summary>Final baked texture</summary>
22356 </member>
22357 <member name="F:OpenMetaverse.Imaging.Baker.textures">
22358 <summary>Component layers</summary>
22359 </member>
22360 <member name="F:OpenMetaverse.Imaging.Baker.bakeWidth">
22361 <summary>Width of the final baked image and scratchpad</summary>
22362 </member>
22363 <member name="F:OpenMetaverse.Imaging.Baker.bakeHeight">
22364 <summary>Height of the final baked image and scratchpad</summary>
22365 </member>
22366 <member name="F:OpenMetaverse.Imaging.Baker.bakeType">
22367 <summary>Bake type</summary>
22368 </member>
22369 <member name="P:OpenMetaverse.Imaging.Baker.BakedTexture">
22370 <summary>Final baked texture</summary>
22371 </member> 21221 </member>
22372 <member name="P:OpenMetaverse.Imaging.Baker.Textures"> 21222 <member name="M:OpenMetaverse.Inventory.SaveToDisk(System.String)">
22373 <summary>Component layers</summary> 21223 <summary>
21224 Saves the current inventory structure to a cache file
21225 </summary>
21226 <param name="filename">Name of the cache file to save to</param>
22374 </member> 21227 </member>
22375 <member name="P:OpenMetaverse.Imaging.Baker.BakeWidth"> 21228 <member name="M:OpenMetaverse.Inventory.RestoreFromDisk(System.String)">
22376 <summary>Width of the final baked image and scratchpad</summary> 21229 <summary>
21230 Loads in inventory cache file into the inventory structure. Note only valid to call after login has been successful.
21231 </summary>
21232 <param name="filename">Name of the cache file to load</param>
21233 <returns>The number of inventory items sucessfully reconstructed into the inventory node tree</returns>
22377 </member> 21234 </member>
22378 <member name="P:OpenMetaverse.Imaging.Baker.BakeHeight"> 21235 <member name="E:OpenMetaverse.Inventory.InventoryObjectUpdated">
22379 <summary>Height of the final baked image and scratchpad</summary> 21236 <summary>Raised when the simulator sends us data containing
21237 ...</summary>
22380 </member> 21238 </member>
22381 <member name="P:OpenMetaverse.Imaging.Baker.BakeType"> 21239 <member name="E:OpenMetaverse.Inventory.InventoryObjectRemoved">
22382 <summary>Bake type</summary> 21240 <summary>Raised when the simulator sends us data containing
21241 ...</summary>
22383 </member> 21242 </member>
22384 <member name="P:OpenMetaverse.Imaging.Baker.IsSkin"> 21243 <member name="E:OpenMetaverse.Inventory.InventoryObjectAdded">
22385 <summary>Is this one of the 3 skin bakes</summary> 21244 <summary>Raised when the simulator sends us data containing
21245 ...</summary>
22386 </member> 21246 </member>
22387 <member name="M:OpenMetaverse.Imaging.Baker.AddTexture(OpenMetaverse.AppearanceManager.TextureData)"> 21247 <member name="P:OpenMetaverse.Inventory.RootFolder">
22388 <summary> 21248 <summary>
22389 Adds layer for baking 21249 The root folder of this avatars inventory
22390 </summary> 21250 </summary>
22391 <param name="tdata">TexturaData struct that contains texture and its params</param>
22392 </member> 21251 </member>
22393 <member name="M:OpenMetaverse.Imaging.Baker.BakeTypeFor(OpenMetaverse.AvatarTextureIndex)"> 21252 <member name="P:OpenMetaverse.Inventory.LibraryFolder">
22394 <summary> 21253 <summary>
22395 Converts avatar texture index (face) to Bake type 21254 The default shared library folder
22396 </summary> 21255 </summary>
22397 <param name="index">Face number (AvatarTextureIndex)</param>
22398 <returns>BakeType, layer to which this texture belongs to</returns>
22399 </member> 21256 </member>
22400 <member name="M:OpenMetaverse.Imaging.Baker.SanitizeLayers(OpenMetaverse.Imaging.ManagedImage,OpenMetaverse.Imaging.ManagedImage)"> 21257 <member name="P:OpenMetaverse.Inventory.RootNode">
22401 <summary> 21258 <summary>
22402 Make sure images exist, resize source if needed to match the destination 21259 The root node of the avatars inventory
22403 </summary> 21260 </summary>
22404 <param name="dest">Destination image</param>
22405 <param name="src">Source image</param>
22406 <returns>Sanitization was succefull</returns>
22407 </member> 21261 </member>
22408 <member name="M:OpenMetaverse.Imaging.Baker.InitBakedLayerColor(OpenMetaverse.Color4)"> 21262 <member name="P:OpenMetaverse.Inventory.LibraryRootNode">
22409 <summary> 21263 <summary>
22410 Fills a baked layer as a solid *appearing* color. The colors are 21264 The root node of the default shared library
22411 subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from
22412 compressing it too far since it seems to cause upload failures if
22413 the image is a pure solid color
22414 </summary> 21265 </summary>
22415 <param name="color">Color of the base of this layer</param>
22416 </member> 21266 </member>
22417 <member name="M:OpenMetaverse.Imaging.Baker.InitBakedLayerColor(System.Single,System.Single,System.Single)"> 21267 <member name="P:OpenMetaverse.Inventory.Item(OpenMetaverse.UUID)">
22418 <summary> 21268 <summary>
22419 Fills a baked layer as a solid *appearing* color. The colors are 21269 By using the bracket operator on this class, the program can get the
22420 subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from 21270 InventoryObject designated by the specified uuid. If the value for the corresponding
22421 compressing it too far since it seems to cause upload failures if 21271 UUID is null, the call is equivelant to a call to <code>RemoveNodeFor(this[uuid])</code>.
22422 the image is a pure solid color 21272 If the value is non-null, it is equivelant to a call to <code>UpdateNodeFor(value)</code>,
21273 the uuid parameter is ignored.
22423 </summary> 21274 </summary>
22424 <param name="r">Red value</param> 21275 <param name="uuid">The UUID of the InventoryObject to get or set, ignored if set to non-null value.</param>
22425 <param name="g">Green value</param> 21276 <returns>The InventoryObject corresponding to <code>uuid</code>.</returns>
22426 <param name="b">Blue value</param>
22427 </member> 21277 </member>
22428 <member name="M:OpenMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,OpenMetaverse.Imaging.ManagedImage.ImageChannels)"> 21278 <member name="T:OpenMetaverse.InternalDictionary`2">
22429 <summary> 21279 <summary>
22430 Create a new blank image 21280 The InternalDictionary class is used through the library for storing key/value pairs.
21281 It is intended to be a replacement for the generic Dictionary class and should
21282 be used in its place. It contains several methods for allowing access to the data from
21283 outside the library that are read only and thread safe.
21284
22431 </summary> 21285 </summary>
22432 <param name="width">width</param> 21286 <typeparam name="TKey">Key <see langword="Tkey"/></typeparam>
22433 <param name="height">height</param> 21287 <typeparam name="TValue">Value <see langword="TValue"/></typeparam>
22434 <param name="channels">channel flags</param>
22435 </member> 21288 </member>
22436 <member name="M:OpenMetaverse.Imaging.ManagedImage.#ctor(System.Drawing.Bitmap)"> 21289 <member name="F:OpenMetaverse.InternalDictionary`2.Dictionary">
21290 <summary>Internal dictionary that this class wraps around. Do not
21291 modify or enumerate the contents of this dictionary without locking
21292 on this member</summary>
21293 </member>
21294 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor">
22437 <summary> 21295 <summary>
21296 Initializes a new instance of the <seealso cref="T:InternalDictionary"/> Class
21297 with the specified key/value, has the default initial capacity.
22438 </summary> 21298 </summary>
22439 <param name="bitmap"> 21299 <example>
22440 </param> 21300 <code>
21301 // initialize a new InternalDictionary named testDict with a string as the key and an int as the value.
21302 public InternalDictionary&lt;string, int&gt; testDict = new InternalDictionary&lt;string, int&gt;();
21303 </code>
21304 </example>
22441 </member> 21305 </member>
22442 <member name="F:OpenMetaverse.Imaging.ManagedImage.Width"> 21306 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor(System.Collections.Generic.IDictionary{`0,`1})">
22443 <summary> 21307 <summary>
22444 Image width 21308 Initializes a new instance of the <seealso cref="T:InternalDictionary"/> Class
21309 with the specified key/value, has its initial valies copied from the specified
21310 <seealso cref="T:System.Collections.Generic.Dictionary"/>
22445 </summary> 21311 </summary>
21312 <param name="dictionary"><seealso cref="T:System.Collections.Generic.Dictionary"/>
21313 to copy initial values from</param>
21314 <example>
21315 <code>
21316 // initialize a new InternalDictionary named testAvName with a UUID as the key and an string as the value.
21317 // populates with copied values from example KeyNameCache Dictionary.
21318
21319 // create source dictionary
21320 Dictionary&lt;UUID, string&gt; KeyNameCache = new Dictionary&lt;UUID, string&gt;();
21321 KeyNameCache.Add("8300f94a-7970-7810-cf2c-fc9aa6cdda24", "Jack Avatar");
21322 KeyNameCache.Add("27ba1e40-13f7-0708-3e98-5819d780bd62", "Jill Avatar");
21323
21324 // Initialize new dictionary.
21325 public InternalDictionary&lt;UUID, string&gt; testAvName = new InternalDictionary&lt;UUID, string&gt;(KeyNameCache);
21326 </code>
21327 </example>
22446 </member> 21328 </member>
22447 <member name="F:OpenMetaverse.Imaging.ManagedImage.Height"> 21329 <member name="M:OpenMetaverse.InternalDictionary`2.#ctor(System.Int32)">
22448 <summary> 21330 <summary>
22449 Image height 21331 Initializes a new instance of the <seealso cref="T:OpenMetaverse.InternalDictionary"/> Class
21332 with the specified key/value, With its initial capacity specified.
22450 </summary> 21333 </summary>
21334 <param name="capacity">Initial size of dictionary</param>
21335 <example>
21336 <code>
21337 // initialize a new InternalDictionary named testDict with a string as the key and an int as the value,
21338 // initially allocated room for 10 entries.
21339 public InternalDictionary&lt;string, int&gt; testDict = new InternalDictionary&lt;string, int&gt;(10);
21340 </code>
21341 </example>
22451 </member> 21342 </member>
22452 <member name="F:OpenMetaverse.Imaging.ManagedImage.Channels"> 21343 <member name="M:OpenMetaverse.InternalDictionary`2.TryGetValue(`0,`1@)">
22453 <summary> 21344 <summary>
22454 Image channel flags 21345 Try to get entry from <seealso cref="T:OpenMetaverse.InternalDictionary"/> with specified key
22455 </summary> 21346 </summary>
21347 <param name="key">Key to use for lookup</param>
21348 <param name="value">Value returned</param>
21349 <returns><see langword="true"/> if specified key exists, <see langword="false"/> if not found</returns>
21350 <example>
21351 <code>
21352 // find your avatar using the Simulator.ObjectsAvatars InternalDictionary:
21353 Avatar av;
21354 if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av))
21355 Console.WriteLine("Found Avatar {0}", av.Name);
21356 </code>
21357 <seealso cref="F:OpenMetaverse.Simulator.ObjectsAvatars"/>
21358 </example>
22456 </member> 21359 </member>
22457 <member name="F:OpenMetaverse.Imaging.ManagedImage.Red"> 21360 <member name="M:OpenMetaverse.InternalDictionary`2.Find(System.Predicate{`1})">
22458 <summary> 21361 <summary>
22459 Red channel data 21362 Finds the specified match.
22460 </summary> 21363 </summary>
21364 <param name="match">The match.</param>
21365 <returns>Matched value</returns>
21366 <example>
21367 <code>
21368 // use a delegate to find a prim in the ObjectsPrimitives InternalDictionary
21369 // with the ID 95683496
21370 uint findID = 95683496;
21371 Primitive findPrim = sim.ObjectsPrimitives.Find(
21372 delegate(Primitive prim) { return prim.ID == findID; });
21373 </code>
21374 </example>
22461 </member> 21375 </member>
22462 <member name="F:OpenMetaverse.Imaging.ManagedImage.Green"> 21376 <member name="M:OpenMetaverse.InternalDictionary`2.FindAll(System.Predicate{`1})">
21377 <summary>Find All items in an <seealso cref="T:InternalDictionary"/></summary>
21378 <param name="match">return matching items.</param>
21379 <returns>a <seealso cref="T:System.Collections.Generic.List"/> containing found items.</returns>
21380 <example>
21381 Find All prims within 20 meters and store them in a List
21382 <code>
21383 int radius = 20;
21384 List&lt;Primitive&gt; prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll(
21385 delegate(Primitive prim) {
21386 Vector3 pos = prim.Position;
21387 return ((prim.ParentID == 0) &amp;&amp; (pos != Vector3.Zero) &amp;&amp; (Vector3.Distance(pos, location) &lt; radius));
21388 }
21389 );
21390 </code>
21391 </example>
21392 </member>
21393 <member name="M:OpenMetaverse.InternalDictionary`2.FindAll(System.Predicate{`0})">
21394 <summary>Find All items in an <seealso cref="T:InternalDictionary"/></summary>
21395 <param name="match">return matching keys.</param>
21396 <returns>a <seealso cref="T:System.Collections.Generic.List"/> containing found keys.</returns>
21397 <example>
21398 Find All keys which also exist in another dictionary
21399 <code>
21400 List&lt;UUID&gt; matches = myDict.FindAll(
21401 delegate(UUID id) {
21402 return myOtherDict.ContainsKey(id);
21403 }
21404 );
21405 </code>
21406 </example>
21407 </member>
21408 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{`1})">
21409 <summary>Perform an <seealso cref="T:System.Action"/> on each entry in an <seealso cref="T:OpenMetaverse.InternalDictionary"/></summary>
21410 <param name="action"><seealso cref="T:System.Action"/> to perform</param>
21411 <example>
21412 <code>
21413 // Iterates over the ObjectsPrimitives InternalDictionary and prints out some information.
21414 Client.Network.CurrentSim.ObjectsPrimitives.ForEach(
21415 delegate(Primitive prim)
21416 {
21417 if (prim.Text != null)
21418 {
21419 Console.WriteLine("NAME={0} ID = {1} TEXT = '{2}'",
21420 prim.PropertiesFamily.Name, prim.ID, prim.Text);
21421 }
21422 });
21423 </code>
21424 </example>
21425 </member>
21426 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{`0})">
21427 <summary>Perform an <seealso cref="T:System.Action"/> on each key of an <seealso cref="T:OpenMetaverse.InternalDictionary"/></summary>
21428 <param name="action"><seealso cref="T:System.Action"/> to perform</param>
21429 </member>
21430 <member name="M:OpenMetaverse.InternalDictionary`2.ForEach(System.Action{System.Collections.Generic.KeyValuePair{`0,`1}})">
22463 <summary> 21431 <summary>
22464 Green channel data 21432 Perform an <seealso cref="T:System.Action"/> on each KeyValuePair of an <seealso cref="T:OpenMetaverse.InternalDictionary"/>
22465 </summary> 21433 </summary>
21434 <param name="action"><seealso cref="T:System.Action"/> to perform</param>
22466 </member> 21435 </member>
22467 <member name="F:OpenMetaverse.Imaging.ManagedImage.Blue"> 21436 <member name="M:OpenMetaverse.InternalDictionary`2.ContainsKey(`0)">
21437 <summary>Check if Key exists in Dictionary</summary>
21438 <param name="key">Key to check for</param>
21439 <returns><see langword="true"/> if found, <see langword="false"/> otherwise</returns>
21440 </member>
21441 <member name="M:OpenMetaverse.InternalDictionary`2.ContainsValue(`1)">
21442 <summary>Check if Value exists in Dictionary</summary>
21443 <param name="value">Value to check for</param>
21444 <returns><see langword="true"/> if found, <see langword="false"/> otherwise</returns>
21445 </member>
21446 <member name="M:OpenMetaverse.InternalDictionary`2.Add(`0,`1)">
22468 <summary> 21447 <summary>
22469 Blue channel data 21448 Adds the specified key to the dictionary, dictionary locking is not performed,
21449 <see cref="!:SafeAdd"/>
22470 </summary> 21450 </summary>
21451 <param name="key">The key</param>
21452 <param name="value">The value</param>
22471 </member> 21453 </member>
22472 <member name="F:OpenMetaverse.Imaging.ManagedImage.Alpha"> 21454 <member name="M:OpenMetaverse.InternalDictionary`2.Remove(`0)">
22473 <summary> 21455 <summary>
22474 Alpha channel data 21456 Removes the specified key, dictionary locking is not performed
22475 </summary> 21457 </summary>
21458 <param name="key">The key.</param>
21459 <returns><see langword="true"/> if successful, <see langword="false"/> otherwise</returns>
22476 </member> 21460 </member>
22477 <member name="F:OpenMetaverse.Imaging.ManagedImage.Bump"> 21461 <member name="P:OpenMetaverse.InternalDictionary`2.Count">
22478 <summary> 21462 <summary>
22479 Bump channel data 21463 Gets the number of Key/Value pairs contained in the <seealso cref="T:InternalDictionary"/>
22480 </summary> 21464 </summary>
22481 </member> 21465 </member>
22482 <member name="M:OpenMetaverse.Imaging.ManagedImage.ConvertChannels(OpenMetaverse.Imaging.ManagedImage.ImageChannels)"> 21466 <member name="P:OpenMetaverse.InternalDictionary`2.Item(`0)">
22483 <summary> 21467 <summary>
22484 Convert the channels in the image. Channels are created or destroyed as required. 21468 Indexer for the dictionary
22485 </summary> 21469 </summary>
22486 <param name="channels">new channel flags</param> 21470 <param name="key">The key</param>
21471 <returns>The value</returns>
22487 </member> 21472 </member>
22488 <member name="M:OpenMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)"> 21473 <member name="T:OpenMetaverse.Assets.ArchiveConstants">
22489 <summary> 21474 <summary>
22490 Resize or stretch the image using nearest neighbor (ugly) resampling 21475 Constants for the archiving module
22491 </summary> 21476 </summary>
22492 <param name="width">new width</param>
22493 <param name="height">new height</param>
22494 </member> 21477 </member>
22495 <member name="M:OpenMetaverse.Imaging.ManagedImage.ExportRaw"> 21478 <member name="F:OpenMetaverse.Assets.ArchiveConstants.CONTROL_FILE_PATH">
22496 <summary> 21479 <summary>
22497 Create a byte array containing 32-bit RGBA data with a bottom-left 21480 The location of the archive control file
22498 origin, suitable for feeding directly into OpenGL
22499 </summary> 21481 </summary>
22500 <returns>A byte array containing raw texture data</returns>
22501 </member> 21482 </member>
22502 <member name="T:OpenMetaverse.Imaging.OpenJPEG"> 21483 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSETS_PATH">
22503 <summary> 21484 <summary>
22504 A Wrapper around openjpeg to encode and decode images to and from byte arrays 21485 Path for the assets held in an archive
22505 </summary> 21486 </summary>
22506 </member> 21487 </member>
22507 <member name="T:OpenMetaverse.Imaging.OpenJPEG.J2KLayerInfo"> 21488 <member name="F:OpenMetaverse.Assets.ArchiveConstants.OBJECTS_PATH">
22508 <summary> 21489 <summary>
22509 Defines the beginning and ending file positions of a layer in an 21490 Path for the prims file
22510 LRCP-progression JPEG2000 file
22511 </summary> 21491 </summary>
22512 </member> 21492 </member>
22513 <member name="T:OpenMetaverse.Imaging.OpenJPEG.MarshalledImage"> 21493 <member name="F:OpenMetaverse.Assets.ArchiveConstants.TERRAINS_PATH">
22514 <summary> 21494 <summary>
22515 This structure is used to marshal both encoded and decoded images. 21495 Path for terrains. Technically these may be assets, but I think it's quite nice to split them out.
22516 MUST MATCH THE STRUCT IN dotnet.h!
22517 </summary> 21496 </summary>
22518 </member> 21497 </member>
22519 <member name="T:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket"> 21498 <member name="F:OpenMetaverse.Assets.ArchiveConstants.SETTINGS_PATH">
22520 <summary> 21499 <summary>
22521 Information about a single packet in a JPEG2000 stream 21500 Path for region settings.
22522 </summary> 21501 </summary>
22523 </member> 21502 </member>
22524 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.start_pos"> 21503 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSET_EXTENSION_SEPARATOR">
22525 <summary>Packet start position</summary>
22526 </member>
22527 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.end_ph_pos">
22528 <summary>Packet header end position</summary>
22529 </member>
22530 <member name="F:OpenMetaverse.Imaging.OpenJPEG.MarshalledPacket.end_pos">
22531 <summary>Packet end position</summary>
22532 </member>
22533 <member name="F:OpenMetaverse.Imaging.OpenJPEG.TGA_HEADER_SIZE">
22534 <summary>TGA Header size</summary>
22535 </member>
22536 <member name="F:OpenMetaverse.Imaging.OpenJPEG.OpenJPEGLock">
22537 <summary>OpenJPEG is not threadsafe, so this object is used to lock
22538 during calls into unmanaged code</summary>
22539 </member>
22540 <member name="M:OpenMetaverse.Imaging.OpenJPEG.Encode(OpenMetaverse.Imaging.ManagedImage,System.Boolean)">
22541 <summary> 21504 <summary>
22542 Encode a <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object into a byte array 21505 The character the separates the uuid from extension information in an archived asset filename
22543 </summary> 21506 </summary>
22544 <param name="image">The <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object to encode</param>
22545 <param name="lossless">true to enable lossless conversion, only useful for small images ie: sculptmaps</param>
22546 <returns>A byte array containing the encoded Image object</returns>
22547 </member> 21507 </member>
22548 <member name="M:OpenMetaverse.Imaging.OpenJPEG.Encode(OpenMetaverse.Imaging.ManagedImage)"> 21508 <member name="F:OpenMetaverse.Assets.ArchiveConstants.ASSET_TYPE_TO_EXTENSION">
22549 <summary> 21509 <summary>
22550 Encode a <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object into a byte array 21510 Extensions used for asset types in the archive
22551 </summary> 21511 </summary>
22552 <param name="image">The <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /> object to encode</param>
22553 <returns>a byte array of the encoded image</returns>
22554 </member> 21512 </member>
22555 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(System.Byte[],OpenMetaverse.Imaging.ManagedImage@,System.Drawing.Image@)"> 21513 <member name="F:OpenMetaverse.TerrainPatch.X">
22556 <summary> 21514 <summary>X position of this patch</summary>
22557 Decode JPEG2000 data to an <seealso cref="T:System.Drawing.Image" /> and
22558 <seealso cref="T:OpenMetaverse.Imaging.ManagedImage" /></summary>
22559 <param name="encoded">JPEG2000 encoded data</param>
22560 <param name="managedImage">ManagedImage object to decode to</param>
22561 <param name="image">Image object to decode to</param>
22562 <returns>True if the decode succeeds, otherwise false</returns>
22563 </member> 21515 </member>
22564 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(System.Byte[],OpenMetaverse.Imaging.ManagedImage@)"> 21516 <member name="F:OpenMetaverse.TerrainPatch.Y">
22565 <summary> 21517 <summary>Y position of this patch</summary>
22566 </summary>
22567 <param name="encoded">
22568 </param>
22569 <param name="managedImage">
22570 </param>
22571 <returns>
22572 </returns>
22573 </member> 21518 </member>
22574 <member name="M:OpenMetaverse.Imaging.OpenJPEG.DecodeLayerBoundaries(System.Byte[],OpenMetaverse.Imaging.OpenJPEG.J2KLayerInfo[]@,System.Int32@)"> 21519 <member name="F:OpenMetaverse.TerrainPatch.Data">
22575 <summary> 21520 <summary>A 16x16 array of floats holding decompressed layer data</summary>
22576 </summary>
22577 <param name="encoded">
22578 </param>
22579 <param name="layerInfo">
22580 </param>
22581 <param name="components">
22582 </param>
22583 <returns>
22584 </returns>
22585 </member> 21521 </member>
22586 <member name="M:OpenMetaverse.Imaging.OpenJPEG.EncodeFromImage(System.Drawing.Bitmap,System.Boolean)"> 21522 <member name="M:OpenMetaverse.TerrainCompressor.CreateLandPacket(System.Single[],System.Int32[])">
22587 <summary> 21523 <summary>
22588 Encode a <seealso cref="T:System.Drawing.Bitmap" /> object into a byte array 21524 Creates a LayerData packet for compressed land data given a full
21525 simulator heightmap and an array of indices of patches to compress
22589 </summary> 21526 </summary>
22590 <param name="bitmap">The source <seealso cref="T:System.Drawing.Bitmap" /> object to encode</param> 21527 <param name="heightmap">A 256 * 256 array of floating point values
22591 <param name="lossless">true to enable lossless decoding</param> 21528 specifying the height at each meter in the simulator</param>
22592 <returns>A byte array containing the source Bitmap object</returns> 21529 <param name="patches">Array of indexes in the 16x16 grid of patches
21530 for this simulator. For example if 1 and 17 are specified, patches
21531 x=1,y=0 and x=1,y=1 are sent</param>
21532 <returns></returns>
22593 </member> 21533 </member>
22594 <member name="T:OpenMetaverse.Imaging.LoadTGAClass"> 21534 <member name="M:OpenMetaverse.TerrainCompressor.CreatePatchFromHeightmap(OpenMetaverse.BitPack,System.Single[],System.Int32,System.Int32)">
22595 <summary> 21535 <summary>
22596 Capability to load TGAs to Bitmap 21536 Add a patch of terrain to a BitPacker
22597 </summary> 21537 </summary>
21538 <param name="output">BitPacker to write the patch to</param>
21539 <param name="heightmap">Heightmap of the simulator, must be a 256 *
21540 256 float array</param>
21541 <param name="x">X offset of the patch to create, valid values are
21542 from 0 to 15</param>
21543 <param name="y">Y offset of the patch to create, valid values are
21544 from 0 to 15</param>
22598 </member> 21545 </member>
22599 <member name="T:OpenMetaverse.Interfaces.IMessage"> 21546 <member name="T:OpenMetaverse.Sounds">
22600 <summary> 21547 <summary>
22601 Interface requirements for Messaging system 21548 pre-defined built in sounds
22602 </summary> 21549 </summary>
22603 </member> 21550 </member>
22604 <member name="T:OpenMetaverse.Rendering.IRendering"> 21551 <member name="F:OpenMetaverse.Sounds.BELL_TING">
21552 <summary></summary>
21553 </member>
21554 <member name="F:OpenMetaverse.Sounds.CLICK">
21555 <summary></summary>
21556 </member>
21557 <member name="F:OpenMetaverse.Sounds.HEALTH_REDUCTION_FEMALE">
21558 <summary></summary>
21559 </member>
21560 <member name="F:OpenMetaverse.Sounds.HEALTH_REDUCTION_MALE">
21561 <summary></summary>
21562 </member>
21563 <member name="F:OpenMetaverse.Sounds.IM_START">
21564 <summary></summary>
21565 </member>
21566 <member name="F:OpenMetaverse.Sounds.INSTANT_MESSAGE_NOTIFICATION">
21567 <summary></summary>
21568 </member>
21569 <member name="F:OpenMetaverse.Sounds.INVALID_OPERATION">
21570 <summary></summary>
21571 </member>
21572 <member name="F:OpenMetaverse.Sounds.KEYBOARD_LOOP">
21573 <summary></summary>
21574 </member>
21575 <member name="F:OpenMetaverse.Sounds.MONEY_REDUCTION_COINS">
21576 <summary>coins</summary>
21577 </member>
21578 <member name="F:OpenMetaverse.Sounds.MONEY_INCREASE_CASH_REGISTER_BELL">
21579 <summary>cash register bell</summary>
21580 </member>
21581 <member name="F:OpenMetaverse.Sounds.NULL_KEYSTROKE">
21582 <summary></summary>
21583 </member>
21584 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION">
21585 <summary></summary>
21586 </member>
21587 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_RUBBER">
21588 <summary>rubber</summary>
21589 </member>
21590 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_PLASTIC">
21591 <summary>plastic</summary>
21592 </member>
21593 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_FLESH">
21594 <summary>flesh</summary>
21595 </member>
21596 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_WOOD_SPLINTERING">
21597 <summary>wood splintering?</summary>
21598 </member>
21599 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_GLASS_BREAK">
21600 <summary>glass break</summary>
21601 </member>
21602 <member name="F:OpenMetaverse.Sounds.OBJECT_COLLISION_METAL_CLUNK">
21603 <summary>metal clunk</summary>
21604 </member>
21605 <member name="F:OpenMetaverse.Sounds.OBJECT_CREATE_WHOOSH">
21606 <summary>whoosh</summary>
21607 </member>
21608 <member name="F:OpenMetaverse.Sounds.OBJECT_DELETE_SHAKE">
21609 <summary>shake</summary>
21610 </member>
21611 <member name="F:OpenMetaverse.Sounds.OBJECT_REZ">
21612 <summary></summary>
21613 </member>
21614 <member name="F:OpenMetaverse.Sounds.PIE_MENU_APPEAR_DING">
21615 <summary>ding</summary>
21616 </member>
21617 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT">
21618 <summary></summary>
21619 </member>
21620 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT1">
21621 <summary></summary>
21622 </member>
21623 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT2">
21624 <summary></summary>
21625 </member>
21626 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT3">
21627 <summary></summary>
21628 </member>
21629 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT4">
21630 <summary></summary>
21631 </member>
21632 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT5">
21633 <summary></summary>
21634 </member>
21635 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT6">
21636 <summary></summary>
21637 </member>
21638 <member name="F:OpenMetaverse.Sounds.PIE_MENU_SLICE_HIGHLIGHT7">
21639 <summary></summary>
21640 </member>
21641 <member name="F:OpenMetaverse.Sounds.SNAPSHOT">
21642 <summary></summary>
21643 </member>
21644 <member name="F:OpenMetaverse.Sounds.TELEPORT_TEXTURE_APPLY">
21645 <summary></summary>
21646 </member>
21647 <member name="F:OpenMetaverse.Sounds.THUNDER">
21648 <summary></summary>
21649 </member>
21650 <member name="F:OpenMetaverse.Sounds.WINDOW_CLOSE">
21651 <summary></summary>
21652 </member>
21653 <member name="F:OpenMetaverse.Sounds.WINDOW_OPEN">
21654 <summary></summary>
21655 </member>
21656 <member name="F:OpenMetaverse.Sounds.ZIPPER">
21657 <summary></summary>
21658 </member>
21659 <member name="M:OpenMetaverse.Sounds.ToDictionary">
22605 <summary> 21660 <summary>
22606 Abstract base for rendering plugins 21661 A dictionary containing all pre-defined sounds
22607 </summary> 21662 </summary>
21663 <returns>A dictionary containing the pre-defined sounds,
21664 where the key is the sounds ID, and the value is a string
21665 containing a name to identify the purpose of the sound</returns>
22608 </member> 21666 </member>
22609 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateSimpleMesh(OpenMetaverse.Primitive,OpenMetaverse.Rendering.DetailLevel)"> 21667 <member name="T:OpenMetaverse.PermissionMask">
22610 <summary> 21668 <summary>
22611 Generates a basic mesh structure from a primitive 21669
22612 </summary> 21670 </summary>
22613 <param name="prim">Primitive to generate the mesh from</param>
22614 <param name="lod">Level of detail to generate the mesh at</param>
22615 <returns>The generated mesh</returns>
22616 </member> 21671 </member>
22617 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateSimpleSculptMesh(OpenMetaverse.Primitive,System.Drawing.Bitmap,OpenMetaverse.Rendering.DetailLevel)"> 21672 <member name="T:OpenMetaverse.PermissionWho">
22618 <summary> 21673 <summary>
22619 Generates a basic mesh structure from a sculpted primitive and 21674
22620 texture
22621 </summary> 21675 </summary>
22622 <param name="prim">Sculpted primitive to generate the mesh from</param>
22623 <param name="sculptTexture">Sculpt texture</param>
22624 <param name="lod">Level of detail to generate the mesh at</param>
22625 <returns>The generated mesh</returns>
22626 </member> 21676 </member>
22627 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateFacetedMesh(OpenMetaverse.Primitive,OpenMetaverse.Rendering.DetailLevel)"> 21677 <member name="F:OpenMetaverse.PermissionWho.Base">
21678 <summary></summary>
21679 </member>
21680 <member name="F:OpenMetaverse.PermissionWho.Owner">
21681 <summary></summary>
21682 </member>
21683 <member name="F:OpenMetaverse.PermissionWho.Group">
21684 <summary></summary>
21685 </member>
21686 <member name="F:OpenMetaverse.PermissionWho.Everyone">
21687 <summary></summary>
21688 </member>
21689 <member name="F:OpenMetaverse.PermissionWho.NextOwner">
21690 <summary></summary>
21691 </member>
21692 <member name="F:OpenMetaverse.PermissionWho.All">
21693 <summary></summary>
21694 </member>
21695 <member name="T:OpenMetaverse.Permissions">
22628 <summary> 21696 <summary>
22629 Generates a series of faces, each face containing a mesh and 21697
22630 metadata
22631 </summary> 21698 </summary>
22632 <param name="prim">Primitive to generate the mesh from</param>
22633 <param name="lod">Level of detail to generate the mesh at</param>
22634 <returns>The generated mesh</returns>
22635 </member> 21699 </member>
22636 <member name="M:OpenMetaverse.Rendering.IRendering.GenerateFacetedSculptMesh(OpenMetaverse.Primitive,System.Drawing.Bitmap,OpenMetaverse.Rendering.DetailLevel)"> 21700 <member name="M:OpenMetaverse.WrappedObject`1.Dispose">
22637 <summary> 21701 <summary>
22638 Generates a series of faces for a sculpted prim, each face 21702 Checks the instance back into the object pool
22639 containing a mesh and metadata
22640 </summary> 21703 </summary>
22641 <param name="prim">Sculpted primitive to generate the mesh from</param>
22642 <param name="sculptTexture">Sculpt texture</param>
22643 <param name="lod">Level of detail to generate the mesh at</param>
22644 <returns>The generated mesh</returns>
22645 </member> 21704 </member>
22646 <member name="M:OpenMetaverse.Rendering.IRendering.TransformTexCoords(System.Collections.Generic.List{OpenMetaverse.Rendering.Vertex},OpenMetaverse.Vector3,OpenMetaverse.Primitive.TextureEntryFace,OpenMetaverse.Vector3)"> 21705 <member name="P:OpenMetaverse.WrappedObject`1.Instance">
22647 <summary> 21706 <summary>
22648 Apply texture coordinate modifications from a 21707 Returns an instance of the class that has been checked out of the Object Pool.
22649 <seealso cref="!:TextureEntryFace" /> to a list of vertices
22650 </summary> 21708 </summary>
22651 <param name="vertices">Vertex list to modify texture coordinates for</param>
22652 <param name="center">Center-point of the face</param>
22653 <param name="teFace">Face texture parameters</param>
22654 <param name="primScale">Scale of the prim</param>
22655 </member> 21709 </member>
22656 <member name="T:OpenMetaverse.Messages.Linden.TeleportFinishMessage"> 21710 <member name="T:OpenMetaverse.Messages.Linden.TeleportFinishMessage">
22657 <summary> 21711 <summary>
@@ -22659,11 +21713,10 @@
22659 </summary> 21713 </summary>
22660 </member> 21714 </member>
22661 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.AgentID"> 21715 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.AgentID">
22662 <summary>The <see cref="T:OpenMetaverse.UUID" /> of the agent</summary> 21716 <summary>The <see cref="T:OpenMetaverse.UUID"/> of the agent</summary>
22663 </member> 21717 </member>
22664 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.LocationID"> 21718 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.LocationID">
22665 <summary> 21719 <summary></summary>
22666 </summary>
22667 </member> 21720 </member>
22668 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.RegionHandle"> 21721 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.RegionHandle">
22669 <summary>The simulators handle the agent teleported to</summary> 21722 <summary>The simulators handle the agent teleported to</summary>
@@ -22673,7 +21726,7 @@
22673 </member> 21726 </member>
22674 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.SimAccess"> 21727 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.SimAccess">
22675 <summary>Indicates the level of access required 21728 <summary>Indicates the level of access required
22676 to access the simulator, or the content rating, or the simulators 21729 to access the simulator, or the content rating, or the simulators
22677 map status</summary> 21730 map status</summary>
22678 </member> 21731 </member>
22679 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.IP"> 21732 <member name="F:OpenMetaverse.Messages.Linden.TeleportFinishMessage.IP">
@@ -22689,13 +21742,13 @@
22689 <summary> 21742 <summary>
22690 Serialize the object 21743 Serialize the object
22691 </summary> 21744 </summary>
22692 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21745 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22693 </member> 21746 </member>
22694 <member name="M:OpenMetaverse.Messages.Linden.TeleportFinishMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21747 <member name="M:OpenMetaverse.Messages.Linden.TeleportFinishMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22695 <summary> 21748 <summary>
22696 Deserialize the message 21749 Deserialize the message
22697 </summary> 21750 </summary>
22698 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21751 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22699 </member> 21752 </member>
22700 <member name="T:OpenMetaverse.Messages.Linden.EstablishAgentCommunicationMessage"> 21753 <member name="T:OpenMetaverse.Messages.Linden.EstablishAgentCommunicationMessage">
22701 <summary> 21754 <summary>
@@ -22706,37 +21759,37 @@
22706 <summary> 21759 <summary>
22707 Serialize the object 21760 Serialize the object
22708 </summary> 21761 </summary>
22709 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21762 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22710 </member> 21763 </member>
22711 <member name="M:OpenMetaverse.Messages.Linden.EstablishAgentCommunicationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21764 <member name="M:OpenMetaverse.Messages.Linden.EstablishAgentCommunicationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22712 <summary> 21765 <summary>
22713 Deserialize the message 21766 Deserialize the message
22714 </summary> 21767 </summary>
22715 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21768 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22716 </member> 21769 </member>
22717 <member name="M:OpenMetaverse.Messages.Linden.CrossedRegionMessage.Serialize"> 21770 <member name="M:OpenMetaverse.Messages.Linden.CrossedRegionMessage.Serialize">
22718 <summary> 21771 <summary>
22719 Serialize the object 21772 Serialize the object
22720 </summary> 21773 </summary>
22721 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21774 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22722 </member> 21775 </member>
22723 <member name="M:OpenMetaverse.Messages.Linden.CrossedRegionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21776 <member name="M:OpenMetaverse.Messages.Linden.CrossedRegionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22724 <summary> 21777 <summary>
22725 Deserialize the message 21778 Deserialize the message
22726 </summary> 21779 </summary>
22727 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21780 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22728 </member> 21781 </member>
22729 <member name="M:OpenMetaverse.Messages.Linden.EnableSimulatorMessage.Serialize"> 21782 <member name="M:OpenMetaverse.Messages.Linden.EnableSimulatorMessage.Serialize">
22730 <summary> 21783 <summary>
22731 Serialize the object 21784 Serialize the object
22732 </summary> 21785 </summary>
22733 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21786 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22734 </member> 21787 </member>
22735 <member name="M:OpenMetaverse.Messages.Linden.EnableSimulatorMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21788 <member name="M:OpenMetaverse.Messages.Linden.EnableSimulatorMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22736 <summary> 21789 <summary>
22737 Deserialize the message 21790 Deserialize the message
22738 </summary> 21791 </summary>
22739 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21792 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22740 </member> 21793 </member>
22741 <member name="T:OpenMetaverse.Messages.Linden.TeleportFailedMessage"> 21794 <member name="T:OpenMetaverse.Messages.Linden.TeleportFailedMessage">
22742 <summary> 21795 <summary>
@@ -22745,15 +21798,14 @@
22745 </summary> 21798 </summary>
22746 </member> 21799 </member>
22747 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.ExtraParams"> 21800 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.ExtraParams">
22748 <summary> 21801 <summary></summary>
22749 </summary>
22750 </member> 21802 </member>
22751 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.MessageKey"> 21803 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.MessageKey">
22752 <summary>A string key of the reason the teleport failed e.g. CouldntTPCloser 21804 <summary>A string key of the reason the teleport failed e.g. CouldntTPCloser
22753 Which could be used to look up a value in a dictionary or enum</summary> 21805 Which could be used to look up a value in a dictionary or enum</summary>
22754 </member> 21806 </member>
22755 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.AgentID"> 21807 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.AgentID">
22756 <summary>The <see cref="T:OpenMetaverse.UUID" /> of the Agent</summary> 21808 <summary>The <see cref="T:OpenMetaverse.UUID"/> of the Agent</summary>
22757 </member> 21809 </member>
22758 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.Reason"> 21810 <member name="F:OpenMetaverse.Messages.Linden.TeleportFailedMessage.Reason">
22759 <summary>A string human readable message containing the reason </summary> 21811 <summary>A string human readable message containing the reason </summary>
@@ -22763,25 +21815,25 @@
22763 <summary> 21815 <summary>
22764 Serialize the object 21816 Serialize the object
22765 </summary> 21817 </summary>
22766 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21818 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22767 </member> 21819 </member>
22768 <member name="M:OpenMetaverse.Messages.Linden.TeleportFailedMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21820 <member name="M:OpenMetaverse.Messages.Linden.TeleportFailedMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22769 <summary> 21821 <summary>
22770 Deserialize the message 21822 Deserialize the message
22771 </summary> 21823 </summary>
22772 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21824 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22773 </member> 21825 </member>
22774 <member name="M:OpenMetaverse.Messages.Linden.LandStatReplyMessage.Serialize"> 21826 <member name="M:OpenMetaverse.Messages.Linden.LandStatReplyMessage.Serialize">
22775 <summary> 21827 <summary>
22776 Serialize the object 21828 Serialize the object
22777 </summary> 21829 </summary>
22778 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 21830 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22779 </member> 21831 </member>
22780 <member name="M:OpenMetaverse.Messages.Linden.LandStatReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 21832 <member name="M:OpenMetaverse.Messages.Linden.LandStatReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22781 <summary> 21833 <summary>
22782 Deserialize the message 21834 Deserialize the message
22783 </summary> 21835 </summary>
22784 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 21836 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22785 </member> 21837 </member>
22786 <member name="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage"> 21838 <member name="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage">
22787 <summary> 21839 <summary>
@@ -22794,43 +21846,43 @@
22794 the DataBlocksExtended map will not be sent from the simulator 21846 the DataBlocksExtended map will not be sent from the simulator
22795 </remarks> 21847 </remarks>
22796 </member> 21848 </member>
21849 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwnersBlock">
21850 <summary>An Array of <see cref="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner"/> objects</summary>
21851 </member>
21852 <member name="M:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.Serialize">
21853 <summary>
21854 Serialize the object
21855 </summary>
21856 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
21857 </member>
21858 <member name="M:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
21859 <summary>
21860 Deserialize the message
21861 </summary>
21862 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
21863 </member>
22797 <member name="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner"> 21864 <member name="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner">
22798 <summary> 21865 <summary>
22799 Prim ownership information for a specified owner on a single parcel 21866 Prim ownership information for a specified owner on a single parcel
22800 </summary> 21867 </summary>
22801 </member> 21868 </member>
22802 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.OwnerID"> 21869 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.OwnerID">
22803 <summary>The <see cref="T:OpenMetaverse.UUID" /> of the prim owner, 21870 <summary>The <see cref="T:OpenMetaverse.UUID"/> of the prim owner,
22804 UUID.Zero if agent has no permission to view prim owner information</summary> 21871 UUID.Zero if agent has no permission to view prim owner information</summary>
22805 </member> 21872 </member>
22806 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.Count"> 21873 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.Count">
22807 <summary>The total number of prims</summary> 21874 <summary>The total number of prims</summary>
22808 </member> 21875 </member>
22809 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.IsGroupOwned"> 21876 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.IsGroupOwned">
22810 <summary>True if the OwnerID is a <see cref="T:OpenMetaverse.Group" /></summary> 21877 <summary>True if the OwnerID is a <see cref="T:OpenMetaverse.Group"/></summary>
22811 </member> 21878 </member>
22812 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.OnlineStatus"> 21879 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.OnlineStatus">
22813 <summary>True if the owner is online 21880 <summary>True if the owner is online
22814 <remarks>This is no longer used by the LL Simulators</remarks></summary> 21881 <remarks>This is no longer used by the LL Simulators</remarks></summary>
22815 </member> 21882 </member>
22816 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.TimeStamp"> 21883 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner.TimeStamp">
22817 <summary>The date the most recent prim was rezzed</summary> 21884 <summary>The date the most recent prim was rezzed</summary>
22818 </member> 21885 </member>
22819 <member name="F:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwnersBlock">
22820 <summary>An Array of <see cref="T:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner" /> objects</summary>
22821 </member>
22822 <member name="M:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.Serialize">
22823 <summary>
22824 Serialize the object
22825 </summary>
22826 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns>
22827 </member>
22828 <member name="M:OpenMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22829 <summary>
22830 Deserialize the message
22831 </summary>
22832 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param>
22833 </member>
22834 <member name="T:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage"> 21886 <member name="T:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage">
22835 <summary> 21887 <summary>
22836 The details of a single parcel in a region, also contains some regionwide globals 21888 The details of a single parcel in a region, also contains some regionwide globals
@@ -22851,19 +21903,17 @@
22851 <summary>Total parcel land area</summary> 21903 <summary>Total parcel land area</summary>
22852 </member> 21904 </member>
22853 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.AuctionID"> 21905 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.AuctionID">
22854 <summary> 21906 <summary></summary>
22855 </summary>
22856 </member> 21907 </member>
22857 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.AuthBuyerID"> 21908 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.AuthBuyerID">
22858 <summary>Key of authorized buyer</summary> 21909 <summary>Key of authorized buyer</summary>
22859 </member> 21910 </member>
22860 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Bitmap"> 21911 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Bitmap">
22861 <summary>Bitmap describing land layout in 4x4m squares across the 21912 <summary>Bitmap describing land layout in 4x4m squares across the
22862 entire region</summary> 21913 entire region</summary>
22863 </member> 21914 </member>
22864 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Category"> 21915 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Category">
22865 <summary> 21916 <summary></summary>
22866 </summary>
22867 </member> 21917 </member>
22868 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ClaimDate"> 21918 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ClaimDate">
22869 <summary>Date land was claimed</summary> 21919 <summary>Date land was claimed</summary>
@@ -22875,29 +21925,26 @@
22875 <summary>Parcel Description</summary> 21925 <summary>Parcel Description</summary>
22876 </member> 21926 </member>
22877 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ParcelFlags"> 21927 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ParcelFlags">
22878 <summary> 21928 <summary></summary>
22879 </summary>
22880 </member> 21929 </member>
22881 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.GroupID"> 21930 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.GroupID">
22882 <summary> 21931 <summary></summary>
22883 </summary>
22884 </member> 21932 </member>
22885 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.GroupPrims"> 21933 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.GroupPrims">
22886 <summary>Total number of primitives owned by the parcel group on 21934 <summary>Total number of primitives owned by the parcel group on
22887 this parcel</summary> 21935 this parcel</summary>
22888 </member> 21936 </member>
22889 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.IsGroupOwned"> 21937 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.IsGroupOwned">
22890 <summary>Whether the land is deeded to a group or not</summary> 21938 <summary>Whether the land is deeded to a group or not</summary>
22891 </member> 21939 </member>
22892 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.LandingType"> 21940 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.LandingType">
22893 <summary> 21941 <summary></summary>
22894 </summary>
22895 </member> 21942 </member>
22896 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MaxPrims"> 21943 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MaxPrims">
22897 <summary>Maximum number of primitives this parcel supports</summary> 21944 <summary>Maximum number of primitives this parcel supports</summary>
22898 </member> 21945 </member>
22899 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaID"> 21946 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaID">
22900 <summary>The Asset UUID of the Texture which when applied to a 21947 <summary>The Asset UUID of the Texture which when applied to a
22901 primitive will display the media</summary> 21948 primitive will display the media</summary>
22902 </member> 21949 </member>
22903 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaURL"> 21950 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaURL">
@@ -22916,8 +21963,7 @@
22916 <summary>Autoreturn value in minutes for others' objects</summary> 21963 <summary>Autoreturn value in minutes for others' objects</summary>
22917 </member> 21964 </member>
22918 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OtherCount"> 21965 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OtherCount">
22919 <summary> 21966 <summary></summary>
22920 </summary>
22921 </member> 21967 </member>
22922 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OtherPrims"> 21968 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OtherPrims">
22923 <summary>Total number of other primitives on this parcel</summary> 21969 <summary>Total number of other primitives on this parcel</summary>
@@ -22926,12 +21972,11 @@
22926 <summary>UUID of the owner of this parcel</summary> 21972 <summary>UUID of the owner of this parcel</summary>
22927 </member> 21973 </member>
22928 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OwnerPrims"> 21974 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.OwnerPrims">
22929 <summary>Total number of primitives owned by the parcel owner on 21975 <summary>Total number of primitives owned by the parcel owner on
22930 this parcel</summary> 21976 this parcel</summary>
22931 </member> 21977 </member>
22932 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ParcelPrimBonus"> 21978 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.ParcelPrimBonus">
22933 <summary> 21979 <summary></summary>
22934 </summary>
22935 </member> 21980 </member>
22936 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.PassHours"> 21981 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.PassHours">
22937 <summary>How long is pass valid for</summary> 21982 <summary>How long is pass valid for</summary>
@@ -22940,36 +21985,32 @@
22940 <summary>Price for a temporary pass</summary> 21985 <summary>Price for a temporary pass</summary>
22941 </member> 21986 </member>
22942 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.PublicCount"> 21987 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.PublicCount">
22943 <summary> 21988 <summary></summary>
22944 </summary>
22945 </member> 21989 </member>
22946 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Privacy"> 21990 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Privacy">
22947 <summary>Disallows people outside the parcel from being able to see in</summary> 21991 <summary>Disallows people outside the parcel from being able to see in</summary>
22948 </member> 21992 </member>
22949 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyAnonymous"> 21993 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyAnonymous">
22950 <summary> 21994 <summary></summary>
22951 </summary>
22952 </member> 21995 </member>
22953 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyIdentified"> 21996 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyIdentified">
22954 <summary> 21997 <summary></summary>
22955 </summary>
22956 </member> 21998 </member>
22957 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyTransacted"> 21999 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyTransacted">
22958 <summary> 22000 <summary></summary>
22959 </summary>
22960 </member> 22001 </member>
22961 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyAgeUnverified"> 22002 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionDenyAgeUnverified">
22962 <summary>True if the region denies access to age unverified users</summary> 22003 <summary>True if the region denies access to age unverified users</summary>
22963 </member> 22004 </member>
22964 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionPushOverride"> 22005 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RegionPushOverride">
22965 <summary> 22006 <summary></summary>
22966 </summary>
22967 </member> 22007 </member>
22968 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RentPrice"> 22008 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RentPrice">
22969 <summary>This field is no longer used</summary> 22009 <summary>This field is no longer used</summary>
22970 </member> 22010 </member>
22971 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RequestResult"> 22011 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.RequestResult">
22972 The result of a request for parcel properties</member> 22012 The result of a request for parcel properties
22013 </member>
22973 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SalePrice"> 22014 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SalePrice">
22974 <summary>Sale price of the parcel, only useful if ForSale is set</summary> 22015 <summary>Sale price of the parcel, only useful if ForSale is set</summary>
22975 <remarks>The SalePrice will remain the same after an ownership 22016 <remarks>The SalePrice will remain the same after an ownership
@@ -22983,14 +22024,13 @@
22983 </summary> 22024 </summary>
22984 </member> 22025 </member>
22985 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SelfCount"> 22026 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SelfCount">
22986 <summary> 22027 <summary></summary>
22987 </summary>
22988 </member> 22028 </member>
22989 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SequenceID"> 22029 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SequenceID">
22990 <summary> 22030 <summary>
22991 A number which increments by 1, starting at 0 for each ParcelProperties request. 22031 A number which increments by 1, starting at 0 for each ParcelProperties request.
22992 Can be overriden by specifying the sequenceID with the ParcelPropertiesRequest being sent. 22032 Can be overriden by specifying the sequenceID with the ParcelPropertiesRequest being sent.
22993 a Negative number indicates the action in <seealso cref="T:OpenMetaverse.ParcelPropertiesStatus" /> has occurred. 22033 a Negative number indicates the action in <seealso cref="T:OpenMetaverse.ParcelPropertiesStatus"/> has occurred.
22994 </summary> 22034 </summary>
22995 </member> 22035 </member>
22996 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SimWideMaxPrims"> 22036 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SimWideMaxPrims">
@@ -23000,8 +22040,7 @@
23000 <summary>Total primitives across the entire simulator</summary> 22040 <summary>Total primitives across the entire simulator</summary>
23001 </member> 22041 </member>
23002 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SnapSelection"> 22042 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SnapSelection">
23003 <summary> 22043 <summary></summary>
23004 </summary>
23005 </member> 22044 </member>
23006 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SnapshotID"> 22045 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.SnapshotID">
23007 <summary>Key of parcel snapshot</summary> 22046 <summary>Key of parcel snapshot</summary>
@@ -23013,12 +22052,10 @@
23013 <summary>Total number of primitives on this parcel</summary> 22052 <summary>Total number of primitives on this parcel</summary>
23014 </member> 22053 </member>
23015 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.UserLocation"> 22054 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.UserLocation">
23016 <summary> 22055 <summary></summary>
23017 </summary>
23018 </member> 22056 </member>
23019 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.UserLookAt"> 22057 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.UserLookAt">
23020 <summary> 22058 <summary></summary>
23021 </summary>
23022 </member> 22059 </member>
23023 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaDesc"> 22060 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.MediaDesc">
23024 <summary>A description of the media</summary> 22061 <summary>A description of the media</summary>
@@ -23045,20 +22082,20 @@
23045 <summary> 22082 <summary>
23046 Serialize the object 22083 Serialize the object
23047 </summary> 22084 </summary>
23048 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22085 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23049 </member> 22086 </member>
23050 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22087 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23051 <summary> 22088 <summary>
23052 Deserialize the message 22089 Deserialize the message
23053 </summary> 22090 </summary>
23054 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22091 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23055 </member> 22092 </member>
23056 <member name="T:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage"> 22093 <member name="T:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage">
23057 <summary>A message sent from the viewer to the simulator to updated a specific parcels settings</summary> 22094 <summary>A message sent from the viewer to the simulator to updated a specific parcels settings</summary>
23058 </member> 22095 </member>
23059 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.AuthBuyerID"> 22096 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.AuthBuyerID">
23060 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the agent authorized to purchase this 22097 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the agent authorized to purchase this
23061 parcel of land or a NULL <seealso cref="T:OpenMetaverse.UUID" /> if the sale is authorized to anyone</summary> 22098 parcel of land or a NULL <seealso cref="T:OpenMetaverse.UUID"/> if the sale is authorized to anyone</summary>
23062 </member> 22099 </member>
23063 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaAutoScale"> 22100 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaAutoScale">
23064 <summary>true to enable auto scaling of the parcel media</summary> 22101 <summary>true to enable auto scaling of the parcel media</summary>
@@ -23071,11 +22108,11 @@
23071 <summary>A string containing the description to set</summary> 22108 <summary>A string containing the description to set</summary>
23072 </member> 22109 </member>
23073 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.GroupID"> 22110 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.GroupID">
23074 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the <seealso cref="T:OpenMetaverse.Group" /> which allows for additional 22111 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the <seealso cref="T:OpenMetaverse.Group"/> which allows for additional
23075 powers and restrictions.</summary> 22112 powers and restrictions.</summary>
23076 </member> 22113 </member>
23077 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Landing"> 22114 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Landing">
23078 <summary>The <seealso cref="T:OpenMetaverse.LandingType" /> which specifies how avatars which teleport 22115 <summary>The <seealso cref="T:OpenMetaverse.LandingType"/> which specifies how avatars which teleport
23079 to this parcel are handled</summary> 22116 to this parcel are handled</summary>
23080 </member> 22117 </member>
23081 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.LocalID"> 22118 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.LocalID">
@@ -23086,88 +22123,70 @@
23086 to visitors</summary> 22123 to visitors</summary>
23087 </member> 22124 </member>
23088 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaHeight"> 22125 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaHeight">
23089 <summary> 22126 <summary></summary>
23090 </summary>
23091 </member> 22127 </member>
23092 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaLoop"> 22128 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaLoop">
23093 <summary> 22129 <summary></summary>
23094 </summary>
23095 </member> 22130 </member>
23096 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaID"> 22131 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaID">
23097 <summary> 22132 <summary></summary>
23098 </summary>
23099 </member> 22133 </member>
23100 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaType"> 22134 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaType">
23101 <summary> 22135 <summary></summary>
23102 </summary>
23103 </member> 22136 </member>
23104 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaURL"> 22137 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaURL">
23105 <summary> 22138 <summary></summary>
23106 </summary>
23107 </member> 22139 </member>
23108 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaWidth"> 22140 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MediaWidth">
23109 <summary> 22141 <summary></summary>
23110 </summary>
23111 </member> 22142 </member>
23112 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MusicURL"> 22143 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.MusicURL">
23113 <summary> 22144 <summary></summary>
23114 </summary>
23115 </member> 22145 </member>
23116 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Name"> 22146 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Name">
23117 <summary> 22147 <summary></summary>
23118 </summary>
23119 </member> 22148 </member>
23120 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ObscureMedia"> 22149 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ObscureMedia">
23121 <summary> 22150 <summary></summary>
23122 </summary>
23123 </member> 22151 </member>
23124 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ObscureMusic"> 22152 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ObscureMusic">
23125 <summary> 22153 <summary></summary>
23126 </summary>
23127 </member> 22154 </member>
23128 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ParcelFlags"> 22155 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.ParcelFlags">
23129 <summary> 22156 <summary></summary>
23130 </summary>
23131 </member> 22157 </member>
23132 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.PassHours"> 22158 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.PassHours">
23133 <summary> 22159 <summary></summary>
23134 </summary>
23135 </member> 22160 </member>
23136 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.PassPrice"> 22161 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.PassPrice">
23137 <summary> 22162 <summary></summary>
23138 </summary>
23139 </member> 22163 </member>
23140 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Privacy"> 22164 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Privacy">
23141 <summary> 22165 <summary></summary>
23142 </summary>
23143 </member> 22166 </member>
23144 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.SalePrice"> 22167 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.SalePrice">
23145 <summary> 22168 <summary></summary>
23146 </summary>
23147 </member> 22169 </member>
23148 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.SnapshotID"> 22170 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.SnapshotID">
23149 <summary> 22171 <summary></summary>
23150 </summary>
23151 </member> 22172 </member>
23152 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.UserLocation"> 22173 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.UserLocation">
23153 <summary> 22174 <summary></summary>
23154 </summary>
23155 </member> 22175 </member>
23156 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.UserLookAt"> 22176 <member name="F:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.UserLookAt">
23157 <summary> 22177 <summary></summary>
23158 </summary>
23159 </member> 22178 </member>
23160 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22179 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23161 <summary> 22180 <summary>
23162 Deserialize the message 22181 Deserialize the message
23163 </summary> 22182 </summary>
23164 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22183 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23165 </member> 22184 </member>
23166 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Serialize"> 22185 <member name="M:OpenMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage.Serialize">
23167 <summary> 22186 <summary>
23168 Serialize the object 22187 Serialize the object
23169 </summary> 22188 </summary>
23170 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22189 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23171 </member> 22190 </member>
23172 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestBlock"> 22191 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestBlock">
23173 <summary>Base class used for the RemoteParcelRequest message</summary> 22192 <summary>Base class used for the RemoteParcelRequest message</summary>
@@ -23185,23 +22204,23 @@
23185 <summary>Region handle of the parcel we are looking up</summary> 22204 <summary>Region handle of the parcel we are looking up</summary>
23186 </member> 22205 </member>
23187 <member name="F:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.RegionID"> 22206 <member name="F:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.RegionID">
23188 <summary>Region <see cref="T:OpenMetaverse.UUID" /> of the parcel we are looking up</summary> 22207 <summary>Region <see cref="T:OpenMetaverse.UUID"/> of the parcel we are looking up</summary>
23189 </member> 22208 </member>
23190 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.Serialize"> 22209 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.Serialize">
23191 <summary> 22210 <summary>
23192 Serialize the object 22211 Serialize the object
23193 </summary> 22212 </summary>
23194 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22213 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23195 </member> 22214 </member>
23196 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22215 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23197 <summary> 22216 <summary>
23198 Deserialize the message 22217 Deserialize the message
23199 </summary> 22218 </summary>
23200 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22219 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23201 </member> 22220 </member>
23202 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestReply"> 22221 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestReply">
23203 <summary> 22222 <summary>
23204 A message sent from the simulator to the viewer in response to a <see cref="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest" /> 22223 A message sent from the simulator to the viewer in response to a <see cref="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestRequest"/>
23205 which will contain parcel information 22224 which will contain parcel information
23206 </summary> 22225 </summary>
23207 </member> 22226 </member>
@@ -23212,13 +22231,13 @@
23212 <summary> 22231 <summary>
23213 Serialize the object 22232 Serialize the object
23214 </summary> 22233 </summary>
23215 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22234 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23216 </member> 22235 </member>
23217 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestReply.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22236 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestReply.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23218 <summary> 22237 <summary>
23219 Deserialize the message 22238 Deserialize the message
23220 </summary> 22239 </summary>
23221 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22240 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23222 </member> 22241 </member>
23223 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestMessage"> 22242 <member name="T:OpenMetaverse.Messages.Linden.RemoteParcelRequestMessage">
23224 <summary> 22243 <summary>
@@ -23233,37 +22252,37 @@
23233 <summary> 22252 <summary>
23234 Serialize the object 22253 Serialize the object
23235 </summary> 22254 </summary>
23236 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22255 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23237 </member> 22256 </member>
23238 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22257 <member name="M:OpenMetaverse.Messages.Linden.RemoteParcelRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23239 <summary> 22258 <summary>
23240 Deserialize the message 22259 Deserialize the message
23241 </summary> 22260 </summary>
23242 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22261 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23243 </member> 22262 </member>
23244 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryMessage.Serialize"> 22263 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryMessage.Serialize">
23245 <summary> 22264 <summary>
23246 Serialize the object 22265 Serialize the object
23247 </summary> 22266 </summary>
23248 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22267 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23249 </member> 22268 </member>
23250 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22269 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23251 <summary> 22270 <summary>
23252 Deserialize the message 22271 Deserialize the message
23253 </summary> 22272 </summary>
23254 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22273 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23255 </member> 22274 </member>
23256 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryVariablePriceMessage.Serialize"> 22275 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryVariablePriceMessage.Serialize">
23257 <summary> 22276 <summary>
23258 Serialize the object 22277 Serialize the object
23259 </summary> 22278 </summary>
23260 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22279 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23261 </member> 22280 </member>
23262 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryVariablePriceMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22281 <member name="M:OpenMetaverse.Messages.Linden.NewFileAgentInventoryVariablePriceMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23263 <summary> 22282 <summary>
23264 Deserialize the message 22283 Deserialize the message
23265 </summary> 22284 </summary>
23266 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22285 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23267 </member> 22286 </member>
23268 <member name="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage"> 22287 <member name="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage">
23269 <summary> 22288 <summary>
@@ -23271,6 +22290,29 @@
23271 the groups the agent is in 22290 the groups the agent is in
23272 </summary> 22291 </summary>
23273 </member> 22292 </member>
22293 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.AgentID">
22294 <summary>The Agent receiving the message</summary>
22295 </member>
22296 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupDataBlock">
22297 <summary>An array containing <seealso cref="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData"/> information
22298 for each <see cref="T:OpenMetaverse.Group"/> the agent is a member of</summary>
22299 </member>
22300 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupDataBlock">
22301 <summary>An array containing <seealso cref="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupData"/> information
22302 for each <see cref="T:OpenMetaverse.Group"/> the agent is a member of</summary>
22303 </member>
22304 <member name="M:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.Serialize">
22305 <summary>
22306 Serialize the object
22307 </summary>
22308 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22309 </member>
22310 <member name="M:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22311 <summary>
22312 Deserialize the message
22313 </summary>
22314 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22315 </member>
23274 <member name="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData"> 22316 <member name="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData">
23275 <summary>Group Details specific to the agent</summary> 22317 <summary>Group Details specific to the agent</summary>
23276 </member> 22318 </member>
@@ -23281,10 +22323,10 @@
23281 <summary>The agents tier contribution to the group</summary> 22323 <summary>The agents tier contribution to the group</summary>
23282 </member> 22324 </member>
23283 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupID"> 22325 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupID">
23284 <summary>The Groups <seealso cref="T:OpenMetaverse.UUID" /></summary> 22326 <summary>The Groups <seealso cref="T:OpenMetaverse.UUID"/></summary>
23285 </member> 22327 </member>
23286 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupInsigniaID"> 22328 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupInsigniaID">
23287 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the groups insignia</summary> 22329 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the groups insignia</summary>
23288 </member> 22330 </member>
23289 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupName"> 22331 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData.GroupName">
23290 <summary>The name of the group</summary> 22332 <summary>The name of the group</summary>
@@ -23300,38 +22342,15 @@
23300 <summary>true of the agent allows this group to be 22342 <summary>true of the agent allows this group to be
23301 listed in their profile</summary> 22343 listed in their profile</summary>
23302 </member> 22344 </member>
23303 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.AgentID">
23304 <summary>The Agent receiving the message</summary>
23305 </member>
23306 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupDataBlock">
23307 <summary>An array containing <seealso cref="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData" /> information
23308 for each <see cref="T:OpenMetaverse.Group" /> the agent is a member of</summary>
23309 </member>
23310 <member name="F:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupDataBlock">
23311 <summary>An array containing <seealso cref="T:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupData" /> information
23312 for each <see cref="T:OpenMetaverse.Group" /> the agent is a member of</summary>
23313 </member>
23314 <member name="M:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.Serialize">
23315 <summary>
23316 Serialize the object
23317 </summary>
23318 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns>
23319 </member>
23320 <member name="M:OpenMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23321 <summary>
23322 Deserialize the message
23323 </summary>
23324 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param>
23325 </member>
23326 <member name="T:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage"> 22345 <member name="T:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage">
23327 <summary> 22346 <summary>
23328 A message sent from the viewer to the simulator which 22347 A message sent from the viewer to the simulator which
23329 specifies the language and permissions for others to detect 22348 specifies the language and permissions for others to detect
23330 the language specified 22349 the language specified
23331 </summary> 22350 </summary>
23332 </member> 22351 </member>
23333 <member name="F:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.Language"> 22352 <member name="F:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.Language">
23334 <summary>A string containng the default language 22353 <summary>A string containng the default language
23335 to use for the agent</summary> 22354 to use for the agent</summary>
23336 </member> 22355 </member>
23337 <member name="F:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.LanguagePublic"> 22356 <member name="F:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.LanguagePublic">
@@ -23342,13 +22361,13 @@
23342 <summary> 22361 <summary>
23343 Serialize the object 22362 Serialize the object
23344 </summary> 22363 </summary>
23345 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22364 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23346 </member> 22365 </member>
23347 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22366 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentLanguageMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23348 <summary> 22367 <summary>
23349 Deserialize the message 22368 Deserialize the message
23350 </summary> 22369 </summary>
23351 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22370 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23352 </member> 22371 </member>
23353 <member name="T:OpenMetaverse.Messages.Linden.AgentDropGroupMessage"> 22372 <member name="T:OpenMetaverse.Messages.Linden.AgentDropGroupMessage">
23354 <summary> 22373 <summary>
@@ -23356,15 +22375,6 @@
23356 leaves a group 22375 leaves a group
23357 </summary> 22376 </summary>
23358 </member> 22377 </member>
23359 <member name="T:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData">
23360 <summary>An object containing the Agents UUID, and the Groups UUID</summary>
23361 </member>
23362 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData.AgentID">
23363 <summary>The ID of the Agent leaving the group</summary>
23364 </member>
23365 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData.GroupID">
23366 <summary>The GroupID the Agent is leaving</summary>
23367 </member>
23368 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentDataBlock"> 22378 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentDataBlock">
23369 <summary> 22379 <summary>
23370 An Array containing the AgentID and GroupID 22380 An Array containing the AgentID and GroupID
@@ -23374,13 +22384,22 @@
23374 <summary> 22384 <summary>
23375 Serialize the object 22385 Serialize the object
23376 </summary> 22386 </summary>
23377 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22387 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23378 </member> 22388 </member>
23379 <member name="M:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22389 <member name="M:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23380 <summary> 22390 <summary>
23381 Deserialize the message 22391 Deserialize the message
23382 </summary> 22392 </summary>
23383 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22393 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22394 </member>
22395 <member name="T:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData">
22396 <summary>An object containing the Agents UUID, and the Groups UUID</summary>
22397 </member>
22398 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData.AgentID">
22399 <summary>The ID of the Agent leaving the group</summary>
22400 </member>
22401 <member name="F:OpenMetaverse.Messages.Linden.AgentDropGroupMessage.AgentData.GroupID">
22402 <summary>The GroupID the Agent is leaving</summary>
23384 </member> 22403 </member>
23385 <member name="T:OpenMetaverse.Messages.Linden.AssetUploaderBlock"> 22404 <member name="T:OpenMetaverse.Messages.Linden.AssetUploaderBlock">
23386 <summary>Base class for Asset uploads/results via Capabilities</summary> 22405 <summary>Base class for Asset uploads/results via Capabilities</summary>
@@ -23394,13 +22413,13 @@
23394 <summary> 22413 <summary>
23395 Serialize the object 22414 Serialize the object
23396 </summary> 22415 </summary>
23397 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22416 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23398 </member> 22417 </member>
23399 <member name="M:OpenMetaverse.Messages.Linden.AssetUploaderBlock.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22418 <member name="M:OpenMetaverse.Messages.Linden.AssetUploaderBlock.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23400 <summary> 22419 <summary>
23401 Deserialize the message 22420 Deserialize the message
23402 </summary> 22421 </summary>
23403 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22422 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23404 </member> 22423 </member>
23405 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestUpload"> 22424 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestUpload">
23406 <summary> 22425 <summary>
@@ -23413,7 +22432,7 @@
23413 </member> 22432 </member>
23414 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestComplete"> 22433 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestComplete">
23415 <summary> 22434 <summary>
23416 A message sent from the simulator that will inform the agent the upload is complete, 22435 A message sent from the simulator that will inform the agent the upload is complete,
23417 and the UUID of the uploaded asset 22436 and the UUID of the uploaded asset
23418 </summary> 22437 </summary>
23419 </member> 22438 </member>
@@ -23433,17 +22452,17 @@
23433 <summary> 22452 <summary>
23434 Serialize the object 22453 Serialize the object
23435 </summary> 22454 </summary>
23436 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22455 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23437 </member> 22456 </member>
23438 <member name="M:OpenMetaverse.Messages.Linden.UploadBakedTextureMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22457 <member name="M:OpenMetaverse.Messages.Linden.UploadBakedTextureMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23439 <summary> 22458 <summary>
23440 Deserialize the message 22459 Deserialize the message
23441 </summary> 22460 </summary>
23442 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22461 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23443 </member> 22462 </member>
23444 <member name="T:OpenMetaverse.Messages.Linden.RequiredVoiceVersionMessage"> 22463 <member name="T:OpenMetaverse.Messages.Linden.RequiredVoiceVersionMessage">
23445 <summary> 22464 <summary>
23446 A message sent from the simulator which indicates the minimum version required for 22465 A message sent from the simulator which indicates the minimum version required for
23447 using voice chat 22466 using voice chat
23448 </summary> 22467 </summary>
23449 </member> 22468 </member>
@@ -23460,17 +22479,17 @@
23460 <summary> 22479 <summary>
23461 Serialize the object 22480 Serialize the object
23462 </summary> 22481 </summary>
23463 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22482 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23464 </member> 22483 </member>
23465 <member name="M:OpenMetaverse.Messages.Linden.RequiredVoiceVersionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22484 <member name="M:OpenMetaverse.Messages.Linden.RequiredVoiceVersionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23466 <summary> 22485 <summary>
23467 Deserialize the message 22486 Deserialize the message
23468 </summary> 22487 </summary>
23469 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22488 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23470 </member> 22489 </member>
23471 <member name="T:OpenMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage"> 22490 <member name="T:OpenMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage">
23472 <summary> 22491 <summary>
23473 A message sent from the simulator to the viewer containing the 22492 A message sent from the simulator to the viewer containing the
23474 voice server URI 22493 voice server URI
23475 </summary> 22494 </summary>
23476 </member> 22495 </member>
@@ -23488,37 +22507,36 @@
23488 <summary> 22507 <summary>
23489 Serialize the object 22508 Serialize the object
23490 </summary> 22509 </summary>
23491 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22510 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23492 </member> 22511 </member>
23493 <member name="M:OpenMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22512 <member name="M:OpenMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23494 <summary> 22513 <summary>
23495 Deserialize the message 22514 Deserialize the message
23496 </summary> 22515 </summary>
23497 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22516 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23498 </member> 22517 </member>
23499 <member name="T:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage"> 22518 <member name="T:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage">
23500 <summary> 22519 <summary>
22520
23501 </summary> 22521 </summary>
23502 </member> 22522 </member>
23503 <member name="F:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Password"> 22523 <member name="F:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Password">
23504 <summary> 22524 <summary></summary>
23505 </summary>
23506 </member> 22525 </member>
23507 <member name="F:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Username"> 22526 <member name="F:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Username">
23508 <summary> 22527 <summary></summary>
23509 </summary>
23510 </member> 22528 </member>
23511 <member name="M:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Serialize"> 22529 <member name="M:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Serialize">
23512 <summary> 22530 <summary>
23513 Serialize the object 22531 Serialize the object
23514 </summary> 22532 </summary>
23515 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22533 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23516 </member> 22534 </member>
23517 <member name="M:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22535 <member name="M:OpenMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23518 <summary> 22536 <summary>
23519 Deserialize the message 22537 Deserialize the message
23520 </summary> 22538 </summary>
23521 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22539 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23522 </member> 22540 </member>
23523 <member name="T:OpenMetaverse.Messages.Linden.UploadScriptTaskMessage"> 22541 <member name="T:OpenMetaverse.Messages.Linden.UploadScriptTaskMessage">
23524 <summary> 22542 <summary>
@@ -23533,13 +22551,13 @@
23533 <summary> 22551 <summary>
23534 Serialize the object 22552 Serialize the object
23535 </summary> 22553 </summary>
23536 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22554 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23537 </member> 22555 </member>
23538 <member name="M:OpenMetaverse.Messages.Linden.UploadScriptTaskMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22556 <member name="M:OpenMetaverse.Messages.Linden.UploadScriptTaskMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23539 <summary> 22557 <summary>
23540 Deserialize the message 22558 Deserialize the message
23541 </summary> 22559 </summary>
23542 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22560 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23543 </member> 22561 </member>
23544 <member name="T:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage"> 22562 <member name="T:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage">
23545 <summary> 22563 <summary>
@@ -23551,11 +22569,11 @@
23551 <summary>The Asset ID of the script</summary> 22569 <summary>The Asset ID of the script</summary>
23552 </member> 22570 </member>
23553 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Mono"> 22571 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Mono">
23554 <summary>True of the script is compiled/ran using the mono interpreter, false indicates it 22572 <summary>True of the script is compiled/ran using the mono interpreter, false indicates it
23555 uses the older less efficient lsl2 interprter</summary> 22573 uses the older less efficient lsl2 interprter</summary>
23556 </member> 22574 </member>
23557 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.ObjectID"> 22575 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.ObjectID">
23558 <summary>The Task containing the scripts <seealso cref="T:OpenMetaverse.UUID" /></summary> 22576 <summary>The Task containing the scripts <seealso cref="T:OpenMetaverse.UUID"/></summary>
23559 </member> 22577 </member>
23560 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Running"> 22578 <member name="F:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Running">
23561 <summary>true of the script is in a running state</summary> 22579 <summary>true of the script is in a running state</summary>
@@ -23564,13 +22582,13 @@
23564 <summary> 22582 <summary>
23565 Serialize the object 22583 Serialize the object
23566 </summary> 22584 </summary>
23567 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22585 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23568 </member> 22586 </member>
23569 <member name="M:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22587 <member name="M:OpenMetaverse.Messages.Linden.ScriptRunningReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23570 <summary> 22588 <summary>
23571 Deserialize the message 22589 Deserialize the message
23572 </summary> 22590 </summary>
23573 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22591 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23574 </member> 22592 </member>
23575 <member name="T:OpenMetaverse.Messages.Linden.UpdateGestureAgentInventoryMessage"> 22593 <member name="T:OpenMetaverse.Messages.Linden.UpdateGestureAgentInventoryMessage">
23576 <summary> 22594 <summary>
@@ -23585,13 +22603,13 @@
23585 <summary> 22603 <summary>
23586 Serialize the object 22604 Serialize the object
23587 </summary> 22605 </summary>
23588 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22606 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23589 </member> 22607 </member>
23590 <member name="M:OpenMetaverse.Messages.Linden.UpdateGestureAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22608 <member name="M:OpenMetaverse.Messages.Linden.UpdateGestureAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23591 <summary> 22609 <summary>
23592 Deserialize the message 22610 Deserialize the message
23593 </summary> 22611 </summary>
23594 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22612 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23595 </member> 22613 </member>
23596 <member name="T:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage"> 22614 <member name="T:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage">
23597 <summary> 22615 <summary>
@@ -23600,22 +22618,22 @@
23600 </summary> 22618 </summary>
23601 </member> 22619 </member>
23602 <member name="F:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.TaskID"> 22620 <member name="F:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.TaskID">
23603 <summary>The <seealso cref="T:OpenMetaverse.UUID" /> of the Task containing the notecard asset to update</summary> 22621 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the Task containing the notecard asset to update</summary>
23604 </member> 22622 </member>
23605 <member name="F:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.ItemID"> 22623 <member name="F:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.ItemID">
23606 <summary>The notecard assets <seealso cref="T:OpenMetaverse.UUID" /> contained in the tasks inventory</summary> 22624 <summary>The notecard assets <seealso cref="T:OpenMetaverse.UUID"/> contained in the tasks inventory</summary>
23607 </member> 22625 </member>
23608 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.Serialize"> 22626 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.Serialize">
23609 <summary> 22627 <summary>
23610 Serialize the object 22628 Serialize the object
23611 </summary> 22629 </summary>
23612 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22630 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23613 </member> 22631 </member>
23614 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22632 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardTaskInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23615 <summary> 22633 <summary>
23616 Deserialize the message 22634 Deserialize the message
23617 </summary> 22635 </summary>
23618 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22636 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23619 </member> 22637 </member>
23620 <member name="T:OpenMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage"> 22638 <member name="T:OpenMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage">
23621 <summary> 22639 <summary>
@@ -23632,13 +22650,13 @@
23632 <summary> 22650 <summary>
23633 Serialize the object 22651 Serialize the object
23634 </summary> 22652 </summary>
23635 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22653 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23636 </member> 22654 </member>
23637 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22655 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23638 <summary> 22656 <summary>
23639 Deserialize the message 22657 Deserialize the message
23640 </summary> 22658 </summary>
23641 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22659 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23642 </member> 22660 </member>
23643 <member name="T:OpenMetaverse.Messages.Linden.UpdateNotecardAgentInventoryMessage"> 22661 <member name="T:OpenMetaverse.Messages.Linden.UpdateNotecardAgentInventoryMessage">
23644 <summary> 22662 <summary>
@@ -23653,30 +22671,30 @@
23653 <summary> 22671 <summary>
23654 Serialize the object 22672 Serialize the object
23655 </summary> 22673 </summary>
23656 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22674 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23657 </member> 22675 </member>
23658 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22676 <member name="M:OpenMetaverse.Messages.Linden.UpdateNotecardAgentInventoryMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23659 <summary> 22677 <summary>
23660 Deserialize the message 22678 Deserialize the message
23661 </summary> 22679 </summary>
23662 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22680 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23663 </member> 22681 </member>
23664 <member name="M:OpenMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage.Serialize"> 22682 <member name="M:OpenMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage.Serialize">
23665 <summary> 22683 <summary>
23666 Serialize the object 22684 Serialize the object
23667 </summary> 22685 </summary>
23668 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22686 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23669 </member> 22687 </member>
23670 <member name="M:OpenMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22688 <member name="M:OpenMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23671 <summary> 22689 <summary>
23672 Deserialize the message 22690 Deserialize the message
23673 </summary> 22691 </summary>
23674 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22692 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23675 </member> 22693 </member>
23676 <member name="T:OpenMetaverse.Messages.Linden.UploaderScriptRequestError"> 22694 <member name="T:OpenMetaverse.Messages.Linden.UploaderScriptRequestError">
23677 <summary> 22695 <summary>
23678 A message sent from the simulator to the viewer which indicates 22696 A message sent from the simulator to the viewer which indicates
23679 an error occurred while attempting to update a script in an agents or tasks 22697 an error occurred while attempting to update a script in an agents or tasks
23680 inventory 22698 inventory
23681 </summary> 22699 </summary>
23682 </member> 22700 </member>
@@ -23704,24 +22722,24 @@
23704 <summary>The scripts InventoryItem ItemID to update</summary> 22722 <summary>The scripts InventoryItem ItemID to update</summary>
23705 </member> 22723 </member>
23706 <member name="F:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Target"> 22724 <member name="F:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Target">
23707 <summary>A lowercase string containing either "mono" or "lsl2" which 22725 <summary>A lowercase string containing either "mono" or "lsl2" which
23708 specifies the script is compiled and ran on the mono runtime, or the older 22726 specifies the script is compiled and ran on the mono runtime, or the older
23709 lsl runtime</summary> 22727 lsl runtime</summary>
23710 </member> 22728 </member>
23711 <member name="F:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.TaskID"> 22729 <member name="F:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.TaskID">
23712 <summary>The tasks <see cref="T:OpenMetaverse.UUID" /> which contains the script to update</summary> 22730 <summary>The tasks <see cref="T:OpenMetaverse.UUID"/> which contains the script to update</summary>
23713 </member> 22731 </member>
23714 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Serialize"> 22732 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Serialize">
23715 <summary> 22733 <summary>
23716 Serialize the object 22734 Serialize the object
23717 </summary> 22735 </summary>
23718 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22736 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23719 </member> 22737 </member>
23720 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22738 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23721 <summary> 22739 <summary>
23722 Deserialize the message 22740 Deserialize the message
23723 </summary> 22741 </summary>
23724 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22742 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23725 </member> 22743 </member>
23726 <member name="T:OpenMetaverse.Messages.Linden.UpdateScriptTaskMessage"> 22744 <member name="T:OpenMetaverse.Messages.Linden.UpdateScriptTaskMessage">
23727 <summary> 22745 <summary>
@@ -23736,13 +22754,13 @@
23736 <summary> 22754 <summary>
23737 Serialize the object 22755 Serialize the object
23738 </summary> 22756 </summary>
23739 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22757 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23740 </member> 22758 </member>
23741 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22759 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptTaskMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23742 <summary> 22760 <summary>
23743 Deserialize the message 22761 Deserialize the message
23744 </summary> 22762 </summary>
23745 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22763 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23746 </member> 22764 </member>
23747 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestScriptComplete"> 22765 <member name="T:OpenMetaverse.Messages.Linden.UploaderRequestScriptComplete">
23748 <summary> 22766 <summary>
@@ -23773,13 +22791,13 @@
23773 <summary> 22791 <summary>
23774 Serialize the object 22792 Serialize the object
23775 </summary> 22793 </summary>
23776 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22794 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23777 </member> 22795 </member>
23778 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptAgentRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22796 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptAgentRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23779 <summary> 22797 <summary>
23780 Deserialize the message 22798 Deserialize the message
23781 </summary> 22799 </summary>
23782 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22800 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23783 </member> 22801 </member>
23784 <member name="T:OpenMetaverse.Messages.Linden.UpdateScriptAgentMessage"> 22802 <member name="T:OpenMetaverse.Messages.Linden.UpdateScriptAgentMessage">
23785 <summary> 22803 <summary>
@@ -23794,44 +22812,43 @@
23794 <summary> 22812 <summary>
23795 Serialize the object 22813 Serialize the object
23796 </summary> 22814 </summary>
23797 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22815 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23798 </member> 22816 </member>
23799 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptAgentMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22817 <member name="M:OpenMetaverse.Messages.Linden.UpdateScriptAgentMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23800 <summary> 22818 <summary>
23801 Deserialize the message 22819 Deserialize the message
23802 </summary> 22820 </summary>
23803 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22821 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23804 </member> 22822 </member>
23805 <member name="M:OpenMetaverse.Messages.Linden.SendPostcardMessage.Serialize"> 22823 <member name="M:OpenMetaverse.Messages.Linden.SendPostcardMessage.Serialize">
23806 <summary> 22824 <summary>
23807 Serialize the object 22825 Serialize the object
23808 </summary> 22826 </summary>
23809 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22827 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23810 </member> 22828 </member>
23811 <member name="M:OpenMetaverse.Messages.Linden.SendPostcardMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22829 <member name="M:OpenMetaverse.Messages.Linden.SendPostcardMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23812 <summary> 22830 <summary>
23813 Deserialize the message 22831 Deserialize the message
23814 </summary> 22832 </summary>
23815 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22833 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23816 </member> 22834 </member>
23817 <member name="T:OpenMetaverse.Messages.Linden.MapLayerMessageBase"> 22835 <member name="T:OpenMetaverse.Messages.Linden.MapLayerMessageBase">
23818 <summary>Base class for Map Layers via Capabilities</summary> 22836 <summary>Base class for Map Layers via Capabilities</summary>
23819 </member> 22837 </member>
23820 <member name="F:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Flags"> 22838 <member name="F:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Flags">
23821 <summary> 22839 <summary></summary>
23822 </summary>
23823 </member> 22840 </member>
23824 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Serialize"> 22841 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Serialize">
23825 <summary> 22842 <summary>
23826 Serialize the object 22843 Serialize the object
23827 </summary> 22844 </summary>
23828 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22845 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23829 </member> 22846 </member>
23830 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22847 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessageBase.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23831 <summary> 22848 <summary>
23832 Deserialize the message 22849 Deserialize the message
23833 </summary> 22850 </summary>
23834 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22851 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23835 </member> 22852 </member>
23836 <member name="T:OpenMetaverse.Messages.Linden.MapLayerRequestVariant"> 22853 <member name="T:OpenMetaverse.Messages.Linden.MapLayerRequestVariant">
23837 <summary> 22854 <summary>
@@ -23843,6 +22860,21 @@
23843 A message sent from the simulator to the viewer which contains an array of map images and their grid coordinates 22860 A message sent from the simulator to the viewer which contains an array of map images and their grid coordinates
23844 </summary> 22861 </summary>
23845 </member> 22862 </member>
22863 <member name="F:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerDataBlocks">
22864 <summary>An array containing LayerData items</summary>
22865 </member>
22866 <member name="M:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.Serialize">
22867 <summary>
22868 Serialize the object
22869 </summary>
22870 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
22871 </member>
22872 <member name="M:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
22873 <summary>
22874 Deserialize the message
22875 </summary>
22876 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
22877 </member>
23846 <member name="T:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData"> 22878 <member name="T:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData">
23847 <summary> 22879 <summary>
23848 An object containing map location details 22880 An object containing map location details
@@ -23863,21 +22895,6 @@
23863 <member name="F:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData.Top"> 22895 <member name="F:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData.Top">
23864 <summary>The grid location of the northern border of the map tile</summary> 22896 <summary>The grid location of the northern border of the map tile</summary>
23865 </member> 22897 </member>
23866 <member name="F:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.LayerDataBlocks">
23867 <summary>An array containing LayerData items</summary>
23868 </member>
23869 <member name="M:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.Serialize">
23870 <summary>
23871 Serialize the object
23872 </summary>
23873 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns>
23874 </member>
23875 <member name="M:OpenMetaverse.Messages.Linden.MapLayerReplyVariant.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23876 <summary>
23877 Deserialize the message
23878 </summary>
23879 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param>
23880 </member>
23881 <member name="F:OpenMetaverse.Messages.Linden.MapLayerMessage.Request"> 22898 <member name="F:OpenMetaverse.Messages.Linden.MapLayerMessage.Request">
23882 <summary>Object containing request or response</summary> 22899 <summary>Object containing request or response</summary>
23883 </member> 22900 </member>
@@ -23885,13 +22902,13 @@
23885 <summary> 22902 <summary>
23886 Serialize the object 22903 Serialize the object
23887 </summary> 22904 </summary>
23888 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22905 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23889 </member> 22906 </member>
23890 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22907 <member name="M:OpenMetaverse.Messages.Linden.MapLayerMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23891 <summary> 22908 <summary>
23892 Deserialize the message 22909 Deserialize the message
23893 </summary> 22910 </summary>
23894 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22911 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23895 </member> 22912 </member>
23896 <member name="T:OpenMetaverse.Messages.Linden.ProductInfoRequestMessage"> 22913 <member name="T:OpenMetaverse.Messages.Linden.ProductInfoRequestMessage">
23897 <summary> 22914 <summary>
@@ -23902,25 +22919,25 @@
23902 <summary> 22919 <summary>
23903 Serialize the object 22920 Serialize the object
23904 </summary> 22921 </summary>
23905 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22922 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23906 </member> 22923 </member>
23907 <member name="M:OpenMetaverse.Messages.Linden.ProductInfoRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22924 <member name="M:OpenMetaverse.Messages.Linden.ProductInfoRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23908 <summary> 22925 <summary>
23909 Deserialize the message 22926 Deserialize the message
23910 </summary> 22927 </summary>
23911 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22928 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23912 </member> 22929 </member>
23913 <member name="M:OpenMetaverse.Messages.Linden.SearchStatRequestMessage.Serialize"> 22930 <member name="M:OpenMetaverse.Messages.Linden.SearchStatRequestMessage.Serialize">
23914 <summary> 22931 <summary>
23915 Serialize the object 22932 Serialize the object
23916 </summary> 22933 </summary>
23917 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22934 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23918 </member> 22935 </member>
23919 <member name="M:OpenMetaverse.Messages.Linden.SearchStatRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22936 <member name="M:OpenMetaverse.Messages.Linden.SearchStatRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23920 <summary> 22937 <summary>
23921 Deserialize the message 22938 Deserialize the message
23922 </summary> 22939 </summary>
23923 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22940 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23924 </member> 22941 </member>
23925 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestBlock.Method"> 22942 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestBlock.Method">
23926 <summary>A string containing the method used</summary> 22943 <summary>A string containing the method used</summary>
@@ -23929,10 +22946,10 @@
23929 <summary> 22946 <summary>
23930 A request sent from an agent to the Simulator to begin a new conference. 22947 A request sent from an agent to the Simulator to begin a new conference.
23931 Contains a list of Agents which will be included in the conference 22948 Contains a list of Agents which will be included in the conference
23932 </summary> 22949 </summary>
23933 </member> 22950 </member>
23934 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.AgentsBlock"> 22951 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.AgentsBlock">
23935 <summary>An array containing the <see cref="T:OpenMetaverse.UUID" /> of the agents invited to this conference</summary> 22952 <summary>An array containing the <see cref="T:OpenMetaverse.UUID"/> of the agents invited to this conference</summary>
23936 </member> 22953 </member>
23937 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.SessionID"> 22954 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.SessionID">
23938 <summary>The conferences Session ID</summary> 22955 <summary>The conferences Session ID</summary>
@@ -23941,26 +22958,25 @@
23941 <summary> 22958 <summary>
23942 Serialize the object 22959 Serialize the object
23943 </summary> 22960 </summary>
23944 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22961 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23945 </member> 22962 </member>
23946 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22963 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestStartConference.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23947 <summary> 22964 <summary>
23948 Deserialize the message 22965 Deserialize the message
23949 </summary> 22966 </summary>
23950 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 22967 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23951 </member> 22968 </member>
23952 <member name="T:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate"> 22969 <member name="T:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate">
23953 <summary> 22970 <summary>
23954 A moderation request sent from a conference moderator 22971 A moderation request sent from a conference moderator
23955 Contains an agent and an optional action to take 22972 Contains an agent and an optional action to take
23956 </summary> 22973 </summary>
23957 </member> 22974 </member>
23958 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.SessionID"> 22975 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.SessionID">
23959 <summary>The Session ID</summary> 22976 <summary>The Session ID</summary>
23960 </member> 22977 </member>
23961 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.AgentID"> 22978 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.AgentID">
23962 <summary> 22979 <summary></summary>
23963 </summary>
23964 </member> 22980 </member>
23965 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.RequestKey"> 22981 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.RequestKey">
23966 <summary>A list containing Key/Value pairs, known valid values: 22982 <summary>A list containing Key/Value pairs, known valid values:
@@ -23970,24 +22986,23 @@
23970 <remarks>"text" or "voice"</remarks> 22986 <remarks>"text" or "voice"</remarks>
23971 </member> 22987 </member>
23972 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.RequestValue"> 22988 <member name="F:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.RequestValue">
23973 <summary> 22989 <summary></summary>
23974 </summary>
23975 </member> 22990 </member>
23976 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.Serialize"> 22991 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.Serialize">
23977 <summary> 22992 <summary>
23978 Serialize the object 22993 Serialize the object
23979 </summary> 22994 </summary>
23980 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 22995 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
23981 </member> 22996 </member>
23982 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 22997 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
23983 <summary> 22998 <summary>
23984 Deserialize the message 22999 Deserialize the message
23985 </summary> 23000 </summary>
23986 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23001 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
23987 </member> 23002 </member>
23988 <member name="T:OpenMetaverse.Messages.Linden.ChatSessionAcceptInvitation"> 23003 <member name="T:OpenMetaverse.Messages.Linden.ChatSessionAcceptInvitation">
23989 <summary> 23004 <summary>
23990 A message sent from the agent to the simulator which tells the 23005 A message sent from the agent to the simulator which tells the
23991 simulator we've accepted a conference invitation 23006 simulator we've accepted a conference invitation
23992 </summary> 23007 </summary>
23993 </member> 23008 </member>
@@ -23998,49 +23013,49 @@
23998 <summary> 23013 <summary>
23999 Serialize the object 23014 Serialize the object
24000 </summary> 23015 </summary>
24001 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23016 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24002 </member> 23017 </member>
24003 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionAcceptInvitation.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23018 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionAcceptInvitation.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24004 <summary> 23019 <summary>
24005 Deserialize the message 23020 Deserialize the message
24006 </summary> 23021 </summary>
24007 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23022 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24008 </member> 23023 </member>
24009 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMessage.Serialize"> 23024 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMessage.Serialize">
24010 <summary> 23025 <summary>
24011 Serialize the object 23026 Serialize the object
24012 </summary> 23027 </summary>
24013 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23028 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24014 </member> 23029 </member>
24015 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23030 <member name="M:OpenMetaverse.Messages.Linden.ChatSessionRequestMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24016 <summary> 23031 <summary>
24017 Deserialize the message 23032 Deserialize the message
24018 </summary> 23033 </summary>
24019 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23034 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24020 </member> 23035 </member>
24021 <member name="M:OpenMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage.Serialize"> 23036 <member name="M:OpenMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage.Serialize">
24022 <summary> 23037 <summary>
24023 Serialize the object 23038 Serialize the object
24024 </summary> 23039 </summary>
24025 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23040 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24026 </member> 23041 </member>
24027 <member name="M:OpenMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23042 <member name="M:OpenMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24028 <summary> 23043 <summary>
24029 Deserialize the message 23044 Deserialize the message
24030 </summary> 23045 </summary>
24031 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23046 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24032 </member> 23047 </member>
24033 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage.Serialize"> 23048 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage.Serialize">
24034 <summary> 23049 <summary>
24035 Serialize the object 23050 Serialize the object
24036 </summary> 23051 </summary>
24037 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23052 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24038 </member> 23053 </member>
24039 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23054 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24040 <summary> 23055 <summary>
24041 Deserialize the message 23056 Deserialize the message
24042 </summary> 23057 </summary>
24043 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23058 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24044 </member> 23059 </member>
24045 <member name="F:OpenMetaverse.Messages.Linden.ChatterBoxInvitationMessage.FromAgentID"> 23060 <member name="F:OpenMetaverse.Messages.Linden.ChatterBoxInvitationMessage.FromAgentID">
24046 <summary>Key of sender</summary> 23061 <summary>Key of sender</summary>
@@ -24088,20 +23103,22 @@
24088 <summary> 23103 <summary>
24089 Serialize the object 23104 Serialize the object
24090 </summary> 23105 </summary>
24091 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23106 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24092 </member> 23107 </member>
24093 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxInvitationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23108 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxInvitationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24094 <summary> 23109 <summary>
24095 Deserialize the message 23110 Deserialize the message
24096 </summary> 23111 </summary>
24097 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23112 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24098 </member> 23113 </member>
24099 <member name="T:OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage"> 23114 <member name="T:OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage">
24100 <summary> 23115 <summary>
24101 Sent from the simulator to the viewer. 23116 Sent from the simulator to the viewer.
23117
24102 When an agent initially joins a session the AgentUpdatesBlock object will contain a list of session members including 23118 When an agent initially joins a session the AgentUpdatesBlock object will contain a list of session members including
24103 a boolean indicating they can use voice chat in this session, a boolean indicating they are allowed to moderate 23119 a boolean indicating they can use voice chat in this session, a boolean indicating they are allowed to moderate
24104 this session, and lastly a string which indicates another agent is entering the session with the Transition set to "ENTER" 23120 this session, and lastly a string which indicates another agent is entering the session with the Transition set to "ENTER"
23121
24105 During the session lifetime updates on individuals are sent. During the update the booleans sent during the initial join are 23122 During the session lifetime updates on individuals are sent. During the update the booleans sent during the initial join are
24106 excluded with the exception of the Transition field. This indicates a new user entering or exiting the session with 23123 excluded with the exception of the Transition field. This indicates a new user entering or exiting the session with
24107 the string "ENTER" or "LEAVE" respectively. 23124 the string "ENTER" or "LEAVE" respectively.
@@ -24111,13 +23128,13 @@
24111 <summary> 23128 <summary>
24112 Serialize the object 23129 Serialize the object
24113 </summary> 23130 </summary>
24114 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23131 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24115 </member> 23132 </member>
24116 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23133 <member name="M:OpenMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24117 <summary> 23134 <summary>
24118 Deserialize the message 23135 Deserialize the message
24119 </summary> 23136 </summary>
24120 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23137 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24121 </member> 23138 </member>
24122 <member name="T:OpenMetaverse.Messages.Linden.ForceCloseChatterBoxSessionMessage"> 23139 <member name="T:OpenMetaverse.Messages.Linden.ForceCloseChatterBoxSessionMessage">
24123 <summary> 23140 <summary>
@@ -24138,101 +23155,102 @@
24138 <summary> 23155 <summary>
24139 Serialize the object 23156 Serialize the object
24140 </summary> 23157 </summary>
24141 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23158 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24142 </member> 23159 </member>
24143 <member name="M:OpenMetaverse.Messages.Linden.ForceCloseChatterBoxSessionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23160 <member name="M:OpenMetaverse.Messages.Linden.ForceCloseChatterBoxSessionMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24144 <summary> 23161 <summary>
24145 Deserialize the message 23162 Deserialize the message
24146 </summary> 23163 </summary>
24147 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23164 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24148 </member> 23165 </member>
24149 <member name="M:OpenMetaverse.Messages.Linden.EventQueueAck.Serialize"> 23166 <member name="M:OpenMetaverse.Messages.Linden.EventQueueAck.Serialize">
24150 <summary> 23167 <summary>
24151 Serialize the object 23168 Serialize the object
24152 </summary> 23169 </summary>
24153 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23170 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24154 </member> 23171 </member>
24155 <member name="M:OpenMetaverse.Messages.Linden.EventQueueAck.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23172 <member name="M:OpenMetaverse.Messages.Linden.EventQueueAck.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24156 <summary> 23173 <summary>
24157 Deserialize the message 23174 Deserialize the message
24158 </summary> 23175 </summary>
24159 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23176 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24160 </member> 23177 </member>
24161 <member name="M:OpenMetaverse.Messages.Linden.EventQueueEvent.Serialize"> 23178 <member name="M:OpenMetaverse.Messages.Linden.EventQueueEvent.Serialize">
24162 <summary> 23179 <summary>
24163 Serialize the object 23180 Serialize the object
24164 </summary> 23181 </summary>
24165 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23182 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24166 </member> 23183 </member>
24167 <member name="M:OpenMetaverse.Messages.Linden.EventQueueEvent.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23184 <member name="M:OpenMetaverse.Messages.Linden.EventQueueEvent.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24168 <summary> 23185 <summary>
24169 Deserialize the message 23186 Deserialize the message
24170 </summary> 23187 </summary>
24171 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23188 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24172 </member> 23189 </member>
24173 <member name="M:OpenMetaverse.Messages.Linden.EventQueueGetMessage.Serialize"> 23190 <member name="M:OpenMetaverse.Messages.Linden.EventQueueGetMessage.Serialize">
24174 <summary> 23191 <summary>
24175 Serialize the object 23192 Serialize the object
24176 </summary> 23193 </summary>
24177 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23194 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24178 </member> 23195 </member>
24179 <member name="M:OpenMetaverse.Messages.Linden.EventQueueGetMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23196 <member name="M:OpenMetaverse.Messages.Linden.EventQueueGetMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24180 <summary> 23197 <summary>
24181 Deserialize the message 23198 Deserialize the message
24182 </summary> 23199 </summary>
24183 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23200 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24184 </member> 23201 </member>
24185 <member name="M:OpenMetaverse.Messages.Linden.ViewerStatsMessage.Serialize"> 23202 <member name="M:OpenMetaverse.Messages.Linden.ViewerStatsMessage.Serialize">
24186 <summary> 23203 <summary>
24187 Serialize the object 23204 Serialize the object
24188 </summary> 23205 </summary>
24189 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23206 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24190 </member> 23207 </member>
24191 <member name="M:OpenMetaverse.Messages.Linden.ViewerStatsMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23208 <member name="M:OpenMetaverse.Messages.Linden.ViewerStatsMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24192 <summary> 23209 <summary>
24193 Deserialize the message 23210 Deserialize the message
24194 </summary> 23211 </summary>
24195 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23212 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24196 </member> 23213 </member>
24197 <member name="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage"> 23214 <member name="T:OpenMetaverse.Messages.Linden.PlacesReplyMessage">
24198 <summary> 23215 <summary>
23216
24199 </summary> 23217 </summary>
24200 </member> 23218 </member>
24201 <member name="M:OpenMetaverse.Messages.Linden.PlacesReplyMessage.Serialize"> 23219 <member name="M:OpenMetaverse.Messages.Linden.PlacesReplyMessage.Serialize">
24202 <summary> 23220 <summary>
24203 Serialize the object 23221 Serialize the object
24204 </summary> 23222 </summary>
24205 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23223 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24206 </member> 23224 </member>
24207 <member name="M:OpenMetaverse.Messages.Linden.PlacesReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23225 <member name="M:OpenMetaverse.Messages.Linden.PlacesReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24208 <summary> 23226 <summary>
24209 Deserialize the message 23227 Deserialize the message
24210 </summary> 23228 </summary>
24211 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23229 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24212 </member> 23230 </member>
24213 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInformationMessage.Serialize"> 23231 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInformationMessage.Serialize">
24214 <summary> 23232 <summary>
24215 Serialize the object 23233 Serialize the object
24216 </summary> 23234 </summary>
24217 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23235 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24218 </member> 23236 </member>
24219 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInformationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23237 <member name="M:OpenMetaverse.Messages.Linden.UpdateAgentInformationMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24220 <summary> 23238 <summary>
24221 Deserialize the message 23239 Deserialize the message
24222 </summary> 23240 </summary>
24223 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23241 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24224 </member> 23242 </member>
24225 <member name="M:OpenMetaverse.Messages.Linden.DirLandReplyMessage.Serialize"> 23243 <member name="M:OpenMetaverse.Messages.Linden.DirLandReplyMessage.Serialize">
24226 <summary> 23244 <summary>
24227 Serialize the object 23245 Serialize the object
24228 </summary> 23246 </summary>
24229 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23247 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24230 </member> 23248 </member>
24231 <member name="M:OpenMetaverse.Messages.Linden.DirLandReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23249 <member name="M:OpenMetaverse.Messages.Linden.DirLandReplyMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24232 <summary> 23250 <summary>
24233 Deserialize the message 23251 Deserialize the message
24234 </summary> 23252 </summary>
24235 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23253 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24236 </member> 23254 </member>
24237 <member name="T:OpenMetaverse.Messages.Linden.ObjectPhysicsPropertiesMessage"> 23255 <member name="T:OpenMetaverse.Messages.Linden.ObjectPhysicsPropertiesMessage">
24238 <summary> 23256 <summary>
@@ -24257,7 +23275,7 @@
24257 </member> 23275 </member>
24258 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaNavigateMessage"> 23276 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaNavigateMessage">
24259 <summary> 23277 <summary>
24260 A message sent from the viewer to the simulator which 23278 A message sent from the viewer to the simulator which
24261 specifies that the user has changed current URL 23279 specifies that the user has changed current URL
24262 of the specific media on a prim face 23280 of the specific media on a prim face
24263 </summary> 23281 </summary>
@@ -24281,13 +23299,13 @@
24281 <summary> 23299 <summary>
24282 Serialize the object 23300 Serialize the object
24283 </summary> 23301 </summary>
24284 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23302 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24285 </member> 23303 </member>
24286 <member name="M:OpenMetaverse.Messages.Linden.ObjectMediaNavigateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23304 <member name="M:OpenMetaverse.Messages.Linden.ObjectMediaNavigateMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24287 <summary> 23305 <summary>
24288 Deserialize the message 23306 Deserialize the message
24289 </summary> 23307 </summary>
24290 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23308 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24291 </member> 23309 </member>
24292 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaBlock"> 23310 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaBlock">
24293 <summary>Base class used for the ObjectMedia message</summary> 23311 <summary>Base class used for the ObjectMedia message</summary>
@@ -24317,7 +23335,7 @@
24317 <summary> 23335 <summary>
24318 Deserialize the message 23336 Deserialize the message
24319 </summary> 23337 </summary>
24320 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23338 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24321 </member> 23339 </member>
24322 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaResponse"> 23340 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaResponse">
24323 <summary> 23341 <summary>
@@ -24349,7 +23367,7 @@
24349 <summary> 23367 <summary>
24350 Deserialize the message 23368 Deserialize the message
24351 </summary> 23369 </summary>
24352 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23370 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24353 </member> 23371 </member>
24354 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaUpdate"> 23372 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaUpdate">
24355 <summary> 23373 <summary>
@@ -24381,7 +23399,7 @@
24381 <summary> 23399 <summary>
24382 Deserialize the message 23400 Deserialize the message
24383 </summary> 23401 </summary>
24384 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23402 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24385 </member> 23403 </member>
24386 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaMessage"> 23404 <member name="T:OpenMetaverse.Messages.Linden.ObjectMediaMessage">
24387 <summary> 23405 <summary>
@@ -24395,13 +23413,13 @@
24395 <summary> 23413 <summary>
24396 Serialize the object 23414 Serialize the object
24397 </summary> 23415 </summary>
24398 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the objects data</returns> 23416 <returns>An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the objects data</returns>
24399 </member> 23417 </member>
24400 <member name="M:OpenMetaverse.Messages.Linden.ObjectMediaMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23418 <member name="M:OpenMetaverse.Messages.Linden.ObjectMediaMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24401 <summary> 23419 <summary>
24402 Deserialize the message 23420 Deserialize the message
24403 </summary> 23421 </summary>
24404 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23422 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24405 </member> 23423 </member>
24406 <member name="T:OpenMetaverse.Messages.Linden.ObjectResourcesDetail"> 23424 <member name="T:OpenMetaverse.Messages.Linden.ObjectResourcesDetail">
24407 <summary>Details about object resource usage</summary> 23425 <summary>Details about object resource usage</summary>
@@ -24428,14 +23446,13 @@
24428 <summary> 23446 <summary>
24429 Deserializes object from OSD 23447 Deserializes object from OSD
24430 </summary> 23448 </summary>
24431 <param name="obj">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23449 <param name="obj">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24432 </member> 23450 </member>
24433 <member name="M:OpenMetaverse.Messages.Linden.ObjectResourcesDetail.FromOSD(OpenMetaverse.StructuredData.OSD)"> 23451 <member name="M:OpenMetaverse.Messages.Linden.ObjectResourcesDetail.FromOSD(OpenMetaverse.StructuredData.OSD)">
24434 <summary> 23452 <summary>
24435 Makes an instance based on deserialized data 23453 Makes an instance based on deserialized data
24436 </summary> 23454 </summary>
24437 <param name="osd"> 23455 <param name="osd"><see cref="T:OpenMetaverse.StructuredData.OSD"/> serialized data</param>
24438 <see cref="T:OpenMetaverse.StructuredData.OSD" /> serialized data</param>
24439 <returns>Instance containg deserialized data</returns> 23456 <returns>Instance containg deserialized data</returns>
24440 </member> 23457 </member>
24441 <member name="T:OpenMetaverse.Messages.Linden.ParcelResourcesDetail"> 23458 <member name="T:OpenMetaverse.Messages.Linden.ParcelResourcesDetail">
@@ -24457,20 +23474,19 @@
24457 <summary>Parcel owner</summary> 23474 <summary>Parcel owner</summary>
24458 </member> 23475 </member>
24459 <member name="F:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.Objects"> 23476 <member name="F:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.Objects">
24460 <summary>Array of <see cref="T:OpenMetaverse.Messages.Linden.ObjectResourcesDetail" /> containing per object resource usage</summary> 23477 <summary>Array of <see cref="T:OpenMetaverse.Messages.Linden.ObjectResourcesDetail"/> containing per object resource usage</summary>
24461 </member> 23478 </member>
24462 <member name="M:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23479 <member name="M:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24463 <summary> 23480 <summary>
24464 Deserializes object from OSD 23481 Deserializes object from OSD
24465 </summary> 23482 </summary>
24466 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23483 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24467 </member> 23484 </member>
24468 <member name="M:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.FromOSD(OpenMetaverse.StructuredData.OSD)"> 23485 <member name="M:OpenMetaverse.Messages.Linden.ParcelResourcesDetail.FromOSD(OpenMetaverse.StructuredData.OSD)">
24469 <summary> 23486 <summary>
24470 Makes an instance based on deserialized data 23487 Makes an instance based on deserialized data
24471 </summary> 23488 </summary>
24472 <param name="osd"> 23489 <param name="osd"><see cref="T:OpenMetaverse.StructuredData.OSD"/> serialized data</param>
24473 <see cref="T:OpenMetaverse.StructuredData.OSD" /> serialized data</param>
24474 <returns>Instance containg deserialized data</returns> 23490 <returns>Instance containg deserialized data</returns>
24475 </member> 23491 </member>
24476 <member name="T:OpenMetaverse.Messages.Linden.BaseResourcesInfo"> 23492 <member name="T:OpenMetaverse.Messages.Linden.BaseResourcesInfo">
@@ -24489,14 +23505,13 @@
24489 <summary> 23505 <summary>
24490 Serializes object 23506 Serializes object
24491 </summary> 23507 </summary>
24492 <returns> 23508 <returns><see cref="T:OpenMetaverse.StructuredData.OSDMap"/> serialized data</returns>
24493 <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> serialized data</returns>
24494 </member> 23509 </member>
24495 <member name="M:OpenMetaverse.Messages.Linden.BaseResourcesInfo.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23510 <member name="M:OpenMetaverse.Messages.Linden.BaseResourcesInfo.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24496 <summary> 23511 <summary>
24497 Deserializes object from OSD 23512 Deserializes object from OSD
24498 </summary> 23513 </summary>
24499 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23514 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24500 </member> 23515 </member>
24501 <member name="T:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage"> 23516 <member name="T:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage">
24502 <summary>Agent resource usage</summary> 23517 <summary>Agent resource usage</summary>
@@ -24508,21 +23523,20 @@
24508 <summary> 23523 <summary>
24509 Deserializes object from OSD 23524 Deserializes object from OSD
24510 </summary> 23525 </summary>
24511 <param name="osd">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23526 <param name="osd">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24512 </member> 23527 </member>
24513 <member name="M:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage.FromOSD(OpenMetaverse.StructuredData.OSD)"> 23528 <member name="M:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage.FromOSD(OpenMetaverse.StructuredData.OSD)">
24514 <summary> 23529 <summary>
24515 Makes an instance based on deserialized data 23530 Makes an instance based on deserialized data
24516 </summary> 23531 </summary>
24517 <param name="osd"> 23532 <param name="osd"><see cref="T:OpenMetaverse.StructuredData.OSD"/> serialized data</param>
24518 <see cref="T:OpenMetaverse.StructuredData.OSD" /> serialized data</param>
24519 <returns>Instance containg deserialized data</returns> 23533 <returns>Instance containg deserialized data</returns>
24520 </member> 23534 </member>
24521 <member name="M:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage.GetMessageHandler(OpenMetaverse.StructuredData.OSDMap)"> 23535 <member name="M:OpenMetaverse.Messages.Linden.AttachmentResourcesMessage.GetMessageHandler(OpenMetaverse.StructuredData.OSDMap)">
24522 <summary> 23536 <summary>
24523 Detects which class handles deserialization of this message 23537 Detects which class handles deserialization of this message
24524 </summary> 23538 </summary>
24525 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23539 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24526 <returns>Object capable of decoding this message</returns> 23540 <returns>Object capable of decoding this message</returns>
24527 </member> 23541 </member>
24528 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesRequest"> 23542 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesRequest">
@@ -24535,14 +23549,13 @@
24535 <summary> 23549 <summary>
24536 Serializes object 23550 Serializes object
24537 </summary> 23551 </summary>
24538 <returns> 23552 <returns><see cref="T:OpenMetaverse.StructuredData.OSDMap"/> serialized data</returns>
24539 <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> serialized data</returns>
24540 </member> 23553 </member>
24541 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesRequest.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23554 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesRequest.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24542 <summary> 23555 <summary>
24543 Deserializes object from OSD 23556 Deserializes object from OSD
24544 </summary> 23557 </summary>
24545 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23558 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24546 </member> 23559 </member>
24547 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesMessage"> 23560 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesMessage">
24548 <summary>Response message for parcel resource usage</summary> 23561 <summary>Response message for parcel resource usage</summary>
@@ -24557,33 +23570,32 @@
24557 <summary> 23570 <summary>
24558 Serializes object 23571 Serializes object
24559 </summary> 23572 </summary>
24560 <returns> 23573 <returns><see cref="T:OpenMetaverse.StructuredData.OSDMap"/> serialized data</returns>
24561 <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> serialized data</returns>
24562 </member> 23574 </member>
24563 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23575 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesMessage.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24564 <summary> 23576 <summary>
24565 Deserializes object from OSD 23577 Deserializes object from OSD
24566 </summary> 23578 </summary>
24567 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23579 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24568 </member> 23580 </member>
24569 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesMessage.GetMessageHandler(OpenMetaverse.StructuredData.OSDMap)"> 23581 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesMessage.GetMessageHandler(OpenMetaverse.StructuredData.OSDMap)">
24570 <summary> 23582 <summary>
24571 Detects which class handles deserialization of this message 23583 Detects which class handles deserialization of this message
24572 </summary> 23584 </summary>
24573 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23585 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24574 <returns>Object capable of decoding this message</returns> 23586 <returns>Object capable of decoding this message</returns>
24575 </member> 23587 </member>
24576 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesInfo"> 23588 <member name="T:OpenMetaverse.Messages.Linden.LandResourcesInfo">
24577 <summary>Parcel resource usage</summary> 23589 <summary>Parcel resource usage</summary>
24578 </member> 23590 </member>
24579 <member name="F:OpenMetaverse.Messages.Linden.LandResourcesInfo.Parcels"> 23591 <member name="F:OpenMetaverse.Messages.Linden.LandResourcesInfo.Parcels">
24580 <summary>Array of <see cref="T:OpenMetaverse.Messages.Linden.ParcelResourcesDetail" /> containing per percal resource usage</summary> 23592 <summary>Array of <see cref="T:OpenMetaverse.Messages.Linden.ParcelResourcesDetail"/> containing per percal resource usage</summary>
24581 </member> 23593 </member>
24582 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesInfo.Deserialize(OpenMetaverse.StructuredData.OSDMap)"> 23594 <member name="M:OpenMetaverse.Messages.Linden.LandResourcesInfo.Deserialize(OpenMetaverse.StructuredData.OSDMap)">
24583 <summary> 23595 <summary>
24584 Deserializes object from OSD 23596 Deserializes object from OSD
24585 </summary> 23597 </summary>
24586 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> containing the data</param> 23598 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap"/> containing the data</param>
24587 </member> 23599 </member>
24588 <member name="T:OpenMetaverse.Messages.Linden.GetDisplayNamesMessage"> 23600 <member name="T:OpenMetaverse.Messages.Linden.GetDisplayNamesMessage">
24589 <summary> 23601 <summary>
@@ -24656,1767 +23668,2470 @@
24656 </summary> 23668 </summary>
24657 <returns>OSD containting the messaage</returns> 23669 <returns>OSD containting the messaage</returns>
24658 </member> 23670 </member>
24659 <member name="M:OpenMetaverse.Messages.MessageUtils.DecodeEvent(System.String,OpenMetaverse.StructuredData.OSDMap)"> 23671 <member name="F:OpenMetaverse.InventorySortOrder.ByName">
24660 <summary> 23672 <summary>Sort by name</summary>
24661 Return a decoded capabilities message as a strongly typed object
24662 </summary>
24663 <param name="eventName">A string containing the name of the capabilities message key</param>
24664 <param name="map">An <see cref="T:OpenMetaverse.StructuredData.OSDMap" /> to decode</param>
24665 <returns>A strongly typed object containing the decoded information from the capabilities message, or null
24666 if no existing Message object exists for the specified event</returns>
24667 </member> 23673 </member>
24668 <member name="T:OpenMetaverse.MediaPermission"> 23674 <member name="F:OpenMetaverse.InventorySortOrder.ByDate">
24669 <summary> 23675 <summary>Sort by date</summary>
24670 Permissions for control of object media
24671 </summary>
24672 </member> 23676 </member>
24673 <member name="T:OpenMetaverse.MediaControls"> 23677 <member name="F:OpenMetaverse.InventorySortOrder.FoldersByName">
24674 <summary> 23678 <summary>Sort folders by name, regardless of whether items are
24675 Style of cotrols that shold be displayed to the user 23679 sorted by name or date</summary>
24676 </summary>
24677 </member> 23680 </member>
24678 <member name="T:OpenMetaverse.MediaEntry"> 23681 <member name="F:OpenMetaverse.InventorySortOrder.SystemFoldersToTop">
23682 <summary>Place system folders at the top</summary>
23683 </member>
23684 <member name="T:OpenMetaverse.DeRezDestination">
24679 <summary> 23685 <summary>
24680 Class representing media data for a single face 23686 Possible destinations for DeRezObject request
24681 </summary> 23687 </summary>
24682 </member> 23688 </member>
24683 <member name="F:OpenMetaverse.MediaEntry.EnableAlterntiveImage"> 23689 <member name="F:OpenMetaverse.DeRezDestination.AgentInventorySave">
24684 <summary>Is display of the alternative image enabled</summary> 23690 <summary></summary>
24685 </member> 23691 </member>
24686 <member name="F:OpenMetaverse.MediaEntry.AutoLoop"> 23692 <member name="F:OpenMetaverse.DeRezDestination.AgentInventoryCopy">
24687 <summary>Should media auto loop</summary> 23693 <summary>Copy from in-world to agent inventory</summary>
24688 </member> 23694 </member>
24689 <member name="F:OpenMetaverse.MediaEntry.AutoPlay"> 23695 <member name="F:OpenMetaverse.DeRezDestination.TaskInventory">
24690 <summary>Shoule media be auto played</summary> 23696 <summary>Derez to TaskInventory</summary>
24691 </member> 23697 </member>
24692 <member name="F:OpenMetaverse.MediaEntry.AutoScale"> 23698 <member name="F:OpenMetaverse.DeRezDestination.Attachment">
24693 <summary>Auto scale media to prim face</summary> 23699 <summary></summary>
24694 </member> 23700 </member>
24695 <member name="F:OpenMetaverse.MediaEntry.AutoZoom"> 23701 <member name="F:OpenMetaverse.DeRezDestination.AgentInventoryTake">
24696 <summary>Should viewer automatically zoom in on the face when clicked</summary> 23702 <summary>Take Object</summary>
24697 </member> 23703 </member>
24698 <member name="F:OpenMetaverse.MediaEntry.InteractOnFirstClick"> 23704 <member name="F:OpenMetaverse.DeRezDestination.ForceToGodInventory">
24699 <summary>Should viewer interpret first click as interaction with the media 23705 <summary></summary>
24700 or when false should the first click be treated as zoom in commadn</summary>
24701 </member> 23706 </member>
24702 <member name="F:OpenMetaverse.MediaEntry.Controls"> 23707 <member name="F:OpenMetaverse.DeRezDestination.TrashFolder">
24703 <summary>Style of controls viewer should display when 23708 <summary>Delete Object</summary>
24704 viewer media on this face</summary>
24705 </member> 23709 </member>
24706 <member name="F:OpenMetaverse.MediaEntry.HomeURL"> 23710 <member name="F:OpenMetaverse.DeRezDestination.AttachmentToInventory">
24707 <summary>Starting URL for the media</summary> 23711 <summary>Put an avatar attachment into agent inventory</summary>
24708 </member> 23712 </member>
24709 <member name="F:OpenMetaverse.MediaEntry.CurrentURL"> 23713 <member name="F:OpenMetaverse.DeRezDestination.AttachmentExists">
24710 <summary>Currently navigated URL</summary> 23714 <summary></summary>
24711 </member> 23715 </member>
24712 <member name="F:OpenMetaverse.MediaEntry.Height"> 23716 <member name="F:OpenMetaverse.DeRezDestination.ReturnToOwner">
24713 <summary>Media height in pixes</summary> 23717 <summary>Return an object back to the owner's inventory</summary>
24714 </member> 23718 </member>
24715 <member name="F:OpenMetaverse.MediaEntry.Width"> 23719 <member name="F:OpenMetaverse.DeRezDestination.ReturnToLastOwner">
24716 <summary>Media width in pixels</summary> 23720 <summary>Return a deeded object back to the last owner's inventory</summary>
24717 </member> 23721 </member>
24718 <member name="F:OpenMetaverse.MediaEntry.ControlPermissions"> 23722 <member name="T:OpenMetaverse.InventoryItemFlags">
24719 <summary>Who can controls the media</summary> 23723 <summary>
23724 Upper half of the Flags field for inventory items
23725 </summary>
24720 </member> 23726 </member>
24721 <member name="F:OpenMetaverse.MediaEntry.InteractPermissions"> 23727 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectSlamPerm">
24722 <summary>Who can interact with the media</summary> 23728 <summary>Indicates that the NextOwner permission will be set to the
23729 most restrictive set of permissions found in the object set
23730 (including linkset items and object inventory items) on next rez</summary>
24723 </member> 23731 </member>
24724 <member name="F:OpenMetaverse.MediaEntry.EnableWhiteList"> 23732 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectSlamSale">
24725 <summary>Is URL whitelist enabled</summary> 23733 <summary>Indicates that the object sale information has been
23734 changed</summary>
24726 </member> 23735 </member>
24727 <member name="F:OpenMetaverse.MediaEntry.WhiteList"> 23736 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteBase">
24728 <summary>Array of URLs that are whitelisted</summary> 23737 <summary>If set, and a slam bit is set, indicates BaseMask will be overwritten on Rez</summary>
24729 </member> 23738 </member>
24730 <member name="M:OpenMetaverse.MediaEntry.GetOSD"> 23739 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteOwner">
24731 <summary> 23740 <summary>If set, and a slam bit is set, indicates OwnerMask will be overwritten on Rez</summary>
24732 Serialize to OSD
24733 </summary>
24734 <returns>OSDMap with the serialized data</returns>
24735 </member> 23741 </member>
24736 <member name="M:OpenMetaverse.MediaEntry.FromOSD(OpenMetaverse.StructuredData.OSD)"> 23742 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteGroup">
23743 <summary>If set, and a slam bit is set, indicates GroupMask will be overwritten on Rez</summary>
23744 </member>
23745 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteEveryone">
23746 <summary>If set, and a slam bit is set, indicates EveryoneMask will be overwritten on Rez</summary>
23747 </member>
23748 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectOverwriteNextOwner">
23749 <summary>If set, and a slam bit is set, indicates NextOwnerMask will be overwritten on Rez</summary>
23750 </member>
23751 <member name="F:OpenMetaverse.InventoryItemFlags.ObjectHasMultipleItems">
23752 <summary>Indicates whether this object is composed of multiple
23753 items or not</summary>
23754 </member>
23755 <member name="F:OpenMetaverse.InventoryItemFlags.SharedSingleReference">
23756 <summary>Indicates that the asset is only referenced by this
23757 inventory item. If this item is deleted or updated to reference a
23758 new assetID, the asset can be deleted</summary>
23759 </member>
23760 <member name="T:OpenMetaverse.InventoryBase">
24737 <summary> 23761 <summary>
24738 Deserialize from OSD data 23762 Base Class for Inventory Items
24739 </summary> 23763 </summary>
24740 <param name="osd">Serialized OSD data</param>
24741 <returns>Deserialized object</returns>
24742 </member> 23764 </member>
24743 <member name="T:OpenMetaverse.Primitive"> 23765 <member name="F:OpenMetaverse.InventoryBase.UUID">
23766 <summary><seealso cref="T:OpenMetaverse.UUID"/> of item/folder</summary>
23767 </member>
23768 <member name="F:OpenMetaverse.InventoryBase.ParentUUID">
23769 <summary><seealso cref="T:OpenMetaverse.UUID"/> of parent folder</summary>
23770 </member>
23771 <member name="F:OpenMetaverse.InventoryBase.Name">
23772 <summary>Name of item/folder</summary>
23773 </member>
23774 <member name="F:OpenMetaverse.InventoryBase.OwnerID">
23775 <summary>Item/Folder Owners <seealso cref="T:OpenMetaverse.UUID"/></summary>
23776 </member>
23777 <member name="M:OpenMetaverse.InventoryBase.#ctor(OpenMetaverse.UUID)">
24744 <summary> 23778 <summary>
24745 Particle system specific enumerators, flags and methods. 23779 Constructor, takes an itemID as a parameter
24746 </summary> 23780 </summary>
23781 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the item</param>
24747 </member> 23782 </member>
24748 <member name="M:OpenMetaverse.Primitive.#ctor"> 23783 <member name="M:OpenMetaverse.InventoryBase.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
24749 <summary> 23784 <summary>
24750 Default constructor 23785
24751 </summary> 23786 </summary>
23787 <returns></returns>
24752 </member> 23788 </member>
24753 <member name="T:OpenMetaverse.Primitive.ParticleSystem"> 23789 <member name="M:OpenMetaverse.InventoryBase.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
24754 <summary> 23790 <summary>
24755 Complete structure for the particle system 23791
24756 </summary> 23792 </summary>
23793 <returns></returns>
24757 </member> 23794 </member>
24758 <member name="M:OpenMetaverse.Primitive.ParticleSystem.#ctor(System.Byte[],System.Int32)"> 23795 <member name="M:OpenMetaverse.InventoryBase.GetHashCode">
24759 <summary> 23796 <summary>
24760 Decodes a byte[] array into a ParticleSystem Object 23797 Generates a number corresponding to the value of the object to support the use of a hash table,
23798 suitable for use in hashing algorithms and data structures such as a hash table
24761 </summary> 23799 </summary>
24762 <param name="data">ParticleSystem object</param> 23800 <returns>A Hashcode of all the combined InventoryBase fields</returns>
24763 <param name="pos">Start position for BitPacker</param>
24764 </member> 23801 </member>
24765 <member name="T:OpenMetaverse.Primitive.ParticleSystem.SourcePattern"> 23802 <member name="M:OpenMetaverse.InventoryBase.Equals(System.Object)">
24766 <summary> 23803 <summary>
24767 Particle source pattern 23804 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase"/> object is equal to the current object
24768 </summary> 23805 </summary>
23806 <param name="o">InventoryBase object to compare against</param>
23807 <returns>true if objects are the same</returns>
24769 </member> 23808 </member>
24770 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.None"> 23809 <member name="M:OpenMetaverse.InventoryBase.Equals(OpenMetaverse.InventoryBase)">
24771 <summary>None</summary>
24772 </member>
24773 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Drop">
24774 <summary>Drop particles from source position with no force</summary>
24775 </member>
24776 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Explode">
24777 <summary>"Explode" particles in all directions</summary>
24778 </member>
24779 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.Angle">
24780 <summary>Particles shoot across a 2D area</summary>
24781 </member>
24782 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.AngleCone">
24783 <summary>Particles shoot across a 3D Cone</summary>
24784 </member>
24785 <member name="F:OpenMetaverse.Primitive.ParticleSystem.SourcePattern.AngleConeEmpty">
24786 <summary>Inverse of AngleCone (shoot particles everywhere except the 3D cone defined</summary>
24787 </member>
24788 <member name="T:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags">
24789 <summary> 23810 <summary>
24790 Particle Data Flags 23811 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase"/> object is equal to the current object
24791 </summary> 23812 </summary>
23813 <param name="o">InventoryBase object to compare against</param>
23814 <returns>true if objects are the same</returns>
24792 </member> 23815 </member>
24793 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.None"> 23816 <member name="M:OpenMetaverse.InventoryBase.GetOSD">
24794 <summary>None</summary>
24795 </member>
24796 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.InterpColor">
24797 <summary>Interpolate color and alpha from start to end</summary>
24798 </member>
24799 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.InterpScale">
24800 <summary>Interpolate scale from start to end</summary>
24801 </member>
24802 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Bounce">
24803 <summary>Bounce particles off particle sources Z height</summary>
24804 </member>
24805 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Wind">
24806 <summary>velocity of particles is dampened toward the simulators wind</summary>
24807 </member>
24808 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.FollowSrc">
24809 <summary>Particles follow the source</summary>
24810 </member>
24811 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.FollowVelocity">
24812 <summary>Particles point towards the direction of source's velocity</summary>
24813 </member>
24814 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.TargetPos">
24815 <summary>Target of the particles</summary>
24816 </member>
24817 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.TargetLinear">
24818 <summary>Particles are sent in a straight line</summary>
24819 </member>
24820 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Emissive">
24821 <summary>Particles emit a glow</summary>
24822 </member>
24823 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleDataFlags.Beam">
24824 <summary>used for point/grab/touch</summary>
24825 </member>
24826 <member name="T:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags">
24827 <summary> 23817 <summary>
24828 Particle Flags Enum 23818 Convert inventory to OSD
24829 </summary> 23819 </summary>
23820 <returns>OSD representation</returns>
24830 </member> 23821 </member>
24831 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.None"> 23822 <member name="T:OpenMetaverse.InventoryItem">
24832 <summary>None</summary>
24833 </member>
24834 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.ObjectRelative">
24835 <summary>Acceleration and velocity for particles are
24836 relative to the object rotation</summary>
24837 </member>
24838 <member name="F:OpenMetaverse.Primitive.ParticleSystem.ParticleFlags.UseNewAngle">
24839 <summary>Particles use new 'correct' angle parameters</summary>
24840 </member>
24841 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartFlags">
24842 <summary>Particle Flags</summary>
24843 <remarks>There appears to be more data packed in to this area
24844 for many particle systems. It doesn't appear to be flag values
24845 and serialization breaks unless there is a flag for every
24846 possible bit so it is left as an unsigned integer</remarks>
24847 </member>
24848 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Pattern">
24849 <summary> 23823 <summary>
24850 <seealso cref="T:SourcePattern" /> pattern of particles</summary> 23824 An Item in Inventory
24851 </member> 23825 </summary>
24852 <member name="F:OpenMetaverse.Primitive.ParticleSystem.MaxAge">
24853 <summary>A <see langword="float" /> representing the maximimum age (in seconds) particle will be displayed</summary>
24854 <remarks>Maximum value is 30 seconds</remarks>
24855 </member>
24856 <member name="F:OpenMetaverse.Primitive.ParticleSystem.StartAge">
24857 <summary>A <see langword="float" /> representing the number of seconds,
24858 from when the particle source comes into view,
24859 or the particle system's creation, that the object will emits particles;
24860 after this time period no more particles are emitted</summary>
24861 </member>
24862 <member name="F:OpenMetaverse.Primitive.ParticleSystem.InnerAngle">
24863 <summary>A <see langword="float" /> in radians that specifies where particles will not be created</summary>
24864 </member>
24865 <member name="F:OpenMetaverse.Primitive.ParticleSystem.OuterAngle">
24866 <summary>A <see langword="float" /> in radians that specifies where particles will be created</summary>
24867 </member>
24868 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstRate">
24869 <summary>A <see langword="float" /> representing the number of seconds between burts.</summary>
24870 </member>
24871 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstRadius">
24872 <summary>A <see langword="float" /> representing the number of meters
24873 around the center of the source where particles will be created.</summary>
24874 </member>
24875 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstSpeedMin">
24876 <summary>A <see langword="float" /> representing in seconds, the minimum speed between bursts of new particles
24877 being emitted</summary>
24878 </member>
24879 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstSpeedMax">
24880 <summary>A <see langword="float" /> representing in seconds the maximum speed of new particles being emitted.</summary>
24881 </member>
24882 <member name="F:OpenMetaverse.Primitive.ParticleSystem.BurstPartCount">
24883 <summary>A <see langword="byte" /> representing the maximum number of particles emitted per burst</summary>
24884 </member> 23826 </member>
24885 <member name="F:OpenMetaverse.Primitive.ParticleSystem.AngularVelocity"> 23827 <member name="F:OpenMetaverse.InventoryItem.AssetUUID">
24886 <summary>A <see cref="T:Vector3" /> which represents the velocity (speed) from the source which particles are emitted</summary> 23828 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of this item</summary>
24887 </member> 23829 </member>
24888 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartAcceleration"> 23830 <member name="F:OpenMetaverse.InventoryItem.Permissions">
24889 <summary>A <see cref="T:Vector3" /> which represents the Acceleration from the source which particles are emitted</summary> 23831 <summary>The combined <seealso cref="T:OpenMetaverse.Permissions"/> of this item</summary>
24890 </member> 23832 </member>
24891 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Texture"> 23833 <member name="F:OpenMetaverse.InventoryItem.AssetType">
24892 <summary>The <see cref="T:UUID" /> Key of the texture displayed on the particle</summary> 23834 <summary>The type of item from <seealso cref="T:OpenMetaverse.AssetType"/></summary>
24893 </member> 23835 </member>
24894 <member name="F:OpenMetaverse.Primitive.ParticleSystem.Target"> 23836 <member name="F:OpenMetaverse.InventoryItem.InventoryType">
24895 <summary>The <see cref="T:UUID" /> Key of the specified target object or avatar particles will follow</summary> 23837 <summary>The type of item from the <seealso cref="T:OpenMetaverse.InventoryType"/> enum</summary>
24896 </member> 23838 </member>
24897 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartDataFlags"> 23839 <member name="F:OpenMetaverse.InventoryItem.CreatorID">
24898 <summary>Flags of particle from <seealso cref="T:ParticleDataFlags" /></summary> 23840 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the creator of this item</summary>
24899 </member> 23841 </member>
24900 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartMaxAge"> 23842 <member name="F:OpenMetaverse.InventoryItem.Description">
24901 <summary>Max Age particle system will emit particles for</summary> 23843 <summary>A Description of this item</summary>
24902 </member> 23844 </member>
24903 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartColor"> 23845 <member name="F:OpenMetaverse.InventoryItem.GroupID">
24904 <summary>The <see cref="T:Color4" /> the particle has at the beginning of its lifecycle</summary> 23846 <summary>The <seealso cref="T:OpenMetaverse.Group"/>s <seealso cref="T:OpenMetaverse.UUID"/> this item is set to or owned by</summary>
24905 </member> 23847 </member>
24906 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndColor"> 23848 <member name="F:OpenMetaverse.InventoryItem.GroupOwned">
24907 <summary>The <see cref="T:Color4" /> the particle has at the ending of its lifecycle</summary> 23849 <summary>If true, item is owned by a group</summary>
24908 </member> 23850 </member>
24909 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartScaleX"> 23851 <member name="F:OpenMetaverse.InventoryItem.SalePrice">
24910 <summary>A <see langword="float" /> that represents the starting X size of the particle</summary> 23852 <summary>The price this item can be purchased for</summary>
24911 <remarks>Minimum value is 0, maximum value is 4</remarks>
24912 </member> 23853 </member>
24913 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartStartScaleY"> 23854 <member name="F:OpenMetaverse.InventoryItem.SaleType">
24914 <summary>A <see langword="float" /> that represents the starting Y size of the particle</summary> 23855 <summary>The type of sale from the <seealso cref="T:OpenMetaverse.SaleType"/> enum</summary>
24915 <remarks>Minimum value is 0, maximum value is 4</remarks>
24916 </member> 23856 </member>
24917 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndScaleX"> 23857 <member name="F:OpenMetaverse.InventoryItem.Flags">
24918 <summary>A <see langword="float" /> that represents the ending X size of the particle</summary> 23858 <summary>Combined flags from <seealso cref="T:OpenMetaverse.InventoryItemFlags"/></summary>
24919 <remarks>Minimum value is 0, maximum value is 4</remarks>
24920 </member> 23859 </member>
24921 <member name="F:OpenMetaverse.Primitive.ParticleSystem.PartEndScaleY"> 23860 <member name="F:OpenMetaverse.InventoryItem.CreationDate">
24922 <summary>A <see langword="float" /> that represents the ending Y size of the particle</summary> 23861 <summary>Time and date this inventory item was created, stored as
24923 <remarks>Minimum value is 0, maximum value is 4</remarks> 23862 UTC (Coordinated Universal Time)</summary>
24924 </member> 23863 </member>
24925 <member name="M:OpenMetaverse.Primitive.ParticleSystem.GetBytes"> 23864 <member name="F:OpenMetaverse.InventoryItem.TransactionID">
24926 <summary> 23865 <summary>Used to update the AssetID in requests sent to the server</summary>
24927 Generate byte[] array from particle data
24928 </summary>
24929 <returns>Byte array</returns>
24930 </member> 23866 </member>
24931 <member name="T:OpenMetaverse.Primitive.ConstructionData"> 23867 <member name="F:OpenMetaverse.InventoryItem.LastOwnerID">
24932 <summary> 23868 <summary>The <seealso cref="T:OpenMetaverse.UUID"/> of the previous owner of the item</summary>
24933 Parameters used to construct a visual representation of a primitive
24934 </summary>
24935 </member> 23869 </member>
24936 <member name="F:OpenMetaverse.Primitive.ConstructionData.profileCurve"> 23870 <member name="M:OpenMetaverse.InventoryItem.#ctor(OpenMetaverse.UUID)">
24937 <summary> 23871 <summary>
23872 Construct a new InventoryItem object
24938 </summary> 23873 </summary>
23874 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the item</param>
24939 </member> 23875 </member>
24940 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathCurve"> 23876 <member name="M:OpenMetaverse.InventoryItem.#ctor(OpenMetaverse.InventoryType,OpenMetaverse.UUID)">
24941 <summary> 23877 <summary>
23878 Construct a new InventoryItem object of a specific Type
24942 </summary> 23879 </summary>
23880 <param name="type">The type of item from <seealso cref="T:OpenMetaverse.InventoryType"/></param>
23881 <param name="itemID"><seealso cref="T:OpenMetaverse.UUID"/> of the item</param>
24943 </member> 23882 </member>
24944 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathEnd"> 23883 <member name="M:OpenMetaverse.InventoryItem.IsLink">
24945 <summary> 23884 <summary>
23885 Indicates inventory item is a link
24946 </summary> 23886 </summary>
23887 <returns>True if inventory item is a link to another inventory item</returns>
24947 </member> 23888 </member>
24948 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathRadiusOffset"> 23889 <member name="M:OpenMetaverse.InventoryItem.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
24949 <summary> 23890 <summary>
23891
24950 </summary> 23892 </summary>
23893 <returns></returns>
24951 </member> 23894 </member>
24952 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathSkew"> 23895 <member name="M:OpenMetaverse.InventoryItem.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
24953 <summary> 23896 <summary>
23897
24954 </summary> 23898 </summary>
23899 <returns></returns>
24955 </member> 23900 </member>
24956 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathScaleX"> 23901 <member name="M:OpenMetaverse.InventoryItem.GetHashCode">
24957 <summary> 23902 <summary>
23903 Generates a number corresponding to the value of the object to support the use of a hash table.
23904 Suitable for use in hashing algorithms and data structures such as a hash table
24958 </summary> 23905 </summary>
23906 <returns>A Hashcode of all the combined InventoryItem fields</returns>
24959 </member> 23907 </member>
24960 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathScaleY"> 23908 <member name="M:OpenMetaverse.InventoryItem.Equals(System.Object)">
24961 <summary> 23909 <summary>
23910 Compares an object
24962 </summary> 23911 </summary>
23912 <param name="o">The object to compare</param>
23913 <returns>true if comparison object matches</returns>
24963 </member> 23914 </member>
24964 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathShearX"> 23915 <member name="M:OpenMetaverse.InventoryItem.Equals(OpenMetaverse.InventoryBase)">
24965 <summary> 23916 <summary>
23917 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryBase"/> object is equal to the current object
24966 </summary> 23918 </summary>
23919 <param name="o">The <seealso cref="T:OpenMetaverse.InventoryBase"/> object to compare against</param>
23920 <returns>true if objects are the same</returns>
24967 </member> 23921 </member>
24968 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathShearY"> 23922 <member name="M:OpenMetaverse.InventoryItem.Equals(OpenMetaverse.InventoryItem)">
24969 <summary> 23923 <summary>
23924 Determine whether the specified <seealso cref="T:OpenMetaverse.InventoryItem"/> object is equal to the current object
24970 </summary> 23925 </summary>
23926 <param name="o">The <seealso cref="T:OpenMetaverse.InventoryItem"/> object to compare against</param>
23927 <returns>true if objects are the same</returns>
24971 </member> 23928 </member>
24972 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTaperX"> 23929 <member name="M:OpenMetaverse.InventoryItem.FromOSD(OpenMetaverse.StructuredData.OSD)">
24973 <summary> 23930 <summary>
23931 Create InventoryItem from OSD
24974 </summary> 23932 </summary>
23933 <param name="data">OSD Data that makes up InventoryItem</param>
23934 <returns>Inventory item created</returns>
24975 </member> 23935 </member>
24976 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTaperY"> 23936 <member name="M:OpenMetaverse.InventoryItem.GetOSD">
24977 <summary> 23937 <summary>
23938 Convert InventoryItem to OSD
24978 </summary> 23939 </summary>
23940 <returns>OSD representation of InventoryItem</returns>
24979 </member> 23941 </member>
24980 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathBegin"> 23942 <member name="T:OpenMetaverse.InventoryTexture">
24981 <summary> 23943 <summary>
23944 InventoryTexture Class representing a graphical image
24982 </summary> 23945 </summary>
23946 <seealso cref="!:ManagedImage"/>
24983 </member> 23947 </member>
24984 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTwist"> 23948 <member name="M:OpenMetaverse.InventoryTexture.#ctor(OpenMetaverse.UUID)">
24985 <summary> 23949 <summary>
23950 Construct an InventoryTexture object
24986 </summary> 23951 </summary>
23952 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
23953 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
24987 </member> 23954 </member>
24988 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathTwistBegin"> 23955 <member name="M:OpenMetaverse.InventoryTexture.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
24989 <summary> 23956 <summary>
23957 Construct an InventoryTexture object from a serialization stream
24990 </summary> 23958 </summary>
24991 </member> 23959 </member>
24992 <member name="F:OpenMetaverse.Primitive.ConstructionData.PathRevolutions"> 23960 <member name="T:OpenMetaverse.InventorySound">
24993 <summary> 23961 <summary>
23962 InventorySound Class representing a playable sound
24994 </summary> 23963 </summary>
24995 </member> 23964 </member>
24996 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileBegin"> 23965 <member name="M:OpenMetaverse.InventorySound.#ctor(OpenMetaverse.UUID)">
24997 <summary> 23966 <summary>
23967 Construct an InventorySound object
24998 </summary> 23968 </summary>
23969 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
23970 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
24999 </member> 23971 </member>
25000 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileEnd"> 23972 <member name="M:OpenMetaverse.InventorySound.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25001 <summary> 23973 <summary>
23974 Construct an InventorySound object from a serialization stream
25002 </summary> 23975 </summary>
25003 </member> 23976 </member>
25004 <member name="F:OpenMetaverse.Primitive.ConstructionData.ProfileHollow"> 23977 <member name="T:OpenMetaverse.InventoryCallingCard">
25005 <summary> 23978 <summary>
23979 InventoryCallingCard Class, contains information on another avatar
25006 </summary> 23980 </summary>
25007 </member> 23981 </member>
25008 <member name="F:OpenMetaverse.Primitive.ConstructionData.Material"> 23982 <member name="M:OpenMetaverse.InventoryCallingCard.#ctor(OpenMetaverse.UUID)">
25009 <summary> 23983 <summary>
23984 Construct an InventoryCallingCard object
25010 </summary> 23985 </summary>
23986 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
23987 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25011 </member> 23988 </member>
25012 <member name="F:OpenMetaverse.Primitive.ConstructionData.State"> 23989 <member name="M:OpenMetaverse.InventoryCallingCard.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25013 <summary> 23990 <summary>
23991 Construct an InventoryCallingCard object from a serialization stream
25014 </summary> 23992 </summary>
25015 </member> 23993 </member>
25016 <member name="F:OpenMetaverse.Primitive.ConstructionData.PCode"> 23994 <member name="T:OpenMetaverse.InventoryLandmark">
25017 <summary> 23995 <summary>
23996 InventoryLandmark Class, contains details on a specific location
25018 </summary> 23997 </summary>
25019 </member> 23998 </member>
25020 <member name="P:OpenMetaverse.Primitive.ConstructionData.AttachmentPoint"> 23999 <member name="M:OpenMetaverse.InventoryLandmark.#ctor(OpenMetaverse.UUID)">
25021 <summary>Attachment point to an avatar</summary>
25022 </member>
25023 <member name="P:OpenMetaverse.Primitive.ConstructionData.ProfileCurve">
25024 <summary> 24000 <summary>
24001 Construct an InventoryLandmark object
25025 </summary> 24002 </summary>
24003 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24004 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25026 </member> 24005 </member>
25027 <member name="P:OpenMetaverse.Primitive.ConstructionData.ProfileHole"> 24006 <member name="M:OpenMetaverse.InventoryLandmark.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25028 <summary> 24007 <summary>
24008 Construct an InventoryLandmark object from a serialization stream
25029 </summary> 24009 </summary>
25030 </member> 24010 </member>
25031 <member name="P:OpenMetaverse.Primitive.ConstructionData.PathBeginScale"> 24011 <member name="P:OpenMetaverse.InventoryLandmark.LandmarkVisited">
25032 <summary> 24012 <summary>
24013 Landmarks use the InventoryItemFlags struct and will have a flag of 1 set if they have been visited
25033 </summary> 24014 </summary>
25034 </member> 24015 </member>
25035 <member name="P:OpenMetaverse.Primitive.ConstructionData.PathEndScale"> 24016 <member name="T:OpenMetaverse.InventoryObject">
25036 <summary> 24017 <summary>
24018 InventoryObject Class contains details on a primitive or coalesced set of primitives
25037 </summary> 24019 </summary>
25038 </member> 24020 </member>
25039 <member name="M:OpenMetaverse.Primitive.ConstructionData.GetHashCode"> 24021 <member name="M:OpenMetaverse.InventoryObject.#ctor(OpenMetaverse.UUID)">
25040 <summary> 24022 <summary>
25041 Calculdates hash code for prim construction data 24023 Construct an InventoryObject object
25042 </summary> 24024 </summary>
25043 <returns>The has</returns> 24025 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24026 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25044 </member> 24027 </member>
25045 <member name="T:OpenMetaverse.Primitive.FlexibleData"> 24028 <member name="M:OpenMetaverse.InventoryObject.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25046 <summary> 24029 <summary>
25047 Information on the flexible properties of a primitive 24030 Construct an InventoryObject object from a serialization stream
25048 </summary> 24031 </summary>
25049 </member> 24032 </member>
25050 <member name="M:OpenMetaverse.Primitive.FlexibleData.#ctor"> 24033 <member name="P:OpenMetaverse.InventoryObject.ItemFlags">
25051 <summary> 24034 <summary>
25052 Default constructor 24035 Gets or sets the upper byte of the Flags value
25053 </summary> 24036 </summary>
25054 </member> 24037 </member>
25055 <member name="M:OpenMetaverse.Primitive.FlexibleData.#ctor(System.Byte[],System.Int32)"> 24038 <member name="P:OpenMetaverse.InventoryObject.AttachPoint">
25056 <summary> 24039 <summary>
24040 Gets or sets the object attachment point, the lower byte of the Flags value
25057 </summary> 24041 </summary>
25058 <param name="data">
25059 </param>
25060 <param name="pos">
25061 </param>
25062 </member> 24042 </member>
25063 <member name="F:OpenMetaverse.Primitive.FlexibleData.Softness"> 24043 <member name="T:OpenMetaverse.InventoryNotecard">
25064 <summary> 24044 <summary>
24045 InventoryNotecard Class, contains details on an encoded text document
25065 </summary> 24046 </summary>
25066 </member> 24047 </member>
25067 <member name="F:OpenMetaverse.Primitive.FlexibleData.Gravity"> 24048 <member name="M:OpenMetaverse.InventoryNotecard.#ctor(OpenMetaverse.UUID)">
25068 <summary> 24049 <summary>
24050 Construct an InventoryNotecard object
25069 </summary> 24051 </summary>
24052 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24053 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25070 </member> 24054 </member>
25071 <member name="F:OpenMetaverse.Primitive.FlexibleData.Drag"> 24055 <member name="M:OpenMetaverse.InventoryNotecard.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25072 <summary> 24056 <summary>
24057 Construct an InventoryNotecard object from a serialization stream
25073 </summary> 24058 </summary>
25074 </member> 24059 </member>
25075 <member name="F:OpenMetaverse.Primitive.FlexibleData.Wind"> 24060 <member name="T:OpenMetaverse.InventoryCategory">
25076 <summary> 24061 <summary>
24062 InventoryCategory Class
25077 </summary> 24063 </summary>
24064 <remarks>TODO: Is this even used for anything?</remarks>
25078 </member> 24065 </member>
25079 <member name="F:OpenMetaverse.Primitive.FlexibleData.Tension"> 24066 <member name="M:OpenMetaverse.InventoryCategory.#ctor(OpenMetaverse.UUID)">
25080 <summary> 24067 <summary>
24068 Construct an InventoryCategory object
25081 </summary> 24069 </summary>
24070 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24071 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25082 </member> 24072 </member>
25083 <member name="F:OpenMetaverse.Primitive.FlexibleData.Force"> 24073 <member name="M:OpenMetaverse.InventoryCategory.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25084 <summary> 24074 <summary>
24075 Construct an InventoryCategory object from a serialization stream
25085 </summary> 24076 </summary>
25086 </member> 24077 </member>
25087 <member name="M:OpenMetaverse.Primitive.FlexibleData.GetBytes"> 24078 <member name="T:OpenMetaverse.InventoryLSL">
25088 <summary> 24079 <summary>
24080 InventoryLSL Class, represents a Linden Scripting Language object
25089 </summary> 24081 </summary>
25090 <returns>
25091 </returns>
25092 </member> 24082 </member>
25093 <member name="M:OpenMetaverse.Primitive.FlexibleData.GetOSD"> 24083 <member name="M:OpenMetaverse.InventoryLSL.#ctor(OpenMetaverse.UUID)">
25094 <summary> 24084 <summary>
24085 Construct an InventoryLSL object
25095 </summary> 24086 </summary>
25096 <returns> 24087 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
25097 </returns> 24088 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25098 </member> 24089 </member>
25099 <member name="T:OpenMetaverse.Primitive.LightData"> 24090 <member name="M:OpenMetaverse.InventoryLSL.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25100 <summary> 24091 <summary>
25101 Information on the light properties of a primitive 24092 Construct an InventoryLSL object from a serialization stream
25102 </summary> 24093 </summary>
25103 </member> 24094 </member>
25104 <member name="M:OpenMetaverse.Primitive.LightData.#ctor"> 24095 <member name="T:OpenMetaverse.InventorySnapshot">
25105 <summary> 24096 <summary>
25106 Default constructor 24097 InventorySnapshot Class, an image taken with the viewer
25107 </summary> 24098 </summary>
25108 </member> 24099 </member>
25109 <member name="M:OpenMetaverse.Primitive.LightData.#ctor(System.Byte[],System.Int32)"> 24100 <member name="M:OpenMetaverse.InventorySnapshot.#ctor(OpenMetaverse.UUID)">
25110 <summary> 24101 <summary>
24102 Construct an InventorySnapshot object
25111 </summary> 24103 </summary>
25112 <param name="data"> 24104 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
25113 </param> 24105 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25114 <param name="pos">
25115 </param>
25116 </member> 24106 </member>
25117 <member name="F:OpenMetaverse.Primitive.LightData.Color"> 24107 <member name="M:OpenMetaverse.InventorySnapshot.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25118 <summary> 24108 <summary>
24109 Construct an InventorySnapshot object from a serialization stream
25119 </summary> 24110 </summary>
25120 </member> 24111 </member>
25121 <member name="F:OpenMetaverse.Primitive.LightData.Intensity"> 24112 <member name="T:OpenMetaverse.InventoryAttachment">
25122 <summary> 24113 <summary>
24114 InventoryAttachment Class, contains details on an attachable object
25123 </summary> 24115 </summary>
25124 </member> 24116 </member>
25125 <member name="F:OpenMetaverse.Primitive.LightData.Radius"> 24117 <member name="M:OpenMetaverse.InventoryAttachment.#ctor(OpenMetaverse.UUID)">
25126 <summary> 24118 <summary>
24119 Construct an InventoryAttachment object
25127 </summary> 24120 </summary>
24121 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24122 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25128 </member> 24123 </member>
25129 <member name="F:OpenMetaverse.Primitive.LightData.Cutoff"> 24124 <member name="M:OpenMetaverse.InventoryAttachment.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25130 <summary> 24125 <summary>
24126 Construct an InventoryAttachment object from a serialization stream
25131 </summary> 24127 </summary>
25132 </member> 24128 </member>
25133 <member name="F:OpenMetaverse.Primitive.LightData.Falloff"> 24129 <member name="P:OpenMetaverse.InventoryAttachment.AttachmentPoint">
25134 <summary> 24130 <summary>
24131 Get the last AttachmentPoint this object was attached to
25135 </summary> 24132 </summary>
25136 </member> 24133 </member>
25137 <member name="M:OpenMetaverse.Primitive.LightData.GetBytes"> 24134 <member name="T:OpenMetaverse.InventoryWearable">
25138 <summary> 24135 <summary>
24136 InventoryWearable Class, details on a clothing item or body part
25139 </summary> 24137 </summary>
25140 <returns>
25141 </returns>
25142 </member> 24138 </member>
25143 <member name="M:OpenMetaverse.Primitive.LightData.ToString"> 24139 <member name="M:OpenMetaverse.InventoryWearable.#ctor(OpenMetaverse.UUID)">
25144 <summary> 24140 <summary>
24141 Construct an InventoryWearable object
25145 </summary> 24142 </summary>
25146 <returns> 24143 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
25147 </returns> 24144 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25148 </member> 24145 </member>
25149 <member name="T:OpenMetaverse.Primitive.SculptData"> 24146 <member name="M:OpenMetaverse.InventoryWearable.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25150 <summary> 24147 <summary>
25151 Information on the sculpt properties of a sculpted primitive 24148 Construct an InventoryWearable object from a serialization stream
25152 </summary> 24149 </summary>
25153 </member> 24150 </member>
25154 <member name="M:OpenMetaverse.Primitive.SculptData.#ctor"> 24151 <member name="P:OpenMetaverse.InventoryWearable.WearableType">
25155 <summary> 24152 <summary>
25156 Default constructor 24153 The <seealso cref="T:OpenMetaverse.WearableType"/>, Skin, Shape, Skirt, Etc
25157 </summary> 24154 </summary>
25158 </member> 24155 </member>
25159 <member name="M:OpenMetaverse.Primitive.SculptData.#ctor(System.Byte[],System.Int32)"> 24156 <member name="T:OpenMetaverse.InventoryAnimation">
25160 <summary> 24157 <summary>
24158 InventoryAnimation Class, A bvh encoded object which animates an avatar
25161 </summary> 24159 </summary>
25162 <param name="data">
25163 </param>
25164 <param name="pos">
25165 </param>
25166 </member> 24160 </member>
25167 <member name="P:OpenMetaverse.Primitive.SculptData.Invert"> 24161 <member name="M:OpenMetaverse.InventoryAnimation.#ctor(OpenMetaverse.UUID)">
25168 <summary> 24162 <summary>
25169 Render inside out (inverts the normals). 24163 Construct an InventoryAnimation object
25170 </summary> 24164 </summary>
24165 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24166 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25171 </member> 24167 </member>
25172 <member name="P:OpenMetaverse.Primitive.SculptData.Mirror"> 24168 <member name="M:OpenMetaverse.InventoryAnimation.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25173 <summary> 24169 <summary>
25174 Render an X axis mirror of the sculpty. 24170 Construct an InventoryAnimation object from a serialization stream
25175 </summary> 24171 </summary>
25176 </member> 24172 </member>
25177 <member name="T:OpenMetaverse.Primitive.ObjectProperties"> 24173 <member name="T:OpenMetaverse.InventoryGesture">
25178 <summary> 24174 <summary>
25179 Extended properties to describe an object 24175 InventoryGesture Class, details on a series of animations, sounds, and actions
25180 </summary> 24176 </summary>
25181 </member> 24177 </member>
25182 <member name="M:OpenMetaverse.Primitive.ObjectProperties.#ctor"> 24178 <member name="M:OpenMetaverse.InventoryGesture.#ctor(OpenMetaverse.UUID)">
25183 <summary> 24179 <summary>
25184 Default constructor 24180 Construct an InventoryGesture object
25185 </summary> 24181 </summary>
24182 <param name="itemID">A <seealso cref="T:OpenMetaverse.UUID"/> which becomes the
24183 <seealso cref="T:OpenMetaverse.InventoryItem"/> objects AssetUUID</param>
25186 </member> 24184 </member>
25187 <member name="F:OpenMetaverse.Primitive.ObjectProperties.ObjectID"> 24185 <member name="M:OpenMetaverse.InventoryGesture.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25188 <summary> 24186 <summary>
24187 Construct an InventoryGesture object from a serialization stream
25189 </summary> 24188 </summary>
25190 </member> 24189 </member>
25191 <member name="F:OpenMetaverse.Primitive.ObjectProperties.CreatorID"> 24190 <member name="T:OpenMetaverse.InventoryFolder">
25192 <summary> 24191 <summary>
24192 A folder contains <seealso cref="T:OpenMetaverse.InventoryItem"/>s and has certain attributes specific
24193 to itself
25193 </summary> 24194 </summary>
25194 </member> 24195 </member>
25195 <member name="F:OpenMetaverse.Primitive.ObjectProperties.OwnerID"> 24196 <member name="F:OpenMetaverse.InventoryFolder.PreferredType">
25196 <summary> 24197 <summary>The Preferred <seealso cref="T:OpenMetaverse.AssetType"/> for a folder.</summary>
25197 </summary>
25198 </member> 24198 </member>
25199 <member name="F:OpenMetaverse.Primitive.ObjectProperties.GroupID"> 24199 <member name="F:OpenMetaverse.InventoryFolder.Version">
25200 <summary> 24200 <summary>The Version of this folder</summary>
25201 </summary>
25202 </member> 24201 </member>
25203 <member name="F:OpenMetaverse.Primitive.ObjectProperties.CreationDate"> 24202 <member name="F:OpenMetaverse.InventoryFolder.DescendentCount">
25204 <summary> 24203 <summary>Number of child items this folder contains.</summary>
25205 </summary>
25206 </member> 24204 </member>
25207 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Permissions"> 24205 <member name="M:OpenMetaverse.InventoryFolder.#ctor(OpenMetaverse.UUID)">
25208 <summary> 24206 <summary>
24207 Constructor
25209 </summary> 24208 </summary>
24209 <param name="itemID">UUID of the folder</param>
25210 </member> 24210 </member>
25211 <member name="F:OpenMetaverse.Primitive.ObjectProperties.OwnershipCost"> 24211 <member name="M:OpenMetaverse.InventoryFolder.ToString">
25212 <summary> 24212 <summary>
24213
25213 </summary> 24214 </summary>
24215 <returns></returns>
25214 </member> 24216 </member>
25215 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SaleType"> 24217 <member name="M:OpenMetaverse.InventoryFolder.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25216 <summary> 24218 <summary>
24219 Get Serilization data for this InventoryFolder object
25217 </summary> 24220 </summary>
25218 </member> 24221 </member>
25219 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SalePrice"> 24222 <member name="M:OpenMetaverse.InventoryFolder.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
25220 <summary> 24223 <summary>
24224 Construct an InventoryFolder object from a serialization stream
25221 </summary> 24225 </summary>
25222 </member> 24226 </member>
25223 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePerms"> 24227 <member name="M:OpenMetaverse.InventoryFolder.GetHashCode">
25224 <summary> 24228 <summary>
24229
25225 </summary> 24230 </summary>
24231 <returns></returns>
25226 </member> 24232 </member>
25227 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePermTextures"> 24233 <member name="M:OpenMetaverse.InventoryFolder.Equals(System.Object)">
25228 <summary> 24234 <summary>
24235
25229 </summary> 24236 </summary>
24237 <param name="o"></param>
24238 <returns></returns>
25230 </member> 24239 </member>
25231 <member name="F:OpenMetaverse.Primitive.ObjectProperties.AggregatePermTexturesOwner"> 24240 <member name="M:OpenMetaverse.InventoryFolder.Equals(OpenMetaverse.InventoryBase)">
25232 <summary> 24241 <summary>
24242
25233 </summary> 24243 </summary>
24244 <param name="o"></param>
24245 <returns></returns>
25234 </member> 24246 </member>
25235 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Category"> 24247 <member name="M:OpenMetaverse.InventoryFolder.Equals(OpenMetaverse.InventoryFolder)">
25236 <summary> 24248 <summary>
24249
25237 </summary> 24250 </summary>
24251 <param name="o"></param>
24252 <returns></returns>
25238 </member> 24253 </member>
25239 <member name="F:OpenMetaverse.Primitive.ObjectProperties.InventorySerial"> 24254 <member name="M:OpenMetaverse.InventoryFolder.FromOSD(OpenMetaverse.StructuredData.OSD)">
25240 <summary> 24255 <summary>
24256 Create InventoryFolder from OSD
25241 </summary> 24257 </summary>
24258 <param name="data">OSD Data that makes up InventoryFolder</param>
24259 <returns>Inventory folder created</returns>
25242 </member> 24260 </member>
25243 <member name="F:OpenMetaverse.Primitive.ObjectProperties.ItemID"> 24261 <member name="M:OpenMetaverse.InventoryFolder.GetOSD">
25244 <summary> 24262 <summary>
24263 Convert InventoryItem to OSD
25245 </summary> 24264 </summary>
24265 <returns>OSD representation of InventoryItem</returns>
25246 </member> 24266 </member>
25247 <member name="F:OpenMetaverse.Primitive.ObjectProperties.FolderID"> 24267 <member name="T:OpenMetaverse.InventoryManager">
25248 <summary> 24268 <summary>
24269 Tools for dealing with agents inventory
25249 </summary> 24270 </summary>
25250 </member> 24271 </member>
25251 <member name="F:OpenMetaverse.Primitive.ObjectProperties.FromTaskID"> 24272 <member name="F:OpenMetaverse.InventoryManager.MAGIC_ID">
25252 <summary> 24273 <summary>Used for converting shadow_id to asset_id</summary>
25253 </summary>
25254 </member> 24274 </member>
25255 <member name="F:OpenMetaverse.Primitive.ObjectProperties.LastOwnerID"> 24275 <member name="F:OpenMetaverse.InventoryManager.m_ItemReceived">
25256 <summary> 24276 <summary>The event subscribers, null of no subscribers</summary>
25257 </summary>
25258 </member> 24277 </member>
25259 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Name"> 24278 <member name="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)">
25260 <summary> 24279 <summary>Raises the ItemReceived Event</summary>
25261 </summary> 24280 <param name="e">A ItemReceivedEventArgs object containing
24281 the data sent from the simulator</param>
25262 </member> 24282 </member>
25263 <member name="F:OpenMetaverse.Primitive.ObjectProperties.Description"> 24283 <member name="F:OpenMetaverse.InventoryManager.m_ItemReceivedLock">
25264 <summary> 24284 <summary>Thread sync lock object</summary>
25265 </summary>
25266 </member> 24285 </member>
25267 <member name="F:OpenMetaverse.Primitive.ObjectProperties.TouchName"> 24286 <member name="F:OpenMetaverse.InventoryManager.m_FolderUpdated">
25268 <summary> 24287 <summary>The event subscribers, null of no subscribers</summary>
25269 </summary>
25270 </member> 24288 </member>
25271 <member name="F:OpenMetaverse.Primitive.ObjectProperties.SitName"> 24289 <member name="M:OpenMetaverse.InventoryManager.OnFolderUpdated(OpenMetaverse.FolderUpdatedEventArgs)">
25272 <summary> 24290 <summary>Raises the FolderUpdated Event</summary>
25273 </summary> 24291 <param name="e">A FolderUpdatedEventArgs object containing
24292 the data sent from the simulator</param>
25274 </member> 24293 </member>
25275 <member name="F:OpenMetaverse.Primitive.ObjectProperties.TextureIDs"> 24294 <member name="F:OpenMetaverse.InventoryManager.m_FolderUpdatedLock">
25276 <summary> 24295 <summary>Thread sync lock object</summary>
25277 </summary>
25278 </member> 24296 </member>
25279 <member name="M:OpenMetaverse.Primitive.ObjectProperties.SetFamilyProperties(OpenMetaverse.Primitive.ObjectProperties)"> 24297 <member name="F:OpenMetaverse.InventoryManager.m_InventoryObjectOffered">
25280 <summary> 24298 <summary>The event subscribers, null of no subscribers</summary>
25281 Set the properties that are set in an ObjectPropertiesFamily packet
25282 </summary>
25283 <param name="props">
25284 <seealso cref="T:OpenMetaverse.Primitive.ObjectProperties" /> that has
25285 been partially filled by an ObjectPropertiesFamily packet</param>
25286 </member> 24299 </member>
25287 <member name="T:OpenMetaverse.Primitive.PhysicsProperties"> 24300 <member name="M:OpenMetaverse.InventoryManager.OnInventoryObjectOffered(OpenMetaverse.InventoryObjectOfferedEventArgs)">
25288 <summary> 24301 <summary>Raises the InventoryObjectOffered Event</summary>
25289 Describes physics attributes of the prim 24302 <param name="e">A InventoryObjectOfferedEventArgs object containing
25290 </summary> 24303 the data sent from the simulator</param>
25291 </member> 24304 </member>
25292 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.LocalID"> 24305 <member name="F:OpenMetaverse.InventoryManager.m_InventoryObjectOfferedLock">
25293 <summary>Primitive's local ID</summary> 24306 <summary>Thread sync lock object</summary>
25294 </member> 24307 </member>
25295 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Density"> 24308 <member name="F:OpenMetaverse.InventoryManager.m_TaskItemReceived">
25296 <summary>Density (1000 for normal density)</summary> 24309 <summary>The event subscribers, null of no subscribers</summary>
25297 </member> 24310 </member>
25298 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Friction"> 24311 <member name="M:OpenMetaverse.InventoryManager.OnTaskItemReceived(OpenMetaverse.TaskItemReceivedEventArgs)">
25299 <summary>Friction</summary> 24312 <summary>Raises the TaskItemReceived Event</summary>
24313 <param name="e">A TaskItemReceivedEventArgs object containing
24314 the data sent from the simulator</param>
25300 </member> 24315 </member>
25301 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.GravityMultiplier"> 24316 <member name="F:OpenMetaverse.InventoryManager.m_TaskItemReceivedLock">
25302 <summary>Gravity multiplier (1 for normal gravity) </summary> 24317 <summary>Thread sync lock object</summary>
25303 </member> 24318 </member>
25304 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.PhysicsShapeType"> 24319 <member name="F:OpenMetaverse.InventoryManager.m_FindObjectByPathReply">
25305 <summary>Type of physics representation of this primitive in the simulator</summary> 24320 <summary>The event subscribers, null of no subscribers</summary>
25306 </member> 24321 </member>
25307 <member name="F:OpenMetaverse.Primitive.PhysicsProperties.Restitution"> 24322 <member name="M:OpenMetaverse.InventoryManager.OnFindObjectByPathReply(OpenMetaverse.FindObjectByPathReplyEventArgs)">
25308 <summary>Restitution</summary> 24323 <summary>Raises the FindObjectByPath Event</summary>
24324 <param name="e">A FindObjectByPathEventArgs object containing
24325 the data sent from the simulator</param>
25309 </member> 24326 </member>
25310 <member name="M:OpenMetaverse.Primitive.PhysicsProperties.FromOSD(OpenMetaverse.StructuredData.OSD)"> 24327 <member name="F:OpenMetaverse.InventoryManager.m_FindObjectByPathReplyLock">
25311 <summary> 24328 <summary>Thread sync lock object</summary>
25312 Creates PhysicsProperties from OSD
25313 </summary>
25314 <param name="osd">OSDMap with incoming data</param>
25315 <returns>Deserialized PhysicsProperties object</returns>
25316 </member> 24329 </member>
25317 <member name="M:OpenMetaverse.Primitive.PhysicsProperties.GetOSD"> 24330 <member name="F:OpenMetaverse.InventoryManager.m_TaskInventoryReply">
25318 <summary> 24331 <summary>The event subscribers, null of no subscribers</summary>
25319 Serializes PhysicsProperties to OSD
25320 </summary>
25321 <returns>OSDMap with serialized PhysicsProperties data</returns>
25322 </member> 24332 </member>
25323 <member name="T:OpenMetaverse.Primitive.TextureAnimMode"> 24333 <member name="M:OpenMetaverse.InventoryManager.OnTaskInventoryReply(OpenMetaverse.TaskInventoryReplyEventArgs)">
25324 <summary> 24334 <summary>Raises the TaskInventoryReply Event</summary>
25325 Texture animation mode 24335 <param name="e">A TaskInventoryReplyEventArgs object containing
25326 </summary> 24336 the data sent from the simulator</param>
25327 </member> 24337 </member>
25328 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ANIM_OFF"> 24338 <member name="F:OpenMetaverse.InventoryManager.m_TaskInventoryReplyLock">
25329 <summary>Disable texture animation</summary> 24339 <summary>Thread sync lock object</summary>
25330 </member> 24340 </member>
25331 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ANIM_ON"> 24341 <member name="F:OpenMetaverse.InventoryManager.m_SaveAssetToInventory">
25332 <summary>Enable texture animation</summary> 24342 <summary>The event subscribers, null of no subscribers</summary>
25333 </member> 24343 </member>
25334 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.LOOP"> 24344 <member name="M:OpenMetaverse.InventoryManager.OnSaveAssetToInventory(OpenMetaverse.SaveAssetToInventoryEventArgs)">
25335 <summary>Loop when animating textures</summary> 24345 <summary>Raises the SaveAssetToInventory Event</summary>
24346 <param name="e">A SaveAssetToInventoryEventArgs object containing
24347 the data sent from the simulator</param>
25336 </member> 24348 </member>
25337 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.REVERSE"> 24349 <member name="F:OpenMetaverse.InventoryManager.m_SaveAssetToInventoryLock">
25338 <summary>Animate in reverse direction</summary> 24350 <summary>Thread sync lock object</summary>
25339 </member> 24351 </member>
25340 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.PING_PONG"> 24352 <member name="F:OpenMetaverse.InventoryManager.m_ScriptRunningReply">
25341 <summary>Animate forward then reverse</summary> 24353 <summary>The event subscribers, null of no subscribers</summary>
25342 </member> 24354 </member>
25343 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.SMOOTH"> 24355 <member name="M:OpenMetaverse.InventoryManager.OnScriptRunningReply(OpenMetaverse.ScriptRunningReplyEventArgs)">
25344 <summary>Slide texture smoothly instead of frame-stepping</summary> 24356 <summary>Raises the ScriptRunningReply Event</summary>
24357 <param name="e">A ScriptRunningReplyEventArgs object containing
24358 the data sent from the simulator</param>
25345 </member> 24359 </member>
25346 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.ROTATE"> 24360 <member name="F:OpenMetaverse.InventoryManager.m_ScriptRunningReplyLock">
25347 <summary>Rotate texture instead of using frames</summary> 24361 <summary>Thread sync lock object</summary>
25348 </member> 24362 </member>
25349 <member name="F:OpenMetaverse.Primitive.TextureAnimMode.SCALE"> 24363 <member name="F:OpenMetaverse.InventoryManager._NewFolderNames">
25350 <summary>Scale texture instead of using frames</summary> 24364 <summary>Partial mapping of AssetTypes to folder names</summary>
25351 </member> 24365 </member>
25352 <member name="T:OpenMetaverse.Primitive.TextureEntryFace"> 24366 <member name="M:OpenMetaverse.InventoryManager.#ctor(OpenMetaverse.GridClient)">
25353 <summary> 24367 <summary>
25354 A single textured face. Don't instantiate this class yourself, use the 24368 Default constructor
25355 methods in TextureEntry
25356 </summary> 24369 </summary>
24370 <param name="client">Reference to the GridClient object</param>
25357 </member> 24371 </member>
25358 <member name="M:OpenMetaverse.Primitive.TextureEntryFace.#ctor(OpenMetaverse.Primitive.TextureEntryFace)"> 24372 <member name="M:OpenMetaverse.InventoryManager.FetchItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Int32)">
25359 <summary> 24373 <summary>
25360 Contains the definition for individual faces 24374 Fetch an inventory item from the dataserver
25361 </summary> 24375 </summary>
25362 <param name="defaultTexture"> 24376 <param name="itemID">The items <seealso cref="T:OpenMetaverse.UUID"/></param>
25363 </param> 24377 <param name="ownerID">The item Owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24378 <param name="timeoutMS">a integer representing the number of milliseconds to wait for results</param>
24379 <returns>An <seealso cref="T:OpenMetaverse.InventoryItem"/> object on success, or null if no item was found</returns>
24380 <remarks>Items will also be sent to the <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)"/> event</remarks>
25364 </member> 24381 </member>
25365 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.material"> 24382 <member name="M:OpenMetaverse.InventoryManager.RequestFetchInventory(OpenMetaverse.UUID,OpenMetaverse.UUID)">
25366 <summary> 24383 <summary>
24384 Request A single inventory item
25367 </summary> 24385 </summary>
24386 <param name="itemID">The items <seealso cref="T:OpenMetaverse.UUID"/></param>
24387 <param name="ownerID">The item Owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24388 <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)"/>
25368 </member> 24389 </member>
25369 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.media"> 24390 <member name="M:OpenMetaverse.InventoryManager.RequestFetchInventory(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID})">
25370 <summary> 24391 <summary>
24392 Request inventory items
25371 </summary> 24393 </summary>
24394 <param name="itemIDs">Inventory items to request</param>
24395 <param name="ownerIDs">Owners of the inventory items</param>
24396 <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)"/>
25372 </member> 24397 </member>
25373 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RGBA"> 24398 <member name="M:OpenMetaverse.InventoryManager.RequestFetchInventoryCap(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID})">
25374 <summary> 24399 <summary>
24400 Request inventory items via Capabilities
25375 </summary> 24401 </summary>
24402 <param name="itemIDs">Inventory items to request</param>
24403 <param name="ownerIDs">Owners of the inventory items</param>
24404 <seealso cref="M:OpenMetaverse.InventoryManager.OnItemReceived(OpenMetaverse.ItemReceivedEventArgs)"/>
25376 </member> 24405 </member>
25377 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RepeatU"> 24406 <member name="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)">
25378 <summary> 24407 <summary>
24408 Get contents of a folder
25379 </summary> 24409 </summary>
24410 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID"/> of the folder to search</param>
24411 <param name="owner">The <seealso cref="T:OpenMetaverse.UUID"/> of the folders owner</param>
24412 <param name="folders">true to retrieve folders</param>
24413 <param name="items">true to retrieve items</param>
24414 <param name="order">sort order to return results in</param>
24415 <param name="timeoutMS">a integer representing the number of milliseconds to wait for results</param>
24416 <returns>A list of inventory items matching search criteria within folder</returns>
24417 <seealso cref="M:OpenMetaverse.InventoryManager.RequestFolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)"/>
24418 <remarks>InventoryFolder.DescendentCount will only be accurate if both folders and items are
24419 requested</remarks>
25380 </member> 24420 </member>
25381 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.RepeatV"> 24421 <member name="M:OpenMetaverse.InventoryManager.RequestFolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)">
25382 <summary> 24422 <summary>
24423 Request the contents of an inventory folder
25383 </summary> 24424 </summary>
24425 <param name="folder">The folder to search</param>
24426 <param name="owner">The folder owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24427 <param name="folders">true to return <seealso cref="!:InventoryManager.InventoryFolder"/>s contained in folder</param>
24428 <param name="items">true to return <seealso cref="!:InventoryManager.InventoryItem"/>s containd in folder</param>
24429 <param name="order">the sort order to return items in</param>
24430 <seealso cref="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)"/>
25384 </member> 24431 </member>
25385 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.OffsetU"> 24432 <member name="M:OpenMetaverse.InventoryManager.RequestFolderContentsCap(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder)">
25386 <summary> 24433 <summary>
24434 Request the contents of an inventory folder using HTTP capabilities
25387 </summary> 24435 </summary>
24436 <param name="folderID">The folder to search</param>
24437 <param name="ownerID">The folder owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24438 <param name="fetchFolders">true to return <seealso cref="!:InventoryManager.InventoryFolder"/>s contained in folder</param>
24439 <param name="fetchItems">true to return <seealso cref="!:InventoryManager.InventoryItem"/>s containd in folder</param>
24440 <param name="order">the sort order to return items in</param>
24441 <seealso cref="M:OpenMetaverse.InventoryManager.FolderContents(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventorySortOrder,System.Int32)"/>
25388 </member> 24442 </member>
25389 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.OffsetV"> 24443 <member name="M:OpenMetaverse.InventoryManager.FindFolderForType(OpenMetaverse.AssetType)">
25390 <summary> 24444 <summary>
24445 Returns the UUID of the folder (category) that defaults to
24446 containing 'type'. The folder is not necessarily only for that
24447 type
25391 </summary> 24448 </summary>
24449 <remarks>This will return the root folder if one does not exist</remarks>
24450 <param name="type"></param>
24451 <returns>The UUID of the desired folder if found, the UUID of the RootFolder
24452 if not found, or UUID.Zero on failure</returns>
25392 </member> 24453 </member>
25393 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Rotation"> 24454 <member name="M:OpenMetaverse.InventoryManager.FindObjectByPath(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.Int32)">
25394 <summary> 24455 <summary>
24456 Find an object in inventory using a specific path to search
25395 </summary> 24457 </summary>
24458 <param name="baseFolder">The folder to begin the search in</param>
24459 <param name="inventoryOwner">The object owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24460 <param name="path">A string path to search</param>
24461 <param name="timeoutMS">milliseconds to wait for a reply</param>
24462 <returns>Found items <seealso cref="T:OpenMetaverse.UUID"/> or <seealso cref="F:OpenMetaverse.UUID.Zero"/> if
24463 timeout occurs or item is not found</returns>
25396 </member> 24464 </member>
25397 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Glow"> 24465 <member name="M:OpenMetaverse.InventoryManager.RequestFindObjectByPath(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)">
25398 <summary> 24466 <summary>
24467 Find inventory items by path
25399 </summary> 24468 </summary>
24469 <param name="baseFolder">The folder to begin the search in</param>
24470 <param name="inventoryOwner">The object owners <seealso cref="T:OpenMetaverse.UUID"/></param>
24471 <param name="path">A string path to search, folders/objects separated by a '/'</param>
24472 <remarks>Results are sent to the <seealso cref="!:InventoryManager.OnFindObjectByPath"/> event</remarks>
25400 </member> 24473 </member>
25401 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.Bump"> 24474 <member name="M:OpenMetaverse.InventoryManager.LocalFind(OpenMetaverse.UUID,System.String[],System.Int32,System.Boolean)">
25402 <summary> 24475 <summary>
24476 Search inventory Store object for an item or folder
25403 </summary> 24477 </summary>
24478 <param name="baseFolder">The folder to begin the search in</param>
24479 <param name="path">An array which creates a path to search</param>
24480 <param name="level">Number of levels below baseFolder to conduct searches</param>
24481 <param name="firstOnly">if True, will stop searching after first match is found</param>
24482 <returns>A list of inventory items found</returns>
25404 </member> 24483 </member>
25405 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.MediaFlags"> 24484 <member name="M:OpenMetaverse.InventoryManager.Move(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryFolder)">
25406 <summary>In the future this will specify whether a webpage is
25407 attached to this face</summary>
25408 </member>
25409 <member name="P:OpenMetaverse.Primitive.TextureEntryFace.TextureID">
25410 <summary> 24485 <summary>
24486 Move an inventory item or folder to a new location
25411 </summary> 24487 </summary>
24488 <param name="item">The <seealso cref="T:InventoryBase"/> item or folder to move</param>
24489 <param name="newParent">The <seealso cref="T:InventoryFolder"/> to move item or folder to</param>
25412 </member> 24490 </member>
25413 <member name="M:OpenMetaverse.Primitive.TextureEntryFace.ToString"> 24491 <member name="M:OpenMetaverse.InventoryManager.Move(OpenMetaverse.InventoryBase,OpenMetaverse.InventoryFolder,System.String)">
25414 <summary> 24492 <summary>
24493 Move an inventory item or folder to a new location and change its name
25415 </summary> 24494 </summary>
25416 <returns> 24495 <param name="item">The <seealso cref="T:InventoryBase"/> item or folder to move</param>
25417 </returns> 24496 <param name="newParent">The <seealso cref="T:InventoryFolder"/> to move item or folder to</param>
24497 <param name="newName">The name to change the item or folder to</param>
25418 </member> 24498 </member>
25419 <member name="T:OpenMetaverse.Primitive.TextureEntry"> 24499 <member name="M:OpenMetaverse.InventoryManager.MoveFolder(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)">
25420 <summary> 24500 <summary>
25421 Represents all of the texturable faces for an object 24501 Move and rename a folder
25422 </summary> 24502 </summary>
25423 <remarks>Grid objects have infinite faces, with each face 24503 <param name="folderID">The source folders <seealso cref="T:OpenMetaverse.UUID"/></param>
25424 using the properties of the default face unless set otherwise. So if 24504 <param name="newparentID">The destination folders <seealso cref="T:OpenMetaverse.UUID"/></param>
25425 you have a TextureEntry with a default texture uuid of X, and face 18 24505 <param name="newName">The name to change the folder to</param>
25426 has a texture UUID of Y, every face would be textured with X except for
25427 face 18 that uses Y. In practice however, primitives utilize a maximum
25428 of nine faces</remarks>
25429 </member> 24506 </member>
25430 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(OpenMetaverse.UUID)"> 24507 <member name="M:OpenMetaverse.InventoryManager.UpdateFolderProperties(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType)">
25431 <summary> 24508 <summary>
25432 Constructor that takes a default texture UUID 24509 Update folder properties
25433 </summary> 24510 </summary>
25434 <param name="defaultTextureID">Texture UUID to use as the default texture</param> 24511 <param name="folderID"><seealso cref="T:OpenMetaverse.UUID"/> of the folder to update</param>
24512 <param name="parentID">Sets folder's parent to <seealso cref="T:OpenMetaverse.UUID"/></param>
24513 <param name="name">Folder name</param>
24514 <param name="type">Folder type</param>
25435 </member> 24515 </member>
25436 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(OpenMetaverse.Primitive.TextureEntryFace)"> 24516 <member name="M:OpenMetaverse.InventoryManager.MoveFolder(OpenMetaverse.UUID,OpenMetaverse.UUID)">
25437 <summary> 24517 <summary>
25438 Constructor that takes a <code>TextureEntryFace</code> for the 24518 Move a folder
25439 default face
25440 </summary> 24519 </summary>
25441 <param name="defaultFace">Face to use as the default face</param> 24520 <param name="folderID">The source folders <seealso cref="T:OpenMetaverse.UUID"/></param>
24521 <param name="newParentID">The destination folders <seealso cref="T:OpenMetaverse.UUID"/></param>
25442 </member> 24522 </member>
25443 <member name="M:OpenMetaverse.Primitive.TextureEntry.#ctor(System.Byte[],System.Int32,System.Int32)"> 24523 <member name="M:OpenMetaverse.InventoryManager.MoveFolders(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.UUID})">
25444 <summary> 24524 <summary>
25445 Constructor that creates the TextureEntry class from a byte array 24525 Move multiple folders, the keys in the Dictionary parameter,
24526 to a new parents, the value of that folder's key.
25446 </summary> 24527 </summary>
25447 <param name="data">Byte array containing the TextureEntry field</param> 24528 <param name="foldersNewParents">A Dictionary containing the
25448 <param name="pos">Starting position of the TextureEntry field in 24529 <seealso cref="T:OpenMetaverse.UUID"/> of the source as the key, and the
25449 the byte array</param> 24530 <seealso cref="T:OpenMetaverse.UUID"/> of the destination as the value</param>
25450 <param name="length">Length of the TextureEntry field, in bytes</param>
25451 </member> 24531 </member>
25452 <member name="F:OpenMetaverse.Primitive.TextureEntry.DefaultTexture"> 24532 <member name="M:OpenMetaverse.InventoryManager.MoveItem(OpenMetaverse.UUID,OpenMetaverse.UUID)">
25453 <summary> 24533 <summary>
24534 Move an inventory item to a new folder
25454 </summary> 24535 </summary>
24536 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the source item to move</param>
24537 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID"/> of the destination folder</param>
25455 </member> 24538 </member>
25456 <member name="F:OpenMetaverse.Primitive.TextureEntry.FaceTextures"> 24539 <member name="M:OpenMetaverse.InventoryManager.MoveItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String)">
25457 <summary> 24540 <summary>
24541 Move and rename an inventory item
25458 </summary> 24542 </summary>
24543 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the source item to move</param>
24544 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID"/> of the destination folder</param>
24545 <param name="newName">The name to change the folder to</param>
25459 </member> 24546 </member>
25460 <member name="M:OpenMetaverse.Primitive.TextureEntry.CreateFace(System.UInt32)"> 24547 <member name="M:OpenMetaverse.InventoryManager.MoveItems(System.Collections.Generic.Dictionary{OpenMetaverse.UUID,OpenMetaverse.UUID})">
25461 <summary> 24548 <summary>
25462 This will either create a new face if a custom face for the given 24549 Move multiple inventory items to new locations
25463 index is not defined, or return the custom face for that index if
25464 it already exists
25465 </summary> 24550 </summary>
25466 <param name="index">The index number of the face to create or 24551 <param name="itemsNewParents">A Dictionary containing the
25467 retrieve</param> 24552 <seealso cref="T:OpenMetaverse.UUID"/> of the source item as the key, and the
25468 <returns>A TextureEntryFace containing all the properties for that 24553 <seealso cref="T:OpenMetaverse.UUID"/> of the destination folder as the value</param>
25469 face</returns>
25470 </member> 24554 </member>
25471 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetFace(System.UInt32)"> 24555 <member name="M:OpenMetaverse.InventoryManager.RemoveDescendants(OpenMetaverse.UUID)">
25472 <summary> 24556 <summary>
24557 Remove descendants of a folder
25473 </summary> 24558 </summary>
25474 <param name="index"> 24559 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID"/> of the folder</param>
25475 </param>
25476 <returns>
25477 </returns>
25478 </member> 24560 </member>
25479 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetOSD"> 24561 <member name="M:OpenMetaverse.InventoryManager.RemoveItem(OpenMetaverse.UUID)">
25480 <summary> 24562 <summary>
24563 Remove a single item from inventory
25481 </summary> 24564 </summary>
25482 <returns> 24565 <param name="item">The <seealso cref="T:OpenMetaverse.UUID"/> of the inventory item to remove</param>
25483 </returns>
25484 </member> 24566 </member>
25485 <member name="M:OpenMetaverse.Primitive.TextureEntry.GetBytes"> 24567 <member name="M:OpenMetaverse.InventoryManager.RemoveFolder(OpenMetaverse.UUID)">
25486 <summary> 24568 <summary>
24569 Remove a folder from inventory
25487 </summary> 24570 </summary>
25488 <returns> 24571 <param name="folder">The <seealso cref="T:OpenMetaverse.UUID"/> of the folder to remove</param>
25489 </returns>
25490 </member> 24572 </member>
25491 <member name="M:OpenMetaverse.Primitive.TextureEntry.ToString"> 24573 <member name="M:OpenMetaverse.InventoryManager.Remove(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID})">
25492 <summary> 24574 <summary>
24575 Remove multiple items or folders from inventory
25493 </summary> 24576 </summary>
25494 <returns> 24577 <param name="items">A List containing the <seealso cref="T:OpenMetaverse.UUID"/>s of items to remove</param>
25495 </returns> 24578 <param name="folders">A List containing the <seealso cref="T:OpenMetaverse.UUID"/>s of the folders to remove</param>
25496 </member> 24579 </member>
25497 <member name="T:OpenMetaverse.Primitive.TextureAnimation"> 24580 <member name="M:OpenMetaverse.InventoryManager.EmptyLostAndFound">
25498 <summary> 24581 <summary>
25499 Controls the texture animation of a particular prim 24582 Empty the Lost and Found folder
25500 </summary> 24583 </summary>
25501 </member> 24584 </member>
25502 <member name="M:OpenMetaverse.Primitive.TextureAnimation.#ctor(System.Byte[],System.Int32)"> 24585 <member name="M:OpenMetaverse.InventoryManager.EmptyTrash">
25503 <summary> 24586 <summary>
24587 Empty the Trash folder
25504 </summary> 24588 </summary>
25505 <param name="data">
25506 </param>
25507 <param name="pos">
25508 </param>
25509 </member> 24589 </member>
25510 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Flags"> 24590 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItem(OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,OpenMetaverse.InventoryType,OpenMetaverse.PermissionMask,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25511 <summary> 24591 <summary>
24592
25512 </summary> 24593 </summary>
24594 <param name="parentFolder"></param>
24595 <param name="name"></param>
24596 <param name="description"></param>
24597 <param name="type"></param>
24598 <param name="assetTransactionID">Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here.</param>
24599 <param name="invType"></param>
24600 <param name="nextOwnerMask"></param>
24601 <param name="callback"></param>
25513 </member> 24602 </member>
25514 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Face"> 24603 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItem(OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,OpenMetaverse.InventoryType,OpenMetaverse.WearableType,OpenMetaverse.PermissionMask,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25515 <summary> 24604 <summary>
24605
25516 </summary> 24606 </summary>
24607 <param name="parentFolder"></param>
24608 <param name="name"></param>
24609 <param name="description"></param>
24610 <param name="type"></param>
24611 <param name="assetTransactionID">Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here.</param>
24612 <param name="invType"></param>
24613 <param name="wearableType"></param>
24614 <param name="nextOwnerMask"></param>
24615 <param name="callback"></param>
25517 </member> 24616 </member>
25518 <member name="F:OpenMetaverse.Primitive.TextureAnimation.SizeX"> 24617 <member name="M:OpenMetaverse.InventoryManager.CreateFolder(OpenMetaverse.UUID,System.String)">
25519 <summary> 24618 <summary>
24619 Creates a new inventory folder
25520 </summary> 24620 </summary>
24621 <param name="parentID">ID of the folder to put this folder in</param>
24622 <param name="name">Name of the folder to create</param>
24623 <returns>The UUID of the newly created folder</returns>
25521 </member> 24624 </member>
25522 <member name="F:OpenMetaverse.Primitive.TextureAnimation.SizeY"> 24625 <member name="M:OpenMetaverse.InventoryManager.CreateFolder(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType)">
25523 <summary> 24626 <summary>
24627 Creates a new inventory folder
25524 </summary> 24628 </summary>
24629 <param name="parentID">ID of the folder to put this folder in</param>
24630 <param name="name">Name of the folder to create</param>
24631 <param name="preferredType">Sets this folder as the default folder
24632 for new assets of the specified type. Use <code>AssetType.Unknown</code>
24633 to create a normal folder, otherwise it will likely create a
24634 duplicate of an existing folder type</param>
24635 <returns>The UUID of the newly created folder</returns>
24636 <remarks>If you specify a preferred type of <code>AsseType.Folder</code>
24637 it will create a new root folder which may likely cause all sorts
24638 of strange problems</remarks>
25525 </member> 24639 </member>
25526 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Start"> 24640 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItemFromAsset(System.Byte[],System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback)">
25527 <summary> 24641 <summary>
24642 Create an inventory item and upload asset data
25528 </summary> 24643 </summary>
24644 <param name="data">Asset data</param>
24645 <param name="name">Inventory item name</param>
24646 <param name="description">Inventory item description</param>
24647 <param name="assetType">Asset type</param>
24648 <param name="invType">Inventory type</param>
24649 <param name="folderID">Put newly created inventory in this folder</param>
24650 <param name="callback">Delegate that will receive feedback on success or failure</param>
25529 </member> 24651 </member>
25530 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Length"> 24652 <member name="M:OpenMetaverse.InventoryManager.RequestCreateItemFromAsset(System.Byte[],System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.Permissions,OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback)">
25531 <summary> 24653 <summary>
24654 Create an inventory item and upload asset data
25532 </summary> 24655 </summary>
24656 <param name="data">Asset data</param>
24657 <param name="name">Inventory item name</param>
24658 <param name="description">Inventory item description</param>
24659 <param name="assetType">Asset type</param>
24660 <param name="invType">Inventory type</param>
24661 <param name="folderID">Put newly created inventory in this folder</param>
24662 <param name="permissions">Permission of the newly created item
24663 (EveryoneMask, GroupMask, and NextOwnerMask of Permissions struct are supported)</param>
24664 <param name="callback">Delegate that will receive feedback on success or failure</param>
25533 </member> 24665 </member>
25534 <member name="F:OpenMetaverse.Primitive.TextureAnimation.Rate"> 24666 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryBase,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25535 <summary> 24667 <summary>
24668 Creates inventory link to another inventory item or folder
25536 </summary> 24669 </summary>
24670 <param name="folderID">Put newly created link in folder with this UUID</param>
24671 <param name="bse">Inventory item or folder</param>
24672 <param name="callback">Method to call upon creation of the link</param>
25537 </member> 24673 </member>
25538 <member name="M:OpenMetaverse.Primitive.TextureAnimation.GetBytes"> 24674 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryItem,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25539 <summary> 24675 <summary>
24676 Creates inventory link to another inventory item
25540 </summary> 24677 </summary>
25541 <returns> 24678 <param name="folderID">Put newly created link in folder with this UUID</param>
25542 </returns> 24679 <param name="item">Original inventory item</param>
24680 <param name="callback">Method to call upon creation of the link</param>
25543 </member> 24681 </member>
25544 <member name="F:OpenMetaverse.Primitive.MediaVersion"> 24682 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.InventoryFolder,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25545 <summary> 24683 <summary>
25546 Current version of the media data for the prim 24684 Creates inventory link to another inventory folder
25547 </summary> 24685 </summary>
24686 <param name="folderID">Put newly created link in folder with this UUID</param>
24687 <param name="folder">Original inventory folder</param>
24688 <param name="callback">Method to call upon creation of the link</param>
25548 </member> 24689 </member>
25549 <member name="F:OpenMetaverse.Primitive.FaceMedia"> 24690 <member name="M:OpenMetaverse.InventoryManager.CreateLink(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,System.String,OpenMetaverse.AssetType,OpenMetaverse.InventoryType,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCreatedCallback)">
25550 <summary> 24691 <summary>
25551 Array of media entries indexed by face number 24692 Creates inventory link to another inventory item or folder
25552 </summary> 24693 </summary>
24694 <param name="folderID">Put newly created link in folder with this UUID</param>
24695 <param name="itemID">Original item's UUID</param>
24696 <param name="name">Name</param>
24697 <param name="description">Description</param>
24698 <param name="assetType">Asset Type</param>
24699 <param name="invType">Inventory Type</param>
24700 <param name="transactionID">Transaction UUID</param>
24701 <param name="callback">Method to call upon creation of the link</param>
25553 </member> 24702 </member>
25554 <member name="F:OpenMetaverse.Primitive.ParticleSys"> 24703 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.InventoryManager.ItemCopiedCallback)">
25555 <summary> 24704 <summary>
24705
25556 </summary> 24706 </summary>
24707 <param name="item"></param>
24708 <param name="newParent"></param>
24709 <param name="newName"></param>
24710 <param name="callback"></param>
25557 </member> 24711 </member>
25558 <member name="F:OpenMetaverse.Primitive.ID"> 24712 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItem(OpenMetaverse.UUID,OpenMetaverse.UUID,System.String,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)">
25559 <summary> 24713 <summary>
24714
25560 </summary> 24715 </summary>
24716 <param name="item"></param>
24717 <param name="newParent"></param>
24718 <param name="newName"></param>
24719 <param name="oldOwnerID"></param>
24720 <param name="callback"></param>
25561 </member> 24721 </member>
25562 <member name="F:OpenMetaverse.Primitive.GroupID"> 24722 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItems(System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{OpenMetaverse.UUID},System.Collections.Generic.List{System.String},OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)">
25563 <summary> 24723 <summary>
24724
25564 </summary> 24725 </summary>
24726 <param name="items"></param>
24727 <param name="targetFolders"></param>
24728 <param name="newNames"></param>
24729 <param name="oldOwnerID"></param>
24730 <param name="callback"></param>
25565 </member> 24731 </member>
25566 <member name="F:OpenMetaverse.Primitive.LocalID"> 24732 <member name="M:OpenMetaverse.InventoryManager.RequestCopyItemFromNotecard(OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.ItemCopiedCallback)">
25567 <summary> 24733 <summary>
24734 Request a copy of an asset embedded within a notecard
25568 </summary> 24735 </summary>
24736 <param name="objectID">Usually UUID.Zero for copying an asset from a notecard</param>
24737 <param name="notecardID">UUID of the notecard to request an asset from</param>
24738 <param name="folderID">Target folder for asset to go to in your inventory</param>
24739 <param name="itemID">UUID of the embedded asset</param>
24740 <param name="callback">callback to run when item is copied to inventory</param>
25569 </member> 24741 </member>
25570 <member name="F:OpenMetaverse.Primitive.ParentID"> 24742 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItem(OpenMetaverse.InventoryItem)">
25571 <summary> 24743 <summary>
24744
25572 </summary> 24745 </summary>
24746 <param name="item"></param>
25573 </member> 24747 </member>
25574 <member name="F:OpenMetaverse.Primitive.RegionHandle"> 24748 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{OpenMetaverse.InventoryItem})">
25575 <summary> 24749 <summary>
24750
25576 </summary> 24751 </summary>
24752 <param name="items"></param>
25577 </member> 24753 </member>
25578 <member name="F:OpenMetaverse.Primitive.Flags"> 24754 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateItems(System.Collections.Generic.List{OpenMetaverse.InventoryItem},OpenMetaverse.UUID)">
25579 <summary> 24755 <summary>
24756
25580 </summary> 24757 </summary>
24758 <param name="items"></param>
24759 <param name="transactionID"></param>
25581 </member> 24760 </member>
25582 <member name="F:OpenMetaverse.Primitive.TreeSpecies"> 24761 <member name="M:OpenMetaverse.InventoryManager.RequestUploadNotecardAsset(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)">
25583 <summary>Foliage type for this primitive. Only applicable if this
25584 primitive is foliage</summary>
25585 </member>
25586 <member name="F:OpenMetaverse.Primitive.ScratchPad">
25587 <summary>Unknown</summary>
25588 </member>
25589 <member name="F:OpenMetaverse.Primitive.Position">
25590 <summary> 24762 <summary>
24763
25591 </summary> 24764 </summary>
24765 <param name="data"></param>
24766 <param name="notecardID"></param>
24767 <param name="callback"></param>
25592 </member> 24768 </member>
25593 <member name="F:OpenMetaverse.Primitive.Scale"> 24769 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateNotecardTask(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)">
25594 <summary> 24770 <summary>
24771 Save changes to notecard embedded in object contents
25595 </summary> 24772 </summary>
24773 <param name="data">Encoded notecard asset data</param>
24774 <param name="notecardID">Notecard UUID</param>
24775 <param name="taskID">Object's UUID</param>
24776 <param name="callback">Called upon finish of the upload with status information</param>
25596 </member> 24777 </member>
25597 <member name="F:OpenMetaverse.Primitive.Rotation"> 24778 <member name="M:OpenMetaverse.InventoryManager.RequestUploadGestureAsset(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback)">
25598 <summary> 24779 <summary>
24780 Upload new gesture asset for an inventory gesture item
25599 </summary> 24781 </summary>
24782 <param name="data">Encoded gesture asset</param>
24783 <param name="gestureID">Gesture inventory UUID</param>
24784 <param name="callback">Callback whick will be called when upload is complete</param>
25600 </member> 24785 </member>
25601 <member name="F:OpenMetaverse.Primitive.Velocity"> 24786 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateScriptAgentInventory(System.Byte[],OpenMetaverse.UUID,System.Boolean,OpenMetaverse.InventoryManager.ScriptUpdatedCallback)">
25602 <summary> 24787 <summary>
24788 Update an existing script in an agents Inventory
25603 </summary> 24789 </summary>
24790 <param name="data">A byte[] array containing the encoded scripts contents</param>
24791 <param name="itemID">the itemID of the script</param>
24792 <param name="mono">if true, sets the script content to run on the mono interpreter</param>
24793 <param name="callback"></param>
25604 </member> 24794 </member>
25605 <member name="F:OpenMetaverse.Primitive.AngularVelocity"> 24795 <member name="M:OpenMetaverse.InventoryManager.RequestUpdateScriptTask(System.Byte[],OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean,System.Boolean,OpenMetaverse.InventoryManager.ScriptUpdatedCallback)">
25606 <summary> 24796 <summary>
24797 Update an existing script in an task Inventory
25607 </summary> 24798 </summary>
24799 <param name="data">A byte[] array containing the encoded scripts contents</param>
24800 <param name="itemID">the itemID of the script</param>
24801 <param name="taskID">UUID of the prim containting the script</param>
24802 <param name="mono">if true, sets the script content to run on the mono interpreter</param>
24803 <param name="running">if true, sets the script to running</param>
24804 <param name="callback"></param>
25608 </member> 24805 </member>
25609 <member name="F:OpenMetaverse.Primitive.Acceleration"> 24806 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem)">
25610 <summary> 24807 <summary>
24808 Rez an object from inventory
25611 </summary> 24809 </summary>
24810 <param name="simulator">Simulator to place object in</param>
24811 <param name="rotation">Rotation of the object when rezzed</param>
24812 <param name="position">Vector of where to place object</param>
24813 <param name="item">InventoryItem object containing item details</param>
25612 </member> 24814 </member>
25613 <member name="F:OpenMetaverse.Primitive.CollisionPlane"> 24815 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem,OpenMetaverse.UUID)">
25614 <summary> 24816 <summary>
24817 Rez an object from inventory
25615 </summary> 24818 </summary>
24819 <param name="simulator">Simulator to place object in</param>
24820 <param name="rotation">Rotation of the object when rezzed</param>
24821 <param name="position">Vector of where to place object</param>
24822 <param name="item">InventoryItem object containing item details</param>
24823 <param name="groupOwner">UUID of group to own the object</param>
25616 </member> 24824 </member>
25617 <member name="F:OpenMetaverse.Primitive.Flexible"> 24825 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)">
25618 <summary> 24826 <summary>
24827 Rez an object from inventory
25619 </summary> 24828 </summary>
24829 <param name="simulator">Simulator to place object in</param>
24830 <param name="rotation">Rotation of the object when rezzed</param>
24831 <param name="position">Vector of where to place object</param>
24832 <param name="item">InventoryItem object containing item details</param>
24833 <param name="groupOwner">UUID of group to own the object</param>
24834 <param name="queryID">User defined queryID to correlate replies</param>
24835 <param name="rezSelected">If set to true, the CreateSelected flag
24836 will be set on the rezzed object</param>
25620 </member> 24837 </member>
25621 <member name="F:OpenMetaverse.Primitive.Light"> 24838 <member name="M:OpenMetaverse.InventoryManager.RequestRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.UUID,OpenMetaverse.Quaternion,OpenMetaverse.Vector3,OpenMetaverse.InventoryItem,OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)">
25622 <summary> 24839 <summary>
24840 Rez an object from inventory
25623 </summary> 24841 </summary>
24842 <param name="simulator">Simulator to place object in</param>
24843 <param name="taskID">TaskID object when rezzed</param>
24844 <param name="rotation">Rotation of the object when rezzed</param>
24845 <param name="position">Vector of where to place object</param>
24846 <param name="item">InventoryItem object containing item details</param>
24847 <param name="groupOwner">UUID of group to own the object</param>
24848 <param name="queryID">User defined queryID to correlate replies</param>
24849 <param name="rezSelected">If set to true, the CreateSelected flag
24850 will be set on the rezzed object</param>
25624 </member> 24851 </member>
25625 <member name="F:OpenMetaverse.Primitive.Sculpt"> 24852 <member name="M:OpenMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32)">
25626 <summary> 24853 <summary>
24854 DeRez an object from the simulator to the agents Objects folder in the agents Inventory
25627 </summary> 24855 </summary>
24856 <param name="objectLocalID">The simulator Local ID of the object</param>
24857 <remarks>If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed</remarks>
25628 </member> 24858 </member>
25629 <member name="F:OpenMetaverse.Primitive.ClickAction"> 24859 <member name="M:OpenMetaverse.InventoryManager.RequestDeRezToInventory(System.UInt32,OpenMetaverse.DeRezDestination,OpenMetaverse.UUID,OpenMetaverse.UUID)">
25630 <summary> 24860 <summary>
24861 DeRez an object from the simulator and return to inventory
25631 </summary> 24862 </summary>
24863 <param name="objectLocalID">The simulator Local ID of the object</param>
24864 <param name="destType">The type of destination from the <seealso cref="T:OpenMetaverse.DeRezDestination"/> enum</param>
24865 <param name="destFolder">The destination inventory folders <seealso cref="T:OpenMetaverse.UUID"/> -or-
24866 if DeRezzing object to a tasks Inventory, the Tasks <seealso cref="T:OpenMetaverse.UUID"/></param>
24867 <param name="transactionID">The transaction ID for this request which
24868 can be used to correlate this request with other packets</param>
24869 <remarks>If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed</remarks>
25632 </member> 24870 </member>
25633 <member name="F:OpenMetaverse.Primitive.Sound"> 24871 <member name="M:OpenMetaverse.InventoryManager.RequestRestoreRezFromInventory(OpenMetaverse.Simulator,OpenMetaverse.InventoryItem,OpenMetaverse.UUID)">
25634 <summary> 24872 <summary>
24873 Rez an item from inventory to its previous simulator location
25635 </summary> 24874 </summary>
24875 <param name="simulator"></param>
24876 <param name="item"></param>
24877 <param name="queryID"></param>
24878 <returns></returns>
25636 </member> 24879 </member>
25637 <member name="F:OpenMetaverse.Primitive.OwnerID"> 24880 <member name="M:OpenMetaverse.InventoryManager.GiveItem(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,System.Boolean)">
25638 <summary>Identifies the owner if audio or a particle system is
25639 active</summary>
25640 </member>
25641 <member name="F:OpenMetaverse.Primitive.SoundFlags">
25642 <summary> 24881 <summary>
24882 Give an inventory item to another avatar
25643 </summary> 24883 </summary>
24884 <param name="itemID">The <seealso cref="T:OpenMetaverse.UUID"/> of the item to give</param>
24885 <param name="itemName">The name of the item</param>
24886 <param name="assetType">The type of the item from the <seealso cref="T:OpenMetaverse.AssetType"/> enum</param>
24887 <param name="recipient">The <seealso cref="T:OpenMetaverse.UUID"/> of the recipient</param>
24888 <param name="doEffect">true to generate a beameffect during transfer</param>
25644 </member> 24889 </member>
25645 <member name="F:OpenMetaverse.Primitive.SoundGain"> 24890 <member name="M:OpenMetaverse.InventoryManager.GiveFolder(OpenMetaverse.UUID,System.String,OpenMetaverse.AssetType,OpenMetaverse.UUID,System.Boolean)">
25646 <summary> 24891 <summary>
24892 Give an inventory Folder with contents to another avatar
25647 </summary> 24893 </summary>
24894 <param name="folderID">The <seealso cref="T:OpenMetaverse.UUID"/> of the Folder to give</param>
24895 <param name="folderName">The name of the folder</param>
24896 <param name="assetType">The type of the item from the <seealso cref="T:OpenMetaverse.AssetType"/> enum</param>
24897 <param name="recipient">The <seealso cref="T:OpenMetaverse.UUID"/> of the recipient</param>
24898 <param name="doEffect">true to generate a beameffect during transfer</param>
25648 </member> 24899 </member>
25649 <member name="F:OpenMetaverse.Primitive.SoundRadius"> 24900 <member name="M:OpenMetaverse.InventoryManager.UpdateTaskInventory(System.UInt32,OpenMetaverse.InventoryItem)">
25650 <summary> 24901 <summary>
24902 Copy or move an <see cref="T:OpenMetaverse.InventoryItem"/> from agent inventory to a task (primitive) inventory
25651 </summary> 24903 </summary>
24904 <param name="objectLocalID">The target object</param>
24905 <param name="item">The item to copy or move from inventory</param>
24906 <returns></returns>
24907 <remarks>For items with copy permissions a copy of the item is placed in the tasks inventory,
24908 for no-copy items the object is moved to the tasks inventory</remarks>
25652 </member> 24909 </member>
25653 <member name="F:OpenMetaverse.Primitive.Text"> 24910 <member name="M:OpenMetaverse.InventoryManager.GetTaskInventory(OpenMetaverse.UUID,System.UInt32,System.Int32)">
25654 <summary> 24911 <summary>
24912 Retrieve a listing of the items contained in a task (Primitive)
25655 </summary> 24913 </summary>
24914 <param name="objectID">The tasks <seealso cref="T:OpenMetaverse.UUID"/></param>
24915 <param name="objectLocalID">The tasks simulator local ID</param>
24916 <param name="timeoutMS">milliseconds to wait for reply from simulator</param>
24917 <returns>A list containing the inventory items inside the task or null
24918 if a timeout occurs</returns>
24919 <remarks>This request blocks until the response from the simulator arrives
24920 or timeoutMS is exceeded</remarks>
25656 </member> 24921 </member>
25657 <member name="F:OpenMetaverse.Primitive.TextColor"> 24922 <member name="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32)">
25658 <summary> 24923 <summary>
24924 Request the contents of a tasks (primitives) inventory from the
24925 current simulator
25659 </summary> 24926 </summary>
24927 <param name="objectLocalID">The LocalID of the object</param>
24928 <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply"/>
25660 </member> 24929 </member>
25661 <member name="F:OpenMetaverse.Primitive.MediaURL"> 24930 <member name="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32,OpenMetaverse.Simulator)">
25662 <summary> 24931 <summary>
24932 Request the contents of a tasks (primitives) inventory
25663 </summary> 24933 </summary>
24934 <param name="objectLocalID">The simulator Local ID of the object</param>
24935 <param name="simulator">A reference to the simulator object that contains the object</param>
24936 <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply"/>
25664 </member> 24937 </member>
25665 <member name="F:OpenMetaverse.Primitive.Joint"> 24938 <member name="M:OpenMetaverse.InventoryManager.MoveTaskInventory(System.UInt32,OpenMetaverse.UUID,OpenMetaverse.UUID,OpenMetaverse.Simulator)">
25666 <summary> 24939 <summary>
24940 Move an item from a tasks (Primitive) inventory to the specified folder in the avatars inventory
25667 </summary> 24941 </summary>
24942 <param name="objectLocalID">LocalID of the object in the simulator</param>
24943 <param name="taskItemID">UUID of the task item to move</param>
24944 <param name="inventoryFolderID">The ID of the destination folder in this agents inventory</param>
24945 <param name="simulator">Simulator Object</param>
24946 <remarks>Raises the <see cref="M:OpenMetaverse.InventoryManager.OnTaskItemReceived(OpenMetaverse.TaskItemReceivedEventArgs)"/> event</remarks>
25668 </member> 24947 </member>
25669 <member name="F:OpenMetaverse.Primitive.JointPivot"> 24948 <member name="M:OpenMetaverse.InventoryManager.RemoveTaskInventory(System.UInt32,OpenMetaverse.UUID,OpenMetaverse.Simulator)">
25670 <summary> 24949 <summary>
24950 Remove an item from an objects (Prim) Inventory
25671 </summary> 24951 </summary>
24952 <param name="objectLocalID">LocalID of the object in the simulator</param>
24953 <param name="taskItemID">UUID of the task item to remove</param>
24954 <param name="simulator">Simulator Object</param>
24955 <remarks>You can confirm the removal by comparing the tasks inventory serial before and after the
24956 request with the <see cref="M:OpenMetaverse.InventoryManager.RequestTaskInventory(System.UInt32)"/> request combined with
24957 the <seealso cref="E:OpenMetaverse.InventoryManager.TaskInventoryReply"/> event</remarks>
25672 </member> 24958 </member>
25673 <member name="F:OpenMetaverse.Primitive.JointAxisOrAnchor"> 24959 <member name="M:OpenMetaverse.InventoryManager.CopyScriptToTask(System.UInt32,OpenMetaverse.InventoryItem,System.Boolean)">
25674 <summary> 24960 <summary>
25675 </summary> 24961 Copy an InventoryScript item from the Agents Inventory into a primitives task inventory
24962 </summary>
24963 <param name="objectLocalID">An unsigned integer representing a primitive being simulated</param>
24964 <param name="item">An <seealso cref="T:OpenMetaverse.InventoryItem"/> which represents a script object from the agents inventory</param>
24965 <param name="enableScript">true to set the scripts running state to enabled</param>
24966 <returns>A Unique Transaction ID</returns>
24967 <example>
24968 The following example shows the basic steps necessary to copy a script from the agents inventory into a tasks inventory
24969 and assumes the script exists in the agents inventory.
24970 <code>
24971 uint primID = 95899503; // Fake prim ID
24972 UUID scriptID = UUID.Parse("92a7fe8a-e949-dd39-a8d8-1681d8673232"); // Fake Script UUID in Inventory
24973
24974 Client.Inventory.FolderContents(Client.Inventory.FindFolderForType(AssetType.LSLText), Client.Self.AgentID,
24975 false, true, InventorySortOrder.ByName, 10000);
24976
24977 Client.Inventory.RezScript(primID, (InventoryItem)Client.Inventory.Store[scriptID]);
24978 </code>
24979 </example>
25676 </member> 24980 </member>
25677 <member name="F:OpenMetaverse.Primitive.NameValues"> 24981 <member name="M:OpenMetaverse.InventoryManager.RequestGetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID)">
25678 <summary> 24982 <summary>
24983 Request the running status of a script contained in a task (primitive) inventory
25679 </summary> 24984 </summary>
24985 <param name="objectID">The ID of the primitive containing the script</param>
24986 <param name="scriptID">The ID of the script</param>
24987 <remarks>The <see cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply"/> event can be used to obtain the results of the
24988 request</remarks>
24989 <seealso cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply"/>
25680 </member> 24990 </member>
25681 <member name="F:OpenMetaverse.Primitive.PrimData"> 24991 <member name="M:OpenMetaverse.InventoryManager.RequestSetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID,System.Boolean)">
25682 <summary> 24992 <summary>
24993 Send a request to set the running state of a script contained in a task (primitive) inventory
25683 </summary> 24994 </summary>
24995 <param name="objectID">The ID of the primitive containing the script</param>
24996 <param name="scriptID">The ID of the script</param>
24997 <param name="running">true to set the script running, false to stop a running script</param>
24998 <remarks>To verify the change you can use the <see cref="M:OpenMetaverse.InventoryManager.RequestGetScriptRunning(OpenMetaverse.UUID,OpenMetaverse.UUID)"/> method combined
24999 with the <see cref="E:OpenMetaverse.InventoryManager.ScriptRunningReply"/> event</remarks>
25684 </member> 25000 </member>
25685 <member name="F:OpenMetaverse.Primitive.Properties"> 25001 <member name="M:OpenMetaverse.InventoryManager.ItemCRC(OpenMetaverse.InventoryItem)">
25686 <summary> 25002 <summary>
25003 Create a CRC from an InventoryItem
25687 </summary> 25004 </summary>
25005 <param name="iitem">The source InventoryItem</param>
25006 <returns>A uint representing the source InventoryItem as a CRC</returns>
25688 </member> 25007 </member>
25689 <member name="F:OpenMetaverse.Primitive.PhysicsProps"> 25008 <member name="M:OpenMetaverse.InventoryManager.DecryptShadowID(OpenMetaverse.UUID)">
25690 <summary>Objects physics engine propertis</summary>
25691 </member>
25692 <member name="F:OpenMetaverse.Primitive.Tag">
25693 <summary>Extra data about primitive</summary>
25694 </member>
25695 <member name="F:OpenMetaverse.Primitive.IsAttachment">
25696 <summary>Indicates if prim is attached to an avatar</summary>
25697 </member>
25698 <member name="F:OpenMetaverse.Primitive.Textures">
25699 <summary> 25009 <summary>
25010 Reverses a cheesy XORing with a fixed UUID to convert a shadow_id to an asset_id
25700 </summary> 25011 </summary>
25012 <param name="shadowID">Obfuscated shadow_id value</param>
25013 <returns>Deobfuscated asset_id value</returns>
25701 </member> 25014 </member>
25702 <member name="F:OpenMetaverse.Primitive.TextureAnim"> 25015 <member name="M:OpenMetaverse.InventoryManager.EncryptAssetID(OpenMetaverse.UUID)">
25703 <summary> 25016 <summary>
25017 Does a cheesy XORing with a fixed UUID to convert an asset_id to a shadow_id
25704 </summary> 25018 </summary>
25019 <param name="assetID">asset_id value to obfuscate</param>
25020 <returns>Obfuscated shadow_id value</returns>
25705 </member> 25021 </member>
25706 <member name="P:OpenMetaverse.Primitive.Type"> 25022 <member name="M:OpenMetaverse.InventoryManager.CreateInventoryItem(OpenMetaverse.InventoryType,OpenMetaverse.UUID)">
25707 <summary>Uses basic heuristics to estimate the primitive shape</summary>
25708 </member>
25709 <member name="M:OpenMetaverse.Primitive.PackPathTwist(System.Single)">
25710 <summary> 25023 <summary>
25711 Packs PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew 25024 Wrapper for creating a new <seealso cref="T:OpenMetaverse.InventoryItem"/> object
25712 parameters in to signed eight bit values
25713 </summary> 25025 </summary>
25714 <param name="pathTwist">Floating point parameter to pack</param> 25026 <param name="type">The type of item from the <seealso cref="T:OpenMetaverse.InventoryType"/> enum</param>
25715 <returns>Signed eight bit value containing the packed parameter</returns> 25027 <param name="id">The <seealso cref="T:OpenMetaverse.UUID"/> of the newly created object</param>
25028 <returns>An <seealso cref="T:OpenMetaverse.InventoryItem"/> object with the type and id passed</returns>
25716 </member> 25029 </member>
25717 <member name="M:OpenMetaverse.Primitive.UnpackPathTwist(System.SByte)"> 25030 <member name="M:OpenMetaverse.InventoryManager.ParseTaskInventory(System.String)">
25718 <summary> 25031 <summary>
25719 Unpacks PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew 25032 Parse the results of a RequestTaskInventory() response
25720 parameters from signed eight bit integers to floating point values
25721 </summary> 25033 </summary>
25722 <param name="pathTwist">Signed eight bit value to unpack</param> 25034 <param name="taskData">A string which contains the data from the task reply</param>
25723 <returns>Unpacked floating point value</returns> 25035 <returns>A List containing the items contained within the tasks inventory</returns>
25724 </member> 25036 </member>
25725 <member name="T:OpenMetaverse.Bumpiness"> 25037 <member name="M:OpenMetaverse.InventoryManager.SaveAssetIntoInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25726 <summary> 25038 <summary>Process an incoming packet and raise the appropriate events</summary>
25727 The type of bump-mapping applied to a face 25039 <param name="sender">The sender</param>
25728 </summary> 25040 <param name="e">The EventArgs object containing the packet data</param>
25729 </member> 25041 </member>
25730 <member name="F:OpenMetaverse.Bumpiness.None"> 25042 <member name="M:OpenMetaverse.InventoryManager.InventoryDescendentsHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25731 <summary> 25043 <summary>Process an incoming packet and raise the appropriate events</summary>
25732 </summary> 25044 <param name="sender">The sender</param>
25045 <param name="e">The EventArgs object containing the packet data</param>
25733 </member> 25046 </member>
25734 <member name="F:OpenMetaverse.Bumpiness.Brightness"> 25047 <member name="M:OpenMetaverse.InventoryManager.UpdateCreateInventoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25735 <summary> 25048 <summary>
25049 UpdateCreateInventoryItem packets are received when a new inventory item
25050 is created. This may occur when an object that's rezzed in world is
25051 taken into inventory, when an item is created using the CreateInventoryItem
25052 packet, or when an object is purchased
25736 </summary> 25053 </summary>
25054 <param name="sender">The sender</param>
25055 <param name="e">The EventArgs object containing the packet data</param>
25737 </member> 25056 </member>
25738 <member name="F:OpenMetaverse.Bumpiness.Darkness"> 25057 <member name="M:OpenMetaverse.InventoryManager.MoveInventoryItemHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25058 <summary>Process an incoming packet and raise the appropriate events</summary>
25059 <param name="sender">The sender</param>
25060 <param name="e">The EventArgs object containing the packet data</param>
25061 </member>
25062 <member name="M:OpenMetaverse.InventoryManager.BulkUpdateInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25063 <summary>Process an incoming packet and raise the appropriate events</summary>
25064 <param name="sender">The sender</param>
25065 <param name="e">The EventArgs object containing the packet data</param>
25066 </member>
25067 <member name="M:OpenMetaverse.InventoryManager.FetchInventoryReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25068 <summary>Process an incoming packet and raise the appropriate events</summary>
25069 <param name="sender">The sender</param>
25070 <param name="e">The EventArgs object containing the packet data</param>
25071 </member>
25072 <member name="M:OpenMetaverse.InventoryManager.ReplyTaskInventoryHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25073 <summary>Process an incoming packet and raise the appropriate events</summary>
25074 <param name="sender">The sender</param>
25075 <param name="e">The EventArgs object containing the packet data</param>
25076 </member>
25077 <member name="E:OpenMetaverse.InventoryManager.ItemReceived">
25078 <summary>Raised when the simulator sends us data containing
25079 ...</summary>
25080 </member>
25081 <member name="E:OpenMetaverse.InventoryManager.FolderUpdated">
25082 <summary>Raised when the simulator sends us data containing
25083 ...</summary>
25084 </member>
25085 <member name="E:OpenMetaverse.InventoryManager.InventoryObjectOffered">
25086 <summary>Raised when the simulator sends us data containing
25087 an inventory object sent by another avatar or primitive</summary>
25088 </member>
25089 <member name="E:OpenMetaverse.InventoryManager.TaskItemReceived">
25090 <summary>Raised when the simulator sends us data containing
25091 ...</summary>
25092 </member>
25093 <member name="E:OpenMetaverse.InventoryManager.FindObjectByPathReply">
25094 <summary>Raised when the simulator sends us data containing
25095 ...</summary>
25096 </member>
25097 <member name="E:OpenMetaverse.InventoryManager.TaskInventoryReply">
25098 <summary>Raised when the simulator sends us data containing
25099 ...</summary>
25100 </member>
25101 <member name="E:OpenMetaverse.InventoryManager.SaveAssetToInventory">
25102 <summary>Raised when the simulator sends us data containing
25103 ...</summary>
25104 </member>
25105 <member name="E:OpenMetaverse.InventoryManager.ScriptRunningReply">
25106 <summary>Raised when the simulator sends us data containing
25107 ...</summary>
25108 </member>
25109 <member name="P:OpenMetaverse.InventoryManager.Store">
25739 <summary> 25110 <summary>
25111 Get this agents Inventory data
25740 </summary> 25112 </summary>
25741 </member> 25113 </member>
25742 <member name="F:OpenMetaverse.Bumpiness.Woodgrain"> 25114 <member name="T:OpenMetaverse.InventoryManager.ItemCreatedCallback">
25743 <summary> 25115 <summary>
25116 Callback for inventory item creation finishing
25744 </summary> 25117 </summary>
25118 <param name="success">Whether the request to create an inventory
25119 item succeeded or not</param>
25120 <param name="item">Inventory item being created. If success is
25121 false this will be null</param>
25745 </member> 25122 </member>
25746 <member name="F:OpenMetaverse.Bumpiness.Bark"> 25123 <member name="T:OpenMetaverse.InventoryManager.ItemCreatedFromAssetCallback">
25747 <summary> 25124 <summary>
25125 Callback for an inventory item being create from an uploaded asset
25748 </summary> 25126 </summary>
25127 <param name="success">true if inventory item creation was successful</param>
25128 <param name="status"></param>
25129 <param name="itemID"></param>
25130 <param name="assetID"></param>
25749 </member> 25131 </member>
25750 <member name="F:OpenMetaverse.Bumpiness.Bricks"> 25132 <member name="T:OpenMetaverse.InventoryManager.ItemCopiedCallback">
25751 <summary> 25133 <summary>
25134
25752 </summary> 25135 </summary>
25136 <param name="item"></param>
25753 </member> 25137 </member>
25754 <member name="F:OpenMetaverse.Bumpiness.Checker"> 25138 <member name="T:OpenMetaverse.InventoryManager.InventoryUploadedAssetCallback">
25755 <summary> 25139 <summary>
25140 Reply received when uploading an inventory asset
25756 </summary> 25141 </summary>
25142 <param name="success">Has upload been successful</param>
25143 <param name="status">Error message if upload failed</param>
25144 <param name="itemID">Inventory asset UUID</param>
25145 <param name="assetID">New asset UUID</param>
25757 </member> 25146 </member>
25758 <member name="F:OpenMetaverse.Bumpiness.Concrete"> 25147 <member name="T:OpenMetaverse.InventoryManager.ScriptUpdatedCallback">
25759 <summary> 25148 <summary>
25149 Delegate that is invoked when script upload is completed
25760 </summary> 25150 </summary>
25151 <param name="uploadSuccess">Has upload succeded (note, there still might be compile errors)</param>
25152 <param name="uploadStatus">Upload status message</param>
25153 <param name="compileSuccess">Is compilation successful</param>
25154 <param name="compileMessages">If compilation failed, list of error messages, null on compilation success</param>
25155 <param name="itemID">Script inventory UUID</param>
25156 <param name="assetID">Script's new asset UUID</param>
25761 </member> 25157 </member>
25762 <member name="F:OpenMetaverse.Bumpiness.Crustytile"> 25158 <member name="P:OpenMetaverse.InventoryObjectOfferedEventArgs.Accept">
25159 <summary>Set to true to accept offer, false to decline it</summary>
25160 </member>
25161 <member name="P:OpenMetaverse.InventoryObjectOfferedEventArgs.FolderID">
25162 <summary>The folder to accept the inventory into, if null default folder for <see cref="P:OpenMetaverse.InventoryObjectOfferedEventArgs.AssetType"/> will be used</summary>
25163 </member>
25164 <member name="T:OpenMetaverse.TaskItemReceivedEventArgs">
25763 <summary> 25165 <summary>
25166 Callback when an inventory object is accepted and received from a
25167 task inventory. This is the callback in which you actually get
25168 the ItemID, as in ObjectOfferedCallback it is null when received
25169 from a task.
25764 </summary> 25170 </summary>
25765 </member> 25171 </member>
25766 <member name="F:OpenMetaverse.Bumpiness.Cutstone"> 25172 <member name="T:OpenMetaverse.GridLayerType">
25767 <summary> 25173 <summary>
25174 Map layer request type
25768 </summary> 25175 </summary>
25769 </member> 25176 </member>
25770 <member name="F:OpenMetaverse.Bumpiness.Discs"> 25177 <member name="F:OpenMetaverse.GridLayerType.Objects">
25178 <summary>Objects and terrain are shown</summary>
25179 </member>
25180 <member name="F:OpenMetaverse.GridLayerType.Terrain">
25181 <summary>Only the terrain is shown, no objects</summary>
25182 </member>
25183 <member name="F:OpenMetaverse.GridLayerType.LandForSale">
25184 <summary>Overlay showing land for sale and for auction</summary>
25185 </member>
25186 <member name="T:OpenMetaverse.GridItemType">
25771 <summary> 25187 <summary>
25188 Type of grid item, such as telehub, event, populator location, etc.
25772 </summary> 25189 </summary>
25773 </member> 25190 </member>
25774 <member name="F:OpenMetaverse.Bumpiness.Gravel"> 25191 <member name="F:OpenMetaverse.GridItemType.Telehub">
25192 <summary>Telehub</summary>
25193 </member>
25194 <member name="F:OpenMetaverse.GridItemType.PgEvent">
25195 <summary>PG rated event</summary>
25196 </member>
25197 <member name="F:OpenMetaverse.GridItemType.MatureEvent">
25198 <summary>Mature rated event</summary>
25199 </member>
25200 <member name="F:OpenMetaverse.GridItemType.Popular">
25201 <summary>Popular location</summary>
25202 </member>
25203 <member name="F:OpenMetaverse.GridItemType.AgentLocations">
25204 <summary>Locations of avatar groups in a region</summary>
25205 </member>
25206 <member name="F:OpenMetaverse.GridItemType.LandForSale">
25207 <summary>Land for sale</summary>
25208 </member>
25209 <member name="F:OpenMetaverse.GridItemType.Classified">
25210 <summary>Classified ad</summary>
25211 </member>
25212 <member name="F:OpenMetaverse.GridItemType.AdultEvent">
25213 <summary>Adult rated event</summary>
25214 </member>
25215 <member name="F:OpenMetaverse.GridItemType.AdultLandForSale">
25216 <summary>Adult land for sale</summary>
25217 </member>
25218 <member name="T:OpenMetaverse.GridRegion">
25775 <summary> 25219 <summary>
25220 Information about a region on the grid map
25776 </summary> 25221 </summary>
25777 </member> 25222 </member>
25778 <member name="F:OpenMetaverse.Bumpiness.Petridish"> 25223 <member name="F:OpenMetaverse.GridRegion.X">
25224 <summary>Sim X position on World Map</summary>
25225 </member>
25226 <member name="F:OpenMetaverse.GridRegion.Y">
25227 <summary>Sim Y position on World Map</summary>
25228 </member>
25229 <member name="F:OpenMetaverse.GridRegion.Name">
25230 <summary>Sim Name (NOTE: In lowercase!)</summary>
25231 </member>
25232 <member name="F:OpenMetaverse.GridRegion.Access">
25233 <summary></summary>
25234 </member>
25235 <member name="F:OpenMetaverse.GridRegion.RegionFlags">
25236 <summary>Appears to always be zero (None)</summary>
25237 </member>
25238 <member name="F:OpenMetaverse.GridRegion.WaterHeight">
25239 <summary>Sim's defined Water Height</summary>
25240 </member>
25241 <member name="F:OpenMetaverse.GridRegion.Agents">
25242 <summary></summary>
25243 </member>
25244 <member name="F:OpenMetaverse.GridRegion.MapImageID">
25245 <summary>UUID of the World Map image</summary>
25246 </member>
25247 <member name="F:OpenMetaverse.GridRegion.RegionHandle">
25248 <summary>Unique identifier for this region, a combination of the X
25249 and Y position</summary>
25250 </member>
25251 <member name="M:OpenMetaverse.GridRegion.ToString">
25779 <summary> 25252 <summary>
25253
25780 </summary> 25254 </summary>
25255 <returns></returns>
25781 </member> 25256 </member>
25782 <member name="F:OpenMetaverse.Bumpiness.Siding"> 25257 <member name="M:OpenMetaverse.GridRegion.GetHashCode">
25783 <summary> 25258 <summary>
25259
25784 </summary> 25260 </summary>
25261 <returns></returns>
25785 </member> 25262 </member>
25786 <member name="F:OpenMetaverse.Bumpiness.Stonetile"> 25263 <member name="M:OpenMetaverse.GridRegion.Equals(System.Object)">
25787 <summary> 25264 <summary>
25265
25788 </summary> 25266 </summary>
25267 <param name="obj"></param>
25268 <returns></returns>
25789 </member> 25269 </member>
25790 <member name="F:OpenMetaverse.Bumpiness.Stucco"> 25270 <member name="T:OpenMetaverse.GridLayer">
25791 <summary> 25271 <summary>
25272 Visual chunk of the grid map
25792 </summary> 25273 </summary>
25793 </member> 25274 </member>
25794 <member name="F:OpenMetaverse.Bumpiness.Suction"> 25275 <member name="T:OpenMetaverse.MapItem">
25795 <summary> 25276 <summary>
25277 Base class for Map Items
25796 </summary> 25278 </summary>
25797 </member> 25279 </member>
25798 <member name="F:OpenMetaverse.Bumpiness.Weave"> 25280 <member name="F:OpenMetaverse.MapItem.GlobalX">
25281 <summary>The Global X position of the item</summary>
25282 </member>
25283 <member name="F:OpenMetaverse.MapItem.GlobalY">
25284 <summary>The Global Y position of the item</summary>
25285 </member>
25286 <member name="P:OpenMetaverse.MapItem.LocalX">
25287 <summary>Get the Local X position of the item</summary>
25288 </member>
25289 <member name="P:OpenMetaverse.MapItem.LocalY">
25290 <summary>Get the Local Y position of the item</summary>
25291 </member>
25292 <member name="P:OpenMetaverse.MapItem.RegionHandle">
25293 <summary>Get the Handle of the region</summary>
25294 </member>
25295 <member name="T:OpenMetaverse.MapAgentLocation">
25799 <summary> 25296 <summary>
25297 Represents an agent or group of agents location
25800 </summary> 25298 </summary>
25801 </member> 25299 </member>
25802 <member name="T:OpenMetaverse.Shininess"> 25300 <member name="T:OpenMetaverse.MapTelehub">
25803 <summary> 25301 <summary>
25804 The level of shininess applied to a face 25302 Represents a Telehub location
25805 </summary> 25303 </summary>
25806 </member> 25304 </member>
25807 <member name="F:OpenMetaverse.Shininess.None"> 25305 <member name="T:OpenMetaverse.MapLandForSale">
25808 <summary> 25306 <summary>
25307 Represents a non-adult parcel of land for sale
25809 </summary> 25308 </summary>
25810 </member> 25309 </member>
25811 <member name="F:OpenMetaverse.Shininess.Low"> 25310 <member name="T:OpenMetaverse.MapAdultLandForSale">
25812 <summary> 25311 <summary>
25312 Represents an Adult parcel of land for sale
25813 </summary> 25313 </summary>
25814 </member> 25314 </member>
25815 <member name="F:OpenMetaverse.Shininess.Medium"> 25315 <member name="T:OpenMetaverse.MapPGEvent">
25816 <summary> 25316 <summary>
25317 Represents a PG Event
25817 </summary> 25318 </summary>
25818 </member> 25319 </member>
25819 <member name="F:OpenMetaverse.Shininess.High"> 25320 <member name="T:OpenMetaverse.MapMatureEvent">
25820 <summary> 25321 <summary>
25322 Represents a Mature event
25821 </summary> 25323 </summary>
25822 </member> 25324 </member>
25823 <member name="T:OpenMetaverse.MappingType"> 25325 <member name="T:OpenMetaverse.MapAdultEvent">
25824 <summary> 25326 <summary>
25825 The texture mapping style used for a face 25327 Represents an Adult event
25826 </summary> 25328 </summary>
25827 </member> 25329 </member>
25828 <member name="F:OpenMetaverse.MappingType.Default"> 25330 <member name="T:OpenMetaverse.GridManager">
25829 <summary> 25331 <summary>
25332 Manages grid-wide tasks such as the world map
25830 </summary> 25333 </summary>
25831 </member> 25334 </member>
25832 <member name="F:OpenMetaverse.MappingType.Planar"> 25335 <member name="F:OpenMetaverse.GridManager.m_CoarseLocationUpdate">
25336 <summary>The event subscribers. null if no subcribers</summary>
25337 </member>
25338 <member name="M:OpenMetaverse.GridManager.OnCoarseLocationUpdate(OpenMetaverse.CoarseLocationUpdateEventArgs)">
25339 <summary>Raises the CoarseLocationUpdate event</summary>
25340 <param name="e">A CoarseLocationUpdateEventArgs object containing the
25341 data sent by simulator</param>
25342 </member>
25343 <member name="F:OpenMetaverse.GridManager.m_CoarseLocationUpdateLock">
25344 <summary>Thread sync lock object</summary>
25345 </member>
25346 <member name="F:OpenMetaverse.GridManager.m_GridRegion">
25347 <summary>The event subscribers. null if no subcribers</summary>
25348 </member>
25349 <member name="M:OpenMetaverse.GridManager.OnGridRegion(OpenMetaverse.GridRegionEventArgs)">
25350 <summary>Raises the GridRegion event</summary>
25351 <param name="e">A GridRegionEventArgs object containing the
25352 data sent by simulator</param>
25353 </member>
25354 <member name="F:OpenMetaverse.GridManager.m_GridRegionLock">
25355 <summary>Thread sync lock object</summary>
25356 </member>
25357 <member name="F:OpenMetaverse.GridManager.m_GridLayer">
25358 <summary>The event subscribers. null if no subcribers</summary>
25359 </member>
25360 <member name="M:OpenMetaverse.GridManager.OnGridLayer(OpenMetaverse.GridLayerEventArgs)">
25361 <summary>Raises the GridLayer event</summary>
25362 <param name="e">A GridLayerEventArgs object containing the
25363 data sent by simulator</param>
25364 </member>
25365 <member name="F:OpenMetaverse.GridManager.m_GridLayerLock">
25366 <summary>Thread sync lock object</summary>
25367 </member>
25368 <member name="F:OpenMetaverse.GridManager.m_GridItems">
25369 <summary>The event subscribers. null if no subcribers</summary>
25370 </member>
25371 <member name="M:OpenMetaverse.GridManager.OnGridItems(OpenMetaverse.GridItemsEventArgs)">
25372 <summary>Raises the GridItems event</summary>
25373 <param name="e">A GridItemEventArgs object containing the
25374 data sent by simulator</param>
25375 </member>
25376 <member name="F:OpenMetaverse.GridManager.m_GridItemsLock">
25377 <summary>Thread sync lock object</summary>
25378 </member>
25379 <member name="F:OpenMetaverse.GridManager.m_RegionHandleReply">
25380 <summary>The event subscribers. null if no subcribers</summary>
25381 </member>
25382 <member name="M:OpenMetaverse.GridManager.OnRegionHandleReply(OpenMetaverse.RegionHandleReplyEventArgs)">
25383 <summary>Raises the RegionHandleReply event</summary>
25384 <param name="e">A RegionHandleReplyEventArgs object containing the
25385 data sent by simulator</param>
25386 </member>
25387 <member name="F:OpenMetaverse.GridManager.m_RegionHandleReplyLock">
25388 <summary>Thread sync lock object</summary>
25389 </member>
25390 <member name="F:OpenMetaverse.GridManager.Regions">
25391 <summary>A dictionary of all the regions, indexed by region name</summary>
25392 </member>
25393 <member name="F:OpenMetaverse.GridManager.RegionsByHandle">
25394 <summary>A dictionary of all the regions, indexed by region handle</summary>
25395 </member>
25396 <member name="M:OpenMetaverse.GridManager.#ctor(OpenMetaverse.GridClient)">
25833 <summary> 25397 <summary>
25398 Constructor
25834 </summary> 25399 </summary>
25400 <param name="client">Instance of GridClient object to associate with this GridManager instance</param>
25835 </member> 25401 </member>
25836 <member name="F:OpenMetaverse.MappingType.Spherical"> 25402 <member name="M:OpenMetaverse.GridManager.RequestMapLayer(OpenMetaverse.GridLayerType)">
25837 <summary> 25403 <summary>
25404
25838 </summary> 25405 </summary>
25406 <param name="layer"></param>
25839 </member> 25407 </member>
25840 <member name="F:OpenMetaverse.MappingType.Cylindrical"> 25408 <member name="M:OpenMetaverse.GridManager.RequestMapRegion(System.String,OpenMetaverse.GridLayerType)">
25841 <summary> 25409 <summary>
25410 Request a map layer
25842 </summary> 25411 </summary>
25412 <param name="regionName">The name of the region</param>
25413 <param name="layer">The type of layer</param>
25843 </member> 25414 </member>
25844 <member name="T:OpenMetaverse.TextureAttributes"> 25415 <member name="M:OpenMetaverse.GridManager.RequestMapBlocks(OpenMetaverse.GridLayerType,System.UInt16,System.UInt16,System.UInt16,System.UInt16,System.Boolean)">
25845 <summary> 25416 <summary>
25846 Flags in the TextureEntry block that describe which properties are 25417
25847 set
25848 </summary> 25418 </summary>
25419 <param name="layer"></param>
25420 <param name="minX"></param>
25421 <param name="minY"></param>
25422 <param name="maxX"></param>
25423 <param name="maxY"></param>
25424 <param name="returnNonExistent"></param>
25849 </member> 25425 </member>
25850 <member name="F:OpenMetaverse.TextureAttributes.None"> 25426 <member name="M:OpenMetaverse.GridManager.MapItems(System.UInt64,OpenMetaverse.GridItemType,OpenMetaverse.GridLayerType,System.Int32)">
25851 <summary> 25427 <summary>
25428
25852 </summary> 25429 </summary>
25430 <param name="regionHandle"></param>
25431 <param name="item"></param>
25432 <param name="layer"></param>
25433 <param name="timeoutMS"></param>
25434 <returns></returns>
25853 </member> 25435 </member>
25854 <member name="F:OpenMetaverse.TextureAttributes.TextureID"> 25436 <member name="M:OpenMetaverse.GridManager.RequestMapItems(System.UInt64,OpenMetaverse.GridItemType,OpenMetaverse.GridLayerType)">
25855 <summary> 25437 <summary>
25438
25856 </summary> 25439 </summary>
25440 <param name="regionHandle"></param>
25441 <param name="item"></param>
25442 <param name="layer"></param>
25857 </member> 25443 </member>
25858 <member name="F:OpenMetaverse.TextureAttributes.RGBA"> 25444 <member name="M:OpenMetaverse.GridManager.RequestMainlandSims(OpenMetaverse.GridLayerType)">
25859 <summary> 25445 <summary>
25446 Request data for all mainland (Linden managed) simulators
25860 </summary> 25447 </summary>
25861 </member> 25448 </member>
25862 <member name="F:OpenMetaverse.TextureAttributes.RepeatU"> 25449 <member name="M:OpenMetaverse.GridManager.RequestRegionHandle(OpenMetaverse.UUID)">
25863 <summary> 25450 <summary>
25451 Request the region handle for the specified region UUID
25864 </summary> 25452 </summary>
25453 <param name="regionID">UUID of the region to look up</param>
25865 </member> 25454 </member>
25866 <member name="F:OpenMetaverse.TextureAttributes.RepeatV"> 25455 <member name="M:OpenMetaverse.GridManager.GetGridRegion(System.String,OpenMetaverse.GridLayerType,OpenMetaverse.GridRegion@)">
25867 <summary> 25456 <summary>
25457 Get grid region information using the region name, this function
25458 will block until it can find the region or gives up
25868 </summary> 25459 </summary>
25460 <param name="name">Name of sim you're looking for</param>
25461 <param name="layer">Layer that you are requesting</param>
25462 <param name="region">Will contain a GridRegion for the sim you're
25463 looking for if successful, otherwise an empty structure</param>
25464 <returns>True if the GridRegion was successfully fetched, otherwise
25465 false</returns>
25869 </member> 25466 </member>
25870 <member name="F:OpenMetaverse.TextureAttributes.OffsetU"> 25467 <member name="M:OpenMetaverse.GridManager.MapBlockReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25468 <summary>Process an incoming packet and raise the appropriate events</summary>
25469 <param name="sender">The sender</param>
25470 <param name="e">The EventArgs object containing the packet data</param>
25471 </member>
25472 <member name="M:OpenMetaverse.GridManager.MapItemReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25473 <summary>Process an incoming packet and raise the appropriate events</summary>
25474 <param name="sender">The sender</param>
25475 <param name="e">The EventArgs object containing the packet data</param>
25476 </member>
25477 <member name="M:OpenMetaverse.GridManager.SimulatorViewerTimeMessageHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25478 <summary>Process an incoming packet and raise the appropriate events</summary>
25479 <param name="sender">The sender</param>
25480 <param name="e">The EventArgs object containing the packet data</param>
25481 </member>
25482 <member name="M:OpenMetaverse.GridManager.CoarseLocationHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25483 <summary>Process an incoming packet and raise the appropriate events</summary>
25484 <param name="sender">The sender</param>
25485 <param name="e">The EventArgs object containing the packet data</param>
25486 </member>
25487 <member name="M:OpenMetaverse.GridManager.RegionHandleReplyHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25488 <summary>Process an incoming packet and raise the appropriate events</summary>
25489 <param name="sender">The sender</param>
25490 <param name="e">The EventArgs object containing the packet data</param>
25491 </member>
25492 <member name="E:OpenMetaverse.GridManager.CoarseLocationUpdate">
25493 <summary>Raised when the simulator sends a <see cref="T:OpenMetaverse.Packets.CoarseLocationUpdatePacket"/>
25494 containing the location of agents in the simulator</summary>
25495 </member>
25496 <member name="E:OpenMetaverse.GridManager.GridRegion">
25497 <summary>Raised when the simulator sends a Region Data in response to
25498 a Map request</summary>
25499 </member>
25500 <member name="E:OpenMetaverse.GridManager.GridLayer">
25501 <summary>Raised when the simulator sends GridLayer object containing
25502 a map tile coordinates and texture information</summary>
25503 </member>
25504 <member name="E:OpenMetaverse.GridManager.GridItems">
25505 <summary>Raised when the simulator sends GridItems object containing
25506 details on events, land sales at a specific location</summary>
25507 </member>
25508 <member name="E:OpenMetaverse.GridManager.RegionHandleReply">
25509 <summary>Raised in response to a Region lookup</summary>
25510 </member>
25511 <member name="P:OpenMetaverse.GridManager.SunPhase">
25512 <summary>Unknown</summary>
25513 </member>
25514 <member name="P:OpenMetaverse.GridManager.SunDirection">
25515 <summary>Current direction of the sun</summary>
25516 </member>
25517 <member name="P:OpenMetaverse.GridManager.SunAngVelocity">
25518 <summary>Current angular velocity of the sun</summary>
25519 </member>
25520 <member name="P:OpenMetaverse.GridManager.TimeOfDay">
25521 <summary>Microseconds since the start of SL 4-hour day</summary>
25522 </member>
25523 <member name="M:OpenMetaverse.CoordinateFrame.LookDirection(OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
25871 <summary> 25524 <summary>
25525
25872 </summary> 25526 </summary>
25527 <param name="at">Looking direction, must be a normalized vector</param>
25528 <param name="upDirection">Up direction, must be a normalized vector</param>
25873 </member> 25529 </member>
25874 <member name="F:OpenMetaverse.TextureAttributes.OffsetV"> 25530 <member name="M:OpenMetaverse.CoordinateFrame.LookDirection(System.Double)">
25875 <summary> 25531 <summary>
25532 Align the coordinate frame X and Y axis with a given rotation
25533 around the Z axis in radians
25876 </summary> 25534 </summary>
25535 <param name="heading">Absolute rotation around the Z axis in
25536 radians</param>
25877 </member> 25537 </member>
25878 <member name="F:OpenMetaverse.TextureAttributes.Rotation"> 25538 <member name="P:OpenMetaverse.CoordinateFrame.Origin">
25539 <summary>Origin position of this coordinate frame</summary>
25540 </member>
25541 <member name="P:OpenMetaverse.CoordinateFrame.XAxis">
25542 <summary>X axis of this coordinate frame, or Forward/At in grid terms</summary>
25543 </member>
25544 <member name="P:OpenMetaverse.CoordinateFrame.YAxis">
25545 <summary>Y axis of this coordinate frame, or Left in grid terms</summary>
25546 </member>
25547 <member name="P:OpenMetaverse.CoordinateFrame.ZAxis">
25548 <summary>Z axis of this coordinate frame, or Up in grid terms</summary>
25549 </member>
25550 <member name="T:OpenMetaverse.Assets.AssetTexture">
25879 <summary> 25551 <summary>
25552 Represents a texture
25880 </summary> 25553 </summary>
25881 </member> 25554 </member>
25882 <member name="F:OpenMetaverse.TextureAttributes.Material"> 25555 <member name="F:OpenMetaverse.Assets.AssetTexture.Image">
25556 <summary>A <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object containing image data</summary>
25557 </member>
25558 <member name="F:OpenMetaverse.Assets.AssetTexture.LayerInfo">
25559 <summary></summary>
25560 </member>
25561 <member name="F:OpenMetaverse.Assets.AssetTexture.Components">
25562 <summary></summary>
25563 </member>
25564 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor">
25565 <summary>Initializes a new instance of an AssetTexture object</summary>
25566 </member>
25567 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor(OpenMetaverse.UUID,System.Byte[])">
25883 <summary> 25568 <summary>
25569 Initializes a new instance of an AssetTexture object
25884 </summary> 25570 </summary>
25571 <param name="assetID">A unique <see cref="T:OpenMetaverse.UUID"/> specific to this asset</param>
25572 <param name="assetData">A byte array containing the raw asset data</param>
25885 </member> 25573 </member>
25886 <member name="F:OpenMetaverse.TextureAttributes.Media"> 25574 <member name="M:OpenMetaverse.Assets.AssetTexture.#ctor(OpenMetaverse.Imaging.ManagedImage)">
25887 <summary> 25575 <summary>
25576 Initializes a new instance of an AssetTexture object
25888 </summary> 25577 </summary>
25578 <param name="image">A <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object containing texture data</param>
25889 </member> 25579 </member>
25890 <member name="F:OpenMetaverse.TextureAttributes.Glow"> 25580 <member name="M:OpenMetaverse.Assets.AssetTexture.Encode">
25891 <summary> 25581 <summary>
25582 Populates the <seealso cref="!:AssetData"/> byte array with a JPEG2000
25583 encoded image created from the data in <seealso cref="F:OpenMetaverse.Assets.AssetTexture.Image"/>
25892 </summary> 25584 </summary>
25893 </member> 25585 </member>
25894 <member name="F:OpenMetaverse.TextureAttributes.All"> 25586 <member name="M:OpenMetaverse.Assets.AssetTexture.Decode">
25895 <summary> 25587 <summary>
25588 Decodes the JPEG2000 data in <code>AssetData</code> to the
25589 <seealso cref="T:OpenMetaverse.Imaging.ManagedImage"/> object <seealso cref="F:OpenMetaverse.Assets.AssetTexture.Image"/>
25896 </summary> 25590 </summary>
25591 <returns>True if the decoding was successful, otherwise false</returns>
25897 </member> 25592 </member>
25898 <member name="T:OpenMetaverse.Rendering.LindenMesh.LODMesh"> 25593 <member name="M:OpenMetaverse.Assets.AssetTexture.DecodeLayerBoundaries">
25899 <summary> 25594 <summary>
25900 Level of Detail mesh 25595 Decodes the begin and end byte positions for each quality layer in
25596 the image
25901 </summary> 25597 </summary>
25598 <returns></returns>
25902 </member> 25599 </member>
25903 <member name="T:OpenMetaverse.Rendering.FacetedMesh"> 25600 <member name="P:OpenMetaverse.Assets.AssetTexture.AssetType">
25601 <summary>Override the base classes AssetType</summary>
25602 </member>
25603 <member name="T:OpenMetaverse.Settings">
25904 <summary> 25604 <summary>
25905 Contains all mesh faces that belong to a prim 25605 Class for controlling various system settings.
25906 </summary> 25606 </summary>
25607 <remarks>Some values are readonly because they affect things that
25608 happen when the GridClient object is initialized, so changing them at
25609 runtime won't do any good. Non-readonly values may affect things that
25610 happen at login or dynamically</remarks>
25907 </member> 25611 </member>
25908 <member name="F:OpenMetaverse.Rendering.FacetedMesh.Faces"> 25612 <member name="F:OpenMetaverse.Settings.AGNI_LOGIN_SERVER">
25909 <summary>List of primitive faces</summary> 25613 <summary>Main grid login server</summary>
25910 </member> 25614 </member>
25911 <member name="M:OpenMetaverse.Rendering.FacetedMesh.TryDecodeFromAsset(OpenMetaverse.Primitive,OpenMetaverse.Assets.AssetMesh,OpenMetaverse.Rendering.DetailLevel,OpenMetaverse.Rendering.FacetedMesh@)"> 25615 <member name="F:OpenMetaverse.Settings.ADITI_LOGIN_SERVER">
25616 <summary>Beta grid login server</summary>
25617 </member>
25618 <member name="F:OpenMetaverse.Settings.ENABLE_INVENTORY_STORE">
25912 <summary> 25619 <summary>
25913 Decodes mesh asset into FacetedMesh 25620 InventoryManager requests inventory information on login,
25621 GridClient initializes an Inventory store for main inventory.
25914 </summary> 25622 </summary>
25915 <param name="prim">Mesh primitive</param>
25916 <param name="meshAsset">Asset retrieved from the asset server</param>
25917 <param name="LOD">Level of detail</param>
25918 <param name="mesh">Resulting decoded FacetedMesh</param>
25919 <returns>True if mesh asset decoding was successful</returns>
25920 </member> 25623 </member>
25921 <member name="M:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.#ctor"> 25624 <member name="F:OpenMetaverse.Settings.ENABLE_LIBRARY_STORE">
25922 <summary> 25625 <summary>
25923 Constructor for default logging settings 25626 InventoryManager requests library information on login,
25627 GridClient initializes an Inventory store for the library.
25924 </summary> 25628 </summary>
25925 </member> 25629 </member>
25926 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.Enabled"> 25630 <member name="F:OpenMetaverse.Settings.PING_INTERVAL">
25927 <summary>Enable logging</summary> 25631 <summary>Number of milliseconds between sending pings to each sim</summary>
25928 </member> 25632 </member>
25929 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.Folder"> 25633 <member name="F:OpenMetaverse.Settings.DEFAULT_AGENT_UPDATE_INTERVAL">
25930 <summary>The folder where any logs will be created</summary> 25634 <summary>Number of milliseconds between sending camera updates</summary>
25931 </member> 25635 </member>
25932 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.FileNamePrefix"> 25636 <member name="F:OpenMetaverse.Settings.INTERPOLATION_INTERVAL">
25933 <summary>This will be prepended to beginning of each log file</summary> 25637 <summary>Number of milliseconds between updating the current
25638 positions of moving, non-accelerating and non-colliding objects</summary>
25934 </member> 25639 </member>
25935 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.FileNameSuffix"> 25640 <member name="F:OpenMetaverse.Settings.NETWORK_TICK_INTERVAL">
25936 <summary>The suffix or extension to be appended to each log file</summary> 25641 <summary>Millisecond interval between ticks, where all ACKs are
25642 sent out and the age of unACKed packets is checked</summary>
25937 </member> 25643 </member>
25938 <member name="F:OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings.LogLevel"> 25644 <member name="F:OpenMetaverse.Settings.PACKET_INBOX_SIZE">
25939 <summary> 25645 <summary>The initial size of the packet inbox, where packets are
25940 0: NONE - No logging 25646 stored before processing</summary>
25941 1: ERROR - Log errors only
25942 2: WARNING - Log errors and warnings
25943 3: INFO - Log errors, warnings and info
25944 4: DEBUG - Log errors, warnings, info and debug
25945 </summary>
25946 </member> 25647 </member>
25947 <member name="T:OpenMetaverse.Voice.VoiceGateway.AudioPropertiesEventArgs"> 25648 <member name="F:OpenMetaverse.Settings.MAX_PACKET_SIZE">
25948 Audio Properties Events are sent after audio capture is started. These events are used to display a microphone VU meter</member> 25649 <summary>Maximum size of packet that we want to send over the wire</summary>
25949 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnVoiceResponse"> 25650 </member>
25651 <member name="F:OpenMetaverse.Settings.MAX_SEQUENCE">
25652 <summary>The maximum value of a packet sequence number before it
25653 rolls over back to one</summary>
25654 </member>
25655 <member name="F:OpenMetaverse.Settings.RESOURCE_DIR">
25656 <summary>The relative directory where external resources are kept</summary>
25657 </member>
25658 <member name="F:OpenMetaverse.Settings.LOGIN_SERVER">
25659 <summary>Login server to connect to</summary>
25660 </member>
25661 <member name="F:OpenMetaverse.Settings.BIND_ADDR">
25662 <summary>IP Address the client will bind to</summary>
25663 </member>
25664 <member name="F:OpenMetaverse.Settings.USE_LLSD_LOGIN">
25665 <summary>Use XML-RPC Login or LLSD Login, default is XML-RPC Login</summary>
25666 </member>
25667 <member name="F:OpenMetaverse.Settings.HTTP_INVENTORY">
25950 <summary> 25668 <summary>
25951 Event for most mundane request reposnses. 25669 Use Caps for fetching inventory where available
25952 </summary> 25670 </summary>
25953 </member> 25671 </member>
25954 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnConnectorCreateResponse"> 25672 <member name="F:OpenMetaverse.Settings.TRANSFER_TIMEOUT">
25955 <summary>Response to Connector.Create request</summary> 25673 <summary>Number of milliseconds before an asset transfer will time
25674 out</summary>
25956 </member> 25675 </member>
25957 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxGetCaptureDevicesResponse"> 25676 <member name="F:OpenMetaverse.Settings.TELEPORT_TIMEOUT">
25958 <summary>Response to Aux.GetCaptureDevices request</summary> 25677 <summary>Number of milliseconds before a teleport attempt will time
25678 out</summary>
25959 </member> 25679 </member>
25960 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxGetRenderDevicesResponse"> 25680 <member name="F:OpenMetaverse.Settings.LOGOUT_TIMEOUT">
25961 <summary>Response to Aux.GetRenderDevices request</summary> 25681 <summary>Number of milliseconds before NetworkManager.Logout() will
25682 time out</summary>
25962 </member> 25683 </member>
25963 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAuxAudioPropertiesEvent"> 25684 <member name="F:OpenMetaverse.Settings.CAPS_TIMEOUT">
25964 <summary>Audio Properties Events are sent after audio capture is started. 25685 <summary>Number of milliseconds before a CAPS call will time out</summary>
25965 These events are used to display a microphone VU meter</summary> 25686 <remarks>Setting this too low will cause web requests time out and
25687 possibly retry repeatedly</remarks>
25966 </member> 25688 </member>
25967 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAccountLoginResponse"> 25689 <member name="F:OpenMetaverse.Settings.LOGIN_TIMEOUT">
25968 <summary>Response to Account.Login request</summary> 25690 <summary>Number of milliseconds for xml-rpc to timeout</summary>
25969 </member> 25691 </member>
25970 <member name="E:OpenMetaverse.Voice.VoiceGateway.OnAccountLoginStateChangeEvent"> 25692 <member name="F:OpenMetaverse.Settings.RESEND_TIMEOUT">
25971 <summary>This event message is sent whenever the login state of the 25693 <summary>Milliseconds before a packet is assumed lost and resent</summary>
25972 particular Account has transitioned from one value to another</summary>
25973 </member> 25694 </member>
25974 <member name="P:OpenMetaverse.Voice.VoiceGateway.CaptureDevices"> 25695 <member name="F:OpenMetaverse.Settings.SIMULATOR_TIMEOUT">
25975 <summary> 25696 <summary>Milliseconds without receiving a packet before the
25976 List of audio input devices 25697 connection to a simulator is assumed lost</summary>
25977 </summary>
25978 </member> 25698 </member>
25979 <member name="P:OpenMetaverse.Voice.VoiceGateway.PlaybackDevices"> 25699 <member name="F:OpenMetaverse.Settings.MAP_REQUEST_TIMEOUT">
25980 <summary> 25700 <summary>Milliseconds to wait for a simulator info request through
25981 List of audio output devices 25701 the grid interface</summary>
25982 </summary>
25983 </member> 25702 </member>
25984 <member name="P:OpenMetaverse.Voice.VoiceGateway.TestMode"> 25703 <member name="F:OpenMetaverse.Settings.PACKET_ARCHIVE_SIZE">
25985 <summary> 25704 <summary>The maximum size of the sequence number archive, used to
25986 Set audio test mode 25705 check for resent and/or duplicate packets</summary>
25987 </summary>
25988 </member> 25706 </member>
25989 <member name="M:OpenMetaverse.Voice.VoiceGateway.AccountLogin(System.String,System.String,System.String,System.String,System.String,System.Int32,System.Boolean)"> 25707 <member name="F:OpenMetaverse.Settings.MAX_PENDING_ACKS">
25990 <summary> 25708 <summary>Maximum number of queued ACKs to be sent before SendAcks()
25991 This is used to login a specific user account(s). It may only be called after 25709 is forced</summary>
25992 Connector initialization has completed successfully
25993 </summary>
25994 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param>
25995 <param name="AccountName">User's account name</param>
25996 <param name="AccountPassword">User's account password</param>
25997 <param name="AudioSessionAnswerMode">Values may be �AutoAnswer� or �VerifyAnswer�</param>
25998 <param name="AccountURI">""</param>
25999 <param name="ParticipantPropertyFrequency">This is an integer that specifies how often
26000 the daemon will send participant property events while in a channel. If this is not set
26001 the default will be �on state change�, which means that the events will be sent when
26002 the participant starts talking, stops talking, is muted, is unmuted.
26003 The valid values are:
26004 0 � Never
26005 5 � 10 times per second
26006 10 � 5 times per second
26007 50 � 1 time per second
26008 100 � on participant state change (this is the default)</param>
26009 <param name="EnableBuddiesAndPresence">false</param>
26010 <returns>
26011 </returns>
26012 </member> 25710 </member>
26013 <member name="M:OpenMetaverse.Voice.VoiceGateway.AccountLogout(System.String)"> 25711 <member name="F:OpenMetaverse.Settings.STATS_QUEUE_SIZE">
26014 <summary> 25712 <summary>Network stats queue length (seconds)</summary>
26015 This is used to logout a user session. It should only be called with a valid AccountHandle.
26016 </summary>
26017 <param name="AccountHandle">Handle returned from successful Connector �login� request</param>
26018 <returns>
26019 </returns>
26020 </member> 25713 </member>
26021 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxGetCaptureDevices"> 25714 <member name="F:OpenMetaverse.Settings.CACHE_PRIMITIVES">
26022 <summary> 25715 <summary>
26023 This is used to get a list of audio devices that can be used for capture (input) of voice. 25716 Primitives will be reused when falling in/out of interest list (and shared between clients)
25717 prims returning to interest list do not need re-requested
25718 Helps also in not re-requesting prim.Properties for code that checks for a Properties == null per client
26024 </summary> 25719 </summary>
26025 <returns>
26026 </returns>
26027 </member> 25720 </member>
26028 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxGetRenderDevices"> 25721 <member name="F:OpenMetaverse.Settings.POOL_PARCEL_DATA">
26029 <summary> 25722 <summary>
26030 This is used to get a list of audio devices that can be used for render (playback) of voice. 25723 Pool parcel data between clients (saves on requesting multiple times when all clients may need it)
26031 </summary> 25724 </summary>
26032 </member> 25725 </member>
26033 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetRenderDevice(System.String)"> 25726 <member name="F:OpenMetaverse.Settings.SIMULATOR_POOL_TIMEOUT">
26034 <summary> 25727 <summary>
26035 This command is used to select the render device. 25728 How long to preserve cached data when no client is connected to a simulator
25729 The reason for setting it to something like 2 minutes is in case a client
25730 is running back and forth between region edges or a sim is comming and going
26036 </summary> 25731 </summary>
26037 <param name="RenderDeviceSpecifier">The name of the device as returned by the Aux.GetRenderDevices command.</param>
26038 </member> 25732 </member>
26039 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetCaptureDevice(System.String)"> 25733 <member name="F:OpenMetaverse.Settings.STORE_LAND_PATCHES">
26040 <summary> 25734 <summary>Enable/disable storing terrain heightmaps in the
26041 This command is used to select the capture device. 25735 TerrainManager</summary>
26042 </summary>
26043 <param name="CaptureDeviceSpecifier">The name of the device as returned by the Aux.GetCaptureDevices command.</param>
26044 </member> 25736 </member>
26045 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxCaptureAudioStart(System.Int32)"> 25737 <member name="F:OpenMetaverse.Settings.SEND_AGENT_UPDATES">
26046 <summary> 25738 <summary>Enable/disable sending periodic camera updates</summary>
26047 This command is used to start the audio capture process which will cause
26048 AuxAudioProperty Events to be raised. These events can be used to display a
26049 microphone VU meter for the currently selected capture device. This command
26050 should not be issued if the user is on a call.
26051 </summary>
26052 <param name="Duration">(unused but required)</param>
26053 <returns>
26054 </returns>
26055 </member> 25739 </member>
26056 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxCaptureAudioStop"> 25740 <member name="F:OpenMetaverse.Settings.SEND_AGENT_APPEARANCE">
26057 <summary> 25741 <summary>Enable/disable automatically setting agent appearance at
26058 This command is used to stop the audio capture process. 25742 login and after sim crossing</summary>
26059 </summary>
26060 <returns>
26061 </returns>
26062 </member> 25743 </member>
26063 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetMicLevel(System.Int32)"> 25744 <member name="F:OpenMetaverse.Settings.SEND_AGENT_THROTTLE">
26064 <summary> 25745 <summary>Enable/disable automatically setting the bandwidth throttle
26065 This command is used to set the mic volume while in the audio tuning process. 25746 after connecting to each simulator</summary>
26066 Once an acceptable mic level is attained, the application must issue a 25747 <remarks>The default throttle uses the equivalent of the maximum
26067 connector set mic volume command to have that level be used while on voice 25748 bandwidth setting in the official client. If you do not set a
26068 calls. 25749 throttle your connection will by default be throttled well below
26069 </summary> 25750 the minimum values and you may experience connection problems</remarks>
26070 <param name="Level">the microphone volume (-100 to 100 inclusive)</param>
26071 <returns>
26072 </returns>
26073 </member> 25751 </member>
26074 <member name="M:OpenMetaverse.Voice.VoiceGateway.AuxSetSpeakerLevel(System.Int32)"> 25752 <member name="F:OpenMetaverse.Settings.SEND_PINGS">
26075 <summary> 25753 <summary>Enable/disable the sending of pings to monitor lag and
26076 This command is used to set the speaker volume while in the audio tuning 25754 packet loss</summary>
26077 process. Once an acceptable speaker level is attained, the application must
26078 issue a connector set speaker volume command to have that level be used while
26079 on voice calls.
26080 </summary>
26081 <param name="Level">the speaker volume (-100 to 100 inclusive)</param>
26082 <returns>
26083 </returns>
26084 </member> 25755 </member>
26085 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorCreate(System.String,System.String,System.UInt16,System.UInt16,OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings)"> 25756 <member name="F:OpenMetaverse.Settings.MULTIPLE_SIMS">
26086 <summary> 25757 <summary>Should we connect to multiple sims? This will allow
26087 This is used to initialize and stop the Connector as a whole. The Connector 25758 viewing in to neighboring simulators and sim crossings
26088 Create call must be completed successfully before any other requests are made 25759 (Experimental)</summary>
26089 (typically during application initialization). The shutdown should be called
26090 when the application is shutting down to gracefully release resources
26091 </summary>
26092 <param name="ClientName">A string value indicting the Application name</param>
26093 <param name="AccountManagementServer">URL for the management server</param>
26094 <param name="Logging">LoggingSettings</param>
26095 <param name="MaximumPort">
26096 </param>
26097 <param name="MinimumPort">
26098 </param>
26099 </member> 25760 </member>
26100 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorInitiateShutdown(System.String)"> 25761 <member name="F:OpenMetaverse.Settings.ALWAYS_DECODE_OBJECTS">
26101 <summary> 25762 <summary>If true, all object update packets will be decoded in to
26102 Shutdown Connector -- Should be called when the application is shutting down 25763 native objects. If false, only updates for our own agent will be
26103 to gracefully release resources 25764 decoded. Registering an event handler will force objects for that
26104 </summary> 25765 type to always be decoded. If this is disabled the object tracking
26105 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param> 25766 will have missing or partial prim and avatar information</summary>
26106 </member> 25767 </member>
26107 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorMuteLocalMic(System.String,System.Boolean)"> 25768 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_OBJECTS">
26108 <summary> 25769 <summary>If true, when a cached object check is received from the
26109 Mute or unmute the microphone 25770 server the full object info will automatically be requested</summary>
26110 </summary>
26111 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param>
26112 <param name="Mute">true (mute) or false (unmute)</param>
26113 </member> 25771 </member>
26114 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorMuteLocalSpeaker(System.String,System.Boolean)"> 25772 <member name="F:OpenMetaverse.Settings.ENABLE_CAPS">
26115 <summary> 25773 <summary>Whether to establish connections to HTTP capabilities
26116 Mute or unmute the speaker 25774 servers for simulators</summary>
26117 </summary>
26118 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param>
26119 <param name="Mute">true (mute) or false (unmute)</param>
26120 </member> 25775 </member>
26121 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorSetLocalMicVolume(System.String,System.Int32)"> 25776 <member name="F:OpenMetaverse.Settings.ENABLE_SIMSTATS">
26122 <summary> 25777 <summary>Whether to decode sim stats</summary>
26123 Set microphone volume
26124 </summary>
26125 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param>
26126 <param name="Value">The level of the audio, a number between -100 and 100 where
26127 0 represents �normal� speaking volume</param>
26128 </member> 25778 </member>
26129 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectorSetLocalSpeakerVolume(System.String,System.Int32)"> 25779 <member name="F:OpenMetaverse.Settings.LOG_ALL_CAPS_ERRORS">
26130 <summary> 25780 <summary>The capabilities servers are currently designed to
26131 Set local speaker volume 25781 periodically return a 502 error which signals for the client to
26132 </summary> 25782 re-establish a connection. Set this to true to log those 502 errors</summary>
26133 <param name="ConnectorHandle">Handle returned from successful Connector �create� request</param>
26134 <param name="Value">The level of the audio, a number between -100 and 100 where
26135 0 represents �normal� speaking volume</param>
26136 </member> 25783 </member>
26137 <member name="M:OpenMetaverse.Voice.VoiceGateway.Start"> 25784 <member name="F:OpenMetaverse.Settings.FETCH_MISSING_INVENTORY">
26138 <summary> 25785 <summary>If true, any reference received for a folder or item
26139 Start up the Voice service. 25786 the library is not aware of will automatically be fetched</summary>
26140 </summary>
26141 </member> 25787 </member>
26142 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnVoiceResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceResponseEventArgs)"> 25788 <member name="F:OpenMetaverse.Settings.DISABLE_AGENT_UPDATE_DUPLICATE_CHECK">
26143 <summary> 25789 <summary>If true, and <code>SEND_AGENT_UPDATES</code> is true,
26144 Handle miscellaneous request status 25790 AgentUpdate packets will continuously be sent out to give the bot
26145 </summary> 25791 smoother movement and autopiloting</summary>
26146 <param name="sender"> 25792 </member>
26147 </param> 25793 <member name="F:OpenMetaverse.Settings.AVATAR_TRACKING">
26148 <param name="e"> 25794 <summary>If true, currently visible avatars will be stored
26149 </param> 25795 in dictionaries inside <code>Simulator.ObjectAvatars</code>.
26150 ///<remarks>If something goes wrong, we log it.</remarks></member> 25796 If false, a new Avatar or Primitive object will be created
26151 <member name="M:OpenMetaverse.Voice.VoiceGateway.Dispose"> 25797 each time an object update packet is received</summary>
25798 </member>
25799 <member name="F:OpenMetaverse.Settings.OBJECT_TRACKING">
25800 <summary>If true, currently visible avatars will be stored
25801 in dictionaries inside <code>Simulator.ObjectPrimitives</code>.
25802 If false, a new Avatar or Primitive object will be created
25803 each time an object update packet is received</summary>
25804 </member>
25805 <member name="F:OpenMetaverse.Settings.USE_INTERPOLATION_TIMER">
25806 <summary>If true, position and velocity will periodically be
25807 interpolated (extrapolated, technically) for objects and
25808 avatars that are being tracked by the library. This is
25809 necessary to increase the accuracy of speed and position
25810 estimates for simulated objects</summary>
25811 </member>
25812 <member name="F:OpenMetaverse.Settings.TRACK_UTILIZATION">
26152 <summary> 25813 <summary>
26153 Cleanup oject resources 25814 If true, utilization statistics will be tracked. There is a minor penalty
25815 in CPU time for enabling this option.
26154 </summary> 25816 </summary>
26155 </member> 25817 </member>
26156 <member name="M:OpenMetaverse.Voice.VoiceGateway.Network_EventQueueRunning(System.Object,OpenMetaverse.EventQueueRunningEventArgs)"> 25818 <member name="F:OpenMetaverse.Settings.PARCEL_TRACKING">
25819 <summary>If true, parcel details will be stored in the
25820 <code>Simulator.Parcels</code> dictionary as they are received</summary>
25821 </member>
25822 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_PARCEL_ACL">
26157 <summary> 25823 <summary>
26158 Request voice cap when changing regions 25824 If true, an incoming parcel properties reply will automatically send
25825 a request for the parcel access list
26159 </summary> 25826 </summary>
26160 </member> 25827 </member>
26161 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnSessionStateChangeEvent(System.Object,OpenMetaverse.Voice.VoiceGateway.SessionStateChangeEventArgs)"> 25828 <member name="F:OpenMetaverse.Settings.ALWAYS_REQUEST_PARCEL_DWELL">
26162 <summary> 25829 <summary>
26163 Handle a change in session state 25830 if true, an incoming parcel properties reply will automatically send
25831 a request for the traffic count.
26164 </summary> 25832 </summary>
26165 </member> 25833 </member>
26166 <member name="M:OpenMetaverse.Voice.VoiceGateway.CloseSession(System.String)"> 25834 <member name="F:OpenMetaverse.Settings.USE_ASSET_CACHE">
26167 <summary> 25835 <summary>
26168 Close a voice session 25836 If true, images, and other assets downloaded from the server
25837 will be cached in a local directory
26169 </summary> 25838 </summary>
26170 <param name="sessionHandle">
26171 </param>
26172 </member> 25839 </member>
26173 <member name="M:OpenMetaverse.Voice.VoiceGateway.FindSession(System.String,System.Boolean)"> 25840 <member name="F:OpenMetaverse.Settings.ASSET_CACHE_DIR">
25841 <summary>Path to store cached texture data</summary>
25842 </member>
25843 <member name="F:OpenMetaverse.Settings.ASSET_CACHE_MAX_SIZE">
25844 <summary>Maximum size cached files are allowed to take on disk (bytes)</summary>
25845 </member>
25846 <member name="F:OpenMetaverse.Settings.DEFAULT_EFFECT_COLOR">
25847 <summary>Default color used for viewer particle effects</summary>
25848 </member>
25849 <member name="F:OpenMetaverse.Settings.MAX_RESEND_COUNT">
25850 <summary>Maximum number of times to resend a failed packet</summary>
25851 </member>
25852 <member name="F:OpenMetaverse.Settings.THROTTLE_OUTGOING_PACKETS">
25853 <summary>Throttle outgoing packet rate</summary>
25854 </member>
25855 <member name="F:OpenMetaverse.Settings.CLIENT_IDENTIFICATION_TAG">
25856 <summary>UUID of a texture used by some viewers to indentify type of client used</summary>
25857 </member>
25858 <member name="F:OpenMetaverse.Settings.USE_HTTP_TEXTURES">
26174 <summary> 25859 <summary>
26175 Locate a Session context from its handle 25860 Download textures using GetTexture capability when available
26176 </summary> 25861 </summary>
26177 <remarks>Creates the session context if it does not exist.</remarks>
26178 </member> 25862 </member>
26179 <member name="M:OpenMetaverse.Voice.VoiceGateway.cClient_OnComplete(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)"> 25863 <member name="F:OpenMetaverse.Settings.MAX_CONCURRENT_TEXTURE_DOWNLOADS">
25864 <summary>The maximum number of concurrent texture downloads allowed</summary>
25865 <remarks>Increasing this number will not necessarily increase texture retrieval times due to
25866 simulator throttles</remarks>
25867 </member>
25868 <member name="F:OpenMetaverse.Settings.PIPELINE_REFRESH_INTERVAL">
26180 <summary> 25869 <summary>
26181 Handle completion of main voice cap request. 25870 The Refresh timer inteval is used to set the delay between checks for stalled texture downloads
26182 </summary> 25871 </summary>
26183 <param name="client"> 25872 <remarks>This is a static variable which applies to all instances</remarks>
26184 </param>
26185 <param name="result">
26186 </param>
26187 <param name="error">
26188 </param>
26189 </member> 25873 </member>
26190 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnDaemonRunning"> 25874 <member name="F:OpenMetaverse.Settings.PIPELINE_REQUEST_TIMEOUT">
26191 <summary> 25875 <summary>
26192 Daemon has started so connect to it. 25876 Textures taking longer than this value will be flagged as timed out and removed from the pipeline
26193 </summary> 25877 </summary>
26194 </member> 25878 </member>
26195 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnDaemonConnected"> 25879 <member name="F:OpenMetaverse.Settings.LOG_LEVEL">
26196 <summary> 25880 <summary>
26197 The daemon TCP connection is open. 25881 Get or set the minimum log level to output to the console by default
25882
25883 If the library is not compiled with DEBUG defined and this level is set to DEBUG
25884 You will get no output on the console. This behavior can be overriden by creating
25885 a logger configuration file for log4net
26198 </summary> 25886 </summary>
26199 </member> 25887 </member>
26200 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnConnectorCreateResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceConnectorEventArgs)"> 25888 <member name="F:OpenMetaverse.Settings.LOG_NAMES">
25889 <summary>Attach avatar names to log messages</summary>
25890 </member>
25891 <member name="F:OpenMetaverse.Settings.LOG_RESENDS">
25892 <summary>Log packet retransmission info</summary>
25893 </member>
25894 <member name="F:OpenMetaverse.Settings.LOG_DISKCACHE">
25895 <summary>Log disk cache misses and other info</summary>
25896 </member>
25897 <member name="M:OpenMetaverse.Settings.#ctor(OpenMetaverse.GridClient)">
25898 <summary>Constructor</summary>
25899 <param name="client">Reference to a GridClient object</param>
25900 </member>
25901 <member name="M:OpenMetaverse.Settings.EconomyDataHandler(System.Object,OpenMetaverse.PacketReceivedEventArgs)">
25902 <summary>Process an incoming packet and raise the appropriate events</summary>
25903 <param name="sender">The sender</param>
25904 <param name="e">The EventArgs object containing the packet data</param>
25905 </member>
25906 <member name="P:OpenMetaverse.Settings.UPLOAD_COST">
25907 <summary>Cost of uploading an asset</summary>
25908 <remarks>Read-only since this value is dynamically fetched at login</remarks>
25909 </member>
25910 <member name="T:OpenMetaverse.GridClient">
26201 <summary> 25911 <summary>
26202 Handle creation of the Connector. 25912 Main class to expose grid functionality to clients. All of the
25913 classes needed for sending and receiving data are accessible through
25914 this class.
26203 </summary> 25915 </summary>
25916 <example>
25917 <code>
25918 // Example minimum code required to instantiate class and
25919 // connect to a simulator.
25920 using System;
25921 using System.Collections.Generic;
25922 using System.Text;
25923 using OpenMetaverse;
25924
25925 namespace FirstBot
25926 {
25927 class Bot
25928 {
25929 public static GridClient Client;
25930 static void Main(string[] args)
25931 {
25932 Client = new GridClient(); // instantiates the GridClient class
25933 // to the global Client object
25934 // Login to Simulator
25935 Client.Network.Login("FirstName", "LastName", "Password", "FirstBot", "1.0");
25936 // Wait for a Keypress
25937 Console.ReadLine();
25938 // Logout of simulator
25939 Client.Network.Logout();
25940 }
25941 }
25942 }
25943 </code>
25944 </example>
26204 </member> 25945 </member>
26205 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnAuxGetRenderDevicesResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceDevicesEventArgs)"> 25946 <member name="F:OpenMetaverse.GridClient.Network">
25947 <summary>Networking subsystem</summary>
25948 </member>
25949 <member name="F:OpenMetaverse.GridClient.Settings">
25950 <summary>Settings class including constant values and changeable
25951 parameters for everything</summary>
25952 </member>
25953 <member name="F:OpenMetaverse.GridClient.Parcels">
25954 <summary>Parcel (subdivided simulator lots) subsystem</summary>
25955 </member>
25956 <member name="F:OpenMetaverse.GridClient.Self">
25957 <summary>Our own avatars subsystem</summary>
25958 </member>
25959 <member name="F:OpenMetaverse.GridClient.Avatars">
25960 <summary>Other avatars subsystem</summary>
25961 </member>
25962 <member name="F:OpenMetaverse.GridClient.Estate">
25963 <summary>Estate subsystem</summary>
25964 </member>
25965 <member name="F:OpenMetaverse.GridClient.Friends">
25966 <summary>Friends list subsystem</summary>
25967 </member>
25968 <member name="F:OpenMetaverse.GridClient.Grid">
25969 <summary>Grid (aka simulator group) subsystem</summary>
25970 </member>
25971 <member name="F:OpenMetaverse.GridClient.Objects">
25972 <summary>Object subsystem</summary>
25973 </member>
25974 <member name="F:OpenMetaverse.GridClient.Groups">
25975 <summary>Group subsystem</summary>
25976 </member>
25977 <member name="F:OpenMetaverse.GridClient.Assets">
25978 <summary>Asset subsystem</summary>
25979 </member>
25980 <member name="F:OpenMetaverse.GridClient.Appearance">
25981 <summary>Appearance subsystem</summary>
25982 </member>
25983 <member name="F:OpenMetaverse.GridClient.Inventory">
25984 <summary>Inventory subsystem</summary>
25985 </member>
25986 <member name="F:OpenMetaverse.GridClient.Directory">
25987 <summary>Directory searches including classifieds, people, land
25988 sales, etc</summary>
25989 </member>
25990 <member name="F:OpenMetaverse.GridClient.Terrain">
25991 <summary>Handles land, wind, and cloud heightmaps</summary>
25992 </member>
25993 <member name="F:OpenMetaverse.GridClient.Sound">
25994 <summary>Handles sound-related networking</summary>
25995 </member>
25996 <member name="F:OpenMetaverse.GridClient.Throttle">
25997 <summary>Throttling total bandwidth usage, or allocating bandwidth
25998 for specific data stream types</summary>
25999 </member>
26000 <member name="M:OpenMetaverse.GridClient.#ctor">
26206 <summary> 26001 <summary>
26207 Handle response to audio output device query 26002 Default constructor
26208 </summary> 26003 </summary>
26209 </member> 26004 </member>
26210 <member name="M:OpenMetaverse.Voice.VoiceGateway.connector_OnAuxGetCaptureDevicesResponse(System.Object,OpenMetaverse.Voice.VoiceGateway.VoiceDevicesEventArgs)"> 26005 <member name="M:OpenMetaverse.GridClient.ToString">
26211 <summary> 26006 <summary>
26212 Handle response to audio input device query 26007 Return the full name of this instance
26213 </summary> 26008 </summary>
26009 <returns>Client avatars full name</returns>
26214 </member> 26010 </member>
26215 <member name="M:OpenMetaverse.Voice.VoiceGateway.ParcelChanged"> 26011 <member name="T:OpenMetaverse.AssetCache">
26216 <summary> 26012 <summary>
26217 Set voice channel for new parcel 26013 Class that handles the local asset cache
26218 </summary> 26014 </summary>
26219 </member> 26015 </member>
26220 <member name="M:OpenMetaverse.Voice.VoiceGateway.RequestParcelInfo(System.Uri)"> 26016 <member name="M:OpenMetaverse.AssetCache.#ctor(OpenMetaverse.GridClient)">
26221 <summary> 26017 <summary>
26222 Request info from a parcel capability Uri. 26018 Default constructor
26223 </summary> 26019 </summary>
26224 <param name="cap"> 26020 <param name="client">A reference to the GridClient object</param>
26225 </param>
26226 </member> 26021 </member>
26227 <member name="M:OpenMetaverse.Voice.VoiceGateway.pCap_OnComplete(OpenMetaverse.Http.CapsClient,OpenMetaverse.StructuredData.OSD,System.Exception)"> 26022 <member name="M:OpenMetaverse.AssetCache.DestroyTimer">
26228 <summary> 26023 <summary>
26229 Receive parcel voice cap 26024 Disposes cleanup timer
26230 </summary> 26025 </summary>
26231 <param name="client">
26232 </param>
26233 <param name="result">
26234 </param>
26235 <param name="error">
26236 </param>
26237 </member> 26026 </member>
26238 <member name="M:OpenMetaverse.Voice.VoiceGateway.UpdatePosition(OpenMetaverse.AgentManager)"> 26027 <member name="M:OpenMetaverse.AssetCache.SetupTimer">
26239 <summary> 26028 <summary>
26240 Tell Vivox where we are standing 26029 Only create timer when needed
26241 </summary> 26030 </summary>
26242 <remarks>This has to be called when we move or turn.</remarks>
26243 </member> 26031 </member>
26244 <member name="M:OpenMetaverse.Voice.VoiceGateway.PosUpdating(System.Boolean)"> 26032 <member name="M:OpenMetaverse.AssetCache.GetCachedAssetBytes(OpenMetaverse.UUID)">
26245 <summary> 26033 <summary>
26246 Start and stop updating out position. 26034 Return bytes read from the local asset cache, null if it does not exist
26247 </summary> 26035 </summary>
26248 <param name="go"> 26036 <param name="assetID">UUID of the asset we want to get</param>
26249 </param> 26037 <returns>Raw bytes of the asset, or null on failure</returns>
26250 </member> 26038 </member>
26251 <member name="M:OpenMetaverse.Voice.VoiceGateway.StartDaemon(System.String,System.String)"> 26039 <member name="M:OpenMetaverse.AssetCache.GetCachedImage(OpenMetaverse.UUID)">
26252 <summary> 26040 <summary>
26253 Starts a thread that keeps the daemon running 26041 Returns ImageDownload object of the
26042 image from the local image cache, null if it does not exist
26254 </summary> 26043 </summary>
26255 <param name="path"> 26044 <param name="imageID">UUID of the image we want to get</param>
26256 </param> 26045 <returns>ImageDownload object containing the image, or null on failure</returns>
26257 <param name="args">
26258 </param>
26259 </member> 26046 </member>
26260 <member name="M:OpenMetaverse.Voice.VoiceGateway.StopDaemon"> 26047 <member name="M:OpenMetaverse.AssetCache.FileName(OpenMetaverse.UUID)">
26261 <summary> 26048 <summary>
26262 Stops the daemon and the thread keeping it running 26049 Constructs a file name of the cached asset
26263 </summary> 26050 </summary>
26051 <param name="assetID">UUID of the asset</param>
26052 <returns>String with the file name of the cahced asset</returns>
26264 </member> 26053 </member>
26265 <member name="M:OpenMetaverse.Voice.VoiceGateway.ConnectToDaemon(System.String,System.Int32)"> 26054 <member name="M:OpenMetaverse.AssetCache.StaticFileName(OpenMetaverse.UUID)">
26266 <summary> 26055 <summary>
26056 Constructs a file name of the static cached asset
26267 </summary> 26057 </summary>
26268 <param name="address"> 26058 <param name="assetID">UUID of the asset</param>
26269 </param> 26059 <returns>String with the file name of the static cached asset</returns>
26270 <param name="port">
26271 </param>
26272 <returns>
26273 </returns>
26274 </member> 26060 </member>
26275 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionCreate(System.String,System.String,System.String,System.String,System.Boolean,System.Boolean,System.String)"> 26061 <member name="M:OpenMetaverse.AssetCache.SaveAssetToCache(OpenMetaverse.UUID,System.Byte[])">
26276 <summary> 26062 <summary>
26277 Create a Session 26063 Saves an asset to the local cache
26278 Sessions typically represent a connection to a media session with one or more
26279 participants. This is used to generate an �outbound� call to another user or
26280 channel. The specifics depend on the media types involved. A session handle is
26281 required to control the local user functions within the session (or remote
26282 users if the current account has rights to do so). Currently creating a
26283 session automatically connects to the audio media, there is no need to call
26284 Session.Connect at this time, this is reserved for future use.
26285 </summary> 26064 </summary>
26286 <param name="AccountHandle">Handle returned from successful Connector �create� request</param> 26065 <param name="assetID">UUID of the asset</param>
26287 <param name="URI">This is the URI of the terminating point of the session (ie who/what is being called)</param> 26066 <param name="assetData">Raw bytes the asset consists of</param>
26288 <param name="Name">This is the display name of the entity being called (user or channel)</param> 26067 <returns>Weather the operation was successfull</returns>
26289 <param name="Password">Only needs to be supplied when the target URI is password protected</param>
26290 <param name="PasswordHashAlgorithm">This indicates the format of the password as passed in. This can either be
26291 �ClearText� or �SHA1UserName�. If this element does not exist, it is assumed to be �ClearText�. If it is
26292 �SHA1UserName�, the password as passed in is the SHA1 hash of the password and username concatenated together,
26293 then base64 encoded, with the final �=� character stripped off.</param>
26294 <param name="JoinAudio">
26295 </param>
26296 <param name="JoinText">
26297 </param>
26298 <returns>
26299 </returns>
26300 </member> 26068 </member>
26301 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionConnect(System.String,System.String)"> 26069 <member name="M:OpenMetaverse.AssetCache.AssetFileName(OpenMetaverse.UUID)">
26302 <summary> 26070 <summary>
26303 Used to accept a call 26071 Get the file name of the asset stored with gived UUID
26304 </summary> 26072 </summary>
26305 <param name="SessionHandle">SessionHandle such as received from SessionNewEvent</param> 26073 <param name="assetID">UUID of the asset</param>
26306 <param name="AudioMedia">"default"</param> 26074 <returns>Null if we don't have that UUID cached on disk, file name if found in the cache folder</returns>
26307 <returns>
26308 </returns>
26309 </member> 26075 </member>
26310 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionRenderAudioStart(System.String,System.Boolean)"> 26076 <member name="M:OpenMetaverse.AssetCache.HasAsset(OpenMetaverse.UUID)">
26311 <summary> 26077 <summary>
26312 This command is used to start the audio render process, which will then play 26078 Checks if the asset exists in the local cache
26313 the passed in file through the selected audio render device. This command
26314 should not be issued if the user is on a call.
26315 </summary> 26079 </summary>
26316 <param name="SoundFilePath">The fully qualified path to the sound file.</param> 26080 <param name="assetID">UUID of the asset</param>
26317 <param name="Loop">True if the file is to be played continuously and false if it is should be played once.</param> 26081 <returns>True is the asset is stored in the cache, otherwise false</returns>
26318 <returns>
26319 </returns>
26320 </member> 26082 </member>
26321 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionRenderAudioStop(System.String)"> 26083 <member name="M:OpenMetaverse.AssetCache.Clear">
26322 <summary> 26084 <summary>
26323 This command is used to stop the audio render process. 26085 Wipes out entire cache
26324 </summary> 26086 </summary>
26325 <param name="SoundFilePath">The fully qualified path to the sound file issued in the start render command.</param>
26326 <returns>
26327 </returns>
26328 </member> 26087 </member>
26329 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionTerminate(System.String)"> 26088 <member name="M:OpenMetaverse.AssetCache.Prune">
26330 <summary> 26089 <summary>
26331 This is used to �end� an established session (i.e. hang-up or disconnect). 26090 Brings cache size to the 90% of the max size
26332 </summary> 26091 </summary>
26333 <param name="SessionHandle">Handle returned from successful Session �create� request or a SessionNewEvent</param>
26334 <returns>
26335 </returns>
26336 </member> 26092 </member>
26337 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionSet3DPosition(System.String,OpenMetaverse.Voice.VoicePosition,OpenMetaverse.Voice.VoicePosition)"> 26093 <member name="M:OpenMetaverse.AssetCache.BeginPrune">
26338 <summary> 26094 <summary>
26339 Set the combined speaking and listening position in 3D space. 26095 Asynchronously brings cache size to the 90% of the max size
26340 </summary> 26096 </summary>
26341 <param name="SessionHandle">Handle returned from successful Session �create� request or a SessionNewEvent</param>
26342 <param name="SpeakerPosition">Speaking position</param>
26343 <param name="ListenerPosition">Listening position</param>
26344 <returns>
26345 </returns>
26346 </member> 26097 </member>
26347 <member name="M:OpenMetaverse.Voice.VoiceGateway.SessionSetParticipantVolumeForMe(System.String,System.String,System.Int32)"> 26098 <member name="M:OpenMetaverse.AssetCache.GetFileSize(System.IO.FileInfo[])">
26348 <summary> 26099 <summary>
26349 Set User Volume for a particular user. Does not affect how other users hear that user. 26100 Adds up file sizes passes in a FileInfo array
26350 </summary> 26101 </summary>
26351 <param name="SessionHandle">Handle returned from successful Session �create� request or a SessionNewEvent</param>
26352 <param name="ParticipantURI">
26353 </param>
26354 <param name="Volume">The level of the audio, a number between -100 and 100 where 0 represents �normal� speaking volume</param>
26355 <returns>
26356 </returns>
26357 </member>
26358 <member name="F:OpenMetaverse.Voice.VoicePosition.Position">
26359 <summary>Positional vector of the users position</summary>
26360 </member>
26361 <member name="F:OpenMetaverse.Voice.VoicePosition.Velocity">
26362 <summary>Velocity vector of the position</summary>
26363 </member>
26364 <member name="F:OpenMetaverse.Voice.VoicePosition.AtOrientation">
26365 <summary>At Orientation (X axis) of the position</summary>
26366 </member>
26367 <member name="F:OpenMetaverse.Voice.VoicePosition.UpOrientation">
26368 <summary>Up Orientation (Y axis) of the position</summary>
26369 </member>
26370 <member name="F:OpenMetaverse.Voice.VoicePosition.LeftOrientation">
26371 <summary>Left Orientation (Z axis) of the position</summary>
26372 </member> 26102 </member>
26373 <member name="M:OpenMetaverse.Voice.VoiceParticipant.IDFromName(System.String)"> 26103 <member name="M:OpenMetaverse.AssetCache.Operational">
26374 <summary> 26104 <summary>
26375 Extract the avatar UUID encoded in a SIP URI 26105 Checks whether caching is enabled
26376 </summary> 26106 </summary>
26377 <param name="inName">
26378 </param>
26379 <returns>
26380 </returns>
26381 </member> 26107 </member>
26382 <member name="T:OpenMetaverse.Voice.VoiceSession"> 26108 <member name="M:OpenMetaverse.AssetCache.cleanerTimer_Elapsed(System.Object,System.Timers.ElapsedEventArgs)">
26383 <summary> 26109 <summary>
26384 Represents a single Voice Session to the Vivox service. 26110 Periodically prune the cache
26385 </summary> 26111 </summary>
26386 </member> 26112 </member>
26387 <member name="M:OpenMetaverse.Voice.VoiceSession.Close"> 26113 <member name="M:OpenMetaverse.AssetCache.NiceFileSize(System.Int64)">
26388 <summary> 26114 <summary>
26389 Close this session. 26115 Nicely formats file sizes
26390 </summary> 26116 </summary>
26117 <param name="byteCount">Byte size we want to output</param>
26118 <returns>String with humanly readable file size</returns>
26391 </member> 26119 </member>
26392 <member name="M:OpenMetaverse.Voice.VoiceSession.FindParticipant(System.String)"> 26120 <member name="P:OpenMetaverse.AssetCache.AutoPruneEnabled">
26393 <summary> 26121 <summary>
26394 Look up an existing Participants in this session 26122 Allows setting weather to periodicale prune the cache if it grows too big
26123 Default is enabled, when caching is enabled
26395 </summary> 26124 </summary>
26396 <param name="puri">
26397 </param>
26398 <returns>
26399 </returns>
26400 </member> 26125 </member>
26401 <member name="T:OpenMetaverse.DictionaryChangeCallback"> 26126 <member name="P:OpenMetaverse.AssetCache.AutoPruneInterval">
26402 <summary> 26127 <summary>
26128 How long (in ms) between cache checks (default is 5 min.)
26403 </summary> 26129 </summary>
26404 <param name="action">
26405 </param>
26406 <param name="entry">
26407 </param>
26408 </member> 26130 </member>
26409 <member name="T:OpenMetaverse.TextureDownloadCallback"> 26131 <member name="T:OpenMetaverse.AssetCache.SortFilesByAccesTimeHelper">
26410 <summary> 26132 <summary>
26411 A callback fired to indicate the status or final state of the requested texture. For progressive 26133 Helper class for sorting files by their last accessed time
26412 downloads this will fire each time new asset data is returned from the simulator.
26413 </summary> 26134 </summary>
26414 <param name="state">The <see cref="T:OpenMetaverse.TextureRequestState" /> indicating either Progress for textures not fully downloaded,
26415 or the final result of the request after it has been processed through the TexturePipeline</param>
26416 <param name="assetTexture">The <see cref="T:OpenMetaverse.Assets.AssetTexture" /> object containing the Assets ID, raw data
26417 and other information. For progressive rendering the <see cref="F:OpenMetaverse.Assets.Asset.AssetData" /> will contain
26418 the data from the beginning of the file. For failed, aborted and timed out requests it will contain
26419 an empty byte array.</param>
26420 </member> 26135 </member>
26421 </members> 26136 </members>
26422</doc> 26137</doc>
diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll
index 3e210ba..59e8083 100755
--- a/bin/OpenMetaverse.dll
+++ b/bin/OpenMetaverse.dll
Binary files differ
diff --git a/bin/OpenMetaverse.dll.config b/bin/OpenMetaverse.dll.config
index f5423b2..6b7b999 100644
--- a/bin/OpenMetaverse.dll.config
+++ b/bin/OpenMetaverse.dll.config
@@ -1,5 +1,7 @@
1<configuration> 1<configuration>
2 <dllmap os="osx" dll="openjpeg-dotnet.dll" target="lib64/libopenjpeg-dotnet.dylib" /> 2 <dllmap os="osx" dll="openjpeg-dotnet.dll" target="libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib" />
3 <dllmap os="!windows,osx" cpu="x86-64,ia64" dll="openjpeg-dotnet-x86_64.dll" target="lib64/libopenjpeg-dotnet-x86_64" /> 3 <dllmap os="!windows,osx" cpu="x86-64,ia64" dll="openjpeg-dotnet.dll" target="libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64" />
4 <dllmap os="!windows,osx" cpu="x86" dll="openjpeg-dotnet.dll" target="lib32/libopenjpeg-dotnet" /> 4 <dllmap os="!windows,osx" cpu="x86-64,ia64" dll="openjpeg-dotnet-x86_64.dll" target="libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64" />
5 <dllmap os="!windows,osx" cpu="x86" dll="openjpeg-dotnet.dll" target="libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686" />
6 <dllmap os="!windows,osx" cpu="x86" dll="openjpeg-dotnet-x86_64.dll" target="libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686" />
5</configuration> 7</configuration>
diff --git a/bin/OpenMetaverseTypes.XML b/bin/OpenMetaverseTypes.XML
index ce1298e..56e3ac7 100644
--- a/bin/OpenMetaverseTypes.XML
+++ b/bin/OpenMetaverseTypes.XML
@@ -1,481 +1,1040 @@
1<?xml version="1.0"?> 1<?xml version="1.0"?>
2<doc> 2<doc>
3 <assembly> 3 <assembly>
4 <name>/home/root/libomv-0.9.1-source/bin/OpenMetaverseTypes</name> 4 <name>OpenMetaverseTypes</name>
5 </assembly> 5 </assembly>
6 <members> 6 <members>
7 <member name="T:OpenMetaverse.BlockingQueue`1"> 7 <member name="F:OpenMetaverse.Utils.DEG_TO_RAD">
8 <summary>Used for converting degrees to radians</summary>
9 </member>
10 <member name="F:OpenMetaverse.Utils.RAD_TO_DEG">
11 <summary>Used for converting radians to degrees</summary>
12 </member>
13 <member name="M:OpenMetaverse.Utils.BytesToInt16(System.Byte[])">
8 <summary> 14 <summary>
9 Same as Queue except Dequeue function blocks until there is an object to return. 15 Convert the first two bytes starting in the byte array in
10 Note: This class does not need to be synchronized 16 little endian ordering to a signed short integer
11 </summary> 17 </summary>
18 <param name="bytes">An array two bytes or longer</param>
19 <returns>A signed short integer, will be zero if a short can't be
20 read at the given position</returns>
12 </member> 21 </member>
13 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor(System.Collections.Generic.IEnumerable{`0})"> 22 <member name="M:OpenMetaverse.Utils.BytesToInt16(System.Byte[],System.Int32)">
14 <summary> 23 <summary>
15 Create new BlockingQueue. 24 Convert the first two bytes starting at the given position in
25 little endian ordering to a signed short integer
16 </summary> 26 </summary>
17 <param name="col">The System.Collections.ICollection to copy elements from</param> 27 <param name="bytes">An array two bytes or longer</param>
28 <param name="pos">Position in the array to start reading</param>
29 <returns>A signed short integer, will be zero if a short can't be
30 read at the given position</returns>
18 </member> 31 </member>
19 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor(System.Int32)"> 32 <member name="M:OpenMetaverse.Utils.BytesToInt(System.Byte[],System.Int32)">
20 <summary> 33 <summary>
21 Create new BlockingQueue. 34 Convert the first four bytes starting at the given position in
35 little endian ordering to a signed integer
22 </summary> 36 </summary>
23 <param name="capacity">The initial number of elements that the queue can contain</param> 37 <param name="bytes">An array four bytes or longer</param>
38 <param name="pos">Position to start reading the int from</param>
39 <returns>A signed integer, will be zero if an int can't be read
40 at the given position</returns>
24 </member> 41 </member>
25 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor"> 42 <member name="M:OpenMetaverse.Utils.BytesToInt(System.Byte[])">
26 <summary> 43 <summary>
27 Create new BlockingQueue. 44 Convert the first four bytes of the given array in little endian
45 ordering to a signed integer
28 </summary> 46 </summary>
47 <param name="bytes">An array four bytes or longer</param>
48 <returns>A signed integer, will be zero if the array contains
49 less than four bytes</returns>
29 </member> 50 </member>
30 <member name="P:OpenMetaverse.BlockingQueue`1.Closed"> 51 <member name="M:OpenMetaverse.Utils.BytesToInt64(System.Byte[])">
31 <summary> 52 <summary>
32 Gets flag indicating if queue has been closed. 53 Convert the first eight bytes of the given array in little endian
54 ordering to a signed long integer
33 </summary> 55 </summary>
56 <param name="bytes">An array eight bytes or longer</param>
57 <returns>A signed long integer, will be zero if the array contains
58 less than eight bytes</returns>
34 </member> 59 </member>
35 <member name="M:OpenMetaverse.BlockingQueue`1.Finalize"> 60 <member name="M:OpenMetaverse.Utils.BytesToInt64(System.Byte[],System.Int32)">
36 <summary> 61 <summary>
37 BlockingQueue Destructor (Close queue, resume any waiting thread). 62 Convert the first eight bytes starting at the given position in
63 little endian ordering to a signed long integer
38 </summary> 64 </summary>
65 <param name="bytes">An array eight bytes or longer</param>
66 <param name="pos">Position to start reading the long from</param>
67 <returns>A signed long integer, will be zero if a long can't be read
68 at the given position</returns>
39 </member> 69 </member>
40 <member name="M:OpenMetaverse.BlockingQueue`1.Clear"> 70 <member name="M:OpenMetaverse.Utils.BytesToUInt16(System.Byte[],System.Int32)">
41 <summary> 71 <summary>
42 Remove all objects from the Queue. 72 Convert the first two bytes starting at the given position in
73 little endian ordering to an unsigned short
43 </summary> 74 </summary>
75 <param name="bytes">Byte array containing the ushort</param>
76 <param name="pos">Position to start reading the ushort from</param>
77 <returns>An unsigned short, will be zero if a ushort can't be read
78 at the given position</returns>
44 </member> 79 </member>
45 <member name="M:OpenMetaverse.BlockingQueue`1.Close"> 80 <member name="M:OpenMetaverse.Utils.BytesToUInt16(System.Byte[])">
46 <summary> 81 <summary>
47 Remove all objects from the Queue, resume all dequeue threads. 82 Convert two bytes in little endian ordering to an unsigned short
48 </summary> 83 </summary>
84 <param name="bytes">Byte array containing the ushort</param>
85 <returns>An unsigned short, will be zero if a ushort can't be
86 read</returns>
49 </member> 87 </member>
50 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue"> 88 <member name="M:OpenMetaverse.Utils.BytesToUInt(System.Byte[],System.Int32)">
51 <summary> 89 <summary>
52 Removes and returns the object at the beginning of the Queue. 90 Convert the first four bytes starting at the given position in
91 little endian ordering to an unsigned integer
53 </summary> 92 </summary>
54 <returns>Object in queue.</returns> 93 <param name="bytes">Byte array containing the uint</param>
94 <param name="pos">Position to start reading the uint from</param>
95 <returns>An unsigned integer, will be zero if a uint can't be read
96 at the given position</returns>
55 </member> 97 </member>
56 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue(System.TimeSpan)"> 98 <member name="M:OpenMetaverse.Utils.BytesToUInt(System.Byte[])">
57 <summary> 99 <summary>
58 Removes and returns the object at the beginning of the Queue. 100 Convert the first four bytes of the given array in little endian
101 ordering to an unsigned integer
59 </summary> 102 </summary>
60 <param name="timeout">time to wait before returning</param> 103 <param name="bytes">An array four bytes or longer</param>
61 <returns>Object in queue.</returns> 104 <returns>An unsigned integer, will be zero if the array contains
105 less than four bytes</returns>
62 </member> 106 </member>
63 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue(System.Int32)"> 107 <member name="M:OpenMetaverse.Utils.BytesToUInt64(System.Byte[])">
64 <summary> 108 <summary>
65 Removes and returns the object at the beginning of the Queue. 109 Convert the first eight bytes of the given array in little endian
110 ordering to an unsigned 64-bit integer
66 </summary> 111 </summary>
67 <param name="timeout">time to wait before returning (in milliseconds)</param> 112 <param name="bytes">An array eight bytes or longer</param>
68 <returns>Object in queue.</returns> 113 <returns>An unsigned 64-bit integer, will be zero if the array
114 contains less than eight bytes</returns>
69 </member> 115 </member>
70 <member name="M:OpenMetaverse.BlockingQueue`1.Enqueue(`0)"> 116 <member name="M:OpenMetaverse.Utils.BytesToFloat(System.Byte[],System.Int32)">
71 <summary> 117 <summary>
72 Adds an object to the end of the Queue 118 Convert four bytes in little endian ordering to a floating point
119 value
73 </summary> 120 </summary>
74 <param name="obj">Object to put in queue</param> 121 <param name="bytes">Byte array containing a little ending floating
122 point value</param>
123 <param name="pos">Starting position of the floating point value in
124 the byte array</param>
125 <returns>Single precision value</returns>
75 </member> 126 </member>
76 <member name="M:OpenMetaverse.BlockingQueue`1.Open"> 127 <member name="M:OpenMetaverse.Utils.IntToBytes(System.Int32)">
77 <summary> 128 <summary>
78 Open Queue. 129 Convert an integer to a byte array in little endian format
79 </summary> 130 </summary>
131 <param name="value">The integer to convert</param>
132 <returns>A four byte little endian array</returns>
80 </member> 133 </member>
81 <member name="M:OpenMetaverse.CircularQueue`1.#ctor(OpenMetaverse.CircularQueue{`0})"> 134 <member name="M:OpenMetaverse.Utils.IntToBytesBig(System.Int32)">
82 <summary> 135 <summary>
83 Copy constructor 136 Convert an integer to a byte array in big endian format
84 </summary> 137 </summary>
85 <param name="queue">Circular queue to copy</param> 138 <param name="value">The integer to convert</param>
139 <returns>A four byte big endian array</returns>
86 </member> 140 </member>
87 <member name="T:OpenMetaverse.Color4"> 141 <member name="M:OpenMetaverse.Utils.Int64ToBytes(System.Int64)">
88 <summary> 142 <summary>
89 An 8-bit color structure including an alpha channel 143 Convert a 64-bit integer to a byte array in little endian format
90 </summary> 144 </summary>
145 <param name="value">The value to convert</param>
146 <returns>An 8 byte little endian array</returns>
91 </member> 147 </member>
92 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)"> 148 <member name="M:OpenMetaverse.Utils.UInt64ToBytes(System.UInt64)">
93 <summary> 149 <summary>
150 Convert a 64-bit unsigned integer to a byte array in little endian
151 format
94 </summary> 152 </summary>
95 <param name="r"> 153 <param name="value">The value to convert</param>
96 </param> 154 <returns>An 8 byte little endian array</returns>
97 <param name="g">
98 </param>
99 <param name="b">
100 </param>
101 <param name="a">
102 </param>
103 </member> 155 </member>
104 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean)"> 156 <member name="M:OpenMetaverse.Utils.FloatToBytes(System.Single)">
105 <summary> 157 <summary>
106 Builds a color from a byte array 158 Convert a floating point value to four bytes in little endian
159 ordering
107 </summary> 160 </summary>
108 <param name="byteArray">Byte array containing a 16 byte color</param> 161 <param name="value">A floating point value</param>
109 <param name="pos">Beginning position in the byte array</param> 162 <returns>A four byte array containing the value in little endian
110 <param name="inverted">True if the byte array stores inverted values, 163 ordering</returns>
111 otherwise false. For example the color black (fully opaque) inverted
112 would be 0xFF 0xFF 0xFF 0x00</param>
113 </member> 164 </member>
114 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean,System.Boolean)"> 165 <member name="M:OpenMetaverse.Utils.UIntToHexString(System.UInt32)">
115 <summary> 166 <summary>
116 Returns the raw bytes for this vector 167 Converts an unsigned integer to a hexadecimal string
117 </summary> 168 </summary>
118 <param name="byteArray">Byte array containing a 16 byte color</param> 169 <param name="i">An unsigned integer to convert to a string</param>
119 <param name="pos">Beginning position in the byte array</param> 170 <returns>A hexadecimal string 10 characters long</returns>
120 <param name="inverted">True if the byte array stores inverted values, 171 <example>0x7fffffff</example>
121 otherwise false. For example the color black (fully opaque) inverted
122 would be 0xFF 0xFF 0xFF 0x00</param>
123 <param name="alphaInverted">True if the alpha value is inverted in
124 addition to whatever the inverted parameter is. Setting inverted true
125 and alphaInverted true will flip the alpha value back to non-inverted,
126 but keep the other color bytes inverted</param>
127 <returns>A 16 byte array containing R, G, B, and A</returns>
128 </member> 172 </member>
129 <member name="M:OpenMetaverse.Color4.#ctor(OpenMetaverse.Color4)"> 173 <member name="M:OpenMetaverse.Utils.BytesToString(System.Byte[])">
130 <summary> 174 <summary>
131 Copy constructor 175 Convert a variable length UTF8 byte array to a string
132 </summary> 176 </summary>
133 <param name="color">Color to copy</param> 177 <param name="bytes">The UTF8 encoded byte array to convert</param>
178 <returns>The decoded string</returns>
134 </member> 179 </member>
135 <member name="F:OpenMetaverse.Color4.R"> 180 <member name="M:OpenMetaverse.Utils.BytesToHexString(System.Byte[],System.String)">
136 <summary>Red</summary> 181 <summary>
182 Converts a byte array to a string containing hexadecimal characters
183 </summary>
184 <param name="bytes">The byte array to convert to a string</param>
185 <param name="fieldName">The name of the field to prepend to each
186 line of the string</param>
187 <returns>A string containing hexadecimal characters on multiple
188 lines. Each line is prepended with the field name</returns>
137 </member> 189 </member>
138 <member name="F:OpenMetaverse.Color4.G"> 190 <member name="M:OpenMetaverse.Utils.BytesToHexString(System.Byte[],System.Int32,System.String)">
139 <summary>Green</summary> 191 <summary>
192 Converts a byte array to a string containing hexadecimal characters
193 </summary>
194 <param name="bytes">The byte array to convert to a string</param>
195 <param name="length">Number of bytes in the array to parse</param>
196 <param name="fieldName">A string to prepend to each line of the hex
197 dump</param>
198 <returns>A string containing hexadecimal characters on multiple
199 lines. Each line is prepended with the field name</returns>
140 </member> 200 </member>
141 <member name="F:OpenMetaverse.Color4.B"> 201 <member name="M:OpenMetaverse.Utils.StringToBytes(System.String)">
142 <summary>Blue</summary> 202 <summary>
203 Convert a string to a UTF8 encoded byte array
204 </summary>
205 <param name="str">The string to convert</param>
206 <returns>A null-terminated UTF8 byte array</returns>
143 </member> 207 </member>
144 <member name="F:OpenMetaverse.Color4.A"> 208 <member name="M:OpenMetaverse.Utils.HexStringToBytes(System.String,System.Boolean)">
145 <summary>Alpha</summary> 209 <summary>
210 Converts a string containing hexadecimal characters to a byte array
211 </summary>
212 <param name="hexString">String containing hexadecimal characters</param>
213 <param name="handleDirty">If true, gracefully handles null, empty and
214 uneven strings as well as stripping unconvertable characters</param>
215 <returns>The converted byte array</returns>
146 </member> 216 </member>
147 <member name="F:OpenMetaverse.Color4.Black"> 217 <member name="M:OpenMetaverse.Utils.IsHexDigit(System.Char)">
148 <summary>A Color4 with zero RGB values and fully opaque (alpha 1.0)</summary> 218 <summary>
219 Returns true is c is a hexadecimal digit (A-F, a-f, 0-9)
220 </summary>
221 <param name="c">Character to test</param>
222 <returns>true if hex digit, false if not</returns>
149 </member> 223 </member>
150 <member name="F:OpenMetaverse.Color4.White"> 224 <member name="M:OpenMetaverse.Utils.HexToByte(System.String)">
151 <summary>A Color4 with full RGB values (1.0) and fully opaque (alpha 1.0)</summary> 225 <summary>
226 Converts 1 or 2 character string into equivalant byte value
227 </summary>
228 <param name="hex">1 or 2 character string</param>
229 <returns>byte</returns>
152 </member> 230 </member>
153 <member name="M:OpenMetaverse.Color4.CompareTo(OpenMetaverse.Color4)"> 231 <member name="M:OpenMetaverse.Utils.FloatToByte(System.Single,System.Single,System.Single)">
154 <summary> 232 <summary>
155 IComparable.CompareTo implementation 233 Convert a float value to a byte given a minimum and maximum range
156 </summary> 234 </summary>
157 <remarks>Sorting ends up like this: |--Grayscale--||--Color--|. 235 <param name="val">Value to convert to a byte</param>
158 Alpha is only used when the colors are otherwise equivalent</remarks> 236 <param name="lower">Minimum value range</param>
237 <param name="upper">Maximum value range</param>
238 <returns>A single byte representing the original float value</returns>
159 </member> 239 </member>
160 <member name="M:OpenMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean,System.Boolean)"> 240 <member name="M:OpenMetaverse.Utils.ByteToFloat(System.Byte[],System.Int32,System.Single,System.Single)">
161 <summary> 241 <summary>
162 Builds a color from a byte array 242 Convert a byte to a float value given a minimum and maximum range
163 </summary> 243 </summary>
164 <param name="byteArray">Byte array containing a 16 byte color</param> 244 <param name="bytes">Byte array to get the byte from</param>
165 <param name="pos">Beginning position in the byte array</param> 245 <param name="pos">Position in the byte array the desired byte is at</param>
166 <param name="inverted">True if the byte array stores inverted values, 246 <param name="lower">Minimum value range</param>
167 otherwise false. For example the color black (fully opaque) inverted 247 <param name="upper">Maximum value range</param>
168 would be 0xFF 0xFF 0xFF 0x00</param> 248 <returns>A float value inclusively between lower and upper</returns>
169 <param name="alphaInverted">True if the alpha value is inverted in
170 addition to whatever the inverted parameter is. Setting inverted true
171 and alphaInverted true will flip the alpha value back to non-inverted,
172 but keep the other color bytes inverted</param>
173 </member> 249 </member>
174 <member name="M:OpenMetaverse.Color4.ToBytes(System.Byte[],System.Int32)"> 250 <member name="M:OpenMetaverse.Utils.ByteToFloat(System.Byte,System.Single,System.Single)">
175 <summary> 251 <summary>
176 Writes the raw bytes for this color to a byte array 252 Convert a byte to a float value given a minimum and maximum range
177 </summary> 253 </summary>
178 <param name="dest">Destination byte array</param> 254 <param name="val">Byte to convert to a float value</param>
179 <param name="pos">Position in the destination array to start 255 <param name="lower">Minimum value range</param>
180 writing. Must be at least 16 bytes before the end of the array</param> 256 <param name="upper">Maximum value range</param>
257 <returns>A float value inclusively between lower and upper</returns>
181 </member> 258 </member>
182 <member name="M:OpenMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)"> 259 <member name="M:OpenMetaverse.Utils.TryParseSingle(System.String,System.Single@)">
183 <summary> 260 <summary>
184 Serializes this color into four bytes in a byte array 261 Attempts to parse a floating point value from a string, using an
262 EN-US number format
185 </summary> 263 </summary>
186 <param name="dest">Destination byte array</param> 264 <param name="s">String to parse</param>
187 <param name="pos">Position in the destination array to start 265 <param name="result">Resulting floating point number</param>
188 writing. Must be at least 4 bytes before the end of the array</param> 266 <returns>True if the parse was successful, otherwise false</returns>
189 <param name="inverted">True to invert the output (1.0 becomes 0
190 instead of 255)</param>
191 </member> 267 </member>
192 <member name="M:OpenMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)"> 268 <member name="M:OpenMetaverse.Utils.TryParseDouble(System.String,System.Double@)">
193 <summary> 269 <summary>
194 Writes the raw bytes for this color to a byte array 270 Attempts to parse a floating point value from a string, using an
271 EN-US number format
195 </summary> 272 </summary>
196 <param name="dest">Destination byte array</param> 273 <param name="s">String to parse</param>
197 <param name="pos">Position in the destination array to start 274 <param name="result">Resulting floating point number</param>
198 writing. Must be at least 16 bytes before the end of the array</param> 275 <returns>True if the parse was successful, otherwise false</returns>
199 </member> 276 </member>
200 <member name="M:OpenMetaverse.Color4.ClampValues"> 277 <member name="M:OpenMetaverse.Utils.TryParseHex(System.String,System.UInt32@)">
201 <summary> 278 <summary>
202 Ensures that values are in range 0-1 279 Tries to parse an unsigned 32-bit integer from a hexadecimal string
203 </summary> 280 </summary>
281 <param name="s">String to parse</param>
282 <param name="result">Resulting integer</param>
283 <returns>True if the parse was successful, otherwise false</returns>
204 </member> 284 </member>
205 <member name="M:OpenMetaverse.Color4.FromHSV(System.Double,System.Double,System.Double)"> 285 <member name="M:OpenMetaverse.Utils.EnumToText(System.Enum)">
206 <summary> 286 <summary>
207 Create an RGB color from a hue, saturation, value combination 287 Returns text specified in EnumInfo attribute of the enumerator
288 To add the text use [EnumInfo(Text = "Some nice text here")] before declaration
289 of enum values
208 </summary> 290 </summary>
209 <param name="hue">Hue</param> 291 <param name="value">Enum value</param>
210 <param name="saturation">Saturation</param> 292 <returns>Text representation of the enum</returns>
211 <param name="value">Value</param>
212 <returns>An fully opaque RGB color (alpha is 1.0)</returns>
213 </member> 293 </member>
214 <member name="M:OpenMetaverse.Color4.Lerp(OpenMetaverse.Color4,OpenMetaverse.Color4,System.Single)"> 294 <member name="M:OpenMetaverse.Utils.AssetTypeToString(OpenMetaverse.AssetType)">
215 <summary> 295 <summary>
216 Performs linear interpolation between two colors 296 Takes an AssetType and returns the string representation
217 </summary> 297 </summary>
218 <param name="value1">Color to start at</param> 298 <param name="type">The source <seealso cref="T:OpenMetaverse.AssetType"/></param>
219 <param name="value2">Color to end at</param> 299 <returns>The string version of the AssetType</returns>
220 <param name="amount">Amount to interpolate</param>
221 <returns>The interpolated color</returns>
222 </member> 300 </member>
223 <member name="T:OpenMetaverse.EnumInfoAttribute"> 301 <member name="M:OpenMetaverse.Utils.StringToAssetType(System.String)">
224 <summary> 302 <summary>
225 Attribute class that allows extra attributes to be attached to ENUMs 303 Translate a string name of an AssetType into the proper Type
226 </summary> 304 </summary>
305 <param name="type">A string containing the AssetType name</param>
306 <returns>The AssetType which matches the string name, or AssetType.Unknown if no match was found</returns>
227 </member> 307 </member>
228 <member name="M:OpenMetaverse.EnumInfoAttribute.#ctor"> 308 <member name="M:OpenMetaverse.Utils.InventoryTypeToString(OpenMetaverse.InventoryType)">
229 <summary>Default initializer</summary> 309 <summary>
310 Convert an InventoryType to a string
311 </summary>
312 <param name="type">The <seealso cref="T:InventoryType"/> to convert</param>
313 <returns>A string representation of the source</returns>
230 </member> 314 </member>
231 <member name="M:OpenMetaverse.EnumInfoAttribute.#ctor(System.String)"> 315 <member name="M:OpenMetaverse.Utils.StringToInventoryType(System.String)">
232 <summary>Text used when presenting ENUM to user</summary> 316 <summary>
317 Convert a string into a valid InventoryType
318 </summary>
319 <param name="type">A string representation of the InventoryType to convert</param>
320 <returns>A InventoryType object which matched the type</returns>
233 </member> 321 </member>
234 <member name="F:OpenMetaverse.EnumInfoAttribute.Text"> 322 <member name="M:OpenMetaverse.Utils.SaleTypeToString(OpenMetaverse.SaleType)">
235 <summary>Text used when presenting ENUM to user</summary> 323 <summary>
324 Convert a SaleType to a string
325 </summary>
326 <param name="type">The <seealso cref="T:SaleType"/> to convert</param>
327 <returns>A string representation of the source</returns>
236 </member> 328 </member>
237 <member name="T:OpenMetaverse.AssetType"> 329 <member name="M:OpenMetaverse.Utils.StringToSaleType(System.String)">
238 <summary> 330 <summary>
239 The different types of grid assets 331 Convert a string into a valid SaleType
240 </summary> 332 </summary>
333 <param name="value">A string representation of the SaleType to convert</param>
334 <returns>A SaleType object which matched the type</returns>
241 </member> 335 </member>
242 <member name="F:OpenMetaverse.AssetType.Unknown"> 336 <member name="M:OpenMetaverse.Utils.StringToAttachmentPoint(System.String)">
243 <summary>Unknown asset type</summary> 337 <summary>
338 Converts a string used in LLSD to AttachmentPoint type
339 </summary>
340 <param name="value">String representation of AttachmentPoint to convert</param>
341 <returns>AttachmentPoint enum</returns>
244 </member> 342 </member>
245 <member name="F:OpenMetaverse.AssetType.Texture"> 343 <member name="M:OpenMetaverse.Utils.CopyBytes(System.Byte[])">
246 <summary>Texture asset, stores in JPEG2000 J2C stream format</summary> 344 <summary>
345 Copy a byte array
346 </summary>
347 <param name="bytes">Byte array to copy</param>
348 <returns>A copy of the given byte array</returns>
247 </member> 349 </member>
248 <member name="F:OpenMetaverse.AssetType.Sound"> 350 <member name="M:OpenMetaverse.Utils.UIntsToLong(System.UInt32,System.UInt32)">
249 <summary>Sound asset</summary> 351 <summary>
352 Packs to 32-bit unsigned integers in to a 64-bit unsigned integer
353 </summary>
354 <param name="a">The left-hand (or X) value</param>
355 <param name="b">The right-hand (or Y) value</param>
356 <returns>A 64-bit integer containing the two 32-bit input values</returns>
250 </member> 357 </member>
251 <member name="F:OpenMetaverse.AssetType.CallingCard"> 358 <member name="M:OpenMetaverse.Utils.LongToUInts(System.UInt64,System.UInt32@,System.UInt32@)">
252 <summary>Calling card for another avatar</summary> 359 <summary>
360 Unpacks two 32-bit unsigned integers from a 64-bit unsigned integer
361 </summary>
362 <param name="a">The 64-bit input integer</param>
363 <param name="b">The left-hand (or X) output value</param>
364 <param name="c">The right-hand (or Y) output value</param>
253 </member> 365 </member>
254 <member name="F:OpenMetaverse.AssetType.Landmark"> 366 <member name="M:OpenMetaverse.Utils.IPToUInt(System.Net.IPAddress)">
255 <summary>Link to a location in world</summary> 367 <summary>
368 Convert an IP address object to an unsigned 32-bit integer
369 </summary>
370 <param name="address">IP address to convert</param>
371 <returns>32-bit unsigned integer holding the IP address bits</returns>
256 </member> 372 </member>
257 <member name="F:OpenMetaverse.AssetType.Clothing"> 373 <member name="M:OpenMetaverse.Utils.GetUnixTime">
258 <summary>Collection of textures and parameters that can be 374 <summary>
259 worn by an avatar</summary> 375 Gets a unix timestamp for the current time
376 </summary>
377 <returns>An unsigned integer representing a unix timestamp for now</returns>
260 </member> 378 </member>
261 <member name="F:OpenMetaverse.AssetType.Object"> 379 <member name="M:OpenMetaverse.Utils.UnixTimeToDateTime(System.UInt32)">
262 <summary>Primitive that can contain textures, sounds, 380 <summary>
263 scripts and more</summary> 381 Convert a UNIX timestamp to a native DateTime object
382 </summary>
383 <param name="timestamp">An unsigned integer representing a UNIX
384 timestamp</param>
385 <returns>A DateTime object containing the same time specified in
386 the given timestamp</returns>
264 </member> 387 </member>
265 <member name="F:OpenMetaverse.AssetType.Notecard"> 388 <member name="M:OpenMetaverse.Utils.UnixTimeToDateTime(System.Int32)">
266 <summary>Notecard asset</summary> 389 <summary>
390 Convert a UNIX timestamp to a native DateTime object
391 </summary>
392 <param name="timestamp">A signed integer representing a UNIX
393 timestamp</param>
394 <returns>A DateTime object containing the same time specified in
395 the given timestamp</returns>
267 </member> 396 </member>
268 <member name="F:OpenMetaverse.AssetType.Folder"> 397 <member name="M:OpenMetaverse.Utils.DateTimeToUnixTime(System.DateTime)">
269 <summary>Holds a collection of inventory items</summary> 398 <summary>
399 Convert a native DateTime object to a UNIX timestamp
400 </summary>
401 <param name="time">A DateTime object you want to convert to a
402 timestamp</param>
403 <returns>An unsigned integer representing a UNIX timestamp</returns>
270 </member> 404 </member>
271 <member name="F:OpenMetaverse.AssetType.RootFolder"> 405 <member name="M:OpenMetaverse.Utils.Swap``1(``0@,``0@)">
272 <summary>Root inventory folder</summary> 406 <summary>
407 Swap two values
408 </summary>
409 <typeparam name="T">Type of the values to swap</typeparam>
410 <param name="lhs">First value</param>
411 <param name="rhs">Second value</param>
273 </member> 412 </member>
274 <member name="F:OpenMetaverse.AssetType.LSLText"> 413 <member name="M:OpenMetaverse.Utils.EnumTryParse``1(System.String,``0@)">
275 <summary>Linden scripting language script</summary> 414 <summary>
415 Try to parse an enumeration value from a string
416 </summary>
417 <typeparam name="T">Enumeration type</typeparam>
418 <param name="strType">String value to parse</param>
419 <param name="result">Enumeration value on success</param>
420 <returns>True if the parsing succeeded, otherwise false</returns>
276 </member> 421 </member>
277 <member name="F:OpenMetaverse.AssetType.LSLBytecode"> 422 <member name="M:OpenMetaverse.Utils.SwapWords(System.Byte)">
278 <summary>LSO bytecode for a script</summary> 423 <summary>
424 Swaps the high and low words in a byte. Converts aaaabbbb to bbbbaaaa
425 </summary>
426 <param name="value">Byte to swap the words in</param>
427 <returns>Byte value with the words swapped</returns>
279 </member> 428 </member>
280 <member name="F:OpenMetaverse.AssetType.TextureTGA"> 429 <member name="M:OpenMetaverse.Utils.HostnameToIPv4(System.String)">
281 <summary>Uncompressed TGA texture</summary> 430 <summary>
431 Attempts to convert a string representation of a hostname or IP
432 address to a <seealso cref="T:System.Net.IPAddress"/>
433 </summary>
434 <param name="hostname">Hostname to convert to an IPAddress</param>
435 <returns>Converted IP address object, or null if the conversion
436 failed</returns>
282 </member> 437 </member>
283 <member name="F:OpenMetaverse.AssetType.Bodypart"> 438 <member name="F:OpenMetaverse.Utils.EnUsCulture">
284 <summary>Collection of textures and shape parameters that can 439 <summary>Provide a single instance of the CultureInfo class to
285 be worn</summary> 440 help parsing in situations where the grid assumes an en-us
441 culture</summary>
286 </member> 442 </member>
287 <member name="F:OpenMetaverse.AssetType.TrashFolder"> 443 <member name="F:OpenMetaverse.Utils.Epoch">
288 <summary>Trash folder</summary> 444 <summary>UNIX epoch in DateTime format</summary>
289 </member> 445 </member>
290 <member name="F:OpenMetaverse.AssetType.SnapshotFolder"> 446 <member name="F:OpenMetaverse.Utils.MD5Builder">
291 <summary>Snapshot folder</summary> 447 <summary>Provide a single instance of the MD5 class to avoid making
448 duplicate copies and handle thread safety</summary>
292 </member> 449 </member>
293 <member name="F:OpenMetaverse.AssetType.LostAndFoundFolder"> 450 <member name="F:OpenMetaverse.Utils.SHA1Builder">
294 <summary>Lost and found folder</summary> 451 <summary>Provide a single instance of the SHA-1 class to avoid
452 making duplicate copies and handle thread safety</summary>
295 </member> 453 </member>
296 <member name="F:OpenMetaverse.AssetType.SoundWAV"> 454 <member name="F:OpenMetaverse.Utils.RNG">
297 <summary>Uncompressed sound</summary> 455 <summary>Provide a single instance of a random number generator
456 to avoid making duplicate copies and handle thread safety</summary>
298 </member> 457 </member>
299 <member name="F:OpenMetaverse.AssetType.ImageTGA"> 458 <member name="M:OpenMetaverse.Utils.Clamp(System.Single,System.Single,System.Single)">
300 <summary>Uncompressed TGA non-square image, not to be used as a 459 <summary>
301 texture</summary> 460 Clamp a given value between a range
461 </summary>
462 <param name="value">Value to clamp</param>
463 <param name="min">Minimum allowable value</param>
464 <param name="max">Maximum allowable value</param>
465 <returns>A value inclusively between lower and upper</returns>
302 </member> 466 </member>
303 <member name="F:OpenMetaverse.AssetType.ImageJPEG"> 467 <member name="M:OpenMetaverse.Utils.Clamp(System.Double,System.Double,System.Double)">
304 <summary>Compressed JPEG non-square image, not to be used as a 468 <summary>
305 texture</summary> 469 Clamp a given value between a range
470 </summary>
471 <param name="value">Value to clamp</param>
472 <param name="min">Minimum allowable value</param>
473 <param name="max">Maximum allowable value</param>
474 <returns>A value inclusively between lower and upper</returns>
306 </member> 475 </member>
307 <member name="F:OpenMetaverse.AssetType.Animation"> 476 <member name="M:OpenMetaverse.Utils.Clamp(System.Int32,System.Int32,System.Int32)">
308 <summary>Animation</summary> 477 <summary>
478 Clamp a given value between a range
479 </summary>
480 <param name="value">Value to clamp</param>
481 <param name="min">Minimum allowable value</param>
482 <param name="max">Maximum allowable value</param>
483 <returns>A value inclusively between lower and upper</returns>
309 </member> 484 </member>
310 <member name="F:OpenMetaverse.AssetType.Gesture"> 485 <member name="M:OpenMetaverse.Utils.Round(System.Single)">
311 <summary>Sequence of animations, sounds, chat, and pauses</summary> 486 <summary>
487 Round a floating-point value to the nearest integer
488 </summary>
489 <param name="val">Floating point number to round</param>
490 <returns>Integer</returns>
312 </member> 491 </member>
313 <member name="F:OpenMetaverse.AssetType.Simstate"> 492 <member name="M:OpenMetaverse.Utils.IsFinite(System.Single)">
314 <summary>Simstate file</summary> 493 <summary>
494 Test if a single precision float is a finite number
495 </summary>
315 </member> 496 </member>
316 <member name="F:OpenMetaverse.AssetType.FavoriteFolder"> 497 <member name="M:OpenMetaverse.Utils.IsFinite(System.Double)">
317 <summary>Contains landmarks for favorites</summary> 498 <summary>
499 Test if a double precision float is a finite number
500 </summary>
318 </member> 501 </member>
319 <member name="F:OpenMetaverse.AssetType.Link"> 502 <member name="M:OpenMetaverse.Utils.Distance(System.Single,System.Single)">
320 <summary>Asset is a link to another inventory item</summary> 503 <summary>
504 Get the distance between two floating-point values
505 </summary>
506 <param name="value1">First value</param>
507 <param name="value2">Second value</param>
508 <returns>The distance between the two values</returns>
321 </member> 509 </member>
322 <member name="F:OpenMetaverse.AssetType.LinkFolder"> 510 <member name="M:OpenMetaverse.Utils.MD5(System.Byte[])">
323 <summary>Asset is a link to another inventory folder</summary> 511 <summary>
512 Compute the MD5 hash for a byte array
513 </summary>
514 <param name="data">Byte array to compute the hash for</param>
515 <returns>MD5 hash of the input data</returns>
324 </member> 516 </member>
325 <member name="F:OpenMetaverse.AssetType.EnsembleStart"> 517 <member name="M:OpenMetaverse.Utils.SHA1(System.Byte[])">
326 <summary>Beginning of the range reserved for ensembles</summary> 518 <summary>
519 Compute the SHA1 hash for a byte array
520 </summary>
521 <param name="data">Byte array to compute the hash for</param>
522 <returns>SHA1 hash of the input data</returns>
327 </member> 523 </member>
328 <member name="F:OpenMetaverse.AssetType.EnsembleEnd"> 524 <member name="M:OpenMetaverse.Utils.SHA1String(System.String)">
329 <summary>End of the range reserved for ensembles</summary> 525 <summary>
526 Calculate the SHA1 hash of a given string
527 </summary>
528 <param name="value">The string to hash</param>
529 <returns>The SHA1 hash as a string</returns>
330 </member> 530 </member>
331 <member name="F:OpenMetaverse.AssetType.CurrentOutfitFolder"> 531 <member name="M:OpenMetaverse.Utils.SHA256(System.Byte[])">
332 <summary>Folder containing inventory links to wearables and attachments 532 <summary>
333 that are part of the current outfit</summary> 533 Compute the SHA256 hash for a byte array
534 </summary>
535 <param name="data">Byte array to compute the hash for</param>
536 <returns>SHA256 hash of the input data</returns>
334 </member> 537 </member>
335 <member name="F:OpenMetaverse.AssetType.OutfitFolder"> 538 <member name="M:OpenMetaverse.Utils.SHA256String(System.String)">
336 <summary>Folder containing inventory items or links to 539 <summary>
337 inventory items of wearables and attachments 540 Calculate the SHA256 hash of a given string
338 together make a full outfit</summary> 541 </summary>
542 <param name="value">The string to hash</param>
543 <returns>The SHA256 hash as a string</returns>
339 </member> 544 </member>
340 <member name="F:OpenMetaverse.AssetType.MyOutfitsFolder"> 545 <member name="M:OpenMetaverse.Utils.MD5(System.String)">
341 <summary>Root folder for the folders of type OutfitFolder</summary> 546 <summary>
547 Calculate the MD5 hash of a given string
548 </summary>
549 <param name="password">The password to hash</param>
550 <returns>An MD5 hash in string format, with $1$ prepended</returns>
342 </member> 551 </member>
343 <member name="F:OpenMetaverse.AssetType.Mesh"> 552 <member name="M:OpenMetaverse.Utils.MD5String(System.String)">
344 <summary>Linden mesh format</summary> 553 <summary>
554 Calculate the MD5 hash of a given string
555 </summary>
556 <param name="value">The string to hash</param>
557 <returns>The MD5 hash as a string</returns>
345 </member> 558 </member>
346 <member name="T:OpenMetaverse.InventoryType"> 559 <member name="M:OpenMetaverse.Utils.RandomDouble">
347 <summary> 560 <summary>
348 Inventory Item Types, eg Script, Notecard, Folder, etc 561 Generate a random double precision floating point value
349 </summary> 562 </summary>
563 <returns>Random value of type double</returns>
350 </member> 564 </member>
351 <member name="F:OpenMetaverse.InventoryType.Unknown"> 565 <member name="M:OpenMetaverse.Utils.GetRunningPlatform">
566 <summary>
567 Get the current running platform
568 </summary>
569 <returns>Enumeration of the current platform we are running on</returns>
570 </member>
571 <member name="M:OpenMetaverse.Utils.GetRunningRuntime">
572 <summary>
573 Get the current running runtime
574 </summary>
575 <returns>Enumeration of the current runtime we are running on</returns>
576 </member>
577 <member name="T:OpenMetaverse.Utils.Platform">
578 <summary>
579 Operating system
580 </summary>
581 </member>
582 <member name="F:OpenMetaverse.Utils.Platform.Unknown">
352 <summary>Unknown</summary> 583 <summary>Unknown</summary>
353 </member> 584 </member>
354 <member name="F:OpenMetaverse.InventoryType.Texture"> 585 <member name="F:OpenMetaverse.Utils.Platform.Windows">
355 <summary>Texture</summary> 586 <summary>Microsoft Windows</summary>
356 </member> 587 </member>
357 <member name="F:OpenMetaverse.InventoryType.Sound"> 588 <member name="F:OpenMetaverse.Utils.Platform.WindowsCE">
358 <summary>Sound</summary> 589 <summary>Microsoft Windows CE</summary>
359 </member> 590 </member>
360 <member name="F:OpenMetaverse.InventoryType.CallingCard"> 591 <member name="F:OpenMetaverse.Utils.Platform.Linux">
361 <summary>Calling Card</summary> 592 <summary>Linux</summary>
362 </member> 593 </member>
363 <member name="F:OpenMetaverse.InventoryType.Landmark"> 594 <member name="F:OpenMetaverse.Utils.Platform.OSX">
364 <summary>Landmark</summary> 595 <summary>Apple OSX</summary>
365 </member> 596 </member>
366 <member name="F:OpenMetaverse.InventoryType.Notecard"> 597 <member name="T:OpenMetaverse.Utils.Runtime">
367 <summary>Notecard</summary> 598 <summary>
599 Runtime platform
600 </summary>
368 </member> 601 </member>
369 <member name="F:OpenMetaverse.InventoryType.Category"> 602 <member name="F:OpenMetaverse.Utils.Runtime.Windows">
603 <summary>.NET runtime</summary>
604 </member>
605 <member name="F:OpenMetaverse.Utils.Runtime.Mono">
606 <summary>Mono runtime: http://www.mono-project.com/</summary>
607 </member>
608 <member name="M:OpenMetaverse.Matrix4.GetEulerAngles(System.Single@,System.Single@,System.Single@)">
370 <summary> 609 <summary>
610 Convert this matrix to euler rotations
371 </summary> 611 </summary>
612 <param name="roll">X euler angle</param>
613 <param name="pitch">Y euler angle</param>
614 <param name="yaw">Z euler angle</param>
372 </member> 615 </member>
373 <member name="F:OpenMetaverse.InventoryType.Folder"> 616 <member name="M:OpenMetaverse.Matrix4.GetQuaternion">
374 <summary>Folder</summary> 617 <summary>
618 Convert this matrix to a quaternion rotation
619 </summary>
620 <returns>A quaternion representation of this rotation matrix</returns>
375 </member> 621 </member>
376 <member name="F:OpenMetaverse.InventoryType.RootCategory"> 622 <member name="M:OpenMetaverse.Matrix4.CreateFromEulers(System.Single,System.Single,System.Single)">
377 <summary> 623 <summary>
624 Construct a matrix from euler rotation values in radians
378 </summary> 625 </summary>
626 <param name="roll">X euler angle in radians</param>
627 <param name="pitch">Y euler angle in radians</param>
628 <param name="yaw">Z euler angle in radians</param>
379 </member> 629 </member>
380 <member name="F:OpenMetaverse.InventoryType.LSL"> 630 <member name="M:OpenMetaverse.Matrix4.ToString">
381 <summary>an LSL Script</summary> 631 <summary>
632 Get a formatted string representation of the vector
633 </summary>
634 <returns>A string representation of the vector</returns>
382 </member> 635 </member>
383 <member name="F:OpenMetaverse.InventoryType.Snapshot"> 636 <member name="F:OpenMetaverse.Matrix4.Zero">
637 <summary>A 4x4 matrix containing all zeroes</summary>
638 </member>
639 <member name="F:OpenMetaverse.Matrix4.Identity">
640 <summary>A 4x4 identity matrix</summary>
641 </member>
642 <member name="T:OpenMetaverse.BlockingQueue`1">
384 <summary> 643 <summary>
644 Same as Queue except Dequeue function blocks until there is an object to return.
645 Note: This class does not need to be synchronized
385 </summary> 646 </summary>
386 </member> 647 </member>
387 <member name="F:OpenMetaverse.InventoryType.Attachment"> 648 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor(System.Collections.Generic.IEnumerable{`0})">
388 <summary> 649 <summary>
650 Create new BlockingQueue.
389 </summary> 651 </summary>
652 <param name="col">The System.Collections.ICollection to copy elements from</param>
390 </member> 653 </member>
391 <member name="F:OpenMetaverse.InventoryType.Wearable"> 654 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor(System.Int32)">
392 <summary> 655 <summary>
656 Create new BlockingQueue.
393 </summary> 657 </summary>
658 <param name="capacity">The initial number of elements that the queue can contain</param>
394 </member> 659 </member>
395 <member name="F:OpenMetaverse.InventoryType.Animation"> 660 <member name="M:OpenMetaverse.BlockingQueue`1.#ctor">
396 <summary> 661 <summary>
662 Create new BlockingQueue.
397 </summary> 663 </summary>
398 </member> 664 </member>
399 <member name="F:OpenMetaverse.InventoryType.Gesture"> 665 <member name="M:OpenMetaverse.BlockingQueue`1.Finalize">
400 <summary> 666 <summary>
667 BlockingQueue Destructor (Close queue, resume any waiting thread).
401 </summary> 668 </summary>
402 </member> 669 </member>
403 <member name="F:OpenMetaverse.InventoryType.Mesh"> 670 <member name="M:OpenMetaverse.BlockingQueue`1.Clear">
404 <summary> 671 <summary>
672 Remove all objects from the Queue.
405 </summary> 673 </summary>
406 </member> 674 </member>
407 <member name="T:OpenMetaverse.SaleType"> 675 <member name="M:OpenMetaverse.BlockingQueue`1.Close">
408 <summary> 676 <summary>
409 Item Sale Status 677 Remove all objects from the Queue, resume all dequeue threads.
410 </summary> 678 </summary>
411 </member> 679 </member>
412 <member name="F:OpenMetaverse.SaleType.Not"> 680 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue">
413 <summary>Not for sale</summary> 681 <summary>
682 Removes and returns the object at the beginning of the Queue.
683 </summary>
684 <returns>Object in queue.</returns>
414 </member> 685 </member>
415 <member name="F:OpenMetaverse.SaleType.Original"> 686 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue(System.TimeSpan)">
416 <summary>The original is for sale</summary> 687 <summary>
688 Removes and returns the object at the beginning of the Queue.
689 </summary>
690 <param name="timeout">time to wait before returning</param>
691 <returns>Object in queue.</returns>
417 </member> 692 </member>
418 <member name="F:OpenMetaverse.SaleType.Copy"> 693 <member name="M:OpenMetaverse.BlockingQueue`1.Dequeue(System.Int32)">
419 <summary>Copies are for sale</summary> 694 <summary>
695 Removes and returns the object at the beginning of the Queue.
696 </summary>
697 <param name="timeout">time to wait before returning (in milliseconds)</param>
698 <returns>Object in queue.</returns>
420 </member> 699 </member>
421 <member name="F:OpenMetaverse.SaleType.Contents"> 700 <member name="M:OpenMetaverse.BlockingQueue`1.Enqueue(`0)">
422 <summary>The contents of the object are for sale</summary> 701 <summary>
702 Adds an object to the end of the Queue
703 </summary>
704 <param name="obj">Object to put in queue</param>
423 </member> 705 </member>
424 <member name="T:OpenMetaverse.WearableType"> 706 <member name="M:OpenMetaverse.BlockingQueue`1.Open">
425 <summary> 707 <summary>
426 Types of wearable assets 708 Open Queue.
427 </summary> 709 </summary>
428 </member> 710 </member>
429 <member name="F:OpenMetaverse.WearableType.Shape"> 711 <member name="P:OpenMetaverse.BlockingQueue`1.Closed">
430 <summary>Body shape</summary> 712 <summary>
713 Gets flag indicating if queue has been closed.
714 </summary>
431 </member> 715 </member>
432 <member name="F:OpenMetaverse.WearableType.Skin"> 716 <member name="F:OpenMetaverse.Vector4.X">
433 <summary>Skin textures and attributes</summary> 717 <summary>X value</summary>
434 </member> 718 </member>
435 <member name="F:OpenMetaverse.WearableType.Hair"> 719 <member name="F:OpenMetaverse.Vector4.Y">
436 <summary>Hair</summary> 720 <summary>Y value</summary>
437 </member> 721 </member>
438 <member name="F:OpenMetaverse.WearableType.Eyes"> 722 <member name="F:OpenMetaverse.Vector4.Z">
439 <summary>Eyes</summary> 723 <summary>Z value</summary>
440 </member> 724 </member>
441 <member name="F:OpenMetaverse.WearableType.Shirt"> 725 <member name="F:OpenMetaverse.Vector4.W">
442 <summary>Shirt</summary> 726 <summary>W value</summary>
443 </member> 727 </member>
444 <member name="F:OpenMetaverse.WearableType.Pants"> 728 <member name="M:OpenMetaverse.Vector4.#ctor(System.Byte[],System.Int32)">
445 <summary>Pants</summary> 729 <summary>
730 Constructor, builds a vector from a byte array
731 </summary>
732 <param name="byteArray">Byte array containing four four-byte floats</param>
733 <param name="pos">Beginning position in the byte array</param>
446 </member> 734 </member>
447 <member name="F:OpenMetaverse.WearableType.Shoes"> 735 <member name="M:OpenMetaverse.Vector4.ApproxEquals(OpenMetaverse.Vector4,System.Single)">
448 <summary>Shoes</summary> 736 <summary>
737 Test if this vector is equal to another vector, within a given
738 tolerance range
739 </summary>
740 <param name="vec">Vector to test against</param>
741 <param name="tolerance">The acceptable magnitude of difference
742 between the two vectors</param>
743 <returns>True if the magnitude of difference between the two vectors
744 is less than the given tolerance, otherwise false</returns>
449 </member> 745 </member>
450 <member name="F:OpenMetaverse.WearableType.Socks"> 746 <member name="M:OpenMetaverse.Vector4.CompareTo(OpenMetaverse.Vector4)">
451 <summary>Socks</summary> 747 <summary>
748 IComparable.CompareTo implementation
749 </summary>
452 </member> 750 </member>
453 <member name="F:OpenMetaverse.WearableType.Jacket"> 751 <member name="M:OpenMetaverse.Vector4.IsFinite">
454 <summary>Jacket</summary> 752 <summary>
753 Test if this vector is composed of all finite numbers
754 </summary>
455 </member> 755 </member>
456 <member name="F:OpenMetaverse.WearableType.Gloves"> 756 <member name="M:OpenMetaverse.Vector4.FromBytes(System.Byte[],System.Int32)">
457 <summary>Gloves</summary> 757 <summary>
758 Builds a vector from a byte array
759 </summary>
760 <param name="byteArray">Byte array containing a 16 byte vector</param>
761 <param name="pos">Beginning position in the byte array</param>
458 </member> 762 </member>
459 <member name="F:OpenMetaverse.WearableType.Undershirt"> 763 <member name="M:OpenMetaverse.Vector4.GetBytes">
460 <summary>Undershirt</summary> 764 <summary>
765 Returns the raw bytes for this vector
766 </summary>
767 <returns>A 16 byte array containing X, Y, Z, and W</returns>
461 </member> 768 </member>
462 <member name="F:OpenMetaverse.WearableType.Underpants"> 769 <member name="M:OpenMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)">
463 <summary>Underpants</summary> 770 <summary>
771 Writes the raw bytes for this vector to a byte array
772 </summary>
773 <param name="dest">Destination byte array</param>
774 <param name="pos">Position in the destination array to start
775 writing. Must be at least 16 bytes before the end of the array</param>
464 </member> 776 </member>
465 <member name="F:OpenMetaverse.WearableType.Skirt"> 777 <member name="M:OpenMetaverse.Vector4.ToRawString">
466 <summary>Skirt</summary> 778 <summary>
779 Get a string representation of the vector elements with up to three
780 decimal digits and separated by spaces only
781 </summary>
782 <returns>Raw string representation of the vector</returns>
467 </member> 783 </member>
468 <member name="F:OpenMetaverse.WearableType.Alpha"> 784 <member name="F:OpenMetaverse.Vector4.Zero">
469 <summary>Alpha mask to hide parts of the avatar</summary> 785 <summary>A vector with a value of 0,0,0,0</summary>
470 </member> 786 </member>
471 <member name="F:OpenMetaverse.WearableType.Tattoo"> 787 <member name="F:OpenMetaverse.Vector4.One">
472 <summary>Tattoo</summary> 788 <summary>A vector with a value of 1,1,1,1</summary>
473 </member> 789 </member>
474 <member name="F:OpenMetaverse.WearableType.Physics"> 790 <member name="F:OpenMetaverse.Vector4.UnitX">
475 <summary>Physics</summary> 791 <summary>A vector with a value of 1,0,0,0</summary>
476 </member> 792 </member>
477 <member name="F:OpenMetaverse.WearableType.Invalid"> 793 <member name="F:OpenMetaverse.Vector4.UnitY">
478 <summary>Invalid wearable asset</summary> 794 <summary>A vector with a value of 0,1,0,0</summary>
795 </member>
796 <member name="F:OpenMetaverse.Vector4.UnitZ">
797 <summary>A vector with a value of 0,0,1,0</summary>
798 </member>
799 <member name="F:OpenMetaverse.Vector4.UnitW">
800 <summary>A vector with a value of 0,0,0,1</summary>
801 </member>
802 <member name="T:OpenMetaverse.Vector3d">
803 <summary>
804 A three-dimensional vector with doubleing-point values
805 </summary>
806 </member>
807 <member name="F:OpenMetaverse.Vector3d.X">
808 <summary>X value</summary>
809 </member>
810 <member name="F:OpenMetaverse.Vector3d.Y">
811 <summary>Y value</summary>
812 </member>
813 <member name="F:OpenMetaverse.Vector3d.Z">
814 <summary>Z value</summary>
815 </member>
816 <member name="M:OpenMetaverse.Vector3d.#ctor(System.Byte[],System.Int32)">
817 <summary>
818 Constructor, builds a vector from a byte array
819 </summary>
820 <param name="byteArray">Byte array containing three eight-byte doubles</param>
821 <param name="pos">Beginning position in the byte array</param>
822 </member>
823 <member name="M:OpenMetaverse.Vector3d.ApproxEquals(OpenMetaverse.Vector3d,System.Double)">
824 <summary>
825 Test if this vector is equal to another vector, within a given
826 tolerance range
827 </summary>
828 <param name="vec">Vector to test against</param>
829 <param name="tolerance">The acceptable magnitude of difference
830 between the two vectors</param>
831 <returns>True if the magnitude of difference between the two vectors
832 is less than the given tolerance, otherwise false</returns>
833 </member>
834 <member name="M:OpenMetaverse.Vector3d.CompareTo(OpenMetaverse.Vector3d)">
835 <summary>
836 IComparable.CompareTo implementation
837 </summary>
838 </member>
839 <member name="M:OpenMetaverse.Vector3d.IsFinite">
840 <summary>
841 Test if this vector is composed of all finite numbers
842 </summary>
843 </member>
844 <member name="M:OpenMetaverse.Vector3d.FromBytes(System.Byte[],System.Int32)">
845 <summary>
846 Builds a vector from a byte array
847 </summary>
848 <param name="byteArray">Byte array containing a 24 byte vector</param>
849 <param name="pos">Beginning position in the byte array</param>
850 </member>
851 <member name="M:OpenMetaverse.Vector3d.GetBytes">
852 <summary>
853 Returns the raw bytes for this vector
854 </summary>
855 <returns>A 24 byte array containing X, Y, and Z</returns>
856 </member>
857 <member name="M:OpenMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)">
858 <summary>
859 Writes the raw bytes for this vector to a byte array
860 </summary>
861 <param name="dest">Destination byte array</param>
862 <param name="pos">Position in the destination array to start
863 writing. Must be at least 24 bytes before the end of the array</param>
864 </member>
865 <member name="M:OpenMetaverse.Vector3d.Parse(System.String)">
866 <summary>
867 Parse a vector from a string
868 </summary>
869 <param name="val">A string representation of a 3D vector, enclosed
870 in arrow brackets and separated by commas</param>
871 </member>
872 <member name="M:OpenMetaverse.Vector3d.SmoothStep(OpenMetaverse.Vector3d,OpenMetaverse.Vector3d,System.Double)">
873 <summary>
874 Interpolates between two vectors using a cubic equation
875 </summary>
876 </member>
877 <member name="M:OpenMetaverse.Vector3d.ToString">
878 <summary>
879 Get a formatted string representation of the vector
880 </summary>
881 <returns>A string representation of the vector</returns>
882 </member>
883 <member name="M:OpenMetaverse.Vector3d.ToRawString">
884 <summary>
885 Get a string representation of the vector elements with up to three
886 decimal digits and separated by spaces only
887 </summary>
888 <returns>Raw string representation of the vector</returns>
889 </member>
890 <member name="M:OpenMetaverse.Vector3d.op_Modulus(OpenMetaverse.Vector3d,OpenMetaverse.Vector3d)">
891 <summary>
892 Cross product between two vectors
893 </summary>
894 </member>
895 <member name="M:OpenMetaverse.Vector3d.op_Implicit(OpenMetaverse.Vector3)~OpenMetaverse.Vector3d">
896 <summary>
897 Implicit casting for Vector3 > Vector3d
898 </summary>
899 <param name="value"></param>
900 <returns></returns>
901 </member>
902 <member name="F:OpenMetaverse.Vector3d.Zero">
903 <summary>A vector with a value of 0,0,0</summary>
904 </member>
905 <member name="F:OpenMetaverse.Vector3d.One">
906 <summary>A vector with a value of 1,1,1</summary>
907 </member>
908 <member name="F:OpenMetaverse.Vector3d.UnitX">
909 <summary>A unit vector facing forward (X axis), value of 1,0,0</summary>
910 </member>
911 <member name="F:OpenMetaverse.Vector3d.UnitY">
912 <summary>A unit vector facing left (Y axis), value of 0,1,0</summary>
913 </member>
914 <member name="F:OpenMetaverse.Vector3d.UnitZ">
915 <summary>A unit vector facing up (Z axis), value of 0,0,1</summary>
916 </member>
917 <member name="T:OpenMetaverse.Vector3">
918 <summary>
919 A three-dimensional vector with floating-point values
920 </summary>
921 </member>
922 <member name="F:OpenMetaverse.Vector3.X">
923 <summary>X value</summary>
924 </member>
925 <member name="F:OpenMetaverse.Vector3.Y">
926 <summary>Y value</summary>
927 </member>
928 <member name="F:OpenMetaverse.Vector3.Z">
929 <summary>Z value</summary>
930 </member>
931 <member name="M:OpenMetaverse.Vector3.#ctor(System.Byte[],System.Int32)">
932 <summary>
933 Constructor, builds a vector from a byte array
934 </summary>
935 <param name="byteArray">Byte array containing three four-byte floats</param>
936 <param name="pos">Beginning position in the byte array</param>
937 </member>
938 <member name="M:OpenMetaverse.Vector3.ApproxEquals(OpenMetaverse.Vector3,System.Single)">
939 <summary>
940 Test if this vector is equal to another vector, within a given
941 tolerance range
942 </summary>
943 <param name="vec">Vector to test against</param>
944 <param name="tolerance">The acceptable magnitude of difference
945 between the two vectors</param>
946 <returns>True if the magnitude of difference between the two vectors
947 is less than the given tolerance, otherwise false</returns>
948 </member>
949 <member name="M:OpenMetaverse.Vector3.CompareTo(OpenMetaverse.Vector3)">
950 <summary>
951 IComparable.CompareTo implementation
952 </summary>
953 </member>
954 <member name="M:OpenMetaverse.Vector3.IsFinite">
955 <summary>
956 Test if this vector is composed of all finite numbers
957 </summary>
958 </member>
959 <member name="M:OpenMetaverse.Vector3.FromBytes(System.Byte[],System.Int32)">
960 <summary>
961 Builds a vector from a byte array
962 </summary>
963 <param name="byteArray">Byte array containing a 12 byte vector</param>
964 <param name="pos">Beginning position in the byte array</param>
965 </member>
966 <member name="M:OpenMetaverse.Vector3.GetBytes">
967 <summary>
968 Returns the raw bytes for this vector
969 </summary>
970 <returns>A 12 byte array containing X, Y, and Z</returns>
971 </member>
972 <member name="M:OpenMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)">
973 <summary>
974 Writes the raw bytes for this vector to a byte array
975 </summary>
976 <param name="dest">Destination byte array</param>
977 <param name="pos">Position in the destination array to start
978 writing. Must be at least 12 bytes before the end of the array</param>
979 </member>
980 <member name="M:OpenMetaverse.Vector3.Parse(System.String)">
981 <summary>
982 Parse a vector from a string
983 </summary>
984 <param name="val">A string representation of a 3D vector, enclosed
985 in arrow brackets and separated by commas</param>
986 </member>
987 <member name="M:OpenMetaverse.Vector3.RotationBetween(OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
988 <summary>
989 Calculate the rotation between two vectors
990 </summary>
991 <param name="a">Normalized directional vector (such as 1,0,0 for forward facing)</param>
992 <param name="b">Normalized target vector</param>
993 </member>
994 <member name="M:OpenMetaverse.Vector3.SmoothStep(OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Single)">
995 <summary>
996 Interpolates between two vectors using a cubic equation
997 </summary>
998 </member>
999 <member name="M:OpenMetaverse.Vector3.ToString">
1000 <summary>
1001 Get a formatted string representation of the vector
1002 </summary>
1003 <returns>A string representation of the vector</returns>
1004 </member>
1005 <member name="M:OpenMetaverse.Vector3.ToRawString">
1006 <summary>
1007 Get a string representation of the vector elements with up to three
1008 decimal digits and separated by spaces only
1009 </summary>
1010 <returns>Raw string representation of the vector</returns>
1011 </member>
1012 <member name="M:OpenMetaverse.Vector3.op_Modulus(OpenMetaverse.Vector3,OpenMetaverse.Vector3)">
1013 <summary>
1014 Cross product between two vectors
1015 </summary>
1016 </member>
1017 <member name="M:OpenMetaverse.Vector3.op_Explicit(OpenMetaverse.Vector3d)~OpenMetaverse.Vector3">
1018 <summary>
1019 Explicit casting for Vector3d > Vector3
1020 </summary>
1021 <param name="value"></param>
1022 <returns></returns>
1023 </member>
1024 <member name="F:OpenMetaverse.Vector3.Zero">
1025 <summary>A vector with a value of 0,0,0</summary>
1026 </member>
1027 <member name="F:OpenMetaverse.Vector3.One">
1028 <summary>A vector with a value of 1,1,1</summary>
1029 </member>
1030 <member name="F:OpenMetaverse.Vector3.UnitX">
1031 <summary>A unit vector facing forward (X axis), value 1,0,0</summary>
1032 </member>
1033 <member name="F:OpenMetaverse.Vector3.UnitY">
1034 <summary>A unit vector facing left (Y axis), value 0,1,0</summary>
1035 </member>
1036 <member name="F:OpenMetaverse.Vector3.UnitZ">
1037 <summary>A unit vector facing up (Z axis), value 0,0,1</summary>
479 </member> 1038 </member>
480 <member name="T:OpenMetaverse.PCode"> 1039 <member name="T:OpenMetaverse.PCode">
481 <summary> 1040 <summary>
@@ -515,35 +1074,28 @@
515 <summary>Whether physics are enabled for this object</summary> 1074 <summary>Whether physics are enabled for this object</summary>
516 </member> 1075 </member>
517 <member name="F:OpenMetaverse.PrimFlags.CreateSelected"> 1076 <member name="F:OpenMetaverse.PrimFlags.CreateSelected">
518 <summary> 1077 <summary></summary>
519 </summary>
520 </member> 1078 </member>
521 <member name="F:OpenMetaverse.PrimFlags.ObjectModify"> 1079 <member name="F:OpenMetaverse.PrimFlags.ObjectModify">
522 <summary> 1080 <summary></summary>
523 </summary>
524 </member> 1081 </member>
525 <member name="F:OpenMetaverse.PrimFlags.ObjectCopy"> 1082 <member name="F:OpenMetaverse.PrimFlags.ObjectCopy">
526 <summary> 1083 <summary></summary>
527 </summary>
528 </member> 1084 </member>
529 <member name="F:OpenMetaverse.PrimFlags.ObjectAnyOwner"> 1085 <member name="F:OpenMetaverse.PrimFlags.ObjectAnyOwner">
530 <summary> 1086 <summary></summary>
531 </summary>
532 </member> 1087 </member>
533 <member name="F:OpenMetaverse.PrimFlags.ObjectYouOwner"> 1088 <member name="F:OpenMetaverse.PrimFlags.ObjectYouOwner">
534 <summary> 1089 <summary></summary>
535 </summary>
536 </member> 1090 </member>
537 <member name="F:OpenMetaverse.PrimFlags.Scripted"> 1091 <member name="F:OpenMetaverse.PrimFlags.Scripted">
538 <summary> 1092 <summary></summary>
539 </summary>
540 </member> 1093 </member>
541 <member name="F:OpenMetaverse.PrimFlags.Touch"> 1094 <member name="F:OpenMetaverse.PrimFlags.Touch">
542 <summary>Whether this object contains an active touch script</summary> 1095 <summary>Whether this object contains an active touch script</summary>
543 </member> 1096 </member>
544 <member name="F:OpenMetaverse.PrimFlags.ObjectMove"> 1097 <member name="F:OpenMetaverse.PrimFlags.ObjectMove">
545 <summary> 1098 <summary></summary>
546 </summary>
547 </member> 1099 </member>
548 <member name="F:OpenMetaverse.PrimFlags.Money"> 1100 <member name="F:OpenMetaverse.PrimFlags.Money">
549 <summary>Whether this object can receive payments</summary> 1101 <summary>Whether this object can receive payments</summary>
@@ -552,54 +1104,43 @@
552 <summary>Whether this object is phantom (no collisions)</summary> 1104 <summary>Whether this object is phantom (no collisions)</summary>
553 </member> 1105 </member>
554 <member name="F:OpenMetaverse.PrimFlags.InventoryEmpty"> 1106 <member name="F:OpenMetaverse.PrimFlags.InventoryEmpty">
555 <summary> 1107 <summary></summary>
556 </summary>
557 </member> 1108 </member>
558 <member name="F:OpenMetaverse.PrimFlags.JointHinge"> 1109 <member name="F:OpenMetaverse.PrimFlags.JointHinge">
559 <summary> 1110 <summary></summary>
560 </summary>
561 </member> 1111 </member>
562 <member name="F:OpenMetaverse.PrimFlags.JointP2P"> 1112 <member name="F:OpenMetaverse.PrimFlags.JointP2P">
563 <summary> 1113 <summary></summary>
564 </summary>
565 </member> 1114 </member>
566 <member name="F:OpenMetaverse.PrimFlags.JointLP2P"> 1115 <member name="F:OpenMetaverse.PrimFlags.JointLP2P">
567 <summary> 1116 <summary></summary>
568 </summary>
569 </member> 1117 </member>
570 <member name="F:OpenMetaverse.PrimFlags.JointWheel"> 1118 <member name="F:OpenMetaverse.PrimFlags.JointWheel">
571 <summary>Deprecated</summary> 1119 <summary>Deprecated</summary>
572 </member> 1120 </member>
573 <member name="F:OpenMetaverse.PrimFlags.AllowInventoryDrop"> 1121 <member name="F:OpenMetaverse.PrimFlags.AllowInventoryDrop">
574 <summary> 1122 <summary></summary>
575 </summary>
576 </member> 1123 </member>
577 <member name="F:OpenMetaverse.PrimFlags.ObjectTransfer"> 1124 <member name="F:OpenMetaverse.PrimFlags.ObjectTransfer">
578 <summary> 1125 <summary></summary>
579 </summary>
580 </member> 1126 </member>
581 <member name="F:OpenMetaverse.PrimFlags.ObjectGroupOwned"> 1127 <member name="F:OpenMetaverse.PrimFlags.ObjectGroupOwned">
582 <summary> 1128 <summary></summary>
583 </summary>
584 </member> 1129 </member>
585 <member name="F:OpenMetaverse.PrimFlags.ObjectYouOfficer"> 1130 <member name="F:OpenMetaverse.PrimFlags.ObjectYouOfficer">
586 <summary>Deprecated</summary> 1131 <summary>Deprecated</summary>
587 </member> 1132 </member>
588 <member name="F:OpenMetaverse.PrimFlags.CameraDecoupled"> 1133 <member name="F:OpenMetaverse.PrimFlags.CameraDecoupled">
589 <summary> 1134 <summary></summary>
590 </summary>
591 </member> 1135 </member>
592 <member name="F:OpenMetaverse.PrimFlags.AnimSource"> 1136 <member name="F:OpenMetaverse.PrimFlags.AnimSource">
593 <summary> 1137 <summary></summary>
594 </summary>
595 </member> 1138 </member>
596 <member name="F:OpenMetaverse.PrimFlags.CameraSource"> 1139 <member name="F:OpenMetaverse.PrimFlags.CameraSource">
597 <summary> 1140 <summary></summary>
598 </summary>
599 </member> 1141 </member>
600 <member name="F:OpenMetaverse.PrimFlags.CastShadows"> 1142 <member name="F:OpenMetaverse.PrimFlags.CastShadows">
601 <summary> 1143 <summary></summary>
602 </summary>
603 </member> 1144 </member>
604 <member name="F:OpenMetaverse.PrimFlags.DieAtEdge"> 1145 <member name="F:OpenMetaverse.PrimFlags.DieAtEdge">
605 <summary>Server flag, will not be sent to clients. Specifies that 1146 <summary>Server flag, will not be sent to clients. Specifies that
@@ -618,20 +1159,16 @@
618 the object is hovering/flying</summary> 1159 the object is hovering/flying</summary>
619 </member> 1160 </member>
620 <member name="F:OpenMetaverse.PrimFlags.ObjectOwnerModify"> 1161 <member name="F:OpenMetaverse.PrimFlags.ObjectOwnerModify">
621 <summary> 1162 <summary></summary>
622 </summary>
623 </member> 1163 </member>
624 <member name="F:OpenMetaverse.PrimFlags.TemporaryOnRez"> 1164 <member name="F:OpenMetaverse.PrimFlags.TemporaryOnRez">
625 <summary> 1165 <summary></summary>
626 </summary>
627 </member> 1166 </member>
628 <member name="F:OpenMetaverse.PrimFlags.Temporary"> 1167 <member name="F:OpenMetaverse.PrimFlags.Temporary">
629 <summary> 1168 <summary></summary>
630 </summary>
631 </member> 1169 </member>
632 <member name="F:OpenMetaverse.PrimFlags.ZlibCompressed"> 1170 <member name="F:OpenMetaverse.PrimFlags.ZlibCompressed">
633 <summary> 1171 <summary></summary>
634 </summary>
635 </member> 1172 </member>
636 <member name="T:OpenMetaverse.SoundFlags"> 1173 <member name="T:OpenMetaverse.SoundFlags">
637 <summary> 1174 <summary>
@@ -639,32 +1176,25 @@
639 </summary> 1176 </summary>
640 </member> 1177 </member>
641 <member name="F:OpenMetaverse.SoundFlags.None"> 1178 <member name="F:OpenMetaverse.SoundFlags.None">
642 <summary> 1179 <summary></summary>
643 </summary>
644 </member> 1180 </member>
645 <member name="F:OpenMetaverse.SoundFlags.Loop"> 1181 <member name="F:OpenMetaverse.SoundFlags.Loop">
646 <summary> 1182 <summary></summary>
647 </summary>
648 </member> 1183 </member>
649 <member name="F:OpenMetaverse.SoundFlags.SyncMaster"> 1184 <member name="F:OpenMetaverse.SoundFlags.SyncMaster">
650 <summary> 1185 <summary></summary>
651 </summary>
652 </member> 1186 </member>
653 <member name="F:OpenMetaverse.SoundFlags.SyncSlave"> 1187 <member name="F:OpenMetaverse.SoundFlags.SyncSlave">
654 <summary> 1188 <summary></summary>
655 </summary>
656 </member> 1189 </member>
657 <member name="F:OpenMetaverse.SoundFlags.SyncPending"> 1190 <member name="F:OpenMetaverse.SoundFlags.SyncPending">
658 <summary> 1191 <summary></summary>
659 </summary>
660 </member> 1192 </member>
661 <member name="F:OpenMetaverse.SoundFlags.Queue"> 1193 <member name="F:OpenMetaverse.SoundFlags.Queue">
662 <summary> 1194 <summary></summary>
663 </summary>
664 </member> 1195 </member>
665 <member name="F:OpenMetaverse.SoundFlags.Stop"> 1196 <member name="F:OpenMetaverse.SoundFlags.Stop">
666 <summary> 1197 <summary></summary>
667 </summary>
668 </member> 1198 </member>
669 <member name="T:OpenMetaverse.Material"> 1199 <member name="T:OpenMetaverse.Material">
670 <summary> 1200 <summary>
@@ -672,36 +1202,28 @@
672 </summary> 1202 </summary>
673 </member> 1203 </member>
674 <member name="F:OpenMetaverse.Material.Stone"> 1204 <member name="F:OpenMetaverse.Material.Stone">
675 <summary> 1205 <summary></summary>
676 </summary>
677 </member> 1206 </member>
678 <member name="F:OpenMetaverse.Material.Metal"> 1207 <member name="F:OpenMetaverse.Material.Metal">
679 <summary> 1208 <summary></summary>
680 </summary>
681 </member> 1209 </member>
682 <member name="F:OpenMetaverse.Material.Glass"> 1210 <member name="F:OpenMetaverse.Material.Glass">
683 <summary> 1211 <summary></summary>
684 </summary>
685 </member> 1212 </member>
686 <member name="F:OpenMetaverse.Material.Wood"> 1213 <member name="F:OpenMetaverse.Material.Wood">
687 <summary> 1214 <summary></summary>
688 </summary>
689 </member> 1215 </member>
690 <member name="F:OpenMetaverse.Material.Flesh"> 1216 <member name="F:OpenMetaverse.Material.Flesh">
691 <summary> 1217 <summary></summary>
692 </summary>
693 </member> 1218 </member>
694 <member name="F:OpenMetaverse.Material.Plastic"> 1219 <member name="F:OpenMetaverse.Material.Plastic">
695 <summary> 1220 <summary></summary>
696 </summary>
697 </member> 1221 </member>
698 <member name="F:OpenMetaverse.Material.Rubber"> 1222 <member name="F:OpenMetaverse.Material.Rubber">
699 <summary> 1223 <summary></summary>
700 </summary>
701 </member> 1224 </member>
702 <member name="F:OpenMetaverse.Material.Light"> 1225 <member name="F:OpenMetaverse.Material.Light">
703 <summary> 1226 <summary></summary>
704 </summary>
705 </member> 1227 </member>
706 <member name="T:OpenMetaverse.PrimType"> 1228 <member name="T:OpenMetaverse.PrimType">
707 <summary> 1229 <summary>
@@ -711,7 +1233,7 @@
711 <member name="T:OpenMetaverse.ExtraParamType"> 1233 <member name="T:OpenMetaverse.ExtraParamType">
712 <summary> 1234 <summary>
713 Extra parameters for primitives, these flags are for features that have 1235 Extra parameters for primitives, these flags are for features that have
714 been added after the original ObjectFlags that has all eight bits 1236 been added after the original ObjectFlags that has all eight bits
715 reserved already 1237 reserved already
716 </summary> 1238 </summary>
717 </member> 1239 </member>
@@ -724,139 +1246,119 @@
724 <member name="F:OpenMetaverse.ExtraParamType.Sculpt"> 1246 <member name="F:OpenMetaverse.ExtraParamType.Sculpt">
725 <summary>Whether this object is a sculpted prim</summary> 1247 <summary>Whether this object is a sculpted prim</summary>
726 </member> 1248 </member>
1249 <member name="F:OpenMetaverse.ExtraParamType.LightImage">
1250 <summary>Whether this object is a light image map</summary>
1251 </member>
727 <member name="F:OpenMetaverse.ExtraParamType.Mesh"> 1252 <member name="F:OpenMetaverse.ExtraParamType.Mesh">
728 <summary>Whether this object is a mesh</summary> 1253 <summary>Whether this object is a mesh</summary>
729 </member> 1254 </member>
730 <member name="T:OpenMetaverse.JointType"> 1255 <member name="T:OpenMetaverse.JointType">
731 <summary> 1256 <summary>
1257
732 </summary> 1258 </summary>
733 </member> 1259 </member>
734 <member name="F:OpenMetaverse.JointType.Invalid"> 1260 <member name="F:OpenMetaverse.JointType.Invalid">
735 <summary> 1261 <summary></summary>
736 </summary>
737 </member> 1262 </member>
738 <member name="F:OpenMetaverse.JointType.Hinge"> 1263 <member name="F:OpenMetaverse.JointType.Hinge">
739 <summary> 1264 <summary></summary>
740 </summary>
741 </member> 1265 </member>
742 <member name="F:OpenMetaverse.JointType.Point"> 1266 <member name="F:OpenMetaverse.JointType.Point">
743 <summary> 1267 <summary></summary>
744 </summary>
745 </member> 1268 </member>
746 <member name="T:OpenMetaverse.SculptType"> 1269 <member name="T:OpenMetaverse.SculptType">
747 <summary> 1270 <summary>
1271
748 </summary> 1272 </summary>
749 </member> 1273 </member>
750 <member name="F:OpenMetaverse.SculptType.None"> 1274 <member name="F:OpenMetaverse.SculptType.None">
751 <summary> 1275 <summary></summary>
752 </summary>
753 </member> 1276 </member>
754 <member name="F:OpenMetaverse.SculptType.Sphere"> 1277 <member name="F:OpenMetaverse.SculptType.Sphere">
755 <summary> 1278 <summary></summary>
756 </summary>
757 </member> 1279 </member>
758 <member name="F:OpenMetaverse.SculptType.Torus"> 1280 <member name="F:OpenMetaverse.SculptType.Torus">
759 <summary> 1281 <summary></summary>
760 </summary>
761 </member> 1282 </member>
762 <member name="F:OpenMetaverse.SculptType.Plane"> 1283 <member name="F:OpenMetaverse.SculptType.Plane">
763 <summary> 1284 <summary></summary>
764 </summary>
765 </member> 1285 </member>
766 <member name="F:OpenMetaverse.SculptType.Cylinder"> 1286 <member name="F:OpenMetaverse.SculptType.Cylinder">
767 <summary> 1287 <summary></summary>
768 </summary>
769 </member> 1288 </member>
770 <member name="F:OpenMetaverse.SculptType.Mesh"> 1289 <member name="F:OpenMetaverse.SculptType.Mesh">
771 <summary> 1290 <summary></summary>
772 </summary>
773 </member> 1291 </member>
774 <member name="F:OpenMetaverse.SculptType.Invert"> 1292 <member name="F:OpenMetaverse.SculptType.Invert">
775 <summary> 1293 <summary></summary>
776 </summary>
777 </member> 1294 </member>
778 <member name="F:OpenMetaverse.SculptType.Mirror"> 1295 <member name="F:OpenMetaverse.SculptType.Mirror">
779 <summary> 1296 <summary></summary>
780 </summary>
781 </member> 1297 </member>
782 <member name="T:OpenMetaverse.FaceType"> 1298 <member name="T:OpenMetaverse.FaceType">
783 <summary> 1299 <summary>
1300
784 </summary> 1301 </summary>
785 </member> 1302 </member>
786 <member name="F:OpenMetaverse.FaceType.PathBegin"> 1303 <member name="F:OpenMetaverse.FaceType.PathBegin">
787 <summary> 1304 <summary></summary>
788 </summary>
789 </member> 1305 </member>
790 <member name="F:OpenMetaverse.FaceType.PathEnd"> 1306 <member name="F:OpenMetaverse.FaceType.PathEnd">
791 <summary> 1307 <summary></summary>
792 </summary>
793 </member> 1308 </member>
794 <member name="F:OpenMetaverse.FaceType.InnerSide"> 1309 <member name="F:OpenMetaverse.FaceType.InnerSide">
795 <summary> 1310 <summary></summary>
796 </summary>
797 </member> 1311 </member>
798 <member name="F:OpenMetaverse.FaceType.ProfileBegin"> 1312 <member name="F:OpenMetaverse.FaceType.ProfileBegin">
799 <summary> 1313 <summary></summary>
800 </summary>
801 </member> 1314 </member>
802 <member name="F:OpenMetaverse.FaceType.ProfileEnd"> 1315 <member name="F:OpenMetaverse.FaceType.ProfileEnd">
803 <summary> 1316 <summary></summary>
804 </summary>
805 </member> 1317 </member>
806 <member name="F:OpenMetaverse.FaceType.OuterSide0"> 1318 <member name="F:OpenMetaverse.FaceType.OuterSide0">
807 <summary> 1319 <summary></summary>
808 </summary>
809 </member> 1320 </member>
810 <member name="F:OpenMetaverse.FaceType.OuterSide1"> 1321 <member name="F:OpenMetaverse.FaceType.OuterSide1">
811 <summary> 1322 <summary></summary>
812 </summary>
813 </member> 1323 </member>
814 <member name="F:OpenMetaverse.FaceType.OuterSide2"> 1324 <member name="F:OpenMetaverse.FaceType.OuterSide2">
815 <summary> 1325 <summary></summary>
816 </summary>
817 </member> 1326 </member>
818 <member name="F:OpenMetaverse.FaceType.OuterSide3"> 1327 <member name="F:OpenMetaverse.FaceType.OuterSide3">
819 <summary> 1328 <summary></summary>
820 </summary>
821 </member> 1329 </member>
822 <member name="T:OpenMetaverse.ObjectCategory"> 1330 <member name="T:OpenMetaverse.ObjectCategory">
823 <summary> 1331 <summary>
1332
824 </summary> 1333 </summary>
825 </member> 1334 </member>
826 <member name="F:OpenMetaverse.ObjectCategory.Invalid"> 1335 <member name="F:OpenMetaverse.ObjectCategory.Invalid">
827 <summary> 1336 <summary></summary>
828 </summary>
829 </member> 1337 </member>
830 <member name="F:OpenMetaverse.ObjectCategory.None"> 1338 <member name="F:OpenMetaverse.ObjectCategory.None">
831 <summary> 1339 <summary></summary>
832 </summary>
833 </member> 1340 </member>
834 <member name="F:OpenMetaverse.ObjectCategory.Owner"> 1341 <member name="F:OpenMetaverse.ObjectCategory.Owner">
835 <summary> 1342 <summary></summary>
836 </summary>
837 </member> 1343 </member>
838 <member name="F:OpenMetaverse.ObjectCategory.Group"> 1344 <member name="F:OpenMetaverse.ObjectCategory.Group">
839 <summary> 1345 <summary></summary>
840 </summary>
841 </member> 1346 </member>
842 <member name="F:OpenMetaverse.ObjectCategory.Other"> 1347 <member name="F:OpenMetaverse.ObjectCategory.Other">
843 <summary> 1348 <summary></summary>
844 </summary>
845 </member> 1349 </member>
846 <member name="F:OpenMetaverse.ObjectCategory.Selected"> 1350 <member name="F:OpenMetaverse.ObjectCategory.Selected">
847 <summary> 1351 <summary></summary>
848 </summary>
849 </member> 1352 </member>
850 <member name="F:OpenMetaverse.ObjectCategory.Temporary"> 1353 <member name="F:OpenMetaverse.ObjectCategory.Temporary">
851 <summary> 1354 <summary></summary>
852 </summary>
853 </member> 1355 </member>
854 <member name="T:OpenMetaverse.AttachmentPoint"> 1356 <member name="T:OpenMetaverse.AttachmentPoint">
855 <summary> 1357 <summary>
856 Attachment points for objects on avatar bodies 1358 Attachment points for objects on avatar bodies
857 </summary> 1359 </summary>
858 <remarks> 1360 <remarks>
859 Both InventoryObject and InventoryAttachment types can be attached 1361 Both InventoryObject and InventoryAttachment types can be attached
860 </remarks> 1362 </remarks>
861 </member> 1363 </member>
862 <member name="F:OpenMetaverse.AttachmentPoint.Default"> 1364 <member name="F:OpenMetaverse.AttachmentPoint.Default">
@@ -976,6 +1478,12 @@
976 <member name="F:OpenMetaverse.AttachmentPoint.HUDBottomRight"> 1478 <member name="F:OpenMetaverse.AttachmentPoint.HUDBottomRight">
977 <summary>HUD Bottom-right</summary> 1479 <summary>HUD Bottom-right</summary>
978 </member> 1480 </member>
1481 <member name="F:OpenMetaverse.AttachmentPoint.Neck">
1482 <summary>Neck</summary>
1483 </member>
1484 <member name="F:OpenMetaverse.AttachmentPoint.Root">
1485 <summary>Avatar Center</summary>
1486 </member>
979 <member name="T:OpenMetaverse.Tree"> 1487 <member name="T:OpenMetaverse.Tree">
980 <summary> 1488 <summary>
981 Tree foliage types 1489 Tree foliage types
@@ -1050,28 +1558,22 @@
1050 </summary> 1558 </summary>
1051 </member> 1559 </member>
1052 <member name="F:OpenMetaverse.Grass.Grass0"> 1560 <member name="F:OpenMetaverse.Grass.Grass0">
1053 <summary> 1561 <summary></summary>
1054 </summary>
1055 </member> 1562 </member>
1056 <member name="F:OpenMetaverse.Grass.Grass1"> 1563 <member name="F:OpenMetaverse.Grass.Grass1">
1057 <summary> 1564 <summary></summary>
1058 </summary>
1059 </member> 1565 </member>
1060 <member name="F:OpenMetaverse.Grass.Grass2"> 1566 <member name="F:OpenMetaverse.Grass.Grass2">
1061 <summary> 1567 <summary></summary>
1062 </summary>
1063 </member> 1568 </member>
1064 <member name="F:OpenMetaverse.Grass.Grass3"> 1569 <member name="F:OpenMetaverse.Grass.Grass3">
1065 <summary> 1570 <summary></summary>
1066 </summary>
1067 </member> 1571 </member>
1068 <member name="F:OpenMetaverse.Grass.Grass4"> 1572 <member name="F:OpenMetaverse.Grass.Grass4">
1069 <summary> 1573 <summary></summary>
1070 </summary>
1071 </member> 1574 </member>
1072 <member name="F:OpenMetaverse.Grass.Undergrowth1"> 1575 <member name="F:OpenMetaverse.Grass.Undergrowth1">
1073 <summary> 1576 <summary></summary>
1074 </summary>
1075 </member> 1577 </member>
1076 <member name="T:OpenMetaverse.ClickAction"> 1578 <member name="T:OpenMetaverse.ClickAction">
1077 <summary> 1579 <summary>
@@ -1113,313 +1615,228 @@
1113 <member name="F:OpenMetaverse.PhysicsShapeType.ConvexHull"> 1615 <member name="F:OpenMetaverse.PhysicsShapeType.ConvexHull">
1114 <summary>Use convex hull represantion of this prim</summary> 1616 <summary>Use convex hull represantion of this prim</summary>
1115 </member> 1617 </member>
1116 <member name="F:OpenMetaverse.ExpiringCache`2.syncRoot"> 1618 <member name="T:OpenMetaverse.Color4">
1117 <summary>For thread safety</summary>
1118 </member>
1119 <member name="F:OpenMetaverse.ExpiringCache`2.isPurging">
1120 <summary>For thread safety</summary>
1121 </member>
1122 <member name="M:OpenMetaverse.ExpiringCache`2.PurgeCache(System.Object,System.Timers.ElapsedEventArgs)">
1123 <summary>
1124 Purges expired objects from the cache. Called automatically by the purge timer.
1125 </summary>
1126 </member>
1127 <member name="T:OpenMetaverse.LocklessQueue`1">
1128 <summary>
1129 A thread-safe lockless queue that supports multiple readers and
1130 multiple writers
1131 </summary>
1132 </member>
1133 <member name="M:OpenMetaverse.LocklessQueue`1.#ctor">
1134 <summary>
1135 Constructor
1136 </summary>
1137 </member>
1138 <member name="T:OpenMetaverse.LocklessQueue`1.SingleLinkNode">
1139 <summary>
1140 Provides a node container for data in a singly linked list
1141 </summary>
1142 </member>
1143 <member name="M:OpenMetaverse.LocklessQueue`1.SingleLinkNode.#ctor">
1144 <summary>
1145 Constructor
1146 </summary>
1147 </member>
1148 <member name="M:OpenMetaverse.LocklessQueue`1.SingleLinkNode.#ctor(`0)">
1149 <summary> 1619 <summary>
1150 Constructor 1620 An 8-bit color structure including an alpha channel
1151 </summary> 1621 </summary>
1152 </member> 1622 </member>
1153 <member name="F:OpenMetaverse.LocklessQueue`1.SingleLinkNode.Next"> 1623 <member name="F:OpenMetaverse.Color4.R">
1154 <summary>Pointer to the next node in list</summary> 1624 <summary>Red</summary>
1155 </member>
1156 <member name="F:OpenMetaverse.LocklessQueue`1.SingleLinkNode.Item">
1157 <summary>The data contained by the node</summary>
1158 </member>
1159 <member name="F:OpenMetaverse.LocklessQueue`1.head">
1160 <summary>Queue head</summary>
1161 </member> 1625 </member>
1162 <member name="F:OpenMetaverse.LocklessQueue`1.tail"> 1626 <member name="F:OpenMetaverse.Color4.G">
1163 <summary>Queue tail</summary> 1627 <summary>Green</summary>
1164 </member> 1628 </member>
1165 <member name="F:OpenMetaverse.LocklessQueue`1.count"> 1629 <member name="F:OpenMetaverse.Color4.B">
1166 <summary>Queue item count</summary> 1630 <summary>Blue</summary>
1167 </member> 1631 </member>
1168 <member name="P:OpenMetaverse.LocklessQueue`1.Count"> 1632 <member name="F:OpenMetaverse.Color4.A">
1169 <summary>Gets the current number of items in the queue. Since this 1633 <summary>Alpha</summary>
1170 is a lockless collection this value should be treated as a close
1171 estimate</summary>
1172 </member> 1634 </member>
1173 <member name="M:OpenMetaverse.LocklessQueue`1.Enqueue(`0)"> 1635 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)">
1174 <summary> 1636 <summary>
1175 Enqueue an item 1637
1176 </summary> 1638 </summary>
1177 <param name="item">Item to enqeue</param> 1639 <param name="r"></param>
1640 <param name="g"></param>
1641 <param name="b"></param>
1642 <param name="a"></param>
1178 </member> 1643 </member>
1179 <member name="M:OpenMetaverse.LocklessQueue`1.TryDequeue(`0@)"> 1644 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean)">
1180 <summary> 1645 <summary>
1181 Try to dequeue an item 1646 Builds a color from a byte array
1182 </summary> 1647 </summary>
1183 <param name="item">Dequeued item if the dequeue was successful</param> 1648 <param name="byteArray">Byte array containing a 16 byte color</param>
1184 <returns>True if an item was successfully deqeued, otherwise false</returns> 1649 <param name="pos">Beginning position in the byte array</param>
1185 </member> 1650 <param name="inverted">True if the byte array stores inverted values,
1186 <member name="F:OpenMetaverse.Matrix4.Zero"> 1651 otherwise false. For example the color black (fully opaque) inverted
1187 <summary>A 4x4 matrix containing all zeroes</summary> 1652 would be 0xFF 0xFF 0xFF 0x00</param>
1188 </member>
1189 <member name="F:OpenMetaverse.Matrix4.Identity">
1190 <summary>A 4x4 identity matrix</summary>
1191 </member> 1653 </member>
1192 <member name="M:OpenMetaverse.Matrix4.GetEulerAngles(System.Single@,System.Single@,System.Single@)"> 1654 <member name="M:OpenMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean,System.Boolean)">
1193 <summary> 1655 <summary>
1194 Convert this matrix to euler rotations 1656 Returns the raw bytes for this vector
1195 </summary> 1657 </summary>
1196 <param name="roll">X euler angle</param> 1658 <param name="byteArray">Byte array containing a 16 byte color</param>
1197 <param name="pitch">Y euler angle</param> 1659 <param name="pos">Beginning position in the byte array</param>
1198 <param name="yaw">Z euler angle</param> 1660 <param name="inverted">True if the byte array stores inverted values,
1661 otherwise false. For example the color black (fully opaque) inverted
1662 would be 0xFF 0xFF 0xFF 0x00</param>
1663 <param name="alphaInverted">True if the alpha value is inverted in
1664 addition to whatever the inverted parameter is. Setting inverted true
1665 and alphaInverted true will flip the alpha value back to non-inverted,
1666 but keep the other color bytes inverted</param>
1667 <returns>A 16 byte array containing R, G, B, and A</returns>
1199 </member> 1668 </member>
1200 <member name="M:OpenMetaverse.Matrix4.GetQuaternion"> 1669 <member name="M:OpenMetaverse.Color4.#ctor(OpenMetaverse.Color4)">
1201 <summary> 1670 <summary>
1202 Convert this matrix to a quaternion rotation 1671 Copy constructor
1203 </summary> 1672 </summary>
1204 <returns>A quaternion representation of this rotation matrix</returns> 1673 <param name="color">Color to copy</param>
1205 </member> 1674 </member>
1206 <member name="M:OpenMetaverse.Matrix4.CreateFromEulers(System.Single,System.Single,System.Single)"> 1675 <member name="M:OpenMetaverse.Color4.CompareTo(OpenMetaverse.Color4)">
1207 <summary> 1676 <summary>
1208 Construct a matrix from euler rotation values in radians 1677 IComparable.CompareTo implementation
1209 </summary> 1678 </summary>
1210 <param name="roll">X euler angle in radians</param> 1679 <remarks>Sorting ends up like this: |--Grayscale--||--Color--|.
1211 <param name="pitch">Y euler angle in radians</param> 1680 Alpha is only used when the colors are otherwise equivalent</remarks>
1212 <param name="yaw">Z euler angle in radians</param>
1213 </member> 1681 </member>
1214 <member name="M:OpenMetaverse.Matrix4.ToString"> 1682 <member name="M:OpenMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean,System.Boolean)">
1215 <summary> 1683 <summary>
1216 Get a formatted string representation of the vector 1684 Builds a color from a byte array
1217 </summary> 1685 </summary>
1218 <returns>A string representation of the vector</returns> 1686 <param name="byteArray">Byte array containing a 16 byte color</param>
1687 <param name="pos">Beginning position in the byte array</param>
1688 <param name="inverted">True if the byte array stores inverted values,
1689 otherwise false. For example the color black (fully opaque) inverted
1690 would be 0xFF 0xFF 0xFF 0x00</param>
1691 <param name="alphaInverted">True if the alpha value is inverted in
1692 addition to whatever the inverted parameter is. Setting inverted true
1693 and alphaInverted true will flip the alpha value back to non-inverted,
1694 but keep the other color bytes inverted</param>
1219 </member> 1695 </member>
1220 <member name="T:OpenMetaverse.Parallel"> 1696 <member name="M:OpenMetaverse.Color4.ToBytes(System.Byte[],System.Int32)">
1221 <summary> 1697 <summary>
1222 Provides helper methods for parallelizing loops 1698 Writes the raw bytes for this color to a byte array
1223 </summary> 1699 </summary>
1700 <param name="dest">Destination byte array</param>
1701 <param name="pos">Position in the destination array to start
1702 writing. Must be at least 16 bytes before the end of the array</param>
1224 </member> 1703 </member>
1225 <member name="M:OpenMetaverse.Parallel.For(System.Int32,System.Int32,System.Action{System.Int32})"> 1704 <member name="M:OpenMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)">
1226 <summary> 1705 <summary>
1227 Executes a for loop in which iterations may run in parallel 1706 Serializes this color into four bytes in a byte array
1228 </summary> 1707 </summary>
1229 <param name="fromInclusive">The loop will be started at this index</param> 1708 <param name="dest">Destination byte array</param>
1230 <param name="toExclusive">The loop will be terminated before this index is reached</param> 1709 <param name="pos">Position in the destination array to start
1231 <param name="body">Method body to run for each iteration of the loop</param> 1710 writing. Must be at least 4 bytes before the end of the array</param>
1711 <param name="inverted">True to invert the output (1.0 becomes 0
1712 instead of 255)</param>
1232 </member> 1713 </member>
1233 <member name="M:OpenMetaverse.Parallel.For(System.Int32,System.Int32,System.Int32,System.Action{System.Int32})"> 1714 <member name="M:OpenMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)">
1234 <summary> 1715 <summary>
1235 Executes a for loop in which iterations may run in parallel 1716 Writes the raw bytes for this color to a byte array
1236 </summary> 1717 </summary>
1237 <param name="threadCount">The number of concurrent execution threads to run</param> 1718 <param name="dest">Destination byte array</param>
1238 <param name="fromInclusive">The loop will be started at this index</param> 1719 <param name="pos">Position in the destination array to start
1239 <param name="toExclusive">The loop will be terminated before this index is reached</param> 1720 writing. Must be at least 16 bytes before the end of the array</param>
1240 <param name="body">Method body to run for each iteration of the loop</param>
1241 </member> 1721 </member>
1242 <member name="M:OpenMetaverse.Parallel.ForEach``1(System.Collections.Generic.IEnumerable{``0},System.Action{``0})"> 1722 <member name="M:OpenMetaverse.Color4.ClampValues">
1243 <summary> 1723 <summary>
1244 Executes a foreach loop in which iterations may run in parallel 1724 Ensures that values are in range 0-1
1245 </summary> 1725 </summary>
1246 <typeparam name="T">Object type that the collection wraps</typeparam>
1247 <param name="enumerable">An enumerable collection to iterate over</param>
1248 <param name="body">Method body to run for each object in the collection</param>
1249 </member> 1726 </member>
1250 <member name="M:OpenMetaverse.Parallel.ForEach``1(System.Int32,System.Collections.Generic.IEnumerable{``0},System.Action{``0})"> 1727 <member name="M:OpenMetaverse.Color4.FromHSV(System.Double,System.Double,System.Double)">
1251 <summary> 1728 <summary>
1252 Executes a foreach loop in which iterations may run in parallel 1729 Create an RGB color from a hue, saturation, value combination
1253 </summary> 1730 </summary>
1254 <typeparam name="T">Object type that the collection wraps</typeparam> 1731 <param name="hue">Hue</param>
1255 <param name="threadCount">The number of concurrent execution threads to run</param> 1732 <param name="saturation">Saturation</param>
1256 <param name="enumerable">An enumerable collection to iterate over</param> 1733 <param name="value">Value</param>
1257 <param name="body">Method body to run for each object in the collection</param> 1734 <returns>An fully opaque RGB color (alpha is 1.0)</returns>
1258 </member> 1735 </member>
1259 <member name="M:OpenMetaverse.Parallel.Invoke(System.Action[])"> 1736 <member name="M:OpenMetaverse.Color4.Lerp(OpenMetaverse.Color4,OpenMetaverse.Color4,System.Single)">
1260 <summary> 1737 <summary>
1261 Executes a series of tasks in parallel 1738 Performs linear interpolation between two colors
1262 </summary> 1739 </summary>
1263 <param name="actions">A series of method bodies to execute</param> 1740 <param name="value1">Color to start at</param>
1741 <param name="value2">Color to end at</param>
1742 <param name="amount">Amount to interpolate</param>
1743 <returns>The interpolated color</returns>
1264 </member> 1744 </member>
1265 <member name="M:OpenMetaverse.Parallel.Invoke(System.Int32,System.Action[])"> 1745 <member name="F:OpenMetaverse.Color4.Black">
1266 <summary> 1746 <summary>A Color4 with zero RGB values and fully opaque (alpha 1.0)</summary>
1267 Executes a series of tasks in parallel
1268 </summary>
1269 <param name="threadCount">The number of concurrent execution threads to run</param>
1270 <param name="actions">A series of method bodies to execute</param>
1271 </member> 1747 </member>
1272 <member name="M:OpenMetaverse.Quaternion.#ctor(System.Single,System.Single,System.Single)"> 1748 <member name="F:OpenMetaverse.Color4.White">
1273 <summary> 1749 <summary>A Color4 with full RGB values (1.0) and fully opaque (alpha 1.0)</summary>
1274 Build a quaternion from normalized float values
1275 </summary>
1276 <param name="x">X value from -1.0 to 1.0</param>
1277 <param name="y">Y value from -1.0 to 1.0</param>
1278 <param name="z">Z value from -1.0 to 1.0</param>
1279 </member> 1750 </member>
1280 <member name="M:OpenMetaverse.Quaternion.#ctor(System.Byte[],System.Int32,System.Boolean)"> 1751 <member name="T:OpenMetaverse.Vector2">
1281 <summary> 1752 <summary>
1282 Constructor, builds a quaternion object from a byte array 1753 A two-dimensional vector with floating-point values
1283 </summary> 1754 </summary>
1284 <param name="byteArray">Byte array containing four four-byte floats</param>
1285 <param name="pos">Offset in the byte array to start reading at</param>
1286 <param name="normalized">Whether the source data is normalized or
1287 not. If this is true 12 bytes will be read, otherwise 16 bytes will
1288 be read.</param>
1289 </member> 1755 </member>
1290 <member name="F:OpenMetaverse.Quaternion.X"> 1756 <member name="F:OpenMetaverse.Vector2.X">
1291 <summary>X value</summary> 1757 <summary>X value</summary>
1292 </member> 1758 </member>
1293 <member name="F:OpenMetaverse.Quaternion.Y"> 1759 <member name="F:OpenMetaverse.Vector2.Y">
1294 <summary>Y value</summary> 1760 <summary>Y value</summary>
1295 </member> 1761 </member>
1296 <member name="F:OpenMetaverse.Quaternion.Z"> 1762 <member name="M:OpenMetaverse.Vector2.ApproxEquals(OpenMetaverse.Vector2,System.Single)">
1297 <summary>Z value</summary>
1298 </member>
1299 <member name="F:OpenMetaverse.Quaternion.W">
1300 <summary>W value</summary>
1301 </member>
1302 <member name="F:OpenMetaverse.Quaternion.Identity">
1303 <summary>A quaternion with a value of 0,0,0,1</summary>
1304 </member>
1305 <member name="M:OpenMetaverse.Quaternion.Normalize">
1306 <summary>
1307 Normalizes the quaternion
1308 </summary>
1309 </member>
1310 <member name="M:OpenMetaverse.Quaternion.FromBytes(System.Byte[],System.Int32,System.Boolean)">
1311 <summary>
1312 Builds a quaternion object from a byte array
1313 </summary>
1314 <param name="byteArray">The source byte array</param>
1315 <param name="pos">Offset in the byte array to start reading at</param>
1316 <param name="normalized">Whether the source data is normalized or
1317 not. If this is true 12 bytes will be read, otherwise 16 bytes will
1318 be read.</param>
1319 </member>
1320 <member name="M:OpenMetaverse.Quaternion.GetBytes">
1321 <summary>
1322 Normalize this quaternion and serialize it to a byte array
1323 </summary>
1324 <returns>A 12 byte array containing normalized X, Y, and Z floating
1325 point values in order using little endian byte ordering</returns>
1326 </member>
1327 <member name="M:OpenMetaverse.Quaternion.ToBytes(System.Byte[],System.Int32)">
1328 <summary>
1329 Writes the raw bytes for this quaternion to a byte array
1330 </summary>
1331 <param name="dest">Destination byte array</param>
1332 <param name="pos">Position in the destination array to start
1333 writing. Must be at least 12 bytes before the end of the array</param>
1334 </member>
1335 <member name="M:OpenMetaverse.Quaternion.GetEulerAngles(System.Single@,System.Single@,System.Single@)">
1336 <summary> 1763 <summary>
1337 Convert this quaternion to euler angles 1764 Test if this vector is equal to another vector, within a given
1765 tolerance range
1338 </summary> 1766 </summary>
1339 <param name="roll">X euler angle</param> 1767 <param name="vec">Vector to test against</param>
1340 <param name="pitch">Y euler angle</param> 1768 <param name="tolerance">The acceptable magnitude of difference
1341 <param name="yaw">Z euler angle</param> 1769 between the two vectors</param>
1770 <returns>True if the magnitude of difference between the two vectors
1771 is less than the given tolerance, otherwise false</returns>
1342 </member> 1772 </member>
1343 <member name="M:OpenMetaverse.Quaternion.GetAxisAngle(OpenMetaverse.Vector3@,System.Single@)"> 1773 <member name="M:OpenMetaverse.Vector2.IsFinite">
1344 <summary> 1774 <summary>
1345 Convert this quaternion to an angle around an axis 1775 Test if this vector is composed of all finite numbers
1346 </summary> 1776 </summary>
1347 <param name="axis">Unit vector describing the axis</param>
1348 <param name="angle">Angle around the axis, in radians</param>
1349 </member> 1777 </member>
1350 <member name="M:OpenMetaverse.Quaternion.Conjugate(OpenMetaverse.Quaternion)"> 1778 <member name="M:OpenMetaverse.Vector2.CompareTo(OpenMetaverse.Vector2)">
1351 <summary> 1779 <summary>
1352 Returns the conjugate (spatial inverse) of a quaternion 1780 IComparable.CompareTo implementation
1353 </summary> 1781 </summary>
1354 </member> 1782 </member>
1355 <member name="M:OpenMetaverse.Quaternion.CreateFromAxisAngle(System.Single,System.Single,System.Single,System.Single)"> 1783 <member name="M:OpenMetaverse.Vector2.FromBytes(System.Byte[],System.Int32)">
1356 <summary> 1784 <summary>
1357 Build a quaternion from an axis and an angle of rotation around 1785 Builds a vector from a byte array
1358 that axis
1359 </summary> 1786 </summary>
1787 <param name="byteArray">Byte array containing two four-byte floats</param>
1788 <param name="pos">Beginning position in the byte array</param>
1360 </member> 1789 </member>
1361 <member name="M:OpenMetaverse.Quaternion.CreateFromAxisAngle(OpenMetaverse.Vector3,System.Single)"> 1790 <member name="M:OpenMetaverse.Vector2.GetBytes">
1362 <summary> 1791 <summary>
1363 Build a quaternion from an axis and an angle of rotation around 1792 Returns the raw bytes for this vector
1364 that axis
1365 </summary> 1793 </summary>
1366 <param name="axis">Axis of rotation</param> 1794 <returns>An eight-byte array containing X and Y</returns>
1367 <param name="angle">Angle of rotation</param>
1368 </member> 1795 </member>
1369 <member name="M:OpenMetaverse.Quaternion.CreateFromEulers(OpenMetaverse.Vector3)"> 1796 <member name="M:OpenMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)">
1370 <summary> 1797 <summary>
1371 Creates a quaternion from a vector containing roll, pitch, and yaw 1798 Writes the raw bytes for this vector to a byte array
1372 in radians
1373 </summary> 1799 </summary>
1374 <param name="eulers">Vector representation of the euler angles in 1800 <param name="dest">Destination byte array</param>
1375 radians</param> 1801 <param name="pos">Position in the destination array to start
1376 <returns>Quaternion representation of the euler angles</returns> 1802 writing. Must be at least 8 bytes before the end of the array</param>
1377 </member> 1803 </member>
1378 <member name="M:OpenMetaverse.Quaternion.CreateFromEulers(System.Single,System.Single,System.Single)"> 1804 <member name="M:OpenMetaverse.Vector2.Parse(System.String)">
1379 <summary> 1805 <summary>
1380 Creates a quaternion from roll, pitch, and yaw euler angles in 1806 Parse a vector from a string
1381 radians
1382 </summary> 1807 </summary>
1383 <param name="roll">X angle in radians</param> 1808 <param name="val">A string representation of a 2D vector, enclosed
1384 <param name="pitch">Y angle in radians</param> 1809 in arrow brackets and separated by commas</param>
1385 <param name="yaw">Z angle in radians</param>
1386 <returns>Quaternion representation of the euler angles</returns>
1387 </member> 1810 </member>
1388 <member name="M:OpenMetaverse.Quaternion.Inverse(OpenMetaverse.Quaternion)"> 1811 <member name="M:OpenMetaverse.Vector2.SmoothStep(OpenMetaverse.Vector2,OpenMetaverse.Vector2,System.Single)">
1389 <summary> 1812 <summary>
1390 Conjugates and renormalizes a vector 1813 Interpolates between two vectors using a cubic equation
1391 </summary> 1814 </summary>
1392 </member> 1815 </member>
1393 <member name="M:OpenMetaverse.Quaternion.Slerp(OpenMetaverse.Quaternion,OpenMetaverse.Quaternion,System.Single)"> 1816 <member name="M:OpenMetaverse.Vector2.ToString">
1394 <summary> 1817 <summary>
1395 Spherical linear interpolation between two quaternions 1818 Get a formatted string representation of the vector
1396 </summary> 1819 </summary>
1820 <returns>A string representation of the vector</returns>
1397 </member> 1821 </member>
1398 <member name="M:OpenMetaverse.Quaternion.ToRawString"> 1822 <member name="M:OpenMetaverse.Vector2.ToRawString">
1399 <summary> 1823 <summary>
1400 Get a string representation of the quaternion elements with up to three 1824 Get a string representation of the vector elements with up to three
1401 decimal digits and separated by spaces only 1825 decimal digits and separated by spaces only
1402 </summary> 1826 </summary>
1403 <returns>Raw string representation of the quaternion</returns> 1827 <returns>Raw string representation of the vector</returns>
1404 </member> 1828 </member>
1405 <member name="M:OpenMetaverse.ReaderWriterLockSlim.ExitAndWakeUpAppropriateWaiters"> 1829 <member name="F:OpenMetaverse.Vector2.Zero">
1406 <summary> 1830 <summary>A vector with a value of 0,0</summary>
1407 Determines the appropriate events to set, leaves the locks, and sets the events.
1408 </summary>
1409 </member> 1831 </member>
1410 <member name="M:OpenMetaverse.ReaderWriterLockSlim.LazyCreateEvent(System.Threading.EventWaitHandle@,System.Boolean)"> 1832 <member name="F:OpenMetaverse.Vector2.One">
1411 <summary> 1833 <summary>A vector with a value of 1,1</summary>
1412 A routine for lazily creating a event outside the lock (so if errors
1413 happen they are outside the lock and that we don't do much work
1414 while holding a spin lock). If all goes well, reenter the lock and
1415 set 'waitEvent'
1416 </summary>
1417 </member> 1834 </member>
1418 <member name="M:OpenMetaverse.ReaderWriterLockSlim.WaitOnEvent(System.Threading.EventWaitHandle,System.UInt32@,System.Int32)"> 1835 <member name="F:OpenMetaverse.Vector2.UnitX">
1419 <summary> 1836 <summary>A vector with a value of 1,0</summary>
1420 Waits on 'waitEvent' with a timeout of 'millisceondsTimeout. 1837 </member>
1421 Before the wait 'numWaiters' is incremented and is restored before leaving this routine. 1838 <member name="F:OpenMetaverse.Vector2.UnitY">
1422 </summary> 1839 <summary>A vector with a value of 0,1</summary>
1423 </member> 1840 </member>
1424 <member name="T:OpenMetaverse.TokenBucket"> 1841 <member name="T:OpenMetaverse.TokenBucket">
1425 <summary> 1842 <summary>
@@ -1427,23 +1844,12 @@
1427 http://en.wikipedia.org/wiki/Token_bucket for more information 1844 http://en.wikipedia.org/wiki/Token_bucket for more information
1428 </summary> 1845 </summary>
1429 </member> 1846 </member>
1430 <member name="M:OpenMetaverse.TokenBucket.#ctor(OpenMetaverse.TokenBucket,System.Int32,System.Int32)">
1431 <summary>
1432 Default constructor
1433 </summary>
1434 <param name="parent">Parent bucket if this is a child bucket, or
1435 null if this is a root bucket</param>
1436 <param name="maxBurst">Maximum size of the bucket in bytes, or
1437 zero if this bucket has no maximum capacity</param>
1438 <param name="dripRate">Rate that the bucket fills, in bytes per
1439 second. If zero, the bucket always remains full</param>
1440 </member>
1441 <member name="F:OpenMetaverse.TokenBucket.parent"> 1847 <member name="F:OpenMetaverse.TokenBucket.parent">
1442 <summary>Parent bucket to this bucket, or null if this is a root 1848 <summary>Parent bucket to this bucket, or null if this is a root
1443 bucket</summary> 1849 bucket</summary>
1444 </member> 1850 </member>
1445 <member name="F:OpenMetaverse.TokenBucket.maxBurst"> 1851 <member name="F:OpenMetaverse.TokenBucket.maxBurst">
1446 <summary>Size of the bucket in bytes. If zero, the bucket has 1852 <summary>Size of the bucket in bytes. If zero, the bucket has
1447 infinite capacity</summary> 1853 infinite capacity</summary>
1448 </member> 1854 </member>
1449 <member name="F:OpenMetaverse.TokenBucket.tokensPerMS"> 1855 <member name="F:OpenMetaverse.TokenBucket.tokensPerMS">
@@ -1456,35 +1862,16 @@
1456 <member name="F:OpenMetaverse.TokenBucket.lastDrip"> 1862 <member name="F:OpenMetaverse.TokenBucket.lastDrip">
1457 <summary>Time of the last drip, in system ticks</summary> 1863 <summary>Time of the last drip, in system ticks</summary>
1458 </member> 1864 </member>
1459 <member name="P:OpenMetaverse.TokenBucket.Parent"> 1865 <member name="M:OpenMetaverse.TokenBucket.#ctor(OpenMetaverse.TokenBucket,System.Int32,System.Int32)">
1460 <summary>
1461 The parent bucket of this bucket, or null if this bucket has no
1462 parent. The parent bucket will limit the aggregate bandwidth of all
1463 of its children buckets
1464 </summary>
1465 </member>
1466 <member name="P:OpenMetaverse.TokenBucket.MaxBurst">
1467 <summary>
1468 Maximum burst rate in bytes per second. This is the maximum number
1469 of tokens that can accumulate in the bucket at any one time
1470 </summary>
1471 </member>
1472 <member name="P:OpenMetaverse.TokenBucket.DripRate">
1473 <summary> 1866 <summary>
1474 The speed limit of this bucket in bytes per second. This is the 1867 Default constructor
1475 number of tokens that are added to the bucket per second
1476 </summary> 1868 </summary>
1477 <remarks>Tokens are added to the bucket any time 1869 <param name="parent">Parent bucket if this is a child bucket, or
1478 <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32,System.Boolean)" /> is called, at the granularity of 1870 null if this is a root bucket</param>
1479 the system tick interval (typically around 15-22ms)</remarks> 1871 <param name="maxBurst">Maximum size of the bucket in bytes, or
1480 </member> 1872 zero if this bucket has no maximum capacity</param>
1481 <member name="P:OpenMetaverse.TokenBucket.Content"> 1873 <param name="dripRate">Rate that the bucket fills, in bytes per
1482 <summary> 1874 second. If zero, the bucket always remains full</param>
1483 The number of bytes that can be sent at this moment. This is the
1484 current number of tokens in the bucket
1485 <remarks>If this bucket has a parent bucket that does not have
1486 enough tokens for a request, <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32,System.Boolean)" /> will
1487 return false regardless of the content of this bucket</remarks></summary>
1488 </member> 1875 </member>
1489 <member name="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"> 1876 <member name="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)">
1490 <summary> 1877 <summary>
@@ -1507,1191 +1894,761 @@
1507 <member name="M:OpenMetaverse.TokenBucket.Drip"> 1894 <member name="M:OpenMetaverse.TokenBucket.Drip">
1508 <summary> 1895 <summary>
1509 Add tokens to the bucket over time. The number of tokens added each 1896 Add tokens to the bucket over time. The number of tokens added each
1510 call depends on the length of time that has passed since the last 1897 call depends on the length of time that has passed since the last
1511 call to Drip 1898 call to Drip
1512 </summary> 1899 </summary>
1513 <returns>True if tokens were added to the bucket, otherwise false</returns> 1900 <returns>True if tokens were added to the bucket, otherwise false</returns>
1514 </member> 1901 </member>
1515 <member name="T:OpenMetaverse.UUID"> 1902 <member name="P:OpenMetaverse.TokenBucket.Parent">
1516 <summary>
1517 A 128-bit Universally Unique Identifier, used throughout the Second
1518 Life networking protocol
1519 </summary>
1520 </member>
1521 <member name="M:OpenMetaverse.UUID.#ctor(System.String)">
1522 <summary> 1903 <summary>
1523 Constructor that takes a string UUID representation 1904 The parent bucket of this bucket, or null if this bucket has no
1905 parent. The parent bucket will limit the aggregate bandwidth of all
1906 of its children buckets
1524 </summary> 1907 </summary>
1525 <param name="val">A string representation of a UUID, case
1526 insensitive and can either be hyphenated or non-hyphenated</param>
1527 <example>UUID("11f8aa9c-b071-4242-836b-13b7abe0d489")</example>
1528 </member> 1908 </member>
1529 <member name="M:OpenMetaverse.UUID.#ctor(System.Guid)"> 1909 <member name="P:OpenMetaverse.TokenBucket.MaxBurst">
1530 <summary> 1910 <summary>
1531 Constructor that takes a System.Guid object 1911 Maximum burst rate in bytes per second. This is the maximum number
1912 of tokens that can accumulate in the bucket at any one time
1532 </summary> 1913 </summary>
1533 <param name="val">A Guid object that contains the unique identifier
1534 to be represented by this UUID</param>
1535 </member> 1914 </member>
1536 <member name="M:OpenMetaverse.UUID.#ctor(System.Byte[],System.Int32)"> 1915 <member name="P:OpenMetaverse.TokenBucket.DripRate">
1537 <summary> 1916 <summary>
1538 Constructor that takes a byte array containing a UUID 1917 The speed limit of this bucket in bytes per second. This is the
1918 number of tokens that are added to the bucket per second
1539 </summary> 1919 </summary>
1540 <param name="source">Byte array containing a 16 byte UUID</param> 1920 <remarks>Tokens are added to the bucket any time
1541 <param name="pos">Beginning offset in the array</param> 1921 <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> is called, at the granularity of
1922 the system tick interval (typically around 15-22ms)</remarks>
1542 </member> 1923 </member>
1543 <member name="M:OpenMetaverse.UUID.#ctor(System.UInt64)"> 1924 <member name="P:OpenMetaverse.TokenBucket.Content">
1544 <summary> 1925 <summary>
1545 Constructor that takes an unsigned 64-bit unsigned integer to 1926 The number of bytes that can be sent at this moment. This is the
1546 convert to a UUID 1927 current number of tokens in the bucket
1928 <remarks>If this bucket has a parent bucket that does not have
1929 enough tokens for a request, <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> will
1930 return false regardless of the content of this bucket</remarks>
1547 </summary> 1931 </summary>
1548 <param name="val">64-bit unsigned integer to convert to a UUID</param>
1549 </member> 1932 </member>
1550 <member name="M:OpenMetaverse.UUID.#ctor(OpenMetaverse.UUID)"> 1933 <member name="F:OpenMetaverse.Quaternion.X">
1551 <summary> 1934 <summary>X value</summary>
1552 Copy constructor
1553 </summary>
1554 <param name="val">UUID to copy</param>
1555 </member> 1935 </member>
1556 <member name="F:OpenMetaverse.UUID.Guid"> 1936 <member name="F:OpenMetaverse.Quaternion.Y">
1557 <summary>The System.Guid object this struct wraps around</summary> 1937 <summary>Y value</summary>
1558 </member> 1938 </member>
1559 <member name="F:OpenMetaverse.UUID.Zero"> 1939 <member name="F:OpenMetaverse.Quaternion.Z">
1560 <summary>An UUID with a value of all zeroes</summary> 1940 <summary>Z value</summary>
1561 </member> 1941 </member>
1562 <member name="F:OpenMetaverse.UUID.ZeroString"> 1942 <member name="F:OpenMetaverse.Quaternion.W">
1563 <summary>A cache of UUID.Zero as a string to optimize a common path</summary> 1943 <summary>W value</summary>
1564 </member> 1944 </member>
1565 <member name="M:OpenMetaverse.UUID.CompareTo(OpenMetaverse.UUID)"> 1945 <member name="M:OpenMetaverse.Quaternion.#ctor(System.Single,System.Single,System.Single)">
1566 <summary> 1946 <summary>
1567 IComparable.CompareTo implementation 1947 Build a quaternion from normalized float values
1568 </summary> 1948 </summary>
1949 <param name="x">X value from -1.0 to 1.0</param>
1950 <param name="y">Y value from -1.0 to 1.0</param>
1951 <param name="z">Z value from -1.0 to 1.0</param>
1569 </member> 1952 </member>
1570 <member name="M:OpenMetaverse.UUID.FromBytes(System.Byte[],System.Int32)"> 1953 <member name="M:OpenMetaverse.Quaternion.#ctor(System.Byte[],System.Int32,System.Boolean)">
1571 <summary> 1954 <summary>
1572 Assigns this UUID from 16 bytes out of a byte array 1955 Constructor, builds a quaternion object from a byte array
1573 </summary> 1956 </summary>
1574 <param name="source">Byte array containing the UUID to assign this UUID to</param> 1957 <param name="byteArray">Byte array containing four four-byte floats</param>
1575 <param name="pos">Starting position of the UUID in the byte array</param> 1958 <param name="pos">Offset in the byte array to start reading at</param>
1959 <param name="normalized">Whether the source data is normalized or
1960 not. If this is true 12 bytes will be read, otherwise 16 bytes will
1961 be read.</param>
1576 </member> 1962 </member>
1577 <member name="M:OpenMetaverse.UUID.GetBytes"> 1963 <member name="M:OpenMetaverse.Quaternion.Normalize">
1578 <summary> 1964 <summary>
1579 Returns a copy of the raw bytes for this UUID 1965 Normalizes the quaternion
1580 </summary> 1966 </summary>
1581 <returns>A 16 byte array containing this UUID</returns>
1582 </member> 1967 </member>
1583 <member name="M:OpenMetaverse.UUID.ToBytes(System.Byte[],System.Int32)"> 1968 <member name="M:OpenMetaverse.Quaternion.FromBytes(System.Byte[],System.Int32,System.Boolean)">
1584 <summary> 1969 <summary>
1585 Writes the raw bytes for this UUID to a byte array 1970 Builds a quaternion object from a byte array
1586 </summary> 1971 </summary>
1587 <param name="dest">Destination byte array</param> 1972 <param name="byteArray">The source byte array</param>
1588 <param name="pos">Position in the destination array to start 1973 <param name="pos">Offset in the byte array to start reading at</param>
1589 writing. Must be at least 16 bytes before the end of the array</param> 1974 <param name="normalized">Whether the source data is normalized or
1975 not. If this is true 12 bytes will be read, otherwise 16 bytes will
1976 be read.</param>
1590 </member> 1977 </member>
1591 <member name="M:OpenMetaverse.UUID.CRC"> 1978 <member name="M:OpenMetaverse.Quaternion.GetBytes">
1592 <summary> 1979 <summary>
1593 Calculate an LLCRC (cyclic redundancy check) for this UUID 1980 Normalize this quaternion and serialize it to a byte array
1594 </summary> 1981 </summary>
1595 <returns>The CRC checksum for this UUID</returns> 1982 <returns>A 12 byte array containing normalized X, Y, and Z floating
1983 point values in order using little endian byte ordering</returns>
1596 </member> 1984 </member>
1597 <member name="M:OpenMetaverse.UUID.GetULong"> 1985 <member name="M:OpenMetaverse.Quaternion.ToBytes(System.Byte[],System.Int32)">
1598 <summary> 1986 <summary>
1599 Create a 64-bit integer representation from the second half of this UUID 1987 Writes the raw bytes for this quaternion to a byte array
1600 </summary> 1988 </summary>
1601 <returns>An integer created from the last eight bytes of this UUID</returns> 1989 <param name="dest">Destination byte array</param>
1990 <param name="pos">Position in the destination array to start
1991 writing. Must be at least 12 bytes before the end of the array</param>
1602 </member> 1992 </member>
1603 <member name="M:OpenMetaverse.UUID.Parse(System.String)"> 1993 <member name="M:OpenMetaverse.Quaternion.GetEulerAngles(System.Single@,System.Single@,System.Single@)">
1604 <summary> 1994 <summary>
1605 Generate a UUID from a string 1995 Convert this quaternion to euler angles
1606 </summary> 1996 </summary>
1607 <param name="val">A string representation of a UUID, case 1997 <param name="roll">X euler angle</param>
1608 insensitive and can either be hyphenated or non-hyphenated</param> 1998 <param name="pitch">Y euler angle</param>
1609 <example>UUID.Parse("11f8aa9c-b071-4242-836b-13b7abe0d489")</example> 1999 <param name="yaw">Z euler angle</param>
1610 </member> 2000 </member>
1611 <member name="M:OpenMetaverse.UUID.TryParse(System.String,OpenMetaverse.UUID@)"> 2001 <member name="M:OpenMetaverse.Quaternion.GetAxisAngle(OpenMetaverse.Vector3@,System.Single@)">
1612 <summary> 2002 <summary>
1613 Generate a UUID from a string 2003 Convert this quaternion to an angle around an axis
1614 </summary> 2004 </summary>
1615 <param name="val">A string representation of a UUID, case 2005 <param name="axis">Unit vector describing the axis</param>
1616 insensitive and can either be hyphenated or non-hyphenated</param> 2006 <param name="angle">Angle around the axis, in radians</param>
1617 <param name="result">Will contain the parsed UUID if successful,
1618 otherwise null</param>
1619 <returns>True if the string was successfully parse, otherwise false</returns>
1620 <example>UUID.TryParse("11f8aa9c-b071-4242-836b-13b7abe0d489", result)</example>
1621 </member> 2007 </member>
1622 <member name="M:OpenMetaverse.UUID.Combine(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 2008 <member name="M:OpenMetaverse.Quaternion.Conjugate(OpenMetaverse.Quaternion)">
1623 <summary> 2009 <summary>
1624 Combine two UUIDs together by taking the MD5 hash of a byte array 2010 Returns the conjugate (spatial inverse) of a quaternion
1625 containing both UUIDs
1626 </summary> 2011 </summary>
1627 <param name="first">First UUID to combine</param>
1628 <param name="second">Second UUID to combine</param>
1629 <returns>The UUID product of the combination</returns>
1630 </member> 2012 </member>
1631 <member name="M:OpenMetaverse.UUID.Random"> 2013 <member name="M:OpenMetaverse.Quaternion.CreateFromAxisAngle(System.Single,System.Single,System.Single,System.Single)">
1632 <summary> 2014 <summary>
2015 Build a quaternion from an axis and an angle of rotation around
2016 that axis
1633 </summary> 2017 </summary>
1634 <returns>
1635 </returns>
1636 </member> 2018 </member>
1637 <member name="M:OpenMetaverse.UUID.GetHashCode"> 2019 <member name="M:OpenMetaverse.Quaternion.CreateFromAxisAngle(OpenMetaverse.Vector3,System.Single)">
1638 <summary> 2020 <summary>
1639 Return a hash code for this UUID, used by .NET for hash tables 2021 Build a quaternion from an axis and an angle of rotation around
2022 that axis
1640 </summary> 2023 </summary>
1641 <returns>An integer composed of all the UUID bytes XORed together</returns> 2024 <param name="axis">Axis of rotation</param>
2025 <param name="angle">Angle of rotation</param>
1642 </member> 2026 </member>
1643 <member name="M:OpenMetaverse.UUID.Equals(System.Object)"> 2027 <member name="M:OpenMetaverse.Quaternion.CreateFromEulers(OpenMetaverse.Vector3)">
1644 <summary> 2028 <summary>
1645 Comparison function 2029 Creates a quaternion from a vector containing roll, pitch, and yaw
2030 in radians
1646 </summary> 2031 </summary>
1647 <param name="o">An object to compare to this UUID</param> 2032 <param name="eulers">Vector representation of the euler angles in
1648 <returns>True if the object is a UUID and both UUIDs are equal</returns> 2033 radians</param>
2034 <returns>Quaternion representation of the euler angles</returns>
1649 </member> 2035 </member>
1650 <member name="M:OpenMetaverse.UUID.Equals(OpenMetaverse.UUID)"> 2036 <member name="M:OpenMetaverse.Quaternion.CreateFromEulers(System.Single,System.Single,System.Single)">
1651 <summary> 2037 <summary>
1652 Comparison function 2038 Creates a quaternion from roll, pitch, and yaw euler angles in
2039 radians
1653 </summary> 2040 </summary>
1654 <param name="uuid">UUID to compare to</param> 2041 <param name="roll">X angle in radians</param>
1655 <returns>True if the UUIDs are equal, otherwise false</returns> 2042 <param name="pitch">Y angle in radians</param>
2043 <param name="yaw">Z angle in radians</param>
2044 <returns>Quaternion representation of the euler angles</returns>
1656 </member> 2045 </member>
1657 <member name="M:OpenMetaverse.UUID.ToString"> 2046 <member name="M:OpenMetaverse.Quaternion.Inverse(OpenMetaverse.Quaternion)">
1658 <summary> 2047 <summary>
1659 Get a hyphenated string representation of this UUID 2048 Conjugates and renormalizes a vector
1660 </summary> 2049 </summary>
1661 <returns>A string representation of this UUID, lowercase and
1662 with hyphens</returns>
1663 <example>11f8aa9c-b071-4242-836b-13b7abe0d489</example>
1664 </member> 2050 </member>
1665 <member name="M:OpenMetaverse.UUID.op_Equality(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 2051 <member name="M:OpenMetaverse.Quaternion.Slerp(OpenMetaverse.Quaternion,OpenMetaverse.Quaternion,System.Single)">
1666 <summary> 2052 <summary>
1667 Equals operator 2053 Spherical linear interpolation between two quaternions
1668 </summary> 2054 </summary>
1669 <param name="lhs">First UUID for comparison</param>
1670 <param name="rhs">Second UUID for comparison</param>
1671 <returns>True if the UUIDs are byte for byte equal, otherwise false</returns>
1672 </member> 2055 </member>
1673 <member name="M:OpenMetaverse.UUID.op_Inequality(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 2056 <member name="M:OpenMetaverse.Quaternion.ToRawString">
1674 <summary> 2057 <summary>
1675 Not equals operator 2058 Get a string representation of the quaternion elements with up to three
2059 decimal digits and separated by spaces only
1676 </summary> 2060 </summary>
1677 <param name="lhs">First UUID for comparison</param> 2061 <returns>Raw string representation of the quaternion</returns>
1678 <param name="rhs">Second UUID for comparison</param>
1679 <returns>True if the UUIDs are not equal, otherwise true</returns>
1680 </member> 2062 </member>
1681 <member name="M:OpenMetaverse.UUID.op_ExclusiveOr(OpenMetaverse.UUID,OpenMetaverse.UUID)"> 2063 <member name="F:OpenMetaverse.Quaternion.Identity">
1682 <summary> 2064 <summary>A quaternion with a value of 0,0,0,1</summary>
1683 XOR operator
1684 </summary>
1685 <param name="lhs">First UUID</param>
1686 <param name="rhs">Second UUID</param>
1687 <returns>A UUID that is a XOR combination of the two input UUIDs</returns>
1688 </member> 2065 </member>
1689 <member name="M:OpenMetaverse.UUID.op_Explicit(System.String)~OpenMetaverse.UUID"> 2066 <member name="F:OpenMetaverse.ExpiringCache`2.syncRoot">
2067 <summary>For thread safety</summary>
2068 </member>
2069 <member name="F:OpenMetaverse.ExpiringCache`2.isPurging">
2070 <summary>For thread safety</summary>
2071 </member>
2072 <member name="M:OpenMetaverse.ExpiringCache`2.PurgeCache(System.Object,System.Timers.ElapsedEventArgs)">
1690 <summary> 2073 <summary>
1691 String typecasting operator 2074 Purges expired objects from the cache. Called automatically by the purge timer.
1692 </summary> 2075 </summary>
1693 <param name="val">A UUID in string form. Case insensitive,
1694 hyphenated or non-hyphenated</param>
1695 <returns>A UUID built from the string representation</returns>
1696 </member> 2076 </member>
1697 <member name="T:OpenMetaverse.Utils.Platform"> 2077 <member name="T:OpenMetaverse.EnumInfoAttribute">
1698 <summary> 2078 <summary>
1699 Operating system 2079 Attribute class that allows extra attributes to be attached to ENUMs
1700 </summary> 2080 </summary>
1701 </member> 2081 </member>
1702 <member name="F:OpenMetaverse.Utils.Platform.Unknown"> 2082 <member name="F:OpenMetaverse.EnumInfoAttribute.Text">
1703 <summary>Unknown</summary> 2083 <summary>Text used when presenting ENUM to user</summary>
1704 </member>
1705 <member name="F:OpenMetaverse.Utils.Platform.Windows">
1706 <summary>Microsoft Windows</summary>
1707 </member>
1708 <member name="F:OpenMetaverse.Utils.Platform.WindowsCE">
1709 <summary>Microsoft Windows CE</summary>
1710 </member> 2084 </member>
1711 <member name="F:OpenMetaverse.Utils.Platform.Linux"> 2085 <member name="M:OpenMetaverse.EnumInfoAttribute.#ctor">
1712 <summary>Linux</summary> 2086 <summary>Default initializer</summary>
1713 </member> 2087 </member>
1714 <member name="F:OpenMetaverse.Utils.Platform.OSX"> 2088 <member name="M:OpenMetaverse.EnumInfoAttribute.#ctor(System.String)">
1715 <summary>Apple OSX</summary> 2089 <summary>Text used when presenting ENUM to user</summary>
1716 </member> 2090 </member>
1717 <member name="T:OpenMetaverse.Utils.Runtime"> 2091 <member name="T:OpenMetaverse.AssetType">
1718 <summary> 2092 <summary>
1719 Runtime platform 2093 The different types of grid assets
1720 </summary> 2094 </summary>
1721 </member> 2095 </member>
1722 <member name="F:OpenMetaverse.Utils.Runtime.Windows"> 2096 <member name="F:OpenMetaverse.AssetType.Unknown">
1723 <summary>.NET runtime</summary> 2097 <summary>Unknown asset type</summary>
1724 </member>
1725 <member name="F:OpenMetaverse.Utils.Runtime.Mono">
1726 <summary>Mono runtime: http://www.mono-project.com/</summary>
1727 </member>
1728 <member name="F:OpenMetaverse.Utils.DEG_TO_RAD">
1729 <summary>Used for converting degrees to radians</summary>
1730 </member> 2098 </member>
1731 <member name="F:OpenMetaverse.Utils.RAD_TO_DEG"> 2099 <member name="F:OpenMetaverse.AssetType.Texture">
1732 <summary>Used for converting radians to degrees</summary> 2100 <summary>Texture asset, stores in JPEG2000 J2C stream format</summary>
1733 </member> 2101 </member>
1734 <member name="F:OpenMetaverse.Utils.EnUsCulture"> 2102 <member name="F:OpenMetaverse.AssetType.Sound">
1735 <summary>Provide a single instance of the CultureInfo class to 2103 <summary>Sound asset</summary>
1736 help parsing in situations where the grid assumes an en-us
1737 culture</summary>
1738 </member> 2104 </member>
1739 <member name="F:OpenMetaverse.Utils.Epoch"> 2105 <member name="F:OpenMetaverse.AssetType.CallingCard">
1740 <summary>UNIX epoch in DateTime format</summary> 2106 <summary>Calling card for another avatar</summary>
1741 </member> 2107 </member>
1742 <member name="F:OpenMetaverse.Utils.MD5Builder"> 2108 <member name="F:OpenMetaverse.AssetType.Landmark">
1743 <summary>Provide a single instance of the MD5 class to avoid making 2109 <summary>Link to a location in world</summary>
1744 duplicate copies and handle thread safety</summary>
1745 </member> 2110 </member>
1746 <member name="F:OpenMetaverse.Utils.SHA1Builder"> 2111 <member name="F:OpenMetaverse.AssetType.Clothing">
1747 <summary>Provide a single instance of the SHA-1 class to avoid 2112 <summary>Collection of textures and parameters that can be
1748 making duplicate copies and handle thread safety</summary> 2113 worn by an avatar</summary>
1749 </member> 2114 </member>
1750 <member name="F:OpenMetaverse.Utils.RNG"> 2115 <member name="F:OpenMetaverse.AssetType.Object">
1751 <summary>Provide a single instance of a random number generator 2116 <summary>Primitive that can contain textures, sounds,
1752 to avoid making duplicate copies and handle thread safety</summary> 2117 scripts and more</summary>
1753 </member> 2118 </member>
1754 <member name="M:OpenMetaverse.Utils.Clamp(System.Single,System.Single,System.Single)"> 2119 <member name="F:OpenMetaverse.AssetType.Notecard">
1755 <summary> 2120 <summary>Notecard asset</summary>
1756 Clamp a given value between a range
1757 </summary>
1758 <param name="value">Value to clamp</param>
1759 <param name="min">Minimum allowable value</param>
1760 <param name="max">Maximum allowable value</param>
1761 <returns>A value inclusively between lower and upper</returns>
1762 </member> 2121 </member>
1763 <member name="M:OpenMetaverse.Utils.Clamp(System.Double,System.Double,System.Double)"> 2122 <member name="F:OpenMetaverse.AssetType.Folder">
1764 <summary> 2123 <summary>Holds a collection of inventory items</summary>
1765 Clamp a given value between a range
1766 </summary>
1767 <param name="value">Value to clamp</param>
1768 <param name="min">Minimum allowable value</param>
1769 <param name="max">Maximum allowable value</param>
1770 <returns>A value inclusively between lower and upper</returns>
1771 </member> 2124 </member>
1772 <member name="M:OpenMetaverse.Utils.Clamp(System.Int32,System.Int32,System.Int32)"> 2125 <member name="F:OpenMetaverse.AssetType.RootFolder">
1773 <summary> 2126 <summary>Root inventory folder</summary>
1774 Clamp a given value between a range
1775 </summary>
1776 <param name="value">Value to clamp</param>
1777 <param name="min">Minimum allowable value</param>
1778 <param name="max">Maximum allowable value</param>
1779 <returns>A value inclusively between lower and upper</returns>
1780 </member> 2127 </member>
1781 <member name="M:OpenMetaverse.Utils.Round(System.Single)"> 2128 <member name="F:OpenMetaverse.AssetType.LSLText">
1782 <summary> 2129 <summary>Linden scripting language script</summary>
1783 Round a floating-point value to the nearest integer
1784 </summary>
1785 <param name="val">Floating point number to round</param>
1786 <returns>Integer</returns>
1787 </member> 2130 </member>
1788 <member name="M:OpenMetaverse.Utils.IsFinite(System.Single)"> 2131 <member name="F:OpenMetaverse.AssetType.LSLBytecode">
1789 <summary> 2132 <summary>LSO bytecode for a script</summary>
1790 Test if a single precision float is a finite number
1791 </summary>
1792 </member> 2133 </member>
1793 <member name="M:OpenMetaverse.Utils.IsFinite(System.Double)"> 2134 <member name="F:OpenMetaverse.AssetType.TextureTGA">
1794 <summary> 2135 <summary>Uncompressed TGA texture</summary>
1795 Test if a double precision float is a finite number
1796 </summary>
1797 </member> 2136 </member>
1798 <member name="M:OpenMetaverse.Utils.Distance(System.Single,System.Single)"> 2137 <member name="F:OpenMetaverse.AssetType.Bodypart">
1799 <summary> 2138 <summary>Collection of textures and shape parameters that can
1800 Get the distance between two floating-point values 2139 be worn</summary>
1801 </summary>
1802 <param name="value1">First value</param>
1803 <param name="value2">Second value</param>
1804 <returns>The distance between the two values</returns>
1805 </member> 2140 </member>
1806 <member name="M:OpenMetaverse.Utils.MD5(System.Byte[])"> 2141 <member name="F:OpenMetaverse.AssetType.TrashFolder">
1807 <summary> 2142 <summary>Trash folder</summary>
1808 Compute the MD5 hash for a byte array
1809 </summary>
1810 <param name="data">Byte array to compute the hash for</param>
1811 <returns>MD5 hash of the input data</returns>
1812 </member> 2143 </member>
1813 <member name="M:OpenMetaverse.Utils.SHA1(System.Byte[])"> 2144 <member name="F:OpenMetaverse.AssetType.SnapshotFolder">
1814 <summary> 2145 <summary>Snapshot folder</summary>
1815 Compute the SHA1 hash for a byte array
1816 </summary>
1817 <param name="data">Byte array to compute the hash for</param>
1818 <returns>SHA1 hash of the input data</returns>
1819 </member> 2146 </member>
1820 <member name="M:OpenMetaverse.Utils.SHA1String(System.String)"> 2147 <member name="F:OpenMetaverse.AssetType.LostAndFoundFolder">
1821 <summary> 2148 <summary>Lost and found folder</summary>
1822 Calculate the SHA1 hash of a given string
1823 </summary>
1824 <param name="value">The string to hash</param>
1825 <returns>The SHA1 hash as a string</returns>
1826 </member> 2149 </member>
1827 <member name="M:OpenMetaverse.Utils.SHA256(System.Byte[])"> 2150 <member name="F:OpenMetaverse.AssetType.SoundWAV">
1828 <summary> 2151 <summary>Uncompressed sound</summary>
1829 Compute the SHA256 hash for a byte array
1830 </summary>
1831 <param name="data">Byte array to compute the hash for</param>
1832 <returns>SHA256 hash of the input data</returns>
1833 </member> 2152 </member>
1834 <member name="M:OpenMetaverse.Utils.SHA256String(System.String)"> 2153 <member name="F:OpenMetaverse.AssetType.ImageTGA">
1835 <summary> 2154 <summary>Uncompressed TGA non-square image, not to be used as a
1836 Calculate the SHA256 hash of a given string 2155 texture</summary>
1837 </summary>
1838 <param name="value">The string to hash</param>
1839 <returns>The SHA256 hash as a string</returns>
1840 </member> 2156 </member>
1841 <member name="M:OpenMetaverse.Utils.MD5(System.String)"> 2157 <member name="F:OpenMetaverse.AssetType.ImageJPEG">
1842 <summary> 2158 <summary>Compressed JPEG non-square image, not to be used as a
1843 Calculate the MD5 hash of a given string 2159 texture</summary>
1844 </summary>
1845 <param name="password">The password to hash</param>
1846 <returns>An MD5 hash in string format, with $1$ prepended</returns>
1847 </member> 2160 </member>
1848 <member name="M:OpenMetaverse.Utils.MD5String(System.String)"> 2161 <member name="F:OpenMetaverse.AssetType.Animation">
1849 <summary> 2162 <summary>Animation</summary>
1850 Calculate the MD5 hash of a given string
1851 </summary>
1852 <param name="value">The string to hash</param>
1853 <returns>The MD5 hash as a string</returns>
1854 </member> 2163 </member>
1855 <member name="M:OpenMetaverse.Utils.RandomDouble"> 2164 <member name="F:OpenMetaverse.AssetType.Gesture">
1856 <summary> 2165 <summary>Sequence of animations, sounds, chat, and pauses</summary>
1857 Generate a random double precision floating point value
1858 </summary>
1859 <returns>Random value of type double</returns>
1860 </member> 2166 </member>
1861 <member name="M:OpenMetaverse.Utils.GetRunningPlatform"> 2167 <member name="F:OpenMetaverse.AssetType.Simstate">
1862 <summary> 2168 <summary>Simstate file</summary>
1863 Get the current running platform
1864 </summary>
1865 <returns>Enumeration of the current platform we are running on</returns>
1866 </member> 2169 </member>
1867 <member name="M:OpenMetaverse.Utils.GetRunningRuntime"> 2170 <member name="F:OpenMetaverse.AssetType.FavoriteFolder">
1868 <summary> 2171 <summary>Contains landmarks for favorites</summary>
1869 Get the current running runtime
1870 </summary>
1871 <returns>Enumeration of the current runtime we are running on</returns>
1872 </member> 2172 </member>
1873 <member name="M:OpenMetaverse.Utils.BytesToInt16(System.Byte[])"> 2173 <member name="F:OpenMetaverse.AssetType.Link">
1874 <summary> 2174 <summary>Asset is a link to another inventory item</summary>
1875 Convert the first two bytes starting in the byte array in
1876 little endian ordering to a signed short integer
1877 </summary>
1878 <param name="bytes">An array two bytes or longer</param>
1879 <returns>A signed short integer, will be zero if a short can't be
1880 read at the given position</returns>
1881 </member> 2175 </member>
1882 <member name="M:OpenMetaverse.Utils.BytesToInt16(System.Byte[],System.Int32)"> 2176 <member name="F:OpenMetaverse.AssetType.LinkFolder">
1883 <summary> 2177 <summary>Asset is a link to another inventory folder</summary>
1884 Convert the first two bytes starting at the given position in
1885 little endian ordering to a signed short integer
1886 </summary>
1887 <param name="bytes">An array two bytes or longer</param>
1888 <param name="pos">Position in the array to start reading</param>
1889 <returns>A signed short integer, will be zero if a short can't be
1890 read at the given position</returns>
1891 </member> 2178 </member>
1892 <member name="M:OpenMetaverse.Utils.BytesToInt(System.Byte[],System.Int32)"> 2179 <member name="F:OpenMetaverse.AssetType.EnsembleStart">
1893 <summary> 2180 <summary>Beginning of the range reserved for ensembles</summary>
1894 Convert the first four bytes starting at the given position in
1895 little endian ordering to a signed integer
1896 </summary>
1897 <param name="bytes">An array four bytes or longer</param>
1898 <param name="pos">Position to start reading the int from</param>
1899 <returns>A signed integer, will be zero if an int can't be read
1900 at the given position</returns>
1901 </member> 2181 </member>
1902 <member name="M:OpenMetaverse.Utils.BytesToInt(System.Byte[])"> 2182 <member name="F:OpenMetaverse.AssetType.EnsembleEnd">
1903 <summary> 2183 <summary>End of the range reserved for ensembles</summary>
1904 Convert the first four bytes of the given array in little endian
1905 ordering to a signed integer
1906 </summary>
1907 <param name="bytes">An array four bytes or longer</param>
1908 <returns>A signed integer, will be zero if the array contains
1909 less than four bytes</returns>
1910 </member> 2184 </member>
1911 <member name="M:OpenMetaverse.Utils.BytesToInt64(System.Byte[])"> 2185 <member name="F:OpenMetaverse.AssetType.CurrentOutfitFolder">
1912 <summary> 2186 <summary>Folder containing inventory links to wearables and attachments
1913 Convert the first eight bytes of the given array in little endian 2187 that are part of the current outfit</summary>
1914 ordering to a signed long integer
1915 </summary>
1916 <param name="bytes">An array eight bytes or longer</param>
1917 <returns>A signed long integer, will be zero if the array contains
1918 less than eight bytes</returns>
1919 </member> 2188 </member>
1920 <member name="M:OpenMetaverse.Utils.BytesToInt64(System.Byte[],System.Int32)"> 2189 <member name="F:OpenMetaverse.AssetType.OutfitFolder">
1921 <summary> 2190 <summary>Folder containing inventory items or links to
1922 Convert the first eight bytes starting at the given position in 2191 inventory items of wearables and attachments
1923 little endian ordering to a signed long integer 2192 together make a full outfit</summary>
1924 </summary>
1925 <param name="bytes">An array eight bytes or longer</param>
1926 <param name="pos">Position to start reading the long from</param>
1927 <returns>A signed long integer, will be zero if a long can't be read
1928 at the given position</returns>
1929 </member> 2193 </member>
1930 <member name="M:OpenMetaverse.Utils.BytesToUInt16(System.Byte[],System.Int32)"> 2194 <member name="F:OpenMetaverse.AssetType.MyOutfitsFolder">
1931 <summary> 2195 <summary>Root folder for the folders of type OutfitFolder</summary>
1932 Convert the first two bytes starting at the given position in
1933 little endian ordering to an unsigned short
1934 </summary>
1935 <param name="bytes">Byte array containing the ushort</param>
1936 <param name="pos">Position to start reading the ushort from</param>
1937 <returns>An unsigned short, will be zero if a ushort can't be read
1938 at the given position</returns>
1939 </member> 2196 </member>
1940 <member name="M:OpenMetaverse.Utils.BytesToUInt16(System.Byte[])"> 2197 <member name="F:OpenMetaverse.AssetType.Mesh">
1941 <summary> 2198 <summary>Linden mesh format</summary>
1942 Convert two bytes in little endian ordering to an unsigned short
1943 </summary>
1944 <param name="bytes">Byte array containing the ushort</param>
1945 <returns>An unsigned short, will be zero if a ushort can't be
1946 read</returns>
1947 </member> 2199 </member>
1948 <member name="M:OpenMetaverse.Utils.BytesToUInt(System.Byte[],System.Int32)"> 2200 <member name="F:OpenMetaverse.AssetType.Inbox">
1949 <summary> 2201 <summary>Marketplace direct delivery inbox ("Received Items")</summary>
1950 Convert the first four bytes starting at the given position in
1951 little endian ordering to an unsigned integer
1952 </summary>
1953 <param name="bytes">Byte array containing the uint</param>
1954 <param name="pos">Position to start reading the uint from</param>
1955 <returns>An unsigned integer, will be zero if a uint can't be read
1956 at the given position</returns>
1957 </member> 2202 </member>
1958 <member name="M:OpenMetaverse.Utils.BytesToUInt(System.Byte[])"> 2203 <member name="F:OpenMetaverse.AssetType.Outbox">
1959 <summary> 2204 <summary>Marketplace direct delivery outbox</summary>
1960 Convert the first four bytes of the given array in little endian
1961 ordering to an unsigned integer
1962 </summary>
1963 <param name="bytes">An array four bytes or longer</param>
1964 <returns>An unsigned integer, will be zero if the array contains
1965 less than four bytes</returns>
1966 </member> 2205 </member>
1967 <member name="M:OpenMetaverse.Utils.BytesToUInt64(System.Byte[])"> 2206 <member name="F:OpenMetaverse.AssetType.BasicRoot">
1968 <summary> 2207 <summary></summary>
1969 Convert the first eight bytes of the given array in little endian
1970 ordering to an unsigned 64-bit integer
1971 </summary>
1972 <param name="bytes">An array eight bytes or longer</param>
1973 <returns>An unsigned 64-bit integer, will be zero if the array
1974 contains less than eight bytes</returns>
1975 </member> 2208 </member>
1976 <member name="M:OpenMetaverse.Utils.BytesToFloat(System.Byte[],System.Int32)"> 2209 <member name="T:OpenMetaverse.InventoryType">
1977 <summary> 2210 <summary>
1978 Convert four bytes in little endian ordering to a floating point 2211 Inventory Item Types, eg Script, Notecard, Folder, etc
1979 value
1980 </summary> 2212 </summary>
1981 <param name="bytes">Byte array containing a little ending floating
1982 point value</param>
1983 <param name="pos">Starting position of the floating point value in
1984 the byte array</param>
1985 <returns>Single precision value</returns>
1986 </member> 2213 </member>
1987 <member name="M:OpenMetaverse.Utils.IntToBytes(System.Int32)"> 2214 <member name="F:OpenMetaverse.InventoryType.Unknown">
1988 <summary> 2215 <summary>Unknown</summary>
1989 Convert an integer to a byte array in little endian format
1990 </summary>
1991 <param name="value">The integer to convert</param>
1992 <returns>A four byte little endian array</returns>
1993 </member> 2216 </member>
1994 <member name="M:OpenMetaverse.Utils.IntToBytesBig(System.Int32)"> 2217 <member name="F:OpenMetaverse.InventoryType.Texture">
1995 <summary> 2218 <summary>Texture</summary>
1996 Convert an integer to a byte array in big endian format
1997 </summary>
1998 <param name="value">The integer to convert</param>
1999 <returns>A four byte big endian array</returns>
2000 </member> 2219 </member>
2001 <member name="M:OpenMetaverse.Utils.Int64ToBytes(System.Int64)"> 2220 <member name="F:OpenMetaverse.InventoryType.Sound">
2002 <summary> 2221 <summary>Sound</summary>
2003 Convert a 64-bit integer to a byte array in little endian format
2004 </summary>
2005 <param name="value">The value to convert</param>
2006 <returns>An 8 byte little endian array</returns>
2007 </member> 2222 </member>
2008 <member name="M:OpenMetaverse.Utils.UInt64ToBytes(System.UInt64)"> 2223 <member name="F:OpenMetaverse.InventoryType.CallingCard">
2009 <summary> 2224 <summary>Calling Card</summary>
2010 Convert a 64-bit unsigned integer to a byte array in little endian
2011 format
2012 </summary>
2013 <param name="value">The value to convert</param>
2014 <returns>An 8 byte little endian array</returns>
2015 </member> 2225 </member>
2016 <member name="M:OpenMetaverse.Utils.FloatToBytes(System.Single)"> 2226 <member name="F:OpenMetaverse.InventoryType.Landmark">
2017 <summary> 2227 <summary>Landmark</summary>
2018 Convert a floating point value to four bytes in little endian
2019 ordering
2020 </summary>
2021 <param name="value">A floating point value</param>
2022 <returns>A four byte array containing the value in little endian
2023 ordering</returns>
2024 </member> 2228 </member>
2025 <member name="M:OpenMetaverse.Utils.UIntToHexString(System.UInt32)"> 2229 <member name="F:OpenMetaverse.InventoryType.Notecard">
2026 <summary> 2230 <summary>Notecard</summary>
2027 Converts an unsigned integer to a hexadecimal string
2028 </summary>
2029 <param name="i">An unsigned integer to convert to a string</param>
2030 <returns>A hexadecimal string 10 characters long</returns>
2031 <example>0x7fffffff</example>
2032 </member> 2231 </member>
2033 <member name="M:OpenMetaverse.Utils.BytesToString(System.Byte[])"> 2232 <member name="F:OpenMetaverse.InventoryType.Category">
2034 <summary> 2233 <summary></summary>
2035 Convert a variable length UTF8 byte array to a string
2036 </summary>
2037 <param name="bytes">The UTF8 encoded byte array to convert</param>
2038 <returns>The decoded string</returns>
2039 </member> 2234 </member>
2040 <member name="M:OpenMetaverse.Utils.BytesToHexString(System.Byte[],System.String)"> 2235 <member name="F:OpenMetaverse.InventoryType.Folder">
2041 <summary> 2236 <summary>Folder</summary>
2042 Converts a byte array to a string containing hexadecimal characters
2043 </summary>
2044 <param name="bytes">The byte array to convert to a string</param>
2045 <param name="fieldName">The name of the field to prepend to each
2046 line of the string</param>
2047 <returns>A string containing hexadecimal characters on multiple
2048 lines. Each line is prepended with the field name</returns>
2049 </member> 2237 </member>
2050 <member name="M:OpenMetaverse.Utils.BytesToHexString(System.Byte[],System.Int32,System.String)"> 2238 <member name="F:OpenMetaverse.InventoryType.RootCategory">
2051 <summary> 2239 <summary></summary>
2052 Converts a byte array to a string containing hexadecimal characters
2053 </summary>
2054 <param name="bytes">The byte array to convert to a string</param>
2055 <param name="length">Number of bytes in the array to parse</param>
2056 <param name="fieldName">A string to prepend to each line of the hex
2057 dump</param>
2058 <returns>A string containing hexadecimal characters on multiple
2059 lines. Each line is prepended with the field name</returns>
2060 </member> 2240 </member>
2061 <member name="M:OpenMetaverse.Utils.StringToBytes(System.String)"> 2241 <member name="F:OpenMetaverse.InventoryType.LSL">
2062 <summary> 2242 <summary>an LSL Script</summary>
2063 Convert a string to a UTF8 encoded byte array
2064 </summary>
2065 <param name="str">The string to convert</param>
2066 <returns>A null-terminated UTF8 byte array</returns>
2067 </member> 2243 </member>
2068 <member name="M:OpenMetaverse.Utils.HexStringToBytes(System.String,System.Boolean)"> 2244 <member name="F:OpenMetaverse.InventoryType.Snapshot">
2069 <summary> 2245 <summary></summary>
2070 Converts a string containing hexadecimal characters to a byte array
2071 </summary>
2072 <param name="hexString">String containing hexadecimal characters</param>
2073 <param name="handleDirty">If true, gracefully handles null, empty and
2074 uneven strings as well as stripping unconvertable characters</param>
2075 <returns>The converted byte array</returns>
2076 </member> 2246 </member>
2077 <member name="M:OpenMetaverse.Utils.IsHexDigit(System.Char)"> 2247 <member name="F:OpenMetaverse.InventoryType.Attachment">
2078 <summary> 2248 <summary></summary>
2079 Returns true is c is a hexadecimal digit (A-F, a-f, 0-9)
2080 </summary>
2081 <param name="c">Character to test</param>
2082 <returns>true if hex digit, false if not</returns>
2083 </member> 2249 </member>
2084 <member name="M:OpenMetaverse.Utils.HexToByte(System.String)"> 2250 <member name="F:OpenMetaverse.InventoryType.Wearable">
2085 <summary> 2251 <summary></summary>
2086 Converts 1 or 2 character string into equivalant byte value
2087 </summary>
2088 <param name="hex">1 or 2 character string</param>
2089 <returns>byte</returns>
2090 </member> 2252 </member>
2091 <member name="M:OpenMetaverse.Utils.FloatToByte(System.Single,System.Single,System.Single)"> 2253 <member name="F:OpenMetaverse.InventoryType.Animation">
2092 <summary> 2254 <summary></summary>
2093 Convert a float value to a byte given a minimum and maximum range
2094 </summary>
2095 <param name="val">Value to convert to a byte</param>
2096 <param name="lower">Minimum value range</param>
2097 <param name="upper">Maximum value range</param>
2098 <returns>A single byte representing the original float value</returns>
2099 </member> 2255 </member>
2100 <member name="M:OpenMetaverse.Utils.ByteToFloat(System.Byte[],System.Int32,System.Single,System.Single)"> 2256 <member name="F:OpenMetaverse.InventoryType.Gesture">
2101 <summary> 2257 <summary></summary>
2102 Convert a byte to a float value given a minimum and maximum range
2103 </summary>
2104 <param name="bytes">Byte array to get the byte from</param>
2105 <param name="pos">Position in the byte array the desired byte is at</param>
2106 <param name="lower">Minimum value range</param>
2107 <param name="upper">Maximum value range</param>
2108 <returns>A float value inclusively between lower and upper</returns>
2109 </member> 2258 </member>
2110 <member name="M:OpenMetaverse.Utils.ByteToFloat(System.Byte,System.Single,System.Single)"> 2259 <member name="F:OpenMetaverse.InventoryType.Mesh">
2111 <summary> 2260 <summary></summary>
2112 Convert a byte to a float value given a minimum and maximum range
2113 </summary>
2114 <param name="val">Byte to convert to a float value</param>
2115 <param name="lower">Minimum value range</param>
2116 <param name="upper">Maximum value range</param>
2117 <returns>A float value inclusively between lower and upper</returns>
2118 </member> 2261 </member>
2119 <member name="M:OpenMetaverse.Utils.TryParseSingle(System.String,System.Single@)"> 2262 <member name="T:OpenMetaverse.SaleType">
2120 <summary> 2263 <summary>
2121 Attempts to parse a floating point value from a string, using an 2264 Item Sale Status
2122 EN-US number format
2123 </summary> 2265 </summary>
2124 <param name="s">String to parse</param>
2125 <param name="result">Resulting floating point number</param>
2126 <returns>True if the parse was successful, otherwise false</returns>
2127 </member> 2266 </member>
2128 <member name="M:OpenMetaverse.Utils.TryParseDouble(System.String,System.Double@)"> 2267 <member name="F:OpenMetaverse.SaleType.Not">
2129 <summary> 2268 <summary>Not for sale</summary>
2130 Attempts to parse a floating point value from a string, using an
2131 EN-US number format
2132 </summary>
2133 <param name="s">String to parse</param>
2134 <param name="result">Resulting floating point number</param>
2135 <returns>True if the parse was successful, otherwise false</returns>
2136 </member> 2269 </member>
2137 <member name="M:OpenMetaverse.Utils.TryParseHex(System.String,System.UInt32@)"> 2270 <member name="F:OpenMetaverse.SaleType.Original">
2138 <summary> 2271 <summary>The original is for sale</summary>
2139 Tries to parse an unsigned 32-bit integer from a hexadecimal string
2140 </summary>
2141 <param name="s">String to parse</param>
2142 <param name="result">Resulting integer</param>
2143 <returns>True if the parse was successful, otherwise false</returns>
2144 </member> 2272 </member>
2145 <member name="M:OpenMetaverse.Utils.EnumToText(System.Enum)"> 2273 <member name="F:OpenMetaverse.SaleType.Copy">
2146 <summary> 2274 <summary>Copies are for sale</summary>
2147 Returns text specified in EnumInfo attribute of the enumerator
2148 To add the text use [EnumInfo(Text = "Some nice text here")] before declaration
2149 of enum values
2150 </summary>
2151 <param name="value">Enum value</param>
2152 <returns>Text representation of the enum</returns>
2153 </member> 2275 </member>
2154 <member name="M:OpenMetaverse.Utils.AssetTypeToString(OpenMetaverse.AssetType)"> 2276 <member name="F:OpenMetaverse.SaleType.Contents">
2155 <summary> 2277 <summary>The contents of the object are for sale</summary>
2156 Takes an AssetType and returns the string representation
2157 </summary>
2158 <param name="type">The source <seealso cref="T:OpenMetaverse.AssetType" /></param>
2159 <returns>The string version of the AssetType</returns>
2160 </member> 2278 </member>
2161 <member name="M:OpenMetaverse.Utils.StringToAssetType(System.String)"> 2279 <member name="T:OpenMetaverse.WearableType">
2162 <summary> 2280 <summary>
2163 Translate a string name of an AssetType into the proper Type 2281 Types of wearable assets
2164 </summary> 2282 </summary>
2165 <param name="type">A string containing the AssetType name</param>
2166 <returns>The AssetType which matches the string name, or AssetType.Unknown if no match was found</returns>
2167 </member> 2283 </member>
2168 <member name="M:OpenMetaverse.Utils.InventoryTypeToString(OpenMetaverse.InventoryType)"> 2284 <member name="F:OpenMetaverse.WearableType.Shape">
2169 <summary> 2285 <summary>Body shape</summary>
2170 Convert an InventoryType to a string
2171 </summary>
2172 <param name="type">The <seealso cref="T:InventoryType" /> to convert</param>
2173 <returns>A string representation of the source</returns>
2174 </member> 2286 </member>
2175 <member name="M:OpenMetaverse.Utils.StringToInventoryType(System.String)"> 2287 <member name="F:OpenMetaverse.WearableType.Skin">
2176 <summary> 2288 <summary>Skin textures and attributes</summary>
2177 Convert a string into a valid InventoryType
2178 </summary>
2179 <param name="type">A string representation of the InventoryType to convert</param>
2180 <returns>A InventoryType object which matched the type</returns>
2181 </member> 2289 </member>
2182 <member name="M:OpenMetaverse.Utils.SaleTypeToString(OpenMetaverse.SaleType)"> 2290 <member name="F:OpenMetaverse.WearableType.Hair">
2183 <summary> 2291 <summary>Hair</summary>
2184 Convert a SaleType to a string
2185 </summary>
2186 <param name="type">The <seealso cref="T:SaleType" /> to convert</param>
2187 <returns>A string representation of the source</returns>
2188 </member> 2292 </member>
2189 <member name="M:OpenMetaverse.Utils.StringToSaleType(System.String)"> 2293 <member name="F:OpenMetaverse.WearableType.Eyes">
2190 <summary> 2294 <summary>Eyes</summary>
2191 Convert a string into a valid SaleType
2192 </summary>
2193 <param name="value">A string representation of the SaleType to convert</param>
2194 <returns>A SaleType object which matched the type</returns>
2195 </member> 2295 </member>
2196 <member name="M:OpenMetaverse.Utils.StringToAttachmentPoint(System.String)"> 2296 <member name="F:OpenMetaverse.WearableType.Shirt">
2197 <summary> 2297 <summary>Shirt</summary>
2198 Converts a string used in LLSD to AttachmentPoint type
2199 </summary>
2200 <param name="value">String representation of AttachmentPoint to convert</param>
2201 <returns>AttachmentPoint enum</returns>
2202 </member> 2298 </member>
2203 <member name="M:OpenMetaverse.Utils.CopyBytes(System.Byte[])"> 2299 <member name="F:OpenMetaverse.WearableType.Pants">
2204 <summary> 2300 <summary>Pants</summary>
2205 Copy a byte array
2206 </summary>
2207 <param name="bytes">Byte array to copy</param>
2208 <returns>A copy of the given byte array</returns>
2209 </member> 2301 </member>
2210 <member name="M:OpenMetaverse.Utils.UIntsToLong(System.UInt32,System.UInt32)"> 2302 <member name="F:OpenMetaverse.WearableType.Shoes">
2211 <summary> 2303 <summary>Shoes</summary>
2212 Packs to 32-bit unsigned integers in to a 64-bit unsigned integer
2213 </summary>
2214 <param name="a">The left-hand (or X) value</param>
2215 <param name="b">The right-hand (or Y) value</param>
2216 <returns>A 64-bit integer containing the two 32-bit input values</returns>
2217 </member> 2304 </member>
2218 <member name="M:OpenMetaverse.Utils.LongToUInts(System.UInt64,System.UInt32@,System.UInt32@)"> 2305 <member name="F:OpenMetaverse.WearableType.Socks">
2219 <summary> 2306 <summary>Socks</summary>
2220 Unpacks two 32-bit unsigned integers from a 64-bit unsigned integer
2221 </summary>
2222 <param name="a">The 64-bit input integer</param>
2223 <param name="b">The left-hand (or X) output value</param>
2224 <param name="c">The right-hand (or Y) output value</param>
2225 </member> 2307 </member>
2226 <member name="M:OpenMetaverse.Utils.IPToUInt(System.Net.IPAddress)"> 2308 <member name="F:OpenMetaverse.WearableType.Jacket">
2227 <summary> 2309 <summary>Jacket</summary>
2228 Convert an IP address object to an unsigned 32-bit integer
2229 </summary>
2230 <param name="address">IP address to convert</param>
2231 <returns>32-bit unsigned integer holding the IP address bits</returns>
2232 </member> 2310 </member>
2233 <member name="M:OpenMetaverse.Utils.GetUnixTime"> 2311 <member name="F:OpenMetaverse.WearableType.Gloves">
2234 <summary> 2312 <summary>Gloves</summary>
2235 Gets a unix timestamp for the current time
2236 </summary>
2237 <returns>An unsigned integer representing a unix timestamp for now</returns>
2238 </member> 2313 </member>
2239 <member name="M:OpenMetaverse.Utils.UnixTimeToDateTime(System.UInt32)"> 2314 <member name="F:OpenMetaverse.WearableType.Undershirt">
2240 <summary> 2315 <summary>Undershirt</summary>
2241 Convert a UNIX timestamp to a native DateTime object
2242 </summary>
2243 <param name="timestamp">An unsigned integer representing a UNIX
2244 timestamp</param>
2245 <returns>A DateTime object containing the same time specified in
2246 the given timestamp</returns>
2247 </member> 2316 </member>
2248 <member name="M:OpenMetaverse.Utils.UnixTimeToDateTime(System.Int32)"> 2317 <member name="F:OpenMetaverse.WearableType.Underpants">
2249 <summary> 2318 <summary>Underpants</summary>
2250 Convert a UNIX timestamp to a native DateTime object
2251 </summary>
2252 <param name="timestamp">A signed integer representing a UNIX
2253 timestamp</param>
2254 <returns>A DateTime object containing the same time specified in
2255 the given timestamp</returns>
2256 </member> 2319 </member>
2257 <member name="M:OpenMetaverse.Utils.DateTimeToUnixTime(System.DateTime)"> 2320 <member name="F:OpenMetaverse.WearableType.Skirt">
2258 <summary> 2321 <summary>Skirt</summary>
2259 Convert a native DateTime object to a UNIX timestamp
2260 </summary>
2261 <param name="time">A DateTime object you want to convert to a
2262 timestamp</param>
2263 <returns>An unsigned integer representing a UNIX timestamp</returns>
2264 </member> 2322 </member>
2265 <member name="M:OpenMetaverse.Utils.Swap``1(``0@,``0@)"> 2323 <member name="F:OpenMetaverse.WearableType.Alpha">
2266 <summary> 2324 <summary>Alpha mask to hide parts of the avatar</summary>
2267 Swap two values
2268 </summary>
2269 <typeparam name="T">Type of the values to swap</typeparam>
2270 <param name="lhs">First value</param>
2271 <param name="rhs">Second value</param>
2272 </member> 2325 </member>
2273 <member name="M:OpenMetaverse.Utils.EnumTryParse``1(System.String,``0@)"> 2326 <member name="F:OpenMetaverse.WearableType.Tattoo">
2274 <summary> 2327 <summary>Tattoo</summary>
2275 Try to parse an enumeration value from a string
2276 </summary>
2277 <typeparam name="T">Enumeration type</typeparam>
2278 <param name="strType">String value to parse</param>
2279 <param name="result">Enumeration value on success</param>
2280 <returns>True if the parsing succeeded, otherwise false</returns>
2281 </member> 2328 </member>
2282 <member name="M:OpenMetaverse.Utils.SwapWords(System.Byte)"> 2329 <member name="F:OpenMetaverse.WearableType.Physics">
2283 <summary> 2330 <summary>Physics</summary>
2284 Swaps the high and low words in a byte. Converts aaaabbbb to bbbbaaaa
2285 </summary>
2286 <param name="value">Byte to swap the words in</param>
2287 <returns>Byte value with the words swapped</returns>
2288 </member> 2331 </member>
2289 <member name="M:OpenMetaverse.Utils.HostnameToIPv4(System.String)"> 2332 <member name="F:OpenMetaverse.WearableType.Invalid">
2290 <summary> 2333 <summary>Invalid wearable asset</summary>
2291 Attempts to convert a string representation of a hostname or IP
2292 address to a <seealso cref="T:System.Net.IPAddress" /></summary>
2293 <param name="hostname">Hostname to convert to an IPAddress</param>
2294 <returns>Converted IP address object, or null if the conversion
2295 failed</returns>
2296 </member> 2334 </member>
2297 <member name="T:OpenMetaverse.Vector2"> 2335 <member name="T:OpenMetaverse.LocklessQueue`1">
2298 <summary> 2336 <summary>
2299 A two-dimensional vector with floating-point values 2337 A thread-safe lockless queue that supports multiple readers and
2338 multiple writers
2300 </summary> 2339 </summary>
2301 </member> 2340 </member>
2302 <member name="F:OpenMetaverse.Vector2.X"> 2341 <member name="F:OpenMetaverse.LocklessQueue`1.head">
2303 <summary>X value</summary> 2342 <summary>Queue head</summary>
2304 </member>
2305 <member name="F:OpenMetaverse.Vector2.Y">
2306 <summary>Y value</summary>
2307 </member>
2308 <member name="F:OpenMetaverse.Vector2.Zero">
2309 <summary>A vector with a value of 0,0</summary>
2310 </member>
2311 <member name="F:OpenMetaverse.Vector2.One">
2312 <summary>A vector with a value of 1,1</summary>
2313 </member> 2343 </member>
2314 <member name="F:OpenMetaverse.Vector2.UnitX"> 2344 <member name="F:OpenMetaverse.LocklessQueue`1.tail">
2315 <summary>A vector with a value of 1,0</summary> 2345 <summary>Queue tail</summary>
2316 </member> 2346 </member>
2317 <member name="F:OpenMetaverse.Vector2.UnitY"> 2347 <member name="F:OpenMetaverse.LocklessQueue`1.count">
2318 <summary>A vector with a value of 0,1</summary> 2348 <summary>Queue item count</summary>
2319 </member> 2349 </member>
2320 <member name="M:OpenMetaverse.Vector2.ApproxEquals(OpenMetaverse.Vector2,System.Single)"> 2350 <member name="M:OpenMetaverse.LocklessQueue`1.#ctor">
2321 <summary> 2351 <summary>
2322 Test if this vector is equal to another vector, within a given 2352 Constructor
2323 tolerance range
2324 </summary> 2353 </summary>
2325 <param name="vec">Vector to test against</param>
2326 <param name="tolerance">The acceptable magnitude of difference
2327 between the two vectors</param>
2328 <returns>True if the magnitude of difference between the two vectors
2329 is less than the given tolerance, otherwise false</returns>
2330 </member> 2354 </member>
2331 <member name="M:OpenMetaverse.Vector2.IsFinite"> 2355 <member name="M:OpenMetaverse.LocklessQueue`1.Enqueue(`0)">
2332 <summary> 2356 <summary>
2333 Test if this vector is composed of all finite numbers 2357 Enqueue an item
2334 </summary> 2358 </summary>
2359 <param name="item">Item to enqeue</param>
2335 </member> 2360 </member>
2336 <member name="M:OpenMetaverse.Vector2.CompareTo(OpenMetaverse.Vector2)"> 2361 <member name="M:OpenMetaverse.LocklessQueue`1.TryDequeue(`0@)">
2337 <summary> 2362 <summary>
2338 IComparable.CompareTo implementation 2363 Try to dequeue an item
2339 </summary> 2364 </summary>
2365 <param name="item">Dequeued item if the dequeue was successful</param>
2366 <returns>True if an item was successfully deqeued, otherwise false</returns>
2340 </member> 2367 </member>
2341 <member name="M:OpenMetaverse.Vector2.FromBytes(System.Byte[],System.Int32)"> 2368 <member name="P:OpenMetaverse.LocklessQueue`1.Count">
2342 <summary> 2369 <summary>Gets the current number of items in the queue. Since this
2343 Builds a vector from a byte array 2370 is a lockless collection this value should be treated as a close
2344 </summary> 2371 estimate</summary>
2345 <param name="byteArray">Byte array containing two four-byte floats</param>
2346 <param name="pos">Beginning position in the byte array</param>
2347 </member> 2372 </member>
2348 <member name="M:OpenMetaverse.Vector2.GetBytes"> 2373 <member name="T:OpenMetaverse.LocklessQueue`1.SingleLinkNode">
2349 <summary> 2374 <summary>
2350 Returns the raw bytes for this vector 2375 Provides a node container for data in a singly linked list
2351 </summary> 2376 </summary>
2352 <returns>An eight-byte array containing X and Y</returns>
2353 </member> 2377 </member>
2354 <member name="M:OpenMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)"> 2378 <member name="F:OpenMetaverse.LocklessQueue`1.SingleLinkNode.Next">
2355 <summary> 2379 <summary>Pointer to the next node in list</summary>
2356 Writes the raw bytes for this vector to a byte array
2357 </summary>
2358 <param name="dest">Destination byte array</param>
2359 <param name="pos">Position in the destination array to start
2360 writing. Must be at least 8 bytes before the end of the array</param>
2361 </member> 2380 </member>
2362 <member name="M:OpenMetaverse.Vector2.Parse(System.String)"> 2381 <member name="F:OpenMetaverse.LocklessQueue`1.SingleLinkNode.Item">
2382 <summary>The data contained by the node</summary>
2383 </member>
2384 <member name="M:OpenMetaverse.LocklessQueue`1.SingleLinkNode.#ctor">
2363 <summary> 2385 <summary>
2364 Parse a vector from a string 2386 Constructor
2365 </summary> 2387 </summary>
2366 <param name="val">A string representation of a 2D vector, enclosed
2367 in arrow brackets and separated by commas</param>
2368 </member> 2388 </member>
2369 <member name="M:OpenMetaverse.Vector2.SmoothStep(OpenMetaverse.Vector2,OpenMetaverse.Vector2,System.Single)"> 2389 <member name="M:OpenMetaverse.LocklessQueue`1.SingleLinkNode.#ctor(`0)">
2370 <summary> 2390 <summary>
2371 Interpolates between two vectors using a cubic equation 2391 Constructor
2372 </summary> 2392 </summary>
2373 </member> 2393 </member>
2374 <member name="M:OpenMetaverse.Vector2.ToString"> 2394 <member name="T:OpenMetaverse.UUID">
2375 <summary> 2395 <summary>
2376 Get a formatted string representation of the vector 2396 A 128-bit Universally Unique Identifier, used throughout the Second
2397 Life networking protocol
2377 </summary> 2398 </summary>
2378 <returns>A string representation of the vector</returns>
2379 </member> 2399 </member>
2380 <member name="M:OpenMetaverse.Vector2.ToRawString"> 2400 <member name="F:OpenMetaverse.UUID.Guid">
2401 <summary>The System.Guid object this struct wraps around</summary>
2402 </member>
2403 <member name="M:OpenMetaverse.UUID.#ctor(System.String)">
2381 <summary> 2404 <summary>
2382 Get a string representation of the vector elements with up to three 2405 Constructor that takes a string UUID representation
2383 decimal digits and separated by spaces only
2384 </summary> 2406 </summary>
2385 <returns>Raw string representation of the vector</returns> 2407 <param name="val">A string representation of a UUID, case
2408 insensitive and can either be hyphenated or non-hyphenated</param>
2409 <example>UUID("11f8aa9c-b071-4242-836b-13b7abe0d489")</example>
2386 </member> 2410 </member>
2387 <member name="T:OpenMetaverse.Vector3"> 2411 <member name="M:OpenMetaverse.UUID.#ctor(System.Guid)">
2388 <summary> 2412 <summary>
2389 A three-dimensional vector with floating-point values 2413 Constructor that takes a System.Guid object
2390 </summary> 2414 </summary>
2415 <param name="val">A Guid object that contains the unique identifier
2416 to be represented by this UUID</param>
2391 </member> 2417 </member>
2392 <member name="M:OpenMetaverse.Vector3.#ctor(System.Byte[],System.Int32)"> 2418 <member name="M:OpenMetaverse.UUID.#ctor(System.Byte[],System.Int32)">
2393 <summary> 2419 <summary>
2394 Constructor, builds a vector from a byte array 2420 Constructor that takes a byte array containing a UUID
2395 </summary> 2421 </summary>
2396 <param name="byteArray">Byte array containing three four-byte floats</param> 2422 <param name="source">Byte array containing a 16 byte UUID</param>
2397 <param name="pos">Beginning position in the byte array</param> 2423 <param name="pos">Beginning offset in the array</param>
2398 </member>
2399 <member name="F:OpenMetaverse.Vector3.X">
2400 <summary>X value</summary>
2401 </member>
2402 <member name="F:OpenMetaverse.Vector3.Y">
2403 <summary>Y value</summary>
2404 </member>
2405 <member name="F:OpenMetaverse.Vector3.Z">
2406 <summary>Z value</summary>
2407 </member>
2408 <member name="F:OpenMetaverse.Vector3.Zero">
2409 <summary>A vector with a value of 0,0,0</summary>
2410 </member>
2411 <member name="F:OpenMetaverse.Vector3.One">
2412 <summary>A vector with a value of 1,1,1</summary>
2413 </member>
2414 <member name="F:OpenMetaverse.Vector3.UnitX">
2415 <summary>A unit vector facing forward (X axis), value 1,0,0</summary>
2416 </member>
2417 <member name="F:OpenMetaverse.Vector3.UnitY">
2418 <summary>A unit vector facing left (Y axis), value 0,1,0</summary>
2419 </member>
2420 <member name="F:OpenMetaverse.Vector3.UnitZ">
2421 <summary>A unit vector facing up (Z axis), value 0,0,1</summary>
2422 </member> 2424 </member>
2423 <member name="M:OpenMetaverse.Vector3.ApproxEquals(OpenMetaverse.Vector3,System.Single)"> 2425 <member name="M:OpenMetaverse.UUID.#ctor(System.UInt64)">
2424 <summary> 2426 <summary>
2425 Test if this vector is equal to another vector, within a given 2427 Constructor that takes an unsigned 64-bit unsigned integer to
2426 tolerance range 2428 convert to a UUID
2427 </summary> 2429 </summary>
2428 <param name="vec">Vector to test against</param> 2430 <param name="val">64-bit unsigned integer to convert to a UUID</param>
2429 <param name="tolerance">The acceptable magnitude of difference
2430 between the two vectors</param>
2431 <returns>True if the magnitude of difference between the two vectors
2432 is less than the given tolerance, otherwise false</returns>
2433 </member> 2431 </member>
2434 <member name="M:OpenMetaverse.Vector3.CompareTo(OpenMetaverse.Vector3)"> 2432 <member name="M:OpenMetaverse.UUID.#ctor(OpenMetaverse.UUID)">
2435 <summary> 2433 <summary>
2436 IComparable.CompareTo implementation 2434 Copy constructor
2437 </summary> 2435 </summary>
2436 <param name="val">UUID to copy</param>
2438 </member> 2437 </member>
2439 <member name="M:OpenMetaverse.Vector3.IsFinite"> 2438 <member name="M:OpenMetaverse.UUID.CompareTo(OpenMetaverse.UUID)">
2440 <summary> 2439 <summary>
2441 Test if this vector is composed of all finite numbers 2440 IComparable.CompareTo implementation
2442 </summary> 2441 </summary>
2443 </member> 2442 </member>
2444 <member name="M:OpenMetaverse.Vector3.FromBytes(System.Byte[],System.Int32)"> 2443 <member name="M:OpenMetaverse.UUID.FromBytes(System.Byte[],System.Int32)">
2445 <summary> 2444 <summary>
2446 Builds a vector from a byte array 2445 Assigns this UUID from 16 bytes out of a byte array
2447 </summary> 2446 </summary>
2448 <param name="byteArray">Byte array containing a 12 byte vector</param> 2447 <param name="source">Byte array containing the UUID to assign this UUID to</param>
2449 <param name="pos">Beginning position in the byte array</param> 2448 <param name="pos">Starting position of the UUID in the byte array</param>
2450 </member> 2449 </member>
2451 <member name="M:OpenMetaverse.Vector3.GetBytes"> 2450 <member name="M:OpenMetaverse.UUID.GetBytes">
2452 <summary> 2451 <summary>
2453 Returns the raw bytes for this vector 2452 Returns a copy of the raw bytes for this UUID
2454 </summary> 2453 </summary>
2455 <returns>A 12 byte array containing X, Y, and Z</returns> 2454 <returns>A 16 byte array containing this UUID</returns>
2456 </member> 2455 </member>
2457 <member name="M:OpenMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)"> 2456 <member name="M:OpenMetaverse.UUID.ToBytes(System.Byte[],System.Int32)">
2458 <summary> 2457 <summary>
2459 Writes the raw bytes for this vector to a byte array 2458 Writes the raw bytes for this UUID to a byte array
2460 </summary> 2459 </summary>
2461 <param name="dest">Destination byte array</param> 2460 <param name="dest">Destination byte array</param>
2462 <param name="pos">Position in the destination array to start 2461 <param name="pos">Position in the destination array to start
2463 writing. Must be at least 12 bytes before the end of the array</param> 2462 writing. Must be at least 16 bytes before the end of the array</param>
2464 </member> 2463 </member>
2465 <member name="M:OpenMetaverse.Vector3.Parse(System.String)"> 2464 <member name="M:OpenMetaverse.UUID.CRC">
2466 <summary> 2465 <summary>
2467 Parse a vector from a string 2466 Calculate an LLCRC (cyclic redundancy check) for this UUID
2468 </summary> 2467 </summary>
2469 <param name="val">A string representation of a 3D vector, enclosed 2468 <returns>The CRC checksum for this UUID</returns>
2470 in arrow brackets and separated by commas</param>
2471 </member> 2469 </member>
2472 <member name="M:OpenMetaverse.Vector3.RotationBetween(OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 2470 <member name="M:OpenMetaverse.UUID.GetULong">
2473 <summary> 2471 <summary>
2474 Calculate the rotation between two vectors 2472 Create a 64-bit integer representation from the second half of this UUID
2475 </summary> 2473 </summary>
2476 <param name="a">Normalized directional vector (such as 1,0,0 for forward facing)</param> 2474 <returns>An integer created from the last eight bytes of this UUID</returns>
2477 <param name="b">Normalized target vector</param>
2478 </member> 2475 </member>
2479 <member name="M:OpenMetaverse.Vector3.SmoothStep(OpenMetaverse.Vector3,OpenMetaverse.Vector3,System.Single)"> 2476 <member name="M:OpenMetaverse.UUID.Parse(System.String)">
2480 <summary> 2477 <summary>
2481 Interpolates between two vectors using a cubic equation 2478 Generate a UUID from a string
2482 </summary> 2479 </summary>
2480 <param name="val">A string representation of a UUID, case
2481 insensitive and can either be hyphenated or non-hyphenated</param>
2482 <example>UUID.Parse("11f8aa9c-b071-4242-836b-13b7abe0d489")</example>
2483 </member> 2483 </member>
2484 <member name="M:OpenMetaverse.Vector3.ToString"> 2484 <member name="M:OpenMetaverse.UUID.TryParse(System.String,OpenMetaverse.UUID@)">
2485 <summary> 2485 <summary>
2486 Get a formatted string representation of the vector 2486 Generate a UUID from a string
2487 </summary> 2487 </summary>
2488 <returns>A string representation of the vector</returns> 2488 <param name="val">A string representation of a UUID, case
2489 insensitive and can either be hyphenated or non-hyphenated</param>
2490 <param name="result">Will contain the parsed UUID if successful,
2491 otherwise null</param>
2492 <returns>True if the string was successfully parse, otherwise false</returns>
2493 <example>UUID.TryParse("11f8aa9c-b071-4242-836b-13b7abe0d489", result)</example>
2489 </member> 2494 </member>
2490 <member name="M:OpenMetaverse.Vector3.ToRawString"> 2495 <member name="M:OpenMetaverse.UUID.Combine(OpenMetaverse.UUID,OpenMetaverse.UUID)">
2491 <summary> 2496 <summary>
2492 Get a string representation of the vector elements with up to three 2497 Combine two UUIDs together by taking the MD5 hash of a byte array
2493 decimal digits and separated by spaces only 2498 containing both UUIDs
2494 </summary> 2499 </summary>
2495 <returns>Raw string representation of the vector</returns> 2500 <param name="first">First UUID to combine</param>
2501 <param name="second">Second UUID to combine</param>
2502 <returns>The UUID product of the combination</returns>
2496 </member> 2503 </member>
2497 <member name="M:OpenMetaverse.Vector3.op_Modulus(OpenMetaverse.Vector3,OpenMetaverse.Vector3)"> 2504 <member name="M:OpenMetaverse.UUID.Random">
2498 <summary> 2505 <summary>
2499 Cross product between two vectors 2506
2500 </summary> 2507 </summary>
2508 <returns></returns>
2501 </member> 2509 </member>
2502 <member name="T:OpenMetaverse.Vector3d"> 2510 <member name="M:OpenMetaverse.UUID.GetHashCode">
2503 <summary> 2511 <summary>
2504 A three-dimensional vector with doubleing-point values 2512 Return a hash code for this UUID, used by .NET for hash tables
2505 </summary> 2513 </summary>
2514 <returns>An integer composed of all the UUID bytes XORed together</returns>
2506 </member> 2515 </member>
2507 <member name="M:OpenMetaverse.Vector3d.#ctor(System.Byte[],System.Int32)"> 2516 <member name="M:OpenMetaverse.UUID.Equals(System.Object)">
2508 <summary> 2517 <summary>
2509 Constructor, builds a vector from a byte array 2518 Comparison function
2510 </summary> 2519 </summary>
2511 <param name="byteArray">Byte array containing three eight-byte doubles</param> 2520 <param name="o">An object to compare to this UUID</param>
2512 <param name="pos">Beginning position in the byte array</param> 2521 <returns>True if the object is a UUID and both UUIDs are equal</returns>
2513 </member>
2514 <member name="F:OpenMetaverse.Vector3d.X">
2515 <summary>X value</summary>
2516 </member>
2517 <member name="F:OpenMetaverse.Vector3d.Y">
2518 <summary>Y value</summary>
2519 </member>
2520 <member name="F:OpenMetaverse.Vector3d.Z">
2521 <summary>Z value</summary>
2522 </member>
2523 <member name="F:OpenMetaverse.Vector3d.Zero">
2524 <summary>A vector with a value of 0,0,0</summary>
2525 </member>
2526 <member name="F:OpenMetaverse.Vector3d.One">
2527 <summary>A vector with a value of 1,1,1</summary>
2528 </member>
2529 <member name="F:OpenMetaverse.Vector3d.UnitX">
2530 <summary>A unit vector facing forward (X axis), value of 1,0,0</summary>
2531 </member>
2532 <member name="F:OpenMetaverse.Vector3d.UnitY">
2533 <summary>A unit vector facing left (Y axis), value of 0,1,0</summary>
2534 </member>
2535 <member name="F:OpenMetaverse.Vector3d.UnitZ">
2536 <summary>A unit vector facing up (Z axis), value of 0,0,1</summary>
2537 </member> 2522 </member>
2538 <member name="M:OpenMetaverse.Vector3d.ApproxEquals(OpenMetaverse.Vector3d,System.Double)"> 2523 <member name="M:OpenMetaverse.UUID.Equals(OpenMetaverse.UUID)">
2539 <summary> 2524 <summary>
2540 Test if this vector is equal to another vector, within a given 2525 Comparison function
2541 tolerance range
2542 </summary> 2526 </summary>
2543 <param name="vec">Vector to test against</param> 2527 <param name="uuid">UUID to compare to</param>
2544 <param name="tolerance">The acceptable magnitude of difference 2528 <returns>True if the UUIDs are equal, otherwise false</returns>
2545 between the two vectors</param>
2546 <returns>True if the magnitude of difference between the two vectors
2547 is less than the given tolerance, otherwise false</returns>
2548 </member> 2529 </member>
2549 <member name="M:OpenMetaverse.Vector3d.CompareTo(OpenMetaverse.Vector3d)"> 2530 <member name="M:OpenMetaverse.UUID.ToString">
2550 <summary> 2531 <summary>
2551 IComparable.CompareTo implementation 2532 Get a hyphenated string representation of this UUID
2552 </summary> 2533 </summary>
2534 <returns>A string representation of this UUID, lowercase and
2535 with hyphens</returns>
2536 <example>11f8aa9c-b071-4242-836b-13b7abe0d489</example>
2553 </member> 2537 </member>
2554 <member name="M:OpenMetaverse.Vector3d.IsFinite"> 2538 <member name="M:OpenMetaverse.UUID.op_Equality(OpenMetaverse.UUID,OpenMetaverse.UUID)">
2555 <summary> 2539 <summary>
2556 Test if this vector is composed of all finite numbers 2540 Equals operator
2557 </summary> 2541 </summary>
2542 <param name="lhs">First UUID for comparison</param>
2543 <param name="rhs">Second UUID for comparison</param>
2544 <returns>True if the UUIDs are byte for byte equal, otherwise false</returns>
2558 </member> 2545 </member>
2559 <member name="M:OpenMetaverse.Vector3d.FromBytes(System.Byte[],System.Int32)"> 2546 <member name="M:OpenMetaverse.UUID.op_Inequality(OpenMetaverse.UUID,OpenMetaverse.UUID)">
2560 <summary> 2547 <summary>
2561 Builds a vector from a byte array 2548 Not equals operator
2562 </summary> 2549 </summary>
2563 <param name="byteArray">Byte array containing a 24 byte vector</param> 2550 <param name="lhs">First UUID for comparison</param>
2564 <param name="pos">Beginning position in the byte array</param> 2551 <param name="rhs">Second UUID for comparison</param>
2552 <returns>True if the UUIDs are not equal, otherwise true</returns>
2565 </member> 2553 </member>
2566 <member name="M:OpenMetaverse.Vector3d.GetBytes"> 2554 <member name="M:OpenMetaverse.UUID.op_ExclusiveOr(OpenMetaverse.UUID,OpenMetaverse.UUID)">
2567 <summary> 2555 <summary>
2568 Returns the raw bytes for this vector 2556 XOR operator
2569 </summary> 2557 </summary>
2570 <returns>A 24 byte array containing X, Y, and Z</returns> 2558 <param name="lhs">First UUID</param>
2559 <param name="rhs">Second UUID</param>
2560 <returns>A UUID that is a XOR combination of the two input UUIDs</returns>
2571 </member> 2561 </member>
2572 <member name="M:OpenMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)"> 2562 <member name="M:OpenMetaverse.UUID.op_Explicit(System.String)~OpenMetaverse.UUID">
2573 <summary> 2563 <summary>
2574 Writes the raw bytes for this vector to a byte array 2564 String typecasting operator
2575 </summary> 2565 </summary>
2576 <param name="dest">Destination byte array</param> 2566 <param name="val">A UUID in string form. Case insensitive,
2577 <param name="pos">Position in the destination array to start 2567 hyphenated or non-hyphenated</param>
2578 writing. Must be at least 24 bytes before the end of the array</param> 2568 <returns>A UUID built from the string representation</returns>
2579 </member> 2569 </member>
2580 <member name="M:OpenMetaverse.Vector3d.Parse(System.String)"> 2570 <member name="F:OpenMetaverse.UUID.Zero">
2581 <summary> 2571 <summary>An UUID with a value of all zeroes</summary>
2582 Parse a vector from a string
2583 </summary>
2584 <param name="val">A string representation of a 3D vector, enclosed
2585 in arrow brackets and separated by commas</param>
2586 </member> 2572 </member>
2587 <member name="M:OpenMetaverse.Vector3d.SmoothStep(OpenMetaverse.Vector3d,OpenMetaverse.Vector3d,System.Double)"> 2573 <member name="F:OpenMetaverse.UUID.ZeroString">
2588 <summary> 2574 <summary>A cache of UUID.Zero as a string to optimize a common path</summary>
2589 Interpolates between two vectors using a cubic equation
2590 </summary>
2591 </member> 2575 </member>
2592 <member name="M:OpenMetaverse.Vector3d.ToString"> 2576 <member name="T:OpenMetaverse.Parallel">
2593 <summary> 2577 <summary>
2594 Get a formatted string representation of the vector 2578 Provides helper methods for parallelizing loops
2595 </summary> 2579 </summary>
2596 <returns>A string representation of the vector</returns>
2597 </member> 2580 </member>
2598 <member name="M:OpenMetaverse.Vector3d.ToRawString"> 2581 <member name="M:OpenMetaverse.Parallel.For(System.Int32,System.Int32,System.Action{System.Int32})">
2599 <summary> 2582 <summary>
2600 Get a string representation of the vector elements with up to three 2583 Executes a for loop in which iterations may run in parallel
2601 decimal digits and separated by spaces only
2602 </summary> 2584 </summary>
2603 <returns>Raw string representation of the vector</returns> 2585 <param name="fromInclusive">The loop will be started at this index</param>
2586 <param name="toExclusive">The loop will be terminated before this index is reached</param>
2587 <param name="body">Method body to run for each iteration of the loop</param>
2604 </member> 2588 </member>
2605 <member name="M:OpenMetaverse.Vector3d.op_Modulus(OpenMetaverse.Vector3d,OpenMetaverse.Vector3d)"> 2589 <member name="M:OpenMetaverse.Parallel.For(System.Int32,System.Int32,System.Int32,System.Action{System.Int32})">
2606 <summary> 2590 <summary>
2607 Cross product between two vectors 2591 Executes a for loop in which iterations may run in parallel
2608 </summary> 2592 </summary>
2593 <param name="threadCount">The number of concurrent execution threads to run</param>
2594 <param name="fromInclusive">The loop will be started at this index</param>
2595 <param name="toExclusive">The loop will be terminated before this index is reached</param>
2596 <param name="body">Method body to run for each iteration of the loop</param>
2609 </member> 2597 </member>
2610 <member name="M:OpenMetaverse.Vector4.#ctor(System.Byte[],System.Int32)"> 2598 <member name="M:OpenMetaverse.Parallel.ForEach``1(System.Collections.Generic.IEnumerable{``0},System.Action{``0})">
2611 <summary> 2599 <summary>
2612 Constructor, builds a vector from a byte array 2600 Executes a foreach loop in which iterations may run in parallel
2613 </summary> 2601 </summary>
2614 <param name="byteArray">Byte array containing four four-byte floats</param> 2602 <typeparam name="T">Object type that the collection wraps</typeparam>
2615 <param name="pos">Beginning position in the byte array</param> 2603 <param name="enumerable">An enumerable collection to iterate over</param>
2616 </member> 2604 <param name="body">Method body to run for each object in the collection</param>
2617 <member name="F:OpenMetaverse.Vector4.X">
2618 <summary>X value</summary>
2619 </member>
2620 <member name="F:OpenMetaverse.Vector4.Y">
2621 <summary>Y value</summary>
2622 </member>
2623 <member name="F:OpenMetaverse.Vector4.Z">
2624 <summary>Z value</summary>
2625 </member>
2626 <member name="F:OpenMetaverse.Vector4.W">
2627 <summary>W value</summary>
2628 </member>
2629 <member name="F:OpenMetaverse.Vector4.Zero">
2630 <summary>A vector with a value of 0,0,0,0</summary>
2631 </member>
2632 <member name="F:OpenMetaverse.Vector4.One">
2633 <summary>A vector with a value of 1,1,1,1</summary>
2634 </member>
2635 <member name="F:OpenMetaverse.Vector4.UnitX">
2636 <summary>A vector with a value of 1,0,0,0</summary>
2637 </member>
2638 <member name="F:OpenMetaverse.Vector4.UnitY">
2639 <summary>A vector with a value of 0,1,0,0</summary>
2640 </member>
2641 <member name="F:OpenMetaverse.Vector4.UnitZ">
2642 <summary>A vector with a value of 0,0,1,0</summary>
2643 </member>
2644 <member name="F:OpenMetaverse.Vector4.UnitW">
2645 <summary>A vector with a value of 0,0,0,1</summary>
2646 </member> 2605 </member>
2647 <member name="M:OpenMetaverse.Vector4.ApproxEquals(OpenMetaverse.Vector4,System.Single)"> 2606 <member name="M:OpenMetaverse.Parallel.ForEach``1(System.Int32,System.Collections.Generic.IEnumerable{``0},System.Action{``0})">
2648 <summary> 2607 <summary>
2649 Test if this vector is equal to another vector, within a given 2608 Executes a foreach loop in which iterations may run in parallel
2650 tolerance range
2651 </summary> 2609 </summary>
2652 <param name="vec">Vector to test against</param> 2610 <typeparam name="T">Object type that the collection wraps</typeparam>
2653 <param name="tolerance">The acceptable magnitude of difference 2611 <param name="threadCount">The number of concurrent execution threads to run</param>
2654 between the two vectors</param> 2612 <param name="enumerable">An enumerable collection to iterate over</param>
2655 <returns>True if the magnitude of difference between the two vectors 2613 <param name="body">Method body to run for each object in the collection</param>
2656 is less than the given tolerance, otherwise false</returns>
2657 </member> 2614 </member>
2658 <member name="M:OpenMetaverse.Vector4.CompareTo(OpenMetaverse.Vector4)"> 2615 <member name="M:OpenMetaverse.Parallel.Invoke(System.Action[])">
2659 <summary> 2616 <summary>
2660 IComparable.CompareTo implementation 2617 Executes a series of tasks in parallel
2661 </summary> 2618 </summary>
2619 <param name="actions">A series of method bodies to execute</param>
2662 </member> 2620 </member>
2663 <member name="M:OpenMetaverse.Vector4.IsFinite"> 2621 <member name="M:OpenMetaverse.Parallel.Invoke(System.Int32,System.Action[])">
2664 <summary> 2622 <summary>
2665 Test if this vector is composed of all finite numbers 2623 Executes a series of tasks in parallel
2666 </summary> 2624 </summary>
2625 <param name="threadCount">The number of concurrent execution threads to run</param>
2626 <param name="actions">A series of method bodies to execute</param>
2667 </member> 2627 </member>
2668 <member name="M:OpenMetaverse.Vector4.FromBytes(System.Byte[],System.Int32)"> 2628 <member name="M:OpenMetaverse.CircularQueue`1.#ctor(OpenMetaverse.CircularQueue{`0})">
2669 <summary> 2629 <summary>
2670 Builds a vector from a byte array 2630 Copy constructor
2671 </summary> 2631 </summary>
2672 <param name="byteArray">Byte array containing a 16 byte vector</param> 2632 <param name="queue">Circular queue to copy</param>
2673 <param name="pos">Beginning position in the byte array</param>
2674 </member> 2633 </member>
2675 <member name="M:OpenMetaverse.Vector4.GetBytes"> 2634 <member name="M:OpenMetaverse.ReaderWriterLockSlim.ExitAndWakeUpAppropriateWaiters">
2676 <summary> 2635 <summary>
2677 Returns the raw bytes for this vector 2636 Determines the appropriate events to set, leaves the locks, and sets the events.
2678 </summary> 2637 </summary>
2679 <returns>A 16 byte array containing X, Y, Z, and W</returns>
2680 </member> 2638 </member>
2681 <member name="M:OpenMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)"> 2639 <member name="M:OpenMetaverse.ReaderWriterLockSlim.LazyCreateEvent(System.Threading.EventWaitHandle@,System.Boolean)">
2682 <summary> 2640 <summary>
2683 Writes the raw bytes for this vector to a byte array 2641 A routine for lazily creating a event outside the lock (so if errors
2642 happen they are outside the lock and that we don't do much work
2643 while holding a spin lock). If all goes well, reenter the lock and
2644 set 'waitEvent'
2684 </summary> 2645 </summary>
2685 <param name="dest">Destination byte array</param>
2686 <param name="pos">Position in the destination array to start
2687 writing. Must be at least 16 bytes before the end of the array</param>
2688 </member> 2646 </member>
2689 <member name="M:OpenMetaverse.Vector4.ToRawString"> 2647 <member name="M:OpenMetaverse.ReaderWriterLockSlim.WaitOnEvent(System.Threading.EventWaitHandle,System.UInt32@,System.Int32)">
2690 <summary> 2648 <summary>
2691 Get a string representation of the vector elements with up to three 2649 Waits on 'waitEvent' with a timeout of 'millisceondsTimeout.
2692 decimal digits and separated by spaces only 2650 Before the wait 'numWaiters' is incremented and is restored before leaving this routine.
2693 </summary> 2651 </summary>
2694 <returns>Raw string representation of the vector</returns>
2695 </member> 2652 </member>
2696 </members> 2653 </members>
2697</doc> 2654</doc>
diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll
index 6cc4c5a..7ee907b 100755
--- a/bin/OpenMetaverseTypes.dll
+++ b/bin/OpenMetaverseTypes.dll
Binary files differ
diff --git a/bin/OpenSim.32BitLaunch.exe.config b/bin/OpenSim.32BitLaunch.exe.config
index 6ac0206..6a6b3c8 100644
--- a/bin/OpenSim.32BitLaunch.exe.config
+++ b/bin/OpenSim.32BitLaunch.exe.config
@@ -11,22 +11,56 @@
11 </appSettings> 11 </appSettings>
12 <log4net> 12 <log4net>
13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> 13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
14 <filter type="log4net.Filter.LoggerMatchFilter">
15 <loggerToMatch value="special"/>
16 <acceptOnMatch value="false"/>
17 </filter>
14 <layout type="log4net.Layout.PatternLayout"> 18 <layout type="log4net.Layout.PatternLayout">
15 <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> 19 <conversionPattern value="%date{HH:mm:ss} - %message" />
20 <!-- console log with milliseconds. Useful for debugging -->
21<!-- <conversionPattern value="%date{HH:mm:ss.fff} - %message" /> -->
16 </layout> 22 </layout>
17 </appender> 23 </appender>
24
18 <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 25 <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
19 <file value="OpenSim.32BitLaunch.log" /> 26 <file value="OpenSim.32BitLaunch.log" />
20 <appendToFile value="true" /> 27 <appendToFile value="true" />
28 <filter type="log4net.Filter.LoggerMatchFilter">
29 <loggerToMatch value="special"/>
30 <acceptOnMatch value="false"/>
31 </filter>
21 <layout type="log4net.Layout.PatternLayout"> 32 <layout type="log4net.Layout.PatternLayout">
22 <conversionPattern value="%date %-5level - %logger %message%newline" /> 33 <conversionPattern value="%date %-5level - %logger %message%newline" />
23 </layout> 34 </layout>
24 </appender> 35 </appender>
25 36
37 <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
38 <file value="OpenSimStats.log"/>
39 <appendToFile value="true" />
40 <layout type="log4net.Layout.PatternLayout">
41 <conversionPattern value="%date - %message%newline" />
42 </layout>
43 </appender>
44
26 <root> 45 <root>
27 <level value="DEBUG" /> 46 <level value="DEBUG" />
28 <appender-ref ref="Console" /> 47 <appender-ref ref="Console" />
29 <appender-ref ref="LogFileAppender" /> 48 <appender-ref ref="LogFileAppender" />
30 </root> 49 </root>
50
51 <!-- Independently control logging level for XEngine -->
52 <logger name="OpenSim.Region.ScriptEngine.XEngine">
53 <level value="INFO"/>
54 </logger>
55
56 <!-- Independently control logging level for per region module loading -->
57 <logger name="OpenSim.ApplicationPlugins.RegionModulesController.RegionModulesControllerPlugin">
58 <level value="INFO"/>
59 </logger>
60
61 <!-- used for stats recording -->
62 <logger name="special.StatsLogger">
63 <appender-ref ref="StatsLogFileAppender"/>
64 </logger>
31 </log4net> 65 </log4net>
32</configuration> 66</configuration>
diff --git a/bin/OpenSim.exe.config b/bin/OpenSim.exe.config
index 8a891f4..b2cb4e5 100755
--- a/bin/OpenSim.exe.config
+++ b/bin/OpenSim.exe.config
@@ -11,6 +11,10 @@
11 </appSettings> 11 </appSettings>
12 <log4net> 12 <log4net>
13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> 13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
14 <filter type="log4net.Filter.LoggerMatchFilter">
15 <loggerToMatch value="special"/>
16 <acceptOnMatch value="false"/>
17 </filter>
14 <layout type="log4net.Layout.PatternLayout"> 18 <layout type="log4net.Layout.PatternLayout">
15 <conversionPattern value="%date{HH:mm:ss} - %message" /> 19 <conversionPattern value="%date{HH:mm:ss} - %message" />
16 <!-- console log with milliseconds. Useful for debugging --> 20 <!-- console log with milliseconds. Useful for debugging -->
@@ -21,11 +25,23 @@
21 <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 25 <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
22 <file value="OpenSim.log" /> 26 <file value="OpenSim.log" />
23 <appendToFile value="true" /> 27 <appendToFile value="true" />
28 <filter type="log4net.Filter.LoggerMatchFilter">
29 <loggerToMatch value="special"/>
30 <acceptOnMatch value="false"/>
31 </filter>
24 <layout type="log4net.Layout.PatternLayout"> 32 <layout type="log4net.Layout.PatternLayout">
25 <conversionPattern value="%date %-5level - %logger %message%newline" /> 33 <conversionPattern value="%date %-5level - %logger %message%newline" />
26 </layout> 34 </layout>
27 </appender> 35 </appender>
28 36
37 <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
38 <file value="OpenSimStats.log"/>
39 <appendToFile value="true" />
40 <layout type="log4net.Layout.PatternLayout">
41 <conversionPattern value="%date - %message%newline" />
42 </layout>
43 </appender>
44
29 <root> 45 <root>
30 <level value="DEBUG" /> 46 <level value="DEBUG" />
31 <appender-ref ref="Console" /> 47 <appender-ref ref="Console" />
@@ -42,5 +58,10 @@
42 <level value="INFO"/> 58 <level value="INFO"/>
43 </logger> 59 </logger>
44 60
61 <!-- used for stats recording -->
62 <logger name="special.StatsLogger">
63 <appender-ref ref="StatsLogFileAppender"/>
64 </logger>
65
45 </log4net> 66 </log4net>
46</configuration> 67</configuration>
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 842043e..313466c 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -180,10 +180,6 @@
180 ;; if the first change occurred this number of seconds ago. 180 ;; if the first change occurred this number of seconds ago.
181 ; MaximumTimeBeforePersistenceConsidered = 600 181 ; MaximumTimeBeforePersistenceConsidered = 600
182 182
183 ;# {see_into_this_sim_from_neighbor} {} {Should avatars in neighbor sims see objects in this sim?} {true false} true
184 ;; Should avatars in neighbor sims see objects in this sim?
185 ; see_into_this_sim_from_neighbor = true
186
187 ;# {physical_prim} {} {Allow prims to be physical?} {true false} true 183 ;# {physical_prim} {} {Allow prims to be physical?} {true false} true
188 ;; if you would like to allow prims to be physical and move by physics 184 ;; if you would like to allow prims to be physical and move by physics
189 ;; with the physical checkbox in the client set this to true. 185 ;; with the physical checkbox in the client set this to true.
@@ -264,7 +260,7 @@
264 ; AllowedClients = 260 ; AllowedClients =
265 261
266 ;# {BannedClients} {} {Bar (|) separated list of banned clients} {} 262 ;# {BannedClients} {} {Bar (|) separated list of banned clients} {}
267 ;# Bar (|) separated list of viewers which may not gain access to the regions. 263 ;; Bar (|) separated list of viewers which may not gain access to the regions.
268 ;; One can use a Substring of the viewer name to disable only certain 264 ;; One can use a Substring of the viewer name to disable only certain
269 ;; versions 265 ;; versions
270 ;; Example: Agent uses the viewer "Imprudence 1.3.2.0" 266 ;; Example: Agent uses the viewer "Imprudence 1.3.2.0"
@@ -283,7 +279,7 @@
283 ;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/ 279 ;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
284 ; GenerateMaptiles = true 280 ; GenerateMaptiles = true
285 281
286 ;# {MapImageModule} [] {The map image module to use} {MapImageModule Warp3DImageModule} MapImageModule 282 ;# {MapImageModule} {} {The map image module to use} {MapImageModule Warp3DImageModule} MapImageModule
287 ;; The module to use in order to generate map images. 283 ;; The module to use in order to generate map images.
288 ;; MapImageModule is the default. Warp3DImageModule is an alternative experimental module that can 284 ;; MapImageModule is the default. Warp3DImageModule is an alternative experimental module that can
289 ;; generate better images. 285 ;; generate better images.
@@ -470,7 +466,10 @@
470 ;# {XmlRpcPort} {} {Port for incoming llRemoteData xmlrpc calls} {} 20800 466 ;# {XmlRpcPort} {} {Port for incoming llRemoteData xmlrpc calls} {} 20800
471 ;XmlRpcPort = 20800 467 ;XmlRpcPort = 20800
472 468
473 ;# {XmlRpcHubURI} {XmlRpcRouterModule} {URI for external service used to register xmlrpc channels created in the simulator. This depends on XmlRpcRouterModule being set to XmlRpcGridRouterModule} http://example.com 469
470;; {option} {depends on} {question to ask} {choices} default value
471
472 ;# {XmlRpcHubURI} {XmlRpcRouterModule} {URI for external service used to register xmlrpc channels created in the simulator. This depends on XmlRpcRouterModule being set to XmlRpcGridRouterModule} {} http://example.com
474 ;; If XmlRpcRouterModule is set to XmlRpcGridRouterModule, the simulator 473 ;; If XmlRpcRouterModule is set to XmlRpcGridRouterModule, the simulator
475 ;; will use this address to register xmlrpc channels on the external 474 ;; will use this address to register xmlrpc channels on the external
476 ;; service 475 ;; service
@@ -503,8 +502,10 @@
503 ;; "<url>" -- capability enabled and served by some other server 502 ;; "<url>" -- capability enabled and served by some other server
504 ;; 503 ;;
505 ; These are enabled by default to localhost. Change if you see fit. 504 ; These are enabled by default to localhost. Change if you see fit.
506 Cap_GetTexture = "localhost" 505 Cap_GetTexture = "localhost"
507 Cap_GetMesh = "localhost" 506 Cap_GetMesh = "localhost"
507 Cap_AvatarPickerSearch = "localhost"
508
508 ; This is disabled by default. Change if you see fit. Note that 509 ; This is disabled by default. Change if you see fit. Note that
509 ; serving this cap from the simulators may lead to poor performace. 510 ; serving this cap from the simulators may lead to poor performace.
510 Cap_WebFetchInventoryDescendents = "" 511 Cap_WebFetchInventoryDescendents = ""
@@ -532,7 +533,7 @@
532 ;; Distance in meters that ordinary chat should travel. 533 ;; Distance in meters that ordinary chat should travel.
533 ; say_distance = 20 534 ; say_distance = 20
534 535
535 ;# {shout_distance} {Distance at which a shout is heard, in meters?} {} 100 536 ;# {shout_distance} {} {Distance at which a shout is heard, in meters?} {} 100
536 ;; Distance in meters that shouts should travel. 537 ;; Distance in meters that shouts should travel.
537 ; shout_distance = 100 538 ; shout_distance = 100
538 539
@@ -570,9 +571,9 @@
570 ;; must be set to allow offline messaging to work. 571 ;; must be set to allow offline messaging to work.
571 ; MuteListURL = http://yourserver/Mute.php 572 ; MuteListURL = http://yourserver/Mute.php
572 573
573 ;; Control whether group messages are forwarded to offline users. 574 ;; Control whether group invites and notices are stored for offline users.
574 ;; Default is true. 575 ;; Default is true.
575 ;; This applies to the core groups module (Flotsam) only. 576 ;; This applies to both core groups module.
576 ; ForwardOfflineGroupMessages = true 577 ; ForwardOfflineGroupMessages = true
577 578
578 579
@@ -607,7 +608,8 @@
607 ;; the "password" parameter) 608 ;; the "password" parameter)
608 ; access_password = "" 609 ; access_password = ""
609 610
610 ;# List the IP addresses allowed to call RemoteAdmin 611 ;# {access_ip_addresses} {enabled:true} {List the IP addresses allowed to call RemoteAdmin?} {}
612 ;; List the IP addresses allowed to call RemoteAdmin
611 ;; If access_ip_addresses isn't set, then all IP addresses can access RemoteAdmin. 613 ;; If access_ip_addresses isn't set, then all IP addresses can access RemoteAdmin.
612 ;; access_ip_addresses = 0.0.0.0, 0.0.0.0 ... 614 ;; access_ip_addresses = 0.0.0.0, 0.0.0.0 ...
613 ; access_ip_addresses = 615 ; access_ip_addresses =
@@ -792,7 +794,7 @@
792 ; ScriptStopStrategy = abort 794 ; ScriptStopStrategy = abort
793 795
794 796
795 ;# {DeleteScriptsOnStartup} {} {Delete previously compiled script DLLs on startup?} (true false) true 797 ;# {DeleteScriptsOnStartup} {} {Delete previously compiled script DLLs on startup?} {true false} true
796 ;; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false 798 ;; Controls whether previously compiled scripts DLLs are deleted on sim restart. If you set this to false
797 ;; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the 799 ;; then startup will be considerably faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
798 ;; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used 800 ;; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
@@ -945,6 +947,10 @@
945 ;; Enables the groups module 947 ;; Enables the groups module
946 ; Enabled = false 948 ; Enabled = false
947 949
950 ;# {LevelGroupCreate} {Enabled:true} {User level for creating groups} {} 0
951 ;; Minimum user level required to create groups
952 ; LevelGroupCreate = 0
953
948 ;# {Module} {Enabled:true} {Groups module to use? (Use GroupsModule to use Flotsam/Simian)} {Default "Groups Module V2"} Default 954 ;# {Module} {Enabled:true} {Groups module to use? (Use GroupsModule to use Flotsam/Simian)} {Default "Groups Module V2"} Default
949 ;; The default module can use a PHP XmlRpc server from the Flotsam project at 955 ;; The default module can use a PHP XmlRpc server from the Flotsam project at
950 ;; http://code.google.com/p/flotsam/ 956 ;; http://code.google.com/p/flotsam/
@@ -996,6 +1002,12 @@
996 ;; Enable Group Notices 1002 ;; Enable Group Notices
997 ; NoticesEnabled = true 1003 ; NoticesEnabled = true
998 1004
1005 ;# {MessageOnlineUsersOnly} {Module:GroupsModule Module} {Message online users only?} {true false} false
1006 ; Experimental option to only message online users rather than all users
1007 ; Should make large groups with few online members messaging faster, as the expense of more calls to presence service
1008 ; Applies Flotsam Group only. V2 has this always on, no other option
1009 ; MessageOnlineUsersOnly = false
1010
999 ;; This makes the Groups modules very chatty on the console. 1011 ;; This makes the Groups modules very chatty on the console.
1000 ; DebugEnabled = false 1012 ; DebugEnabled = false
1001 1013
@@ -1026,6 +1038,12 @@
1026 ;# {InitialTerrain} {} {Initial terrain type} {pinhead-island flat} pinhead-island 1038 ;# {InitialTerrain} {} {Initial terrain type} {pinhead-island flat} pinhead-island
1027 ; InitialTerrain = "pinhead-island" 1039 ; InitialTerrain = "pinhead-island"
1028 1040
1041[UserProfiles]
1042 ;# {ProfileURL} {} {Set url to UserProfilesService} {}
1043 ;; Set the value of the url to your UserProfilesService
1044 ;; If un-set / "" the module is disabled
1045 ;; ProfileServiceURL = http://127.0.0.1:8002
1046
1029[Architecture] 1047[Architecture]
1030 ;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini 1048 ;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini
1031 ;; Uncomment one of the following includes as required. For instance, to create a standalone OpenSim, 1049 ;; Uncomment one of the following includes as required. For instance, to create a standalone OpenSim,
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 3eaef61..67963a5 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -43,9 +43,14 @@
43 ; Sets the method that OpenSim will use to fire asynchronous 43 ; Sets the method that OpenSim will use to fire asynchronous
44 ; events. Valid values are UnsafeQueueUserWorkItem, 44 ; events. Valid values are UnsafeQueueUserWorkItem,
45 ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread. 45 ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread.
46 ;
46 ; SmartThreadPool is reported to work well on Mono/Linux, but 47 ; SmartThreadPool is reported to work well on Mono/Linux, but
47 ; UnsafeQueueUserWorkItem has been benchmarked with better 48 ; UnsafeQueueUserWorkItem has been benchmarked with better
48 ; performance on .NET/Windows 49 ; performance on .NET/Windows
50 ;
51 ; UnsafeQueueUserWorkItem refers to the fact that the code creating the event could elevate its security
52 ; privileges. However, as calling code is trusted anyway this is safe (if you set
53 ; TrustedBinaries = true in the [XEngine] section then you already have to trust that incoming code for other reasons).
49 async_call_method = SmartThreadPool 54 async_call_method = SmartThreadPool
50 55
51 ; Max threads to allocate on the FireAndForget thread pool 56 ; Max threads to allocate on the FireAndForget thread pool
@@ -81,6 +86,13 @@
81 ;; from the selected region_info_source. 86 ;; from the selected region_info_source.
82 allow_regionless = false 87 allow_regionless = false
83 88
89 ;; Allow child agents to see into the region even if their root counterpart isn't allowed in here
90 see_into_region = true
91
92 ; Maximum number of position, rotation and scale changes for each prim that the simulator will store for later undos
93 ; Increasing this number will increase memory usage.
94 MaxPrimUndos = 20
95
84 ; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonPhysicalPrimMax!). 96 ; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonPhysicalPrimMax!).
85 NonPhysicalPrimMax = 256 97 NonPhysicalPrimMax = 256
86 98
@@ -252,8 +264,15 @@
252 264
253 ; Simulator Stats URI 265 ; Simulator Stats URI
254 ; Enable JSON simulator data by setting a URI name (case sensitive) 266 ; Enable JSON simulator data by setting a URI name (case sensitive)
267 ; Returns regular sim stats (SimFPS, ...)
255 ; Stats_URI = "jsonSimStats" 268 ; Stats_URI = "jsonSimStats"
256 269
270 ; Simulator StatsManager URI
271 ; Enable fetch of StatsManager registered stats. Fetch is query which can optionally
272 ; specify category, container and stat to fetch. If not selected, returns all of that type.
273 ; http://simulatorHTTPport/ManagedStats/?cat=Category&cont=Container&stat=Statistic
274 ; ManagedStatsRemoteFetchURI = "ManagedStats"
275
257 ; Make OpenSim start all regions woth logins disabled. They will need 276 ; Make OpenSim start all regions woth logins disabled. They will need
258 ; to be enabled from the console if this is set 277 ; to be enabled from the console if this is set
259 ; StartDisabled = false 278 ; StartDisabled = false
@@ -368,6 +387,19 @@
368 AllowRegionRestartFromClient = true 387 AllowRegionRestartFromClient = true
369 388
370 389
390[UserProfiles]
391 ;# {ProfileURL} {} {Set url to UserProfilesService} {}
392 ;; Set the value of the url to your UserProfilesService
393 ;; If un-set / "" the module is disabled
394 ;; If the ProfileURL is not set, then very BASIC
395 ;; profile support will be configured. If the ProfileURL is set to a
396 ;; valid URL, then full profile support will be configured. The URL
397 ;; points to your grid's Robust user profiles service
398 ;;
399 ; ProfileURL = http://127.0.0.1:9000
400
401
402
371[SMTP] 403[SMTP]
372 enabled = false 404 enabled = false
373 405
@@ -536,7 +568,6 @@
536 ;; in OpenSim.ini 568 ;; in OpenSim.ini
537 ;; 569 ;;
538 Cap_AttachmentResources = "" 570 Cap_AttachmentResources = ""
539 Cap_AvatarPickerSearch = ""
540 Cap_ChatSessionRequest = "" 571 Cap_ChatSessionRequest = ""
541 Cap_CopyInventoryFromNotecard = "localhost" 572 Cap_CopyInventoryFromNotecard = "localhost"
542 Cap_DispatchRegionInfo = "" 573 Cap_DispatchRegionInfo = ""
@@ -600,6 +631,10 @@
600 Cap_WebFetchInventoryDescendents = "" 631 Cap_WebFetchInventoryDescendents = ""
601 Cap_FetchInventoryDescendents2 = "localhost" 632 Cap_FetchInventoryDescendents2 = "localhost"
602 Cap_FetchInventory2 = "localhost" 633 Cap_FetchInventory2 = "localhost"
634
635 ; Capability for searching for people
636 Cap_AvatarPickerSearch = "localhost"
637
603 638
604 639
605[Chat] 640[Chat]
@@ -671,12 +706,22 @@
671 ; in other situations (e.g. appearance baking failures where the avatar only appears as a cloud to others). 706 ; in other situations (e.g. appearance baking failures where the avatar only appears as a cloud to others).
672 ResendAppearanceUpdates = true 707 ResendAppearanceUpdates = true
673 708
709 ; Turning this on responds to CachedTexture packets to possibly avoid rebaking the avatar
710 ; on every login
711 ReuseTextures = false
712
674 713
675[Attachments] 714[Attachments]
676 ; Controls whether avatar attachments are enabled. 715 ; Controls whether avatar attachments are enabled.
677 ; Defaults to true - only set to false for debugging purposes 716 ; Defaults to true - only set to false for debugging purposes
678 Enabled = true 717 Enabled = true
679 718
719 ; Controls the number of milliseconds that are slept per 100 prims rezzed in attachments
720 ; Experimental setting to control CPU spiking when avatars with many attachments login/change outfit
721 ; or when multiple avatars with medium level attachments login/change outfit simultaneously.
722 ; If 0 then no throttling is performed.
723 ThrottlePer100PrimsRezzed = 0;
724
680 725
681[Mesh] 726[Mesh]
682 ; enable / disable Collada mesh support 727 ; enable / disable Collada mesh support
@@ -891,71 +936,82 @@
891 ; ## Joint support 936 ; ## Joint support
892 ; ## 937 ; ##
893 938
894 ; if you would like physics joints to be enabled through a special naming convention in the client, set this to true. 939 ; If you would like physics joints to be enabled through a special naming
895 ; (see NINJA Physics documentation, http://opensimulator.org/wiki/NINJA_Physics) 940 ; convention in the client, set this to true.
896 ; default is false 941 ; (See NINJA Physics documentation, http://opensimulator.org/wiki/NINJA_Physics)
942 ; Default is false
897 ;use_NINJA_physics_joints = true 943 ;use_NINJA_physics_joints = true
898 944
899 ; ## 945 ; ##
900 ; ## additional meshing options 946 ; ## additional meshing options
901 ; ## 947 ; ##
902 948
903 ; physical collision mesh proxies are normally created for complex prim shapes, and collisions for simple boxes and 949 ; Physical collision mesh proxies are normally created for complex prim shapes,
904 ; spheres are computed algorithmically. If you would rather have mesh proxies for simple prims, you can set this to 950 ; and collisions for simple boxes and spheres are computed algorithmically.
905 ; true. Note that this will increase memory usage and region startup time. Default is false. 951 ; If you would rather have mesh proxies for simple prims, you can set this to
952 ; true. Note that this will increase memory usage and region startup time.
953 ; Default is false.
906 ;force_simple_prim_meshing = true 954 ;force_simple_prim_meshing = true
907 955
908[BulletSim] 956[BulletSim]
909 ; World parameters 957 ; All the BulletSim parameters can be displayed with the console command
910 958 ; "physics get all" and all are defined in the source file
911 ; There are two bullet physics libraries, bulletunmanaged is the default and is a native c++ dll 959 ; OpenSim/Regions/Physics/BulletSPlugin/BSParam.cs.
912 ; bulletxna is a managed C# dll. They have comparible functionality.. the c++ is much faster.
913 960
961 ; There are two bullet physics libraries, bulletunmanaged is the default and is a
962 ; native c++ dll bulletxna is a managed C# dll. They have comparible functionality
963 ; but the c++ one is much faster.
914 BulletEngine = "bulletunmanaged" 964 BulletEngine = "bulletunmanaged"
915 ; BulletEngine = "bulletxna" 965 ; BulletEngine = "bulletxna"
916 966
917 ; Terrain Implementation {1|0} 0 for HeightField, 1 for Mesh terrain. If you're using the bulletxna engine, 967 ; BulletSim can run on its own thread independent of the simulator's heartbeat
918 ; you will want to switch to the heightfield option 968 ; thread. Enabling this will nto let the physics engine slow down avatar movement, etc.
919 TerrainImplementation = 1 969 UseSeparatePhysicsThread = false
920 ; TerrainImplementation = 0
921
922 Gravity = -9.80665
923
924 TerrainFriction = 0.30
925 TerrainHitFraction = 0.8
926 TerrainRestitution = 0
927 TerrainCollisionMargin = 0.04
928
929 AvatarFriction = 0.2
930 AvatarStandingFriction = 0.95
931 AvatarRestitution = 0.0
932 AvatarDensity = 3.5
933 AvatarCapsuleWidth = 0.6
934 AvatarCapsuleDepth = 0.45
935 AvatarCapsuleHeight = 1.5
936 AvatarContactProcessingThreshold = 0.1
937 970
938 MaxObjectMass = 10000.01 971 ; Terrain implementation can use either Bullet's heightField or BulletSim can build
939 972 ; a mesh. 0=heightField, 1=mesh
940 CollisionMargin = 0.04 973 TerrainImplementation = 1
941 974 ; For mesh terrain, the detail of the created mesh. '1' gives 256x256 (heightfield
942 ; Linkset implmentation 975 ; resolution). '2' gives 512x512. Etc. Cannot be larger than '4'. Higher
976 ; magnification uses lots of memory.
977 TerrainMeshMagnification = 2
978
979 ; Avatar physics height adjustments.
980 ; http://opensimulator.org/wiki/BulletSim#Adjusting_Avatar_Height
981 AvatarHeightLowFudge = -0.2 ; Adjustment at low end of height range
982 AvatarHeightMidFudge = 0.1 ; Adjustment at mid point of avatar height range
983 AvatarHeightHighFudge = 0.1 ; Adjustment at high end of height range
984
985 ; Default linkset implmentation
986 ; 'Constraint' uses physics constraints to hold linkset together. 'Compound'
987 ; builds a compound shape from the children shapes to create a single physical
988 ; shape. 'Compound' uses a lot less CPU time.
943 LinkImplementation = 1 ; 0=constraint, 1=compound 989 LinkImplementation = 1 ; 0=constraint, 1=compound
944 990
945 ; Whether to mesh sculpties 991 ; If 'true', offset a linkset's origin based on mass of linkset parts.
992 LinksetOffsetCenterOfMass = false
993
994 ; If 'true', turn scuplties into meshes
946 MeshSculptedPrim = true 995 MeshSculptedPrim = true
947 996
948 ; If 'true', force simple prims (box and sphere) to be meshed 997 ; If 'true', force simple prims (box and sphere) to be meshed
998 ; If 'false', the Bullet native special case shape is used for square rectangles
999 ; and even dimensioned spheres.
949 ForceSimplePrimMeshing = false 1000 ForceSimplePrimMeshing = false
950 1001
951 ; Bullet step parameters 1002 ; If 'true', when creating meshes, remove all triangles that have two equal vertexes.
952 MaxSubSteps = 10 1003 ; Happens often in sculpties. If turned off, there will be some doorways
953 FixedTimeStep = .01667 1004 ; that cannot be walked through.
1005 ShouldRemoveZeroWidthTriangles = true
1006
1007 ; If 'true', use convex hull definition in mesh asset if present.
1008 ShouldUseAssetHulls = true
954 1009
1010 ; If there are thousands of physical objects, these maximums should be increased.
955 MaxCollisionsPerFrame = 2048 1011 MaxCollisionsPerFrame = 2048
956 MaxUpdatesPerFrame = 8192 1012 MaxUpdatesPerFrame = 8192
957 1013
958 ; Detailed physics debug logging 1014 ; Detailed physics debug logging. Very verbose.
959 PhysicsLoggingEnabled = False 1015 PhysicsLoggingEnabled = False
960 PhysicsLoggingDir = "." 1016 PhysicsLoggingDir = "."
961 VehicleLoggingEnabled = False 1017 VehicleLoggingEnabled = False
@@ -1570,7 +1626,7 @@
1570 1626
1571 ; Experimental option to only message cached online users rather than all users 1627 ; Experimental option to only message cached online users rather than all users
1572 ; Should make large group with few online members messaging faster, as the expense of more calls to ROBUST presence service 1628 ; Should make large group with few online members messaging faster, as the expense of more calls to ROBUST presence service
1573 ; This currently only applies to the Flotsam XmlRpc backend 1629 ; (Flotsam groups only; in V2 this is always on)
1574 MessageOnlineUsersOnly = false 1630 MessageOnlineUsersOnly = false
1575 1631
1576 ; Service connectors to the Groups Service. Select one depending on whether you're using a Flotsam XmlRpc backend or a SimianGrid backend 1632 ; Service connectors to the Groups Service. Select one depending on whether you're using a Flotsam XmlRpc backend or a SimianGrid backend
@@ -1688,5 +1744,9 @@ MaxStringSpace = 0
1688 ;; {MaxDistance} {} {Cut-off distance at which sounds will not be sent to users} {100.0} 1744 ;; {MaxDistance} {} {Cut-off distance at which sounds will not be sent to users} {100.0}
1689 MaxDistance = 100.0 1745 MaxDistance = 100.0
1690 1746
1747[ServiceThrottle]
1748 ;; Default time interval (in ms) for the throttle service thread to wake up
1749 Interval = 5000
1750
1691[Modules] 1751[Modules]
1692 Include-modules = "addon-modules/*/config/*.ini" 1752 Include-modules = "addon-modules/*/config/*.ini"
diff --git a/bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config b/bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config
index 1bc7e41..2763525 100755
--- a/bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config
+++ b/bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config
@@ -1,6 +1,8 @@
1<configuration> 1<configuration>
2 <dllmap os="windows" cpu="x86" dll="BulletSim" target="lib32/BulletSim" /> 2 <dllmap os="windows" cpu="x86" dll="BulletSim" target="lib32/BulletSim" />
3 <dllmap os="windows" cpu="x86-64,ia64" dll="BulletSim" target="lib64/BulletSim" /> 3 <dllmap os="windows" cpu="x86-64,ia64" dll="BulletSim" target="lib64/BulletSim" />
4 <dllmap os="osx" cpu="x86" dll="BulletSim" target="lib32/libBulletSim.dylib" />
5 <dllmap os="osx" cpu="x86-64,ia64" dll="BulletSim" target="lib32/libBulletSim.dylib" />
4 <dllmap os="!windows,osx" cpu="x86" dll="BulletSim" target="lib32/libBulletSim.so" /> 6 <dllmap os="!windows,osx" cpu="x86" dll="BulletSim" target="lib32/libBulletSim.so" />
5 <dllmap os="!windows,osx" cpu="x86-64,ia64" dll="BulletSim" target="lib64/libBulletSim.so" /> 7 <dllmap os="!windows,osx" cpu="x86-64,ia64" dll="BulletSim" target="lib64/libBulletSim.so" />
6</configuration> 8</configuration>
diff --git a/bin/Robust.32BitLaunch.exe.config b/bin/Robust.32BitLaunch.exe.config
index dae45ff..ec17049 100644
--- a/bin/Robust.32BitLaunch.exe.config
+++ b/bin/Robust.32BitLaunch.exe.config
@@ -11,22 +11,44 @@
11 </appSettings> 11 </appSettings>
12 <log4net> 12 <log4net>
13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> 13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
14 <filter type="log4net.Filter.LoggerMatchFilter">
15 <loggerToMatch value="special"/>
16 <acceptOnMatch value="false"/>
17 </filter>
14 <layout type="log4net.Layout.PatternLayout"> 18 <layout type="log4net.Layout.PatternLayout">
15 <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> 19 <conversionPattern value="%date{HH:mm:ss} - %message%newline" />
16 </layout> 20 </layout>
17 </appender> 21 </appender>
22
18 <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 23 <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
19 <file value="Robust.32BitLaunch.log" /> 24 <file value="Robust.32BitLaunch.log" />
20 <appendToFile value="true" /> 25 <appendToFile value="true" />
26 <filter type="log4net.Filter.LoggerMatchFilter">
27 <loggerToMatch value="special"/>
28 <acceptOnMatch value="false"/>
29 </filter>
21 <layout type="log4net.Layout.PatternLayout"> 30 <layout type="log4net.Layout.PatternLayout">
22 <conversionPattern value="%date %-5level - %logger %message%newline" /> 31 <conversionPattern value="%date %-5level - %logger %message%newline" />
23 </layout> 32 </layout>
24 </appender> 33 </appender>
25 34
35 <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
36 <file value="RobustStats.log"/>
37 <appendToFile value="true" />
38 <layout type="log4net.Layout.PatternLayout">
39 <conversionPattern value="%date - %message%newline" />
40 </layout>
41 </appender>
42
26 <root> 43 <root>
27 <level value="DEBUG" /> 44 <level value="DEBUG" />
28 <appender-ref ref="Console" /> 45 <appender-ref ref="Console" />
29 <appender-ref ref="LogFileAppender" /> 46 <appender-ref ref="LogFileAppender" />
30 </root> 47 </root>
48
49 <!-- used for stats recording -->
50 <logger name="special.StatsLogger">
51 <appender-ref ref="StatsLogFileAppender"/>
52 </logger>
31 </log4net> 53 </log4net>
32</configuration> 54</configuration>
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index 581c31d..8fe6d0c 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -21,18 +21,21 @@
21; * [[<ConfigName>@]<port>/]<dll name>[:<class name>] 21; * [[<ConfigName>@]<port>/]<dll name>[:<class name>]
22; * 22; *
23[Startup] 23[Startup]
24 24 ; Place to create a PID file
25 ; Plugin Registry Location 25 ; If no path if specified then a PID file is not created.
26 ; Set path to directory for plugin registry. Information 26 ; PIDFile = "/tmp/my.pid"
27 ; about the registered repositories and installed plugins 27
28 ; will be stored here 28 ; Plugin Registry Location
29 ; The Robust.exe process must have R/W access to the location 29 ; Set path to directory for plugin registry. Information
30 RegistryLocation = "." 30 ; about the registered repositories and installed plugins
31 31 ; will be stored here
32 ; Modular configurations 32 ; The Robust.exe process must have R/W access to the location
33 ; Set path to directory for modular ini files... 33 RegistryLocation = "."
34 ; The Robust.exe process must have R/W access to the location 34
35 ConfigDirectory = "/home/opensim/etc/Configs" 35 ; Modular configurations
36 ; Set path to directory for modular ini files...
37 ; The Robust.exe process must have R/W access to the location
38 ConfigDirectory = "."
36 39
37[ServiceList] 40[ServiceList]
38 41
@@ -68,10 +71,12 @@ HGInventoryServiceConnector = "HGInventoryService@8002/OpenSim.Server.Handlers.d
68HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:AssetServiceConnector" 71HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:AssetServiceConnector"
69;; Uncomment this if you want Groups V2, HG to work 72;; Uncomment this if you want Groups V2, HG to work
70; HGGroupsServiceConnector = "8002/OpenSim.Addons.Groups.dll:HGGroupsServiceRobustConnector" 73; HGGroupsServiceConnector = "8002/OpenSim.Addons.Groups.dll:HGGroupsServiceRobustConnector"
71
72;; Additions for other add-on modules. For example: 74;; Additions for other add-on modules. For example:
73;; WifiServerConnector = "8002/Diva.Wifi.dll:WifiServerConnector" 75;; WifiServerConnector = "8002/Diva.Wifi.dll:WifiServerConnector"
74 76
77;; Uncomment for UserProfiles see [UserProfilesService] to configure...
78; UserProfilesServiceConnector = "8002/OpenSim.Server.Handlers.dll:UserProfilesConnector"
79
75; * This is common for all services, it's the network setup for the entire 80; * This is common for all services, it's the network setup for the entire
76; * server instance, if none is specified above 81; * server instance, if none is specified above
77; * 82; *
@@ -146,7 +151,8 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
146; * 151; *
147[GridService] 152[GridService]
148 LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" 153 LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
149 HypergridLinker = true 154
155 HypergridLinker = true
150 156
151 ; Realm = "regions" 157 ; Realm = "regions"
152 ; AllowDuplicateNames = "True" 158 ; AllowDuplicateNames = "True"
@@ -163,16 +169,31 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
163 ;; Next, we can specify properties of regions, including default and fallback regions 169 ;; Next, we can specify properties of regions, including default and fallback regions
164 ;; The syntax is: Region_<RegionName> = "<flags>" 170 ;; The syntax is: Region_<RegionName> = "<flags>"
165 ;; or: Region_<RegionID> = "<flags>" 171 ;; or: Region_<RegionID> = "<flags>"
166 ;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut,Reservation,NoMove,Authenticate 172 ;; where <flags> can be DefaultRegion, DefaultHGRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut, Reservation, NoMove, Authenticate
167 ;; For example: 173 ;;
174 ;; DefaultRegion If a local login cannot be placed in the required region (e.g. home region does not exist, avatar is not allowed entry, etc.)
175 ;; then this region becomes the destination. Only the first online default region will be used. If no DefaultHGRegion
176 ;; is specified then this will also be used as the region for hypergrid connections that require it (commonly because they have not specified
177 ;; an explicit region.
178 ;;
179 ;; DefaultHGRegion If an avatar connecting via the hypergrid does not specify a region, then they are placed here. Only the first online
180 ;; region will be used.
181 ;;
182 ;; FallbackRegion If the DefaultRegion is not available for a local login, then any FallbackRegions are tried instead. These are tried in the
183 ;; order specified. This only applies to local logins at this time, not Hypergrid connections.
184 ;;
185 ;; NoDirectLogin A hypergrid user cannot directly connect to this region. This does not apply to local logins.
186 ;;
187 ;; Persistent When the simulator is shutdown, the region is signalled as offline but left registered on the grid.
188 ;;
168 ; Region_Welcome_Area = "DefaultRegion, FallbackRegion" 189 ; Region_Welcome_Area = "DefaultRegion, FallbackRegion"
169 ; (replace spaces with underscore) 190 ; (replace spaces with underscore)
170 191
171 ;; Allow Hyperlinks to be created at the console 192 ;; Allow Hyperlinks to be created at the console
172 HypergridLinker = true 193 HypergridLinker = true
173 194
174 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented 195 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
175 ; GatekeeperURI = "http://127.0.0.1:8002" 196 ; GatekeeperURI = "http://127.0.0.1:8002"
176 197
177 198
178; * This is the configuration for the freeswitch server in grid mode 199; * This is the configuration for the freeswitch server in grid mode
@@ -306,6 +327,9 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
306 ;; Ask co-operative viewers to use a different currency name 327 ;; Ask co-operative viewers to use a different currency name
307 ;Currency = "" 328 ;Currency = ""
308 329
330 ;; Set minimum fee to publish classified
331 ; ClassifiedFee = 0
332
309 WelcomeMessage = "Welcome, Avatar!" 333 WelcomeMessage = "Welcome, Avatar!"
310 AllowRemoteSetLoginLevel = "false" 334 AllowRemoteSetLoginLevel = "false"
311 335
@@ -322,6 +346,12 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
322 ; For V2/V3 webapp authentication SSO 346 ; For V2/V3 webapp authentication SSO
323 ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/" 347 ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/"
324 348
349 ; For V3 destination guide
350 ; DestinationGuide = "http://127.0.0.1/guide"
351
352 ; For V3 avatar picker (( work in progress ))
353 ; AvatarPicker = "http://127.0.0.1/avatars"
354
325 ; If you run this login server behind a proxy, set this to true 355 ; If you run this login server behind a proxy, set this to true
326 ; HasProxy = false 356 ; HasProxy = false
327 357
@@ -586,4 +616,12 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
586 ;; Can overwrite the default in [Hypergrid], but probably shouldn't 616 ;; Can overwrite the default in [Hypergrid], but probably shouldn't
587 ; HomeURI = "http://127.0.0.1:8002" 617 ; HomeURI = "http://127.0.0.1:8002"
588 618
619[UserProfilesService]
620 LocalServiceModule = "OpenSim.Services.UserProfilesService.dll:UserProfilesService"
621 Enabled = false
622 ;; Configure this for separate profiles database
623 ;; ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;"
624 ;; Realm = UserProfiles
625 UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService
626 AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
589 627
diff --git a/bin/Robust.exe.config b/bin/Robust.exe.config
index 4914f55..62975fd 100644
--- a/bin/Robust.exe.config
+++ b/bin/Robust.exe.config
@@ -11,6 +11,10 @@
11 </appSettings> 11 </appSettings>
12 <log4net> 12 <log4net>
13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> 13 <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
14 <filter type="log4net.Filter.LoggerMatchFilter">
15 <loggerToMatch value="special"/>
16 <acceptOnMatch value="false"/>
17 </filter>
14 <layout type="log4net.Layout.PatternLayout"> 18 <layout type="log4net.Layout.PatternLayout">
15 <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> 19 <conversionPattern value="%date{HH:mm:ss} - %message%newline" />
16 </layout> 20 </layout>
@@ -19,15 +23,32 @@
19 <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 23 <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
20 <file value="Robust.log" /> 24 <file value="Robust.log" />
21 <appendToFile value="true" /> 25 <appendToFile value="true" />
26 <filter type="log4net.Filter.LoggerMatchFilter">
27 <loggerToMatch value="special"/>
28 <acceptOnMatch value="false"/>
29 </filter>
22 <layout type="log4net.Layout.PatternLayout"> 30 <layout type="log4net.Layout.PatternLayout">
23 <conversionPattern value="%date %-5level - %logger %message%newline" /> 31 <conversionPattern value="%date %-5level - %logger %message%newline" />
24 </layout> 32 </layout>
25 </appender> 33 </appender>
26 34
35 <appender name="StatsLogFileAppender" type="log4net.Appender.FileAppender">
36 <file value="RobustStats.log"/>
37 <appendToFile value="true" />
38 <layout type="log4net.Layout.PatternLayout">
39 <conversionPattern value="%date - %message%newline" />
40 </layout>
41 </appender>
42
27 <root> 43 <root>
28 <level value="DEBUG" /> 44 <level value="DEBUG" />
29 <appender-ref ref="Console" /> 45 <appender-ref ref="Console" />
30 <appender-ref ref="LogFileAppender" /> 46 <appender-ref ref="LogFileAppender" />
31 </root> 47 </root>
48
49 <!-- used for stats recording -->
50 <logger name="special.StatsLogger">
51 <appender-ref ref="StatsLogFileAppender"/>
52 </logger>
32 </log4net> 53 </log4net>
33</configuration> 54</configuration>
diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example
index d932ce7..de6fc28 100644
--- a/bin/Robust.ini.example
+++ b/bin/Robust.ini.example
@@ -13,19 +13,21 @@
13; * [[<ConfigName>@]<port>/]<dll name>[:<class name>] 13; * [[<ConfigName>@]<port>/]<dll name>[:<class name>]
14; * 14; *
15[Startup] 15[Startup]
16 16 ; Place to create a PID file
17 ; Plugin Registry Location 17 ; If no path if specified then a PID file is not created.
18 ; Set path to directory for plugin registry. Information 18 ; PIDFile = "/tmp/my.pid"
19 ; about the registered repositories and installed plugins 19
20 ; will be stored here 20 ; Plugin Registry Location
21 ; The Robust.exe process must hvae R/W access to the location 21 ; Set path to directory for plugin registry. Information
22 RegistryLocation = "." 22 ; about the registered repositories and installed plugins
23 23 ; will be stored here
24 24 ; The Robust.exe process must have R/W access to the location
25 ; Modular configurations 25 RegistryLocation = "."
26 ; Set path to directory for modular ini files... 26
27 ; The Robust.exe process must hvae R/W access to the location 27 ; Modular configurations
28 ConfigDirectory = "/home/opensim/etc/Configs" 28 ; Set path to directory for modular ini files...
29 ; The Robust.exe process must have R/W access to the location
30 ConfigDirectory = "."
29 31
30[ServiceList] 32[ServiceList]
31AssetServiceConnector = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector" 33AssetServiceConnector = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector"
@@ -49,6 +51,8 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
49;; Uncomment this if you want Groups V2 to work 51;; Uncomment this if you want Groups V2 to work
50;GroupsServiceConnector = "8003/OpenSim.Addons.Groups.dll:GroupsServiceRobustConnector" 52;GroupsServiceConnector = "8003/OpenSim.Addons.Groups.dll:GroupsServiceRobustConnector"
51 53
54;; Uncomment for UserProfiles see [UserProfilesService] to configure...
55; UserProfilesServiceConnector = "8002/OpenSim.Server.Handlers.dll:UserProfilesConnector"
52 56
53; * This is common for all services, it's the network setup for the entire 57; * This is common for all services, it's the network setup for the entire
54; * server instance, if none is specified above 58; * server instance, if none is specified above
@@ -128,8 +132,24 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
128 ;; Next, we can specify properties of regions, including default and fallback regions 132 ;; Next, we can specify properties of regions, including default and fallback regions
129 ;; The syntax is: Region_<RegionName> = "<flags>" 133 ;; The syntax is: Region_<RegionName> = "<flags>"
130 ;; or: Region_<RegionID> = "<flags>" 134 ;; or: Region_<RegionID> = "<flags>"
131 ;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut,Reservation,NoMove,Authenticate 135 ;; where <flags> can be DefaultRegion, DefaultHGRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut, Reservation, NoMove, Authenticate
132 ;; For example: 136 ;;
137 ;; DefaultRegion If a local login cannot be placed in the required region (e.g. home region does not exist, avatar is not allowed entry, etc.)
138 ;; then this region becomes the destination. Only the first online default region will be used. If no DefaultHGRegion
139 ;; is specified then this will also be used as the region for hypergrid connections that require it (commonly because they have not specified
140 ;; an explicit region.
141 ;;
142 ;; DefaultHGRegion If an avatar connecting via the hypergrid does not specify a region, then they are placed here. Only the first online
143 ;; region will be used.
144 ;;
145 ;; FallbackRegion If the DefaultRegion is not available for a local login, then any FallbackRegions are tried instead. These are tried in the
146 ;; order specified. This only applies to local logins at this time, not Hypergrid connections.
147 ;;
148 ;; NoDirectLogin A hypergrid user cannot directly connect to this region. This does not apply to local logins.
149 ;;
150 ;; Persistent When the simulator is shutdown, the region is signalled as offline but left registered on the grid.
151 ;;
152 ;; Example specification:
133 ; Region_Welcome_Area = "DefaultRegion, FallbackRegion" 153 ; Region_Welcome_Area = "DefaultRegion, FallbackRegion"
134 ; (replace spaces with underscore) 154 ; (replace spaces with underscore)
135 155
@@ -270,6 +290,9 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
270 ; Ask co-operative viewers to use a different currency name 290 ; Ask co-operative viewers to use a different currency name
271 ;Currency = "" 291 ;Currency = ""
272 292
293 ;; Set minimum fee to publish classified
294 ; ClassifiedFee = 0
295
273 WelcomeMessage = "Welcome, Avatar!" 296 WelcomeMessage = "Welcome, Avatar!"
274 AllowRemoteSetLoginLevel = "false" 297 AllowRemoteSetLoginLevel = "false"
275 298
@@ -286,6 +309,12 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
286 ; For V2/V3 webapp authentication SSO 309 ; For V2/V3 webapp authentication SSO
287 ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/" 310 ; OpenIDServerURL = "http://127.0.0.1/openid/openidserver/"
288 311
312 ; For V3 destination guide
313 ; DestinationGuide = "http://127.0.0.1/guide"
314
315 ; For V3 avatar picker (( work in progress ))
316 ; AvatarPicker = "http://127.0.0.1/avatars"
317
289 ; If you run this login server behind a proxy, set this to true 318 ; If you run this login server behind a proxy, set this to true
290 ; HasProxy = false 319 ; HasProxy = false
291 320
@@ -383,4 +412,13 @@ MapGetServiceConnector = "8002/OpenSim.Server.Handlers.dll:MapGetServiceConnecto
383 ; password help: optional: page providing password assistance for users of your grid 412 ; password help: optional: page providing password assistance for users of your grid
384 ;password = http://127.0.0.1/password 413 ;password = http://127.0.0.1/password
385 414
415[UserProfilesService]
416 LocalServiceModule = "OpenSim.Services.UserProfilesService.dll:UserProfilesService"
417 Enabled = false
418 ;; Configure this for separate profiles database
419 ;; ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;Old Guids=true;"
420 ;; Realm = UserProfiles
421 UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService
422 AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
423
386 424
diff --git a/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2 b/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2
new file mode 100644
index 0000000..8186d49
--- /dev/null
+++ b/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2
Binary files differ
diff --git a/bin/assets/TexturesAssetSet/TexturesAssetSet.xml b/bin/assets/TexturesAssetSet/TexturesAssetSet.xml
index a4a0cba..a29ac38 100644
--- a/bin/assets/TexturesAssetSet/TexturesAssetSet.xml
+++ b/bin/assets/TexturesAssetSet/TexturesAssetSet.xml
@@ -746,4 +746,16 @@
746 <Key Name="assetType" Value="0" /> 746 <Key Name="assetType" Value="0" />
747 <Key Name="fileName" Value="735198cf-6ea0-2550-e222-21d3c6a341ae.j2c" /> 747 <Key Name="fileName" Value="735198cf-6ea0-2550-e222-21d3c6a341ae.j2c" />
748 </Section> 748 </Section>
749
750 <!--
751 Texture expected by viewers for properly displaying stars in the night sky
752 Name derives from label in viewer code
753 -->
754 <Section Name="IMG_BLOOM1 Texture">
755 <Key Name="assetID" Value="3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"/>
756 <Key Name="name" Value="IMG_BLOOM1 Texture"/>
757 <Key Name="assetType" Value="0" />
758 <Key Name="fileName" Value="IMG_BLOOM1.jp2" />
759 </Section>
760
749</Nini> 761</Nini>
diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini
index cb3a5c8..1837bdd 100644
--- a/bin/config-include/Grid.ini
+++ b/bin/config-include/Grid.ini
@@ -23,12 +23,24 @@
23 InventoryAccessModule = "BasicInventoryAccessModule" 23 InventoryAccessModule = "BasicInventoryAccessModule"
24 LandServices = "RemoteLandServicesConnector" 24 LandServices = "RemoteLandServicesConnector"
25 MapImageService = "MapImageServiceModule" 25 MapImageService = "MapImageServiceModule"
26 SearchModule = "BasicSearchModule"
26 27
27 LandServiceInConnector = true 28 LandServiceInConnector = true
28 NeighbourServiceInConnector = true 29 NeighbourServiceInConnector = true
29 SimulationServiceInConnector = true 30 SimulationServiceInConnector = true
30 LibraryModule = true 31 LibraryModule = true
31 32
33[SimulationService]
34 ; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
35 ; It is used to control the teleport handoff process.
36 ; Valid values are
37 ; "SIMULATION/0.2"
38 ; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
39 ; - this protocol is more efficient than "SIMULATION/0.1"
40 ; "SIMULATION/0.1"
41 ; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
42 ConnectorProtocolVersion = "SIMULATION/0.2"
43
32[SimulationDataStore] 44[SimulationDataStore]
33 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 45 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
34 46
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index d12ea5b..920a691 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -205,3 +205,12 @@
205 ; DisallowResidents -- only Admins and Managers allowed 205 ; DisallowResidents -- only Admins and Managers allowed
206 ; Example: 206 ; Example:
207 ; Region_Test_1 = "DisallowForeigners" 207 ; Region_Test_1 = "DisallowForeigners"
208
209
210;; Uncomment if you are using SimianGrid for grid services
211[SimianGrid]
212 ;; SimianGrid services URL
213 ;; SimianServiceURL = "http://grid.sciencesim.com/Grid/"
214
215 ;; Capability assigned by the grid administrator for the simulator
216 ;; SimulatorCapability = "00000000-0000-0000-0000-000000000000" \ No newline at end of file
diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini
index 31a4059..7edcafb 100644
--- a/bin/config-include/GridHypergrid.ini
+++ b/bin/config-include/GridHypergrid.ini
@@ -28,6 +28,7 @@
28 FriendsModule = "HGFriendsModule" 28 FriendsModule = "HGFriendsModule"
29 MapImageService = "MapImageServiceModule" 29 MapImageService = "MapImageServiceModule"
30 UserManagementModule = "HGUserManagementModule" 30 UserManagementModule = "HGUserManagementModule"
31 SearchModule = "BasicSearchModule"
31 32
32 LandServiceInConnector = true 33 LandServiceInConnector = true
33 NeighbourServiceInConnector = true 34 NeighbourServiceInConnector = true
diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini
index ba72fe7..7b7beb2 100644
--- a/bin/config-include/Standalone.ini
+++ b/bin/config-include/Standalone.ini
@@ -19,12 +19,24 @@
19 EntityTransferModule = "BasicEntityTransferModule" 19 EntityTransferModule = "BasicEntityTransferModule"
20 InventoryAccessModule = "BasicInventoryAccessModule" 20 InventoryAccessModule = "BasicInventoryAccessModule"
21 MapImageService = "MapImageServiceModule" 21 MapImageService = "MapImageServiceModule"
22 SearchModule = "BasicSearchModule"
22 23
23 LibraryModule = true 24 LibraryModule = true
24 LLLoginServiceInConnector = true 25 LLLoginServiceInConnector = true
25 GridInfoServiceInConnector = true 26 GridInfoServiceInConnector = true
26 MapImageServiceInConnector = true 27 MapImageServiceInConnector = true
27 28
29[SimulationService]
30 ; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
31 ; It is used to control the teleport handoff process.
32 ; Valid values are
33 ; "SIMULATION/0.2"
34 ; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
35 ; - this protocol is more efficient than "SIMULATION/0.1"
36 ; "SIMULATION/0.1"
37 ; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
38 ConnectorProtocolVersion = "SIMULATION/0.2"
39
28[SimulationDataStore] 40[SimulationDataStore]
29 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" 41 LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
30 42
diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example
index f80044e..f7545d4 100644
--- a/bin/config-include/StandaloneCommon.ini.example
+++ b/bin/config-include/StandaloneCommon.ini.example
@@ -81,11 +81,27 @@
81 ;; Next, we can specify properties of regions, including default and fallback regions 81 ;; Next, we can specify properties of regions, including default and fallback regions
82 ;; The syntax is: Region_<RegioName> = "<flags>" 82 ;; The syntax is: Region_<RegioName> = "<flags>"
83 ;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut 83 ;; where <flags> can be DefaultRegion, FallbackRegion, NoDirectLogin, Persistent, LockedOut
84 ;;
85 ;; DefaultRegion If a local login cannot be placed in the required region (e.g. home region does not exist, avatar is not allowed entry, etc.)
86 ;; then this region becomes the destination. Only the first online default region will be used. If no DefaultHGRegion
87 ;; is specified then this will also be used as the region for hypergrid connections that require it (commonly because they have not specified
88 ;; an explicit region.
89 ;;
90 ;; DefaultHGRegion If an avatar connecting via the hypergrid does not specify a region, then they are placed here. Only the first online
91 ;; region will be used.
92 ;;
93 ;; FallbackRegion If the DefaultRegion is not available for a local login, then any FallbackRegions are tried instead. These are tried in the
94 ;; order specified. This only applies to local logins at this time, not Hypergrid connections.
95 ;;
96 ;; NoDirectLogin A hypergrid user cannot directly connect to this region. This does not apply to local logins.
97 ;;
98 ;; Persistent When the simulator is shutdown, the region is signalled as offline but left registered on the grid.
99 ;;
84 ;; For example: 100 ;; For example:
85 Region_Welcome_Area = "DefaultRegion, FallbackRegion" 101 Region_Welcome_Area = "DefaultRegion, FallbackRegion"
86 102
87 ; === HG ONLY === 103 ; === HG ONLY ===
88 ;; If you have this set under [Startup], no need to set it here, leave it commented 104 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
89 ; GatekeeperURI="http://127.0.0.1:9000" 105 ; GatekeeperURI="http://127.0.0.1:9000"
90 106
91[LibraryModule] 107[LibraryModule]
@@ -94,7 +110,7 @@
94 110
95[LoginService] 111[LoginService]
96 WelcomeMessage = "Welcome, Avatar!" 112 WelcomeMessage = "Welcome, Avatar!"
97 ;; If you have Gatekeeper set under [Startup], no need to set it here, leave it commented 113 ;; If you have Gatekeeper set under [Hypergrid], no need to set it here, leave it commented
98 ; GatekeeperURI = "http://127.0.0.1:9000" 114 ; GatekeeperURI = "http://127.0.0.1:9000"
99 115
100 SRV_HomeURI = "http://127.0.0.1:9000" 116 SRV_HomeURI = "http://127.0.0.1:9000"
@@ -115,6 +131,9 @@
115 ;; Ask co-operative viewers to use a different currency name 131 ;; Ask co-operative viewers to use a different currency name
116 ;Currency = "" 132 ;Currency = ""
117 133
134 ;; Set minimum fee to publish classified
135 ; ClassifiedFee = 0
136
118 ;; Regular expressions for controlling which client versions are accepted/denied. 137 ;; Regular expressions for controlling which client versions are accepted/denied.
119 ;; An empty string means nothing is checked. 138 ;; An empty string means nothing is checked.
120 ;; 139 ;;
@@ -240,7 +259,7 @@
240;; HG configurations 259;; HG configurations
241;; 260;;
242[GatekeeperService] 261[GatekeeperService]
243 ;; If you have GatekeeperURI set under [Startup], no need to set it here, leave it commented 262 ;; If you have GatekeeperURI set under [Hypergrid], no need to set it here, leave it commented
244 ; ExternalName = "http://127.0.0.1:9000" 263 ; ExternalName = "http://127.0.0.1:9000"
245 264
246 ; Does this grid allow incoming links to any region in it? 265 ; Does this grid allow incoming links to any region in it?
@@ -297,11 +316,11 @@
297 ; AllowExcept_Level_200 = "http://griefer.com:8002, http://enemy.com:8002" 316 ; AllowExcept_Level_200 = "http://griefer.com:8002, http://enemy.com:8002"
298 317
299[HGInventoryService] 318[HGInventoryService]
300 ;; If you have this set under [Startup], no need to set it here, leave it commented 319 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
301 ; HomeURI = "http://127.0.0.1:9000" 320 ; HomeURI = "http://127.0.0.1:9000"
302 321
303[HGAssetService] 322[HGAssetService]
304 ;; If you have this set under [Startup], no need to set it here, leave it commented 323 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
305 ; HomeURI = "http://127.0.0.1:9000" 324 ; HomeURI = "http://127.0.0.1:9000"
306 325
307 ;; The asset types that this grid can export to / import from other grids. 326 ;; The asset types that this grid can export to / import from other grids.
@@ -318,7 +337,7 @@
318 337
319 338
320[HGInventoryAccessModule] 339[HGInventoryAccessModule]
321 ;; If you have these set under [Startup], no need to set it here, leave it commented 340 ;; If you have these set under [Hypergrid], no need to set it here, leave it commented
322 ; HomeURI = "http://127.0.0.1:9000" 341 ; HomeURI = "http://127.0.0.1:9000"
323 ; GatekeeperURI = "http://127.0.0.1:9000" 342 ; GatekeeperURI = "http://127.0.0.1:9000"
324 343
@@ -337,7 +356,7 @@
337 356
338[Messaging] 357[Messaging]
339 ; === HG ONLY === 358 ; === HG ONLY ===
340 ;; If you have this set under [Startup], no need to set it here, leave it commented 359 ;; If you have this set under [Hypergrid], no need to set it here, leave it commented
341 ; GatekeeperURI = "http://127.0.0.1:9000" 360 ; GatekeeperURI = "http://127.0.0.1:9000"
342 361
343 362
@@ -352,3 +371,19 @@
352 ;; If appearance is restricted, which accounts' appearances are allowed to be exported? 371 ;; If appearance is restricted, which accounts' appearances are allowed to be exported?
353 ;; Comma-separated list of account names 372 ;; Comma-separated list of account names
354 AccountForAppearance = "Test User, Astronaut Smith" 373 AccountForAppearance = "Test User, Astronaut Smith"
374
375;; UserProfiles Service
376;;
377;; To use, set Enabled to true then configure for your site...
378[UserProfilesService]
379 LocalServiceModule = "OpenSim.Services.UserProfilesService.dll:UserProfilesService"
380 Enabled = false
381
382 ;; Configure this for separate databse
383 ; ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;Old Guids=true;"
384 ; Realm = UserProfiles
385
386 UserAccountService = OpenSim.Services.UserAccountService.dll:UserAccountService
387 AuthenticationServiceModule = "OpenSim.Services.AuthenticationService.dll:PasswordAuthenticationService"
388
389
diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini
index 195e780..3abf49b 100644
--- a/bin/config-include/StandaloneHypergrid.ini
+++ b/bin/config-include/StandaloneHypergrid.ini
@@ -19,11 +19,13 @@
19 GridUserServices = "LocalGridUserServicesConnector" 19 GridUserServices = "LocalGridUserServicesConnector"
20 SimulationServices = "RemoteSimulationConnectorModule" 20 SimulationServices = "RemoteSimulationConnectorModule"
21 AvatarServices = "LocalAvatarServicesConnector" 21 AvatarServices = "LocalAvatarServicesConnector"
22 UserProfilesServices = "LocalUserProfilesServicesConnector"
22 MapImageService = "MapImageServiceModule" 23 MapImageService = "MapImageServiceModule"
23 EntityTransferModule = "HGEntityTransferModule" 24 EntityTransferModule = "HGEntityTransferModule"
24 InventoryAccessModule = "HGInventoryAccessModule" 25 InventoryAccessModule = "HGInventoryAccessModule"
25 FriendsModule = "HGFriendsModule" 26 FriendsModule = "HGFriendsModule"
26 UserManagementModule = "HGUserManagementModule" 27 UserManagementModule = "HGUserManagementModule"
28 SearchModule = "BasicSearchModule"
27 29
28 InventoryServiceInConnector = true 30 InventoryServiceInConnector = true
29 AssetServiceInConnector = true 31 AssetServiceInConnector = true
@@ -55,8 +57,6 @@
55 HypergridAssetService = "OpenSim.Services.Connectors.dll:HGAssetServiceConnector" 57 HypergridAssetService = "OpenSim.Services.Connectors.dll:HGAssetServiceConnector"
56 58
57[InventoryService] 59[InventoryService]
58 LocalServiceModule = "OpenSim.Services.InventoryService.dll:XInventoryService"
59
60 ; For HGInventoryBroker 60 ; For HGInventoryBroker
61 LocalGridInventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService" 61 LocalGridInventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
62 62
@@ -147,6 +147,9 @@
147 FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService" 147 FriendsService = "OpenSim.Services.FriendsService.dll:FriendsService"
148 UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService" 148 UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
149 149
150 ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 to show a default "Ruth" avatar rather than a cloud.
151 CreateDefaultAvatarEntries = true
152
150 153
151;; The interface that local users get when they are in other grids 154;; The interface that local users get when they are in other grids
152;; This greatly restricts the inventory operations while in other grids 155;; This greatly restricts the inventory operations while in other grids
@@ -183,7 +186,6 @@
183 UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService" 186 UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
184 InGatekeeper = True 187 InGatekeeper = True
185 188
186
187;; This should always be the very last thing on this file 189;; This should always be the very last thing on this file
188[Includes] 190[Includes]
189 Include-Common = "config-include/StandaloneCommon.ini" 191 Include-Common = "config-include/StandaloneCommon.ini"
diff --git a/bin/data/LICENSE-README-IMPORTANT.txt b/bin/data/LICENSE-README-IMPORTANT.txt
index a1ac20c..dd8671d 100644
--- a/bin/data/LICENSE-README-IMPORTANT.txt
+++ b/bin/data/LICENSE-README-IMPORTANT.txt
@@ -2,4 +2,4 @@ Not all of the files in this directory are licensed under the BSD license. Some
2 2
3These files are: 3These files are:
4 4
5- avataranimations.xml (Derivative work of viewerart.ini, Creative Commons Attribution+Share-Alike v2.5 License) 5- avataranimations.xml (Derivative work of viewerart.ini, Creative Commons Attribution+Share-Alike v2.5 License)
diff --git a/bin/lib32/BulletSim.dll b/bin/lib32/BulletSim.dll
index 689b34f..bc0e222 100755
--- a/bin/lib32/BulletSim.dll
+++ b/bin/lib32/BulletSim.dll
Binary files differ
diff --git a/bin/lib32/libBulletSim.dylib b/bin/lib32/libBulletSim.dylib
new file mode 100755
index 0000000..02f8a7f
--- /dev/null
+++ b/bin/lib32/libBulletSim.dylib
Binary files differ
diff --git a/bin/lib32/libBulletSim.so b/bin/lib32/libBulletSim.so
index b8c813e..e09dd27 100755
--- a/bin/lib32/libBulletSim.so
+++ b/bin/lib32/libBulletSim.so
Binary files differ
diff --git a/bin/lib64/BulletSim.dll b/bin/lib64/BulletSim.dll
index 33c4d08..5fc09f6 100755
--- a/bin/lib64/BulletSim.dll
+++ b/bin/lib64/BulletSim.dll
Binary files differ
diff --git a/bin/lib64/libBulletSim.so b/bin/lib64/libBulletSim.so
index 79207fe..925269d 100755
--- a/bin/lib64/libBulletSim.so
+++ b/bin/lib64/libBulletSim.so
Binary files differ
diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so
new file mode 100644
index 0000000..193eca4
--- /dev/null
+++ b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so
Binary files differ
diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so
new file mode 100644
index 0000000..7a9bdfc
--- /dev/null
+++ b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so
Binary files differ
diff --git a/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib
new file mode 100644
index 0000000..91f7264
--- /dev/null
+++ b/bin/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib
Binary files differ
diff --git a/bin/pCampBot.ini.example b/bin/pCampBot.ini.example
new file mode 100644
index 0000000..2952bb0
--- /dev/null
+++ b/bin/pCampBot.ini.example
@@ -0,0 +1,19 @@
1; This is the example config file for pCampbot
2; To use it, copy this file to pCampbot.ini and change settings if required
3
4[BotManager]
5 ; Number of milliseconds to wait between bot logins
6 LoginDelay = 5000
7
8[Bot]
9 ; Control whether bots should regularly send agent updates
10 ; Not doing this will reduce CPU requirements for pCampbot but greatly
11 ; reduce the realism compared to viewers which are constantly sending AgentUpdates UDP packets.
12 ; Defaults to true.
13 SendAgentUpdates = true
14
15 ; Control whether bots will requests textures when receiving object information
16 ; Not doing this will reduce CPU requirements for pCampbot but greatly
17 ; reduce the realism compared to viewers which requests such texture data if not already cached.
18 ; Defaults to true.
19 RequestObjectTextures = true
diff --git a/prebuild.xml b/prebuild.xml
index 20b9c9d..87c07a7 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -157,6 +157,7 @@
157 <Reference name="System"/> 157 <Reference name="System"/>
158 <Reference name="System.Core"/> 158 <Reference name="System.Core"/>
159 <Reference name="log4net" path="../../../bin/"/> 159 <Reference name="log4net" path="../../../bin/"/>
160 <Reference name="Nini" path="../../../bin/"/>
160 <Reference name="OpenMetaverseTypes" path="../../../bin/"/> 161 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
161 <Reference name="OpenMetaverse" path="../../../bin/"/> 162 <Reference name="OpenMetaverse" path="../../../bin/"/>
162 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/> 163 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
@@ -282,6 +283,7 @@
282 <Reference name="System.Data"/> 283 <Reference name="System.Data"/>
283 <Reference name="XMLRPC" path="../../bin/"/> 284 <Reference name="XMLRPC" path="../../bin/"/>
284 <Reference name="OpenMetaverse" path="../../bin/"/> 285 <Reference name="OpenMetaverse" path="../../bin/"/>
286 <Reference name="OpenMetaverse.StructuredData" path="../../bin/"/>
285 <Reference name="OpenMetaverseTypes" path="../../bin/"/> 287 <Reference name="OpenMetaverseTypes" path="../../bin/"/>
286 <Reference name="OpenSim.Framework"/> 288 <Reference name="OpenSim.Framework"/>
287 <Reference name="log4net" path="../../bin/"/> 289 <Reference name="log4net" path="../../bin/"/>
@@ -862,6 +864,7 @@
862 <Reference name="Mono.Addins.Setup" path="../../../bin/"/> 864 <Reference name="Mono.Addins.Setup" path="../../../bin/"/>
863 <Reference name="OpenSim.Framework"/> 865 <Reference name="OpenSim.Framework"/>
864 <Reference name="OpenSim.Framework.Console"/> 866 <Reference name="OpenSim.Framework.Console"/>
867 <Reference name="OpenSim.Framework.Monitoring"/>
865 <Reference name="OpenSim.Framework.Servers"/> 868 <Reference name="OpenSim.Framework.Servers"/>
866 <Reference name="OpenSim.Framework.Servers.HttpServer"/> 869 <Reference name="OpenSim.Framework.Servers.HttpServer"/>
867 <Reference name="Nini" path="../../../bin/"/> 870 <Reference name="Nini" path="../../../bin/"/>
@@ -985,8 +988,10 @@
985 <Reference name="Mono.Addins" path="../../../bin/"/> 988 <Reference name="Mono.Addins" path="../../../bin/"/>
986 <Reference name="OpenSim.Data"/> 989 <Reference name="OpenSim.Data"/>
987 <Reference name="OpenSim.Framework"/> 990 <Reference name="OpenSim.Framework"/>
991 <Reference name="OpenSim.Capabilities"/>
988 <Reference name="OpenSim.Framework.Communications"/> 992 <Reference name="OpenSim.Framework.Communications"/>
989 <Reference name="OpenSim.Framework.Console"/> 993 <Reference name="OpenSim.Framework.Console"/>
994 <Reference name="OpenSim.Framework.Servers.HttpServer"/>
990 <Reference name="OpenSim.Region.Framework"/> 995 <Reference name="OpenSim.Region.Framework"/>
991 <Reference name="OpenSim.Server.Base"/> 996 <Reference name="OpenSim.Server.Base"/>
992 <Reference name="OpenSim.Services.Base"/> 997 <Reference name="OpenSim.Services.Base"/>
@@ -1360,6 +1365,42 @@
1360 </Files> 1365 </Files>
1361 </Project> 1366 </Project>
1362 1367
1368 <Project frameworkVersion="v3_5" name="OpenSim.Services.UserProfilesService" path="OpenSim/Services/UserProfilesService" type="Library">
1369 <Configuration name="Debug">
1370 <Options>
1371 <OutputPath>../../../bin/</OutputPath>
1372 </Options>
1373 </Configuration>
1374 <Configuration name="Release">
1375 <Options>
1376 <OutputPath>../../../bin/</OutputPath>
1377 </Options>
1378 </Configuration>
1379
1380 <ReferencePath>../../../bin/</ReferencePath>
1381 <Reference name="System"/>
1382 <Reference name="System.Core"/>
1383 <Reference name="OpenSim.Framework"/>
1384 <Reference name="OpenSim.Framework.Console"/>
1385 <Reference name="OpenSim.Framework.Servers.HttpServer"/>
1386 <Reference name="OpenSim.Services.UserAccountService"/>
1387 <Reference name="OpenSim.Services.Interfaces"/>
1388 <Reference name="OpenSim.Services.Connectors"/>
1389 <Reference name="OpenSim.Services.Base"/>
1390 <Reference name="OpenSim.Server.Base"/>
1391 <Reference name="OpenSim.Data"/>
1392 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
1393 <Reference name="OpenMetaverse" path="../../../bin/"/>
1394 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
1395 <Reference name="Nini" path="../../../bin/"/>
1396 <Reference name="log4net" path="../../../bin/"/>
1397
1398 <Files>
1399 <Match pattern="*.cs" recurse="true"/>
1400 </Files>
1401 </Project>
1402
1403
1363 <Project frameworkVersion="v3_5" name="OpenSim.Server.Handlers" path="OpenSim/Server/Handlers" type="Library"> 1404 <Project frameworkVersion="v3_5" name="OpenSim.Server.Handlers" path="OpenSim/Server/Handlers" type="Library">
1364 <Configuration name="Debug"> 1405 <Configuration name="Debug">
1365 <Options> 1406 <Options>
@@ -1563,6 +1604,7 @@
1563 <Reference name="System.Drawing"/> 1604 <Reference name="System.Drawing"/>
1564 <Reference name="System.Xml"/> 1605 <Reference name="System.Xml"/>
1565 <Reference name="System.Web"/> 1606 <Reference name="System.Web"/>
1607 <Reference name="NDesk.Options" path="../../../../../bin/"/>
1566 <Reference name="OpenMetaverseTypes" path="../../../../../bin/"/> 1608 <Reference name="OpenMetaverseTypes" path="../../../../../bin/"/>
1567 <Reference name="OpenMetaverse.StructuredData" path="../../../../../bin/"/> 1609 <Reference name="OpenMetaverse.StructuredData" path="../../../../../bin/"/>
1568 <Reference name="OpenMetaverse" path="../../../../../bin/"/> 1610 <Reference name="OpenMetaverse" path="../../../../../bin/"/>
@@ -1760,6 +1802,7 @@
1760 <Reference name="System.Xml"/> 1802 <Reference name="System.Xml"/>
1761 <Reference name="System.Drawing"/> 1803 <Reference name="System.Drawing"/>
1762 <Reference name="System.Web"/> 1804 <Reference name="System.Web"/>
1805 <Reference name="Ionic.Zip" path="../../../bin/"/>
1763 <Reference name="NDesk.Options" path="../../../bin/"/> 1806 <Reference name="NDesk.Options" path="../../../bin/"/>
1764 <Reference name="OpenMetaverseTypes" path="../../../bin/"/> 1807 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
1765 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/> 1808 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
@@ -1879,6 +1922,7 @@
1879 <Reference name="OpenSim.Region.CoreModules"/> 1922 <Reference name="OpenSim.Region.CoreModules"/>
1880 <Reference name="OpenSim.Framework.Console"/> 1923 <Reference name="OpenSim.Framework.Console"/>
1881 <Reference name="OpenSim.Region.Physics.Manager"/> 1924 <Reference name="OpenSim.Region.Physics.Manager"/>
1925 <Reference name="OpenSim.Region.Physics.Meshing" path="../../../../bin/Physics/"/>
1882 <Reference name="OpenSim.Region.Physics.ConvexDecompositionDotNet"/> 1926 <Reference name="OpenSim.Region.Physics.ConvexDecompositionDotNet"/>
1883 <Reference name="BulletXNA.dll" path="../../../../bin/"/> 1927 <Reference name="BulletXNA.dll" path="../../../../bin/"/>
1884 <Reference name="log4net.dll" path="../../../../bin/"/> 1928 <Reference name="log4net.dll" path="../../../../bin/"/>
@@ -2102,6 +2146,7 @@
2102 <Reference name="OpenSim.Data"/> 2146 <Reference name="OpenSim.Data"/>
2103 <Reference name="OpenMetaverseTypes" path="../../../bin/"/> 2147 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
2104 <Reference name="OpenMetaverse" path="../../../bin/"/> 2148 <Reference name="OpenMetaverse" path="../../../bin/"/>
2149 <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
2105 <Reference name="MySql.Data" path="../../../bin/"/> 2150 <Reference name="MySql.Data" path="../../../bin/"/>
2106 <Reference name="OpenSim.Framework.Console"/> 2151 <Reference name="OpenSim.Framework.Console"/>
2107 <Reference name="OpenSim.Region.Framework"/> 2152 <Reference name="OpenSim.Region.Framework"/>
@@ -2713,6 +2758,33 @@
2713 </Project> 2758 </Project>
2714 2759
2715 <!-- Test Clients --> 2760 <!-- Test Clients -->
2761 <Project frameworkVersion="v3_5" name="OpenSim.Tests.Clients.AssetClient" path="OpenSim/Tests/Clients/Assets" type="Exe">
2762 <Configuration name="Debug">
2763 <Options>
2764 <OutputPath>../../../../bin/</OutputPath>
2765 </Options>
2766 </Configuration>
2767 <Configuration name="Release">
2768 <Options>
2769 <OutputPath>../../../../bin/</OutputPath>
2770 </Options>
2771 </Configuration>
2772
2773 <ReferencePath>../../../../bin/</ReferencePath>
2774 <Reference name="System"/>
2775 <Reference name="OpenMetaverseTypes" path="../../../../bin/"/>
2776 <Reference name="OpenMetaverse" path="../../../../bin/"/>
2777 <Reference name="OpenSim.Framework"/>
2778 <Reference name="OpenSim.Services.Interfaces"/>
2779 <Reference name="OpenSim.Services.Connectors"/>
2780 <Reference name="Nini" path="../../../../bin/"/>
2781 <Reference name="log4net" path="../../../../bin/"/>
2782
2783 <Files>
2784 <Match pattern="*.cs" recurse="true"/>
2785 </Files>
2786 </Project>
2787
2716 <Project frameworkVersion="v3_5" name="OpenSim.Tests.Clients.GridClient" path="OpenSim/Tests/Clients/Grid" type="Exe"> 2788 <Project frameworkVersion="v3_5" name="OpenSim.Tests.Clients.GridClient" path="OpenSim/Tests/Clients/Grid" type="Exe">
2717 <Configuration name="Debug"> 2789 <Configuration name="Debug">
2718 <Options> 2790 <Options>
@@ -3181,7 +3253,10 @@
3181 <Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/> 3253 <Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/>
3182 <Match path="Avatar/Friends/Tests" pattern="*.cs" recurse="true"/> 3254 <Match path="Avatar/Friends/Tests" pattern="*.cs" recurse="true"/>
3183 <Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/> 3255 <Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
3256 <Match path="Avatar/Inventory/Transfer/Tests" pattern="*.cs" recurse="true"/>
3184 <Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/> 3257 <Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
3258 <Match path="Framework/UserManagement/Tests" pattern="*.cs" recurse="true"/>
3259 <Match path="Scripting/HttpRequest/Tests" pattern="*.cs" recurse="true"/>
3185 <Match path="Scripting/VectorRender/Tests" pattern="*.cs" recurse="true"/> 3260 <Match path="Scripting/VectorRender/Tests" pattern="*.cs" recurse="true"/>
3186 <Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/> 3261 <Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
3187 <Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/> 3262 <Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/>
@@ -3277,6 +3352,7 @@
3277 <Reference name="System.Runtime.Remoting"/> 3352 <Reference name="System.Runtime.Remoting"/>
3278 <Reference name="OpenMetaverseTypes" path="../../../bin/"/> 3353 <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
3279 <Reference name="OpenMetaverse" path="../../../bin/"/> 3354 <Reference name="OpenMetaverse" path="../../../bin/"/>
3355 <Reference name="OpenSim.Capabilities"/>
3280 <Reference name="OpenSim.Data"/> 3356 <Reference name="OpenSim.Data"/>
3281 <Reference name="OpenSim.Framework"/> 3357 <Reference name="OpenSim.Framework"/>
3282 <Reference name="OpenSim.Framework.Communications"/> 3358 <Reference name="OpenSim.Framework.Communications"/>