From 057ac49619dd4119bb4db973024b4aa29cd5356f Mon Sep 17 00:00:00 2001 From: Madpeterz <57852827+Madpeterz@users.noreply.github.com> Date: Sun, 14 Feb 2021 01:21:35 +0000 Subject: [PATCH] oh god the pain --- .dockerignore | 46 +- .github/ISSUE_TEMPLATE/bug_report.md | 66 +- .github/ISSUE_TEMPLATE/feature_request.md | 40 +- .github/workflows/dotnetcore.yml | 50 +- BSBshared/BSBshared.csproj | 24 - BetterSecondBot.sln | 126 +- BetterSecondBot.sln.DotSettings | 4 - CLI/BetterSecondBot.csproj | 47 - .../PublishProfiles/Linux-x64.pubxml | 18 - .../PublishProfiles/Windows-64bit.pubxml | 18 - Core/BSB.csproj | 31 - Dockerfile | 146 +- .../BetterRelayService/BetterRelay.cs | 0 .../BetterSecondbot/BetterSecondbot.cs | 0 .../BetterSecondbot/BetterSecondbot.csproj | 23 + .../BetterSecondbot}/CliDocker.cs | 0 .../BetterSecondbot}/CliExitOnLogout.cs | 0 .../BetterSecondbot}/CliHardware.cs | 0 .../DiscordSupervisor/ChannelControl.cs | 0 .../DiscordSupervisor/Discord-super.cs | 0 .../DiscordSupervisor/DiscordBot.cs | 0 .../DiscordSupervisor/DiscordEvents.cs | 0 .../DiscordTTS/DiscordTTS.cs | 0 .../DiscordSupervisor/Functions.cs | 0 .../DiscordSupervisor/Inbound.cs | 6 +- .../DiscordSupervisor/Status.cs | 0 .../DiscordSupervisor/Values.cs | 0 .../DiscordSupervisor/relay.cs | 0 Secondbot/BetterSecondbot/Dockerfile | 72 + .../BetterSecondbot}/HttpService/Chat.cs | 0 .../BetterSecondbot}/HttpService/Core.cs | 0 .../BetterSecondbot}/HttpService/Group.cs | 0 .../HttpService/HttpAsService.cs | 0 .../BetterSecondbot}/HttpService/Im.cs | 0 .../BetterSecondbot}/HttpService/Inventory.cs | 0 .../HttpService/ParcelEstate.cs | 0 .../Properties/launchSettings.json | 18 +- .../BetterSecondbot}/WikiMake/wiki_footer.txt | 20 +- .../BetterSecondbot}/WikiMake/wiki_header.txt | 0 .../BetterSecondbot}/WikiMake/wikimake.cs | 4 +- .../Core}/Commands/Animation/PlayGesture.cs | 0 .../Commands/Animation/addToAnimations.cs | 0 .../Commands/Animation/resetAnimations.cs | 0 .../Core}/Commands/Avatars/NearMe.cs | 0 .../Core}/Commands/Avatars/PayAvatar.cs | 0 .../Core}/Commands/Chat/LocalChatHistory.cs | 0 {Core => Secondbot/Core}/Commands/Chat/im.cs | 0 {Core => Secondbot/Core}/Commands/Chat/say.cs | 0 .../Core}/Commands/Dialogs/DialogRelay.cs | 0 .../Core}/Commands/Dialogs/DialogResponce.cs | 0 .../Core}/Commands/Dialogs/DialogTrack.cs | 0 .../Core}/Commands/DiscordAPI/AddRole.cs | 0 .../Core}/Commands/DiscordAPI/Ban_Member.cs | 0 .../Commands/DiscordAPI/BulkClear_Messages.cs | 0 .../Core}/Commands/DiscordAPI/Dm_Member.cs | 0 .../Core}/Commands/DiscordAPI/MembersList.cs | 0 .../Commands/DiscordAPI/MessageChannel.cs | 0 .../Core}/Commands/DiscordAPI/MuteMember.cs | 0 .../Core}/Commands/DiscordAPI/RoleCreate.cs | 0 .../Core}/Commands/DiscordAPI/RoleList.cs | 0 .../Core}/Commands/DiscordAPI/RoleRemove.cs | 0 .../Commands/DiscordAPI/Role_GetSettings.cs | 0 .../Commands/DiscordAPI/Role_UpdatePerms.cs | 0 .../Commands/DiscordAPI/TextChannels_List.cs | 0 .../Commands/Estate/EstateParcelReclaim.cs | 0 .../Core}/Commands/Estate/GetSimGlobalPos.cs | 0 .../Core}/Commands/Estate/GetSimTexture.cs | 0 .../Core}/Commands/Estate/SimMessage.cs | 0 .../Core}/Commands/Estate/SimRestart.cs | 0 .../Core}/Commands/Friends/FriendFullPerms.cs | 0 .../Core}/Commands/Friends/FriendRequest.cs | 0 .../Core}/Commands/Friends/Friendslist.cs | 0 .../Core}/Commands/Group/GroupActiveGroup.cs | 0 .../Core}/Commands/Group/GroupActiveTitle.cs | 0 .../Core}/Commands/Group/GroupAddRole.cs | 0 .../Core}/Commands/Group/GroupEject.cs | 0 .../Core}/Commands/Group/GroupInvite.cs | 0 .../Commands/Group/GroupInviteNoLimiter.cs | 0 .../Core}/Commands/Group/GroupNotice.cs | 0 .../Core}/Commands/Group/IsGroupMember.cs | 0 .../Core}/Commands/Group/getGroupList.cs | 0 .../Core}/Commands/Group/getGroupMembers.cs | 0 .../Core}/Commands/Group/getGroupRoles.cs | 0 .../Core}/Commands/Group/group.cs | 0 .../Core}/Commands/Group/groupchat.cs | 0 .../Commands/Group/groupchatAnyUnread.cs | 0 .../Core}/Commands/Group/groupchatClearAll.cs | 0 .../Commands/Group/groupchatGroupHasUnread.cs | 0 .../Core}/Commands/Group/groupchatHistory.cs | 0 .../Group/groupchatListAllUnreadGroups.cs | 0 .../Core}/Commands/Helpers/delay.cs | 0 .../Core}/Commands/Home/GoHome.cs | 0 .../Core}/Commands/Home/resetAtHome.cs | 0 .../Core}/Commands/Info/Balance.cs | 0 .../Core}/Commands/Info/GetPosition.cs | 0 .../Core}/Commands/Info/ParcelName.cs | 0 .../Core}/Commands/Info/SimName.cs | 0 .../Core}/Commands/Info/UnixTimeNow.cs | 0 .../Commands/Inventory/DeleteInventory.cs | 0 .../Inventory/InventoryPurgeNotecards.cs | 0 .../Commands/Inventory/RenameInventory.cs | 0 .../Core}/Commands/Inventory/attach.cs | 0 .../Core}/Commands/Inventory/getRealUUID.cs | 0 .../Commands/Inventory/inventoryContents.cs | 0 .../Commands/Inventory/inventoryFolders.cs | 0 .../Core}/Commands/Inventory/outfit.cs | 0 .../Core}/Commands/Inventory/sendFolder.cs | 0 .../Core}/Commands/Inventory/sendItem.cs | 0 .../Core}/Commands/Movement/AutoPilot.cs | 0 .../Core}/Commands/Movement/AutoPilotStop.cs | 0 .../Core}/Commands/Movement/Fly.cs | 0 .../Commands/Movement/RequestTeleport.cs | 0 .../Core}/Commands/Movement/RotateToFace.cs | 0 .../Commands/Movement/RotateToFaceVector.cs | 0 .../Commands/Movement/SendTeleportLure.cs | 0 .../Core}/Commands/Movement/rotateTo.cs | 0 .../Core}/Commands/Movement/teleport.cs | 0 .../Core}/Commands/Notecard/notecardAdd.cs | 0 .../Core}/Commands/Notecard/notecardClear.cs | 0 .../Core}/Commands/Notecard/notecardSend.cs | 0 .../Core}/Commands/Parcel/AbandonLand.cs | 0 .../Core}/Commands/Parcel/GetParcelBanlist.cs | 0 .../Core}/Commands/Parcel/GetParcelDesc.cs | 0 .../Core}/Commands/Parcel/GetParcelFlags.cs | 0 .../Core}/Commands/Parcel/ParcelBan.cs | 0 .../Core}/Commands/Parcel/ParcelBuy.cs | 0 .../Commands/Parcel/ParcelCleanAndSell.cs | 0 .../Commands/Parcel/ParcelCommandHelper.cs | 0 .../Commands/Parcel/ParcelDeedToGroup.cs | 0 .../Core}/Commands/Parcel/ParcelFreeze.cs | 0 .../Commands/Parcel/ParcelPrimCountAvatar.cs | 0 .../Commands/Parcel/ParcelPrimCountTotal.cs | 0 .../Commands/Parcel/ParcelReturnObjects.cs | 0 .../Commands/Parcel/ParcelReturnTargeted.cs | 0 .../Core}/Commands/Parcel/ParcelSetMedia.cs | 0 .../Core}/Commands/Parcel/SetParcelDesc.cs | 0 .../Core}/Commands/Parcel/SetParcelFlag.cs | 0 .../Core}/Commands/Parcel/SetParcelMusic.cs | 0 .../Core}/Commands/Parcel/SetParcelName.cs | 0 .../Core}/Commands/Parcel/SetParcelSale.cs | 0 .../Core}/Commands/Parcel/eject.cs | 0 .../Core}/Commands/Prims/RezObject.cs | 0 .../Prims/TransferInventoryToObject.cs | 0 .../Core}/Commands/Prims/UnRezObject.cs | 0 .../Core}/Commands/Script/scriptHttp.cs | 0 .../Core}/Commands/Script/scriptSend.cs | 0 .../Core}/Commands/Self/CickObject.cs | 0 .../Core}/Commands/Self/GetLastCommands.cs | 0 .../Core}/Commands/Self/Help.cs | 0 .../Core}/Commands/Self/PayObject.cs | 0 .../Core}/Commands/Self/SetPermFlag.cs | 0 .../Core}/Commands/Self/botVersion.cs | 0 .../Core}/Commands/Self/logout.cs | 0 .../Core}/Commands/Self/pointAt.cs | 0 {Core => Secondbot/Core}/Commands/Self/sit.cs | 0 .../Core}/Commands/Self/stand.cs | 0 .../Commands/StreamAdmin/FetchNextNotecard.cs | 0 .../Core}/Commands/commandlib.cs | 4 +- Secondbot/Core/Core.csproj | 18 + .../Core}/RLV/Blacklist/getblacklist.cs | 0 .../Core}/RLV/Blacklist/versionnumbl.cs | 0 .../Core}/RLV/Camera/camavdist.cs | 0 .../Core}/RLV/Camera/camdistmax.cs | 0 .../Core}/RLV/Camera/camdistmin.cs | 0 .../Core}/RLV/Camera/camdrawalphamax.cs | 0 .../Core}/RLV/Camera/camdrawalphamin.cs | 0 .../Core}/RLV/Camera/camdrawcolor.cs | 0 .../Core}/RLV/Camera/camdrawmax.cs | 0 .../Core}/RLV/Camera/camdrawmin.cs | 0 .../Core}/RLV/Camera/camtextures.cs | 0 .../Core}/RLV/Camera/camunlock.cs | 0 .../Core}/RLV/Camera/camzoommax.cs | 0 .../Core}/RLV/Camera/camzoommin.cs | 0 .../Core}/RLV/Camera/getcam_avdistmax.cs | 0 .../Core}/RLV/Camera/getcam_avdistmin.cs | 0 .../Core}/RLV/Camera/getcam_fov.cs | 0 .../Core}/RLV/Camera/getcam_fovmax.cs | 0 .../Core}/RLV/Camera/getcam_fovmin.cs | 0 .../Core}/RLV/Camera/getcam_zoommin.cs | 0 .../Core}/RLV/Camera/setcam_avdistmax.cs | 0 .../Core}/RLV/Camera/setcam_avdistmin.cs | 0 .../Core}/RLV/Camera/setcam_fov.cs | 0 .../Core}/RLV/Camera/setcam_fovmax.cs | 0 .../Core}/RLV/Camera/setcam_fovmin.cs | 0 .../Core}/RLV/Camera/setcam_textures.cs | 0 .../Core}/RLV/Camera/setcam_unlock.cs | 0 .../Core}/RLV/Chat/chatnormal.cs | 0 .../Core}/RLV/Chat/chatshout.cs | 0 .../Core}/RLV/Chat/chatwhisper.cs | 0 {Core => Secondbot/Core}/RLV/Chat/recvchat.cs | 0 .../Core}/RLV/Chat/recvchat_sec.cs | 0 .../Core}/RLV/Chat/recvchatfrom.cs | 0 .../Core}/RLV/Chat/redirchat.cs | 0 {Core => Secondbot/Core}/RLV/Chat/sendchat.cs | 0 .../Core}/RLV/Chat/sendgesture.cs | 0 {Core => Secondbot/Core}/RLV/Emotes/emote.cs | 0 .../Core}/RLV/Emotes/recvemote.cs | 0 .../Core}/RLV/Emotes/recvemote_sec.cs | 0 .../Core}/RLV/Emotes/rediremote.cs | 0 .../Core}/RLV/InstantMessages/sendim.cs | 0 .../Core}/RLV/InstantMessages/sendim_sec.cs | 0 .../Core}/RLV/Miscellaneous/clear.cs | 0 .../Core}/RLV/Miscellaneous/getstatus.cs | 0 .../Core}/RLV/Miscellaneous/getstatusall.cs | 0 .../Core}/RLV/Miscellaneous/notify.cs | 0 .../Core}/RLV/Miscellaneous/permissive.cs | 0 .../Core}/RLV/Movement/adjustheight.cs | 0 .../Core}/RLV/Movement/alwaysrun.cs | 0 {Core => Secondbot/Core}/RLV/Movement/fly.cs | 0 .../Core}/RLV/Movement/setrot.cs | 0 .../Core}/RLV/Movement/temprun.cs | 0 .../Core}/RLV/PrivateChannels/sendchannel.cs | 0 .../RLV/PrivateChannels/sendchannel_except.cs | 0 .../RLV/PrivateChannels/sendchannel_sec.cs | 0 .../Core}/RLV/RLV_commandlib.cs | 4 +- .../Core}/RLV/Sitting/getsitid.cs | 0 {Core => Secondbot/Core}/RLV/Sitting/sit.cs | 0 {Core => Secondbot/Core}/RLV/Sitting/unsit.cs | 0 .../Core}/RLV/Version/version.cs | 0 .../Core}/RLV/Version/versionnew.cs | 0 .../Core}/RLV/Version/versionnum.cs | 0 {Core => Secondbot/Core}/Static/Inventory.cs | 0 {Core => Secondbot/Core}/Static/parcel.cs | 0 .../Core}/bottypes/AVstorageBot.cs | 0 .../Core}/bottypes/ActionsAutoAcceptBot.cs | 0 .../Core}/bottypes/AnimationsBot.cs | 0 .../Core}/bottypes/AwaitReplyEventBot.cs | 0 .../Core}/bottypes/CommandsBot.cs | 4 +- .../Core}/bottypes/DialogsBot.cs | 0 .../Core}/bottypes/EventsBot.cs | 0 .../Core}/bottypes/Log2FileBot.cs | 0 .../Core}/bottypes/MessageSwitcherBot.cs | 0 {Core => Secondbot/Core}/bottypes/RLVbot.cs | 2 +- .../Core}/bottypes/SecondBot.cs | 0 .../Core}/bottypes/VirtualsBot.cs | 0 {Core => Secondbot/Core}/bottypes/athome.cs | 0 .../Core}/bottypes/chatrelay.cs | 0 .../Core}/bottypes/loadorder.txt | 0 .../Shared}/API/API_interface.cs | 14 +- .../Shared}/BotTypes/BasicBot.cs | 0 .../Shared}/IO/SimpleIO.cs | 0 .../Shared}/Json/JsonConfig.cs | 0 .../Shared}/Json/JsonConfigApi.cs | 0 Secondbot/Shared/Shared.csproj | 18 + .../Shared}/Staic/Helpers.cs | 0 .../Shared}/Staic/LogFormater.cs | 0 .../LibreMetaverse.StructuredData.XML | 317 + .../LibreMetaverse.StructuredData.csproj | 91 + .../LibreMetaverse.StructuredData.nuspec | 15 + .../LibreMetaverse/LibreMetaverse.XML | 36652 ++++++++++++++++ .../LibreMetaverse/LibreMetaverse.csproj | 98 + .../LibreMetaverse/LibreMetaverse.nuspec | 15 + .../CRC32.cs | 0 .../Color4.cs | 0 .../DoubleDictionary.cs | 0 .../Enums.cs | 0 .../EnumsPrimitive.cs | 0 .../ExpiringCache.cs | 0 .../LibreMetaverse.Types.csproj | 85 + .../LibreMetaverseTypes.XML | 2583 ++ .../LibreMetaverseTypes.nuspec | 15 + .../Matrix4.cs | 0 .../Quaternion.cs | 0 .../ThreadSafeDictionary.cs | 0 .../TokenBucket.cs | 0 .../UUID.cs | 0 .../Utils.cs | 0 .../UtilsConversions.cs | 0 .../Vector2.cs | 0 .../Vector3.cs | 0 .../Vector3d.cs | 0 .../Vector4.cs | 0 .../LibreMetaverse-core.StructuredData.csproj | 33 - .../LibreMetaverse-core.Types.csproj | 31 - .../Libremetaverse/Imaging/BakeLayer.cs | 3 + .../Libremetaverse/Imaging/TGALoader.cs | 3 +- .../Libremetaverse/InventoryAISClient.cs | 7 +- .../Libremetaverse/InventoryManager.cs | 1 - .../Libremetaverse/LibreMetaverse-core.csproj | 62 - .../Libremetaverse/LibreMetaverse-core.nuspec | 15 - libremetaverse-core/Libremetaverse/Logger.cs | 349 +- .../Libremetaverse/ObjectManager.cs | 2 +- .../Libremetaverse/Settings.cs | 25 +- ...ibopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so | Bin 140028 -> 0 bytes ...openjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so | Bin 149368 -> 0 bytes .../libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib | Bin 130560 -> 0 bytes .../Libremetaverse/openjpeg-dotnet-x86_64.dll | Bin 215040 -> 0 bytes .../Libremetaverse/openjpeg-dotnet.dll | Bin 201216 -> 0 bytes libremetaverse-core/libremetaverse-core.sln | 44 - 289 files changed, 40446 insertions(+), 823 deletions(-) delete mode 100644 BSBshared/BSBshared.csproj delete mode 100644 BetterSecondBot.sln.DotSettings delete mode 100644 CLI/BetterSecondBot.csproj delete mode 100644 CLI/Properties/PublishProfiles/Linux-x64.pubxml delete mode 100644 CLI/Properties/PublishProfiles/Windows-64bit.pubxml delete mode 100644 Core/BSB.csproj rename {CLI => Secondbot/BetterSecondbot}/BetterRelayService/BetterRelay.cs (100%) rename CLI/Cli.cs => Secondbot/BetterSecondbot/BetterSecondbot.cs (100%) create mode 100644 Secondbot/BetterSecondbot/BetterSecondbot.csproj rename {CLI => Secondbot/BetterSecondbot}/CliDocker.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/CliExitOnLogout.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/CliHardware.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/ChannelControl.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/Discord-super.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/DiscordBot.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/DiscordEvents.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/DiscordTTS/DiscordTTS.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/Functions.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/Inbound.cs (96%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/Status.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/Values.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/DiscordSupervisor/relay.cs (100%) create mode 100644 Secondbot/BetterSecondbot/Dockerfile rename {CLI => Secondbot/BetterSecondbot}/HttpService/Chat.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/Core.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/Group.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/HttpAsService.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/Im.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/Inventory.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/HttpService/ParcelEstate.cs (100%) rename {CLI => Secondbot/BetterSecondbot}/Properties/launchSettings.json (76%) rename {CLI => Secondbot/BetterSecondbot}/WikiMake/wiki_footer.txt (97%) rename {CLI => Secondbot/BetterSecondbot}/WikiMake/wiki_header.txt (100%) rename {CLI => Secondbot/BetterSecondbot}/WikiMake/wikimake.cs (98%) rename {Core => Secondbot/Core}/Commands/Animation/PlayGesture.cs (100%) rename {Core => Secondbot/Core}/Commands/Animation/addToAnimations.cs (100%) rename {Core => Secondbot/Core}/Commands/Animation/resetAnimations.cs (100%) rename {Core => Secondbot/Core}/Commands/Avatars/NearMe.cs (100%) rename {Core => Secondbot/Core}/Commands/Avatars/PayAvatar.cs (100%) rename {Core => Secondbot/Core}/Commands/Chat/LocalChatHistory.cs (100%) rename {Core => Secondbot/Core}/Commands/Chat/im.cs (100%) rename {Core => Secondbot/Core}/Commands/Chat/say.cs (100%) rename {Core => Secondbot/Core}/Commands/Dialogs/DialogRelay.cs (100%) rename {Core => Secondbot/Core}/Commands/Dialogs/DialogResponce.cs (100%) rename {Core => Secondbot/Core}/Commands/Dialogs/DialogTrack.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/AddRole.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/Ban_Member.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/BulkClear_Messages.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/Dm_Member.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/MembersList.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/MessageChannel.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/MuteMember.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/RoleCreate.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/RoleList.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/RoleRemove.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/Role_GetSettings.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/Role_UpdatePerms.cs (100%) rename {Core => Secondbot/Core}/Commands/DiscordAPI/TextChannels_List.cs (100%) rename {Core => Secondbot/Core}/Commands/Estate/EstateParcelReclaim.cs (100%) rename {Core => Secondbot/Core}/Commands/Estate/GetSimGlobalPos.cs (100%) rename {Core => Secondbot/Core}/Commands/Estate/GetSimTexture.cs (100%) rename {Core => Secondbot/Core}/Commands/Estate/SimMessage.cs (100%) rename {Core => Secondbot/Core}/Commands/Estate/SimRestart.cs (100%) rename {Core => Secondbot/Core}/Commands/Friends/FriendFullPerms.cs (100%) rename {Core => Secondbot/Core}/Commands/Friends/FriendRequest.cs (100%) rename {Core => Secondbot/Core}/Commands/Friends/Friendslist.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupActiveGroup.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupActiveTitle.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupAddRole.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupEject.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupInvite.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupInviteNoLimiter.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/GroupNotice.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/IsGroupMember.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/getGroupList.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/getGroupMembers.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/getGroupRoles.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/group.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchat.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchatAnyUnread.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchatClearAll.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchatGroupHasUnread.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchatHistory.cs (100%) rename {Core => Secondbot/Core}/Commands/Group/groupchatListAllUnreadGroups.cs (100%) rename {Core => Secondbot/Core}/Commands/Helpers/delay.cs (100%) rename {Core => Secondbot/Core}/Commands/Home/GoHome.cs (100%) rename {Core => Secondbot/Core}/Commands/Home/resetAtHome.cs (100%) rename {Core => Secondbot/Core}/Commands/Info/Balance.cs (100%) rename {Core => Secondbot/Core}/Commands/Info/GetPosition.cs (100%) rename {Core => Secondbot/Core}/Commands/Info/ParcelName.cs (100%) rename {Core => Secondbot/Core}/Commands/Info/SimName.cs (100%) rename {Core => Secondbot/Core}/Commands/Info/UnixTimeNow.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/DeleteInventory.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/InventoryPurgeNotecards.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/RenameInventory.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/attach.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/getRealUUID.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/inventoryContents.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/inventoryFolders.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/outfit.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/sendFolder.cs (100%) rename {Core => Secondbot/Core}/Commands/Inventory/sendItem.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/AutoPilot.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/AutoPilotStop.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/Fly.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/RequestTeleport.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/RotateToFace.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/RotateToFaceVector.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/SendTeleportLure.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/rotateTo.cs (100%) rename {Core => Secondbot/Core}/Commands/Movement/teleport.cs (100%) rename {Core => Secondbot/Core}/Commands/Notecard/notecardAdd.cs (100%) rename {Core => Secondbot/Core}/Commands/Notecard/notecardClear.cs (100%) rename {Core => Secondbot/Core}/Commands/Notecard/notecardSend.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/AbandonLand.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/GetParcelBanlist.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/GetParcelDesc.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/GetParcelFlags.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelBan.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelBuy.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelCleanAndSell.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelCommandHelper.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelDeedToGroup.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelFreeze.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelPrimCountAvatar.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelPrimCountTotal.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelReturnObjects.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelReturnTargeted.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/ParcelSetMedia.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/SetParcelDesc.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/SetParcelFlag.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/SetParcelMusic.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/SetParcelName.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/SetParcelSale.cs (100%) rename {Core => Secondbot/Core}/Commands/Parcel/eject.cs (100%) rename {Core => Secondbot/Core}/Commands/Prims/RezObject.cs (100%) rename {Core => Secondbot/Core}/Commands/Prims/TransferInventoryToObject.cs (100%) rename {Core => Secondbot/Core}/Commands/Prims/UnRezObject.cs (100%) rename {Core => Secondbot/Core}/Commands/Script/scriptHttp.cs (100%) rename {Core => Secondbot/Core}/Commands/Script/scriptSend.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/CickObject.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/GetLastCommands.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/Help.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/PayObject.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/SetPermFlag.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/botVersion.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/logout.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/pointAt.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/sit.cs (100%) rename {Core => Secondbot/Core}/Commands/Self/stand.cs (100%) rename {Core => Secondbot/Core}/Commands/StreamAdmin/FetchNextNotecard.cs (100%) rename {Core => Secondbot/Core}/Commands/commandlib.cs (99%) create mode 100644 Secondbot/Core/Core.csproj rename {Core => Secondbot/Core}/RLV/Blacklist/getblacklist.cs (100%) rename {Core => Secondbot/Core}/RLV/Blacklist/versionnumbl.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camavdist.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdistmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdistmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdrawalphamax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdrawalphamin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdrawcolor.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdrawmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camdrawmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camtextures.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camunlock.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camzoommax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/camzoommin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_avdistmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_avdistmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_fov.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_fovmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_fovmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/getcam_zoommin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_avdistmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_avdistmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_fov.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_fovmax.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_fovmin.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_textures.cs (100%) rename {Core => Secondbot/Core}/RLV/Camera/setcam_unlock.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/chatnormal.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/chatshout.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/chatwhisper.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/recvchat.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/recvchat_sec.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/recvchatfrom.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/redirchat.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/sendchat.cs (100%) rename {Core => Secondbot/Core}/RLV/Chat/sendgesture.cs (100%) rename {Core => Secondbot/Core}/RLV/Emotes/emote.cs (100%) rename {Core => Secondbot/Core}/RLV/Emotes/recvemote.cs (100%) rename {Core => Secondbot/Core}/RLV/Emotes/recvemote_sec.cs (100%) rename {Core => Secondbot/Core}/RLV/Emotes/rediremote.cs (100%) rename {Core => Secondbot/Core}/RLV/InstantMessages/sendim.cs (100%) rename {Core => Secondbot/Core}/RLV/InstantMessages/sendim_sec.cs (100%) rename {Core => Secondbot/Core}/RLV/Miscellaneous/clear.cs (100%) rename {Core => Secondbot/Core}/RLV/Miscellaneous/getstatus.cs (100%) rename {Core => Secondbot/Core}/RLV/Miscellaneous/getstatusall.cs (100%) rename {Core => Secondbot/Core}/RLV/Miscellaneous/notify.cs (100%) rename {Core => Secondbot/Core}/RLV/Miscellaneous/permissive.cs (100%) rename {Core => Secondbot/Core}/RLV/Movement/adjustheight.cs (100%) rename {Core => Secondbot/Core}/RLV/Movement/alwaysrun.cs (100%) rename {Core => Secondbot/Core}/RLV/Movement/fly.cs (100%) rename {Core => Secondbot/Core}/RLV/Movement/setrot.cs (100%) rename {Core => Secondbot/Core}/RLV/Movement/temprun.cs (100%) rename {Core => Secondbot/Core}/RLV/PrivateChannels/sendchannel.cs (100%) rename {Core => Secondbot/Core}/RLV/PrivateChannels/sendchannel_except.cs (100%) rename {Core => Secondbot/Core}/RLV/PrivateChannels/sendchannel_sec.cs (100%) rename {Core => Secondbot/Core}/RLV/RLV_commandlib.cs (98%) rename {Core => Secondbot/Core}/RLV/Sitting/getsitid.cs (100%) rename {Core => Secondbot/Core}/RLV/Sitting/sit.cs (100%) rename {Core => Secondbot/Core}/RLV/Sitting/unsit.cs (100%) rename {Core => Secondbot/Core}/RLV/Version/version.cs (100%) rename {Core => Secondbot/Core}/RLV/Version/versionnew.cs (100%) rename {Core => Secondbot/Core}/RLV/Version/versionnum.cs (100%) rename {Core => Secondbot/Core}/Static/Inventory.cs (100%) rename {Core => Secondbot/Core}/Static/parcel.cs (100%) rename {Core => Secondbot/Core}/bottypes/AVstorageBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/ActionsAutoAcceptBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/AnimationsBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/AwaitReplyEventBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/CommandsBot.cs (99%) rename {Core => Secondbot/Core}/bottypes/DialogsBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/EventsBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/Log2FileBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/MessageSwitcherBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/RLVbot.cs (99%) rename {Core => Secondbot/Core}/bottypes/SecondBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/VirtualsBot.cs (100%) rename {Core => Secondbot/Core}/bottypes/athome.cs (100%) rename {Core => Secondbot/Core}/bottypes/chatrelay.cs (100%) rename {Core => Secondbot/Core}/bottypes/loadorder.txt (100%) rename {BSBshared => Secondbot/Shared}/API/API_interface.cs (92%) rename {BSBshared => Secondbot/Shared}/BotTypes/BasicBot.cs (100%) rename {BSBshared => Secondbot/Shared}/IO/SimpleIO.cs (100%) rename {BSBshared => Secondbot/Shared}/Json/JsonConfig.cs (100%) rename {BSBshared => Secondbot/Shared}/Json/JsonConfigApi.cs (100%) create mode 100644 Secondbot/Shared/Shared.csproj rename {BSBshared => Secondbot/Shared}/Staic/Helpers.cs (100%) rename {BSBshared => Secondbot/Shared}/Staic/LogFormater.cs (100%) create mode 100644 libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.XML create mode 100644 libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj create mode 100644 libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.nuspec create mode 100644 libremetaverse-core/LibreMetaverse/LibreMetaverse.XML create mode 100644 libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj create mode 100644 libremetaverse-core/LibreMetaverse/LibreMetaverse.nuspec rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/CRC32.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Color4.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/DoubleDictionary.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Enums.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/EnumsPrimitive.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/ExpiringCache.cs (100%) create mode 100644 libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj create mode 100644 libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.XML create mode 100644 libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.nuspec rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Matrix4.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Quaternion.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/ThreadSafeDictionary.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/TokenBucket.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/UUID.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Utils.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/UtilsConversions.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Vector2.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Vector3.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Vector3d.cs (100%) rename libremetaverse-core/{Libremetaverse.types => LibreMetaverseTypes}/Vector4.cs (100%) delete mode 100644 libremetaverse-core/Libremetaverse.structureddata/LibreMetaverse-core.StructuredData.csproj delete mode 100644 libremetaverse-core/Libremetaverse.types/LibreMetaverse-core.Types.csproj delete mode 100644 libremetaverse-core/Libremetaverse/LibreMetaverse-core.csproj delete mode 100644 libremetaverse-core/Libremetaverse/LibreMetaverse-core.nuspec delete mode 100644 libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so delete mode 100644 libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1-x86_64.so delete mode 100644 libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib delete mode 100644 libremetaverse-core/Libremetaverse/openjpeg-dotnet-x86_64.dll delete mode 100644 libremetaverse-core/Libremetaverse/openjpeg-dotnet.dll delete mode 100644 libremetaverse-core/libremetaverse-core.sln diff --git a/.dockerignore b/.dockerignore index ce59afa..f493380 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,24 +1,24 @@ -**/.classpath -**/.dockerignore -**/.env -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/azds.yaml -**/bin -**/charts -**/docker-compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -LICENSE +**/.classpath +**/.dockerignore +**/.env +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE README.md \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ecc0dc3..c2a0989 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,33 +1,33 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: Madpeterz - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Hardware (please complete the following information):** - - OS: [e.g. iOS] - - Version [e.g. 22] - - Running in docker: [Yes/No] - - Running as linux service: [Yes/No] - -**Additional context** -Add any other context about the problem here. +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: Madpeterz + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Hardware (please complete the following information):** + - OS: [e.g. iOS] + - Version [e.g. 22] + - Running in docker: [Yes/No] + - Running as linux service: [Yes/No] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 060d091..f94a7d9 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,20 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: Madpeterz - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: Madpeterz + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index f734ea7..c2a722b 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -1,25 +1,25 @@ -name: .NET Core - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 3.1.101 - - name: Install dependencies - run: dotnet restore - - name: Build - run: dotnet build --configuration Release --no-restore - - name: Test - run: dotnet test --no-restore --verbosity normal +name: .NET Core + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 3.1.101 + - name: Install dependencies + run: dotnet restore + - name: Build + run: dotnet build --configuration Release --no-restore + - name: Test + run: dotnet test --no-restore --verbosity normal diff --git a/BSBshared/BSBshared.csproj b/BSBshared/BSBshared.csproj deleted file mode 100644 index 43abe98..0000000 --- a/BSBshared/BSBshared.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - netcoreapp3.1 - Debug;Release;DockerBuild - x64 - - - none - Linux - false - false - false - linux-x64 - - - - - - - - - - - diff --git a/BetterSecondBot.sln b/BetterSecondBot.sln index 6a09d93..db5079f 100644 --- a/BetterSecondBot.sln +++ b/BetterSecondBot.sln @@ -1,108 +1,74 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -VisualStudioVersion = 16.0.29123.88 +VisualStudioVersion = 16.0.30907.101 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BSB", "Core\BSB.csproj", "{077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Secondbot", "Secondbot", "{4388BA41-F3FC-4A0E-AA00-50E9ED45A027}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterSecondBot", "CLI\BetterSecondBot.csproj", "{E34873C1-3860-430A-8AE5-6289C4E68AC7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Metaverse", "Metaverse", "{E9B97D05-D5FB-4CA9-99C3-839248621C21}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BSBshared", "BSBshared\BSBshared.csproj", "{42075C8C-8055-4178-8C12-AE97DAFE8484}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse", "libremetaverse-core\LibreMetaverse\LibreMetaverse.csproj", "{27C70F3A-0000-0000-0000-000000000000}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libmeta-core", "Libmeta-core", "{7538B15D-152B-4A0F-A24D-A89EDC382564}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.StructuredData", "libremetaverse-core\LibreMetaverse.StructuredData\LibreMetaverse.StructuredData.csproj", "{89D7A3E5-0000-0000-0000-000000000000}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B861AB1B-8F09-41A9-8817-CB8A2E961E4C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Types", "libremetaverse-core\LibreMetaverseTypes\LibreMetaverse.Types.csproj", "{B37B02AD-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Secondbot\Shared\Shared.csproj", "{55CFC932-BECF-4FDE-A48A-3C282E080F56}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Secondbot\Core\Core.csproj", "{D19B5D86-4680-4CC0-87BC-07B7BDF83FC0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterSecondbot", "Secondbot\BetterSecondbot\BetterSecondbot.csproj", "{513D7ED1-519E-47C0-BB28-29275BE041DC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Project Items", "Project Items", "{C343303B-F9BF-46B3-BBB5-5596823EC71C}" ProjectSection(SolutionItems) = preProject Dockerfile = Dockerfile NuGet.Config = NuGet.Config README.md = README.md EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core", "libremetaverse-core\Libremetaverse\LibreMetaverse-core.csproj", "{467F6546-8053-4B59-8C4E-65E621B1A0A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core.StructuredData", "libremetaverse-core\Libremetaverse.structureddata\LibreMetaverse-core.StructuredData.csproj", "{67E9D8FC-29C6-470C-90C7-A38B60622133}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core.Types", "libremetaverse-core\Libremetaverse.types\LibreMetaverse-core.Types.csproj", "{69DE5884-FD5F-4040-9C8F-DBADE189902B}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - DockerBuild|Any CPU = DockerBuild|Any CPU - DockerBuild|x64 = DockerBuild|x64 Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Debug|x64.ActiveCfg = Debug|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Debug|x64.Build.0 = Debug|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.DockerBuild|Any CPU.Build.0 = DockerBuild|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Release|Any CPU.Build.0 = Release|Any CPU - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Release|x64.ActiveCfg = Release|x64 - {077DC0CD-6B3D-4BD9-83ED-9E098768AAA8}.Release|x64.Build.0 = Release|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Debug|x64.ActiveCfg = Debug|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Debug|x64.Build.0 = Debug|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.DockerBuild|Any CPU.Build.0 = DockerBuild|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.DockerBuild|x64.ActiveCfg = DockerBuild|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.DockerBuild|x64.Build.0 = DockerBuild|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Release|Any CPU.Build.0 = Release|Any CPU - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Release|x64.ActiveCfg = Release|x64 - {E34873C1-3860-430A-8AE5-6289C4E68AC7}.Release|x64.Build.0 = Release|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Debug|Any CPU.ActiveCfg = Debug|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Debug|x64.ActiveCfg = Debug|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Debug|x64.Build.0 = Debug|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Release|Any CPU.ActiveCfg = Release|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Release|x64.ActiveCfg = Release|x64 - {42075C8C-8055-4178-8C12-AE97DAFE8484}.Release|x64.Build.0 = Release|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Debug|x64.ActiveCfg = Debug|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Debug|x64.Build.0 = Debug|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Release|Any CPU.ActiveCfg = Release|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Release|x64.ActiveCfg = Release|x64 - {467F6546-8053-4B59-8C4E-65E621B1A0A6}.Release|x64.Build.0 = Release|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Debug|Any CPU.ActiveCfg = Debug|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Debug|x64.ActiveCfg = Debug|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Debug|x64.Build.0 = Debug|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Release|Any CPU.ActiveCfg = Release|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Release|x64.ActiveCfg = Release|x64 - {67E9D8FC-29C6-470C-90C7-A38B60622133}.Release|x64.Build.0 = Release|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Debug|Any CPU.ActiveCfg = Debug|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Debug|x64.ActiveCfg = Debug|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Debug|x64.Build.0 = Debug|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.DockerBuild|Any CPU.ActiveCfg = DockerBuild|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Release|Any CPU.ActiveCfg = Release|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Release|x64.ActiveCfg = Release|x64 - {69DE5884-FD5F-4040-9C8F-DBADE189902B}.Release|x64.Build.0 = Release|x64 + {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {55CFC932-BECF-4FDE-A48A-3C282E080F56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55CFC932-BECF-4FDE-A48A-3C282E080F56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55CFC932-BECF-4FDE-A48A-3C282E080F56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55CFC932-BECF-4FDE-A48A-3C282E080F56}.Release|Any CPU.Build.0 = Release|Any CPU + {D19B5D86-4680-4CC0-87BC-07B7BDF83FC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D19B5D86-4680-4CC0-87BC-07B7BDF83FC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D19B5D86-4680-4CC0-87BC-07B7BDF83FC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D19B5D86-4680-4CC0-87BC-07B7BDF83FC0}.Release|Any CPU.Build.0 = Release|Any CPU + {513D7ED1-519E-47C0-BB28-29275BE041DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {513D7ED1-519E-47C0-BB28-29275BE041DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {513D7ED1-519E-47C0-BB28-29275BE041DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {513D7ED1-519E-47C0-BB28-29275BE041DC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {467F6546-8053-4B59-8C4E-65E621B1A0A6} = {7538B15D-152B-4A0F-A24D-A89EDC382564} - {67E9D8FC-29C6-470C-90C7-A38B60622133} = {7538B15D-152B-4A0F-A24D-A89EDC382564} - {69DE5884-FD5F-4040-9C8F-DBADE189902B} = {7538B15D-152B-4A0F-A24D-A89EDC382564} + {27C70F3A-0000-0000-0000-000000000000} = {E9B97D05-D5FB-4CA9-99C3-839248621C21} + {89D7A3E5-0000-0000-0000-000000000000} = {E9B97D05-D5FB-4CA9-99C3-839248621C21} + {B37B02AD-0000-0000-0000-000000000000} = {E9B97D05-D5FB-4CA9-99C3-839248621C21} + {55CFC932-BECF-4FDE-A48A-3C282E080F56} = {4388BA41-F3FC-4A0E-AA00-50E9ED45A027} + {D19B5D86-4680-4CC0-87BC-07B7BDF83FC0} = {4388BA41-F3FC-4A0E-AA00-50E9ED45A027} + {513D7ED1-519E-47C0-BB28-29275BE041DC} = {4388BA41-F3FC-4A0E-AA00-50E9ED45A027} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {39A7E333-AFC1-4BA8-9EBC-9298791FDC78} + SolutionGuid = {EC43F382-FAF2-49CC-8E23-5DDF87592DFA} EndGlobalSection EndGlobal diff --git a/BetterSecondBot.sln.DotSettings b/BetterSecondBot.sln.DotSettings deleted file mode 100644 index f70c8c4..0000000 --- a/BetterSecondBot.sln.DotSettings +++ /dev/null @@ -1,4 +0,0 @@ - - True - True - \ No newline at end of file diff --git a/CLI/BetterSecondBot.csproj b/CLI/BetterSecondBot.csproj deleted file mode 100644 index c3943f3..0000000 --- a/CLI/BetterSecondBot.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - AnyCPU;x64 - - - - - - git rev-parse --short HEAD - False - False - - - Exe - netcoreapp3.1 - BetterSecondBot.Program - Debug;Release;DockerBuild;Windows - Linux - - - none - Linux - false - false - false - linux-x64 - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - diff --git a/CLI/Properties/PublishProfiles/Linux-x64.pubxml b/CLI/Properties/PublishProfiles/Linux-x64.pubxml deleted file mode 100644 index 049c070..0000000 --- a/CLI/Properties/PublishProfiles/Linux-x64.pubxml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - FileSystem - Release - x64 - netcoreapp3.1 - ..\Publish\linux-x64 - linux-x64 - true - True - False - False - - \ No newline at end of file diff --git a/CLI/Properties/PublishProfiles/Windows-64bit.pubxml b/CLI/Properties/PublishProfiles/Windows-64bit.pubxml deleted file mode 100644 index 2e54755..0000000 --- a/CLI/Properties/PublishProfiles/Windows-64bit.pubxml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - FileSystem - Release - x64 - netcoreapp3.1 - ..\Publish\windows_x64 - win-x64 - true - True - False - False - - \ No newline at end of file diff --git a/Core/BSB.csproj b/Core/BSB.csproj deleted file mode 100644 index 559d3b5..0000000 --- a/Core/BSB.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - netcoreapp3.1 - Debug;Release;DockerBuild - x64;AnyCPU - - - none - Linux - false - false - false - linux-x64 - - - none - Linux - false - false - false - linux-x64 - - - - - - - - - diff --git a/Dockerfile b/Dockerfile index 8e92978..9bfa2ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,74 +1,72 @@ -#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. - -FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base -WORKDIR /app - -FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build -WORKDIR /src -COPY ["NuGet.Config", ""] -COPY ["CLI/BetterSecondBot.csproj", "CLI/"] -COPY ["Core/BSB.csproj", "Core/"] -COPY ["BSBshared/BSBshared.csproj", "BSBshared/"] -COPY ["libremetaverse-core/Libremetaverse/LibreMetaverse-core.csproj", "libremetaverse-core/Libremetaverse/"] -COPY ["libremetaverse-core/Libremetaverse.structureddata/LibreMetaverse-core.StructuredData.csproj", "libremetaverse-core/Libremetaverse.structureddata/"] -COPY ["libremetaverse-core/Libremetaverse.types/LibreMetaverse-core.Types.csproj", "libremetaverse-core/Libremetaverse.types/"] -RUN dotnet restore "CLI/BetterSecondBot.csproj" -COPY . . -WORKDIR "/src/CLI" -RUN dotnet build "BetterSecondBot.csproj" -c DockerBuild -o /app/build - -FROM build AS publish -RUN dotnet publish "BetterSecondBot.csproj" -c DockerBuild -o /app/publish - -FROM base AS final -WORKDIR /app -COPY --from=publish /app/publish . - -# --- Update your settings --- - -ENV Basic_BotUserName='' -ENV Basic_BotPassword='' -ENV Basic_HomeRegions='http://maps.secondlife.com/secondlife/Viserion/50/140/23' -ENV Basic_LoginLocation='home' - -ENV Security_MasterUsername='Madpeter Zond' -ENV Security_SubMasters='X X,Y Y,Z Z' -ENV Security_SignedCommandkey='' -ENV Security_WebUIKey='' - -ENV Setting_AllowRLV='false' -ENV Setting_AllowFunds='false' -ENV Setting_LogCommands='false' -ENV Setting_RelayImToAvatarUUID='' -ENV Setting_DefaultSit_UUID='' -ENV Setting_loginURI='secondlife' - -ENV DiscordRelay_URL='' -ENV DiscordRelay_GroupUUID='' -ENV DiscordFull_Enable='false' -ENV DiscordFull_Token='' -ENV DiscordFull_ServerID='' -ENV DiscordFull_Keep_GroupChat='false' - -ENV Http_Enable='false' -ENV Http_Host='docker' - -ENV Name2Key_Enable='false' -ENV Name2Key_Url='http://localhost:1234' -ENV Name2Key_Key='magic' - -ENV DiscordTTS_Enable='false' -ENV DiscordTTS_server_id='' -ENV DiscordTTS_channel_name='' -ENV DiscordTTS_avatar_uuid='' -ENV DiscordTTS_Nickname='' - -ENV Log2File_Enable='false' -ENV Log2File_Level=1 - -EXPOSE 80 -ENV ASPNETCORE_URLS http://+:80 - -# --- End of settings --- - -ENTRYPOINT ["/app/BetterSecondBot"] +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build +WORKDIR /src +COPY ["Secondbot/BetterSecondbot/BetterSecondbot.csproj", "Secondbot/BetterSecondbot/"] +COPY ["Secondbot/Core/Core.csproj", "Secondbot/Core/"] +COPY ["Secondbot/Shared/Shared.csproj", "Secondbot/Shared/"] +COPY ["libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj", "libremetaverse-core/LibreMetaverse/"] +COPY ["libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj", "libremetaverse-core/LibreMetaverse.StructuredData/"] +COPY ["libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj", "libremetaverse-core/LibreMetaverseTypes/"] +RUN dotnet restore "Secondbot/BetterSecondbot/BetterSecondbot.csproj" +COPY . . +WORKDIR "/src/Secondbot/BetterSecondbot" +RUN dotnet build "BetterSecondbot.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "BetterSecondbot.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +# --- Update your settings --- + +ENV Basic_BotUserName='' +ENV Basic_BotPassword='' +ENV Basic_HomeRegions='http://maps.secondlife.com/secondlife/Viserion/50/140/23' +ENV Basic_LoginLocation='home' + +ENV Security_MasterUsername='Madpeter Zond' +ENV Security_SubMasters='X X,Y Y,Z Z' +ENV Security_SignedCommandkey='' +ENV Security_WebUIKey='' + +ENV Setting_AllowRLV='false' +ENV Setting_AllowFunds='false' +ENV Setting_LogCommands='false' +ENV Setting_RelayImToAvatarUUID='' +ENV Setting_DefaultSit_UUID='' +ENV Setting_loginURI='secondlife' + +ENV DiscordRelay_URL='' +ENV DiscordRelay_GroupUUID='' +ENV DiscordFull_Enable='false' +ENV DiscordFull_Token='' +ENV DiscordFull_ServerID='' +ENV DiscordFull_Keep_GroupChat='false' + +ENV Http_Enable='false' +ENV Http_Host='docker' + +ENV Name2Key_Enable='false' +ENV Name2Key_Url='http://localhost:1234' +ENV Name2Key_Key='magic' + +ENV DiscordTTS_Enable='false' +ENV DiscordTTS_server_id='' +ENV DiscordTTS_channel_name='' +ENV DiscordTTS_avatar_uuid='' +ENV DiscordTTS_Nickname='' + +ENV Log2File_Enable='false' +ENV Log2File_Level=1 + +EXPOSE 80 +ENV ASPNETCORE_URLS http://+:80 + +# --- End of settings --- + +ENTRYPOINT ["/app/BetterSecondBot"] \ No newline at end of file diff --git a/CLI/BetterRelayService/BetterRelay.cs b/Secondbot/BetterSecondbot/BetterRelayService/BetterRelay.cs similarity index 100% rename from CLI/BetterRelayService/BetterRelay.cs rename to Secondbot/BetterSecondbot/BetterRelayService/BetterRelay.cs diff --git a/CLI/Cli.cs b/Secondbot/BetterSecondbot/BetterSecondbot.cs similarity index 100% rename from CLI/Cli.cs rename to Secondbot/BetterSecondbot/BetterSecondbot.cs diff --git a/Secondbot/BetterSecondbot/BetterSecondbot.csproj b/Secondbot/BetterSecondbot/BetterSecondbot.csproj new file mode 100644 index 0000000..6cf4d69 --- /dev/null +++ b/Secondbot/BetterSecondbot/BetterSecondbot.csproj @@ -0,0 +1,23 @@ + + + + Exe + netcoreapp3.1 + Linux + ..\.. + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/CLI/CliDocker.cs b/Secondbot/BetterSecondbot/CliDocker.cs similarity index 100% rename from CLI/CliDocker.cs rename to Secondbot/BetterSecondbot/CliDocker.cs diff --git a/CLI/CliExitOnLogout.cs b/Secondbot/BetterSecondbot/CliExitOnLogout.cs similarity index 100% rename from CLI/CliExitOnLogout.cs rename to Secondbot/BetterSecondbot/CliExitOnLogout.cs diff --git a/CLI/CliHardware.cs b/Secondbot/BetterSecondbot/CliHardware.cs similarity index 100% rename from CLI/CliHardware.cs rename to Secondbot/BetterSecondbot/CliHardware.cs diff --git a/CLI/DiscordSupervisor/ChannelControl.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/ChannelControl.cs similarity index 100% rename from CLI/DiscordSupervisor/ChannelControl.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/ChannelControl.cs diff --git a/CLI/DiscordSupervisor/Discord-super.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/Discord-super.cs similarity index 100% rename from CLI/DiscordSupervisor/Discord-super.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/Discord-super.cs diff --git a/CLI/DiscordSupervisor/DiscordBot.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/DiscordBot.cs similarity index 100% rename from CLI/DiscordSupervisor/DiscordBot.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/DiscordBot.cs diff --git a/CLI/DiscordSupervisor/DiscordEvents.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/DiscordEvents.cs similarity index 100% rename from CLI/DiscordSupervisor/DiscordEvents.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/DiscordEvents.cs diff --git a/CLI/DiscordSupervisor/DiscordTTS/DiscordTTS.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/DiscordTTS/DiscordTTS.cs similarity index 100% rename from CLI/DiscordSupervisor/DiscordTTS/DiscordTTS.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/DiscordTTS/DiscordTTS.cs diff --git a/CLI/DiscordSupervisor/Functions.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/Functions.cs similarity index 100% rename from CLI/DiscordSupervisor/Functions.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/Functions.cs diff --git a/CLI/DiscordSupervisor/Inbound.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/Inbound.cs similarity index 96% rename from CLI/DiscordSupervisor/Inbound.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/Inbound.cs index 0dc2435..6af6d3f 100644 --- a/CLI/DiscordSupervisor/Inbound.cs +++ b/Secondbot/BetterSecondbot/DiscordSupervisor/Inbound.cs @@ -307,7 +307,11 @@ namespace BetterSecondBot.DiscordSupervisor { ITextChannel Chan = (ITextChannel)message.Channel; IGuildUser user = await Chan.Guild.GetUserAsync(message.Author.Id).ConfigureAwait(true); - On_MessageEvent(new DiscordMessageEvent(Chan.GuildId, Chan.Id, user.Nickname, message.Content)); + string username = user.Nickname; + if(username == null) { + username = message.Author.Username; + } + On_MessageEvent(new DiscordMessageEvent(Chan.GuildId, Chan.Id, username, message.Content)); if (message.Content.StartsWith("!clear") == true) { await CleanDiscordChannel(Chan, 0, true).ConfigureAwait(false); diff --git a/CLI/DiscordSupervisor/Status.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/Status.cs similarity index 100% rename from CLI/DiscordSupervisor/Status.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/Status.cs diff --git a/CLI/DiscordSupervisor/Values.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/Values.cs similarity index 100% rename from CLI/DiscordSupervisor/Values.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/Values.cs diff --git a/CLI/DiscordSupervisor/relay.cs b/Secondbot/BetterSecondbot/DiscordSupervisor/relay.cs similarity index 100% rename from CLI/DiscordSupervisor/relay.cs rename to Secondbot/BetterSecondbot/DiscordSupervisor/relay.cs diff --git a/Secondbot/BetterSecondbot/Dockerfile b/Secondbot/BetterSecondbot/Dockerfile new file mode 100644 index 0000000..9bfa2ff --- /dev/null +++ b/Secondbot/BetterSecondbot/Dockerfile @@ -0,0 +1,72 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build +WORKDIR /src +COPY ["Secondbot/BetterSecondbot/BetterSecondbot.csproj", "Secondbot/BetterSecondbot/"] +COPY ["Secondbot/Core/Core.csproj", "Secondbot/Core/"] +COPY ["Secondbot/Shared/Shared.csproj", "Secondbot/Shared/"] +COPY ["libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj", "libremetaverse-core/LibreMetaverse/"] +COPY ["libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj", "libremetaverse-core/LibreMetaverse.StructuredData/"] +COPY ["libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj", "libremetaverse-core/LibreMetaverseTypes/"] +RUN dotnet restore "Secondbot/BetterSecondbot/BetterSecondbot.csproj" +COPY . . +WORKDIR "/src/Secondbot/BetterSecondbot" +RUN dotnet build "BetterSecondbot.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "BetterSecondbot.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +# --- Update your settings --- + +ENV Basic_BotUserName='' +ENV Basic_BotPassword='' +ENV Basic_HomeRegions='http://maps.secondlife.com/secondlife/Viserion/50/140/23' +ENV Basic_LoginLocation='home' + +ENV Security_MasterUsername='Madpeter Zond' +ENV Security_SubMasters='X X,Y Y,Z Z' +ENV Security_SignedCommandkey='' +ENV Security_WebUIKey='' + +ENV Setting_AllowRLV='false' +ENV Setting_AllowFunds='false' +ENV Setting_LogCommands='false' +ENV Setting_RelayImToAvatarUUID='' +ENV Setting_DefaultSit_UUID='' +ENV Setting_loginURI='secondlife' + +ENV DiscordRelay_URL='' +ENV DiscordRelay_GroupUUID='' +ENV DiscordFull_Enable='false' +ENV DiscordFull_Token='' +ENV DiscordFull_ServerID='' +ENV DiscordFull_Keep_GroupChat='false' + +ENV Http_Enable='false' +ENV Http_Host='docker' + +ENV Name2Key_Enable='false' +ENV Name2Key_Url='http://localhost:1234' +ENV Name2Key_Key='magic' + +ENV DiscordTTS_Enable='false' +ENV DiscordTTS_server_id='' +ENV DiscordTTS_channel_name='' +ENV DiscordTTS_avatar_uuid='' +ENV DiscordTTS_Nickname='' + +ENV Log2File_Enable='false' +ENV Log2File_Level=1 + +EXPOSE 80 +ENV ASPNETCORE_URLS http://+:80 + +# --- End of settings --- + +ENTRYPOINT ["/app/BetterSecondBot"] \ No newline at end of file diff --git a/CLI/HttpService/Chat.cs b/Secondbot/BetterSecondbot/HttpService/Chat.cs similarity index 100% rename from CLI/HttpService/Chat.cs rename to Secondbot/BetterSecondbot/HttpService/Chat.cs diff --git a/CLI/HttpService/Core.cs b/Secondbot/BetterSecondbot/HttpService/Core.cs similarity index 100% rename from CLI/HttpService/Core.cs rename to Secondbot/BetterSecondbot/HttpService/Core.cs diff --git a/CLI/HttpService/Group.cs b/Secondbot/BetterSecondbot/HttpService/Group.cs similarity index 100% rename from CLI/HttpService/Group.cs rename to Secondbot/BetterSecondbot/HttpService/Group.cs diff --git a/CLI/HttpService/HttpAsService.cs b/Secondbot/BetterSecondbot/HttpService/HttpAsService.cs similarity index 100% rename from CLI/HttpService/HttpAsService.cs rename to Secondbot/BetterSecondbot/HttpService/HttpAsService.cs diff --git a/CLI/HttpService/Im.cs b/Secondbot/BetterSecondbot/HttpService/Im.cs similarity index 100% rename from CLI/HttpService/Im.cs rename to Secondbot/BetterSecondbot/HttpService/Im.cs diff --git a/CLI/HttpService/Inventory.cs b/Secondbot/BetterSecondbot/HttpService/Inventory.cs similarity index 100% rename from CLI/HttpService/Inventory.cs rename to Secondbot/BetterSecondbot/HttpService/Inventory.cs diff --git a/CLI/HttpService/ParcelEstate.cs b/Secondbot/BetterSecondbot/HttpService/ParcelEstate.cs similarity index 100% rename from CLI/HttpService/ParcelEstate.cs rename to Secondbot/BetterSecondbot/HttpService/ParcelEstate.cs diff --git a/CLI/Properties/launchSettings.json b/Secondbot/BetterSecondbot/Properties/launchSettings.json similarity index 76% rename from CLI/Properties/launchSettings.json rename to Secondbot/BetterSecondbot/Properties/launchSettings.json index 1aa4c7c..ec7d149 100644 --- a/CLI/Properties/launchSettings.json +++ b/Secondbot/BetterSecondbot/Properties/launchSettings.json @@ -1,10 +1,10 @@ -{ - "profiles": { - "BetterSecondBot": { - "commandName": "Project" - }, - "Docker": { - "commandName": "Docker" - } - } +{ + "profiles": { + "BetterSecondbot": { + "commandName": "Project" + }, + "Docker": { + "commandName": "Docker" + } + } } \ No newline at end of file diff --git a/CLI/WikiMake/wiki_footer.txt b/Secondbot/BetterSecondbot/WikiMake/wiki_footer.txt similarity index 97% rename from CLI/WikiMake/wiki_footer.txt rename to Secondbot/BetterSecondbot/WikiMake/wiki_footer.txt index dcd1b1f..5939521 100644 --- a/CLI/WikiMake/wiki_footer.txt +++ b/Secondbot/BetterSecondbot/WikiMake/wiki_footer.txt @@ -1,11 +1,11 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/CLI/WikiMake/wiki_header.txt b/Secondbot/BetterSecondbot/WikiMake/wiki_header.txt similarity index 100% rename from CLI/WikiMake/wiki_header.txt rename to Secondbot/BetterSecondbot/WikiMake/wiki_header.txt diff --git a/CLI/WikiMake/wikimake.cs b/Secondbot/BetterSecondbot/WikiMake/wikimake.cs similarity index 98% rename from CLI/WikiMake/wikimake.cs rename to Secondbot/BetterSecondbot/WikiMake/wikimake.cs index 97c05d2..3d381b6 100644 --- a/CLI/WikiMake/wikimake.cs +++ b/Secondbot/BetterSecondbot/WikiMake/wikimake.cs @@ -289,12 +289,12 @@ namespace BetterSecondBot.WikiMake InterfaceWiki("JSON", defaultJson); // CMD - BSB.Commands.CoreCommandsInterface cmd = new BSB.Commands.CoreCommandsInterface(null,true); + BSB.Commands.CoreCommandsInterface cmd = new BSB.Commands.CoreCommandsInterface(null); api_reports.Add("Core", new KeyValuePair(cmd.ApiCommandsCount, "Good")); InterfaceWiki("Core", cmd, true); // RLVapi - BSB.RLV.RLVcontrol RLVapi = new BSB.RLV.RLVcontrol(null,true); + BSB.RLV.RLVcontrol RLVapi = new BSB.RLV.RLVcontrol(null); api_reports.Add("RLVapi", new KeyValuePair(RLVapi.ApiCommandsCount, "Limited")); InterfaceWiki("RLVapi", RLVapi, true); diff --git a/Core/Commands/Animation/PlayGesture.cs b/Secondbot/Core/Commands/Animation/PlayGesture.cs similarity index 100% rename from Core/Commands/Animation/PlayGesture.cs rename to Secondbot/Core/Commands/Animation/PlayGesture.cs diff --git a/Core/Commands/Animation/addToAnimations.cs b/Secondbot/Core/Commands/Animation/addToAnimations.cs similarity index 100% rename from Core/Commands/Animation/addToAnimations.cs rename to Secondbot/Core/Commands/Animation/addToAnimations.cs diff --git a/Core/Commands/Animation/resetAnimations.cs b/Secondbot/Core/Commands/Animation/resetAnimations.cs similarity index 100% rename from Core/Commands/Animation/resetAnimations.cs rename to Secondbot/Core/Commands/Animation/resetAnimations.cs diff --git a/Core/Commands/Avatars/NearMe.cs b/Secondbot/Core/Commands/Avatars/NearMe.cs similarity index 100% rename from Core/Commands/Avatars/NearMe.cs rename to Secondbot/Core/Commands/Avatars/NearMe.cs diff --git a/Core/Commands/Avatars/PayAvatar.cs b/Secondbot/Core/Commands/Avatars/PayAvatar.cs similarity index 100% rename from Core/Commands/Avatars/PayAvatar.cs rename to Secondbot/Core/Commands/Avatars/PayAvatar.cs diff --git a/Core/Commands/Chat/LocalChatHistory.cs b/Secondbot/Core/Commands/Chat/LocalChatHistory.cs similarity index 100% rename from Core/Commands/Chat/LocalChatHistory.cs rename to Secondbot/Core/Commands/Chat/LocalChatHistory.cs diff --git a/Core/Commands/Chat/im.cs b/Secondbot/Core/Commands/Chat/im.cs similarity index 100% rename from Core/Commands/Chat/im.cs rename to Secondbot/Core/Commands/Chat/im.cs diff --git a/Core/Commands/Chat/say.cs b/Secondbot/Core/Commands/Chat/say.cs similarity index 100% rename from Core/Commands/Chat/say.cs rename to Secondbot/Core/Commands/Chat/say.cs diff --git a/Core/Commands/Dialogs/DialogRelay.cs b/Secondbot/Core/Commands/Dialogs/DialogRelay.cs similarity index 100% rename from Core/Commands/Dialogs/DialogRelay.cs rename to Secondbot/Core/Commands/Dialogs/DialogRelay.cs diff --git a/Core/Commands/Dialogs/DialogResponce.cs b/Secondbot/Core/Commands/Dialogs/DialogResponce.cs similarity index 100% rename from Core/Commands/Dialogs/DialogResponce.cs rename to Secondbot/Core/Commands/Dialogs/DialogResponce.cs diff --git a/Core/Commands/Dialogs/DialogTrack.cs b/Secondbot/Core/Commands/Dialogs/DialogTrack.cs similarity index 100% rename from Core/Commands/Dialogs/DialogTrack.cs rename to Secondbot/Core/Commands/Dialogs/DialogTrack.cs diff --git a/Core/Commands/DiscordAPI/AddRole.cs b/Secondbot/Core/Commands/DiscordAPI/AddRole.cs similarity index 100% rename from Core/Commands/DiscordAPI/AddRole.cs rename to Secondbot/Core/Commands/DiscordAPI/AddRole.cs diff --git a/Core/Commands/DiscordAPI/Ban_Member.cs b/Secondbot/Core/Commands/DiscordAPI/Ban_Member.cs similarity index 100% rename from Core/Commands/DiscordAPI/Ban_Member.cs rename to Secondbot/Core/Commands/DiscordAPI/Ban_Member.cs diff --git a/Core/Commands/DiscordAPI/BulkClear_Messages.cs b/Secondbot/Core/Commands/DiscordAPI/BulkClear_Messages.cs similarity index 100% rename from Core/Commands/DiscordAPI/BulkClear_Messages.cs rename to Secondbot/Core/Commands/DiscordAPI/BulkClear_Messages.cs diff --git a/Core/Commands/DiscordAPI/Dm_Member.cs b/Secondbot/Core/Commands/DiscordAPI/Dm_Member.cs similarity index 100% rename from Core/Commands/DiscordAPI/Dm_Member.cs rename to Secondbot/Core/Commands/DiscordAPI/Dm_Member.cs diff --git a/Core/Commands/DiscordAPI/MembersList.cs b/Secondbot/Core/Commands/DiscordAPI/MembersList.cs similarity index 100% rename from Core/Commands/DiscordAPI/MembersList.cs rename to Secondbot/Core/Commands/DiscordAPI/MembersList.cs diff --git a/Core/Commands/DiscordAPI/MessageChannel.cs b/Secondbot/Core/Commands/DiscordAPI/MessageChannel.cs similarity index 100% rename from Core/Commands/DiscordAPI/MessageChannel.cs rename to Secondbot/Core/Commands/DiscordAPI/MessageChannel.cs diff --git a/Core/Commands/DiscordAPI/MuteMember.cs b/Secondbot/Core/Commands/DiscordAPI/MuteMember.cs similarity index 100% rename from Core/Commands/DiscordAPI/MuteMember.cs rename to Secondbot/Core/Commands/DiscordAPI/MuteMember.cs diff --git a/Core/Commands/DiscordAPI/RoleCreate.cs b/Secondbot/Core/Commands/DiscordAPI/RoleCreate.cs similarity index 100% rename from Core/Commands/DiscordAPI/RoleCreate.cs rename to Secondbot/Core/Commands/DiscordAPI/RoleCreate.cs diff --git a/Core/Commands/DiscordAPI/RoleList.cs b/Secondbot/Core/Commands/DiscordAPI/RoleList.cs similarity index 100% rename from Core/Commands/DiscordAPI/RoleList.cs rename to Secondbot/Core/Commands/DiscordAPI/RoleList.cs diff --git a/Core/Commands/DiscordAPI/RoleRemove.cs b/Secondbot/Core/Commands/DiscordAPI/RoleRemove.cs similarity index 100% rename from Core/Commands/DiscordAPI/RoleRemove.cs rename to Secondbot/Core/Commands/DiscordAPI/RoleRemove.cs diff --git a/Core/Commands/DiscordAPI/Role_GetSettings.cs b/Secondbot/Core/Commands/DiscordAPI/Role_GetSettings.cs similarity index 100% rename from Core/Commands/DiscordAPI/Role_GetSettings.cs rename to Secondbot/Core/Commands/DiscordAPI/Role_GetSettings.cs diff --git a/Core/Commands/DiscordAPI/Role_UpdatePerms.cs b/Secondbot/Core/Commands/DiscordAPI/Role_UpdatePerms.cs similarity index 100% rename from Core/Commands/DiscordAPI/Role_UpdatePerms.cs rename to Secondbot/Core/Commands/DiscordAPI/Role_UpdatePerms.cs diff --git a/Core/Commands/DiscordAPI/TextChannels_List.cs b/Secondbot/Core/Commands/DiscordAPI/TextChannels_List.cs similarity index 100% rename from Core/Commands/DiscordAPI/TextChannels_List.cs rename to Secondbot/Core/Commands/DiscordAPI/TextChannels_List.cs diff --git a/Core/Commands/Estate/EstateParcelReclaim.cs b/Secondbot/Core/Commands/Estate/EstateParcelReclaim.cs similarity index 100% rename from Core/Commands/Estate/EstateParcelReclaim.cs rename to Secondbot/Core/Commands/Estate/EstateParcelReclaim.cs diff --git a/Core/Commands/Estate/GetSimGlobalPos.cs b/Secondbot/Core/Commands/Estate/GetSimGlobalPos.cs similarity index 100% rename from Core/Commands/Estate/GetSimGlobalPos.cs rename to Secondbot/Core/Commands/Estate/GetSimGlobalPos.cs diff --git a/Core/Commands/Estate/GetSimTexture.cs b/Secondbot/Core/Commands/Estate/GetSimTexture.cs similarity index 100% rename from Core/Commands/Estate/GetSimTexture.cs rename to Secondbot/Core/Commands/Estate/GetSimTexture.cs diff --git a/Core/Commands/Estate/SimMessage.cs b/Secondbot/Core/Commands/Estate/SimMessage.cs similarity index 100% rename from Core/Commands/Estate/SimMessage.cs rename to Secondbot/Core/Commands/Estate/SimMessage.cs diff --git a/Core/Commands/Estate/SimRestart.cs b/Secondbot/Core/Commands/Estate/SimRestart.cs similarity index 100% rename from Core/Commands/Estate/SimRestart.cs rename to Secondbot/Core/Commands/Estate/SimRestart.cs diff --git a/Core/Commands/Friends/FriendFullPerms.cs b/Secondbot/Core/Commands/Friends/FriendFullPerms.cs similarity index 100% rename from Core/Commands/Friends/FriendFullPerms.cs rename to Secondbot/Core/Commands/Friends/FriendFullPerms.cs diff --git a/Core/Commands/Friends/FriendRequest.cs b/Secondbot/Core/Commands/Friends/FriendRequest.cs similarity index 100% rename from Core/Commands/Friends/FriendRequest.cs rename to Secondbot/Core/Commands/Friends/FriendRequest.cs diff --git a/Core/Commands/Friends/Friendslist.cs b/Secondbot/Core/Commands/Friends/Friendslist.cs similarity index 100% rename from Core/Commands/Friends/Friendslist.cs rename to Secondbot/Core/Commands/Friends/Friendslist.cs diff --git a/Core/Commands/Group/GroupActiveGroup.cs b/Secondbot/Core/Commands/Group/GroupActiveGroup.cs similarity index 100% rename from Core/Commands/Group/GroupActiveGroup.cs rename to Secondbot/Core/Commands/Group/GroupActiveGroup.cs diff --git a/Core/Commands/Group/GroupActiveTitle.cs b/Secondbot/Core/Commands/Group/GroupActiveTitle.cs similarity index 100% rename from Core/Commands/Group/GroupActiveTitle.cs rename to Secondbot/Core/Commands/Group/GroupActiveTitle.cs diff --git a/Core/Commands/Group/GroupAddRole.cs b/Secondbot/Core/Commands/Group/GroupAddRole.cs similarity index 100% rename from Core/Commands/Group/GroupAddRole.cs rename to Secondbot/Core/Commands/Group/GroupAddRole.cs diff --git a/Core/Commands/Group/GroupEject.cs b/Secondbot/Core/Commands/Group/GroupEject.cs similarity index 100% rename from Core/Commands/Group/GroupEject.cs rename to Secondbot/Core/Commands/Group/GroupEject.cs diff --git a/Core/Commands/Group/GroupInvite.cs b/Secondbot/Core/Commands/Group/GroupInvite.cs similarity index 100% rename from Core/Commands/Group/GroupInvite.cs rename to Secondbot/Core/Commands/Group/GroupInvite.cs diff --git a/Core/Commands/Group/GroupInviteNoLimiter.cs b/Secondbot/Core/Commands/Group/GroupInviteNoLimiter.cs similarity index 100% rename from Core/Commands/Group/GroupInviteNoLimiter.cs rename to Secondbot/Core/Commands/Group/GroupInviteNoLimiter.cs diff --git a/Core/Commands/Group/GroupNotice.cs b/Secondbot/Core/Commands/Group/GroupNotice.cs similarity index 100% rename from Core/Commands/Group/GroupNotice.cs rename to Secondbot/Core/Commands/Group/GroupNotice.cs diff --git a/Core/Commands/Group/IsGroupMember.cs b/Secondbot/Core/Commands/Group/IsGroupMember.cs similarity index 100% rename from Core/Commands/Group/IsGroupMember.cs rename to Secondbot/Core/Commands/Group/IsGroupMember.cs diff --git a/Core/Commands/Group/getGroupList.cs b/Secondbot/Core/Commands/Group/getGroupList.cs similarity index 100% rename from Core/Commands/Group/getGroupList.cs rename to Secondbot/Core/Commands/Group/getGroupList.cs diff --git a/Core/Commands/Group/getGroupMembers.cs b/Secondbot/Core/Commands/Group/getGroupMembers.cs similarity index 100% rename from Core/Commands/Group/getGroupMembers.cs rename to Secondbot/Core/Commands/Group/getGroupMembers.cs diff --git a/Core/Commands/Group/getGroupRoles.cs b/Secondbot/Core/Commands/Group/getGroupRoles.cs similarity index 100% rename from Core/Commands/Group/getGroupRoles.cs rename to Secondbot/Core/Commands/Group/getGroupRoles.cs diff --git a/Core/Commands/Group/group.cs b/Secondbot/Core/Commands/Group/group.cs similarity index 100% rename from Core/Commands/Group/group.cs rename to Secondbot/Core/Commands/Group/group.cs diff --git a/Core/Commands/Group/groupchat.cs b/Secondbot/Core/Commands/Group/groupchat.cs similarity index 100% rename from Core/Commands/Group/groupchat.cs rename to Secondbot/Core/Commands/Group/groupchat.cs diff --git a/Core/Commands/Group/groupchatAnyUnread.cs b/Secondbot/Core/Commands/Group/groupchatAnyUnread.cs similarity index 100% rename from Core/Commands/Group/groupchatAnyUnread.cs rename to Secondbot/Core/Commands/Group/groupchatAnyUnread.cs diff --git a/Core/Commands/Group/groupchatClearAll.cs b/Secondbot/Core/Commands/Group/groupchatClearAll.cs similarity index 100% rename from Core/Commands/Group/groupchatClearAll.cs rename to Secondbot/Core/Commands/Group/groupchatClearAll.cs diff --git a/Core/Commands/Group/groupchatGroupHasUnread.cs b/Secondbot/Core/Commands/Group/groupchatGroupHasUnread.cs similarity index 100% rename from Core/Commands/Group/groupchatGroupHasUnread.cs rename to Secondbot/Core/Commands/Group/groupchatGroupHasUnread.cs diff --git a/Core/Commands/Group/groupchatHistory.cs b/Secondbot/Core/Commands/Group/groupchatHistory.cs similarity index 100% rename from Core/Commands/Group/groupchatHistory.cs rename to Secondbot/Core/Commands/Group/groupchatHistory.cs diff --git a/Core/Commands/Group/groupchatListAllUnreadGroups.cs b/Secondbot/Core/Commands/Group/groupchatListAllUnreadGroups.cs similarity index 100% rename from Core/Commands/Group/groupchatListAllUnreadGroups.cs rename to Secondbot/Core/Commands/Group/groupchatListAllUnreadGroups.cs diff --git a/Core/Commands/Helpers/delay.cs b/Secondbot/Core/Commands/Helpers/delay.cs similarity index 100% rename from Core/Commands/Helpers/delay.cs rename to Secondbot/Core/Commands/Helpers/delay.cs diff --git a/Core/Commands/Home/GoHome.cs b/Secondbot/Core/Commands/Home/GoHome.cs similarity index 100% rename from Core/Commands/Home/GoHome.cs rename to Secondbot/Core/Commands/Home/GoHome.cs diff --git a/Core/Commands/Home/resetAtHome.cs b/Secondbot/Core/Commands/Home/resetAtHome.cs similarity index 100% rename from Core/Commands/Home/resetAtHome.cs rename to Secondbot/Core/Commands/Home/resetAtHome.cs diff --git a/Core/Commands/Info/Balance.cs b/Secondbot/Core/Commands/Info/Balance.cs similarity index 100% rename from Core/Commands/Info/Balance.cs rename to Secondbot/Core/Commands/Info/Balance.cs diff --git a/Core/Commands/Info/GetPosition.cs b/Secondbot/Core/Commands/Info/GetPosition.cs similarity index 100% rename from Core/Commands/Info/GetPosition.cs rename to Secondbot/Core/Commands/Info/GetPosition.cs diff --git a/Core/Commands/Info/ParcelName.cs b/Secondbot/Core/Commands/Info/ParcelName.cs similarity index 100% rename from Core/Commands/Info/ParcelName.cs rename to Secondbot/Core/Commands/Info/ParcelName.cs diff --git a/Core/Commands/Info/SimName.cs b/Secondbot/Core/Commands/Info/SimName.cs similarity index 100% rename from Core/Commands/Info/SimName.cs rename to Secondbot/Core/Commands/Info/SimName.cs diff --git a/Core/Commands/Info/UnixTimeNow.cs b/Secondbot/Core/Commands/Info/UnixTimeNow.cs similarity index 100% rename from Core/Commands/Info/UnixTimeNow.cs rename to Secondbot/Core/Commands/Info/UnixTimeNow.cs diff --git a/Core/Commands/Inventory/DeleteInventory.cs b/Secondbot/Core/Commands/Inventory/DeleteInventory.cs similarity index 100% rename from Core/Commands/Inventory/DeleteInventory.cs rename to Secondbot/Core/Commands/Inventory/DeleteInventory.cs diff --git a/Core/Commands/Inventory/InventoryPurgeNotecards.cs b/Secondbot/Core/Commands/Inventory/InventoryPurgeNotecards.cs similarity index 100% rename from Core/Commands/Inventory/InventoryPurgeNotecards.cs rename to Secondbot/Core/Commands/Inventory/InventoryPurgeNotecards.cs diff --git a/Core/Commands/Inventory/RenameInventory.cs b/Secondbot/Core/Commands/Inventory/RenameInventory.cs similarity index 100% rename from Core/Commands/Inventory/RenameInventory.cs rename to Secondbot/Core/Commands/Inventory/RenameInventory.cs diff --git a/Core/Commands/Inventory/attach.cs b/Secondbot/Core/Commands/Inventory/attach.cs similarity index 100% rename from Core/Commands/Inventory/attach.cs rename to Secondbot/Core/Commands/Inventory/attach.cs diff --git a/Core/Commands/Inventory/getRealUUID.cs b/Secondbot/Core/Commands/Inventory/getRealUUID.cs similarity index 100% rename from Core/Commands/Inventory/getRealUUID.cs rename to Secondbot/Core/Commands/Inventory/getRealUUID.cs diff --git a/Core/Commands/Inventory/inventoryContents.cs b/Secondbot/Core/Commands/Inventory/inventoryContents.cs similarity index 100% rename from Core/Commands/Inventory/inventoryContents.cs rename to Secondbot/Core/Commands/Inventory/inventoryContents.cs diff --git a/Core/Commands/Inventory/inventoryFolders.cs b/Secondbot/Core/Commands/Inventory/inventoryFolders.cs similarity index 100% rename from Core/Commands/Inventory/inventoryFolders.cs rename to Secondbot/Core/Commands/Inventory/inventoryFolders.cs diff --git a/Core/Commands/Inventory/outfit.cs b/Secondbot/Core/Commands/Inventory/outfit.cs similarity index 100% rename from Core/Commands/Inventory/outfit.cs rename to Secondbot/Core/Commands/Inventory/outfit.cs diff --git a/Core/Commands/Inventory/sendFolder.cs b/Secondbot/Core/Commands/Inventory/sendFolder.cs similarity index 100% rename from Core/Commands/Inventory/sendFolder.cs rename to Secondbot/Core/Commands/Inventory/sendFolder.cs diff --git a/Core/Commands/Inventory/sendItem.cs b/Secondbot/Core/Commands/Inventory/sendItem.cs similarity index 100% rename from Core/Commands/Inventory/sendItem.cs rename to Secondbot/Core/Commands/Inventory/sendItem.cs diff --git a/Core/Commands/Movement/AutoPilot.cs b/Secondbot/Core/Commands/Movement/AutoPilot.cs similarity index 100% rename from Core/Commands/Movement/AutoPilot.cs rename to Secondbot/Core/Commands/Movement/AutoPilot.cs diff --git a/Core/Commands/Movement/AutoPilotStop.cs b/Secondbot/Core/Commands/Movement/AutoPilotStop.cs similarity index 100% rename from Core/Commands/Movement/AutoPilotStop.cs rename to Secondbot/Core/Commands/Movement/AutoPilotStop.cs diff --git a/Core/Commands/Movement/Fly.cs b/Secondbot/Core/Commands/Movement/Fly.cs similarity index 100% rename from Core/Commands/Movement/Fly.cs rename to Secondbot/Core/Commands/Movement/Fly.cs diff --git a/Core/Commands/Movement/RequestTeleport.cs b/Secondbot/Core/Commands/Movement/RequestTeleport.cs similarity index 100% rename from Core/Commands/Movement/RequestTeleport.cs rename to Secondbot/Core/Commands/Movement/RequestTeleport.cs diff --git a/Core/Commands/Movement/RotateToFace.cs b/Secondbot/Core/Commands/Movement/RotateToFace.cs similarity index 100% rename from Core/Commands/Movement/RotateToFace.cs rename to Secondbot/Core/Commands/Movement/RotateToFace.cs diff --git a/Core/Commands/Movement/RotateToFaceVector.cs b/Secondbot/Core/Commands/Movement/RotateToFaceVector.cs similarity index 100% rename from Core/Commands/Movement/RotateToFaceVector.cs rename to Secondbot/Core/Commands/Movement/RotateToFaceVector.cs diff --git a/Core/Commands/Movement/SendTeleportLure.cs b/Secondbot/Core/Commands/Movement/SendTeleportLure.cs similarity index 100% rename from Core/Commands/Movement/SendTeleportLure.cs rename to Secondbot/Core/Commands/Movement/SendTeleportLure.cs diff --git a/Core/Commands/Movement/rotateTo.cs b/Secondbot/Core/Commands/Movement/rotateTo.cs similarity index 100% rename from Core/Commands/Movement/rotateTo.cs rename to Secondbot/Core/Commands/Movement/rotateTo.cs diff --git a/Core/Commands/Movement/teleport.cs b/Secondbot/Core/Commands/Movement/teleport.cs similarity index 100% rename from Core/Commands/Movement/teleport.cs rename to Secondbot/Core/Commands/Movement/teleport.cs diff --git a/Core/Commands/Notecard/notecardAdd.cs b/Secondbot/Core/Commands/Notecard/notecardAdd.cs similarity index 100% rename from Core/Commands/Notecard/notecardAdd.cs rename to Secondbot/Core/Commands/Notecard/notecardAdd.cs diff --git a/Core/Commands/Notecard/notecardClear.cs b/Secondbot/Core/Commands/Notecard/notecardClear.cs similarity index 100% rename from Core/Commands/Notecard/notecardClear.cs rename to Secondbot/Core/Commands/Notecard/notecardClear.cs diff --git a/Core/Commands/Notecard/notecardSend.cs b/Secondbot/Core/Commands/Notecard/notecardSend.cs similarity index 100% rename from Core/Commands/Notecard/notecardSend.cs rename to Secondbot/Core/Commands/Notecard/notecardSend.cs diff --git a/Core/Commands/Parcel/AbandonLand.cs b/Secondbot/Core/Commands/Parcel/AbandonLand.cs similarity index 100% rename from Core/Commands/Parcel/AbandonLand.cs rename to Secondbot/Core/Commands/Parcel/AbandonLand.cs diff --git a/Core/Commands/Parcel/GetParcelBanlist.cs b/Secondbot/Core/Commands/Parcel/GetParcelBanlist.cs similarity index 100% rename from Core/Commands/Parcel/GetParcelBanlist.cs rename to Secondbot/Core/Commands/Parcel/GetParcelBanlist.cs diff --git a/Core/Commands/Parcel/GetParcelDesc.cs b/Secondbot/Core/Commands/Parcel/GetParcelDesc.cs similarity index 100% rename from Core/Commands/Parcel/GetParcelDesc.cs rename to Secondbot/Core/Commands/Parcel/GetParcelDesc.cs diff --git a/Core/Commands/Parcel/GetParcelFlags.cs b/Secondbot/Core/Commands/Parcel/GetParcelFlags.cs similarity index 100% rename from Core/Commands/Parcel/GetParcelFlags.cs rename to Secondbot/Core/Commands/Parcel/GetParcelFlags.cs diff --git a/Core/Commands/Parcel/ParcelBan.cs b/Secondbot/Core/Commands/Parcel/ParcelBan.cs similarity index 100% rename from Core/Commands/Parcel/ParcelBan.cs rename to Secondbot/Core/Commands/Parcel/ParcelBan.cs diff --git a/Core/Commands/Parcel/ParcelBuy.cs b/Secondbot/Core/Commands/Parcel/ParcelBuy.cs similarity index 100% rename from Core/Commands/Parcel/ParcelBuy.cs rename to Secondbot/Core/Commands/Parcel/ParcelBuy.cs diff --git a/Core/Commands/Parcel/ParcelCleanAndSell.cs b/Secondbot/Core/Commands/Parcel/ParcelCleanAndSell.cs similarity index 100% rename from Core/Commands/Parcel/ParcelCleanAndSell.cs rename to Secondbot/Core/Commands/Parcel/ParcelCleanAndSell.cs diff --git a/Core/Commands/Parcel/ParcelCommandHelper.cs b/Secondbot/Core/Commands/Parcel/ParcelCommandHelper.cs similarity index 100% rename from Core/Commands/Parcel/ParcelCommandHelper.cs rename to Secondbot/Core/Commands/Parcel/ParcelCommandHelper.cs diff --git a/Core/Commands/Parcel/ParcelDeedToGroup.cs b/Secondbot/Core/Commands/Parcel/ParcelDeedToGroup.cs similarity index 100% rename from Core/Commands/Parcel/ParcelDeedToGroup.cs rename to Secondbot/Core/Commands/Parcel/ParcelDeedToGroup.cs diff --git a/Core/Commands/Parcel/ParcelFreeze.cs b/Secondbot/Core/Commands/Parcel/ParcelFreeze.cs similarity index 100% rename from Core/Commands/Parcel/ParcelFreeze.cs rename to Secondbot/Core/Commands/Parcel/ParcelFreeze.cs diff --git a/Core/Commands/Parcel/ParcelPrimCountAvatar.cs b/Secondbot/Core/Commands/Parcel/ParcelPrimCountAvatar.cs similarity index 100% rename from Core/Commands/Parcel/ParcelPrimCountAvatar.cs rename to Secondbot/Core/Commands/Parcel/ParcelPrimCountAvatar.cs diff --git a/Core/Commands/Parcel/ParcelPrimCountTotal.cs b/Secondbot/Core/Commands/Parcel/ParcelPrimCountTotal.cs similarity index 100% rename from Core/Commands/Parcel/ParcelPrimCountTotal.cs rename to Secondbot/Core/Commands/Parcel/ParcelPrimCountTotal.cs diff --git a/Core/Commands/Parcel/ParcelReturnObjects.cs b/Secondbot/Core/Commands/Parcel/ParcelReturnObjects.cs similarity index 100% rename from Core/Commands/Parcel/ParcelReturnObjects.cs rename to Secondbot/Core/Commands/Parcel/ParcelReturnObjects.cs diff --git a/Core/Commands/Parcel/ParcelReturnTargeted.cs b/Secondbot/Core/Commands/Parcel/ParcelReturnTargeted.cs similarity index 100% rename from Core/Commands/Parcel/ParcelReturnTargeted.cs rename to Secondbot/Core/Commands/Parcel/ParcelReturnTargeted.cs diff --git a/Core/Commands/Parcel/ParcelSetMedia.cs b/Secondbot/Core/Commands/Parcel/ParcelSetMedia.cs similarity index 100% rename from Core/Commands/Parcel/ParcelSetMedia.cs rename to Secondbot/Core/Commands/Parcel/ParcelSetMedia.cs diff --git a/Core/Commands/Parcel/SetParcelDesc.cs b/Secondbot/Core/Commands/Parcel/SetParcelDesc.cs similarity index 100% rename from Core/Commands/Parcel/SetParcelDesc.cs rename to Secondbot/Core/Commands/Parcel/SetParcelDesc.cs diff --git a/Core/Commands/Parcel/SetParcelFlag.cs b/Secondbot/Core/Commands/Parcel/SetParcelFlag.cs similarity index 100% rename from Core/Commands/Parcel/SetParcelFlag.cs rename to Secondbot/Core/Commands/Parcel/SetParcelFlag.cs diff --git a/Core/Commands/Parcel/SetParcelMusic.cs b/Secondbot/Core/Commands/Parcel/SetParcelMusic.cs similarity index 100% rename from Core/Commands/Parcel/SetParcelMusic.cs rename to Secondbot/Core/Commands/Parcel/SetParcelMusic.cs diff --git a/Core/Commands/Parcel/SetParcelName.cs b/Secondbot/Core/Commands/Parcel/SetParcelName.cs similarity index 100% rename from Core/Commands/Parcel/SetParcelName.cs rename to Secondbot/Core/Commands/Parcel/SetParcelName.cs diff --git a/Core/Commands/Parcel/SetParcelSale.cs b/Secondbot/Core/Commands/Parcel/SetParcelSale.cs similarity index 100% rename from Core/Commands/Parcel/SetParcelSale.cs rename to Secondbot/Core/Commands/Parcel/SetParcelSale.cs diff --git a/Core/Commands/Parcel/eject.cs b/Secondbot/Core/Commands/Parcel/eject.cs similarity index 100% rename from Core/Commands/Parcel/eject.cs rename to Secondbot/Core/Commands/Parcel/eject.cs diff --git a/Core/Commands/Prims/RezObject.cs b/Secondbot/Core/Commands/Prims/RezObject.cs similarity index 100% rename from Core/Commands/Prims/RezObject.cs rename to Secondbot/Core/Commands/Prims/RezObject.cs diff --git a/Core/Commands/Prims/TransferInventoryToObject.cs b/Secondbot/Core/Commands/Prims/TransferInventoryToObject.cs similarity index 100% rename from Core/Commands/Prims/TransferInventoryToObject.cs rename to Secondbot/Core/Commands/Prims/TransferInventoryToObject.cs diff --git a/Core/Commands/Prims/UnRezObject.cs b/Secondbot/Core/Commands/Prims/UnRezObject.cs similarity index 100% rename from Core/Commands/Prims/UnRezObject.cs rename to Secondbot/Core/Commands/Prims/UnRezObject.cs diff --git a/Core/Commands/Script/scriptHttp.cs b/Secondbot/Core/Commands/Script/scriptHttp.cs similarity index 100% rename from Core/Commands/Script/scriptHttp.cs rename to Secondbot/Core/Commands/Script/scriptHttp.cs diff --git a/Core/Commands/Script/scriptSend.cs b/Secondbot/Core/Commands/Script/scriptSend.cs similarity index 100% rename from Core/Commands/Script/scriptSend.cs rename to Secondbot/Core/Commands/Script/scriptSend.cs diff --git a/Core/Commands/Self/CickObject.cs b/Secondbot/Core/Commands/Self/CickObject.cs similarity index 100% rename from Core/Commands/Self/CickObject.cs rename to Secondbot/Core/Commands/Self/CickObject.cs diff --git a/Core/Commands/Self/GetLastCommands.cs b/Secondbot/Core/Commands/Self/GetLastCommands.cs similarity index 100% rename from Core/Commands/Self/GetLastCommands.cs rename to Secondbot/Core/Commands/Self/GetLastCommands.cs diff --git a/Core/Commands/Self/Help.cs b/Secondbot/Core/Commands/Self/Help.cs similarity index 100% rename from Core/Commands/Self/Help.cs rename to Secondbot/Core/Commands/Self/Help.cs diff --git a/Core/Commands/Self/PayObject.cs b/Secondbot/Core/Commands/Self/PayObject.cs similarity index 100% rename from Core/Commands/Self/PayObject.cs rename to Secondbot/Core/Commands/Self/PayObject.cs diff --git a/Core/Commands/Self/SetPermFlag.cs b/Secondbot/Core/Commands/Self/SetPermFlag.cs similarity index 100% rename from Core/Commands/Self/SetPermFlag.cs rename to Secondbot/Core/Commands/Self/SetPermFlag.cs diff --git a/Core/Commands/Self/botVersion.cs b/Secondbot/Core/Commands/Self/botVersion.cs similarity index 100% rename from Core/Commands/Self/botVersion.cs rename to Secondbot/Core/Commands/Self/botVersion.cs diff --git a/Core/Commands/Self/logout.cs b/Secondbot/Core/Commands/Self/logout.cs similarity index 100% rename from Core/Commands/Self/logout.cs rename to Secondbot/Core/Commands/Self/logout.cs diff --git a/Core/Commands/Self/pointAt.cs b/Secondbot/Core/Commands/Self/pointAt.cs similarity index 100% rename from Core/Commands/Self/pointAt.cs rename to Secondbot/Core/Commands/Self/pointAt.cs diff --git a/Core/Commands/Self/sit.cs b/Secondbot/Core/Commands/Self/sit.cs similarity index 100% rename from Core/Commands/Self/sit.cs rename to Secondbot/Core/Commands/Self/sit.cs diff --git a/Core/Commands/Self/stand.cs b/Secondbot/Core/Commands/Self/stand.cs similarity index 100% rename from Core/Commands/Self/stand.cs rename to Secondbot/Core/Commands/Self/stand.cs diff --git a/Core/Commands/StreamAdmin/FetchNextNotecard.cs b/Secondbot/Core/Commands/StreamAdmin/FetchNextNotecard.cs similarity index 100% rename from Core/Commands/StreamAdmin/FetchNextNotecard.cs rename to Secondbot/Core/Commands/StreamAdmin/FetchNextNotecard.cs diff --git a/Core/Commands/commandlib.cs b/Secondbot/Core/Commands/commandlib.cs similarity index 99% rename from Core/Commands/commandlib.cs rename to Secondbot/Core/Commands/commandlib.cs index b76cea0..ab0f835 100644 --- a/Core/Commands/commandlib.cs +++ b/Secondbot/Core/Commands/commandlib.cs @@ -125,11 +125,11 @@ namespace BSB.Commands } } - public CoreCommandsInterface(CommandsBot linktobot, bool wikimode) + public CoreCommandsInterface(CommandsBot linktobot) { bot = linktobot; API_type = typeof(CoreCommand); - LoadCommandsList(wikimode); + LoadCommandsList(); } protected HttpClient HTTPclient = new HttpClient(); diff --git a/Secondbot/Core/Core.csproj b/Secondbot/Core/Core.csproj new file mode 100644 index 0000000..4a60d50 --- /dev/null +++ b/Secondbot/Core/Core.csproj @@ -0,0 +1,18 @@ + + + + Library + netcoreapp3.1 + + + + + + + + + + + + + diff --git a/Core/RLV/Blacklist/getblacklist.cs b/Secondbot/Core/RLV/Blacklist/getblacklist.cs similarity index 100% rename from Core/RLV/Blacklist/getblacklist.cs rename to Secondbot/Core/RLV/Blacklist/getblacklist.cs diff --git a/Core/RLV/Blacklist/versionnumbl.cs b/Secondbot/Core/RLV/Blacklist/versionnumbl.cs similarity index 100% rename from Core/RLV/Blacklist/versionnumbl.cs rename to Secondbot/Core/RLV/Blacklist/versionnumbl.cs diff --git a/Core/RLV/Camera/camavdist.cs b/Secondbot/Core/RLV/Camera/camavdist.cs similarity index 100% rename from Core/RLV/Camera/camavdist.cs rename to Secondbot/Core/RLV/Camera/camavdist.cs diff --git a/Core/RLV/Camera/camdistmax.cs b/Secondbot/Core/RLV/Camera/camdistmax.cs similarity index 100% rename from Core/RLV/Camera/camdistmax.cs rename to Secondbot/Core/RLV/Camera/camdistmax.cs diff --git a/Core/RLV/Camera/camdistmin.cs b/Secondbot/Core/RLV/Camera/camdistmin.cs similarity index 100% rename from Core/RLV/Camera/camdistmin.cs rename to Secondbot/Core/RLV/Camera/camdistmin.cs diff --git a/Core/RLV/Camera/camdrawalphamax.cs b/Secondbot/Core/RLV/Camera/camdrawalphamax.cs similarity index 100% rename from Core/RLV/Camera/camdrawalphamax.cs rename to Secondbot/Core/RLV/Camera/camdrawalphamax.cs diff --git a/Core/RLV/Camera/camdrawalphamin.cs b/Secondbot/Core/RLV/Camera/camdrawalphamin.cs similarity index 100% rename from Core/RLV/Camera/camdrawalphamin.cs rename to Secondbot/Core/RLV/Camera/camdrawalphamin.cs diff --git a/Core/RLV/Camera/camdrawcolor.cs b/Secondbot/Core/RLV/Camera/camdrawcolor.cs similarity index 100% rename from Core/RLV/Camera/camdrawcolor.cs rename to Secondbot/Core/RLV/Camera/camdrawcolor.cs diff --git a/Core/RLV/Camera/camdrawmax.cs b/Secondbot/Core/RLV/Camera/camdrawmax.cs similarity index 100% rename from Core/RLV/Camera/camdrawmax.cs rename to Secondbot/Core/RLV/Camera/camdrawmax.cs diff --git a/Core/RLV/Camera/camdrawmin.cs b/Secondbot/Core/RLV/Camera/camdrawmin.cs similarity index 100% rename from Core/RLV/Camera/camdrawmin.cs rename to Secondbot/Core/RLV/Camera/camdrawmin.cs diff --git a/Core/RLV/Camera/camtextures.cs b/Secondbot/Core/RLV/Camera/camtextures.cs similarity index 100% rename from Core/RLV/Camera/camtextures.cs rename to Secondbot/Core/RLV/Camera/camtextures.cs diff --git a/Core/RLV/Camera/camunlock.cs b/Secondbot/Core/RLV/Camera/camunlock.cs similarity index 100% rename from Core/RLV/Camera/camunlock.cs rename to Secondbot/Core/RLV/Camera/camunlock.cs diff --git a/Core/RLV/Camera/camzoommax.cs b/Secondbot/Core/RLV/Camera/camzoommax.cs similarity index 100% rename from Core/RLV/Camera/camzoommax.cs rename to Secondbot/Core/RLV/Camera/camzoommax.cs diff --git a/Core/RLV/Camera/camzoommin.cs b/Secondbot/Core/RLV/Camera/camzoommin.cs similarity index 100% rename from Core/RLV/Camera/camzoommin.cs rename to Secondbot/Core/RLV/Camera/camzoommin.cs diff --git a/Core/RLV/Camera/getcam_avdistmax.cs b/Secondbot/Core/RLV/Camera/getcam_avdistmax.cs similarity index 100% rename from Core/RLV/Camera/getcam_avdistmax.cs rename to Secondbot/Core/RLV/Camera/getcam_avdistmax.cs diff --git a/Core/RLV/Camera/getcam_avdistmin.cs b/Secondbot/Core/RLV/Camera/getcam_avdistmin.cs similarity index 100% rename from Core/RLV/Camera/getcam_avdistmin.cs rename to Secondbot/Core/RLV/Camera/getcam_avdistmin.cs diff --git a/Core/RLV/Camera/getcam_fov.cs b/Secondbot/Core/RLV/Camera/getcam_fov.cs similarity index 100% rename from Core/RLV/Camera/getcam_fov.cs rename to Secondbot/Core/RLV/Camera/getcam_fov.cs diff --git a/Core/RLV/Camera/getcam_fovmax.cs b/Secondbot/Core/RLV/Camera/getcam_fovmax.cs similarity index 100% rename from Core/RLV/Camera/getcam_fovmax.cs rename to Secondbot/Core/RLV/Camera/getcam_fovmax.cs diff --git a/Core/RLV/Camera/getcam_fovmin.cs b/Secondbot/Core/RLV/Camera/getcam_fovmin.cs similarity index 100% rename from Core/RLV/Camera/getcam_fovmin.cs rename to Secondbot/Core/RLV/Camera/getcam_fovmin.cs diff --git a/Core/RLV/Camera/getcam_zoommin.cs b/Secondbot/Core/RLV/Camera/getcam_zoommin.cs similarity index 100% rename from Core/RLV/Camera/getcam_zoommin.cs rename to Secondbot/Core/RLV/Camera/getcam_zoommin.cs diff --git a/Core/RLV/Camera/setcam_avdistmax.cs b/Secondbot/Core/RLV/Camera/setcam_avdistmax.cs similarity index 100% rename from Core/RLV/Camera/setcam_avdistmax.cs rename to Secondbot/Core/RLV/Camera/setcam_avdistmax.cs diff --git a/Core/RLV/Camera/setcam_avdistmin.cs b/Secondbot/Core/RLV/Camera/setcam_avdistmin.cs similarity index 100% rename from Core/RLV/Camera/setcam_avdistmin.cs rename to Secondbot/Core/RLV/Camera/setcam_avdistmin.cs diff --git a/Core/RLV/Camera/setcam_fov.cs b/Secondbot/Core/RLV/Camera/setcam_fov.cs similarity index 100% rename from Core/RLV/Camera/setcam_fov.cs rename to Secondbot/Core/RLV/Camera/setcam_fov.cs diff --git a/Core/RLV/Camera/setcam_fovmax.cs b/Secondbot/Core/RLV/Camera/setcam_fovmax.cs similarity index 100% rename from Core/RLV/Camera/setcam_fovmax.cs rename to Secondbot/Core/RLV/Camera/setcam_fovmax.cs diff --git a/Core/RLV/Camera/setcam_fovmin.cs b/Secondbot/Core/RLV/Camera/setcam_fovmin.cs similarity index 100% rename from Core/RLV/Camera/setcam_fovmin.cs rename to Secondbot/Core/RLV/Camera/setcam_fovmin.cs diff --git a/Core/RLV/Camera/setcam_textures.cs b/Secondbot/Core/RLV/Camera/setcam_textures.cs similarity index 100% rename from Core/RLV/Camera/setcam_textures.cs rename to Secondbot/Core/RLV/Camera/setcam_textures.cs diff --git a/Core/RLV/Camera/setcam_unlock.cs b/Secondbot/Core/RLV/Camera/setcam_unlock.cs similarity index 100% rename from Core/RLV/Camera/setcam_unlock.cs rename to Secondbot/Core/RLV/Camera/setcam_unlock.cs diff --git a/Core/RLV/Chat/chatnormal.cs b/Secondbot/Core/RLV/Chat/chatnormal.cs similarity index 100% rename from Core/RLV/Chat/chatnormal.cs rename to Secondbot/Core/RLV/Chat/chatnormal.cs diff --git a/Core/RLV/Chat/chatshout.cs b/Secondbot/Core/RLV/Chat/chatshout.cs similarity index 100% rename from Core/RLV/Chat/chatshout.cs rename to Secondbot/Core/RLV/Chat/chatshout.cs diff --git a/Core/RLV/Chat/chatwhisper.cs b/Secondbot/Core/RLV/Chat/chatwhisper.cs similarity index 100% rename from Core/RLV/Chat/chatwhisper.cs rename to Secondbot/Core/RLV/Chat/chatwhisper.cs diff --git a/Core/RLV/Chat/recvchat.cs b/Secondbot/Core/RLV/Chat/recvchat.cs similarity index 100% rename from Core/RLV/Chat/recvchat.cs rename to Secondbot/Core/RLV/Chat/recvchat.cs diff --git a/Core/RLV/Chat/recvchat_sec.cs b/Secondbot/Core/RLV/Chat/recvchat_sec.cs similarity index 100% rename from Core/RLV/Chat/recvchat_sec.cs rename to Secondbot/Core/RLV/Chat/recvchat_sec.cs diff --git a/Core/RLV/Chat/recvchatfrom.cs b/Secondbot/Core/RLV/Chat/recvchatfrom.cs similarity index 100% rename from Core/RLV/Chat/recvchatfrom.cs rename to Secondbot/Core/RLV/Chat/recvchatfrom.cs diff --git a/Core/RLV/Chat/redirchat.cs b/Secondbot/Core/RLV/Chat/redirchat.cs similarity index 100% rename from Core/RLV/Chat/redirchat.cs rename to Secondbot/Core/RLV/Chat/redirchat.cs diff --git a/Core/RLV/Chat/sendchat.cs b/Secondbot/Core/RLV/Chat/sendchat.cs similarity index 100% rename from Core/RLV/Chat/sendchat.cs rename to Secondbot/Core/RLV/Chat/sendchat.cs diff --git a/Core/RLV/Chat/sendgesture.cs b/Secondbot/Core/RLV/Chat/sendgesture.cs similarity index 100% rename from Core/RLV/Chat/sendgesture.cs rename to Secondbot/Core/RLV/Chat/sendgesture.cs diff --git a/Core/RLV/Emotes/emote.cs b/Secondbot/Core/RLV/Emotes/emote.cs similarity index 100% rename from Core/RLV/Emotes/emote.cs rename to Secondbot/Core/RLV/Emotes/emote.cs diff --git a/Core/RLV/Emotes/recvemote.cs b/Secondbot/Core/RLV/Emotes/recvemote.cs similarity index 100% rename from Core/RLV/Emotes/recvemote.cs rename to Secondbot/Core/RLV/Emotes/recvemote.cs diff --git a/Core/RLV/Emotes/recvemote_sec.cs b/Secondbot/Core/RLV/Emotes/recvemote_sec.cs similarity index 100% rename from Core/RLV/Emotes/recvemote_sec.cs rename to Secondbot/Core/RLV/Emotes/recvemote_sec.cs diff --git a/Core/RLV/Emotes/rediremote.cs b/Secondbot/Core/RLV/Emotes/rediremote.cs similarity index 100% rename from Core/RLV/Emotes/rediremote.cs rename to Secondbot/Core/RLV/Emotes/rediremote.cs diff --git a/Core/RLV/InstantMessages/sendim.cs b/Secondbot/Core/RLV/InstantMessages/sendim.cs similarity index 100% rename from Core/RLV/InstantMessages/sendim.cs rename to Secondbot/Core/RLV/InstantMessages/sendim.cs diff --git a/Core/RLV/InstantMessages/sendim_sec.cs b/Secondbot/Core/RLV/InstantMessages/sendim_sec.cs similarity index 100% rename from Core/RLV/InstantMessages/sendim_sec.cs rename to Secondbot/Core/RLV/InstantMessages/sendim_sec.cs diff --git a/Core/RLV/Miscellaneous/clear.cs b/Secondbot/Core/RLV/Miscellaneous/clear.cs similarity index 100% rename from Core/RLV/Miscellaneous/clear.cs rename to Secondbot/Core/RLV/Miscellaneous/clear.cs diff --git a/Core/RLV/Miscellaneous/getstatus.cs b/Secondbot/Core/RLV/Miscellaneous/getstatus.cs similarity index 100% rename from Core/RLV/Miscellaneous/getstatus.cs rename to Secondbot/Core/RLV/Miscellaneous/getstatus.cs diff --git a/Core/RLV/Miscellaneous/getstatusall.cs b/Secondbot/Core/RLV/Miscellaneous/getstatusall.cs similarity index 100% rename from Core/RLV/Miscellaneous/getstatusall.cs rename to Secondbot/Core/RLV/Miscellaneous/getstatusall.cs diff --git a/Core/RLV/Miscellaneous/notify.cs b/Secondbot/Core/RLV/Miscellaneous/notify.cs similarity index 100% rename from Core/RLV/Miscellaneous/notify.cs rename to Secondbot/Core/RLV/Miscellaneous/notify.cs diff --git a/Core/RLV/Miscellaneous/permissive.cs b/Secondbot/Core/RLV/Miscellaneous/permissive.cs similarity index 100% rename from Core/RLV/Miscellaneous/permissive.cs rename to Secondbot/Core/RLV/Miscellaneous/permissive.cs diff --git a/Core/RLV/Movement/adjustheight.cs b/Secondbot/Core/RLV/Movement/adjustheight.cs similarity index 100% rename from Core/RLV/Movement/adjustheight.cs rename to Secondbot/Core/RLV/Movement/adjustheight.cs diff --git a/Core/RLV/Movement/alwaysrun.cs b/Secondbot/Core/RLV/Movement/alwaysrun.cs similarity index 100% rename from Core/RLV/Movement/alwaysrun.cs rename to Secondbot/Core/RLV/Movement/alwaysrun.cs diff --git a/Core/RLV/Movement/fly.cs b/Secondbot/Core/RLV/Movement/fly.cs similarity index 100% rename from Core/RLV/Movement/fly.cs rename to Secondbot/Core/RLV/Movement/fly.cs diff --git a/Core/RLV/Movement/setrot.cs b/Secondbot/Core/RLV/Movement/setrot.cs similarity index 100% rename from Core/RLV/Movement/setrot.cs rename to Secondbot/Core/RLV/Movement/setrot.cs diff --git a/Core/RLV/Movement/temprun.cs b/Secondbot/Core/RLV/Movement/temprun.cs similarity index 100% rename from Core/RLV/Movement/temprun.cs rename to Secondbot/Core/RLV/Movement/temprun.cs diff --git a/Core/RLV/PrivateChannels/sendchannel.cs b/Secondbot/Core/RLV/PrivateChannels/sendchannel.cs similarity index 100% rename from Core/RLV/PrivateChannels/sendchannel.cs rename to Secondbot/Core/RLV/PrivateChannels/sendchannel.cs diff --git a/Core/RLV/PrivateChannels/sendchannel_except.cs b/Secondbot/Core/RLV/PrivateChannels/sendchannel_except.cs similarity index 100% rename from Core/RLV/PrivateChannels/sendchannel_except.cs rename to Secondbot/Core/RLV/PrivateChannels/sendchannel_except.cs diff --git a/Core/RLV/PrivateChannels/sendchannel_sec.cs b/Secondbot/Core/RLV/PrivateChannels/sendchannel_sec.cs similarity index 100% rename from Core/RLV/PrivateChannels/sendchannel_sec.cs rename to Secondbot/Core/RLV/PrivateChannels/sendchannel_sec.cs diff --git a/Core/RLV/RLV_commandlib.cs b/Secondbot/Core/RLV/RLV_commandlib.cs similarity index 98% rename from Core/RLV/RLV_commandlib.cs rename to Secondbot/Core/RLV/RLV_commandlib.cs index 2adf549..58fe378 100644 --- a/Core/RLV/RLV_commandlib.cs +++ b/Secondbot/Core/RLV/RLV_commandlib.cs @@ -21,11 +21,11 @@ namespace BSB.RLV last_caller_uuid = callerUUID; } - public RLVcontrol(RLVbot linktobot, bool wikimode) + public RLVcontrol(RLVbot linktobot) { bot = linktobot; API_type = typeof(RLV_command); - LoadCommandsList(wikimode); + LoadCommandsList(); } protected List suppress_warning = new List(); diff --git a/Core/RLV/Sitting/getsitid.cs b/Secondbot/Core/RLV/Sitting/getsitid.cs similarity index 100% rename from Core/RLV/Sitting/getsitid.cs rename to Secondbot/Core/RLV/Sitting/getsitid.cs diff --git a/Core/RLV/Sitting/sit.cs b/Secondbot/Core/RLV/Sitting/sit.cs similarity index 100% rename from Core/RLV/Sitting/sit.cs rename to Secondbot/Core/RLV/Sitting/sit.cs diff --git a/Core/RLV/Sitting/unsit.cs b/Secondbot/Core/RLV/Sitting/unsit.cs similarity index 100% rename from Core/RLV/Sitting/unsit.cs rename to Secondbot/Core/RLV/Sitting/unsit.cs diff --git a/Core/RLV/Version/version.cs b/Secondbot/Core/RLV/Version/version.cs similarity index 100% rename from Core/RLV/Version/version.cs rename to Secondbot/Core/RLV/Version/version.cs diff --git a/Core/RLV/Version/versionnew.cs b/Secondbot/Core/RLV/Version/versionnew.cs similarity index 100% rename from Core/RLV/Version/versionnew.cs rename to Secondbot/Core/RLV/Version/versionnew.cs diff --git a/Core/RLV/Version/versionnum.cs b/Secondbot/Core/RLV/Version/versionnum.cs similarity index 100% rename from Core/RLV/Version/versionnum.cs rename to Secondbot/Core/RLV/Version/versionnum.cs diff --git a/Core/Static/Inventory.cs b/Secondbot/Core/Static/Inventory.cs similarity index 100% rename from Core/Static/Inventory.cs rename to Secondbot/Core/Static/Inventory.cs diff --git a/Core/Static/parcel.cs b/Secondbot/Core/Static/parcel.cs similarity index 100% rename from Core/Static/parcel.cs rename to Secondbot/Core/Static/parcel.cs diff --git a/Core/bottypes/AVstorageBot.cs b/Secondbot/Core/bottypes/AVstorageBot.cs similarity index 100% rename from Core/bottypes/AVstorageBot.cs rename to Secondbot/Core/bottypes/AVstorageBot.cs diff --git a/Core/bottypes/ActionsAutoAcceptBot.cs b/Secondbot/Core/bottypes/ActionsAutoAcceptBot.cs similarity index 100% rename from Core/bottypes/ActionsAutoAcceptBot.cs rename to Secondbot/Core/bottypes/ActionsAutoAcceptBot.cs diff --git a/Core/bottypes/AnimationsBot.cs b/Secondbot/Core/bottypes/AnimationsBot.cs similarity index 100% rename from Core/bottypes/AnimationsBot.cs rename to Secondbot/Core/bottypes/AnimationsBot.cs diff --git a/Core/bottypes/AwaitReplyEventBot.cs b/Secondbot/Core/bottypes/AwaitReplyEventBot.cs similarity index 100% rename from Core/bottypes/AwaitReplyEventBot.cs rename to Secondbot/Core/bottypes/AwaitReplyEventBot.cs diff --git a/Core/bottypes/CommandsBot.cs b/Secondbot/Core/bottypes/CommandsBot.cs similarity index 99% rename from Core/bottypes/CommandsBot.cs rename to Secondbot/Core/bottypes/CommandsBot.cs index 131d3e5..098d4d1 100644 --- a/Core/bottypes/CommandsBot.cs +++ b/Secondbot/Core/bottypes/CommandsBot.cs @@ -14,7 +14,7 @@ namespace BSB.bottypes { protected CommandsBot() { - CommandsInterface = new Commands.CoreCommandsInterface(this,false); + CommandsInterface = new Commands.CoreCommandsInterface(this); } protected List CommandHistory = new List(); @@ -194,7 +194,7 @@ namespace BSB.bottypes { if (reconnect == false) { - CommandsInterface = new Commands.CoreCommandsInterface(this,false); + CommandsInterface = new Commands.CoreCommandsInterface(this); } Client.Self.RequestBalance(); base.AfterBotLoginHandler(); diff --git a/Core/bottypes/DialogsBot.cs b/Secondbot/Core/bottypes/DialogsBot.cs similarity index 100% rename from Core/bottypes/DialogsBot.cs rename to Secondbot/Core/bottypes/DialogsBot.cs diff --git a/Core/bottypes/EventsBot.cs b/Secondbot/Core/bottypes/EventsBot.cs similarity index 100% rename from Core/bottypes/EventsBot.cs rename to Secondbot/Core/bottypes/EventsBot.cs diff --git a/Core/bottypes/Log2FileBot.cs b/Secondbot/Core/bottypes/Log2FileBot.cs similarity index 100% rename from Core/bottypes/Log2FileBot.cs rename to Secondbot/Core/bottypes/Log2FileBot.cs diff --git a/Core/bottypes/MessageSwitcherBot.cs b/Secondbot/Core/bottypes/MessageSwitcherBot.cs similarity index 100% rename from Core/bottypes/MessageSwitcherBot.cs rename to Secondbot/Core/bottypes/MessageSwitcherBot.cs diff --git a/Core/bottypes/RLVbot.cs b/Secondbot/Core/bottypes/RLVbot.cs similarity index 99% rename from Core/bottypes/RLVbot.cs rename to Secondbot/Core/bottypes/RLVbot.cs index 68dade0..05484fe 100644 --- a/Core/bottypes/RLVbot.cs +++ b/Secondbot/Core/bottypes/RLVbot.cs @@ -21,7 +21,7 @@ namespace BSB.bottypes if (myconfig.Setting_AllowRLV == true) { Info("RLV: Enabled"); - RLVinterface = new RLV.RLVcontrol(this,false); + RLVinterface = new RLV.RLVcontrol(this); } } } diff --git a/Core/bottypes/SecondBot.cs b/Secondbot/Core/bottypes/SecondBot.cs similarity index 100% rename from Core/bottypes/SecondBot.cs rename to Secondbot/Core/bottypes/SecondBot.cs diff --git a/Core/bottypes/VirtualsBot.cs b/Secondbot/Core/bottypes/VirtualsBot.cs similarity index 100% rename from Core/bottypes/VirtualsBot.cs rename to Secondbot/Core/bottypes/VirtualsBot.cs diff --git a/Core/bottypes/athome.cs b/Secondbot/Core/bottypes/athome.cs similarity index 100% rename from Core/bottypes/athome.cs rename to Secondbot/Core/bottypes/athome.cs diff --git a/Core/bottypes/chatrelay.cs b/Secondbot/Core/bottypes/chatrelay.cs similarity index 100% rename from Core/bottypes/chatrelay.cs rename to Secondbot/Core/bottypes/chatrelay.cs diff --git a/Core/bottypes/loadorder.txt b/Secondbot/Core/bottypes/loadorder.txt similarity index 100% rename from Core/bottypes/loadorder.txt rename to Secondbot/Core/bottypes/loadorder.txt diff --git a/BSBshared/API/API_interface.cs b/Secondbot/Shared/API/API_interface.cs similarity index 92% rename from BSBshared/API/API_interface.cs rename to Secondbot/Shared/API/API_interface.cs index d257171..e23b239 100644 --- a/BSBshared/API/API_interface.cs +++ b/Secondbot/Shared/API/API_interface.cs @@ -9,9 +9,7 @@ namespace BetterSecondBotShared.API { public abstract class API_interface { - public string CommandName { get { return GetType().Name; } } - - public string CommandNameLower { get { return GetType().Name.ToLowerInvariant(); } } + public string CommandName { get { return GetType().Name.ToLowerInvariant(); ; } } public virtual int Min_Required_args { get { return 0; } } public virtual string Helpfile { get { return "No help given"; } } public virtual string[] ArgTypes { get { return new string[] { }; } } @@ -36,7 +34,7 @@ namespace BetterSecondBotShared.API } return null; } - protected virtual void LoadCommandsList(bool wikimode) + protected virtual void LoadCommandsList() { foreach (var com in GetAPICommandClasses()) { @@ -47,11 +45,7 @@ namespace BetterSecondBotShared.API API_interface D = (API_interface)Activator.CreateInstance(com); if (D != null) { - string name = D.CommandNameLower; - if(wikimode == true) - { - name = D.CommandName; - } + string name = D.CommandName; if (subtype_map.ContainsKey(name) == false) { string worknamespace = com.Namespace; @@ -107,7 +101,7 @@ namespace BetterSecondBotShared.API { if (subtype_map.Count() == 0) { - LoadCommandsList(false); + LoadCommandsList(); } return subtype_map.ContainsKey(command); } diff --git a/BSBshared/BotTypes/BasicBot.cs b/Secondbot/Shared/BotTypes/BasicBot.cs similarity index 100% rename from BSBshared/BotTypes/BasicBot.cs rename to Secondbot/Shared/BotTypes/BasicBot.cs diff --git a/BSBshared/IO/SimpleIO.cs b/Secondbot/Shared/IO/SimpleIO.cs similarity index 100% rename from BSBshared/IO/SimpleIO.cs rename to Secondbot/Shared/IO/SimpleIO.cs diff --git a/BSBshared/Json/JsonConfig.cs b/Secondbot/Shared/Json/JsonConfig.cs similarity index 100% rename from BSBshared/Json/JsonConfig.cs rename to Secondbot/Shared/Json/JsonConfig.cs diff --git a/BSBshared/Json/JsonConfigApi.cs b/Secondbot/Shared/Json/JsonConfigApi.cs similarity index 100% rename from BSBshared/Json/JsonConfigApi.cs rename to Secondbot/Shared/Json/JsonConfigApi.cs diff --git a/Secondbot/Shared/Shared.csproj b/Secondbot/Shared/Shared.csproj new file mode 100644 index 0000000..05f498d --- /dev/null +++ b/Secondbot/Shared/Shared.csproj @@ -0,0 +1,18 @@ + + + + Library + netcoreapp3.1 + + + + + + + + + + + + + diff --git a/BSBshared/Staic/Helpers.cs b/Secondbot/Shared/Staic/Helpers.cs similarity index 100% rename from BSBshared/Staic/Helpers.cs rename to Secondbot/Shared/Staic/Helpers.cs diff --git a/BSBshared/Staic/LogFormater.cs b/Secondbot/Shared/Staic/LogFormater.cs similarity index 100% rename from BSBshared/Staic/LogFormater.cs rename to Secondbot/Shared/Staic/LogFormater.cs diff --git a/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.XML b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.XML new file mode 100644 index 0000000..29b150a --- /dev/null +++ b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.XML @@ -0,0 +1,317 @@ + + + + LibreMetaverse.StructuredData + + + + + + + + + + + + + + + + Deserializes binary LLSD + + Serialized data + OSD containting deserialized data + + + + Deserializes binary LLSD + + Stream to read the data from + OSD containting deserialized data + + + + Serializes OSD to binary format. It does no prepend header + + OSD to serialize + Serialized data + + + + Serializes OSD to binary format + + OSD to serialize + + Serialized data + + + + Serializes OSD to binary format. It does no prepend header + + OSD to serialize + Serialized data + + + + Serializes OSD to binary format + + OSD to serialize + + Serialized data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSD Exception + + + + + OSD element base class + + + + + Uses reflection to create an SDMap from all of the SD + serializable types in an object + + Class or struct containing serializable types + An SDMap holding the serialized values from the + container object + + + + Uses reflection to deserialize member variables in an object from + an SDMap + + Reference to an object to fill with deserialized + values + Serialized values to put in the target + object + + + + OSD Boolean Element + + + + + OSD Integer Element + + + + + OSD Floating point Element + + + + + OSD LLSD-XML Element + + + + + OSD String Element + + + + + OSD UUID Element + + + + + OSD DateTime Element + + + + + OSD Uri Element + + + + + OSD Binary Element + + + + + OSD Map Element + + + + + OSD Array Element + + + + diff --git a/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj new file mode 100644 index 0000000..35228d6 --- /dev/null +++ b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj @@ -0,0 +1,91 @@ + + + Local + 14.0.25123 + 2.0 + {89D7A3E5-0000-0000-0000-000000000000} + Debug + LibreMetaverse.StructuredData + JScript + Grid + IE50 + false + netcoreapp3.1 + Debug;Release;DockerBuild + Library + LibreMetaverse.StructuredData + true + + + True + 285212672 + False + + + TRACE;DEBUG + True + 4096 + False + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + none + Linux + false + false + false + linux-x64 + + + True + 285212672 + False + TRACE + LibreMetaverse.StructuredData.XML + False + 4096 + True + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + + + + + + + + True + + + + + + + + + 1.2.0 + Sjofn LLC, OpenMetaverse Developers + LibreMetaverse.StructuredData + Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2019. All rights reserved. + LICENSE.txt + https://github.com/cinderblocks/libremetaverse + + + true + + \ No newline at end of file diff --git a/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.nuspec b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.nuspec new file mode 100644 index 0000000..aac0f8b --- /dev/null +++ b/libremetaverse-core/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.nuspec @@ -0,0 +1,15 @@ + + + + LibreMetaverse.StructuredData + $version$ + Cinder Biscuits + Cinder Biscuits + https://github.com/cinderblocks/libremetaverse/blob/master/LICENSE.txt + https://github.com/cinderblocks/libremetaverse + false + LibreMetaverse structured data library + Copyright 2017 + LMV OMV OpenMetaverse OpenSim Halcyon OpenMetaverseFoundation VirtualWorld Radegast SecondLife + + \ No newline at end of file diff --git a/libremetaverse-core/LibreMetaverse/LibreMetaverse.XML b/libremetaverse-core/LibreMetaverse/LibreMetaverse.XML new file mode 100644 index 0000000..1a7113b --- /dev/null +++ b/libremetaverse-core/LibreMetaverse/LibreMetaverse.XML @@ -0,0 +1,36652 @@ + + + + LibreMetaverse + + + + + Permission request flags, asked when a script wants to control an Avatar + + + + Placeholder for empty values, shouldn't ever see this + + + Script wants ability to take money from you + + + Script wants to take camera controls for you + + + Script wants to remap avatars controls + + + Script wants to trigger avatar animations + This function is not implemented on the grid + + + Script wants to attach or detach the prim or primset to your avatar + + + Script wants permission to release ownership + This function is not implemented on the grid + The concept of "public" objects does not exist anymore. + + + Script wants ability to link/delink with other prims + + + Script wants permission to change joints + This function is not implemented on the grid + + + Script wants permissions to change permissions + This function is not implemented on the grid + + + Script wants to track avatars camera position and rotation + + + Script wants to control your camera + + + Script wants the ability to teleport you + + + + Special commands used in Instant Messages + + + + Indicates a regular IM from another agent + + + Simple notification box with an OK button + + + You've been invited to join a group. + + + Inventory offer + + + Accepted inventory offer + + + Declined inventory offer + + + Group vote + + + An object is offering its inventory + + + Accept an inventory offer from an object + + + Decline an inventory offer from an object + + + Unknown + + + Start a session, or add users to a session + + + Start a session, but don't prune offline users + + + Start a session with your group + + + Start a session without a calling card (finder or objects) + + + Send a message to a session + + + Leave a session + + + Indicates that the IM is from an object + + + Sent an IM to a busy user, this is the auto response + + + Shows the message in the console and chat history + + + Send a teleport lure + + + Response sent to the agent which inititiated a teleport invitation + + + Response sent to the agent which inititiated a teleport invitation + + + Only useful if you have Linden permissions + + + Request a teleport lure + + + IM to tell the user to go to an URL + + + IM for help + + + IM sent automatically on call for help, sends a lure + to each Helper reached + + + Like an IM but won't go to email + + + IM from a group officer to all group members + + + Unknown + + + Unknown + + + Accept a group invitation + + + Decline a group invitation + + + Unknown + + + An avatar is offering you friendship + + + An avatar has accepted your friendship offer + + + An avatar has declined your friendship offer + + + Indicates that a user has started typing + + + Indicates that a user has stopped typing + + + + Flag in Instant Messages, whether the IM should be delivered to + offline avatars as well + + + + Only deliver to online avatars + + + If the avatar is offline the message will be held until + they login next, and possibly forwarded to their e-mail account + + + + Conversion type to denote Chat Packet types in an easier-to-understand format + + + + Whisper (5m radius) + + + Normal chat (10/20m radius), what the official viewer typically sends + + + Shouting! (100m radius) + + + Event message when an Avatar has begun to type + + + Event message when an Avatar has stopped typing + + + Send the message to the debug channel + + + Event message when an object uses llOwnerSay + + + Event message when an object uses llRegionSayTo + + + Special value to support llRegionSay, never sent to the client + + + + Identifies the source of a chat message + + + + Chat from the grid or simulator + + + Chat from another avatar + + + Chat from an object + + + + + + + + + + + + + + + + + + Effect type used in ViewerEffect packets + + + + + + + + + + + + + + + + + + + + + + + + + Project a beam from a source to a destination, such as + the one used when editing an object + + + + + + + + + + + + Create a swirl of particles around an object + + + + + + + + + Cause an avatar to look at an object + + + Cause an avatar to point at an object + + + + The action an avatar is doing when looking at something, used in + ViewerEffect packets for the LookAt effect + + + + + + + + + + + + + + + + + + + + + + Deprecated + + + + + + + + + + + + + + + + The action an avatar is doing when pointing at something, used in + ViewerEffect packets for the PointAt effect + + + + + + + + + + + + + + + + + Money transaction types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flags sent when a script takes or releases a control + + NOTE: (need to verify) These might be a subset of the ControlFlags enum in Movement, + + + No Flags set + + + Forward (W or up Arrow) + + + Back (S or down arrow) + + + Move left (shift+A or left arrow) + + + Move right (shift+D or right arrow) + + + Up (E or PgUp) + + + Down (C or PgDown) + + + Rotate left (A or left arrow) + + + Rotate right (D or right arrow) + + + Left Mouse Button + + + Left Mouse button in MouseLook + + + + Currently only used to hide your group title + + + + No flags set + + + Hide your group title + + + + Action state of the avatar, which can currently be typing and + editing + + + + + + + + + + + + + + Current teleport status + + + + Unknown status + + + Teleport initialized + + + Teleport in progress + + + Teleport failed + + + Teleport completed + + + Teleport cancelled + + + + + + + + No flags set, or teleport failed + + + Set when newbie leaves help island for first time + + + + + + Via Lure + + + Via Landmark + + + Via Location + + + Via Home + + + Via Telehub + + + Via Login + + + Linden Summoned + + + Linden Forced me + + + + + + Agent Teleported Home via Script + + + + + + + + + + + + forced to new location for example when avatar is banned or ejected + + + Teleport Finished via a Lure + + + Finished, Sim Changed + + + Finished, Same Sim + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Type of mute entry + + + + Object muted by name + + + Muted residet + + + Object muted by UUID + + + Muted group + + + Muted external entry + + + + Flags of mute entry + + + + No exceptions + + + Don't mute text chat + + + Don't mute voice chat + + + Don't mute particles + + + Don't mute sounds + + + Don't mute + + + + Instant Message + + + + Key of sender + + + Name of sender + + + Key of destination avatar + + + ID of originating estate + + + Key of originating region + + + Coordinates in originating region + + + Instant message type + + + Group IM session toggle + + + Key of IM session, for Group Messages, the groups UUID + + + Timestamp of the instant message + + + Instant message text + + + Whether this message is held for offline avatars + + + Context specific packed data + + + Print the struct data as a string + A string containing the field name, and field value + + + Represents muted object or resident + + + Type of the mute entry + + + UUID of the mute etnry + + + Mute entry name + + + Mute flags + + + Transaction detail sent with MoneyBalanceReply message + + + Type of the transaction + + + UUID of the transaction source + + + Is the transaction source a group + + + UUID of the transaction destination + + + Is transaction destination a group + + + Transaction amount + + + Transaction description + + + + Manager class for our own avatar + + + + + Called once attachment resource usage information has been collected + + Indicates if operation was successfull + Attachment resource usage information + + + The event subscribers. null if no subcribers + + + Raises the ChatFromSimulator event + A ChatEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a scripted object or agent within range sends a public message + + + The event subscribers. null if no subcribers + + + Raises the ScriptDialog event + A SctriptDialogEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a scripted object sends a dialog box containing possible + options an agent can respond to + + + The event subscribers. null if no subcribers + + + Raises the ScriptQuestion event + A ScriptQuestionEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an object requests a change in the permissions an agent has permitted + + + The event subscribers. null if no subcribers + + + Raises the LoadURL event + A LoadUrlEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a script requests an agent open the specified URL + + + The event subscribers. null if no subcribers + + + Raises the MoneyBalance event + A BalanceEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an agents currency balance is updated + + + The event subscribers. null if no subcribers + + + Raises the MoneyBalanceReply event + A MoneyBalanceReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a transaction occurs involving currency such as a land purchase + + + The event subscribers. null if no subcribers + + + Raises the IM event + A InstantMessageEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an ImprovedInstantMessage packet is recieved from the simulator, this is used for everything from + private messaging to friendship offers. The Dialog field defines what type of message has arrived + + + The event subscribers. null if no subcribers + + + Raises the TeleportProgress event + A TeleportEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an agent has requested a teleport to another location, or when responding to a lure. Raised multiple times + for each teleport indicating the progress of the request + + + The event subscribers. null if no subcribers + + + Raises the AgentDataReply event + A AgentDataReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a simulator sends agent specific information for our avatar. + + + The event subscribers. null if no subcribers + + + Raises the AnimationsChanged event + A AnimationsChangedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when our agents animation playlist changes + + + The event subscribers. null if no subcribers + + + Raises the MeanCollision event + A MeanCollisionEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an object or avatar forcefully collides with our agent + + + The event subscribers. null if no subcribers + + + Raises the RegionCrossed event + A RegionCrossedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when our agent crosses a region border into another region + + + The event subscribers. null if no subcribers + + + Raises the GroupChatJoined event + A GroupChatJoinedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when our agent succeeds or fails to join a group chat session + + + The event subscribers. null if no subcribers + + + Raises the AlertMessage event + A AlertMessageEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a simulator sends an urgent message usually indication the recent failure of + another action we have attempted to take such as an attempt to enter a parcel where we are denied access + + + The event subscribers. null if no subcribers + + + Raises the ScriptControlChange event + A ScriptControlEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a script attempts to take or release specified controls for our agent + + + The event subscribers. null if no subcribers + + + Raises the CameraConstraint event + A CameraConstraintEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator detects our agent is trying to view something + beyond its limits + + + The event subscribers. null if no subcribers + + + Raises the ScriptSensorReply event + A ScriptSensorReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a script sensor reply is received from a simulator + + + The event subscribers. null if no subcribers + + + Raises the AvatarSitResponse event + A AvatarSitResponseEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised in response to a request + + + The event subscribers. null if no subcribers + + + Raises the ChatSessionMemberAdded event + A ChatSessionMemberAddedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an avatar enters a group chat session we are participating in + + + The event subscribers. null if no subcribers + + + Raises the ChatSessionMemberLeft event + A ChatSessionMemberLeftEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when an agent exits a group chat session we are participating in + + + The event subscribers, null of no subscribers + + + Raises the SetDisplayNameReply Event + A SetDisplayNameReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the details of display name change + + + The event subscribers. null if no subcribers + + + Raises the MuteListUpdated event + A EventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a scripted object or agent within range sends a public message + + + Reference to the GridClient instance + + + Used for movement and camera tracking + + + Currently playing animations for the agent. Can be used to + check the current movement status such as walking, hovering, aiming, + etc. by checking against system animations found in the Animations class + + + Dictionary containing current Group Chat sessions and members + + + Dictionary containing mute list keyead on mute name and key + + + Your (client) avatars + "client", "agent", and "avatar" all represent the same thing + + + Temporary assigned to this session, used for + verifying our identity in packets + + + Shared secret that is never sent over the wire + + + Your (client) avatar ID, local to the current region/sim + + + Where the avatar started at login. Can be "last", "home" + or a login + + + The access level of this agent, usually M, PG or A + + + The CollisionPlane of Agent + + + An representing the velocity of our agent + + + An representing the acceleration of our agent + + + A which specifies the angular speed, and axis about which an Avatar is rotating. + + + Position avatar client will goto when login to 'home' or during + teleport request to 'home' region. + + + LookAt point saved/restored with HomePosition + + + Avatar First Name (i.e. Philip) + + + Avatar Last Name (i.e. Linden) + + + LookAt point received with the login response message + + + Avatar Full Name (i.e. Philip Linden) + + + Gets the health of the agent + + + Gets the current balance of the agent + + + Gets the local ID of the prim the agent is sitting on, + zero if the avatar is not currently sitting + + + Gets the of the agents active group. + + + Gets the Agents powers in the currently active group + + + Current status message for teleporting + + + Current position of the agent as a relative offset from + the simulator, or the parent object if we are sitting on something + + + Current rotation of the agent as a relative rotation from + the simulator, or the parent object if we are sitting on something + + + Current position of the agent in the simulator + + + + A representing the agents current rotation + + + + Returns the global grid position of the avatar + + + Various abilities and preferences sent by the grid + + + + Constructor, setup callbacks for packets related to our avatar + + A reference to the Class + + + + Send a text message from the Agent to the Simulator + + A containing the message + The channel to send the message on, 0 is the public channel. Channels above 0 + can be used however only scripts listening on the specified channel will see the message + Denotes the type of message being sent, shout, whisper, etc. + Enables large messages to be split into chunks of 900 with [CHUNKGROUPID|CHUNKID|TOTALCHUNKS] at the start + Hides [CHUNKGROUPID|CHUNKID|TOTALCHUNKS] at the start of chunked messages + + + + Request any instant messages sent while the client was offline to be resent. + + + + + Send an Instant Message to another Avatar + + The recipients + A containing the message to send + + + + Send an Instant Message to an existing group chat or conference chat + + The recipients + A containing the message to send + IM session ID (to differentiate between IM windows) + + + + Send an Instant Message + + The name this IM will show up as being from + Key of Avatar + Text message being sent + IM session ID (to differentiate between IM windows) + IDs of sessions for a conference + + + + Send an Instant Message + + The name this IM will show up as being from + Key of Avatar + Text message being sent + IM session ID (to differentiate between IM windows) + Type of instant message to send + Whether to IM offline avatars as well + Senders Position + RegionID Sender is In + Packed binary data that is specific to + the dialog type + + + + Send an Instant Message to a group + + of the group to send message to + Text Message being sent. + + + + Send an Instant Message to a group the agent is a member of + + The name this IM will show up as being from + of the group to send message to + Text message being sent + + + + Send a request to join a group chat session + + of Group to leave + + + + Exit a group chat session. This will stop further Group chat messages + from being sent until session is rejoined. + + of Group chat session to leave + + + + Reply to script dialog questions. + + Channel initial request came on + Index of button you're "clicking" + Label of button you're "clicking" + of Object that sent the dialog request + + + + + Accept invite for to a chatterbox session + + of session to accept invite to + + + + Start a friends conference + + List of UUIDs to start a conference with + the temporary session ID returned in the callback> + + + + Start a particle stream between an agent and an object + + Key of the source agent + Key of the target object + + The type from the enum + A unique for this effect + + + + Start a particle stream between an agent and an object + + Key of the source agent + Key of the target object + A representing the beams offset from the source + A which sets the avatars lookat animation + of the Effect + + + + Create a particle beam between an avatar and an primitive + + The ID of source avatar + The ID of the target primitive + global offset + A object containing the combined red, green, blue and alpha + color values of particle beam + a float representing the duration the parcicle beam will last + A Unique ID for the beam + + + + + Create a particle swirl around a target position using a packet + + global offset + A object containing the combined red, green, blue and alpha + color values of particle beam + a float representing the duration the parcicle beam will last + A Unique ID for the beam + + + + Sends a request to sit on the specified object + + of the object to sit on + Sit at offset + + + + Follows a call to to actually sit on the object + + + + Stands up from sitting on a prim or the ground + true of AgentUpdate was sent + + + + Does a "ground sit" at the avatar's current position + + + + + Starts or stops flying + + True to start flying, false to stop flying + + + + Starts or stops crouching + + True to start crouching, false to stop crouching + + + + Starts a jump (begin holding the jump key) + + + + + Use the autopilot sim function to move the avatar to a new + position. Uses double precision to get precise movements + + The z value is currently not handled properly by the simulator + Global X coordinate to move to + Global Y coordinate to move to + Z coordinate to move to + + + + Use the autopilot sim function to move the avatar to a new position + + The z value is currently not handled properly by the simulator + Integer value for the global X coordinate to move to + Integer value for the global Y coordinate to move to + Floating-point value for the Z coordinate to move to + + + + Use the autopilot sim function to move the avatar to a new position + + The z value is currently not handled properly by the simulator + Integer value for the local X coordinate to move to + Integer value for the local Y coordinate to move to + Floating-point value for the Z coordinate to move to + + + Macro to cancel autopilot sim function + Not certain if this is how it is really done + true if control flags were set and AgentUpdate was sent to the simulator + + + + Grabs an object + + an unsigned integer of the objects ID within the simulator + + + + + Overload: Grab a simulated object + + an unsigned integer of the objects ID within the simulator + + The texture coordinates to grab + The surface coordinates to grab + The face of the position to grab + The region coordinates of the position to grab + The surface normal of the position to grab (A normal is a vector perpendicular to the surface) + The surface bi-normal of the position to grab (A bi-normal is a vector tangent to the surface + pointing along the U direction of the tangent space + + + + Drag an object + + of the object to drag + Drag target in region coordinates + + + + Overload: Drag an object + + of the object to drag + Drag target in region coordinates + + The texture coordinates to grab + The surface coordinates to grab + The face of the position to grab + The region coordinates of the position to grab + The surface normal of the position to grab (A normal is a vector perpendicular to the surface) + The surface bi-normal of the position to grab (A bi-normal is a vector tangent to the surface + pointing along the U direction of the tangent space + + + + Release a grabbed object + + The Objects Simulator Local ID + + + + + + + Release a grabbed object + + The Objects Simulator Local ID + The texture coordinates to grab + The surface coordinates to grab + The face of the position to grab + The region coordinates of the position to grab + The surface normal of the position to grab (A normal is a vector perpendicular to the surface) + The surface bi-normal of the position to grab (A bi-normal is a vector tangent to the surface + pointing along the U direction of the tangent space + + + + Touches an object + + an unsigned integer of the objects ID within the simulator + + + + + Request the current L$ balance + + + + + Give Money to destination Avatar + + UUID of the Target Avatar + Amount in L$ + + + + Give Money to destination Avatar + + UUID of the Target Avatar + Amount in L$ + Description that will show up in the + recipients transaction history + + + + Give L$ to an object + + object to give money to + amount of L$ to give + name of object + + + + Give L$ to a group + + group to give money to + amount of L$ to give + + + + Give L$ to a group + + group to give money to + amount of L$ to give + description of transaction + + + + Pay texture/animation upload fee + + + + + Pay texture/animation upload fee + + description of the transaction + + + + Give Money to destination Object or Avatar + + UUID of the Target Object/Avatar + Amount in L$ + Reason (Optional normally) + The type of transaction + Transaction flags, mostly for identifying group + transactions + + + + Plays a gesture + + Asset of the gesture + + + + Mark gesture active + + Inventory of the gesture + Asset of the gesture + + + + Mark gesture inactive + + Inventory of the gesture + + + + Send an AgentAnimation packet that toggles a single animation on + + The of the animation to start playing + Whether to ensure delivery of this packet or not + + + + Send an AgentAnimation packet that toggles a single animation off + + The of a + currently playing animation to stop playing + Whether to ensure delivery of this packet or not + + + + Send an AgentAnimation packet that will toggle animations on or off + + A list of animation s, and whether to + turn that animation on or off + Whether to ensure delivery of this packet or not + + + + Teleports agent to their stored home location + + true on successful teleport to home location + + + + Teleport agent to a landmark + + of the landmark to teleport agent to + true on success, false on failure + + + + Attempt to look up a simulator name and teleport to the discovered + destination + + Region name to look up + Position to teleport to + True if the lookup and teleport were successful, otherwise + false + + + + Attempt to look up a simulator name and teleport to the discovered + destination + + Region name to look up + Position to teleport to + Target to look at + True if the lookup and teleport were successful, otherwise + false + + + + Teleport agent to another region + + handle of region to teleport agent to + position in destination sim to teleport to + true on success, false on failure + This call is blocking + + + + Teleport agent to another region + + handle of region to teleport agent to + position in destination sim to teleport to + direction in destination sim agent will look at + true on success, false on failure + This call is blocking + + + + Request teleport to a another simulator + + handle of region to teleport agent to + position in destination sim to teleport to + + + + Request teleport to a another simulator + + handle of region to teleport agent to + position in destination sim to teleport to + direction in destination sim agent will look at + + + + Teleport agent to a landmark + + of the landmark to teleport agent to + + + + Send a teleport lure to another avatar with default "Join me in ..." invitation message + + target avatars to lure + + + + Send a teleport lure to another avatar with custom invitation message + + target avatars to lure + custom message to send with invitation + + + + Respond to a teleport lure by either accepting it and initiating + the teleport, or denying it + + of the avatar sending the lure + IM session of the incoming lure request + true to accept the lure, false to decline it + + + + Request a teleport lure from another agent + + of the avatar lure is being requested from + IM session + message to send with request + + + + Update agent profile + + struct containing updated + profile information + + + + Update agents profile interests + + selection of interests from struct + + + + Set the height and the width of the client window. This is used + by the server to build a virtual camera frustum for our avatar + + New height of the viewer window + New width of the viewer window + + + + Request the list of muted objects and avatars for this agent + + + + + Mute an object, resident, etc. + + Mute type + Mute UUID + Mute name + + + + Mute an object, resident, etc. + + Mute type + Mute UUID + Mute name + Mute flags + + + + Unmute an object, resident, etc. + + Mute UUID + Mute name + + + + Sets home location to agents current position + + will fire an AlertMessage () with + success or failure message + + + + Move an agent in to a simulator. This packet is the last packet + needed to complete the transition in to a new simulator + + Object + + + + Reply to script permissions request + + Object + of the itemID requesting permissions + of the taskID requesting permissions + list of permissions to allow + + + + Respond to a group invitation by either accepting or denying it + + UUID of the group (sent in the AgentID field of the invite message) + IM Session ID from the group invitation message + Accept the group invitation or deny it + + + + Requests script detection of objects and avatars + + name of the object/avatar to search for + UUID of the object or avatar to search for + Type of search from ScriptSensorTypeFlags + range of scan (96 max?) + the arc in radians to search within + an user generated ID to correlate replies with + Simulator to perform search in + + + + Create or update profile pick + + UUID of the pick to update, or random UUID to create a new pick + Is this a top pick? (typically false) + UUID of the parcel (UUID.Zero for the current parcel) + Name of the pick + Global position of the pick landmark + UUID of the image displayed with the pick + Long description of the pick + + + + Delete profile pick + + UUID of the pick to delete + + + + Create or update profile Classified + + UUID of the classified to update, or random UUID to create a new classified + Defines what category the classified is in + UUID of the image displayed with the classified + Price that the classified will cost to place for a week + Global position of the classified landmark + Name of the classified + Long description of the classified + if true, auto renew classified after expiration + + + + Create or update profile Classified + + UUID of the classified to update, or random UUID to create a new classified + Defines what category the classified is in + UUID of the image displayed with the classified + Price that the classified will cost to place for a week + Name of the classified + Long description of the classified + if true, auto renew classified after expiration + + + + Delete a classified ad + + The classified ads ID + + + + Fetches resource usage by agents attachments + + Called when the requested information is collected + + + + Initiates request to set a new display name + + Previous display name + Desired new display name + + + + Tells the sim what UI language is used, and if it's ok to share that with scripts + + Two letter language code + Share language info with scripts + + + + Sets agents maturity access level + + PG, M or A + + + + Sets agents maturity access level + + PG, M or A + Callback function + + + + Sets agents hover height. + + Hover height [-2.0, 2.0] + + + + Take an incoming ImprovedInstantMessage packet, auto-parse, and if + OnInstantMessage is defined call that with the appropriate arguments + + The sender + The EventArgs object containing the packet data + + + + Take an incoming Chat packet, auto-parse, and if OnChat is defined call + that with the appropriate arguments. + + The sender + The EventArgs object containing the packet data + + + + Used for parsing llDialogs + + The sender + The EventArgs object containing the packet data + + + + Used for parsing llRequestPermissions dialogs + + The sender + The EventArgs object containing the packet data + + + + Handles Script Control changes when Script with permissions releases or takes a control + + The sender + The EventArgs object containing the packet data + + + + Used for parsing llLoadURL Dialogs + + The sender + The EventArgs object containing the packet data + + + + Update client's Position, LookAt and region handle from incoming packet + + The sender + The EventArgs object containing the packet data + This occurs when after an avatar moves into a new sim + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + EQ Message fired with the result of SetDisplayName request + + The message key + the IMessage object containing the deserialized data sent from the simulator + The which originated the packet + + + + Process TeleportFailed message sent via EventQueue, informs agent its last teleport has failed and why. + + The Message Key + An IMessage object Deserialized from the recieved message event + The simulator originating the event message + + + + Process TeleportFinish from Event Queue and pass it onto our TeleportHandler + + The message system key for this event + IMessage object containing decoded data from OSD + The simulator originating the event message + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Crossed region handler for message that comes across the EventQueue. Sent to an agent + when the agent crosses a sim border into a new region. + + The message key + the IMessage object containing the deserialized data sent from the simulator + The which originated the packet + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + This packet is now being sent via the EventQueue + + + + Group Chat event handler + + The capability Key + IMessage object containing decoded data from OSD + + + + + Response from request to join a group chat + + + IMessage object containing decoded data from OSD + + + + + Someone joined or left group chat + + + IMessage object containing decoded data from OSD + + + + + Handle a group chat Invitation + + Caps Key + IMessage object containing decoded data from OSD + Originating Simulator + + + + Moderate a chat session + + the of the session to moderate, for group chats this will be the groups UUID + the of the avatar to moderate + Either "voice" to moderate users voice, or "text" to moderate users text session + true to moderate (silence user), false to allow avatar to speak + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Agent movement and camera control + + Agent movement is controlled by setting specific + After the control flags are set, An AgentUpdate is required to update the simulator of the specified flags + This is most easily accomplished by setting one or more of the AgentMovement properties + + Movement of an avatar is always based on a compass direction, for example AtPos will move the + agent from West to East or forward on the X Axis, AtNeg will of course move agent from + East to West or backward on the X Axis, LeftPos will be South to North or forward on the Y Axis + The Z axis is Up, finer grained control of movements can be done using the Nudge properties + + + + + Camera controls for the agent, mostly a thin wrapper around + CoordinateFrame. This class is only responsible for state + tracking and math, it does not send any packets + + + + + + + The camera is a local frame of reference inside of + the larger grid space. This is where the math happens + + + + + + + + + + + + + + + + Default constructor + + + + Move agent positive along the X axis + + + Move agent negative along the X axis + + + Move agent positive along the Y axis + + + Move agent negative along the Y axis + + + Move agent positive along the Z axis + + + Move agent negative along the Z axis + + + + + + + + + + + + + + + + + + + + + + + + Causes simulator to make agent fly + + + Stop movement + + + Finish animation + + + Stand up from a sit + + + Tells simulator to sit agent on ground + + + Place agent into mouselook mode + + + Nudge agent positive along the X axis + + + Nudge agent negative along the X axis + + + Nudge agent positive along the Y axis + + + Nudge agent negative along the Y axis + + + Nudge agent positive along the Z axis + + + Nudge agent negative along the Z axis + + + + + + + + + Tell simulator to mark agent as away + + + + + + + + + + + + + + + + Returns "always run" value, or changes it by sending a SetAlwaysRunPacket + + + + The current value of the agent control flags + + + Gets or sets the interval in milliseconds at which + AgentUpdate packets are sent to the current simulator. Setting + this to a non-zero value will also enable the packet sending if + it was previously off, and setting it to zero will disable + + + Gets or sets whether AgentUpdate packets are sent to + the current simulator + + + Reset movement controls every time we send an update + + + Agent camera controls + + + Currently only used for hiding your group title + + + Action state of the avatar, which can currently be + typing and editing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Timer for sending AgentUpdate packets + + + Default constructor + + + + Send an AgentUpdate with the camera set at the current agent + position and pointing towards the heading specified + + Camera rotation in radians + Whether to send the AgentUpdate reliable + or not + + + + Rotates the avatar body and camera toward a target position. + This will also anchor the camera position on the avatar + + Region coordinates to turn toward + + + + Rotates the avatar body and camera toward a target position. + This will also anchor the camera position on the avatar + + Region coordinates to turn toward + whether to send update or not + + + + Send new AgentUpdate packet to update our current camera + position and rotation + + + + + Send new AgentUpdate packet to update our current camera + position and rotation + + Whether to require server acknowledgement + of this packet + + + + Send new AgentUpdate packet to update our current camera + position and rotation + + Whether to require server acknowledgement + of this packet + Simulator to send the update to + + + + Builds an AgentUpdate packet entirely from parameters. This + will not touch the state of Self.Movement or + Self.Movement.Camera in any way + + + + + + + + + + + + + + + + Sends update of Field of Vision vertical angle to the simulator + + Angle in radians + + + + Used to specify movement actions for your agent + + + + Empty flag + + + Move Forward (SL Keybinding: W/Up Arrow) + + + Move Backward (SL Keybinding: S/Down Arrow) + + + Move Left (SL Keybinding: Shift-(A/Left Arrow)) + + + Move Right (SL Keybinding: Shift-(D/Right Arrow)) + + + Not Flying: Jump/Flying: Move Up (SL Keybinding: E) + + + Not Flying: Croutch/Flying: Move Down (SL Keybinding: C) + + + Unused + + + Unused + + + Unused + + + Unused + + + ORed with AGENT_CONTROL_AT_* if the keyboard is being used + + + ORed with AGENT_CONTROL_LEFT_* if the keyboard is being used + + + ORed with AGENT_CONTROL_UP_* if the keyboard is being used + + + Fly + + + + + + Finish our current animation + + + Stand up from the ground or a prim seat + + + Sit on the ground at our current location + + + Whether mouselook is currently enabled + + + Legacy, used if a key was pressed for less than a certain amount of time + + + Legacy, used if a key was pressed for less than a certain amount of time + + + Legacy, used if a key was pressed for less than a certain amount of time + + + Legacy, used if a key was pressed for less than a certain amount of time + + + Legacy, used if a key was pressed for less than a certain amount of time + + + Legacy, used if a key was pressed for less than a certain amount of time + + + + + + + + + Set when the avatar is idled or set to away. Note that the away animation is + activated separately from setting this flag + + + + + + + + + + + + + + + + Class for sending info on the success of the opration + of setting the maturity access level + + + + + New maturity accesss level returned from the sim + + + + + True if setting the new maturity access level has succedded + + + + + Creates new instance of the EventArgs class + + Has setting new maturty access level succeeded + New maturity access level as returned by the simulator + + + + + + + + Get the simulator sending the message + + + Get the message sent + + + Get the audible level of the message + + + Get the type of message sent: whisper, shout, etc + + + Get the source type of the message sender + + + Get the name of the agent or object sending the message + + + Get the ID of the agent or object sending the message + + + Get the ID of the object owner, or the agent ID sending the message + + + Get the position of the agent or object sending the message + + + + Construct a new instance of the ChatEventArgs object + + Sim from which the message originates + The message sent + The audible level of the message + The type of message sent: whisper, shout, etc + The source type of the message sender + The name of the agent or object sending the message + The ID of the agent or object sending the message + The ID of the object owner, or the agent ID sending the message + The position of the agent or object sending the message + + + Contains the data sent when a primitive opens a dialog with this agent + + + Get the dialog message + + + Get the name of the object that sent the dialog request + + + Get the ID of the image to be displayed + + + Get the ID of the primitive sending the dialog + + + Get the first name of the senders owner + + + Get the last name of the senders owner + + + Get the communication channel the dialog was sent on, responses + should also send responses on this same channel + + + Get the string labels containing the options presented in this dialog + + + UUID of the scritped object owner + + + + Construct a new instance of the ScriptDialogEventArgs + + The dialog message + The name of the object that sent the dialog request + The ID of the image to be displayed + The ID of the primitive sending the dialog + The first name of the senders owner + The last name of the senders owner + The communication channel the dialog was sent on + The string labels containing the options presented in this dialog + UUID of the scritped object owner + + + Contains the data sent when a primitive requests debit or other permissions + requesting a YES or NO answer + + + Get the simulator containing the object sending the request + + + Get the ID of the script making the request + + + Get the ID of the primitive containing the script making the request + + + Get the name of the primitive making the request + + + Get the name of the owner of the object making the request + + + Get the permissions being requested + + + + Construct a new instance of the ScriptQuestionEventArgs + + The simulator containing the object sending the request + The ID of the script making the request + The ID of the primitive containing the script making the request + The name of the primitive making the request + The name of the owner of the object making the request + The permissions being requested + + + Contains the data sent when a primitive sends a request + to an agent to open the specified URL + + + Get the name of the object sending the request + + + Get the ID of the object sending the request + + + Get the ID of the owner of the object sending the request + + + True if the object is owned by a group + + + Get the message sent with the request + + + Get the URL the object sent + + + + Construct a new instance of the LoadUrlEventArgs + + The name of the object sending the request + The ID of the object sending the request + The ID of the owner of the object sending the request + True if the object is owned by a group + The message sent with the request + The URL the object sent + + + The date received from an ImprovedInstantMessage + + + Get the InstantMessage object + + + Get the simulator where the InstantMessage origniated + + + + Construct a new instance of the InstantMessageEventArgs object + + the InstantMessage object + the simulator where the InstantMessage origniated + + + Contains the currency balance + + + + Get the currenct balance + + + + + Construct a new BalanceEventArgs object + + The currenct balance + + + Contains the transaction summary when an item is purchased, + money is given, or land is purchased + + + Get the ID of the transaction + + + True of the transaction was successful + + + Get the remaining currency balance + + + Get the meters credited + + + Get the meters comitted + + + Get the description of the transaction + + + Detailed transaction information + + + + Construct a new instance of the MoneyBalanceReplyEventArgs object + + The ID of the transaction + True of the transaction was successful + The current currency balance + The meters credited + The meters comitted + A brief description of the transaction + Transaction info + + + Data sent from the simulator containing information about your agent and active group information + + + Get the agents first name + + + Get the agents last name + + + Get the active group ID of your agent + + + Get the active groups title of your agent + + + Get the combined group powers of your agent + + + Get the active group name of your agent + + + + Construct a new instance of the AgentDataReplyEventArgs object + + The agents first name + The agents last name + The agents active group ID + The group title of the agents active group + The combined group powers the agent has in the active group + The name of the group the agent has currently active + + + Data sent by the simulator to indicate the active/changed animations + applied to your agent + + + Get the dictionary that contains the changed animations + + + + Construct a new instance of the AnimationsChangedEventArgs class + + The dictionary that contains the changed animations + + + + Data sent from a simulator indicating a collision with your agent + + + + Get the Type of collision + + + Get the ID of the agent or object that collided with your agent + + + Get the ID of the agent that was attacked + + + A value indicating the strength of the collision + + + Get the time the collision occurred + + + + Construct a new instance of the MeanCollisionEventArgs class + + The type of collision that occurred + The ID of the agent or object that perpetrated the agression + The ID of the Victim + The strength of the collision + The Time the collision occurred + + + Data sent to your agent when it crosses region boundaries + + + Get the simulator your agent just left + + + Get the simulator your agent is now in + + + + Construct a new instance of the RegionCrossedEventArgs class + + The simulator your agent just left + The simulator your agent is now in + + + Data sent from the simulator when your agent joins a group chat session + + + Get the ID of the group chat session + + + Get the name of the session + + + Get the temporary session ID used for establishing new sessions + + + True if your agent successfully joined the session + + + + Construct a new instance of the GroupChatJoinedEventArgs class + + The ID of the session + The name of the session + A temporary session id used for establishing new sessions + True of your agent successfully joined the session + + + Data sent by the simulator containing urgent messages + + + Get the alert message + + + + Construct a new instance of the AlertMessageEventArgs class + + The alert message + + + Data sent by a script requesting to take or release specified controls to your agent + + + Get the controls the script is attempting to take or release to the agent + + + True if the script is passing controls back to the agent + + + True if the script is requesting controls be released to the script + + + + Construct a new instance of the ScriptControlEventArgs class + + The controls the script is attempting to take or release to the agent + True if the script is passing controls back to the agent + True if the script is requesting controls be released to the script + + + + Data sent from the simulator to an agent to indicate its view limits + + + + Get the collision plane + + + + Construct a new instance of the CameraConstraintEventArgs class + + The collision plane + + + + Data containing script sensor requests which allow an agent to know the specific details + of a primitive sending script sensor requests + + + + Get the ID of the primitive sending the sensor + + + Get the ID of the group associated with the primitive + + + Get the name of the primitive sending the sensor + + + Get the ID of the primitive sending the sensor + + + Get the ID of the owner of the primitive sending the sensor + + + Get the position of the primitive sending the sensor + + + Get the range the primitive specified to scan + + + Get the rotation of the primitive sending the sensor + + + Get the type of sensor the primitive sent + + + Get the velocity of the primitive sending the sensor + + + + Construct a new instance of the ScriptSensorReplyEventArgs + + The ID of the primitive sending the sensor + The ID of the group associated with the primitive + The name of the primitive sending the sensor + The ID of the primitive sending the sensor + The ID of the owner of the primitive sending the sensor + The position of the primitive sending the sensor + The range the primitive specified to scan + The rotation of the primitive sending the sensor + The type of sensor the primitive sent + The velocity of the primitive sending the sensor + + + Contains the response data returned from the simulator in response to a + + + Get the ID of the primitive the agent will be sitting on + + + True if the simulator Autopilot functions were involved + + + Get the camera offset of the agent when seated + + + Get the camera eye offset of the agent when seated + + + True of the agent will be in mouselook mode when seated + + + Get the position of the agent when seated + + + Get the rotation of the agent when seated + + + Construct a new instance of the AvatarSitResponseEventArgs object + + + Data sent when an agent joins a chat session your agent is currently participating in + + + Get the ID of the chat session + + + Get the ID of the agent that joined + + + + Construct a new instance of the ChatSessionMemberAddedEventArgs object + + The ID of the chat session + The ID of the agent joining + + + Data sent when an agent exits a chat session your agent is currently participating in + + + Get the ID of the chat session + + + Get the ID of the agent that left + + + + Construct a new instance of the ChatSessionMemberLeftEventArgs object + + The ID of the chat session + The ID of the Agent that left + + + Event arguments with the result of setting display name operation + + + Status code, 200 indicates settign display name was successful + + + Textual description of the status + + + Details of the newly set display name + + + Default constructor + + + + Throttles the network traffic for various different traffic types. + Access this class through GridClient.Throttle + + + + Maximum bits per second for resending unacknowledged packets + + + Maximum bits per second for LayerData terrain + + + Maximum bits per second for LayerData wind data + + + Maximum bits per second for LayerData clouds + + + Unknown, includes object data + + + Maximum bits per second for textures + + + Maximum bits per second for downloaded assets + + + Maximum bits per second the entire connection, divided up + between invidiual streams using default multipliers + + + + Default constructor, uses a default high total of 1500 KBps (1536000) + + + + + Constructor that decodes an existing AgentThrottle packet in to + individual values + + Reference to the throttle data in an AgentThrottle + packet + Offset position to start reading at in the + throttle data + This is generally not needed in clients as the server will + never send a throttle packet to the client + + + + Send an AgentThrottle packet to the current server using the + current values + + + + + Send an AgentThrottle packet to the specified server using the + current values + + + + + Convert the current throttle values to a byte array that can be put + in an AgentThrottle packet + + Byte array containing all the throttle values + + + + Static pre-defined animations available to all agents + + + + Agent with afraid expression on face + + + Agent aiming a bazooka (right handed) + + + Agent aiming a bow (left handed) + + + Agent aiming a hand gun (right handed) + + + Agent aiming a rifle (right handed) + + + Agent with angry expression on face + + + Agent hunched over (away) + + + Agent doing a backflip + + + Agent laughing while holding belly + + + Agent blowing a kiss + + + Agent with bored expression on face + + + Agent bowing to audience + + + Agent brushing himself/herself off + + + Agent in busy mode + + + Agent clapping hands + + + Agent doing a curtsey bow + + + Agent crouching + + + Agent crouching while walking + + + Agent crying + + + Agent unanimated with arms out (e.g. setting appearance) + + + Agent re-animated after set appearance finished + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent dancing + + + Agent on ground unanimated + + + Agent boozing it up + + + Agent with embarassed expression on face + + + Agent with afraid expression on face + + + Agent with angry expression on face + + + Agent with bored expression on face + + + Agent crying + + + Agent showing disdain (dislike) for something + + + Agent with embarassed expression on face + + + Agent with frowning expression on face + + + Agent with kissy face + + + Agent expressing laughgter + + + Agent with open mouth + + + Agent with repulsed expression on face + + + Agent expressing sadness + + + Agent shrugging shoulders + + + Agent with a smile + + + Agent expressing surprise + + + Agent sticking tongue out + + + Agent with big toothy smile + + + Agent winking + + + Agent expressing worry + + + Agent falling down + + + Agent walking (feminine version) + + + Agent wagging finger (disapproval) + + + I'm not sure I want to know + + + Agent in superman position + + + Agent in superman position + + + Agent greeting another + + + Agent holding bazooka (right handed) + + + Agent holding a bow (left handed) + + + Agent holding a handgun (right handed) + + + Agent holding a rifle (right handed) + + + Agent throwing an object (right handed) + + + Agent in static hover + + + Agent hovering downward + + + Agent hovering upward + + + Agent being impatient + + + Agent jumping + + + Agent jumping with fervor + + + Agent point to lips then rear end + + + Agent landing from jump, finished flight, etc + + + Agent laughing + + + Agent landing from jump, finished flight, etc + + + Agent sitting on a motorcycle + + + + + + Agent moving head side to side + + + Agent moving head side to side with unhappy expression + + + Agent taunting another + + + + + + Agent giving peace sign + + + Agent pointing at self + + + Agent pointing at another + + + Agent preparing for jump (bending knees) + + + Agent punching with left hand + + + Agent punching with right hand + + + Agent acting repulsed + + + Agent trying to be Chuck Norris + + + Rocks, Paper, Scissors 1, 2, 3 + + + Agent with hand flat over other hand + + + Agent with fist over other hand + + + Agent with two fingers spread over other hand + + + Agent running + + + Agent appearing sad + + + Agent saluting + + + Agent shooting bow (left handed) + + + Agent cupping mouth as if shouting + + + Agent shrugging shoulders + + + Agent in sit position + + + Agent in sit position (feminine) + + + Agent in sit position (generic) + + + Agent sitting on ground + + + Agent sitting on ground + + + + + + Agent sleeping on side + + + Agent smoking + + + Agent inhaling smoke + + + + + + Agent taking a picture + + + Agent standing + + + Agent standing up + + + Agent standing + + + Agent standing + + + Agent standing + + + Agent standing + + + Agent stretching + + + Agent in stride (fast walk) + + + Agent surfing + + + Agent acting surprised + + + Agent striking with a sword + + + Agent talking (lips moving) + + + Agent throwing a tantrum + + + Agent throwing an object (right handed) + + + Agent trying on a shirt + + + Agent turning to the left + + + Agent turning to the right + + + Agent typing + + + Agent walking + + + Agent whispering + + + Agent whispering with fingers in mouth + + + Agent winking + + + Agent winking + + + Agent worried + + + Agent nodding yes + + + Agent nodding yes with happy face + + + Agent floating with legs and arms crossed + + + + A dictionary containing all pre-defined animations + + A dictionary containing the pre-defined animations, + where the key is the animations ID, and the value is a string + containing a name to identify the purpose of the animation + + + + Index of TextureEntry slots for avatar appearances + + + + + Bake layers for avatar appearance + + + + + Appearance Flags, introdued with server side baking, currently unused + + + + Mask for multiple attachments + + + Mapping between BakeType and AvatarTextureIndex + + + Maximum number of concurrent downloads for wearable assets and textures + + + Maximum number of concurrent uploads for baked textures + + + Timeout for fetching inventory listings + + + Timeout for fetching a single wearable, or receiving a single packet response + + + Timeout for fetching a single texture + + + Timeout for uploading a single baked texture + + + Number of times to retry bake upload + + + When changing outfit, kick off rebake after + 20 seconds has passed since the last change + + + Total number of wearables allowed for each avatar + + + Total number of wearables for each avatar + + + Total number of baked textures on each avatar + + + Total number of wearables per bake layer + + + Map of what wearables are included in each bake + + + Magic values to finalize the cache check hashes for each + bake + + + Default avatar texture, used to detect when a custom + texture is not set for a face + + + + Contains information about a wearable inventory item + + + + Inventory ItemID of the wearable + + + AssetID of the wearable asset + + + WearableType of the wearable + + + AssetType of the wearable + + + Asset data for the wearable + + + + Data collected from visual params for each wearable + needed for the calculation of the color + + + + + Holds a texture assetID and the data needed to bake this layer into + an outfit texture. Used to keep track of currently worn textures + and baking data + + + + A texture AssetID + + + Asset data for the texture + + + Collection of alpha masks that needs applying + + + Tint that should be applied to the texture + + + Where on avatar does this texture belong + + + The event subscribers. null if no subcribers + + + Raises the AgentWearablesReply event + An AgentWearablesReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Triggered when an AgentWearablesUpdate packet is received, + telling us what our avatar is currently wearing + request. + + + The event subscribers. null if no subcribers + + + Raises the CachedBakesReply event + An AgentCachedBakesReplyEventArgs object containing the + data returned from the data server AgentCachedTextureResponse + + + Thread sync lock object + + + Raised when an AgentCachedTextureResponse packet is + received, giving a list of cached bakes that were found on the + simulator + request. + + + The event subscribers. null if no subcribers + + + Raises the AppearanceSet event + An AppearanceSetEventArgs object indicating if the operatin was successfull + + + Thread sync lock object + + + + Raised when appearance data is sent to the simulator, also indicates + the main appearance thread is finished. + + request. + + + The event subscribers. null if no subcribers + + + Raises the RebakeAvatarRequested event + An RebakeAvatarTexturesEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + + Triggered when the simulator requests the agent rebake its appearance. + + + + + + Returns true if AppearanceManager is busy and trying to set or change appearance will fail + + + + Visual parameters last sent to the sim + + + Textures about this client sent to the sim + + + A cache of wearables currently being worn + + + A cache of attachments currently being worn + + + A cache of textures currently being worn + + + Incrementing serial number for AgentCachedTexture packets + + + Incrementing serial number for AgentSetAppearance packets + + + Indicates if WearablesRequest succeeded + + + Indicates whether or not the appearance thread is currently + running, to prevent multiple appearance threads from running + simultaneously + + + Reference to our agent + + + + Timer used for delaying rebake on changing outfit + + + + + Main appearance thread + + + + + Main appearance cancellation token source + + + + + Is server baking complete. It needs doing only once + + + + + Default constructor + + A reference to our agent + + + + Obsolete method for setting appearance. This function no longer does anything. + Use RequestSetAppearance() to manually start the appearance thread + + + + + Obsolete method for setting appearance. This function no longer does anything. + Use RequestSetAppearance() to manually start the appearance thread + + Unused parameter + + + + Starts the appearance setting thread + + + + + Starts the appearance setting thread + + True to force rebaking, otherwise false + + + + Check if current region supports server side baking + + True if server side baking support is detected + + + + Ask the server what textures our agent is currently wearing + + + + + Build hashes out of the texture assetIDs for each baking layer to + ask the simulator whether it has cached copies of each baked texture + + + + + OBSOLETE! Returns the AssetID of the first asset that is currently + being worn in a given WearableType slot + + WearableType slot to get the AssetID for + The UUID of the asset being worn in the given slot, or + UUID.Zero if no wearable is attached to the given slot or wearables + have not been downloaded yet + + + + Add a wearable to the current outfit and set appearance + + Wearable to be added to the outfit + + + + Add a wearable to the current outfit and set appearance + + Wearable to be added to the outfit + Should existing item on the same point or of the same type be replaced + + + + Add a list of wearables to the current outfit and set appearance + + List of wearable inventory items to + be added to the outfit + + + + Add a list of wearables to the current outfit and set appearance + + List of wearable inventory items to + be added to the outfit + Should existing item on the same point or of the same type be replaced + + + + Remove a wearable from the current outfit and set appearance + + Wearable to be removed from the outfit + + + + Removes a list of wearables from the current outfit and set appearance + + List of wearable inventory items to + be removed from the outfit + + + + Replace the current outfit with a list of wearables and set appearance + + List of wearable inventory items that + define a new outfit + + + + Replace the current outfit with a list of wearables and set appearance + + List of wearable inventory items that + define a new outfit + Check if we have all body parts, set this to false only + if you know what you're doing + + + + Checks if an inventory item is currently being worn + + The inventory item to check against the agent + wearables + The WearableType slot that the item is being worn in, + or WearbleType.Invalid if it is not currently being worn + + + + Returns a collection of the agents currently worn wearables + + A copy of the agents currently worn wearables + Avoid calling this function multiple times as it will make + a copy of all of the wearable data each time + + + + Calls either or + depending on the value of + replaceItems + + List of wearable inventory items to add + to the outfit or become a new outfit + True to replace existing items with the + new list of items, false to add these items to the existing outfit + + + + Adds a list of attachments to our agent + + A List containing the attachments to add + If true, tells simulator to remove existing attachment + If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments) + first + + + + Attach an item to our agent at a specific attach point + + A to attach + the on the avatar + to attach the item to + + + + Attach an item to our agent at a specific attach point + + A to attach + the on the avatar + If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments) + to attach the item to + + + + Attach an item to our agent specifying attachment details + + The of the item to attach + The attachments owner + The name of the attachment + The description of the attahment + The to apply when attached + The of the attachment + The on the agent + to attach the item to + + + + Attach an item to our agent specifying attachment details + + The of the item to attach + The attachments owner + The name of the attachment + The description of the attahment + The to apply when attached + The of the attachment + The on the agent + If true replace existing attachment on this attachment point, otherwise add to it (multi-attachments) + to attach the item to + + + + Detach an item from our agent using an object + + An object + + + + Detach an item from our agent + + The inventory itemID of the item to detach + + + + Retrieves the currently worn attachments. + removed async and Task due to no await. + + + + + + Returns a collection of the agents currently worn wearables + + A copy of the agents currently worn wearables + Avoid calling this function multiple times as it will make + a copy of all of the wearable data each time + + + + Inform the sim which wearables are part of our current outfit + + + + + Replaces the Wearables collection with a list of new wearable items + + Wearable items to replace the Wearables collection with + + + + Calculates base color/tint for a specific wearable + based on its params + + All the color info gathered from wearable's VisualParams + passed as list of ColorParamInfo tuples + Base color/tint for the wearable + + + + Blocking method to populate the Wearables dictionary + + True on success, otherwise false + + + + Blocking method to populate the Textures array with cached bakes + + True on success, otherwise false + + + + Populates textures and visual params from a decoded asset + + Wearable to decode + Texture data + + + + Blocking method to download and parse currently worn wearable assets + + True on success, otherwise false + + + + Get a list of all of the textures that need to be downloaded for a + single bake layer + + Bake layer to get texture AssetIDs for + A list of texture AssetIDs to download + + + + Blocking method to download all of the textures needed for baking + the given bake layers + + A list of layers that need baking + No return value is given because the baking will happen + whether or not all textures are successfully downloaded + + + + Blocking method to create and upload baked textures for all of the + missing bakes + + True on success, otherwise false + + + + Blocking method to create and upload a baked texture for a single + bake layer + + Layer to bake + True on success, otherwise false + + + + Blocking method to upload a baked texture + + Five channel JPEG2000 texture data to upload + UUID of the newly created asset on success, otherwise UUID.Zero + + + + Creates a dictionary of visual param values from the downloaded wearables + + A dictionary of visual param indices mapping to visual param + values for our agent that can be fed to the Baker class + + + + Initate server baking process + + True if the server baking was successful + + + + Get the latest version of COF + + Current Outfit Folder (or null if getting the data failed) + + + + Create an AgentSetAppearance packet from Wearables data and the + Textures array and send it + + + + + Converts a WearableType to a bodypart or clothing WearableType + + A WearableType + AssetType.Bodypart or AssetType.Clothing or AssetType.Unknown + + + + Converts a BakeType to the corresponding baked texture slot in AvatarTextureIndex + + A BakeType + The AvatarTextureIndex slot that holds the given BakeType + + + + Gives the layer number that is used for morph mask + + >A BakeType + Which layer number as defined in BakeTypeToTextures is used for morph mask + + + + Converts a BakeType to a list of the texture slots that make up that bake + + A BakeType + A list of texture slots that are inputs for the given bake + + + Contains the Event data returned from the data server from an AgentWearablesRequest + + + Contains the Event data returned from the data server from an AgentCachedTextureResponse + + + Contains the Event data returned from an AppearanceSetRequest + + + Indicates whether appearance setting was successful + + + + Triggered when appearance data is sent to the sim and + the main appearance thread is done. + Indicates whether appearance setting was successful + + + Contains the Event data returned from the data server from an RebakeAvatarTextures + + + The ID of the Texture Layer to bake + + + + Triggered when the simulator sends a request for this agent to rebake + its appearance + + The ID of the Texture Layer to bake + + + + Class that handles the local asset cache + + + + + Allows setting weather to periodicale prune the cache if it grows too big + Default is enabled, when caching is enabled + + + + + How long (in ms) between cache checks (default is 5 min.) + + + + + Default constructor + + A reference to the GridClient object + + + + Disposes cleanup timer + + + + + Only create timer when needed + + + + + Return bytes read from the local asset cache, null if it does not exist + + UUID of the asset we want to get + Raw bytes of the asset, or null on failure + + + + Returns ImageDownload object of the + image from the local image cache, null if it does not exist + + UUID of the image we want to get + ImageDownload object containing the image, or null on failure + + + + Constructs a file name of the cached asset + + UUID of the asset + String with the file name of the cahced asset + + + + Constructs a file name of the static cached asset + + UUID of the asset + String with the file name of the static cached asset + + + + Saves an asset to the local cache + + UUID of the asset + Raw bytes the asset consists of + Weather the operation was successfull + + + + Get the file name of the asset stored with gived UUID + + UUID of the asset + Null if we don't have that UUID cached on disk, file name if found in the cache folder + + + + Checks if the asset exists in the local cache + + UUID of the asset + True is the asset is stored in the cache, otherwise false + + + + Wipes out entire cache + + + + + Brings cache size to the 90% of the max size + + + + + Asynchronously brings cache size to the 90% of the max size + + + + + Adds up file sizes passes in a FileInfo array + + + + + Checks whether caching is enabled + + + + + Periodically prune the cache + + + + + Nicely formats file sizes + + Byte size we want to output + String with humanly readable file size + + + + Helper class for sorting files by their last accessed time + + + + + + + + + OK + + + Transfer completed + + + + + + + + + Unknown error occurred + + + Equivalent to a 404 error + + + Client does not have permission for that resource + + + Unknown status + + + + + + + + + + + Unknown + + + Virtually all asset transfers use this channel + + + + + + + + + + + Asset from the asset server + + + Inventory item + + + Estate asset, such as an estate covenant + + + + + + + + + + + + + + + + + + When requesting image download, type of the image requested + + + + Normal in-world object texture + + + Avatar texture + + + Server baked avatar texture + + + + Image file format + + + + + + + + + Number of milliseconds passed since the last transfer + packet was received + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Number of milliseconds to wait for a transfer header packet if out of order data was received + + + + Callback used for various asset download requests + + Transfer information + Downloaded asset, null on fail + + + + Callback used upon competition of baked texture upload + + Asset UUID of the newly uploaded baked texture + + + + A callback that fires upon the completion of the RequestMesh call + + Was the download successful + Resulting mesh or null on problems + + + The event subscribers. null if no subcribers + + + Raises the XferReceived event + A XferReceivedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds sends + + + The event subscribers. null if no subcribers + + + Raises the AssetUploaded event + A AssetUploadedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised during upload completes + + + The event subscribers. null if no subcribers + + + Raises the UploadProgress event + A UploadProgressEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised during upload with progres update + + + The event subscribers. null if no subcribers + + + Raises the InitiateDownload event + A InitiateDownloadEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Fired when the simulator sends an InitiateDownloadPacket, used to download terrain .raw files + + + The event subscribers. null if no subcribers + + + Raises the ImageReceiveProgress event + A ImageReceiveProgressEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Fired when a texture is in the process of being downloaded by the TexturePipeline class + + + Texture download cache + + + + Default constructor + + A reference to the GridClient object + + + + Returns type name as string for a given AssetType + + + Type name + + + + Build uri for requesting an asset from ViewerAsset capability + + + + Request URI for an asset + + + + Request an asset download + + Asset UUID + Asset type, must be correct for the transfer to succeed + Whether to give this transfer an elevated priority + The callback to fire when the simulator responds with the asset data + + + + Request an asset download + + Asset UUID + Asset type, must be correct for the transfer to succeed + Whether to give this transfer an elevated priority + Source location of the requested asset + The callback to fire when the simulator responds with the asset data + + + + Request an asset download + + Asset UUID + Asset type, must be correct for the transfer to succeed + Whether to give this transfer an elevated priority + Source location of the requested asset + UUID of the transaction + The callback to fire when the simulator responds with the asset data + + + + + + + + + + + + + + + + + + + + + + + + + Request an asset download via LLUDP + + Asset UUID + task ID + + The callback to fire when the simulator responds with the asset data + Item ID + + + + Request an asset download through the almost deprecated Xfer system + + Filename of the asset to request + Whether or not to delete the asset + off the server after it is retrieved + Use large transfer packets or not + UUID of the file to request, if filename is + left empty + Asset type of vFileID, or + AssetType.Unknown if filename is not empty + Sets the FilePath in the request to Cache + (4) if true, otherwise Unknown (0) is used + + + + + Request Inventory Asset from UDP + + Use UUID.Zero if you do not have the + asset ID but have all the necessary permissions + + Whether to prioritize this asset download or not + + + + + + Request Inventory Asset from UDP + + Use UUID.Zero if you do not have the + asset ID but have all the necessary permissions + The item ID of this asset in the inventory + Use UUID.Zero if you are not requesting an + asset from an object inventory + The owner of this asset + + + + + + Used to force asset data into the PendingUpload property, ie: for raw terrain uploads + + An AssetUpload object containing the data to upload to the simulator + + + + Request an asset be uploaded to the simulator + + The Object containing the asset data + If True, the asset once uploaded will be stored on the simulator + in which the client was connected in addition to being stored on the asset server + The of the transfer, can be used to correlate the upload with + events being fired + + + + Request an asset be uploaded to the simulator + + The of the asset being uploaded + A byte array containing the encoded asset data + If True, the asset once uploaded will be stored on the simulator + in which the client was connected in addition to being stored on the asset server + The of the transfer, can be used to correlate the upload with + events being fired + + + + Request an asset be uploaded to the simulator + + + Asset type to upload this data as + A byte array containing the encoded asset data + If True, the asset once uploaded will be stored on the simulator + in which the client was connected in addition to being stored on the asset server + The of the transfer, can be used to correlate the upload with + events being fired + + + + Initiate an asset upload + + The ID this asset will have if the + upload succeeds + Asset type to upload this data as + Raw asset data to upload + Whether to store this asset on the local + simulator or the grid-wide asset server + The tranaction id for the upload + The transaction ID of this transfer + + + + Requests download of a mesh asset + + UUID of the mesh asset + Callback when the request completes + + + + Request a texture asset from the simulator using the system to + manage the requests and re-assemble the image from the packets received from the simulator + + The of the texture asset to download + The of the texture asset. + Use for most textures, or for baked layer texture assets + A float indicating the requested priority for the transfer. Higher priority values tell the simulator + to prioritize the request before lower valued requests. An image already being transferred using the can have + its priority changed by resending the request with the new priority value + Number of quality layers to discard. + This controls the end marker of the data sent. Sending with value -1 combined with priority of 0 cancels an in-progress + transfer. + A bug exists in the Linden Simulator where a -1 will occasionally be sent with a non-zero priority + indicating an off-by-one error. + The packet number to begin the request at. A value of 0 begins the request + from the start of the asset texture + The callback to fire when the image is retrieved. The callback + will contain the result of the request and the texture asset data + If true, the callback will be fired for each chunk of the downloaded image. + The callback asset parameter will contain all previously received chunks of the texture asset starting + from the beginning of the request + + Request an image and fire a callback when the request is complete + + Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished); + + private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset) + { + if(state == TextureRequestState.Finished) + { + Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded", + asset.AssetID, + asset.AssetData.Length); + } + } + + Request an image and use an inline anonymous method to handle the downloaded texture data + + Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, delegate(TextureRequestState state, AssetTexture asset) + { + if(state == TextureRequestState.Finished) + { + Console.WriteLine("Texture {0} ({1} bytes) has been successfully downloaded", + asset.AssetID, + asset.AssetData.Length); + } + } + ); + + Request a texture, decode the texture to a bitmap image and apply it to a imagebox + + Client.Assets.RequestImage(UUID.Parse("c307629f-e3a1-4487-5e88-0d96ac9d4965"), ImageType.Normal, TextureDownloader_OnDownloadFinished); + + private void TextureDownloader_OnDownloadFinished(TextureRequestState state, AssetTexture asset) + { + if(state == TextureRequestState.Finished) + { + ManagedImage imgData; + Image bitmap; + + if (state == TextureRequestState.Finished) + { + OpenJPEG.DecodeToImage(assetTexture.AssetData, out imgData, out bitmap); + picInsignia.Image = bitmap; + } + } + } + + + + + + Overload: Request a texture asset from the simulator using the system to + manage the requests and re-assemble the image from the packets received from the simulator + + The of the texture asset to download + The callback to fire when the image is retrieved. The callback + will contain the result of the request and the texture asset data + + + + Overload: Request a texture asset from the simulator using the system to + manage the requests and re-assemble the image from the packets received from the simulator + + The of the texture asset to download + The of the texture asset. + Use for most textures, or for baked layer texture assets + The callback to fire when the image is retrieved. The callback + will contain the result of the request and the texture asset data + + + + Overload: Request a texture asset from the simulator using the system to + manage the requests and re-assemble the image from the packets received from the simulator + + The of the texture asset to download + The of the texture asset. + Use for most textures, or for baked layer texture assets + The callback to fire when the image is retrieved. The callback + will contain the result of the request and the texture asset data + If true, the callback will be fired for each chunk of the downloaded image. + The callback asset parameter will contain all previously received chunks of the texture asset starting + from the beginning of the request + + + + Cancel a texture request + + The texture assets + + + + Fetch avatar texture on a grid capable of server side baking + + ID of the avatar + ID of the texture + Name of the part of the avatar texture applies to + Callback invoked on operation completion + + + + Lets TexturePipeline class fire the progress event + + The texture ID currently being downloaded + the number of bytes transferred + the total number of bytes expected + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Xfer data + + + Upload data + + + Filename used on the simulator + + + Filename used by the client + + + UUID of the image that is in progress + + + Number of bytes received so far + + + Image size in bytes + + + + Constants for the archiving module + + + + + The location of the archive control file + + + + + Path for the assets held in an archive + + + + + Path for the prims file + + + + + Path for terrains. Technically these may be assets, but I think it's quite nice to split them out. + + + + + Path for region settings. + + + + + Path for region settings. + + + + + The character the separates the uuid from extension information in an archived asset filename + + + + + Extensions used for asset types in the archive + + + + + Archives assets + + + + + Archive assets + + + + + Archive the assets given to this archiver to the given archive. + + + + + + Write an assets metadata file to the given archive + + + + + + Write asset data files to the given archive + + + + + + Temporary code to do the bare minimum required to read a tar archive for our purposes + + + + + Binary reader for the underlying stream + + + + + Used to trim off null chars + + + + + Used to trim off space chars + + + + + Generate a tar reader which reads from the given stream. + + + + + + Read the next entry in the tar file. + + + + the data for the entry. Returns null if there are no more entries + + + + Read the next 512 byte chunk of data as a tar header. + + A tar header struct. null if we have reached the end of the archive. + + + + Read data following a header + + + + + + + Convert octal bytes to a decimal representation + + + + + + + + + Temporary code to produce a tar archive in tar v7 format + + + + + Binary writer for the underlying stream + + + + + Write a directory entry to the tar archive. We can only handle one path level right now! + + + + + + Write a file to the tar archive + + + + + + + Write a file to the tar archive + + + + + + + Finish writing the raw tar archive data to a stream. The stream will be closed on completion. + + + + + Write a particular entry + + + + + + + + Base class for all Asset types + + + + A byte array containing the raw asset data + + + True if the asset it only stored on the server temporarily + + + A unique ID + + + The assets unique ID + + + + The "type" of asset, Notecard, Animation, etc + + + + + Construct a new Asset object + + + + + Construct a new Asset object + + A unique specific to this asset + A byte array containing the raw asset data + + + + Regenerates the AssetData byte array from the properties + of the derived class. + + + + + Decodes the AssetData, placing it in appropriate properties of the derived + class. + + True if the asset decoding succeeded, otherwise false + + + + Represents an Animation + + + + Override the base classes AssetType + + + Default Constructor + + + + Construct an Asset object of type Animation + + A unique specific to this asset + A byte array containing the raw asset data + + + + Represents an that represents an avatars body ie: Hair, Etc. + + + + Override the base classes AssetType + + + Initializes a new instance of an AssetBodyPart object + + + Initializes a new instance of an AssetBodyPart object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + Represents a Callingcard with AvatarID and Position vector + + + + Override the base classes AssetType + + + UUID of the Callingcard target avatar + + + Construct an Asset of type Callingcard + + + + Construct an Asset object of type Callingcard + + A unique specific to this asset + A byte array containing the raw asset data + + + + Constuct an asset of type Callingcard + + UUID of the target avatar + + + + Encode the raw contents of a string with the specific Callingcard format + + + + + Decode the raw asset data, populating the AvatarID and Position + + true if the AssetData was successfully decoded to a UUID and Vector + + + + Represents an that can be worn on an avatar + such as a Shirt, Pants, etc. + + + + Override the base classes AssetType + + + Initializes a new instance of an AssetScriptBinary object + + + Initializes a new instance of an AssetScriptBinary object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + Type of gesture step + + + + + Base class for gesture steps + + + + + Retururns what kind of gesture step this is + + + + + Describes animation step of a gesture + + + + + Returns what kind of gesture step this is + + + + + If true, this step represents start of animation, otherwise animation stop + + + + + Animation asset + + + + + Animation inventory name + + + + + Describes sound step of a gesture + + + + + Returns what kind of gesture step this is + + + + + Sound asset + + + + + Sound inventory name + + + + + Describes sound step of a gesture + + + + + Returns what kind of gesture step this is + + + + + Text to output in chat + + + + + Describes sound step of a gesture + + + + + Returns what kind of gesture step this is + + + + + If true in this step we wait for all animations to finish + + + + + If true gesture player should wait for the specified amount of time + + + + + Time in seconds to wait if WaitForAnimation is false + + + + + Describes the final step of a gesture + + + + + Returns what kind of gesture step this is + + + + + Represents a sequence of animations, sounds, and chat actions + + + + + Returns asset type + + + + + Keyboard key that triggers the gestyre + + + + + Modifier to the trigger key + + + + + String that triggers playing of the gesture sequence + + + + + Text that replaces trigger in chat once gesture is triggered + + + + + Sequence of gesture steps + + + + + Constructs guesture asset + + + + + Constructs guesture asset + + A unique specific to this asset + A byte array containing the raw asset data + + + + Encodes gesture asset suitable for uplaod + + + + + Decodes gesture assset into play sequence + + true if the asset data was decoded successfully + + + + Represents a Landmark with RegionID and Position vector + + + + Override the base classes AssetType + + + UUID of the Landmark target region + + + Local position of the target + + + Construct an Asset of type Landmark + + + + Construct an Asset object of type Landmark + + A unique specific to this asset + A byte array containing the raw asset data + + + + Encode the raw contents of a string with the specific Landmark format + + + + + Decode the raw asset data, populating the RegionID and Position + + true if the AssetData was successfully decoded to a UUID and Vector + + + + Represents Mesh asset + + + + Override the base classes AssetType + + + + Decoded mesh data + + + + Initializes a new instance of an AssetMesh object + + + Initializes a new instance of an AssetMesh object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + TODO: Encodes Collada file into LLMesh format + + + + + Decodes mesh asset. See + to furter decode it for rendering + true + + + + Represents an Animation + + + + Override the base classes AssetType + + + Default Constructor + + + + Construct an Asset object of type Animation + + Asset type + A unique specific to this asset + A byte array containing the raw asset data + + + + Represents a string of characters encoded with specific formatting properties + + + + Override the base classes AssetType + + + A text string containing main text of the notecard + + + List of s embedded on the notecard + + + Construct an Asset of type Notecard + + + + Construct an Asset object of type Notecard + + A unique specific to this asset + A byte array containing the raw asset data + + + + Encode the raw contents of a string with the specific Linden Text properties + + + + + Decode the raw asset data including the Linden Text properties + + true if the AssetData was successfully decoded + + + + A linkset asset, containing a parent primitive and zero or more children + + + + + Only used internally for XML serialization/deserialization + + + + Override the base classes AssetType + + + Initializes a new instance of an AssetPrim object + + + + Initializes a new instance of an AssetPrim object + + A unique specific to this asset + A byte array containing the raw asset data + + + + + + + + + + + + + + + The deserialized form of a single primitive in a linkset asset + + + + + Represents an AssetScriptBinary object containing the + LSO compiled bytecode of an LSL script + + + + Override the base classes AssetType + + + Initializes a new instance of an AssetScriptBinary object + + + Initializes a new instance of an AssetScriptBinary object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + TODO: Encodes a scripts contents into a LSO Bytecode file + + + + + TODO: Decode LSO Bytecode into a string + + true + + + + Represents an LSL Text object containing a string of UTF encoded characters + + + + Override the base classes AssetType + + + A string of characters represting the script contents + + + Initializes a new AssetScriptText object + + + + Initializes a new AssetScriptText object with parameters + + A unique specific to this asset + A byte array containing the raw asset data + + + + Encode a string containing the scripts contents into byte encoded AssetData + + + + + Decode a byte array containing the scripts contents into a string + + true if decoding is successful + + + + Represents a Sound Asset + + + + Override the base classes AssetType + + + Initializes a new instance of an AssetSound object + + + Initializes a new instance of an AssetSound object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + TODO: Encodes a sound file + + + + + TODO: Decode a sound file + + true + + + + Represents a texture + + + + Override the base classes AssetType + + + A object containing image data + + + + + + + + + Initializes a new instance of an AssetTexture object + + + + Initializes a new instance of an AssetTexture object + + A unique specific to this asset + A byte array containing the raw asset data + + + + Initializes a new instance of an AssetTexture object + + A object containing texture data + + + + Populates the byte array with a JPEG2000 + encoded image created from the data in + + + + + Decodes the JPEG2000 data in AssetData to the + object + + True if the decoding was successful, otherwise false + + + + Decodes the begin and end byte positions for each quality layer in + the image + + + + + + Represents a Wearable Asset, Clothing, Hair, Skin, Etc + + + + A string containing the name of the asset + + + A string containing a short description of the asset + + + The Assets WearableType + + + The For-Sale status of the object + + + An Integer representing the purchase price of the asset + + + The of the assets creator + + + The of the assets current owner + + + The of the assets prior owner + + + The of the Group this asset is set to + + + True if the asset is owned by a + + + The Permissions mask of the asset + + + A Dictionary containing Key/Value pairs of the objects parameters + + + A Dictionary containing Key/Value pairs where the Key is the textures Index and the Value is the Textures + + + Initializes a new instance of an AssetWearable object + + + Initializes a new instance of an AssetWearable object with parameters + A unique specific to this asset + A byte array containing the raw asset data + + + + Decode an assets byte encoded data to a string + + true if the asset data was decoded successfully + + + + Encode the assets string represantion into a format consumable by the asset server + + + + + Avatar profile flags + + + + + Represents an avatar (other than your own) + + + + + Positive and negative ratings + + + + Positive ratings for Behavior + + + Negative ratings for Behavior + + + Positive ratings for Appearance + + + Negative ratings for Appearance + + + Positive ratings for Building + + + Negative ratings for Building + + + Positive ratings given by this avatar + + + Negative ratings given by this avatar + + + + Avatar properties including about text, profile URL, image IDs and + publishing settings + + + + First Life about text + + + First Life image ID + + + + + + + + + + + + + + + Profile image ID + + + Flags of the profile + + + Web URL for this profile + + + Should this profile be published on the web + + + Avatar Online Status + + + Is this a mature profile + + + + + + + + + + Avatar interests including spoken languages, skills, and "want to" + choices + + + + Languages profile field + + + + + + + + + + + + + + + Groups that this avatar is a member of + + + Positive and negative ratings + + + Avatar properties including about text, profile URL, image IDs and + publishing settings + + + Avatar interests including spoken languages, skills, and "want to" + choices + + + Movement control flags for avatars. Typically not set or used by + clients. To move your avatar, use Client.Self.Movement instead + + + + Contains the visual parameters describing the deformation of the avatar + + + + + Appearance version. Value greater than 0 indicates using server side baking + + + + + Version of the Current Outfit Folder that the appearance is based on + + + + + Appearance flags. Introduced with server side baking, currently unused. + + + + + List of current avatar animations + + + + First name + + + Last name + + + Full name + + + Active group + + + Information about agents display name + + + Agent UUID + + + Username + + + Display name + + + First name (legacy) + + + Last name (legacy) + + + Full name (legacy) + + + Is display name default display name + + + Cache display name until + + + Last updated timestamp + + + + Creates AgentDisplayName object from OSD + + Incoming OSD data + AgentDisplayName object + + + + Return object as OSD map + + OSD containing agent's display name data + + + + Holds group information for Avatars such as those you might find in a profile + + + + true of Avatar accepts group notices + + + Groups Key + + + Texture Key for groups insignia + + + Name of the group + + + Powers avatar has in the group + + + Avatars Currently selected title + + + true of Avatar has chosen to list this in their profile + + + + Contains an animation currently being played by an agent + + + + The ID of the animation asset + + + A number to indicate start order of currently playing animations + On Linden Grids this number is unique per region, with OpenSim it is per client + + + + + + + Holds group information on an individual profile pick + + + + + Retrieve friend status notifications, and retrieve avatar names and + profiles + + + + The event subscribers, null of no subscribers + + + Raises the AvatarAnimation Event + An AvatarAnimationEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + an agents animation playlist + + + The event subscribers, null of no subscribers + + + Raises the AvatarAppearance Event + A AvatarAppearanceEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the appearance information for an agent + + + The event subscribers, null of no subscribers + + + Raises the UUIDNameReply Event + A UUIDNameReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + agent names/id values + + + The event subscribers, null of no subscribers + + + Raises the AvatarInterestsReply Event + A AvatarInterestsReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the interests listed in an agents profile + + + The event subscribers, null of no subscribers + + + Raises the AvatarPropertiesReply Event + A AvatarPropertiesReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + profile property information for an agent + + + The event subscribers, null of no subscribers + + + Raises the AvatarGroupsReply Event + A AvatarGroupsReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the group membership an agent is a member of + + + The event subscribers, null of no subscribers + + + Raises the AvatarPickerReply Event + A AvatarPickerReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + name/id pair + + + The event subscribers, null of no subscribers + + + Raises the ViewerEffectPointAt Event + A ViewerEffectPointAtEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the objects and effect when an agent is pointing at + + + The event subscribers, null of no subscribers + + + Raises the ViewerEffectLookAt Event + A ViewerEffectLookAtEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the objects and effect when an agent is looking at + + + The event subscribers, null of no subscribers + + + Raises the ViewerEffect Event + A ViewerEffectEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + an agents viewer effect information + + + The event subscribers, null of no subscribers + + + Raises the AvatarPicksReply Event + A AvatarPicksReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the top picks from an agents profile + + + The event subscribers, null of no subscribers + + + Raises the PickInfoReply Event + A PickInfoReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the Pick details + + + The event subscribers, null of no subscribers + + + Raises the AvatarClassifiedReply Event + A AvatarClassifiedReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the classified ads an agent has placed + + + The event subscribers, null of no subscribers + + + Raises the ClassifiedInfoReply Event + A ClassifiedInfoReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the details of a classified ad + + + The event subscribers, null of no subscribers + + + Raises the DisplayNameUpdate Event + A DisplayNameUpdateEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + the details of display name change + + + + Callback giving results when fetching display names + + If the request was successful + Array of display names + Array of UUIDs that could not be fetched + + + + Represents other avatars + + + + + Tracks the specified avatar on your map + Avatar ID to track + + + + Request a single avatar name + + The avatar key to retrieve a name for + + + + Request a list of avatar names + + The avatar keys to retrieve names for + + + + Check if Display Names functionality is available + + True if Display name functionality is available + + + + Request retrieval of display names (max 90 names per request) + + List of UUIDs to lookup + Callback to report result of the operation + + + + Start a request for Avatar Properties + + + + + + Search for an avatar (first name, last name) + + The name to search for + An ID to associate with this query + + + + Start a request for Avatar Picks + + UUID of the avatar + + + + Start a request for Avatar Classifieds + + UUID of the avatar + + + + Start a request for details of a specific profile pick + + UUID of the avatar + UUID of the profile pick + + + + Start a request for details of a specific profile classified + + UUID of the avatar + UUID of the profile classified + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + EQ Message fired when someone nearby changes their display name + + The message key + the IMessage object containing the deserialized data sent from the simulator + The which originated the packet + + + + Crossed region handler for message that comes across the EventQueue. Sent to an agent + when the agent crosses a sim border into a new region. + + The message key + the IMessage object containing the deserialized data sent from the simulator + The which originated the packet + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Provides data for the event + The event occurs when the simulator sends + the animation playlist for an agent + + The following code example uses the and + properties to display the animation playlist of an avatar on the window. + + // subscribe to the event + Client.Avatars.AvatarAnimation += Avatars_AvatarAnimation; + + private void Avatars_AvatarAnimation(object sender, AvatarAnimationEventArgs e) + { + // create a dictionary of "known" animations from the Animations class using System.Reflection + Dictionary<UUID, string> systemAnimations = new Dictionary<UUID, string>(); + Type type = typeof(Animations); + System.Reflection.FieldInfo[] fields = type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); + foreach (System.Reflection.FieldInfo field in fields) + { + systemAnimations.Add((UUID)field.GetValue(type), field.Name); + } + + // find out which animations being played are known animations and which are assets + foreach (Animation animation in e.Animations) + { + if (systemAnimations.ContainsKey(animation.AnimationID)) + { + Console.WriteLine("{0} is playing {1} ({2}) sequence {3}", e.AvatarID, + systemAnimations[animation.AnimationID], animation.AnimationSequence); + } + else + { + Console.WriteLine("{0} is playing {1} (Asset) sequence {2}", e.AvatarID, + animation.AnimationID, animation.AnimationSequence); + } + } + } + + + + + Get the ID of the agent + + + Get the list of animations to start + + + + Construct a new instance of the AvatarAnimationEventArgs class + + The ID of the agent + The list of animations to start + + + Provides data for the event + The event occurs when the simulator sends + the appearance data for an avatar + + The following code example uses the and + properties to display the selected shape of an avatar on the window. + + // subscribe to the event + Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance; + + // handle the data when the event is raised + void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e) + { + Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] > 0) : "male" ? "female") + } + + + + + Get the Simulator this request is from of the agent + + + Get the ID of the agent + + + true if the agent is a trial account + + + Get the default agent texture + + + Get the agents appearance layer textures + + + Get the for the agent + + + Version of the appearance system used. + Value greater than 0 indicates that server side baking is used + + + Version of the Current Outfit Folder the appearance is based on + + + Appearance flags, introduced with server side baking, currently unused + + + + Construct a new instance of the AvatarAppearanceEventArgs class + + The simulator request was from + The ID of the agent + true of the agent is a trial account + The default agent texture + The agents appearance layer textures + The for the agent + Appearance Version + Current outfit folder version + Appearance Flags + + + Represents the interests from the profile of an agent + + + Get the ID of the agent + + + Get the interests of the agent + + + The properties of an agent + + + Get the ID of the agent + + + Get the ID of the agent + + + Get the ID of the agent + + + Get the ID of the avatar + + + + Event args class for display name notification messages + + + + + Wrapper around a byte array that allows bit to be packed and unpacked + one at a time or by a variable amount. Useful for very tightly packed + data like LayerData packets + + + + + + + + + + + + + + Default constructor, initialize the bit packer / bit unpacker + with a byte array and starting position + + Byte array to pack bits in to or unpack from + Starting position in the byte array + + + + Pack a floating point value in to the data + + Floating point value to pack + + + + Pack part or all of an integer in to the data + + Integer containing the data to pack + Number of bits of the integer to pack + + + + Pack part or all of an unsigned integer in to the data + + Unsigned integer containing the data to pack + Number of bits of the integer to pack + + + + Pack a single bit in to the data + + Bit to pack + + + + + + + + + + + + + + + + + + + + + + + + + Unpacking a floating point value from the data + + Unpacked floating point value + + + + Unpack a variable number of bits from the data in to integer format + + Number of bits to unpack + An integer containing the unpacked bits + This function is only useful up to 32 bits + + + + Unpack a variable number of bits from the data in to unsigned + integer format + + Number of bits to unpack + An unsigned integer containing the unpacked bits + This function is only useful up to 32 bits + + + + Unpack a 16-bit signed integer + + 16-bit signed integer + + + + Unpack a 16-bit unsigned integer + + 16-bit unsigned integer + + + + Unpack a 32-bit signed integer + + 32-bit signed integer + + + + Unpack a 32-bit unsigned integer + + 32-bit unsigned integer + + + + Reads in a byte array of an Animation Asset created by the SecondLife(tm) client. + + + + + Rotation Keyframe count (used internally) + + + + + Position Keyframe count (used internally) + + + + + Animation Priority + + + + + The animation length in seconds. + + + + + Expression set in the client. Null if [None] is selected + + + + + The time in seconds to start the animation + + + + + The time in seconds to end the animation + + + + + Loop the animation + + + + + Meta data. Ease in Seconds. + + + + + Meta data. Ease out seconds. + + + + + Meta Data for the Hand Pose + + + + + Number of joints defined in the animation + + + + + Contains an array of joints + + + + + Searialize an animation asset into it's joints/keyframes/meta data + + + + + + Variable length strings seem to be null terminated in the animation asset.. but.. + use with caution, home grown. + advances the index. + + The animation asset byte array + The offset to start reading + a string + + + + Read in a Joint from an animation asset byte array + Variable length Joint fields, yay! + Advances the index + + animation asset byte array + Byte Offset of the start of the joint + The Joint data serialized into the binBVHJoint structure + + + + Read Keyframes of a certain type + advance i + + Animation Byte array + Offset in the Byte Array. Will be advanced + Number of Keyframes + Scaling Min to pass to the Uint16ToFloat method + Scaling Max to pass to the Uint16ToFloat method + + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + The parameter is null. + 2 + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + A Joint and it's associated meta data and keyframes + + + + + Indicates whether this instance and a specified object are equal. + + + true if and this instance are the same type and represent the same value; otherwise, false. + + Another object to compare to. + 2 + + + + Returns the hash code for this instance. + + + A 32-bit signed integer that is the hash code for this instance. + + 2 + + + + Name of the Joint. Matches the avatar_skeleton.xml in client distros + + + + + Joint Animation Override? Was the same as the Priority in testing.. + + + + + Array of Rotation Keyframes in order from earliest to latest + + + + + Array of Position Keyframes in order from earliest to latest + This seems to only be for the Pelvis? + + + + + Custom application data that can be attached to a joint + + + + + A Joint Keyframe. This is either a position or a rotation. + + + + + Either a Vector3 position or a Vector3 Euler rotation + + + + + Poses set in the animation metadata for the hands. + + + + Viewer defauls to 30 for main grid, 60 for others + + + For exponential backoff on error. + + + Number of times we've received an unknown CAPS exception in series. + + + + Capabilities is the name of the bi-directional HTTP REST protocol + used to communicate non real-time transactions such as teleporting or + group messaging + + + + + Triggered when an event is received via the EventQueueGet + capability + + Event name + Decoded event data + The simulator that generated the event + + + Reference to the simulator this system is connected to + + + Capabilities URI this system was initialized with + + + Whether the capabilities event queue is connected and + listening for incoming events + + + + Default constructor + + + + + + + Request the URI of a named capability + + Name of the capability to request + The URI of the requested capability, or null if not found + + + + Create a new CapsClient for specified capability + + Capability name + Newly created CapsClient or null of capability does not exist + + + + Useful for debugging, but not particularly a good idea + + Capability address + Name of capability if it exists + + + + Request preferred URI for texture fetch capability + + URI of preferred capability or null, or null if not found + + + + Request preferred URI for object mesh fetch capability + + URI of preferred capability or null, or null if not found + + + + Process any incoming events, check to see if we have a message created for the event, + + + + + + Raised whenever the capabilities have been received from a simulator + + + + Raises the CapabilitiesReceived event + + Simulator we received the capabilities from + + + The simulator that received a capabilities + + + + Attempts to convert an LLSD structure to a known Packet type + + Event name, this must match an actual + packet name for a Packet to be successfully built + LLSD to convert to a Packet + A Packet on success, otherwise null + + + + Creates a formatted string containing the values of a Packet + + The Packet + A formatted string of values of the nested items in the Packet object + + + + Decode an IMessage object into a beautifully formatted string + + The IMessage object + Recursion level (used for indenting) + A formatted string containing the names and values of the source object + + + + Thrown when a packet could not be successfully deserialized + + + + + Default constructor + + + + + Constructor that takes an additional error message + + An error message to attach to this exception + + + + The header of a message template packet. Holds packet flags, sequence + number, packet ID, and any ACKs that will be appended at the end of + the packet + + + + + Convert the AckList to a byte array, used for packet serializing + + Reference to the target byte array + Beginning position to start writing to in the byte + array, will be updated with the ending position of the ACK list + + + + + + + + + + + + + + + + + + + + + A block of data in a packet. Packets are composed of one or more blocks, + each block containing one or more fields + + + + Current length of the data in this packet + + + + Create a block from a byte array + + Byte array containing the serialized block + Starting position of the block in the byte array. + This will point to the data after the end of the block when the + call returns + + + + Serialize this block into a byte array + + Byte array to serialize this block into + Starting position in the byte array to serialize to. + This will point to the position directly after the end of the + serialized block when the call returns + + + A generic value, not an actual packet type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Origin position of this coordinate frame + + + X axis of this coordinate frame, or Forward/At in grid terms + + + Y axis of this coordinate frame, or Left in grid terms + + + Z axis of this coordinate frame, or Up in grid terms + + + + + + Looking direction, must be a normalized vector + Up direction, must be a normalized vector + + + + Align the coordinate frame X and Y axis with a given rotation + around the Z axis in radians + + Absolute rotation around the Z axis in + radians + + + + Access to the data server which allows searching for land, events, people, etc + + + + Classified Ad categories + + + Classified is listed in the Any category + + + Classified is shopping related + + + Classified is + + + + + + + + + + + + + + + + + + + + + + + + Event Categories + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Query Flags used in many of the DirectoryManager methods to specify which query to execute and how to return the results. + + Flags can be combined using the | (pipe) character, not all flags are available in all queries + + + + Query the People database + + + + + + + + + Query the Groups database + + + Query the Events database + + + Query the land holdings database for land owned by the currently connected agent + + + + + + Query the land holdings database for land which is owned by a Group + + + Specifies the query should pre sort the results based upon traffic + when searching the Places database + + + + + + + + + + + + + + + Specifies the query should pre sort the results in an ascending order when searching the land sales database. + This flag is only used when searching the land sales database + + + Specifies the query should pre sort the results using the SalePrice field when searching the land sales database. + This flag is only used when searching the land sales database + + + Specifies the query should pre sort the results by calculating the average price/sq.m (SalePrice / Area) when searching the land sales database. + This flag is only used when searching the land sales database + + + Specifies the query should pre sort the results using the ParcelSize field when searching the land sales database. + This flag is only used when searching the land sales database + + + Specifies the query should pre sort the results using the Name field when searching the land sales database. + This flag is only used when searching the land sales database + + + When set, only parcels less than the specified Price will be included when searching the land sales database. + This flag is only used when searching the land sales database + + + When set, only parcels greater than the specified Size will be included when searching the land sales database. + This flag is only used when searching the land sales database + + + + + + + + + Include PG land in results. This flag is used when searching both the Groups, Events and Land sales databases + + + Include Mature land in results. This flag is used when searching both the Groups, Events and Land sales databases + + + Include Adult land in results. This flag is used when searching both the Groups, Events and Land sales databases + + + + + + + Land types to search dataserver for + + + + Search Auction, Mainland and Estate + + + Land which is currently up for auction + + + Parcels which are on the mainland (Linden owned) continents + + + Parcels which are on privately owned simulators + + + + The content rating of the event + + + + Event is PG + + + Event is Mature + + + Event is Adult + + + + Classified Ad Options + + There appear to be two formats the flags are packed in. + This set of flags is for the newer style + + + + + + + + + + + + + + + + + + + Classified ad query options + + + + Include all ads in results + + + Include PG ads in results + + + Include Mature ads in results + + + Include Adult ads in results + + + + The For Sale flag in PlacesReplyData + + + + Parcel is not listed for sale + + + Parcel is For Sale + + + + A classified ad on the grid + + + + UUID for this ad, useful for looking up detailed + information about it + + + The title of this classified ad + + + Flags that show certain options applied to the classified + + + Creation date of the ad + + + Expiration date of the ad + + + Price that was paid for this ad + + + Print the struct data as a string + A string containing the field name, and field value + + + + A parcel retrieved from the dataserver such as results from the + "For-Sale" listings or "Places" Search + + + + The unique dataserver parcel ID + This id is used to obtain additional information from the entry + by using the method + + + A string containing the name of the parcel + + + The size of the parcel + This field is not returned for Places searches + + + The price of the parcel + This field is not returned for Places searches + + + If True, this parcel is flagged to be auctioned + + + If true, this parcel is currently set for sale + + + Parcel traffic + + + Print the struct data as a string + A string containing the field name, and field value + + + + An Avatar returned from the dataserver + + + + Online status of agent + This field appears to be obsolete and always returns false + + + The agents first name + + + The agents last name + + + The agents + + + Print the struct data as a string + A string containing the field name, and field value + + + + Response to a "Groups" Search + + + + The Group ID + + + The name of the group + + + The current number of members + + + Print the struct data as a string + A string containing the field name, and field value + + + + Parcel information returned from a request + + Represents one of the following: + A parcel of land on the grid that has its Show In Search flag set + A parcel of land owned by the agent making the request + A parcel of land owned by a group the agent making the request is a member of + + + In a request for Group Land, the First record will contain an empty record + + Note: This is not the same as searching the land for sale data source + + + + The ID of the Agent of Group that owns the parcel + + + The name + + + The description + + + The Size of the parcel + + + The billable Size of the parcel, for mainland + parcels this will match the ActualArea field. For Group owned land this will be 10 percent smaller + than the ActualArea. For Estate land this will always be 0 + + + Indicates the ForSale status of the parcel + + + The Gridwide X position + + + The Gridwide Y position + + + The Z position of the parcel, or 0 if no landing point set + + + The name of the Region the parcel is located in + + + The Asset ID of the parcels Snapshot texture + + + The calculated visitor traffic + + + The billing product SKU + Known values are: + + 023Mainland / Full Region + 024Estate / Full Region + 027Estate / Openspace + 029Estate / Homestead + 129Mainland / Homestead (Linden Owned) + + + + + No longer used, will always be 0 + + + Get a SL URL for the parcel + A string, containing a standard SLURL + + + Print the struct data as a string + A string containing the field name, and field value + + + + An "Event" Listing summary + + + + The ID of the event creator + + + The name of the event + + + The events ID + + + A string containing the short date/time the event will begin + + + The event start time in Unixtime (seconds since epoch) + + + The events maturity rating + + + Print the struct data as a string + A string containing the field name, and field value + + + + The details of an "Event" + + + + The events ID + + + The ID of the event creator + + + The name of the event + + + The category + + + The events description + + + The short date/time the event will begin + + + The event start time in Unixtime (seconds since epoch) UTC adjusted + + + The length of the event in minutes + + + 0 if no cover charge applies + + + The cover charge amount in L$ if applicable + + + The name of the region where the event is being held + + + The gridwide location of the event + + + The maturity rating + + + Get a SL URL for the parcel where the event is hosted + A string, containing a standard SLURL + + + Print the struct data as a string + A string containing the field name, and field value + + + The event subscribers. null if no subcribers + + + Raises the EventInfoReply event + An EventInfoReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirEventsReply event + An DirEventsReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the PlacesReply event + A PlacesReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirPlacesReply event + A DirPlacesReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirClassifiedsReply event + A DirClassifiedsReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirGroupsReply event + A DirGroupsReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirPeopleReply event + A DirPeopleReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the DirLandReply event + A DirLandReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + + Constructs a new instance of the DirectoryManager class + + An instance of GridClient + + + + Query the data server for a list of classified ads containing the specified string. + Defaults to searching for classified placed in any category, and includes PG, Adult and Mature + results. + + Responses are sent 16 per response packet, there is no way to know how many results a query reply will contain however assuming + the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received + + The event is raised when a response is received from the simulator + + A string containing a list of keywords to search for + A UUID to correlate the results when the event is raised + + + + Query the data server for a list of classified ads which contain specified keywords (Overload) + + The event is raised when a response is received from the simulator + + A string containing a list of keywords to search for + The category to search + A set of flags which can be ORed to modify query options + such as classified maturity rating. + A UUID to correlate the results when the event is raised + + Search classified ads containing the key words "foo" and "bar" in the "Any" category that are either PG or Mature + + UUID searchID = StartClassifiedSearch("foo bar", ClassifiedCategories.Any, ClassifiedQueryFlags.PG | ClassifiedQueryFlags.Mature); + + + + Responses are sent 16 at a time, there is no way to know how many results a query reply will contain however assuming + the reply packets arrived ordered, a response with less than 16 entries would indicate all results have been received + + + + + Starts search for places (Overloaded) + + The event is raised when a response is received from the simulator + + Search text + Each request is limited to 100 places + being returned. To get the first 100 result entries of a request use 0, + from 100-199 use 1, 200-299 use 2, etc. + A UUID to correlate the results when the event is raised + + + + Queries the dataserver for parcels of land which are flagged to be shown in search + + The event is raised when a response is received from the simulator + + A string containing a list of keywords to search for separated by a space character + A set of flags which can be ORed to modify query options + such as classified maturity rating. + The category to search + Each request is limited to 100 places + being returned. To get the first 100 result entries of a request use 0, + from 100-199 use 1, 200-299 use 2, etc. + A UUID to correlate the results when the event is raised + + Search places containing the key words "foo" and "bar" in the "Any" category that are either PG or Adult + + UUID searchID = StartDirPlacesSearch("foo bar", DirFindFlags.DwellSort | DirFindFlags.IncludePG | DirFindFlags.IncludeAdult, ParcelCategory.Any, 0); + + + + Additional information on the results can be obtained by using the ParcelManager.InfoRequest method + + + + + Starts a search for land sales using the directory + + The event is raised when a response is received from the simulator + + What type of land to search for. Auction, + estate, mainland, "first land", etc + The OnDirLandReply event handler must be registered before + calling this function. There is no way to determine how many + results will be returned, or how many times the callback will be + fired other than you won't get more than 100 total parcels from + each query. + + + + Starts a search for land sales using the directory + + The event is raised when a response is received from the simulator + + What type of land to search for. Auction, + estate, mainland, "first land", etc + Maximum price to search for + Maximum area to search for + Each request is limited to 100 parcels + being returned. To get the first 100 parcels of a request use 0, + from 100-199 use 1, 200-299 use 2, etc. + The OnDirLandReply event handler must be registered before + calling this function. There is no way to determine how many + results will be returned, or how many times the callback will be + fired other than you won't get more than 100 total parcels from + each query. + + + + Send a request to the data server for land sales listings + + + Flags sent to specify query options + + Available flags: + Specify the parcel rating with one or more of the following: + IncludePG IncludeMature IncludeAdult + + Specify the field to pre sort the results with ONLY ONE of the following: + PerMeterSort NameSort AreaSort PricesSort + + Specify the order the results are returned in, if not specified the results are pre sorted in a Descending Order + SortAsc + + Specify additional filters to limit the results with one or both of the following: + LimitByPrice LimitByArea + + Flags can be combined by separating them with the | (pipe) character + + Additional details can be found in + + What type of land to search for. Auction, + Estate or Mainland + Maximum price to search for when the + DirFindFlags.LimitByPrice flag is specified in findFlags + Maximum area to search for when the + DirFindFlags.LimitByArea flag is specified in findFlags + Each request is limited to 100 parcels + being returned. To get the first 100 parcels of a request use 0, + from 100-199 use 100, 200-299 use 200, etc. + The event will be raised with the response from the simulator + + There is no way to determine how many results will be returned, or how many times the callback will be + fired other than you won't get more than 100 total parcels from + each reply. + + Any land set for sale to either anybody or specific to the connected agent will be included in the + results if the land is included in the query + + + // request all mainland, any maturity rating that is larger than 512 sq.m + StartLandSearch(DirFindFlags.SortAsc | DirFindFlags.PerMeterSort | DirFindFlags.LimitByArea | DirFindFlags.IncludePG | DirFindFlags.IncludeMature | DirFindFlags.IncludeAdult, SearchTypeFlags.Mainland, 0, 512, 0); + + + + + Search for Groups + + The name or portion of the name of the group you wish to search for + Start from the match number + + + + + Search for Groups + + The name or portion of the name of the group you wish to search for + Start from the match number + Search flags + + + + + Search the People directory for other avatars + + The name or portion of the name of the avatar you wish to search for + + + + + + Search Places for parcels of land you personally own + + + + + Searches Places for land owned by the specified group + + ID of the group you want to recieve land list for (You must be a member of the group) + Transaction (Query) ID which can be associated with results from your request. + + + + Search the Places directory for parcels that are listed in search and contain the specified keywords + + A string containing the keywords to search for + Transaction (Query) ID which can be associated with results from your request. + + + + Search Places - All Options + + One of the Values from the DirFindFlags struct, ie: AgentOwned, GroupOwned, etc. + One of the values from the SearchCategory Struct, ie: Any, Linden, Newcomer + A string containing a list of keywords to search for separated by a space character + String Simulator Name to search in + LLUID of group you want to recieve results for + Transaction (Query) ID which can be associated with results from your request. + Transaction (Query) ID which can be associated with results from your request. + + + + Search All Events with specifid searchText in all categories, includes PG, Mature and Adult + + A string containing a list of keywords to search for separated by a space character + Each request is limited to 100 entries + being returned. To get the first group of entries of a request use 0, + from 100-199 use 100, 200-299 use 200, etc. + UUID of query to correlate results in callback. + + + + Search Events + + A string containing a list of keywords to search for separated by a space character + One or more of the following flags: DateEvents, IncludePG, IncludeMature, IncludeAdult + from the Enum + + Multiple flags can be combined by separating the flags with the | (pipe) character + "u" for in-progress and upcoming events, -or- number of days since/until event is scheduled + For example "0" = Today, "1" = tomorrow, "2" = following day, "-1" = yesterday, etc. + Each request is limited to 100 entries + being returned. To get the first group of entries of a request use 0, + from 100-199 use 100, 200-299 use 200, etc. + EventCategory event is listed under. + UUID of query to correlate results in callback. + + + Requests Event Details + ID of Event returned from the method + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming event message + The Unique Capabilities Key + The event message containing the data + The simulator the message originated from + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming event message + The Unique Capabilities Key + The event message containing the data + The simulator the message originated from + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Contains the Event data returned from the data server from an EventInfoRequest + + + + A single EventInfo object containing the details of an event + + + + Construct a new instance of the EventInfoReplyEventArgs class + A single EventInfo object containing the details of an event + + + Contains the "Event" detail data returned from the data server + + + The ID returned by + + + A list of "Events" returned by the data server + + + Construct a new instance of the DirEventsReplyEventArgs class + The ID of the query returned by the data server. + This will correlate to the ID returned by the method + A list containing the "Events" returned by the search query + + + Contains the "Event" list data returned from the data server + + + The ID returned by + + + A list of "Places" returned by the data server + + + Construct a new instance of PlacesReplyEventArgs class + The ID of the query returned by the data server. + This will correlate to the ID returned by the method + A list containing the "Places" returned by the data server query + + + Contains the places data returned from the data server + + + The ID returned by + + + A list containing Places data returned by the data server + + + Construct a new instance of the DirPlacesReplyEventArgs class + The ID of the query returned by the data server. + This will correlate to the ID returned by the method + A list containing land data returned by the data server + + + Contains the classified data returned from the data server + + + A list containing Classified Ads returned by the data server + + + Construct a new instance of the DirClassifiedsReplyEventArgs class + A list of classified ad data returned from the data server + + + Contains the group data returned from the data server + + + The ID returned by + + + A list containing Groups data returned by the data server + + + Construct a new instance of the DirGroupsReplyEventArgs class + The ID of the query returned by the data server. + This will correlate to the ID returned by the method + A list of groups data returned by the data server + + + Contains the people data returned from the data server + + + The ID returned by + + + A list containing People data returned by the data server + + + Construct a new instance of the DirPeopleReplyEventArgs class + The ID of the query returned by the data server. + This will correlate to the ID returned by the method + A list of people data returned by the data server + + + Contains the land sales data returned from the data server + + + A list containing land forsale data returned by the data server + + + Construct a new instance of the DirLandReplyEventArgs class + A list of parcels for sale returned by the data server + + + + Represents individual HTTP Download request + + + + URI of the item to fetch + + + Timout specified in milliseconds + + + Download progress callback + + + Download completed callback + + + Accept the following content type + + + How many times will this request be retried + + + Current fetch attempt + + + Default constructor + + + Constructor + + + + Manages async HTTP downloads with a limit on maximum + concurrent downloads + + + + Maximum number of parallel downloads from a single endpoint + + + Client certificate + + + Default constructor + + + Cleanup method + + + Setup http download request + + + Check the queue for pending work + + + Enqueue a new HTTP download + + + Describes tasks returned in LandStatReply + + + + Estate level administration and utilities + + + + Textures for each of the four terrain height levels + + + Upper/lower texture boundaries for each corner of the sim + + + + Constructor for EstateTools class + + + + + Used in the ReportType field of a LandStatRequest + + + Used by EstateOwnerMessage packets + + + Used by EstateOwnerMessage packets + + + + + + + + No flags set + + + Only return targets scripted objects + + + Only return targets objects if on others land + + + Returns target's scripted objects and objects on other parcels + + + Ground texture settings for each corner of the region + + + Used by GroundTextureHeightSettings + + + The high and low texture thresholds for each corner of the sim + + + The event subscribers. null if no subcribers + + + Raises the TopCollidersReply event + A TopCollidersReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the TopScriptsReply event + A TopScriptsReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateUsersReply event + A EstateUsersReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateGroupsReply event + A EstateGroupsReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateManagersReply event + A EstateManagersReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateBansReply event + A EstateBansReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateCovenantReply event + A EstateCovenantReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + The event subscribers. null if no subcribers + + + Raises the EstateUpdateInfoReply event + A EstateUpdateInfoReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the data server responds to a request. + + + + Requests estate information such as top scripts and colliders + + + + + + + + Requests estate settings, including estate manager and access/ban lists + + + Requests the "Top Scripts" list for the current region + + + Requests the "Top Colliders" list for the current region + + + + Set several estate specific configuration variables + + The Height of the waterlevel over the entire estate. Defaults to 20 + The maximum height change allowed above the baked terrain. Defaults to 4 + The minimum height change allowed below the baked terrain. Defaults to -4 + true to use + if True forces the sun position to the position in SunPosition + The current position of the sun on the estate, or when FixedSun is true the static position + the sun will remain. 6.0 = Sunrise, 30.0 = Sunset + + + + Request return of objects owned by specified avatar + + The Agents owning the primitives to return + specify the coverage and type of objects to be included in the return + true to perform return on entire estate + + + + + + + + + Used for setting and retrieving various estate panel settings + + EstateOwnerMessage Method field + List of parameters to include + + + + Kick an avatar from an estate + + Key of Agent to remove + + + + Ban an avatar from an estate + Key of Agent to remove + Ban user from this estate and all others owned by the estate owner + + + Unban an avatar from an estate + Key of Agent to remove + /// Unban user from this estate and all others owned by the estate owner + + + + Send a message dialog to everyone in an entire estate + + Message to send all users in the estate + + + + Send a message dialog to everyone in a simulator + + Message to send all users in the simulator + + + + Send an avatar back to their home location + + Key of avatar to send home + + + + Begin the region restart process + + + + + Cancels a region restart + + + + Estate panel "Region" tab settings + + + Estate panel "Debug" tab settings + + + Used for setting the region's terrain textures for its four height levels + + + + + + + Used for setting sim terrain texture heights + + + Requests the estate covenant + + + + Upload a terrain RAW file + + A byte array containing the encoded terrain data + The name of the file being uploaded + The Id of the transfer request + + + + Teleports all users home in current Estate + + + + + Remove estate manager + Key of Agent to Remove + removes manager to this estate and all others owned by the estate owner + + + + Add estate manager + Key of Agent to Add + Add agent as manager to this estate and all others owned by the estate owner + + + + Add's an agent to the estate Allowed list + Key of Agent to Add + Add agent as an allowed reisdent to All estates if true + + + + Removes an agent from the estate Allowed list + Key of Agent to Remove + Removes agent as an allowed reisdent from All estates if true + + + + + Add's a group to the estate Allowed list + Key of Group to Add + Add Group as an allowed group to All estates if true + + + + + Removes a group from the estate Allowed list + Key of Group to Remove + Removes Group as an allowed Group from All estates if true + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Raised on LandStatReply when the report type is for "top colliders" + + + + The number of returned items in LandStatReply + + + + + A Dictionary of Object UUIDs to tasks returned in LandStatReply + + + + Construct a new instance of the TopCollidersReplyEventArgs class + The number of returned items in LandStatReply + Dictionary of Object UUIDs to tasks returned in LandStatReply + + + Raised on LandStatReply when the report type is for "top Scripts" + + + + The number of scripts returned in LandStatReply + + + + + A Dictionary of Object UUIDs to tasks returned in LandStatReply + + + + Construct a new instance of the TopScriptsReplyEventArgs class + The number of returned items in LandStatReply + Dictionary of Object UUIDs to tasks returned in LandStatReply + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The identifier of the estate + + + + + The number of returned itmes + + + + + List of UUIDs of Banned Users + + + + Construct a new instance of the EstateBansReplyEventArgs class + The estate's identifier on the grid + The number of returned items in LandStatReply + User UUIDs banned + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The identifier of the estate + + + + + The number of returned items + + + + + List of UUIDs of Allowed Users + + + + Construct a new instance of the EstateUsersReplyEventArgs class + The estate's identifier on the grid + The number of users + Allowed users UUIDs + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The identifier of the estate + + + + + The number of returned items + + + + + List of UUIDs of Allowed Groups + + + + Construct a new instance of the EstateGroupsReplyEventArgs class + The estate's identifier on the grid + The number of Groups + Allowed Groups UUIDs + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The identifier of the estate + + + + + The number of returned items + + + + + List of UUIDs of the Estate's Managers + + + + Construct a new instance of the EstateManagersReplyEventArgs class + The estate's identifier on the grid + The number of Managers + Managers UUIDs + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The Covenant + + + + + The timestamp + + + + + The Estate name + + + + + The Estate Owner's ID (can be a GroupID) + + + + Construct a new instance of the EstateCovenantReplyEventArgs class + The Covenant ID + The timestamp + The estate's name + The Estate Owner's ID (can be a GroupID) + + + Returned, along with other info, upon a successful .RequestInfo() + + + + The estate's name + + + + + The Estate Owner's ID (can be a GroupID) + + + + + The identifier of the estate on the grid + + + + + + + Construct a new instance of the EstateUpdateInfoReplyEventArgs class + The estate's name + The Estate Owners ID (can be a GroupID) + The estate's identifier on the grid + + + + + Registers, unregisters, and fires events generated by incoming packets + + + + + Object that is passed to worker threads in the ThreadPool for + firing packet callbacks + + + + Callback to fire for this packet + + + Reference to the simulator that this packet came from + + + The packet that needs to be processed + + + Reference to the GridClient object + + + + Default constructor + + + + + + Register an event handler + + Use PacketType.Default to fire this event on every + incoming packet + Packet type to register the handler for + Callback to be fired + True if this callback should be ran + asynchronously, false to run it synchronous + + + + Unregister an event handler + + Packet type to unregister the handler for + Callback to be unregistered + + + + Fire the events registered for this packet type + + Incoming packet type + Incoming packet + Simulator this packet was received from + + + + Registers, unregisters, and fires events generated by the Capabilities + event queue + + + + Reference to the GridClient object + + + + Default constructor + + Reference to the GridClient object + + + + Register an new event handler for a capabilities event sent via the EventQueue + + Use String.Empty to fire this event on every CAPS event + Capability event name to register the + handler for + Callback to fire + + + + Unregister a previously registered capabilities handler + + Capability event name unregister the + handler for + Callback to unregister + + + + Fire the events registered for this event type synchronously + + Capability name + Decoded event body + Reference to the simulator that + generated this event + + + + Fire the events registered for this event type asynchronously + + Capability name + Decoded event body + Reference to the simulator that + generated this event + + + + + + + + The avatar has no rights + + + The avatar can see the online status of the target avatar + + + The avatar can see the location of the target avatar on the map + + + The avatar can modify the ojects of the target avatar + + + + This class holds information about an avatar in the friends list. There are two ways + to interface to this class. The first is through the set of boolean properties. This is the typical + way clients of this class will use it. The second interface is through two bitflag properties, + TheirFriendsRights and MyFriendsRights + + + + + System ID of the avatar + + + + + full name of the avatar + + + + + True if the avatar is online + + + + + True if the friend can see if I am online + + + + + True if the friend can see me on the map + + + + + True if the freind can modify my objects + + + + + True if I can see if my friend is online + + + + + True if I can see if my friend is on the map + + + + + True if I can modify my friend's objects + + + + + My friend's rights represented as bitmapped flags + + + + + My rights represented as bitmapped flags + + + + + Used internally when building the initial list of friends at login time + + System ID of the avatar being prepesented + Rights the friend has to see you online and to modify your objects + Rights you have to see your friend online and to modify their objects + + + + FriendInfo represented as a string + + A string reprentation of both my rights and my friends rights + + + + This class is used to add and remove avatars from your friends list and to manage their permission. + + + + Thread sync lock object + + + The event subscribers. null if no subcribers + + + Raises the FriendOnline event + A FriendInfoEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends notification one of the members in our friends list comes online + + + The event subscribers. null if no subcribers + + + Raises the FriendOffline event + A FriendInfoEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends notification one of the members in our friends list goes offline + + + The event subscribers. null if no subcribers + + + Raises the FriendRightsUpdate event + A FriendInfoEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends notification one of the members in our friends list grants or revokes permissions + + + The event subscribers. null if no subcribers + + + Raises the FriendNames event + A FriendNamesEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends us the names on our friends list + + + The event subscribers. null if no subcribers + + + Raises the FriendshipOffered event + A FriendshipOfferedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends notification another agent is offering us friendship + + + The event subscribers. null if no subcribers + + + Raises the FriendshipResponse event + A FriendshipResponseEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when a request we sent to friend another agent is accepted or declined + + + The event subscribers. null if no subcribers + + + Raises the FriendshipTerminated event + A FriendshipTerminatedEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends notification one of the members in our friends list has terminated + our friendship + + + The event subscribers. null if no subcribers + + + Raises the FriendFoundReply event + A FriendFoundReplyEventArgs object containing the + data returned from the data server + + + Thread sync lock object + + + Raised when the simulator sends the location of a friend we have + requested map location info for + + + + A dictionary of key/value pairs containing known friends of this avatar. + + The Key is the of the friend, the value is a + object that contains detailed information including permissions you have and have given to the friend + + + + + A Dictionary of key/value pairs containing current pending frienship offers. + + The key is the of the avatar making the request, + the value is the of the request which is used to accept + or decline the friendship offer + + + + + Internal constructor + + A reference to the GridClient Object + + + + Accept a friendship request + + agentID of avatatar to form friendship with + imSessionID of the friendship request message + + + + Decline a friendship request + + of friend + imSessionID of the friendship request message + + + + Overload: Offer friendship to an avatar. + + System ID of the avatar you are offering friendship to + + + + Offer friendship to an avatar. + + System ID of the avatar you are offering friendship to + A message to send with the request + + + + Terminate a friendship with an avatar + + System ID of the avatar you are terminating the friendship with + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Change the rights of a friend avatar. + + the of the friend + the new rights to give the friend + This method will implicitly set the rights to those passed in the rights parameter. + + + + Use to map a friends location on the grid. + + Friends UUID to find + + + + + Use to track a friends movement on the grid + + Friends Key + + + + Ask for a notification of friend's online status + + Friend's UUID + + + + This handles the asynchronous response of a RequestAvatarNames call. + + + names cooresponding to the the list of IDs sent the the RequestAvatarNames call. + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Populate FriendList with data from the login reply + + true if login was successful + true if login request is requiring a redirect + A string containing the response to the login request + A string containing the reason for the request + A object containing the decoded + reply from the login server + + + Number of friends we have + + + Get the name of the agent we requested a friendship with + + Construct a new instance of the FriendsReadyEventArgs class + + The total number of people loaded into the friend list. + + + Contains information on a member of our friends list + + + Get the FriendInfo + + + + Construct a new instance of the FriendInfoEventArgs class + + The FriendInfo + + + Contains Friend Names + + + A dictionary where the Key is the ID of the Agent, + and the Value is a string containing their name + + + + Construct a new instance of the FriendNamesEventArgs class + + A dictionary where the Key is the ID of the Agent, + and the Value is a string containing their name + + + Sent when another agent requests a friendship with our agent + + + Get the ID of the agent requesting friendship + + + Get the name of the agent requesting friendship + + + Get the ID of the session, used in accepting or declining the + friendship offer + + + + Construct a new instance of the FriendshipOfferedEventArgs class + + The ID of the agent requesting friendship + The name of the agent requesting friendship + The ID of the session, used in accepting or declining the + friendship offer + + + A response containing the results of our request to form a friendship with another agent + + + Get the ID of the agent we requested a friendship with + + + Get the name of the agent we requested a friendship with + + + true if the agent accepted our friendship offer + + + + Construct a new instance of the FriendShipResponseEventArgs class + + The ID of the agent we requested a friendship with + The name of the agent we requested a friendship with + true if the agent accepted our friendship offer + + + Contains data sent when a friend terminates a friendship with us + + + Get the ID of the agent that terminated the friendship with us + + + Get the name of the agent that terminated the friendship with us + + + + Construct a new instance of the FrindshipTerminatedEventArgs class + + The ID of the friend who terminated the friendship with us + The name of the friend who terminated the friendship with us + + + + Data sent in response to a request which contains the information to allow us to map the friends location + + + + Get the ID of the agent we have received location information for + + + Get the region handle where our mapped friend is located + + + Get the simulator local position where our friend is located + + + + Construct a new instance of the FriendFoundReplyEventArgs class + + The ID of the agent we have requested location information for + The region handle where our friend is located + The simulator local position our friend is located + + + + Main class to expose grid functionality to clients. All of the + classes needed for sending and receiving data are accessible through + this class. + + + + // Example minimum code required to instantiate class and + // connect to a simulator. + using System; + using System.Collections.Generic; + using System.Text; + using OpenMetaverse; + + namespace FirstBot + { + class Bot + { + public static GridClient Client; + static void Main(string[] args) + { + Client = new GridClient(); // instantiates the GridClient class + // to the global Client object + // Login to Simulator + Client.Network.Login("FirstName", "LastName", "Password", "FirstBot", "1.0"); + // Wait for a Keypress + Console.ReadLine(); + // Logout of simulator + Client.Network.Logout(); + } + } + } + + + + + Networking subsystem + + + Settings class including constant values and changeable + parameters for everything + + + Parcel (subdivided simulator lots) subsystem + + + Our own avatars subsystem + + + Other avatars subsystem + + + Estate subsystem + + + Friends list subsystem + + + Grid (aka simulator group) subsystem + + + Object subsystem + + + Group subsystem + + + Asset subsystem + + + Inventory AIS client + + + Appearance subsystem + + + Inventory subsystem + + + Directory searches including classifieds, people, land sales, etc + + + Handles land, wind, and cloud heightmaps + + + Handles sound-related networking + + + Throttling total bandwidth usage, or allocating bandwidth + for specific data stream types + + + + Default constructor + + + + + Return the full name of this instance + + Client avatars full name + + + + Map layer request type + + + + Objects and terrain are shown + + + Only the terrain is shown, no objects + + + Overlay showing land for sale and for auction + + + + Type of grid item, such as telehub, event, populator location, etc. + + + + Telehub + + + PG rated event + + + Mature rated event + + + Popular location + + + Locations of avatar groups in a region + + + Land for sale + + + Classified ad + + + Adult rated event + + + Adult land for sale + + + + Information about a region on the grid map + + + + Sim X position on World Map + + + Sim Y position on World Map + + + Sim Name (NOTE: In lowercase!) + + + + + + Appears to always be zero (None) + + + Sim's defined Water Height + + + + + + UUID of the World Map image + + + Unique identifier for this region, a combination of the X + and Y position + + + + + + + + + + + + + + + + + + + + + + + Visual chunk of the grid map + + + + + Base class for Map Items + + + + The Global X position of the item + + + The Global Y position of the item + + + Get the Local X position of the item + + + Get the Local Y position of the item + + + Get the Handle of the region + + + + Represents an agent or group of agents location + + + + + Represents a Telehub location + + + + + Represents a non-adult parcel of land for sale + + + + + Represents an Adult parcel of land for sale + + + + + Represents a PG Event + + + + + Represents a Mature event + + + + + Represents an Adult event + + + + + Manages grid-wide tasks such as the world map + + + + The event subscribers. null if no subcribers + + + Raises the CoarseLocationUpdate event + A CoarseLocationUpdateEventArgs object containing the + data sent by simulator + + + Thread sync lock object + + + Raised when the simulator sends a + containing the location of agents in the simulator + + + The event subscribers. null if no subcribers + + + Raises the GridRegion event + A GridRegionEventArgs object containing the + data sent by simulator + + + Thread sync lock object + + + Raised when the simulator sends a Region Data in response to + a Map request + + + The event subscribers. null if no subcribers + + + Raises the GridLayer event + A GridLayerEventArgs object containing the + data sent by simulator + + + Thread sync lock object + + + Raised when the simulator sends GridLayer object containing + a map tile coordinates and texture information + + + The event subscribers. null if no subcribers + + + Raises the GridItems event + A GridItemEventArgs object containing the + data sent by simulator + + + Thread sync lock object + + + Raised when the simulator sends GridItems object containing + details on events, land sales at a specific location + + + The event subscribers. null if no subcribers + + + Raises the RegionHandleReply event + A RegionHandleReplyEventArgs object containing the + data sent by simulator + + + Thread sync lock object + + + Raised in response to a Region lookup + + + Unknown + + + Current direction of the sun + + + Current angular velocity of the sun + + + Microseconds since the start of SL 4-hour day + + + A dictionary of all the regions, indexed by region name + + + A dictionary of all the regions, indexed by region handle + + + + Constructor + + Instance of GridClient object to associate with this GridManager instance + + + + + + + + + + Request a map layer + + The name of the region + The type of layer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Request data for all mainland (Linden managed) simulators + + + + + Request the region handle for the specified region UUID + + UUID of the region to look up + + + + Get grid region information using the region name, this function + will block until it can find the region or gives up + + Name of sim you're looking for + Layer that you are requesting + Will contain a GridRegion for the sim you're + looking for if successful, otherwise an empty structure + True if the GridRegion was successfully fetched, otherwise + false + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Avatar group management + + + + Key of Group Member + + + Total land contribution + + + Online status information + + + Abilities that the Group Member has + + + Current group title + + + Is a group owner + + + + Role manager for a group + + + + Key of the group + + + Key of Role + + + Name of Role + + + Group Title associated with Role + + + Description of Role + + + Abilities Associated with Role + + + Returns the role's title + The role's title + + + + Class to represent Group Title + + + + Key of the group + + + ID of the role title belongs to + + + Group Title + + + Whether title is Active + + + Returns group title + + + + Represents a group on the grid + + + + Key of Group + + + Key of Group Insignia + + + Key of Group Founder + + + Key of Group Role for Owners + + + Name of Group + + + Text of Group Charter + + + Title of "everyone" role + + + Is the group open for enrolement to everyone + + + Will group show up in search + + + Group powers + + + Accepts notices + + + Allow publish + + + Is the group Mature + + + Cost of group membership + + + Group money + + + Group contribution + + + The total number of current members this group has + + + The number of roles this group has configured + + + Show this group in agent's profile + + + Returns the name of the group + A string containing the name of the group + + + + A group Vote + + + + Key of Avatar who created Vote + + + Text of the Vote proposal + + + Total number of votes + + + + A group proposal + + + + The Text of the proposal + + + The minimum number of members that must vote before proposal passes or failes + + + The required ration of yes/no votes required for vote to pass + The three options are Simple Majority, 2/3 Majority, and Unanimous + TODO: this should be an enum + + + The duration in days votes are accepted + + + + Account summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Struct representing a group notice + + + + Subject of notice + + + Notice message + + + Object ID of attachment + + + Notice owner + + + + OSD Serialize object for attaching + + + + + + Struct representing a group notice list entry + + + + Notice ID + + + Creation timestamp of notice + + + Agent name who created notice + + + Notice subject + + + Is there an attachment? + + + Attachment Type + + + + Struct representing a member of a group chat session and their settings + + + + The of the Avatar + + + True if user has voice chat enabled + + + True of Avatar has moderator abilities + + + True if a moderator has muted this avatars chat + + + True if a moderator has muted this avatars voice + + + + Role update flags + + + + + + + + + + + + + + + + + + + + + + Can send invitations to groups default role + + + Can eject members from group + + + Can toggle 'Open Enrollment' and change 'Signup fee' + + + Member is visible in the public member list + + + Can create new roles + + + Can delete existing roles + + + Can change Role names, titles and descriptions + + + Can assign other members to assigners role + + + Can assign other members to any role + + + Can remove members from roles + + + Can assign and remove abilities in roles + + + Can change group Charter, Insignia, 'Publish on the web' and which + members are publicly visible in group member listings + + + Can buy land or deed land to group + + + Can abandon group owned land to Governor Linden on mainland, or Estate owner for + private estates + + + Can set land for-sale information on group owned parcels + + + Can subdivide and join parcels + + + Can toggle "Show in Find Places" and set search category + + + Can change parcel name, description, and 'Publish on web' settings + + + Can set the landing point and teleport routing on group land + + + Can change music and media settings + + + Can toggle 'Edit Terrain' option in Land settings + + + Can toggle various About Land > Options settings + + + Can always terraform land, even if parcel settings have it turned off + + + Can always fly while over group owned land + + + Can always rez objects on group owned land + + + Can always create landmarks for group owned parcels + + + Can set home location on any group owned parcel + + + Can modify public access settings for group owned parcels + + + Can manager parcel ban lists on group owned land + + + Can manage pass list sales information + + + Can eject and freeze other avatars on group owned land + + + Can return objects set to group + + + Can return non-group owned/set objects + + + Can return group owned objects + + + Can landscape using Linden plants + + + Can deed objects to group + + + Can move group owned objects + + + Can set group owned objects for-sale + + + Pay group liabilities and receive group dividends + + + List and Host group events + + + Can send group notices + + + Can receive group notices + + + Can create group proposals + + + Can vote on group proposals + + + Can join group chat sessions + + + Can use voice chat in Group Chat sessions + + + Can moderate group chat sessions + + + Has admin rights to any experiences owned by this group + + + Can sign scripts for experiences owned by this group + + + Allows access to ban / un-ban agents from a group + + + + Ban actions available for group members + + + + Ban agent from joining a group + + + Remove restriction on agent jointing a group + + + + Handles all network traffic related to reading and writing group + information + + + + The event subscribers. null if no subcribers + + + Raises the CurrentGroups event + A CurrentGroupsEventArgs object containing the + data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + our current group membership + + + The event subscribers. null if no subcribers + + + Raises the GroupNamesReply event + A GroupNamesEventArgs object containing the + data response from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a RequestGroupName + or RequestGroupNames request + + + The event subscribers. null if no subcribers + + + Raises the GroupProfile event + An GroupProfileEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the GroupMembers event + A GroupMembersEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the GroupRolesDataReply event + A GroupRolesDataReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the GroupRoleMembersReply event + A GroupRolesRoleMembersReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the GroupTitlesReply event + A GroupTitlesReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the GroupAccountSummary event + A GroupAccountSummaryReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when a response to a RequestGroupAccountSummary is returned + by the simulator + + + The event subscribers. null if no subcribers + + + Raises the GroupCreated event + An GroupCreatedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when a request to create a group is successful + + + The event subscribers. null if no subcribers + + + Raises the GroupJoined event + A GroupOperationEventArgs object containing the + result of the operation returned from the simulator + + + Thread sync lock object + + + Raised when a request to join a group either + fails or succeeds + + + The event subscribers. null if no subcribers + + + Raises the GroupLeft event + A GroupOperationEventArgs object containing the + result of the operation returned from the simulator + + + Thread sync lock object + + + Raised when a request to leave a group either + fails or succeeds + + + The event subscribers. null if no subcribers + + + Raises the GroupDropped event + An GroupDroppedEventArgs object containing the + the group your agent left + + + Thread sync lock object + + + Raised when A group is removed from the group server + + + The event subscribers. null if no subcribers + + + Raises the GroupMemberEjected event + An GroupMemberEjectedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when a request to eject a member from a group either + fails or succeeds + + + The event subscribers. null if no subcribers + + + Raises the GroupNoticesListReply event + An GroupNoticesListReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us group notices + + + + The event subscribers. null if no subcribers + + + Raises the GroupInvitation event + An GroupInvitationEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when another agent invites our avatar to join a group + + + The event subscribers. null if no subcribers + + + Raises the BannedAgents event + An BannedAgentsEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when another agent invites our avatar to join a group + + + A reference to the current instance + + + Currently-active group members requests + + + Currently-active group roles requests + + + Currently-active group role-member requests + + + Dictionary keeping group members while request is in progress + + + Dictionary keeping mebmer/role mapping while request is in progress + + + Dictionary keeping GroupRole information while request is in progress + + + Caches group name lookups + + + + Construct a new instance of the GroupManager class + + A reference to the current instance + + + + Request a current list of groups the avatar is a member of. + + CAPS Event Queue must be running for this to work since the results + come across CAPS. + + + + Lookup name of group based on groupID + + groupID of group to lookup name for. + + + + Request lookup of multiple group names + + List of group IDs to request. + + + Lookup group profile data such as name, enrollment, founder, logo, etc + Subscribe to OnGroupProfile event to receive the results. + group ID (UUID) + + + Request a list of group members. + Subscribe to OnGroupMembers event to receive the results. + group ID (UUID) + UUID of the request, use to index into cache + + + Request group roles + Subscribe to OnGroupRoles event to receive the results. + group ID (UUID) + UUID of the request, use to index into cache + + + Request members (members,role) role mapping for a group. + Subscribe to OnGroupRolesMembers event to receive the results. + group ID (UUID) + UUID of the request, use to index into cache + + + Request a groups Titles + Subscribe to OnGroupTitles event to receive the results. + group ID (UUID) + UUID of the request, use to index into cache + + + Begin to get the group account summary + Subscribe to the OnGroupAccountSummary event to receive the results. + group ID (UUID) + How long of an interval + Which interval (0 for current, 1 for last) + + + Invites a user to a group + The group to invite to + A list of roles to invite a person to + Key of person to invite + + + Set a group as the current active group + group ID (UUID) + + + Change the role that determines your active title + Group ID to use + Role ID to change to + + + Set this avatar's tier contribution + Group ID to change tier in + amount of tier to donate + + + + Save wheather agent wants to accept group notices and list this group in their profile + + Group + Accept notices from this group + List this group in the profile + + + Request to join a group + Subscribe to OnGroupJoined event for confirmation. + group ID (UUID) to join. + + + + Request to create a new group. If the group is successfully + created, L$100 will automatically be deducted + + Subscribe to OnGroupCreated event to receive confirmation. + Group struct containing the new group info + + + Update a group's profile and other information + Groups ID (UUID) to update. + Group struct to update. + + + Eject a user from a group + Group ID to eject the user from + Avatar's key to eject + + + Update role information + Modified role to be updated + + + Create a new group role + Group ID to update + Role to create + + + Delete a group role + Group ID to update + Role to delete + + + Remove an avatar from a role + Group ID to update + Role ID to be removed from + Avatar's Key to remove + + + Assign an avatar to a role + Group ID to update + Role ID to assign to + Avatar's ID to assign to role + + + Request the group notices list + Group ID to fetch notices for + + + Request a group notice by key + ID of group notice + + + Send out a group notice + Group ID to update + GroupNotice structure containing notice data + + + Start a group proposal (vote) + The Group ID to send proposal to + GroupProposal structure containing the proposal + + + Request to leave a group + Subscribe to OnGroupLeft event to receive confirmation + The group to leave + + + + Gets the URI of the cpability for handling group bans + + Group ID + null, if the feature is not supported, or URI of the capability + + + + Request a list of residents banned from joining a group + + UUID of the group + + + + Request a list of residents banned from joining a group + + UUID of the group + Callback on request completition + + + + Request that group of agents be banned or unbanned from the group + + Group ID + Ban/Unban action + Array of agents UUIDs to ban + + + + Request that group of agents be banned or unbanned from the group + + Group ID + Ban/Unban action + Array of agents UUIDs to ban + Callback + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Contains the current groups your agent is a member of + + + Get the current groups your agent is a member of + + + Construct a new instance of the CurrentGroupsEventArgs class + The current groups your agent is a member of + + + A Dictionary of group names, where the Key is the groups ID and the value is the groups name + + + Get the Group Names dictionary + + + Construct a new instance of the GroupNamesEventArgs class + The Group names dictionary + + + Represents the members of a group + + + Get the ID as returned by the request to correlate + this result set and the request + + + Get the ID of the group + + + Get the dictionary of members + + + + Construct a new instance of the GroupMembersReplyEventArgs class + + The ID of the request + The ID of the group + The membership list of the group + + + Represents the roles associated with a group + + + Get the ID as returned by the request to correlate + this result set and the request + + + Get the ID of the group + + + Get the dictionary containing the roles + + + Construct a new instance of the GroupRolesDataReplyEventArgs class + The ID as returned by the request to correlate + this result set and the request + The ID of the group + The dictionary containing the roles + + + Represents the Role to Member mappings for a group + + + Get the ID as returned by the request to correlate + this result set and the request + + + Get the ID of the group + + + Get the member to roles map + + + Construct a new instance of the GroupRolesMembersReplyEventArgs class + The ID as returned by the request to correlate + this result set and the request + The ID of the group + The member to roles map + + + Represents the titles for a group + + + Get the ID as returned by the request to correlate + this result set and the request + + + Get the ID of the group + + + Get the titles + + + Construct a new instance of the GroupTitlesReplyEventArgs class + The ID as returned by the request to correlate + this result set and the request + The ID of the group + The titles + + + Represents the summary data for a group + + + Get the ID of the group + + + Get the summary data + + + Construct a new instance of the GroupAccountSummaryReplyEventArgs class + The ID of the group + The summary data + + + A response to a group create request + + + Get the ID of the group + + + true of the group was created successfully + + + A string containing the message + + + Construct a new instance of the GroupCreatedReplyEventArgs class + The ID of the group + the success or faulure of the request + A string containing additional information + + + Represents a response to a request + + + Get the ID of the group + + + true of the request was successful + + + Construct a new instance of the GroupOperationEventArgs class + The ID of the group + true of the request was successful + + + Represents your agent leaving a group + + + Get the ID of the group + + + Construct a new instance of the GroupDroppedEventArgs class + The ID of the group + + + Represents a list of active group notices + + + Get the ID of the group + + + Get the notices list + + + Construct a new instance of the GroupNoticesListReplyEventArgs class + The ID of the group + The list containing active notices + + + Represents the profile of a group + + + Get the group profile + + + Construct a new instance of the GroupProfileEventArgs class + The group profile + + + + Provides notification of a group invitation request sent by another Avatar + + The invitation is raised when another avatar makes an offer for our avatar + to join a group. + + + The ID of the Avatar sending the group invitation + + + The name of the Avatar sending the group invitation + + + A message containing the request information which includes + the name of the group, the groups charter and the fee to join details + + + The Simulator + + + Set to true to accept invitation, false to decline + + + + Result of the request for list of agents banned from a group + + + + Indicates if list of banned agents for a group was successfully retrieved + + + Indicates if list of banned agents for a group was successfully retrieved + + + Array containing a list of UUIDs of the agents banned from a group + + + + Static helper functions and global variables + + + + This header flag signals that ACKs are appended to the packet + + + This header flag signals that this packet has been sent before + + + This header flags signals that an ACK is expected for this packet + + + This header flag signals that the message is compressed using zerocoding + + + + Passed to Logger.Log() to identify the severity of a log entry + + + + No logging information will be output + + + Non-noisy useful information, may be helpful in + debugging a problem + + + A non-critical error occurred. A warning will not + prevent the rest of the library from operating as usual, + although it may be indicative of an underlying issue + + + A critical error has occurred. Generally this will + be followed by the network layer shutting down, although the + stability of the library after an error is uncertain + + + Used for internal testing, this logging level can + generate very noisy (long and/or repetitive) messages. Don't + pass this to the Log() function, use DebugLog() instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Given an X/Y location in absolute (grid-relative) terms, a region + handle is returned along with the local X/Y location in that region + + The absolute X location, a number such as + 255360.35 + The absolute Y location, a number such as + 255360.35 + The sim-local X position of the global X + position, a value from 0.0 to 256.0 + The sim-local Y position of the global Y + position, a value from 0.0 to 256.0 + A 64-bit region handle that can be used to teleport to + + + + Converts a floating point number to a terse string format used for + transmitting numbers in wearable asset files + + Floating point number to convert to a string + A terse string representation of the input number + + + + Convert a variable length field (byte array) to a string, with a + field name prepended to each line of the output + + If the byte array has unprintable characters in it, a + hex dump will be written instead + The StringBuilder object to write to + The byte array to convert to a string + A field name to prepend to each line of output + + + + Decode a zerocoded byte array, used to decompress packets marked + with the zerocoded flag + + Any time a zero is encountered, the next byte is a count + of how many zeroes to expand. One zero is encoded with 0x00 0x01, + two zeroes is 0x00 0x02, three zeroes is 0x00 0x03, etc. The + first four bytes are copied directly to the output buffer. + + The byte array to decode + The length of the byte array to decode. This + would be the length of the packet up to (but not including) any + appended ACKs + The output byte array to decode to + The length of the output buffer + + + + Encode a byte array with zerocoding. Used to compress packets marked + with the zerocoded flag. Any zeroes in the array are compressed down + to a single zero byte followed by a count of how many zeroes to expand + out. A single zero becomes 0x00 0x01, two zeroes becomes 0x00 0x02, + three zeroes becomes 0x00 0x03, etc. The first four bytes are copied + directly to the output buffer. + + The byte array to encode + The length of the byte array to encode + The output byte array to encode to + The length of the output buffer + + + + Calculates the CRC (cyclic redundancy check) needed to upload inventory. + + Creation date + Sale type + Inventory type + Type + Asset ID + Group ID + Sale price + Owner ID + Creator ID + Item ID + Folder ID + Everyone mask (permissions) + Flags + Next owner mask (permissions) + Group mask (permissions) + Owner mask (permissions) + The calculated CRC + + + + Attempts to load a file embedded in the assembly + + The filename of the resource to load + A Stream for the requested file, or null if the resource + was not successfully loaded + + + + Attempts to load a file either embedded in the assembly or found in + a given search path + + The filename of the resource to load + An optional path that will be searched if + the asset is not found embedded in the assembly + A Stream for the requested file, or null if the resource + was not successfully loaded + + + + Converts a list of primitives to an object that can be serialized + with the LLSD system + + Primitives to convert to a serializable object + An object that can be serialized with LLSD + + + + Deserializes OSD in to a list of primitives + + Structure holding the serialized primitive list, + must be of the SDMap type + A list of deserialized primitives + + + + Converts a struct or class object containing fields only into a key value separated string + + The struct object + A string containing the struct fields as the keys, and the field value as the value separated + + + // Add the following code to any struct or class containing only fields to override the ToString() + // method to display the values of the passed object + + /// Print the struct data as a string + ///A string containing the field name, and field value + public override string ToString() + { + return Helpers.StructToString(this); + } + + + + + + decompresses a gzipped OSD object + + + the OSD object + + + + A set of textures that are layered on texture of each other and "baked" + in to a single texture, for avatar appearances + + + + Final baked texture + + + Component layers + + + Width of the final baked image and scratchpad + + + Height of the final baked image and scratchpad + + + Bake type + + + Is this one of the 3 skin bakes + + + Final baked texture + + + Component layers + + + Width of the final baked image and scratchpad + + + Height of the final baked image and scratchpad + + + Bake type + + + + Default constructor + + Bake type + + + + Adds layer for baking + + TexturaData struct that contains texture and its params + + + + Converts avatar texture index (face) to Bake type + + Face number (AvatarTextureIndex) + BakeType, layer to which this texture belongs to + + + + Make sure images exist, resize source if needed to match the destination + + Destination image + Source image + Sanitization was succefull + + + + Fills a baked layer as a solid *appearing* color. The colors are + subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from + compressing it too far since it seems to cause upload failures if + the image is a pure solid color + + Color of the base of this layer + + + + Fills a baked layer as a solid *appearing* color. The colors are + subtly dithered on a 16x16 grid to prevent the JPEG2000 stage from + compressing it too far since it seems to cause upload failures if + the image is a pure solid color + + Red value + Green value + Blue value + + + + Image width + + + + + Image height + + + + + Image channel flags + + + + + Red channel data + + + + + Green channel data + + + + + Blue channel data + + + + + Alpha channel data + + + + + Bump channel data + + + + + Create a new blank image + + width + height + channel flags + + + + + + + + + + Convert the channels in the image. Channels are created or destroyed as required. + + new channel flags + + + + Resize or stretch the image using nearest neighbor (ugly) resampling + + new width + new height + + + + Create a byte array containing 32-bit RGBA data with a bottom-left + origin, suitable for feeding directly into OpenGL + + A byte array containing raw texture data + + + + Create a byte array containing 32-bit RGBA data with a bottom-left + origin, suitable for feeding directly into OpenGL + + A byte array containing raw texture data + + + + A Wrapper around openjpeg to encode and decode images to and from byte arrays + + + + TGA Header size + + + + Defines the beginning and ending file positions of a layer in an + LRCP-progression JPEG2000 file + + + + + This structure is used to marshal both encoded and decoded images. + MUST MATCH THE STRUCT IN dotnet.h! + + + + + Information about a single packet in a JPEG2000 stream + + + + Packet start position + + + Packet header end position + + + Packet end position + + + OpenJPEG is not threadsafe, so this object is used to lock + during calls into unmanaged code + + + + Encode a object into a byte array + + The object to encode + true to enable lossless conversion, only useful for small images ie: sculptmaps + A byte array containing the encoded Image object + + + + Encode a object into a byte array + + The object to encode + a byte array of the encoded image + + + + Decode JPEG2000 data to an and + + + JPEG2000 encoded data + ManagedImage object to decode to + Image object to decode to + True if the decode succeeds, otherwise false + + + + + + + + + + + + + + + + + + + + + Encode a object into a byte array + + The source object to encode + true to enable lossless decoding + A byte array containing the source Bitmap object + + + + Capability to load TGAs to Bitmap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Parsing Collada model files into data structures + + + + + Parses Collada document + + Load .dae model from this file + Load and decode images for uploading with model + A list of mesh prims that were parsed from the collada file + + + + Implements mesh upload communications with the simulator + + + + + Inlcude stub convex hull physics, required for uploading to Second Life + + + + + Use the same mesh used for geometry as the physical mesh upload + + + + + Callback for mesh upload operations + + null on failure, result from server on success + + + + Creates instance of the mesh uploader + + GridClient instance to communicate with the simulator + List of ModelPrimitive objects to upload as a linkset + Inventory name for newly uploaded object + Inventory description for newly upload object + + + + Performs model upload in one go, without first checking for the price + + + + + Performs model upload in one go, without first checking for the price + + Callback that will be invoke upon completion of the upload. Null is sent on request failure + + + + Ask server for details of cost and impact of the mesh upload + + Callback that will be invoke upon completion of the upload. Null is sent on request failure + + + + Performas actual mesh and image upload + + Uri recieved in the upload prepare stage + Callback that will be invoke upon completion of the upload. Null is sent on request failure + + + + Interface to a class that can supply cached byte arrays + + + + + Leases a byte array from the pool + + Minimum size the array must be to satisfy this request + A poooled array that is at least minSize + + + + Returns a byte array to the pool + + The bytes being returned + + + + Interface requirements for Messaging system + + + + + Abstract base for rendering plugins + + + + + Generates a basic mesh structure from a primitive + + Primitive to generate the mesh from + Level of detail to generate the mesh at + The generated mesh + + + + Generates a basic mesh structure from a sculpted primitive and + texture + + Sculpted primitive to generate the mesh from + Sculpt texture + Level of detail to generate the mesh at + The generated mesh + + + + Generates a series of faces, each face containing a mesh and + metadata + + Primitive to generate the mesh from + Level of detail to generate the mesh at + The generated mesh + + + + Generates a series of faces for a sculpted prim, each face + containing a mesh and metadata + + Sculpted primitive to generate the mesh from + Sculpt texture + Level of detail to generate the mesh at + The generated mesh + + + + Apply texture coordinate modifications from a + to a list of vertices + + Vertex list to modify texture coordinates for + Center-point of the face + Face texture parameters + Scale of the prim + + + + Binary reader, which is endian aware + + + + What is the format of the source file + + + + Construct a reader from a stream + + The stream to read from + + + + Construct a reader from a stream + + The stream to read from + What is the format of the file, assumes PC and similar architecture + + + + Read a 32 bit integer + + A 32 bit integer in the system's endianness + + + + Read a 16 bit integer + + A 16 bit integer in the system's endianness + + + + Read a 64 bit integer + + A 64 bit integer in the system's endianness + + + + Read an unsigned 32 bit integer + + A 32 bit unsigned integer in the system's endianness + + + + Read a single precision floating point value + + A single precision floating point value in the system's endianness + + + + Read a double precision floating point value + + A double precision floating point value in the system's endianness + + + + Read a UTF-8 string + + A standard system string + + + + Read a UTF-8 string + + length of string to read + A standard system string + + + + Load and handle Linden Lab binary meshes. + + + The exact definition of this file is a bit sketchy, especially concerning skin weights. + A good starting point is on the + second life wiki + + + + + Defines a polygon + + + + + Structure of a vertex, No surprises there, except for the Detail tex coord + + + The skinweights are a tad unconventional. The best explanation found is: + >Each weight actually contains two pieces of information. The number to the + >left of the decimal point is the index of the joint and also implicitly + >indexes to the following joint. The actual weight is to the right of the + >decimal point and interpolates between these two joints. The index is into + >an "expanded" list of joints, not just a linear array of the joints as + >defined in the skeleton file. In particular, any joint that has more than + >one child will be repeated in the list for each of its children. + + Maybe I'm dense, but that description seems to be a bit hard to build an + algorithm on. + + Esentially the weights are compressed into one floating point value. + 1. The whole number part is an index into an array of joints + 2. The fractional part is the weight that joint has + 3. If the fractional part is 0 (x.0000) then the vertex is 100% influenced by the specified joint + + + + + Provide a nice format for debugging + + Vertex definition as a string + + + + Describes deltas to apply to a vertex in order to morph a vertex + + + + + Provide a nice format for debugging + + MorphVertex definition as a string + + + + Describes a named mesh morph, essentially a named list of MorphVertices + + + + + Provide a nice format for debugging + + The name of the morph + + + + Don't really know what this does + + + + + Provide a nice format for debugging + + Human friendly format + + + + A reference mesh is one way to implement level of detail + + + Reference meshes are supplemental meshes to full meshes. For all practical + purposes almost all lod meshes are implemented as reference meshes, except for + 'avatar_eye_1.llm' which for some reason is implemented as a full mesh. + + + + + Load a mesh from a stream + + Filename and path of the file containing the reference mesh + + + + Level of Detail mesh + + + + + Construct a linden mesh with the given name + + the name of the mesh + + + + Construct a linden mesh with the given name + + the name of the mesh + The skeleton governing mesh deformation + + + + Load the mesh from a stream + + The filename and path of the file containing the mesh data + + + + Layout of one skinweight element + + + + List of skinweights, in the same order as the mesh vertices + + + + Decompress the skinweights + + the expanded joint list, used to index which bones should influece the vertex + + + + Load a reference mesh from a given stream + + The lod level of this reference mesh + the name and path of the file containing the mesh data + the loaded reference mesh + + + + Trim a string at the first occurence of NUL + + + The llm file uses null terminated strings (C/C++ style), this is where + the conversion is made. + + The string to trim + A standard .Net string + + + + load the 'avatar_skeleton.xml' + + + Partial class which extends the auto-generated 'LindenSkeleton.Xsd.cs'.eton.xsd + + + + + + Load a skeleton from a given file. + + + We use xml scema validation on top of the xml de-serializer, since the schema has + some stricter checks than the de-serializer provides. E.g. the vector attributes + are guaranteed to hold only 3 float values. This reduces the need for error checking + while working with the loaded skeleton. + + A valid recursive skeleton + + + + Load a skeleton from a given file. + + + We use xml scema validation on top of the xml de-serializer, since the schema has + some stricter checks than the de-serializer provides. E.g. the vector attributes + are guaranteed to hold only 3 float values. This reduces the need for error checking + while working with the loaded skeleton. + + The path to the skeleton definition file + A valid recursive skeleton + + + + Build and "expanded" list of joints + + + The algorithm is based on this description: + + >An "expanded" list of joints, not just a + >linear array of the joints as defined in the skeleton file. + >In particular, any joint that has more than one child will + >be repeated in the list for each of its children. + + The list should only take these joint names in consideration + An "expanded" joints list as a flat list of bone names + + + + Expand one joint + + The parent of the joint we are operating on + The joint we are supposed to expand + Joint list that we will extend upon + The expanded list should only contain these joints + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contains all mesh faces that belong to a prim + + + + List of primitive faces + + + + Decodes mesh asset into FacetedMesh + + Mesh primitive + Asset retrieved from the asset server + Level of detail + Resulting decoded FacetedMesh + True if mesh asset decoding was successful + + + + The InternalDictionary class is used through the library for storing key/value pairs. + It is intended to be a replacement for the generic Dictionary class and should + be used in its place. It contains several methods for allowing access to the data from + outside the library that are read only and thread safe. + + + Key + Value + + + Internal dictionary that this class wraps around. Do not + modify or enumerate the contents of this dictionary without locking + on this member + + + + Gets the number of Key/Value pairs contained in the + + + + + Initializes a new instance of the Class + with the specified key/value, has the default initial capacity. + + + + // initialize a new InternalDictionary named testDict with a string as the key and an int as the value. + public InternalDictionary<string, int> testDict = new InternalDictionary<string, int>(); + + + + + + Initializes a new instance of the Class + with the specified key/value, has its initial valies copied from the specified + + + + to copy initial values from + + + // initialize a new InternalDictionary named testAvName with a UUID as the key and an string as the value. + // populates with copied values from example KeyNameCache Dictionary. + + // create source dictionary + Dictionary<UUID, string> KeyNameCache = new Dictionary<UUID, string>(); + KeyNameCache.Add("8300f94a-7970-7810-cf2c-fc9aa6cdda24", "Jack Avatar"); + KeyNameCache.Add("27ba1e40-13f7-0708-3e98-5819d780bd62", "Jill Avatar"); + + // Initialize new dictionary. + public InternalDictionary<UUID, string> testAvName = new InternalDictionary<UUID, string>(KeyNameCache); + + + + + + Initializes a new instance of the Class + with the specified key/value, With its initial capacity specified. + + Initial size of dictionary + + + // initialize a new InternalDictionary named testDict with a string as the key and an int as the value, + // initially allocated room for 10 entries. + public InternalDictionary<string, int> testDict = new InternalDictionary<string, int>(10); + + + + + + Try to get entry from with specified key + + Key to use for lookup + Value returned + if specified key exists, if not found + + + // find your avatar using the Simulator.ObjectsAvatars InternalDictionary: + Avatar av; + if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av)) + Console.WriteLine("Found Avatar {0}", av.Name); + + + + + + + Finds the specified match. + + The match. + Matched value + + + // use a delegate to find a prim in the ObjectsPrimitives InternalDictionary + // with the ID 95683496 + uint findID = 95683496; + Primitive findPrim = sim.ObjectsPrimitives.Find( + delegate(Primitive prim) { return prim.ID == findID; }); + + + + + Find All items in an + return matching items. + a containing found items. + + Find All prims within 20 meters and store them in a List + + int radius = 20; + List<Primitive> prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll( + delegate(Primitive prim) { + Vector3 pos = prim.Position; + return ((prim.ParentID == 0) && (pos != Vector3.Zero) && (Vector3.Distance(pos, location) < radius)); + } + ); + + + + + Find All items in an + return matching keys. + a containing found keys. + + Find All keys which also exist in another dictionary + + List<UUID> matches = myDict.FindAll( + delegate(UUID id) { + return myOtherDict.ContainsKey(id); + } + ); + + + + + Perform an on each entry in an + to perform + + + // Iterates over the ObjectsPrimitives InternalDictionary and prints out some information. + Client.Network.CurrentSim.ObjectsPrimitives.ForEach( + delegate(Primitive prim) + { + if (prim.Text != null) + { + Console.WriteLine("NAME={0} ID = {1} TEXT = '{2}'", + prim.PropertiesFamily.Name, prim.ID, prim.Text); + } + }); + + + + + Perform an on each key of an + to perform + + + + Perform an on each KeyValuePair of an + + to perform + + + Check if Key exists in Dictionary + Key to check for + if found, otherwise + + + Check if Value exists in Dictionary + Value to check for + if found, otherwise + + + + Adds the specified key to the dictionary, dictionary locking is not performed, + + + The key + The value + + + + Removes the specified key, dictionary locking is not performed + + The key. + if successful, otherwise + + + + Indexer for the dictionary + + The key + The value + + + + + Exception class to identify inventory exceptions + + + + + Responsible for maintaining inventory structure. Inventory constructs nodes + and manages node children as is necessary to maintain a coherant hirarchy. + Other classes should not manipulate or create InventoryNodes explicitly. When + A node's parent changes (when a folder is moved, for example) simply pass + Inventory the updated InventoryFolder and it will make the appropriate changes + to its internal representation. + + + + The event subscribers, null of no subscribers + + + Raises the InventoryObjectUpdated Event + A InventoryObjectUpdatedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the InventoryObjectRemoved Event + A InventoryObjectRemovedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the InventoryObjectAdded Event + A InventoryObjectAddedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + + The root folder of this avatars inventory + + + + + The default shared library folder + + + + + The root node of the avatars inventory + + + + + The root node of the default shared library + + + + + Returns the contents of the specified folder + + A folder's UUID + The contents of the folder corresponding to folder + When folder does not exist in the inventory + + + + Updates the state of the InventoryNode and inventory data structure that + is responsible for the InventoryObject. If the item was previously not added to inventory, + it adds the item, and updates structure accordingly. If it was, it updates the + InventoryNode, changing the parent node if item.parentUUID does + not match node.Parent.Data.UUID. + + You can not set the inventory root folder using this method + + The InventoryObject to store + + + + Removes the InventoryObject and all related node data from Inventory. + + The InventoryObject to remove. + + + + Used to find out if Inventory contains the InventoryObject + specified by uuid. + + The UUID to check. + true if inventory contains uuid, false otherwise + + + + Saves the current inventory structure to a cache file + + Name of the cache file to save to + + + + Loads in inventory cache file into the inventory structure. Note only valid to call after login has been successful. + + Name of the cache file to load + The number of inventory items sucessfully reconstructed into the inventory node tree + + + + By using the bracket operator on this class, the program can get the + InventoryObject designated by the specified uuid. If the value for the corresponding + UUID is null, the call is equivelant to a call to RemoveNodeFor(this[uuid]). + If the value is non-null, it is equivelant to a call to UpdateNodeFor(value), + the uuid parameter is ignored. + + The UUID of the InventoryObject to get or set, ignored if set to non-null value. + The InventoryObject corresponding to uuid. + + + + Base Class for Inventory Items + + + + of item/folder + + + of parent folder + + + Name of item/folder + + + Item/Folder Owners + + + + Constructor, takes an itemID as a parameter + + The of the item + + + + Get object data + + + + + + + Inventory base ctor + + + + + + + Generates a number corresponding to the value of the object to support the use of a hash table, + suitable for use in hashing algorithms and data structures such as a hash table + + A Hashcode of all the combined InventoryBase fields + + + + Determine whether the specified object is equal to the current object + + InventoryBase object to compare against + true if objects are the same + + + + Determine whether the specified object is equal to the current object + + InventoryBase object to compare against + true if objects are the same + + + + Convert inventory to OSD + + OSD representation + + + + An Item in Inventory + + + + The of this item + + + The combined of this item + + + The type of item from + + + The type of item from the enum + + + The of the creator of this item + + + A Description of this item + + + The s this item is set to or owned by + + + If true, item is owned by a group + + + The price this item can be purchased for + + + The type of sale from the enum + + + Combined flags from + + + Time and date this inventory item was created, stored as + UTC (Coordinated Universal Time) + + + Used to update the AssetID in requests sent to the server + + + The of the previous owner of the item + + + + Construct a new InventoryItem object + + The of the item + + + + Construct a new InventoryItem object of a specific Type + + The type of item from + of the item + + + + Indicates inventory item is a link + + True if inventory item is a link to another inventory item + + + + + Get object data + + + + + + + Inventory item ctor + + + + + + + Generates a number corresponding to the value of the object to support the use of a hash table. + Suitable for use in hashing algorithms and data structures such as a hash table + + A Hashcode of all the combined InventoryItem fields + + + + + Compares an object + + The object to compare + true if comparison object matches + + + + + Determine whether the specified object is equal to the current object + + The object to compare against + true if objects are the same + + + + Determine whether the specified object is equal to the current object + + The object to compare against + true if objects are the same + + + + Create InventoryItem from OSD + + OSD Data that makes up InventoryItem + Inventory item created + + + + Convert InventoryItem to OSD + + OSD representation of InventoryItem + + + + + InventoryTexture Class representing a graphical image + + + + + + Construct an InventoryTexture object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryTexture object from a serialization stream + + + + + + InventorySound Class representing a playable sound + + + + + Construct an InventorySound object + + A which becomes the + objects AssetUUID + + + + Construct an InventorySound object from a serialization stream + + + + + + InventoryCallingCard Class, contains information on another avatar + + + + + Construct an InventoryCallingCard object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryCallingCard object from a serialization stream + + + + + + InventoryLandmark Class, contains details on a specific location + + + + + Construct an InventoryLandmark object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryLandmark object from a serialization stream + + + + + Landmarks use the InventoryItemFlags struct and will have a flag of 1 set if they have been visited + + + + + + InventoryObject Class contains details on a primitive or coalesced set of primitives + + + + + Construct an InventoryObject object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryObject object from a serialization stream + + + + + Gets or sets the upper byte of the Flags value + + + + + Gets or sets the object attachment point, the lower byte of the Flags value + + + + + + InventoryNotecard Class, contains details on an encoded text document + + + + + Construct an InventoryNotecard object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryNotecard object from a serialization stream + + + + + + InventoryCategory Class + + TODO: Is this even used for anything? + + + + Construct an InventoryCategory object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryCategory object from a serialization stream + + + + + + InventoryLSL Class, represents a Linden Scripting Language object + + + + + Construct an InventoryLSL object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryLSL object from a serialization stream + + + + + + InventorySnapshot Class, an image taken with the viewer + + + + + + Construct an InventorySnapshot object + + A which becomes the + objects AssetUUID + + + + Construct an InventorySnapshot object from a serialization stream + + + + + InventoryAttachment Class, contains details on an attachable object + + + + + Construct an InventoryAttachment object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryAttachment object from a serialization stream + + + + + Get the last AttachmentPoint this object was attached to + + + + + + InventoryWearable Class, details on a clothing item or body part + + + + + Construct an InventoryWearable object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryWearable object from a serialization stream + + + + + The , Skin, Shape, Skirt, Etc + + + + + + InventoryAnimation Class, A bvh encoded object which animates an avatar + + + + + Construct an InventoryAnimation object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryAnimation object from a serialization stream + + + + + + InventoryGesture Class, details on a series of animations, sounds, and actions + + + + + Construct an InventoryGesture object + + A which becomes the + objects AssetUUID + + + + Construct an InventoryGesture object from a serialization stream + + + + + + A folder contains s and has certain attributes specific + to itself + + + + The Preferred for a folder. + + + The Version of this folder + + + Number of child items this folder contains. + + + + Constructor + + UUID of the folder + + + + Returns folder name + + Return folder name as string + + + + Get Serilization data for this InventoryFolder object + + + + + + + Construct an InventoryFolder object from a serialization stream + + + + + Return int hash code + + Hash code as integer + + + + Create InventoryFolder from OSD + + OSD Data that makes up InventoryFolder + Inventory folder created + + + + Convert InventoryFolder to OSD + + OSD representation of InventoryFolder + + + Sort by name + + + Sort by date + + + Sort folders by name, regardless of whether items are + sorted by name or date + + + Place system folders at the top + + + + Possible destinations for DeRezObject request + + + + + + + Copy from in-world to agent inventory + + + Derez to TaskInventory + + + + + + Take Object + + + God force to inventory + + + Delete Object + + + Put an avatar attachment into agent inventory + + + + + + Return an object back to the owner's inventory + + + Return a deeded object back to the last owner's inventory + + + + Upper half of the Flags field for inventory items + + + + Indicates that the NextOwner permission will be set to the + most restrictive set of permissions found in the object set + (including linkset items and object inventory items) on next rez + + + Indicates that the object sale information has been + changed + + + If set, and a slam bit is set, indicates BaseMask will be overwritten on Rez + + + If set, and a slam bit is set, indicates OwnerMask will be overwritten on Rez + + + If set, and a slam bit is set, indicates GroupMask will be overwritten on Rez + + + If set, and a slam bit is set, indicates EveryoneMask will be overwritten on Rez + + + If set, and a slam bit is set, indicates NextOwnerMask will be overwritten on Rez + + + Indicates whether this object is composed of multiple + items or not + + + Indicates that the asset is only referenced by this + inventory item. If this item is deleted or updated to reference a + new assetID, the asset can be deleted + + + + Tools for dealing with agents inventory + + + + Used for converting shadow_id to asset_id + + + Maximum items allowed to give + + + + Callback for inventory item creation finishing + + Whether the request to create an inventory + item succeeded or not + Inventory item being created. If success is + false this will be null + + + + Callback for an inventory item being create from an uploaded asset + + true if inventory item creation was successful + + + + + + + + + + + + The event subscribers, null of no subscribers + + + Raises the ItemReceived Event + A ItemReceivedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the FolderUpdated Event + A FolderUpdatedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the InventoryObjectOffered Event + A InventoryObjectOfferedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + an inventory object sent by another avatar or primitive + + + The event subscribers, null of no subscribers + + + Raises the TaskItemReceived Event + A TaskItemReceivedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the FindObjectByPath Event + A FindObjectByPathEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the TaskInventoryReply Event + A TaskInventoryReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + + Reply received when uploading an inventory asset + + Has upload been successful + Error message if upload failed + Inventory asset UUID + New asset UUID + + + The event subscribers, null of no subscribers + + + Raises the SaveAssetToInventory Event + A SaveAssetToInventoryEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + + Delegate that is invoked when script upload is completed + + Has upload succeded (note, there still might be compile errors) + Upload status message + Is compilation successful + If compilation failed, list of error messages, null on compilation success + Script inventory UUID + Script's new asset UUID + + + The event subscribers, null of no subscribers + + + Raises the ScriptRunningReply Event + A ScriptRunningReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + Partial mapping of FolderTypes to folder names + + + + Get this agents Inventory data + + + + + Default constructor + + Reference to the GridClient object + + + + Fetch an inventory item from the dataserver + + The items + The item Owners + a integer representing the number of milliseconds to wait for results + An object on success, or null if no item was found + Items will also be sent to the event + + + + Request A single inventory item + + The items + The item Owners + + + + + Request inventory items + + Inventory items to request + Owners of the inventory items + + + + + Request inventory items via Capabilities + + Inventory items to request + Owners of the inventory items + + + + + + Get contents of a folder + + The of the folder to search + The of the folders owner + true to retrieve folders + true to retrieve items + sort order to return results in + a integer representing the number of milliseconds to wait for results + when false uses links and does not attempt to get the real object + A list of inventory items matching search criteria within folder + + InventoryFolder.DescendentCount will only be accurate if both folders and items are + requested + + + + Request the contents of an inventory folder + + The folder to search + The folder owners + true to return s contained in folder + true to return s contained in folder + the sort order to return items in + + + + + Request the contents of an inventory folder using HTTP capabilities + + The folder to search + The folder owners + true to return s contained in folder + true to return s contained in folder + the sort order to return items in + + + + + Returns the UUID of the folder (category) that defaults to + containing 'type'. The folder is not necessarily only for that + type + + This will return the root folder if one does not exist + + The UUID of the desired folder if found, the UUID of the RootFolder + if not found, or UUID.Zero on failure + + + + Find an object in inventory using a specific path to search + + The folder to begin the search in + The object owners + A string path to search + milliseconds to wait for a reply + Found items or if + timeout occurs or item is not found + + + + Find inventory items by path + + The folder to begin the search in + The object owners + A string path to search, folders/objects separated by a '/' + Results are sent to the event + + + + Search inventory Store object for an item or folder + + The folder to begin the search in + An array which creates a path to search + Number of levels below baseFolder to conduct searches + if True, will stop searching after first match is found + A list of inventory items found + + + + Move an inventory item or folder to a new location + + The item or folder to move + The to move item or folder to + + + + Move an inventory item or folder to a new location and change its name + + The item or folder to move + The to move item or folder to + The name to change the item or folder to + + + + Move and rename a folder + + The source folders + The destination folders + The name to change the folder to + + + + Update folder properties + + of the folder to update + Sets folder's parent to + Folder name + Folder type + + + + Move a folder + + The source folders + The destination folders + + + + Move multiple folders, the keys in the Dictionary parameter, + to a new parents, the value of that folder's key. + + A Dictionary containing the + of the source as the key, and the + of the destination as the value + + + + Move an inventory item to a new folder + + The of the source item to move + The of the destination folder + + + + Move and rename an inventory item + + The of the source item to move + The of the destination folder + The name to change the folder to + + + + Move multiple inventory items to new locations + + A Dictionary containing the + of the source item as the key, and the + of the destination folder as the value + + + + Remove descendants of a folder + + The of the folder + + + + Remove a single item from inventory + + The of the inventory item to remove + + + + Remove a folder from inventory + + The of the folder to remove + + + + Remove multiple items or folders from inventory + + A List containing the s of items to remove + A List containing the s of the folders to remove + + + + Empty the Lost and Found folder + + + + + Empty the Trash folder + + + + + + + + + + + Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here. + + + + + + + + + + + + + Proper use is to upload the inventory's asset first, then provide the Asset's TransactionID here. + + + + + + + + Creates a new inventory folder + + ID of the folder to put this folder in + Name of the folder to create + The UUID of the newly created folder + + + + Creates a new inventory folder + + ID of the folder to put this folder in + Name of the folder to create + Sets this folder as the default folder + for new assets of the specified type. Use FolderType.None + to create a normal folder, otherwise it will likely create a + duplicate of an existing folder type + The UUID of the newly created folder + If you specify a preferred type of AsseType.Folder + it will create a new root folder which may likely cause all sorts + of strange problems + + + + Create an inventory item and upload asset data + + Asset data + Inventory item name + Inventory item description + Asset type + Inventory type + Put newly created inventory in this folder + Delegate that will receive feedback on success or failure + + + + Create an inventory item and upload asset data + + Asset data + Inventory item name + Inventory item description + Asset type + Inventory type + Put newly created inventory in this folder + Permission of the newly created item + (EveryoneMask, GroupMask, and NextOwnerMask of Permissions struct are supported) + Delegate that will receive feedback on success or failure + + + + Creates inventory link to another inventory item or folder + + Put newly created link in folder with this UUID + Inventory item or folder + Method to call upon creation of the link + + + + Creates inventory link to another inventory item + + Put newly created link in folder with this UUID + Original inventory item + Method to call upon creation of the link + + + + Creates inventory link to another inventory folder + + Put newly created link in folder with this UUID + Original inventory folder + Method to call upon creation of the link + + + + Creates inventory link to another inventory item or folder + + Put newly created link in folder with this UUID + Original item's UUID + Name + Description + Asset Type + Inventory Type + Transaction UUID + Method to call upon creation of the link + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Request a copy of an asset embedded within a notecard + + Usually UUID.Zero for copying an asset from a notecard + UUID of the notecard to request an asset from + Target folder for asset to go to in your inventory + UUID of the embedded asset + callback to run when item is copied to inventory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Save changes to notecard embedded in object contents + + Encoded notecard asset data + Notecard UUID + Object's UUID + Called upon finish of the upload with status information + + + + Upload new gesture asset for an inventory gesture item + + Encoded gesture asset + Gesture inventory UUID + Callback whick will be called when upload is complete + + + + Update an existing script in an agents Inventory + + A byte[] array containing the encoded scripts contents + the itemID of the script + if true, sets the script content to run on the mono interpreter + + + + + Update an existing script in an task Inventory + + A byte[] array containing the encoded scripts contents + the itemID of the script + UUID of the prim containting the script + if true, sets the script content to run on the mono interpreter + if true, sets the script to running + + + + + Rez an object from inventory + + Simulator to place object in + Rotation of the object when rezzed + Vector of where to place object + InventoryItem object containing item details + + + + Rez an object from inventory + + Simulator to place object in + Rotation of the object when rezzed + Vector of where to place object + InventoryItem object containing item details + UUID of group to own the object + + + + Rez an object from inventory + + Simulator to place object in + Rotation of the object when rezzed + Vector of where to place object + InventoryItem object containing item details + UUID of group to own the object + User defined queryID to correlate replies + If set to true, the CreateSelected flag + will be set on the rezzed object + + + + Rez an object from inventory + + Simulator to place object in + TaskID object when rezzed + Rotation of the object when rezzed + Vector of where to place object + InventoryItem object containing item details + UUID of group to own the object + User defined queryID to correlate replies + If set to true, the CreateSelected flag + will be set on the rezzed object + + + + DeRez an object from the simulator to the agents Objects folder in the agents Inventory + + The simulator Local ID of the object + If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed + + + + DeRez an object from the simulator and return to inventory + + The simulator Local ID of the object + The type of destination from the enum + The destination inventory folders -or- + if DeRezzing object to a tasks Inventory, the Tasks + The transaction ID for this request which + can be used to correlate this request with other packets + If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed + + + + Rez an item from inventory to its previous simulator location + + + + + + + + + Give an inventory item to another avatar + + The of the item to give + The name of the item + The type of the item from the enum + The of the recipient + true to generate a beameffect during transfer + + + + Recurse inventory category and return folders and items. Does NOT contain parent folder being searched + + Inventory category to recursively search + Owner of folder + reference to list of categories + reference to list of items + + + + Give an inventory Folder with contents to another avatar + + The of the Folder to give + The name of the folder + The of the recipient + true to generate a beameffect during transfer + + + + Copy or move an from agent inventory to a task (primitive) inventory + + The target object + The item to copy or move from inventory + + For items with copy permissions a copy of the item is placed in the tasks inventory, + for no-copy items the object is moved to the tasks inventory + + + + Retrieve a listing of the items contained in a task (Primitive) + + The tasks + The tasks simulator local ID + milliseconds to wait for reply from simulator + A list containing the inventory items inside the task or null + if a timeout occurs + This request blocks until the response from the simulator arrives + or timeoutMS is exceeded + + + + Request the contents of a tasks (primitives) inventory from the + current simulator + + The LocalID of the object + + + + + Request the contents of a tasks (primitives) inventory + + The simulator Local ID of the object + A reference to the simulator object that contains the object + + + + + Move an item from a tasks (Primitive) inventory to the specified folder in the avatars inventory + + LocalID of the object in the simulator + UUID of the task item to move + The ID of the destination folder in this agents inventory + Simulator Object + Raises the event + + + + Remove an item from an objects (Prim) Inventory + + LocalID of the object in the simulator + UUID of the task item to remove + Simulator Object + You can confirm the removal by comparing the tasks inventory serial before and after the + request with the request combined with + the event + + + + Copy an InventoryScript item from the Agents Inventory into a primitives task inventory + + An unsigned integer representing a primitive being simulated + An which represents a script object from the agents inventory + true to set the scripts running state to enabled + A Unique Transaction ID + + The following example shows the basic steps necessary to copy a script from the agents inventory into a tasks inventory + and assumes the script exists in the agents inventory. + + uint primID = 95899503; // Fake prim ID + UUID scriptID = UUID.Parse("92a7fe8a-e949-dd39-a8d8-1681d8673232"); // Fake Script UUID in Inventory + + Client.Inventory.FolderContents(Client.Inventory.FindFolderForType(AssetType.LSLText), Client.Self.AgentID, + false, true, InventorySortOrder.ByName, 10000); + + Client.Inventory.RezScript(primID, (InventoryItem)Client.Inventory.Store[scriptID]); + + + + + + Request the running status of a script contained in a task (primitive) inventory + + The ID of the primitive containing the script + The ID of the script + The event can be used to obtain the results of the + request + + + + + Send a request to set the running state of a script contained in a task (primitive) inventory + + The ID of the primitive containing the script + The ID of the script + true to set the script running, false to stop a running script + To verify the change you can use the method combined + with the event + + + + Create a CRC from an InventoryItem + + The source InventoryItem + A uint representing the source InventoryItem as a CRC + + + + Reverses a cheesy XORing with a fixed UUID to convert a shadow_id to an asset_id + + Obfuscated shadow_id value + Deobfuscated asset_id value + + + + Does a cheesy XORing with a fixed UUID to convert an asset_id to a shadow_id + + asset_id value to obfuscate + Obfuscated shadow_id value + + + + Wrapper for creating a new object + + The type of item from the enum + The of the newly created object + An object with the type and id passed + + + + Parse the results of a RequestTaskInventory() response + + A string which contains the data from the task reply + A List containing the items contained within the tasks inventory + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + UpdateCreateInventoryItem packets are received when a new inventory item + is created. This may occur when an object that's rezzed in world is + taken into inventory, when an item is created using the CreateInventoryItem + packet, or when an object is purchased + + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Set to true to accept offer, false to decline it + + + The folder to accept the inventory into, if null default folder for will be used + + + + Callback when an inventory object is accepted and received from a + task inventory. This is the callback in which you actually get + the ItemID, as in ObjectOfferedCallback it is null when received + from a task. + + + + + + + User data + + + + + + + + + + + + + For inventory folder nodes specifies weather the folder needs to be + refreshed from the server + + + + + + + + De-serialization constructor for the InventoryNode Class + + + + + Serialization handler for the InventoryNode Class + + + + + De-serialization handler for the InventoryNode Class + + + + + Singleton logging class for the entire library + + + + + Callback used for client apps to receive log messages from + the library + + Data being logged + The severity of the log entry from + + + Triggered whenever a message is logged. If this is left + null, log messages will go to the console + + + log4net logging engine + + + + Default constructor + + + + + Send a log message to the logging engine + + The log message + The severity of the log entry + + + + Send a log message to the logging engine + + The log message + The severity of the log entry + Instance of the client + + + + Send a log message to the logging engine + + The log message + The severity of the log entry + Exception that was raised + + + + Send a log message to the logging engine + + The log message + The severity of the log entry + Instance of the client + Exception that was raised + + + + If the library is compiled with DEBUG defined, an event will be + fired if an OnLogMessage handler is registered and the + message will be sent to the logging engine + + The message to log at the DEBUG level to the + current logging engine + + + + If the library is compiled with DEBUG defined and + GridClient.Settings.DEBUG is true, an event will be + fired if an OnLogMessage handler is registered and the + message will be sent to the logging engine + + The message to log at the DEBUG level to the + current logging engine + Instance of the client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Status of the last application run. + Used for error reporting to the grid login service for statistical purposes. + + + + Application exited normally + + + Application froze + + + Application detected error and exited abnormally + + + Other crash + + + Application froze during logout + + + Application crashed during logout + + + + Login Request Parameters + + + + The URL of the Login Server + + + The number of milliseconds to wait before a login is considered + failed due to timeout + + + The request method + login_to_simulator is currently the only supported method + + + The Agents First name + + + The Agents Last name + + + A md5 hashed password + plaintext password will be automatically hashed + + + The agents starting location home or last + Please use LoginLocation for custom region and Location + + + A string containing the client software channel information + Second Life Release + + + The client software version information + The official viewer uses: Second Life Release n.n.n.n + where n is replaced with the current version of the viewer + + + A string containing the platform information the agent is running on + + + A string containing version number for OS the agent is running on + + + A string hash of the network cards Mac Address + + + Unknown or deprecated + + + A string hash of the first disk drives ID used to identify this clients uniqueness + + + A string containing the viewers Software, this is not directly sent to the login server but + instead is used to generate the Version string + + + A string representing the software creator. This is not directly sent to the login server but + is used by the library to generate the Version information + + + If true, this agent agrees to the Terms of Service of the grid its connecting to + + + Unknown + + + Status of the last application run sent to the grid login server for statistical purposes + + + An array of string sent to the login server to enable various options + + + A randomly generated ID to distinguish between login attempts. This value is only used + internally in the library and is never sent over the wire + + + LoginLocation used to set the starting region and location (overrides Start) example: "Tentacles/128/64/109" + Leave empty to use the starting location + + + + Default constructor, initializes sane default values + + + + + Instantiates new LoginParams object and fills in the values + + Instance of GridClient to read settings from + Login first name + Login last name + Password + Login channel (application name) + Client version, should be application name + version number + + + + Instantiates new LoginParams object and fills in the values + + Instance of GridClient to read settings from + Login first name + Login last name + Password + Login channnel (application name) + Client version, should be application name + version number + URI of the login server + + + + The decoded data returned from the login server after a successful login + + + + true, false, indeterminate + + + Login message of the day + + + M or PG, also agent_region_access and agent_access_max + + + + Parse LLSD Login Reply Data + + An + containing the login response data + XML-RPC logins do not require this as XML-RPC.NET + automatically populates the struct properly using attributes + + + + Login Routines + + + NetworkManager is responsible for managing the network layer of + OpenMetaverse. It tracks all the server connections, serializes + outgoing traffic and deserializes incoming traffic, and provides + instances of delegates for network-related events. + + + + The event subscribers, null of no subscribers + + + Raises the LoginProgress Event + A LoginProgressEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + + + + + + + + + + + Called when a reply is received from the login server, the + login sequence will block until this event returns + + + Seed CAPS URL returned from the login server + + + Current state of logging in + + + Upon login failure, contains a short string key for the + type of login error that occurred + + + The raw XML-RPC reply from the login server, exactly as it + was received (minus the HTTP header) + + + During login this contains a descriptive version of + LoginStatusCode. After a successful login this will contain the + message of the day, and after a failed login a descriptive error + message will be returned + + + Maximum number of groups an agent can belong to, -1 for unlimited + + + Server side baking service URL + + + Parsed login response data + + + A list of packets obtained during the login process which + networkmanager will log but not process + + + + Generate sane default values for a login request + + Account first name + Account last name + Account password + Client application name (channel) + Client application name + version + A populated struct containing + sane defaults + + + + Simplified login that takes the most common and required fields + + Account first name + Account last name + Account password + Client application name (channel) + Client application name + version + Whether the login was successful or not. On failure the + LoginErrorKey string will contain the error code and LoginMessage + will contain a description of the error + + + + Simplified login that takes the most common fields along with a + starting location URI, and can accept an MD5 string instead of a + plaintext password + + Account first name + Account last name + Account password or MD5 hash of the password + such as $1$1682a1e45e9f957dcdf0bb56eb43319c + Client application name (channel) + Starting location URI that can be built with + StartLocation() + Client application name + version + Whether the login was successful or not. On failure the + LoginErrorKey string will contain the error code and LoginMessage + will contain a description of the error + + + + Login that takes a struct of all the values that will be passed to + the login server + + The values that will be passed to the login + server, all fields must be set even if they are String.Empty + Whether the login was successful or not. On failure the + LoginErrorKey string will contain the error code and LoginMessage + will contain a description of the error + + + + Build a start location URI for passing to the Login function + + Name of the simulator to start in + X coordinate to start at + Y coordinate to start at + Z coordinate to start at + String with a URI that can be used to login to a specified + location + + + + LoginParams and the initial login XmlRpcRequest were made on a remote machine. + This method now initializes libomv with the results. + + + + + Handles response from XML-RPC login replies + + + + + Handles response from XML-RPC login replies with already parsed LoginResponseData + + + + + Handle response from LLSD login replies + + + + + + + + Get current OS + + Either "Win" or "Linux" + + + + Gets the current OS version number + + The platform version. + + + + Get clients default Mac Address + + A string containing the first found Mac Address + + + + MD5 hash of string + + String to hash + Hashed string + + + + Explains why a simulator or the grid disconnected from us + + + + The client requested the logout or simulator disconnect + + + The server notified us that it is disconnecting + + + Either a socket was closed or network traffic timed out + + + The last active simulator shut down + + + + Holds a simulator reference and a decoded packet, these structs are put in + the packet inbox for event handling + + + + Reference to the simulator that this packet came from + + + Packet that needs to be processed + + + + Holds a simulator reference and a serialized packet, these structs are put in + the packet outbox for sending + + + + Reference to the simulator this packet is destined for + + + Packet that needs to be sent + + + Sequence number of the wrapped packet + + + Number of times this packet has been resent + + + Environment.TickCount when this packet was last sent over the wire + + + Type of the packet + + + The event subscribers, null of no subscribers + + + Raises the PacketSent Event + A PacketSentEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the LoggedOut Event + A LoggedOutEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the SimConnecting Event + A SimConnectingEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the SimConnected Event + A SimConnectedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the SimDisconnected Event + A SimDisconnectedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the Disconnected Event + A DisconnectedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the SimChanged Event + A SimChangedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the EventQueueRunning Event + A EventQueueRunningEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + Unique identifier associated with our connections to + simulators + + + The simulator that the logged in avatar is currently + occupying + + + Shows whether the network layer is logged in to the + grid or not + + + Number of packets in the incoming queue + + + Number of packets in the outgoing queue + + + All of the simulators we are currently connected to + + + Handlers for incoming capability events + + + Handlers for incoming packets + + + Incoming packets that are awaiting handling + + + Outgoing packets that are awaiting handling + + + + Default constructor + + Reference to the GridClient object + + + + Register an event handler for a packet. This is a low level event + interface and should only be used if you are doing something not + supported in the library + + Packet type to trigger events for + Callback to fire when a packet of this type + is received + + + + Register an event handler for a packet. This is a low level event + interface and should only be used if you are doing something not + supported in the library + + Packet type to trigger events for + Callback to fire when a packet of this type + is received + True if the callback should be ran + asynchronously. Only set this to false (synchronous for callbacks + that will always complete quickly) + If any callback for a packet type is marked as + asynchronous, all callbacks for that packet type will be fired + asynchronously + + + + Unregister an event handler for a packet. This is a low level event + interface and should only be used if you are doing something not + supported in the library + + Packet type this callback is registered with + Callback to stop firing events for + + + + Register a CAPS event handler. This is a low level event interface + and should only be used if you are doing something not supported in + the library + + Name of the CAPS event to register a handler for + Callback to fire when a CAPS event is received + + + + Unregister a CAPS event handler. This is a low level event interface + and should only be used if you are doing something not supported in + the library + + Name of the CAPS event this callback is + registered with + Callback to stop firing events for + + + + Send a packet to the simulator the avatar is currently occupying + + Packet to send + + + + Send a packet to a specified simulator + + Packet to send + Simulator to send the packet to + + + + Add a packet to the Inbox queue to process + + Incoming packet to process + + + + adds a debug message when you try to access a network item + while they are still null + + what + where + + + + Add a packet to the Inbox queue to process + + Incoming packet to process + + + + Connect to a simulator + + IP address to connect to + Port to connect to + Handle for this simulator, to identify its + location in the grid + Whether to set CurrentSim to this new + connection, use this if the avatar is moving in to this simulator + URL of the capabilities server to use for + this sim connection + A Simulator object on success, otherwise null + + + + Connect to a simulator + + IP address and port to connect to + Handle for this simulator, to identify its + location in the grid + Whether to set CurrentSim to this new + connection, use this if the avatar is moving in to this simulator + URL of the capabilities server to use for + this sim connection + A Simulator object on success, otherwise null + + + + Begins the non-blocking logout. Makes sure that the LoggedOut event is + called even if the server does not send a logout reply, and Shutdown() + is properly called. + + + + + Initiate a blocking logout request. This will return when the logout + handshake has completed or when Settings.LOGOUT_TIMEOUT + has expired and the network layer is manually shut down + + + + + Initiate the logout process. The Shutdown() function + needs to be manually called. + + + + + Close a connection to the given simulator + + + + + + + Shutdown will disconnect all the sims except for the current sim + first, and then kill the connection to CurrentSim. This should only + be called if the logout process times out on RequestLogout + + Type of shutdown + + + + Shutdown will disconnect all the sims except for the current sim + first, and then kill the connection to CurrentSim. This should only + be called if the logout process times out on RequestLogout + + Type of shutdown + Shutdown message + + + + Searches through the list of currently connected simulators to find + one attached to the given IPEndPoint + + IPEndPoint of the Simulator to search for + A Simulator reference on success, otherwise null + + + + Fire an event when an event queue connects for capabilities + + Simulator the event queue is attached to + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Sent to the client to indicate a teleport request has completed + + + + The of the agent + + + + + + The simulators handle the agent teleported to + + + A Uri which contains a list of Capabilities the simulator supports + + + Indicates the level of access required + to access the simulator, or the content rating, or the simulators + map status + + + The IP Address of the simulator + + + The UDP Port the simulator will listen for UDP traffic on + + + Status flags indicating the state of the Agent upon arrival, Flying, etc. + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Sent to the viewer when a neighboring simulator is requesting the agent make a connection to it. + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent to the client which indicates a teleport request has failed + and contains some information on why it failed + + + + + + + A string key of the reason the teleport failed e.g. CouldntTPCloser + Which could be used to look up a value in a dictionary or enum + + + The of the Agent + + + A string human readable message containing the reason + An example: Could not teleport closer to destination + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Contains a list of prim owner information for a specific parcel in a simulator + + + A Simulator will always return at least 1 entry + If agent does not have proper permission the OwnerID will be UUID.Zero + If agent does not have proper permission OR there are no primitives on parcel + the DataBlocksExtended map will not be sent from the simulator + + + + + Prim ownership information for a specified owner on a single parcel + + + + The of the prim owner, + UUID.Zero if agent has no permission to view prim owner information + + + The total number of prims + + + True if the OwnerID is a + + + True if the owner is online + This is no longer used by the LL Simulators + + + The date the most recent prim was rezzed + + + An Array of objects + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + The details of a single parcel in a region, also contains some regionwide globals + + + + Simulator-local ID of this parcel + + + Maximum corner of the axis-aligned bounding box for this + parcel + + + Minimum corner of the axis-aligned bounding box for this + parcel + + + Total parcel land area + + + + + + Key of authorized buyer + + + Bitmap describing land layout in 4x4m squares across the + entire region + + + + + + Date land was claimed + + + Appears to always be zero + + + Parcel Description + + + + + + + + + Total number of primitives owned by the parcel group on + this parcel + + + Whether the land is deeded to a group or not + + + + + + Maximum number of primitives this parcel supports + + + The Asset UUID of the Texture which when applied to a + primitive will display the media + + + A URL which points to any Quicktime supported media type + + + A byte, if 0x1 viewer should auto scale media to fit object + + + URL For Music Stream + + + Parcel Name + + + Autoreturn value in minutes for others' objects + + + + + + Total number of other primitives on this parcel + + + UUID of the owner of this parcel + + + Total number of primitives owned by the parcel owner on + this parcel + + + + + + How long is pass valid for + + + Price for a temporary pass + + + + + + Disallows people outside the parcel from being able to see in + + + + + + + + + + + + True if the region denies access to age unverified users + + + + + + This field is no longer used + + + The result of a request for parcel properties + + + Sale price of the parcel, only useful if ForSale is set + The SalePrice will remain the same after an ownership + transfer (sale), so it can be used to see the purchase price after + a sale if the new owner has not changed it + + + + Number of primitives your avatar is currently + selecting and sitting on in this parcel + + + + + + + + A number which increments by 1, starting at 0 for each ParcelProperties request. + Can be overriden by specifying the sequenceID with the ParcelPropertiesRequest being sent. + a Negative number indicates the action in has occurred. + + + + Maximum primitives across the entire simulator + + + Total primitives across the entire simulator + + + + + + Key of parcel snapshot + + + Parcel ownership status + + + Total number of primitives on this parcel + + + + + + + + + A description of the media + + + An Integer which represents the height of the media + + + An integer which represents the width of the media + + + A boolean, if true the viewer should loop the media + + + A string which contains the mime type of the media + + + true to obscure (hide) media url + + + true to obscure (hide) music url + + + true if avatars in this parcel should be invisible to people outside + + + true if avatars outside can hear any sounds avatars inside play + + + true if group members outside can hear any sounds avatars inside play + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + A message sent from the viewer to the simulator to updated a specific parcels settings + + + The of the agent authorized to purchase this + parcel of land or a NULL if the sale is authorized to anyone + + + true to enable auto scaling of the parcel media + + + The category of this parcel used when search is enabled to restrict + search results + + + A string containing the description to set + + + The of the which allows for additional + powers and restrictions. + + + The which specifies how avatars which teleport + to this parcel are handled + + + The LocalID of the parcel to update settings on + + + A string containing the description of the media which can be played + to visitors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true if avatars in this parcel should be invisible to people outside + + + true if avatars outside can hear any sounds avatars inside play + + + true if group members outside can hear any sounds avatars inside play + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + Base class used for the RemoteParcelRequest message + + + + A message sent from the viewer to the simulator to request information + on a remote parcel + + + + Local sim position of the parcel we are looking up + + + Region handle of the parcel we are looking up + + + Region of the parcel we are looking up + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator to the viewer in response to a + which will contain parcel information + + + + The grid-wide unique parcel ID + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message containing a request for a remote parcel from a viewer, or a response + from the simulator to that request + + + + The request or response details block + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator to an agent which contains + the groups the agent is in + + + + The Agent receiving the message + + + Group Details specific to the agent + + + true of the agent accepts group notices + + + The agents tier contribution to the group + + + The Groups + + + The of the groups insignia + + + The name of the group + + + The aggregate permissions the agent has in the group for all roles the agent + is assigned + + + An optional block containing additional agent specific information + + + true of the agent allows this group to be + listed in their profile + + + An array containing information + for each the agent is a member of + + + An array containing information + for each the agent is a member of + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the viewer to the simulator which + specifies the language and permissions for others to detect + the language specified + + + + A string containng the default language + to use for the agent + + + true of others are allowed to + know the language setting + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + An EventQueue message sent from the simulator to an agent when the agent + leaves a group + + + + An object containing the Agents UUID, and the Groups UUID + + + The ID of the Agent leaving the group + + + The GroupID the Agent is leaving + + + + An Array containing the AgentID and GroupID + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Base class for Asset uploads/results via Capabilities + + + + The request state + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the viewer to the simulator to request a temporary upload capability + which allows an asset to be uploaded + + + + The Capability URL sent by the simulator to upload the baked texture to + + + + A message sent from the simulator that will inform the agent the upload is complete, + and the UUID of the uploaded asset + + + + The uploaded texture asset ID + + + + A message sent from the viewer to the simulator to request a temporary + capability URI which is used to upload an agents baked appearance textures + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator which indicates the minimum version required for + using voice chat + + + + Major Version Required + + + Minor version required + + + The name of the region sending the version requrements + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator to the viewer containing the + voice server URI + + + + The Parcel ID which the voice server URI applies + + + The name of the region + + + A uri containing the server/channel information + which the viewer can utilize to participate in voice conversations + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + + + + + + + + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent by the viewer to the simulator to request a temporary + capability for a script contained with in a Tasks inventory to be updated + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator to the viewer to indicate + a Tasks scripts status. + + + + The Asset ID of the script + + + True of the script is compiled/ran using the mono interpreter, false indicates it + uses the older less efficient lsl2 interprter + + + The Task containing the scripts + + + true of the script is in a running state + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message containing the request/response used for updating a gesture + contained with an agents inventory + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message request/response which is used to update a notecard contained within + a tasks inventory + + + + The of the Task containing the notecard asset to update + + + The notecard assets contained in the tasks inventory + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A reusable class containing a message sent from the viewer to the simulator to request a temporary uploader capability + which is used to update an asset in an agents inventory + + + + + The Notecard AssetID to replace + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message containing the request/response used for updating a notecard + contained with an agents inventory + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the simulator to the viewer which indicates + an error occurred while attempting to update a script in an agents or tasks + inventory + + + + true of the script was successfully compiled by the simulator + + + A string containing the error which occured while trying + to update the script + + + A new AssetID assigned to the script + + + + A message sent from the viewer to the simulator + requesting the update of an existing script contained + within a tasks inventory + + + + if true, set the script mode to running + + + The scripts InventoryItem ItemID to update + + + A lowercase string containing either "mono" or "lsl2" which + specifies the script is compiled and ran on the mono runtime, or the older + lsl runtime + + + The tasks which contains the script to update + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message containing either the request or response used in updating a script inside + a tasks inventory + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Response from the simulator to notify the viewer the upload is completed, and + the UUID of the script asset and its compiled status + + + + The uploaded texture asset ID + + + true of the script was compiled successfully + + + + A message sent from a viewer to the simulator requesting a temporary uploader capability + used to update a script contained in an agents inventory + + + + The existing asset if of the script in the agents inventory to replace + + + The language of the script + Defaults to lsl version 2, "mono" might be another possible option + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message containing either the request or response used in updating a script inside + an agents inventory + + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Base class for Map Layers via Capabilities + + + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Sent by an agent to the capabilities server to request map layers + + + + + A message sent from the simulator to the viewer which contains an array of map images and their grid coordinates + + + + + An object containing map location details + + + + The Asset ID of the regions tile overlay + + + The grid location of the southern border of the map tile + + + The grid location of the western border of the map tile + + + The grid location of the eastern border of the map tile + + + The grid location of the northern border of the map tile + + + An array containing LayerData items + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Object containing request or response + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + New as of 1.23 RC1, no details yet. + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + A string containing the method used + + + + A request sent from an agent to the Simulator to begin a new conference. + Contains a list of Agents which will be included in the conference + + + + An array containing the of the agents invited to this conference + + + The conferences Session ID + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A moderation request sent from a conference moderator + Contains an agent and an optional action to take + + + + The Session ID + + + + + + A list containing Key/Value pairs, known valid values: + key: text value: true/false - allow/disallow specified agents ability to use text in session + key: voice value: true/false - allow/disallow specified agents ability to use voice in session + + "text" or "voice" + + + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + A message sent from the agent to the simulator which tells the + simulator we've accepted a conference invitation + + + + The conference SessionID + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Key of sender + + + Name of sender + + + Key of destination avatar + + + ID of originating estate + + + Key of originating region + + + Coordinates in originating region + + + Instant message type + + + Group IM session toggle + + + Key of IM session, for Group Messages, the groups UUID + + + Timestamp of the instant message + + + Instant message text + + + Whether this message is held for offline avatars + + + Context specific packed data + + + Is this invitation for voice group/conference chat + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Sent from the simulator to the viewer. + + When an agent initially joins a session the AgentUpdatesBlock object will contain a list of session members including + a boolean indicating they can use voice chat in this session, a boolean indicating they are allowed to moderate + this session, and lastly a string which indicates another agent is entering the session with the Transition set to "ENTER" + + During the session lifetime updates on individuals are sent. During the update the booleans sent during the initial join are + excluded with the exception of the Transition field. This indicates a new user entering or exiting the session with + the string "ENTER" or "LEAVE" respectively. + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + An EventQueue message sent when the agent is forcibly removed from a chatterbox session + + + + + A string containing the reason the agent was removed + + + + + The ChatterBoxSession's SessionID + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + + Event Queue message describing physics engine attributes of a list of objects + Sim sends these when object is selected + + + + Array with the list of physics properties + + + + Serializes the message + + Serialized OSD + + + + Deserializes the message + + Incoming data to deserialize + + + + Deserializes the message + + Incoming data to deserialize + + + + Serializes the message + + Serialized OSD + + + Object IDs for which to request cost information + + + + Deserializes the message + + Incoming data to deserialize + + + + Serializes the message + + Serialized OSD + + + + Deserializes the message + + Incoming data to deserialize + + + + Serializes the message + + Serialized OSD + + + + Detects which class handles deserialization of this message + + An containing the data + Object capable of decoding this message + + + + A message sent from the viewer to the simulator which + specifies that the user has changed current URL + of the specific media on a prim face + + + + + New URL + + + + + Prim UUID where navigation occured + + + + + Face index + + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Base class used for the ObjectMedia message + + + + Message used to retrive prim media data + + + + + Prim UUID + + + + + Requested operation, either GET or UPDATE + + + + + Serialize object + + Serialized object as OSDMap + + + + Deserialize the message + + An containing the data + + + + Message used to update prim media data + + + + + Prim UUID + + + + + Array of media entries indexed by face number + + + + + Media version string + + + + + Serialize object + + Serialized object as OSDMap + + + + Deserialize the message + + An containing the data + + + + Message used to update prim media data + + + + + Prim UUID + + + + + Array of media entries indexed by face number + + + + + Requested operation, either GET or UPDATE + + + + + Serialize object + + Serialized object as OSDMap + + + + Deserialize the message + + An containing the data + + + + Message for setting or getting per face MediaEntry + + + + The request or response details block + + + + Serialize the object + + An containing the objects data + + + + Deserialize the message + + An containing the data + + + Details about object resource usage + + + Object UUID + + + Object name + + + Indicates if object is group owned + + + Locatio of the object + + + Object owner + + + Resource usage, keys are resource names, values are resource usage for that specific resource + + + + Deserializes object from OSD + + An containing the data + + + + Makes an instance based on deserialized data + + serialized data + Instance containg deserialized data + + + Details about parcel resource usage + + + Parcel UUID + + + Parcel local ID + + + Parcel name + + + Indicates if parcel is group owned + + + Parcel owner + + + Array of containing per object resource usage + + + + Deserializes object from OSD + + An containing the data + + + + Makes an instance based on deserialized data + + serialized data + Instance containg deserialized data + + + Resource usage base class, both agent and parcel resource + usage contains summary information + + + Summary of available resources, keys are resource names, + values are resource usage for that specific resource + + + Summary resource usage, keys are resource names, + values are resource usage for that specific resource + + + + Serializes object + + serialized data + + + + Deserializes object from OSD + + An containing the data + + + Agent resource usage + + + Per attachment point object resource usage + + + + Deserializes object from OSD + + An containing the data + + + + Makes an instance based on deserialized data + + serialized data + Instance containg deserialized data + + + + Detects which class handles deserialization of this message + + An containing the data + Object capable of decoding this message + + + Request message for parcel resource usage + + + UUID of the parel to request resource usage info + + + + Serializes object + + serialized data + + + + Deserializes object from OSD + + An containing the data + + + Response message for parcel resource usage + + + URL where parcel resource usage details can be retrieved + + + URL where parcel resource usage summary can be retrieved + + + + Serializes object + + serialized data + + + + Deserializes object from OSD + + An containing the data + + + + Detects which class handles deserialization of this message + + An containing the data + Object capable of decoding this message + + + Parcel resource usage + + + Array of containing per percal resource usage + + + + Deserializes object from OSD + + An containing the data + + + + Reply to request for bunch if display names + + + + Current display name + + + Following UUIDs failed to return a valid display name + + + + Serializes the message + + OSD containting the messaage + + + + Message sent when requesting change of the display name + + + + Current display name + + + Desired new display name + + + + Serializes the message + + OSD containting the messaage + + + + Message recieved in response to request to change display name + + + + New display name + + + String message indicating the result of the operation + + + Numerical code of the result, 200 indicates success + + + + Serializes the message + + OSD containting the messaage + + + + Message recieved when someone nearby changes their display name + + + + Previous display name, empty string if default + + + New display name + + + + Serializes the message + + OSD containting the messaage + + + + Return a decoded capabilities message as a strongly typed object + + A string containing the name of the capabilities message key + An to decode + A strongly typed object containing the decoded information from the capabilities message, or null + if no existing Message object exists for the specified event + + + + A Name Value pair with additional settings, used in the protocol + primarily to transmit avatar names and active group in object packets + + + + Type of the value + + + Unknown + + + String value + + + + + + + + + + + + + + + Deprecated + + + String value, but designated as an asset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Constructor that takes all the fields as parameters + + + + + + + + + + Constructor that takes a single line from a NameValue field + + + + + + + + + + No report + + + Unknown report type + + + Bug report + + + Complaint report + + + Customer service report + + + + Bitflag field for ObjectUpdateCompressed data blocks, describing + which options are present for each object + + + + Unknown + + + Whether the object has a TreeSpecies + + + Whether the object has floating text ala llSetText + + + Whether the object has an active particle system + + + Whether the object has sound attached to it + + + Whether the object is attached to a root object or not + + + Whether the object has texture animation settings + + + Whether the object has an angular velocity + + + Whether the object has a name value pairs string + + + Whether the object has a Media URL set + + + Whether the object has, you guessed it, new particles + + + + Specific Flags for MultipleObjectUpdate requests + + + + None + + + Change position of prims + + + Change rotation of prims + + + Change size of prims + + + Perform operation on link set + + + Scale prims uniformly, same as selecing ctrl+shift in the + viewer. Used in conjunction with Scale + + + + Special values in PayPriceReply. If the price is not one of these + literal value of the price should be use + + + + + Indicates that this pay option should be hidden + + + + + Indicates that this pay option should have the default value + + + + + Contains the variables sent in an object update packet for objects. + Used to track position and movement of prims and avatars + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Handles all network traffic related to prims and avatar positions and + movement. + + + + The event subscribers, null of no subscribers + + + Thread sync lock object + + + Raised when the simulator sends us data containing + A , Foliage or Attachment + + + + + The event subscribers, null of no subscribers + + + Raises the ObjectProperties Event + A ObjectPropertiesEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + additional information + + + + + The event subscribers, null of no subscribers + + + Raises the ObjectPropertiesUpdated Event + A ObjectPropertiesUpdatedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + Primitive.ObjectProperties for an object we are currently tracking + + + The event subscribers, null of no subscribers + + + Raises the ObjectPropertiesFamily Event + A ObjectPropertiesFamilyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + additional and details + + + + The event subscribers, null of no subscribers + + + Raises the AvatarUpdate Event + A AvatarUpdateEventArgs object containing + the data sent from the simulator + + + + Raises the ParticleUpdate Event + + A ParticleUpdateEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + updated information for an + + + The event subscribers, null of no subscribers + + + Thread sync lock object + + + Raised when the simulator sends us data containing + and movement changes + + + The event subscribers, null of no subscribers + + + Raises the ObjectDataBlockUpdate Event + A ObjectDataBlockUpdateEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + updates to an Objects DataBlock + + + The event subscribers, null of no subscribers + + + Raises the KillObject Event + A KillObjectEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator informs us an + or is no longer within view + + + The event subscribers, null of no subscribers + + + Raises the KillObjects Event + A KillObjectsEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator informs us when a group of + or is no longer within view + + + The event subscribers, null of no subscribers + + + Raises the AvatarSitChanged Event + A AvatarSitChangedEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + updated sit information for our + + + The event subscribers, null of no subscribers + + + Raises the PayPriceReply Event + A PayPriceReplyEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + purchase price information for a + + + + Callback for getting object media data via CAP + + Indicates if the operation was succesfull + Object media version string + Array indexed on prim face of media entry data + + + The event subscribers, null of no subscribers + + + Raises the PhysicsProperties Event + A PhysicsPropertiesEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + additional information + + + + + Reference to the GridClient object + + + Does periodic dead reckoning calculation to convert + velocity and acceleration to new positions for objects + + + + Construct a new instance of the ObjectManager class + + A reference to the instance + + + + Request information for a single object from a + you are currently connected to + + The the object is located + The Local ID of the object + + + + Request information for multiple objects contained in + the same simulator + + The the objects are located + An array containing the Local IDs of the objects + + + + Attempt to purchase an original object, a copy, or the contents of + an object + + The the object is located + The Local ID of the object + Whether the original, a copy, or the object + contents are on sale. This is used for verification, if the this + sale type is not valid for the object the purchase will fail + Price of the object. This is used for + verification, if it does not match the actual price the purchase + will fail + Group ID that will be associated with the new + purchase + Inventory folder UUID where the object or objects + purchased should be placed + + + BuyObject(Client.Network.CurrentSim, 500, SaleType.Copy, + 100, UUID.Zero, Client.Self.InventoryRootFolderUUID); + + + + + + Request prices that should be displayed in pay dialog. This will triggger the simulator + to send us back a PayPriceReply which can be handled by OnPayPriceReply event + + The the object is located + The ID of the object + The result is raised in the event + + + + Select a single object. This will cause the to send us + an which will raise the event + + The the object is located + The Local ID of the object + + + + + Select a single object. This will cause the to send us + an which will raise the event + + The the object is located + The Local ID of the object + if true, a call to is + made immediately following the request + + + + + Select multiple objects. This will cause the to send us + an which will raise the event + + The the objects are located + An array containing the Local IDs of the objects + Should objects be deselected immediately after selection + + + + + Select multiple objects. This will cause the to send us + an which will raise the event + + The the objects are located + An array containing the Local IDs of the objects + + + + + Update the properties of an object + + The the object is located + The Local ID of the object + true to turn the objects physical property on + true to turn the objects temporary property on + true to turn the objects phantom property on + true to turn the objects cast shadows property on + + + + Update the properties of an object + + The the object is located + The Local ID of the object + true to turn the objects physical property on + true to turn the objects temporary property on + true to turn the objects phantom property on + true to turn the objects cast shadows property on + Type of the represetnation prim will have in the physics engine + Density - normal value 1000 + Friction - normal value 0.6 + Restitution - standard value 0.5 + Gravity multiplier - standar value 1.0 + + + + Sets the sale properties of a single object + + The the object is located + The Local ID of the object + One of the options from the enum + The price of the object + + + + Sets the sale properties of multiple objects + + The the objects are located + An array containing the Local IDs of the objects + One of the options from the enum + The price of the object + + + + Deselect a single object + + The the object is located + The Local ID of the object + + + + Deselect multiple objects. + + The the objects are located + An array containing the Local IDs of the objects + + + + Perform a click action on an object + + The the object is located + The Local ID of the object + + + + Perform a click action (Grab) on a single object + + The the object is located + The Local ID of the object + The texture coordinates to touch + The surface coordinates to touch + The face of the position to touch + The region coordinates of the position to touch + The surface normal of the position to touch (A normal is a vector perpindicular to the surface) + The surface binormal of the position to touch (A binormal is a vector tangen to the surface + pointing along the U direction of the tangent space + + + + Create (rez) a new prim object in a simulator + + A reference to the object to place the object in + Data describing the prim object to rez + Group ID that this prim will be set to, or UUID.Zero if you + do not want the object to be associated with a specific group + An approximation of the position at which to rez the prim + Scale vector to size this prim + Rotation quaternion to rotate this prim + Due to the way client prim rezzing is done on the server, + the requested position for an object is only close to where the prim + actually ends up. If you desire exact placement you'll need to + follow up by moving the object after it has been created. This + function will not set textures, light and flexible data, or other + extended primitive properties + + + + Create (rez) a new prim object in a simulator + + A reference to the object to place the object in + Data describing the prim object to rez + Group ID that this prim will be set to, or UUID.Zero if you + do not want the object to be associated with a specific group + An approximation of the position at which to rez the prim + Scale vector to size this prim + Rotation quaternion to rotate this prim + Specify the + Due to the way client prim rezzing is done on the server, + the requested position for an object is only close to where the prim + actually ends up. If you desire exact placement you'll need to + follow up by moving the object after it has been created. This + function will not set textures, light and flexible data, or other + extended primitive properties + + + + Rez a Linden tree + + A reference to the object where the object resides + The size of the tree + The rotation of the tree + The position of the tree + The Type of tree + The of the group to set the tree to, + or UUID.Zero if no group is to be set + true to use the "new" Linden trees, false to use the old + + + + Rez grass and ground cover + + A reference to the object where the object resides + The size of the grass + The rotation of the grass + The position of the grass + The type of grass from the enum + The of the group to set the tree to, + or UUID.Zero if no group is to be set + + + + Set the textures to apply to the faces of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The texture data to apply + + + + Set the textures to apply to the faces of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The texture data to apply + A media URL (not used) + + + + Set the Light data on an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + A object containing the data to set + + + + Set the flexible data on an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + A object containing the data to set + + + + Set the sculptie texture and data on an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + A object containing the data to set + + + + Unset additional primitive parameters on an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The extra parameters to set + + + + Link multiple prims into a linkset + + A reference to the object where the objects reside + An array which contains the IDs of the objects to link + The last object in the array will be the root object of the linkset TODO: Is this true? + + + + Delink/Unlink multiple prims from a linkset + + A reference to the object where the objects reside + An array which contains the IDs of the objects to delink + + + + Change the rotation of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new rotation of the object + + + + Set the name of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + A string containing the new name of the object + + + + Set the name of multiple objects + + A reference to the object where the objects reside + An array which contains the IDs of the objects to change the name of + An array which contains the new names of the objects + + + + Set the description of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + A string containing the new description of the object + + + + Set the descriptions of multiple objects + + A reference to the object where the objects reside + An array which contains the IDs of the objects to change the description of + An array which contains the new descriptions of the objects + + + + Attach an object to this avatar + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The point on the avatar the object will be attached + The rotation of the attached object + + + + Drop an attached object from this avatar + + A reference to the + object where the objects reside. This will always be the simulator the avatar is currently in + + The object's ID which is local to the simulator the object is in + + + + Detach an object from yourself + + A reference to the + object where the objects reside + + This will always be the simulator the avatar is currently in + + An array which contains the IDs of the objects to detach + + + + Change the position of an object, Will change position of entire linkset + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new position of the object + + + + Change the position of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new position of the object + if true, will change position of (this) child prim only, not entire linkset + + + + Change the Scale (size) of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new scale of the object + If true, will change scale of this prim only, not entire linkset + True to resize prims uniformly + + + + Change the Rotation of an object that is either a child or a whole linkset + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new scale of the object + If true, will change rotation of this prim only, not entire linkset + + + + Send a Multiple Object Update packet to change the size, scale or rotation of a primitive + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new rotation, size, or position of the target object + The flags from the Enum + + + + Deed an object (prim) to a group, Object must be shared with group which + can be accomplished with SetPermissions() + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The of the group to deed the object to + + + + Deed multiple objects (prims) to a group, Objects must be shared with group which + can be accomplished with SetPermissions() + + A reference to the object where the object resides + An array which contains the IDs of the objects to deed + The of the group to deed the object to + + + + Set the permissions on multiple objects + + A reference to the object where the objects reside + An array which contains the IDs of the objects to set the permissions on + The new Who mask to set + Which permission to modify + The new state of permission + + + + Request additional properties for an object + + A reference to the object where the object resides + + + + + Request additional properties for an object + + A reference to the object where the object resides + Absolute UUID of the object + Whether to require server acknowledgement of this request + + + + Set the ownership of a list of objects to the specified group + + A reference to the object where the objects reside + An array which contains the IDs of the objects to set the group id on + The Groups ID + + + + Update current URL of the previously set prim media + + UUID of the prim + Set current URL to this + Prim face number + Simulator in which prim is located + + + + Set object media + + UUID of the prim + Array the length of prims number of faces. Null on face indexes where there is + no media, on faces which contain the media + Simulatior in which prim is located + + + + Retrieve information about object media + + UUID of the primitive + Simulator where prim is located + Call this callback when done + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + A terse object update, used when a transformation matrix or + velocity/acceleration for an object changes but nothing else + (scale/position/rotation/acceleration/velocity) + + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + + + + + + + + + Setup construction data for a basic primitive shape + + Primitive shape to construct + Construction data that can be plugged into a + + + + + + + + + + + + + + + + + + + + Set the Shape data of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + Data describing the prim shape + + + + Set the Material data of an object + + A reference to the object where the object resides + The objects ID which is local to the simulator the object is in + The new material of the object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides data for the event + The event occurs when the simulator sends + an containing a Primitive, Foliage or Attachment data + Note 1: The event will not be raised when the object is an Avatar + Note 2: It is possible for the to be + raised twice for the same object if for example the primitive moved to a new simulator, then returned to the current simulator or + if an Avatar crosses the border into a new simulator and returns to the current simulator + + + The following code example uses the , , and + properties to display new Primitives and Attachments on the window. + + // Subscribe to the event that gives us prim and foliage information + Client.Objects.ObjectUpdate += Objects_ObjectUpdate; + + + private void Objects_ObjectUpdate(object sender, PrimEventArgs e) + { + Console.WriteLine("Primitive {0} {1} in {2} is an attachment {3}", e.Prim.ID, e.Prim.LocalID, e.Simulator.Name, e.IsAttachment); + } + + + + + + + + Get the simulator the originated from + + + Get the details + + + true if the did not exist in the dictionary before this update (always true if object tracking has been disabled) + + + true if the is attached to an + + + Get the simulator Time Dilation + + + + Construct a new instance of the PrimEventArgs class + + The simulator the object originated from + The Primitive + The simulator time dilation + The prim was not in the dictionary before this update + true if the primitive represents an attachment to an agent + + + Provides data for the event + The event occurs when the simulator sends + an containing Avatar data + Note 1: The event will not be raised when the object is an Avatar + Note 2: It is possible for the to be + raised twice for the same avatar if for example the avatar moved to a new simulator, then returned to the current simulator + + + The following code example uses the property to make a request for the top picks + using the method in the class to display the names + of our own agents picks listings on the window. + + // subscribe to the AvatarUpdate event to get our information + Client.Objects.AvatarUpdate += Objects_AvatarUpdate; + Client.Avatars.AvatarPicksReply += Avatars_AvatarPicksReply; + + private void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e) + { + // we only want our own data + if (e.Avatar.LocalID == Client.Self.LocalID) + { + // Unsubscribe from the avatar update event to prevent a loop + // where we continually request the picks every time we get an update for ourselves + Client.Objects.AvatarUpdate -= Objects_AvatarUpdate; + // make the top picks request through AvatarManager + Client.Avatars.RequestAvatarPicks(e.Avatar.ID); + } + } + + private void Avatars_AvatarPicksReply(object sender, AvatarPicksReplyEventArgs e) + { + // we'll unsubscribe from the AvatarPicksReply event since we now have the data + // we were looking for + Client.Avatars.AvatarPicksReply -= Avatars_AvatarPicksReply; + // loop through the dictionary and extract the names of the top picks from our profile + foreach (var pickName in e.Picks.Values) + { + Console.WriteLine(pickName); + } + } + + + + + + + Get the simulator the object originated from + + + Get the data + + + Get the simulator time dilation + + + true if the did not exist in the dictionary before this update (always true if avatar tracking has been disabled) + + + + Construct a new instance of the AvatarUpdateEventArgs class + + The simulator the packet originated from + The data + The simulator time dilation + The avatar was not in the dictionary before this update + + + Get the simulator the object originated from + + + Get the data + + + Get source + + + + Construct a new instance of the ParticleUpdateEventArgs class + + The simulator the packet originated from + The ParticleSystem data + The Primitive source + + + Provides additional primitive data for the event + The event occurs when the simulator sends + an containing additional details for a Primitive, Foliage data or Attachment data + The event is also raised when a request is + made. + + + The following code example uses the , and + + properties to display new attachments and send a request for additional properties containing the name of the + attachment then display it on the window. + + // Subscribe to the event that provides additional primitive details + Client.Objects.ObjectProperties += Objects_ObjectProperties; + + // handle the properties data that arrives + private void Objects_ObjectProperties(object sender, ObjectPropertiesEventArgs e) + { + Console.WriteLine("Primitive Properties: {0} Name is {1}", e.Properties.ObjectID, e.Properties.Name); + } + + + + + Get the simulator the object is located + + + Get the primitive properties + + + + Construct a new instance of the ObjectPropertiesEventArgs class + + The simulator the object is located + The primitive Properties + + + Provides additional primitive data for the event + The event occurs when the simulator sends + an containing additional details for a Primitive or Foliage data that is currently + being tracked in the dictionary + The event is also raised when a request is + made and is enabled + + + + Get the primitive details + + + + Construct a new instance of the ObjectPropertiesUpdatedEvenrArgs class + + The simulator the object is located + The Primitive + The primitive Properties + + + Provides additional primitive data, permissions and sale info for the event + The event occurs when the simulator sends + an containing additional details for a Primitive, Foliage data or Attachment. This includes + Permissions, Sale info, and other basic details on an object + The event is also raised when a request is + made, the viewer equivalent is hovering the mouse cursor over an object + + + + Get the simulator the object is located + + + + + + + + + Provides primitive data containing updated location, velocity, rotation, textures for the event + The event occurs when the simulator sends updated location, velocity, rotation, etc + + + + Get the simulator the object is located + + + Get the primitive details + + + + + + + + + + + + + + Get the simulator the object is located + + + Get the primitive details + + + + + + + + + + + + + + + Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the + event + + + Get the simulator the object is located + + + The LocalID of the object + + + Provides notification when an Avatar, Object or Attachment is DeRezzed or moves out of the avatars view for the + event + + + Get the simulator the object is located + + + The LocalID of the object + + + + Provides updates sit position data + + + + Get the simulator the object is located + + + + + + + + + + + + + + + + + Get the simulator the object is located + + + + + + + + + + + + + Indicates if the operation was successful + + + + + Media version string + + + + + Array of media entries indexed by face number + + + + + Set when simulator sends us infomation on primitive's physical properties + + + + Simulator where the message originated + + + Updated physical properties + + + + Constructor + + Simulator where the message originated + Updated physical properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ObservableDictionary class is used for storing key/value pairs. It has methods for firing + events to subscribers when items are added, removed, or changed. + + Key + Value + + + + A dictionary of callbacks to fire when specified action occurs + + + + + Register a callback to be fired when an action occurs + + The action + The callback to fire + + + + Unregister a callback + + The action + The callback to fire + + + + + + + + + + Internal dictionary that this class wraps around. Do not + modify or enumerate the contents of this dictionary without locking + + + + Gets the number of Key/Value pairs contained in the + + + + + Initializes a new instance of the Class + with the specified key/value, has the default initial capacity. + + + + // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value. + public ObservableDictionary<string, int> testDict = new ObservableDictionary<string, int>(); + + + + + + Initializes a new instance of the Class + with the specified key/value, With its initial capacity specified. + + Initial size of dictionary + + + // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value, + // initially allocated room for 10 entries. + public ObservableDictionary<string, int> testDict = new ObservableDictionary<string, int>(10); + + + + + + Try to get entry from the with specified key + + Key to use for lookup + Value returned + if specified key exists, if not found + + + // find your avatar using the Simulator.ObjectsAvatars ObservableDictionary: + Avatar av; + if (Client.Network.CurrentSim.ObjectsAvatars.TryGetValue(Client.Self.AgentID, out av)) + Console.WriteLine("Found Avatar {0}", av.Name); + + + + + + + Finds the specified match. + + The match. + Matched value + + + // use a delegate to find a prim in the ObjectsPrimitives ObservableDictionary + // with the ID 95683496 + uint findID = 95683496; + Primitive findPrim = sim.ObjectsPrimitives.Find( + delegate(Primitive prim) { return prim.ID == findID; }); + + + + + Find All items in an + return matching items. + a containing found items. + + Find All prims within 20 meters and store them in a List + + int radius = 20; + List<Primitive> prims = Client.Network.CurrentSim.ObjectsPrimitives.FindAll( + delegate(Primitive prim) { + Vector3 pos = prim.Position; + return ((prim.ParentID == 0) && (pos != Vector3.Zero) && (Vector3.Distance(pos, location) < radius)); + } + ); + + + + + Find All items in an + return matching keys. + a containing found keys. + + Find All keys which also exist in another dictionary + + List<UUID> matches = myDict.FindAll( + delegate(UUID id) { + return myOtherDict.ContainsKey(id); + } + ); + + + + + Check if Key exists in Dictionary + Key to check for + if found, otherwise + + + Check if Value exists in Dictionary + Value to check for + if found, otherwise + + + + Adds the specified key to the dictionary, dictionary locking is not performed, + + + The key + The value + + + + Removes the specified key, dictionary locking is not performed + + The key. + if successful, otherwise + + + + Indexer for the dictionary + + The key + The value + + + + Clear the contents of the dictionary + + + + + Enumerator for iterating dictionary entries + + + + + + Type of return to use when returning objects from a parcel + + + + + + + Return objects owned by parcel owner + + + Return objects set to group + + + Return objects not owned by parcel owner or set to group + + + Return a specific list of objects on parcel + + + Return objects that are marked for-sale + + + + Blacklist/Whitelist flags used in parcels Access List + + + + Agent is denied access + + + Agent is granted access + + + + The result of a request for parcel properties + + + + No matches were found for the request + + + Request matched a single parcel + + + Request matched multiple parcels + + + + Flags used in the ParcelAccessListRequest packet to specify whether + we want the access list (whitelist), ban list (blacklist), or both + + + + Request the access list + + + Request the ban list + + + Request both White and Black lists + + + + Sequence ID in ParcelPropertiesReply packets (sent when avatar + tries to cross a parcel border) + + + + Parcel is currently selected + + + Parcel restricted to a group the avatar is not a + member of + + + Avatar is banned from the parcel + + + Parcel is restricted to an access list that the + avatar is not on + + + Response to hovering over a parcel + + + + The tool to use when modifying terrain levels + + + + Level the terrain + + + Raise the terrain + + + Lower the terrain + + + Smooth the terrain + + + Add random noise to the terrain + + + Revert terrain to simulator default + + + + The tool size to use when changing terrain levels + + + + Small + + + Medium + + + Large + + + + Reasons agent is denied access to a parcel on the simulator + + + + Agent is not denied, access is granted + + + Agent is not a member of the group set for the parcel, or which owns the parcel + + + Agent is not on the parcels specific allow list + + + Agent is on the parcels ban list + + + Unknown + + + Agent is not age verified and parcel settings deny access to non age verified avatars + + + + Parcel overlay type. This is used primarily for highlighting and + coloring which is why it is a single integer instead of a set of + flags + + These values seem to be poorly thought out. The first three + bits represent a single value, not flags. For example Auction (0x05) is + not a combination of OwnedByOther (0x01) and ForSale(0x04). However, + the BorderWest and BorderSouth values are bit flags that get attached + to the value stored in the first three bits. Bits four, five, and six + are unused + + + Public land + + + Land is owned by another avatar + + + Land is owned by a group + + + Land is owned by the current avatar + + + Land is for sale + + + Land is being auctioned + + + Land is private + + + To the west of this area is a parcel border + + + To the south of this area is a parcel border + + + + Various parcel properties + + + + No flags set + + + Allow avatars to fly (a client-side only restriction) + + + Allow foreign scripts to run + + + This parcel is for sale + + + Allow avatars to create a landmark on this parcel + + + Allows all avatars to edit the terrain on this parcel + + + Avatars have health and can take damage on this parcel. + If set, avatars can be killed and sent home here + + + Foreign avatars can create objects here + + + All objects on this parcel can be purchased + + + Access is restricted to a group + + + Access is restricted to a whitelist + + + Ban blacklist is enabled + + + Unknown + + + List this parcel in the search directory + + + Allow personally owned parcels to be deeded to group + + + If Deeded, owner contributes required tier to group parcel is deeded to + + + Restrict sounds originating on this parcel to the + parcel boundaries + + + Objects on this parcel are sold when the land is + purchsaed + + + Allow this parcel to be published on the web + + + The information for this parcel is mature content + + + The media URL is an HTML page + + + The media URL is a raw HTML string + + + Restrict foreign object pushes + + + Ban all non identified/transacted avatars + + + Allow group-owned scripts to run + + + Allow object creation by group members or group + objects + + + Allow all objects to enter this parcel + + + Only allow group and owner objects to enter this parcel + + + Voice Enabled on this parcel + + + Use Estate Voice channel for Voice on this parcel + + + Deny Age Unverified Users + + + + Parcel ownership status + + + + Placeholder + + + Parcel is leased (owned) by an avatar or group + + + Parcel is in process of being leased (purchased) by an avatar or group + + + Parcel has been abandoned back to Governor Linden + + + + Category parcel is listed in under search + + + + No assigned category + + + Linden Infohub or public area + + + Adult themed area + + + Arts and Culture + + + Business + + + Educational + + + Gaming + + + Hangout or Club + + + Newcomer friendly + + + Parks and Nature + + + Residential + + + Shopping + + + Not Used? + + + Other + + + Not an actual category, only used for queries + + + + Type of teleport landing for a parcel + + + + Unset, simulator default + + + Specific landing point set for this parcel + + + No landing point set, direct teleports enabled for + this parcel + + + + Parcel Media Command used in ParcelMediaCommandMessage + + + + Stop the media stream and go back to the first frame + + + Pause the media stream (stop playing but stay on current frame) + + + Start the current media stream playing and stop when the end is reached + + + Start the current media stream playing, + loop to the beginning when the end is reached and continue to play + + + Specifies the texture to replace with video + If passing the key of a texture, it must be explicitly typecast as a key, + not just passed within double quotes. + + + Specifies the movie URL (254 characters max) + + + Specifies the time index at which to begin playing + + + Specifies a single agent to apply the media command to + + + Unloads the stream. While the stop command sets the texture to the first frame of the movie, + unload resets it to the real texture that the movie was replacing. + + + Turn on/off the auto align feature, similar to the auto align checkbox in the parcel media properties + (NOT to be confused with the "align" function in the textures view of the editor!) Takes TRUE or FALSE as parameter. + + + Allows a Web page or image to be placed on a prim (1.19.1 RC0 and later only). + Use "text/html" for HTML. + + + Resizes a Web page to fit on x, y pixels (1.19.1 RC0 and later only). + This might still not be working + + + Sets a description for the media being displayed (1.19.1 RC0 and later only). + + + + Some information about a parcel of land returned from a DirectoryManager search + + + + Global Key of record + + + Parcel Owners + + + Name field of parcel, limited to 128 characters + + + Description field of parcel, limited to 256 characters + + + Total Square meters of parcel + + + Total area billable as Tier, for group owned land this will be 10% less than ActualArea + + + True of parcel is in Mature simulator + + + Grid global X position of parcel + + + Grid global Y position of parcel + + + Grid global Z position of parcel (not used) + + + Name of simulator parcel is located in + + + Texture of parcels display picture + + + Float representing calculated traffic based on time spent on parcel by avatars + + + Sale price of parcel (not used) + + + Auction ID of parcel + + + + Parcel Media Information + + + + A byte, if 0x1 viewer should auto scale media to fit object + + + A boolean, if true the viewer should loop the media + + + The Asset UUID of the Texture which when applied to a + primitive will display the media + + + A URL which points to any Quicktime supported media type + + + A description of the media + + + An Integer which represents the height of the media + + + An integer which represents the width of the media + + + A string which contains the mime type of the media + + + + Parcel of land, a portion of virtual real estate in a simulator + + + + The total number of contiguous 4x4 meter blocks your agent owns within this parcel + + + The total number of contiguous 4x4 meter blocks contained in this parcel owned by a group or agent other than your own + + + Deprecated, Value appears to always be 0 + + + Simulator-local ID of this parcel + + + UUID of the owner of this parcel + + + Whether the land is deeded to a group or not + + + + + + Date land was claimed + + + Appears to always be zero + + + This field is no longer used + + + Minimum corner of the axis-aligned bounding box for this + parcel + + + Maximum corner of the axis-aligned bounding box for this + parcel + + + Bitmap describing land layout in 4x4m squares across the + entire region + + + Total parcel land area + + + + + + Maximum primitives across the entire simulator owned by the same agent or group that owns this parcel that can be used + + + Total primitives across the entire simulator calculated by combining the allowed prim counts for each parcel + owned by the agent or group that owns this parcel + + + Maximum number of primitives this parcel supports + + + Total number of primitives on this parcel + + + For group-owned parcels this indicates the total number of prims deeded to the group, + for parcels owned by an individual this inicates the number of prims owned by the individual + + + Total number of primitives owned by the parcel group on + this parcel, or for parcels owned by an individual with a group set the + total number of prims set to that group. + + + Total number of prims owned by other avatars that are not set to group, or not the parcel owner + + + A bonus multiplier which allows parcel prim counts to go over times this amount, this does not affect + the max prims per simulator. e.g: 117 prim parcel limit x 1.5 bonus = 175 allowed + + + Autoreturn value in minutes for others' objects + + + + + + Sale price of the parcel, only useful if ForSale is set + The SalePrice will remain the same after an ownership + transfer (sale), so it can be used to see the purchase price after + a sale if the new owner has not changed it + + + Parcel Name + + + Parcel Description + + + URL For Music Stream + + + + + + Price for a temporary pass + + + How long is pass valid for + + + + + + Key of authorized buyer + + + Key of parcel snapshot + + + The landing point location + + + The landing point LookAt + + + The type of landing enforced from the enum + + + + + + + + + + + + Access list of who is whitelisted on this + parcel + + + Access list of who is blacklisted on this + parcel + + + TRUE of region denies access to age unverified users + + + true to obscure (hide) media url + + + true to obscure (hide) music url + + + A struct containing media details + + + + Displays a parcel object in string format + + string containing key=value pairs of a parcel object + + + + Defalt constructor + + Local ID of this parcel + + + + Update the simulator with any local changes to this Parcel object + + Simulator to send updates to + Whether we want the simulator to confirm + the update with a reply packet or not + + + + Set Autoreturn time + + Simulator to send the update to + + + + Parcel (subdivided simulator lots) subsystem + + + + + Parcel Accesslist + + + + Agents + + + + + + Flags for specific entry in white/black lists + + + + Owners of primitives on parcel + + + + Prim Owners + + + True of owner is group + + + Total count of prims owned by OwnerID + + + true of OwnerID is currently online and is not a group + + + The date of the most recent prim left by OwnerID + + + + Called once parcel resource usage information has been collected + + Indicates if operation was successfull + Parcel resource usage information + + + The event subscribers. null if no subcribers + + + Raises the ParcelDwellReply event + A ParcelDwellReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ParcelInfoReply event + A ParcelInfoReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ParcelProperties event + A ParcelPropertiesEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ParcelAccessListReply event + A ParcelAccessListReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ParcelObjectOwnersReply event + A ParcelObjectOwnersReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the SimParcelsDownloaded event + A SimParcelsDownloadedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ForceSelectObjectsReply event + A ForceSelectObjectsReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a request + + + The event subscribers. null if no subcribers + + + Raises the ParcelMediaUpdateReply event + A ParcelMediaUpdateReplyEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds to a Parcel Update request + + + The event subscribers. null if no subcribers + + + Raises the ParcelMediaCommand event + A ParcelMediaCommandEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the parcel your agent is located sends a ParcelMediaCommand + + + + Default constructor + + A reference to the GridClient object + + + + Request basic information for a single parcel + + Simulator-local ID of the parcel + + + + Request properties of a single parcel + + Simulator containing the parcel + Simulator-local ID of the parcel + An arbitrary integer that will be returned + with the ParcelProperties reply, useful for distinguishing between + multiple simultaneous requests + + + + Request the access list for a single parcel + + Simulator containing the parcel + Simulator-local ID of the parcel + An arbitrary integer that will be returned + with the ParcelAccessList reply, useful for distinguishing between + multiple simultaneous requests + + + + + Request properties of parcels using a bounding box selection + + Simulator containing the parcel + Northern boundary of the parcel selection + Eastern boundary of the parcel selection + Southern boundary of the parcel selection + Western boundary of the parcel selection + An arbitrary integer that will be returned + with the ParcelProperties reply, useful for distinguishing between + different types of parcel property requests + A boolean that is returned with the + ParcelProperties reply, useful for snapping focus to a single + parcel + + + + Request all simulator parcel properties (used for populating the Simulator.Parcels + dictionary) + + Simulator to request parcels from (must be connected) + + + + Request all simulator parcel properties (used for populating the Simulator.Parcels + dictionary) + + Simulator to request parcels from (must be connected) + If TRUE, will force a full refresh + Number of milliseconds to pause in between each request + + + + Request the dwell value for a parcel + + Simulator containing the parcel + Simulator-local ID of the parcel + + + + Send a request to Purchase a parcel of land + + The Simulator the parcel is located in + The parcels region specific local ID + true if this parcel is being purchased by a group + The groups + true to remove tier contribution if purchase is successful + The parcels size + The purchase price of the parcel + + + + + Reclaim a parcel of land + + The simulator the parcel is in + The parcels region specific local ID + + + + Deed a parcel to a group + + The simulator the parcel is in + The parcels region specific local ID + The groups + + + + Request prim owners of a parcel of land. + + Simulator parcel is in + The parcels region specific local ID + + + + Return objects from a parcel + + Simulator parcel is in + The parcels region specific local ID + the type of objects to return, + A list containing object owners s to return + + + + Subdivide (split) a parcel + + + + + + + + + + Join two parcels of land creating a single parcel + + + + + + + + + + Get a parcels LocalID + + Simulator parcel is in + Vector3 position in simulator (Z not used) + 0 on failure, or parcel LocalID on success. + A call to Parcels.RequestAllSimParcels is required to populate map and + dictionary. + + + + Terraform (raise, lower, etc) an area or whole parcel of land + + Simulator land area is in. + LocalID of parcel, or -1 if using bounding box + From Enum, Raise, Lower, Level, Smooth, Etc. + Size of area to modify + true on successful request sent. + Settings.STORE_LAND_PATCHES must be true, + Parcel information must be downloaded using RequestAllSimParcels() + + + + Terraform (raise, lower, etc) an area or whole parcel of land + + Simulator land area is in. + west border of area to modify + south border of area to modify + east border of area to modify + north border of area to modify + From Enum, Raise, Lower, Level, Smooth, Etc. + Size of area to modify + true on successful request sent. + Settings.STORE_LAND_PATCHES must be true, + Parcel information must be downloaded using RequestAllSimParcels() + + + + Terraform (raise, lower, etc) an area or whole parcel of land + + Simulator land area is in. + LocalID of parcel, or -1 if using bounding box + west border of area to modify + south border of area to modify + east border of area to modify + north border of area to modify + From Enum, Raise, Lower, Level, Smooth, Etc. + Size of area to modify + How many meters + or - to lower, 1 = 1 meter + true on successful request sent. + Settings.STORE_LAND_PATCHES must be true, + Parcel information must be downloaded using RequestAllSimParcels() + + + + Terraform (raise, lower, etc) an area or whole parcel of land + + Simulator land area is in. + LocalID of parcel, or -1 if using bounding box + west border of area to modify + south border of area to modify + east border of area to modify + north border of area to modify + From Enum, Raise, Lower, Level, Smooth, Etc. + Size of area to modify + How many meters + or - to lower, 1 = 1 meter + Height at which the terraform operation is acting at + + + + Sends a request to the simulator to return a list of objects owned by specific owners + + Simulator local ID of parcel + Owners, Others, Etc + List containing keys of avatars objects to select; + if List is null will return Objects of type selectType + Response data is returned in the event + + + + Eject and optionally ban a user from a parcel + + target key of avatar to eject + true to also ban target + + + + Freeze or unfreeze an avatar over your land + + target key to freeze + true to freeze, false to unfreeze + + + + Abandon a parcel of land + + Simulator parcel is in + Simulator local ID of parcel + + + + Requests the UUID of the parcel in a remote region at a specified location + + Location of the parcel in the remote region + Remote region handle + Remote region UUID + If successful UUID of the remote parcel, UUID.Zero otherwise + + + + Retrieves information on resources used by the parcel + + UUID of the parcel + Should per object resource usage be requested + Callback invoked when the request is complete + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + Raises the event + + + Contains a parcels dwell data returned from the simulator in response to an + + + Get the global ID of the parcel + + + Get the simulator specific ID of the parcel + + + Get the calculated dwell + + + + Construct a new instance of the ParcelDwellReplyEventArgs class + + The global ID of the parcel + The simulator specific ID of the parcel + The calculated dwell for the parcel + + + Contains basic parcel information data returned from the + simulator in response to an request + + + Get the object containing basic parcel info + + + + Construct a new instance of the ParcelInfoReplyEventArgs class + + The object containing basic parcel info + + + Contains basic parcel information data returned from the simulator in response to an request + + + Get the simulator the parcel is located in + + + Get the object containing the details + If Result is NoData, this object will not contain valid data + + + Get the result of the request + + + Get the number of primitieves your agent is + currently selecting and or sitting on in this parcel + + + Get the user assigned ID used to correlate a request with + these results + + + TODO: + + + + Construct a new instance of the ParcelPropertiesEventArgs class + + The object containing the details + The object containing the details + The result of the request + The number of primitieves your agent is + currently selecting and or sitting on in this parcel + The user assigned ID used to correlate a request with + these results + TODO: + + + Contains blacklist and whitelist data returned from the simulator in response to an request + + + Get the simulator the parcel is located in + + + Get the user assigned ID used to correlate a request with + these results + + + Get the simulator specific ID of the parcel + + + TODO + + + Get the list containing the white/blacklisted agents for the parcel + + + + Construct a new instance of the ParcelAccessListReplyEventArgs class + + The simulator the parcel is located in + The user assigned ID used to correlate a request with + these results + The simulator specific ID of the parcel + TODO: + The list containing the white/blacklisted agents for the parcel + + + Contains blacklist and whitelist data returned from the + simulator in response to an request + + + Get the simulator the parcel is located in + + + Get the list containing prim ownership counts + + + + Construct a new instance of the ParcelObjectOwnersReplyEventArgs class + + The simulator the parcel is located in + The list containing prim ownership counts + + + Contains the data returned when all parcel data has been retrieved from a simulator + + + Get the simulator the parcel data was retrieved from + + + A dictionary containing the parcel data where the key correlates to the ParcelMap entry + + + Get the multidimensional array containing a x,y grid mapped + to each 64x64 parcel's LocalID. + + + + Construct a new instance of the SimParcelsDownloadedEventArgs class + + The simulator the parcel data was retrieved from + The dictionary containing the parcel data + The multidimensional array containing a x,y grid mapped + to each 64x64 parcel's LocalID. + + + Contains the data returned when a request + + + Get the simulator the parcel data was retrieved from + + + Get the list of primitive IDs + + + true if the list is clean and contains the information + only for a given request + + + + Construct a new instance of the ForceSelectObjectsReplyEventArgs class + + The simulator the parcel data was retrieved from + The list of primitive IDs + true if the list is clean and contains the information + only for a given request + + + Contains data when the media data for a parcel the avatar is on changes + + + Get the simulator the parcel media data was updated in + + + Get the updated media information + + + + Construct a new instance of the ParcelMediaUpdateReplyEventArgs class + + the simulator the parcel media data was updated in + The updated media information + + + Contains the media command for a parcel the agent is currently on + + + Get the simulator the parcel media command was issued in + + + + + + + + + Get the media command that was sent + + + + + + + Construct a new instance of the ParcelMediaCommandEventArgs class + + The simulator the parcel media command was issued in + + + The media command that was sent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Permissions for control of object media + + + + + Style of cotrols that shold be displayed to the user + + + + + Class representing media data for a single face + + + + Is display of the alternative image enabled + + + Should media auto loop + + + Shoule media be auto played + + + Auto scale media to prim face + + + Should viewer automatically zoom in on the face when clicked + + + Should viewer interpret first click as interaction with the media + or when false should the first click be treated as zoom in commadn + + + Style of controls viewer should display when + viewer media on this face + + + Starting URL for the media + + + Currently navigated URL + + + Media height in pixes + + + Media width in pixels + + + Who can controls the media + + + Who can interact with the media + + + Is URL whitelist enabled + + + Array of URLs that are whitelisted + + + + Serialize to OSD + + OSDMap with the serialized data + + + + Deserialize from OSD data + + Serialized OSD data + Deserialized object + + + + Particle system specific enumerators, flags and methods. + + + + + Current version of the media data for the prim + + + + + Array of media entries indexed by face number + + + + + Complete structure for the particle system + + + + + Particle source pattern + + + + None + + + Drop particles from source position with no force + + + "Explode" particles in all directions + + + Particles shoot across a 2D area + + + Particles shoot across a 3D Cone + + + Inverse of AngleCone (shoot particles everywhere except the 3D cone defined + + + + Particle Data Flags + + + + None + + + Interpolate color and alpha from start to end + + + Interpolate scale from start to end + + + Bounce particles off particle sources Z height + + + velocity of particles is dampened toward the simulators wind + + + Particles follow the source + + + Particles point towards the direction of source's velocity + + + Target of the particles + + + Particles are sent in a straight line + + + Particles emit a glow + + + used for point/grab/touch + + + continuous ribbon particle + + + particle data contains glow + + + particle data contains blend functions + + + + Particle Flags Enum + + + + None + + + Acceleration and velocity for particles are + relative to the object rotation + + + Particles use new 'correct' angle parameters + + + Particle Flags + There appears to be more data packed in to this area + for many particle systems. It doesn't appear to be flag values + and serialization breaks unless there is a flag for every + possible bit so it is left as an unsigned integer + + + pattern of particles + + + A representing the maximimum age (in seconds) particle will be displayed + Maximum value is 30 seconds + + + A representing the number of seconds, + from when the particle source comes into view, + or the particle system's creation, that the object will emits particles; + after this time period no more particles are emitted + + + A in radians that specifies where particles will not be created + + + A in radians that specifies where particles will be created + + + A representing the number of seconds between burts. + + + A representing the number of meters + around the center of the source where particles will be created. + + + A representing in seconds, the minimum speed between bursts of new particles + being emitted + + + A representing in seconds the maximum speed of new particles being emitted. + + + A representing the maximum number of particles emitted per burst + + + A which represents the velocity (speed) from the source which particles are emitted + + + A which represents the Acceleration from the source which particles are emitted + + + The Key of the texture displayed on the particle + + + The Key of the specified target object or avatar particles will follow + + + Flags of particle from + + + Max Age particle system will emit particles for + + + The the particle has at the beginning of its lifecycle + + + The the particle has at the ending of its lifecycle + + + A that represents the starting X size of the particle + Minimum value is 0, maximum value is 4 + + + A that represents the starting Y size of the particle + Minimum value is 0, maximum value is 4 + + + A that represents the ending X size of the particle + Minimum value is 0, maximum value is 4 + + + A that represents the ending Y size of the particle + Minimum value is 0, maximum value is 4 + + + A that represents the start glow value + Minimum value is 0, maximum value is 1 + + + A that represents the end glow value + Minimum value is 0, maximum value is 1 + + + OpenGL blend function to use at particle source + + + OpenGL blend function to use at particle destination + + + + Can this particle system be packed in a legacy compatible way + + True if the particle system doesn't use new particle system features + + + + Decodes a byte[] array into a ParticleSystem Object + + ParticleSystem object + Start position for BitPacker + + + + Generate byte[] array from particle data + + Byte array + + + + + + + Parameters used to construct a visual representation of a primitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Attachment point to an avatar + + + + + + + + + + + + + + + + Calculdates hash code for prim construction data + + The has + + + + Information on the flexible properties of a primitive + + + + + + + + + + + + + + + + + + + + + + + Default constructor + + + + + + + + + + + + + + + + + + + + + + + + Information on the light properties of a primitive + + + + + + + + + + + + + + + + + + + + Default constructor + + + + + + + + + + + + + + + + + + + + + + + + Information on the light properties of a primitive as texture map + + + + + + + + + + + Default constructor + + + + + + + + + + + + + + + + + + + + + + + + Information on the sculpt properties of a sculpted primitive + + + + + Render inside out (inverts the normals). + + + + + Render an X axis mirror of the sculpty. + + + + + Default constructor + + + + + + + + + + + + Extended properties to describe an object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default constructor + + + + + Set the properties that are set in an ObjectPropertiesFamily packet + + that has + been partially filled by an ObjectPropertiesFamily packet + + + + Describes physics attributes of the prim + + + + Primitive's local ID + + + Density (1000 for normal density) + + + Friction + + + Gravity multiplier (1 for normal gravity) + + + Type of physics representation of this primitive in the simulator + + + Restitution + + + + Creates PhysicsProperties from OSD + + OSDMap with incoming data + Deserialized PhysicsProperties object + + + + Serializes PhysicsProperties to OSD + + OSDMap with serialized PhysicsProperties data + + + + + + + + + + + + + + + + + + + + + Foliage type for this primitive. Only applicable if this + primitive is foliage + + + Unknown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Identifies the owner if audio or a particle system is + active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Objects physics engine propertis + + + Extra data about primitive + + + Indicates if prim is attached to an avatar + + + Number of clients referencing this prim + + + Uses basic heuristics to estimate the primitive shape + + + + Default constructor + + + + + Packs PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew + parameters in to signed eight bit values + + Floating point parameter to pack + Signed eight bit value containing the packed parameter + + + + Unpacks PathTwist, PathTwistBegin, PathRadiusOffset, and PathSkew + parameters from signed eight bit integers to floating point values + + Signed eight bit value to unpack + Unpacked floating point value + + + + Texture animation mode + + + + Disable texture animation + + + Enable texture animation + + + Loop when animating textures + + + Animate in reverse direction + + + Animate forward then reverse + + + Slide texture smoothly instead of frame-stepping + + + Rotate texture instead of using frames + + + Scale texture instead of using frames + + + + A single textured face. Don't instantiate this class yourself, use the + methods in TextureEntry + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In the future this will specify whether a webpage is + attached to this face + + + + + + + + + + Contains the definition for individual faces + + + + + + + + + + + + Represents all of the texturable faces for an object + + Grid objects have infinite faces, with each face + using the properties of the default face unless set otherwise. So if + you have a TextureEntry with a default texture uuid of X, and face 18 + has a texture UUID of Y, every face would be textured with X except for + face 18 that uses Y. In practice however, primitives utilize a maximum + of nine faces + + + + + + + + + + Constructor that takes a default texture UUID + + Texture UUID to use as the default texture + + + + Constructor that takes a TextureEntryFace for the + default face + + Face to use as the default face + + + + Constructor that creates the TextureEntry class from a byte array + + Byte array containing the TextureEntry field + Starting position of the TextureEntry field in + the byte array + Length of the TextureEntry field, in bytes + + + + This will either create a new face if a custom face for the given + index is not defined, or return the custom face for that index if + it already exists + + The index number of the face to create or + retrieve + A TextureEntryFace containing all the properties for that + face + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Controls the texture animation of a particular prim + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The type of bump-mapping applied to a face + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The level of shininess applied to a face + + + + + + + + + + + + + + + + + The texture mapping style used for a face + + + + + + + + + + + + + + + + + Flags in the TextureEntry block that describe which properties are + set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Class for controlling various system settings. + + Some values are readonly because they affect things that + happen when the GridClient object is initialized, so changing them at + runtime won't do any good. Non-readonly values may affect things that + happen at login or dynamically + + + Main grid login server + + + Beta grid login server + + + The relative directory where external resources are kept + + + Login server to connect to + + + IP Address the client will bind to + + + Use XML-RPC Login or LLSD Login, default is XML-RPC Login + + + + Maximum number of HTTP connections to open to a particular endpoint. + + + An endpoint is defined as a commbination of network address and port. This is used for Caps. + This is a static variable which applies to all instances. + + + + + InventoryManager requests inventory information on login, + GridClient initializes an Inventory store for main inventory. + + + + + InventoryManager requests library information on login, + GridClient initializes an Inventory store for the library. + + + + + Use Caps for fetching inventory where available + + + + Number of milliseconds before an asset transfer will time + out + + + Number of milliseconds before a teleport attempt will time + out + + + Number of milliseconds before NetworkManager.Logout() will + time out + + + Number of milliseconds before a CAPS call will time out + Setting this too low will cause web requests time out and + possibly retry repeatedly + + + Number of milliseconds for xml-rpc to timeout + + + Milliseconds before a packet is assumed lost and resent + + + Milliseconds without receiving a packet before the + connection to a simulator is assumed lost + + + Milliseconds to wait for a simulator info request through + the grid interface + + + Number of milliseconds between sending pings to each sim + + + Number of milliseconds between sending camera updates + + + Number of milliseconds between updating the current + positions of moving, non-accelerating and non-colliding objects + + + Millisecond interval between ticks, where all ACKs are + sent out and the age of unACKed packets is checked + + + Maximum size of packet that we want to send over the wire + + + The maximum value of a packet sequence number before it + rolls over back to one + + + The maximum size of the sequence number archive, used to + check for resent and/or duplicate packets + + + Maximum number of queued ACKs to be sent before SendAcks() + is forced + + + Network stats queue length (seconds) + + + + Primitives will be reused when falling in/out of interest list (and shared between clients) + prims returning to interest list do not need re-requested + Helps also in not re-requesting prim.Properties for code that checks for a Properties == null per client + + + + + Pool parcel data between clients (saves on requesting multiple times when all clients may need it) + + + + + How long to preserve cached data when no client is connected to a simulator + The reason for setting it to something like 2 minutes is in case a client + is running back and forth between region edges or a sim is comming and going + + + + Enable/disable storing terrain heightmaps in the + TerrainManager + + + Enable/disable sending periodic camera updates + + + Enable/disable automatically setting agent appearance at + login and after sim crossing + + + Enable/disable automatically setting the bandwidth throttle + after connecting to each simulator + The default throttle uses the equivalent of the maximum + bandwidth setting in the official client. If you do not set a + throttle your connection will by default be throttled well below + the minimum values and you may experience connection problems + + + Enable/disable the sending of pings to monitor lag and + packet loss + + + Should we connect to multiple sims? This will allow + viewing in to neighboring simulators and sim crossings + (Experimental) + + + If true, all object update packets will be decoded in to + native objects. If false, only updates for our own agent will be + decoded. Registering an event handler will force objects for that + type to always be decoded. If this is disabled the object tracking + will have missing or partial prim and avatar information + + + If true, when a cached object check is received from the + server the full object info will automatically be requested + + + Whether to establish connections to HTTP capabilities + servers for simulators + + + Whether to decode sim stats + + + The capabilities servers are currently designed to + periodically return a 502 error which signals for the client to + re-establish a connection. Set this to true to log those 502 errors + + + If true, any reference received for a folder or item + the library is not aware of will automatically be fetched + + + If true, and SEND_AGENT_UPDATES is true, + AgentUpdate packets will continuously be sent out to give the bot + smoother movement and autopiloting + + + If true, currently visible avatars will be stored + in dictionaries inside Simulator.ObjectAvatars. + If false, a new Avatar or Primitive object will be created + each time an object update packet is received + + + If true, currently visible avatars will be stored + in dictionaries inside Simulator.ObjectPrimitives. + If false, a new Avatar or Primitive object will be created + each time an object update packet is received + + + If true, position and velocity will periodically be + interpolated (extrapolated, technically) for objects and + avatars that are being tracked by the library. This is + necessary to increase the accuracy of speed and position + estimates for simulated objects + + + + If true, utilization statistics will be tracked. There is a minor penalty + in CPU time for enabling this option. + + + + If true, parcel details will be stored in the + Simulator.Parcels dictionary as they are received + + + + If true, an incoming parcel properties reply will automatically send + a request for the parcel access list + + + + + if true, an incoming parcel properties reply will automatically send + a request for the traffic count. + + + + + If true, images, and other assets downloaded from the server + will be cached in a local directory + + + + Path to store cached texture data + + + Maximum size cached files are allowed to take on disk (bytes) + + + Default color used for viewer particle effects + + + Cost of uploading an asset + Read-only since this value is dynamically fetched at login + + + Maximum number of times to resend a failed packet + + + Throttle outgoing packet rate + + + UUID of a texture used by some viewers to indentify type of client used + + + + Download textures using GetTexture capability when available + + + + The maximum number of concurrent texture downloads allowed + Increasing this number will not necessarily increase texture retrieval times due to + simulator throttles + + + + The Refresh timer inteval is used to set the delay between checks for stalled texture downloads + + This is a static variable which applies to all instances + + + + Textures taking longer than this value will be flagged as timed out and removed from the pipeline + + + + + Get or set the minimum log level to output to the console by default + + If the library is not compiled with DEBUG defined and this level is set to DEBUG + You will get no output on the console. This behavior can be overriden by creating + a logger configuration file for log4net + + + + Attach avatar names to log messages + + + Log packet retransmission info + + + Log disk cache misses and other info + + + Constructor + Reference to a GridClient object + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + + Simulator (region) properties + + + + No flags set + + + Agents can take damage and be killed + + + Landmarks can be created here + + + Home position can be set in this sim + + + Home position is reset when an agent teleports away + + + Sun does not move + + + Allows private parcels (ie. banlines) + + + Disable heightmap alterations (agents can still plant foliage) + + + Land cannot be released, sold, or purchased + + + All content is wiped nightly + + + Unknown: Related to the availability of an overview world map tile.(Think mainland images when zoomed out.) + + + Unknown: Related to region debug flags. Possibly to skip processing of agent interaction with world. + + + Region does not update agent prim interest lists. Internal debugging option. + + + No collision detection for non-agent objects + + + No scripts are ran + + + All physics processing is turned off + + + Region can be seen from other regions on world map. (Legacy world map option?) + + + Region can be seen from mainland on world map. (Legacy world map option?) + + + Agents not explicitly on the access list can visit the region. + + + Traffic calculations are not run across entire region, overrides parcel settings. + + + Flight is disabled (not currently enforced by the sim) + + + Allow direct (p2p) teleporting + + + Estate owner has temporarily disabled scripting + + + Restricts the usage of the LSL llPushObject function, applies to whole region. + + + Deny agents with no payment info on file + + + Deny agents with payment info on file + + + Deny agents who have made a monetary transaction + + + Parcels within the region may be joined or divided by anyone, not just estate owners/managers. + + + Abuse reports sent from within this region are sent to the estate owner defined email. + + + Region is Voice Enabled + + + Removes the ability from parcel owners to set their parcels to show in search. + + + Deny agents who have not been age verified from entering the region. + + + + Region protocol flags + + + + Nothing special + + + Region supports Server side Appearance + + + Viewer supports Server side Appearance + + + + Access level for a simulator + + + + Unknown or invalid access level + + + Trial accounts allowed + + + PG rating + + + Mature rating + + + Adult rating + + + Simulator is offline + + + Simulator does not exist + + + + + + + + + Simulator Statistics + + + + Total number of packets sent by this simulator to this agent + + + Total number of packets received by this simulator to this agent + + + Total number of bytes sent by this simulator to this agent + + + Total number of bytes received by this simulator to this agent + + + Time in seconds agent has been connected to simulator + + + Total number of packets that have been resent + + + Total number of resent packets recieved + + + Total number of pings sent to this simulator by this agent + + + Total number of ping replies sent to this agent by this simulator + + + + Incoming bytes per second + + It would be nice to have this claculated on the fly, but + this is far, far easier + + + + Outgoing bytes per second + + It would be nice to have this claculated on the fly, but + this is far, far easier + + + Time last ping was sent + + + ID of last Ping sent + + + + + + + + + Current time dilation of this simulator + + + Current Frames per second of simulator + + + Current Physics frames per second of simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + Total number of objects Simulator is simulating + + + Total number of Active (Scripted) objects running + + + Number of agents currently in this simulator + + + Number of agents in neighbor simulators + + + Number of Active scripts running in this simulator + + + + + + + + + + + + Number of downloads pending + + + Number of uploads pending + + + + + + + + + Number of local uploads pending + + + Unacknowledged bytes in queue + + + A public reference to the client that this Simulator object + is attached to + + + A Unique Cache identifier for this simulator + + + The capabilities for this simulator + + + + + + The current version of software this simulator is running + + + + + + A 64x64 grid of parcel coloring values. The values stored + in this array are of the type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true if your agent has Estate Manager rights on this region + + + + + + + + + + + + Statistics information for this simulator and the + connection to the simulator, calculated by the simulator itself + and the library + + + The regions Unique ID + + + The physical data center the simulator is located + Known values are: + + Dallas + Chandler + SF + + + + + The CPU Class of the simulator + Most full mainland/estate sims appear to be 5, + Homesteads and Openspace appear to be 501 + + + The number of regions sharing the same CPU as this one + "Full Sims" appear to be 1, Homesteads appear to be 4 + + + The billing product name + Known values are: + + Mainland / Full Region (Sku: 023) + Estate / Full Region (Sku: 024) + Estate / Openspace (Sku: 027) + Estate / Homestead (Sku: 029) + Mainland / Homestead (Sku: 129) (Linden Owned) + Mainland / Linden Homes (Sku: 131) + + + + + The billing product SKU + Known values are: + + 023 Mainland / Full Region + 024 Estate / Full Region + 027 Estate / Openspace + 029 Estate / Homestead + 129 Mainland / Homestead (Linden Owned) + 131 Linden Homes / Full Region + + + + + + Flags indicating which protocols this region supports + + + + The current sequence number for packets sent to this + simulator. Must be Interlocked before modifying. Only + useful for applications manipulating sequence numbers + + + + A thread-safe dictionary containing avatars in a simulator + + + + + A thread-safe dictionary containing primitives in a simulator + + + + + Provides access to an internal thread-safe dictionary containing parcel + information found in this simulator + + + + + Provides access to an internal thread-safe multidimensional array containing a x,y grid mapped + to each 64x64 parcel's LocalID. + + + + + Checks simulator parcel map to make sure it has downloaded all data successfully + + true if map is full (contains no 0's) + + + + Is it safe to send agent updates to this sim + AgentMovementComplete message received + + + + The IP address and port of the server + + + Whether there is a working connection to the simulator or + not + + + Coarse locations of avatars in this simulator + + + AvatarPositions key representing TrackAgent target + + + Indicates if UDP connection to the sim is fully established + + + Used internally to track sim disconnections + + + Event that is triggered when the simulator successfully + establishes a connection + + + Whether this sim is currently connected or not. Hooked up + to the property Connected + + + Coarse locations of avatars in this simulator + + + AvatarPositions key representing TrackAgent target + + + Sequence numbers of packets we've received + (for duplicate checking) + + + Packets we sent out that need ACKs from the simulator + + + Sequence number for pause/resume + + + Indicates if UDP connection to the sim is fully established + + + + + + Reference to the GridClient object + IPEndPoint of the simulator + handle of the simulator + + + + Called when this Simulator object is being destroyed + + + + + Attempt to connect to this simulator + + Whether to move our agent in to this sim or not + True if the connection succeeded or connection status is + unknown, false if there was a failure + + + + Initiates connection to the simulator + + Should we block until ack for this packet is recieved + + + + Disconnect from this simulator + + + + + Instructs the simulator to stop sending update (and possibly other) packets + + + + + Instructs the simulator to resume sending update packets (unpause) + + + + + Retrieve the terrain height at a given coordinate + + Sim X coordinate, valid range is from 0 to 255 + Sim Y coordinate, valid range is from 0 to 255 + The terrain height at the given point if the + lookup was successful, otherwise 0.0f + True if the lookup was successful, otherwise false + + + + Sends a packet + + Packet to be sent + + + + + + + + + Returns Simulator Name as a String + + + + + + + + + + + + + + + + + + + Sends out pending acknowledgements + + Number of ACKs sent + + + + Resend unacknowledged packets + + + + + Simulator handle + + + + + Number of GridClients using this datapool + + + + + Time that the last client disconnected from the simulator + + + + + The cache of prims used and unused in this simulator + + + + + Shared parcel info only when POOL_PARCEL_DATA == true + + + + + + + + + The event subscribers, null of no subscribers + + + Raises the AttachedSound Event + A AttachedSoundEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + sound + + + The event subscribers, null of no subscribers + + + Raises the AttachedSoundGainChange Event + A AttachedSoundGainChangeEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the SoundTrigger Event + A SoundTriggerEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + The event subscribers, null of no subscribers + + + Raises the PreloadSound Event + A PreloadSoundEventArgs object containing + the data sent from the simulator + + + Thread sync lock object + + + Raised when the simulator sends us data containing + ... + + + + Construct a new instance of the SoundManager class, used for playing and receiving + sound assets + + A reference to the current GridClient instance + + + + Plays a sound in the current region at full volume from avatar position + + UUID of the sound to be played + + + + Plays a sound in the current region at full volume + + UUID of the sound to be played. + position for the sound to be played at. Normally the avatar. + + + + Plays a sound in the current region + + UUID of the sound to be played. + position for the sound to be played at. Normally the avatar. + volume of the sound, from 0.0 to 1.0 + + + + Plays a sound in the specified sim + + UUID of the sound to be played. + UUID of the sound to be played. + position for the sound to be played at. Normally the avatar. + volume of the sound, from 0.0 to 1.0 + + + + Play a sound asset + + UUID of the sound to be played. + handle id for the sim to be played in. + position for the sound to be played at. Normally the avatar. + volume of the sound, from 0.0 to 1.0 + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Process an incoming packet and raise the appropriate events + The sender + The EventArgs object containing the packet data + + + Provides data for the event + The event occurs when the simulator sends + the sound data which emits from an agents attachment + + The following code example shows the process to subscribe to the event + and a stub to handle the data passed from the simulator + + // Subscribe to the AttachedSound event + Client.Sound.AttachedSound += Sound_AttachedSound; + + // process the data raised in the event here + private void Sound_AttachedSound(object sender, AttachedSoundEventArgs e) + { + // ... Process AttachedSoundEventArgs here ... + } + + + + + Simulator where the event originated + + + Get the sound asset id + + + Get the ID of the owner + + + Get the ID of the Object + + + Get the volume level + + + Get the + + + + Construct a new instance of the SoundTriggerEventArgs class + + Simulator where the event originated + The sound asset id + The ID of the owner + The ID of the object + The volume level + The + + + Provides data for the event + The event occurs when an attached sound + changes its volume level + + + Simulator where the event originated + + + Get the ID of the Object + + + Get the volume level + + + + Construct a new instance of the AttachedSoundGainChangedEventArgs class + + Simulator where the event originated + The ID of the Object + The new volume level + + + Provides data for the event + The event occurs when the simulator forwards + a request made by yourself or another agent to play either an asset sound or a built in sound + + Requests to play sounds where the is not one of the built-in + will require sending a request to download the sound asset before it can be played + + + The following code example uses the , + and + properties to display some information on a sound request on the window. + + // subscribe to the event + Client.Sound.SoundTrigger += Sound_SoundTrigger; + + // play the pre-defined BELL_TING sound + Client.Sound.SendSoundTrigger(Sounds.BELL_TING); + + // handle the response data + private void Sound_SoundTrigger(object sender, SoundTriggerEventArgs e) + { + Console.WriteLine("{0} played the sound {1} at volume {2}", + e.OwnerID, e.SoundID, e.Gain); + } + + + + + Simulator where the event originated + + + Get the sound asset id + + + Get the ID of the owner + + + Get the ID of the Object + + + Get the ID of the objects parent + + + Get the volume level + + + Get the regionhandle + + + Get the source position + + + + Construct a new instance of the SoundTriggerEventArgs class + + Simulator where the event originated + The sound asset id + The ID of the owner + The ID of the object + The ID of the objects parent + The volume level + The regionhandle + The source position + + + Provides data for the event + The event occurs when the simulator sends + the appearance data for an avatar + + The following code example uses the and + properties to display the selected shape of an avatar on the window. + + // subscribe to the event + Client.Avatars.AvatarAppearance += Avatars_AvatarAppearance; + + // handle the data when the event is raised + void Avatars_AvatarAppearance(object sender, AvatarAppearanceEventArgs e) + { + Console.WriteLine("The Agent {0} is using a {1} shape.", e.AvatarID, (e.VisualParams[31] > 0) : "male" ? "female") + } + + + + + Simulator where the event originated + + + Get the sound asset id + + + Get the ID of the owner + + + Get the ID of the Object + + + + Construct a new instance of the PreloadSoundEventArgs class + + Simulator where the event originated + The sound asset id + The ID of the owner + The ID of the object + + + + pre-defined built in sounds + + + + + + + + + + + + + + + + + + + + + + + + + + + + coins + + + cash register bell + + + + + + + + + rubber + + + plastic + + + flesh + + + wood splintering? + + + glass break + + + metal clunk + + + whoosh + + + shake + + + summon + + + ding + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A dictionary containing all pre-defined sounds + + A dictionary containing the pre-defined sounds, + where the key is the sounds ID, and the value is a string + containing a name to identify the purpose of the sound + + + X position of this patch + + + Y position of this patch + + + A 16x16 array of floats holding decompressed layer data + + + + Creates a LayerData packet for compressed land data given a full + simulator heightmap and an array of indices of patches to compress + + A 256 * 256 array of floating point values + specifying the height at each meter in the simulator + Array of indexes in the 16x16 grid of patches + for this simulator. For example if 1 and 17 are specified, patches + x=1,y=0 and x=1,y=1 are sent + + + + + Add a patch of terrain to a BitPacker + + BitPacker to write the patch to + Heightmap of the simulator, must be a 256 * + 256 float array + X offset of the patch to create, valid values are + from 0 to 15 + Y offset of the patch to create, valid values are + from 0 to 15 + + + The event subscribers. null if no subcribers + + + Raises the LandPatchReceived event + A LandPatchReceivedEventArgs object containing the + data returned from the simulator + + + Thread sync lock object + + + Raised when the simulator responds sends + + + + Default constructor + + + + + Simulator from that sent tha data + + + Sim coordinate of the patch + + + Sim coordinate of the patch + + + Size of tha patch + + + Heightmap for the patch + + + + The current status of a texture request as it moves through the pipeline or final result of a texture request. + + + + The initial state given to a request. Requests in this state + are waiting for an available slot in the pipeline + + + A request that has been added to the pipeline and the request packet + has been sent to the simulator + + + A request that has received one or more packets back from the simulator + + + A request that has received all packets back from the simulator + + + A request that has taken longer than + to download OR the initial packet containing the packet information was never received + + + The texture request was aborted by request of the agent + + + The simulator replied to the request that it was not able to find the requested texture + + + + A callback fired to indicate the status or final state of the requested texture. For progressive + downloads this will fire each time new asset data is returned from the simulator. + + The indicating either Progress for textures not fully downloaded, + or the final result of the request after it has been processed through the TexturePipeline + The object containing the Assets ID, raw data + and other information. For progressive rendering the will contain + the data from the beginning of the file. For failed, aborted and timed out requests it will contain + an empty byte array. + + + + Texture request download handler, allows a configurable number of download slots which manage multiple + concurrent texture downloads from the + + This class makes full use of the internal + system for full texture downloads. + + + + A request task containing information and status of a request as it is processed through the + + + + The current which identifies the current status of the request + + + The Unique Request ID, This is also the Asset ID of the texture being requested + + + The cancellation token for the request. + + + The ImageType of the request. + + + The callback to fire when the request is complete, will include + the and the + object containing the result data + + + If true, indicates the callback will be fired whenever new data is returned from the simulator. + This is used to progressively render textures as portions of the texture are received. + + + An object that maintains the data of an request thats in-process. + + + A dictionary containing all pending and in-process transfer requests where the Key is both the RequestID + and also the Asset Texture ID, and the value is an object containing the current state of the request and also + the asset data as it is being re-assembled + + + Holds the reference to the client object + + + Maximum concurrent texture requests allowed at a time + + + The primary thread which manages the requests. + + + The cancellation token for the TexturePipeline and all child tasks. + + + true if the TexturePipeline is currently running + + + A refresh timer used to increase the priority of stalled requests + + + Current number of pending and in-process transfers + + + + Default constructor, Instantiates a new copy of the TexturePipeline class + + Reference to the instantiated object + + + + Initialize callbacks required for the TexturePipeline to operate + + + + + Shutdown the TexturePipeline and cleanup any callbacks or transfers + + + + + Request a texture asset from the simulator using the system to + manage the requests and re-assemble the image from the packets received from the simulator + + The of the texture asset to download + The of the texture asset. + Use for most textures, or for baked layer texture assets + A float indicating the requested priority for the transfer. Higher priority values tell the simulator + to prioritize the request before lower valued requests. An image already being transferred using the can have + its priority changed by resending the request with the new priority value + Number of quality layers to discard. + This controls the end marker of the data sent + The packet number to begin the request at. A value of 0 begins the request + from the start of the asset texture + The callback to fire when the image is retrieved. The callback + will contain the result of the request and the texture asset data + If true, the callback will be fired for each chunk of the downloaded image. + The callback asset parameter will contain all previously received chunks of the texture asset starting + from the beginning of the request + + + + Sends the actual request packet to the simulator + + The image to download + Type of the image to download, either a baked + avatar texture or a normal texture + Priority level of the download. Default is + 1,013,000.0f + Number of quality layers to discard. + This controls the end marker of the data sent + Packet number to start the download at. + This controls the start marker of the data sent + Sending a priority of 0 and a discardlevel of -1 aborts + download + + + + Cancel a pending or in process texture request + + The texture assets unique ID + + + + Master Download Thread, Queues up downloads in the threadpool + + + + + The worker thread that sends the request and handles timeouts + + A object containing the request details + + + + Handle responses from the simulator that tell us a texture we have requested is unable to be located + or no longer exists. This will remove the request from the pipeline and free up a slot if one is in use + + The sender + The EventArgs object containing the packet data + + + + Handles the remaining Image data that did not fit in the initial ImageData packet + + The sender + The EventArgs object containing the packet data + + + + Handle the initial ImageDataPacket sent from the simulator + + The sender + The EventArgs object containing the packet data + + + + + + + + + Initialize the UDP packet handler in server mode + + Port to listening for incoming UDP packets on + + + + Initialize the UDP packet handler in client mode + + Remote UDP server to connect to + + + + + + + + + + + + + + + + + + Size of the byte array used to store raw packet data + + + Raw packet data buffer + + + Length of the data to transmit + + + EndPoint of the remote host + + + + Create an allocated UDP packet buffer for receiving a packet + + + + + Create an allocated UDP packet buffer for sending a packet + + EndPoint of the remote host + + + + Create an allocated UDP packet buffer for sending a packet + + EndPoint of the remote host + Size of the buffer to allocate for packet data + + + + Create an allocated UDP packet buffer for sending a packet + + + + + Create an allocated UDP packet buffer for sending a packet + + EndPoint of the remote host + The actual buffer to use for packet data (no allocation). + + + + This is used to login a specific user account(s). It may only be called after + Connector initialization has completed successfully + + Handle returned from successful Connector ‘create’ request + User's account name + User's account password + Values may be “AutoAnswer” or “VerifyAnswer” + "" + This is an integer that specifies how often + the daemon will send participant property events while in a channel. If this is not set + the default will be “on state change”, which means that the events will be sent when + the participant starts talking, stops talking, is muted, is unmuted. + The valid values are: + 0 – Never + 5 – 10 times per second + 10 – 5 times per second + 50 – 1 time per second + 100 – on participant state change (this is the default) + false + + + + + This is used to logout a user session. It should only be called with a valid AccountHandle. + + Handle returned from successful Connector ‘login’ request + + + + + This is used to get a list of audio devices that can be used for capture (input) of voice. + + + + + + This is used to get a list of audio devices that can be used for render (playback) of voice. + + + + + This command is used to select the render device. + + The name of the device as returned by the Aux.GetRenderDevices command. + + + + This command is used to select the capture device. + + The name of the device as returned by the Aux.GetCaptureDevices command. + + + + This command is used to start the audio capture process which will cause + AuxAudioProperty Events to be raised. These events can be used to display a + microphone VU meter for the currently selected capture device. This command + should not be issued if the user is on a call. + + (unused but required) + + + + + This command is used to stop the audio capture process. + + + + + + This command is used to set the mic volume while in the audio tuning process. + Once an acceptable mic level is attained, the application must issue a + connector set mic volume command to have that level be used while on voice + calls. + + the microphone volume (-100 to 100 inclusive) + + + + + This command is used to set the speaker volume while in the audio tuning + process. Once an acceptable speaker level is attained, the application must + issue a connector set speaker volume command to have that level be used while + on voice calls. + + the speaker volume (-100 to 100 inclusive) + + + + + This is used to initialize and stop the Connector as a whole. The Connector + Create call must be completed successfully before any other requests are made + (typically during application initialization). The shutdown should be called + when the application is shutting down to gracefully release resources + + A string value indicting the Application name + URL for the management server + LoggingSettings + + + + + + Shutdown Connector -- Should be called when the application is shutting down + to gracefully release resources + + Handle returned from successful Connector ‘create’ request + + + + Mute or unmute the microphone + + Handle returned from successful Connector ‘create’ request + true (mute) or false (unmute) + + + + Mute or unmute the speaker + + Handle returned from successful Connector ‘create’ request + true (mute) or false (unmute) + + + + Set microphone volume + + Handle returned from successful Connector ‘create’ request + The level of the audio, a number between -100 and 100 where + 0 represents ‘normal’ speaking volume + + + + Set local speaker volume + + Handle returned from successful Connector ‘create’ request + The level of the audio, a number between -100 and 100 where + 0 represents ‘normal’ speaking volume + + + + List of audio input devices + + + + + List of audio output devices + + + + + Start up the Voice service. + + + + + Handle miscellaneous request status + + + + ///If something goes wrong, we log it. + + + + Cleanup oject resources + + + + + Request voice cap when changing regions + + + + + Handle a change in session state + + + + + Close a voice session + + + + + + Locate a Session context from its handle + + Creates the session context if it does not exist. + + + + Handle completion of main voice cap request. + + + + + + + + Daemon has started so connect to it. + + + + + The daemon TCP connection is open. + + + + + Handle creation of the Connector. + + + + + Handle response to audio output device query + + + + + Handle response to audio input device query + + + + + Set audio test mode + + + + + Set voice channel for new parcel + + + + + + Request info from a parcel capability Uri. + + + + + + Receive parcel voice cap + + + + + + + + Tell Vivox where we are standing + + This has to be called when we move or turn. + + + + Start and stop updating out position. + + + + + Enable logging + + + The folder where any logs will be created + + + This will be prepended to beginning of each log file + + + The suffix or extension to be appended to each log file + + + + 0: NONE - No logging + 1: ERROR - Log errors only + 2: WARNING - Log errors and warnings + 3: INFO - Log errors, warnings and info + 4: DEBUG - Log errors, warnings, info and debug + + + + + Constructor for default logging settings + + + + Audio Properties Events are sent after audio capture is started. These events are used to display a microphone VU meter + + + + Event for most mundane request reposnses. + + + + Response to Connector.Create request + + + Response to Aux.GetCaptureDevices request + + + Response to Aux.GetRenderDevices request + + + Audio Properties Events are sent after audio capture is started. + These events are used to display a microphone VU meter + + + Response to Account.Login request + + + This event message is sent whenever the login state of the + particular Account has transitioned from one value to another + + + + Starts a thread that keeps the daemon running + + + + + + + Stops the daemon and the thread keeping it running + + + + + + + + + + + + + Create a Session + Sessions typically represent a connection to a media session with one or more + participants. This is used to generate an ‘outbound’ call to another user or + channel. The specifics depend on the media types involved. A session handle is + required to control the local user functions within the session (or remote + users if the current account has rights to do so). Currently creating a + session automatically connects to the audio media, there is no need to call + Session.Connect at this time, this is reserved for future use. + + Handle returned from successful Connector ‘create’ request + This is the URI of the terminating point of the session (ie who/what is being called) + This is the display name of the entity being called (user or channel) + Only needs to be supplied when the target URI is password protected + This indicates the format of the password as passed in. This can either be + “ClearText” or “SHA1UserName”. If this element does not exist, it is assumed to be “ClearText”. If it is + “SHA1UserName”, the password as passed in is the SHA1 hash of the password and username concatenated together, + then base64 encoded, with the final “=” character stripped off. + + + + + + + Used to accept a call + + SessionHandle such as received from SessionNewEvent + "default" + + + + + This command is used to start the audio render process, which will then play + the passed in file through the selected audio render device. This command + should not be issued if the user is on a call. + + The fully qualified path to the sound file. + True if the file is to be played continuously and false if it is should be played once. + + + + + This command is used to stop the audio render process. + + The fully qualified path to the sound file issued in the start render command. + + + + + This is used to ‘end’ an established session (i.e. hang-up or disconnect). + + Handle returned from successful Session ‘create’ request or a SessionNewEvent + + + + + Set the combined speaking and listening position in 3D space. + + Handle returned from successful Session ‘create’ request or a SessionNewEvent + Speaking position + Listening position + + + + + Set User Volume for a particular user. Does not affect how other users hear that user. + + Handle returned from successful Session ‘create’ request or a SessionNewEvent + + The level of the audio, a number between -100 and 100 where 0 represents ‘normal’ speaking volume + + + + Positional vector of the users position + + + Velocity vector of the position + + + At Orientation (X axis) of the position + + + Up Orientation (Y axis) of the position + + + Left Orientation (Z axis) of the position + + + + Extract the avatar UUID encoded in a SIP URI + + + + + + + Represents a single Voice Session to the Vivox service. + + + + + Close this session. + + + + + Look up an existing Participants in this session + + + + + + + + + + + + + + + + + + + + + Operation to apply when applying color to texture + + + + + Information needed to translate visual param value to RGBA color + + + + + Construct VisualColorParam + + Operation to apply when applying color to texture + Colors + + + + Represents alpha blending and bump infor for a visual parameter + such as sleive length + + + + Stregth of the alpha to apply + + + File containing the alpha channel + + + Skip blending if parameter value is 0 + + + Use miltiply insted of alpha blending + + + + Create new alhpa information for a visual param + + Stregth of the alpha to apply + File containing the alpha channel + Skip blending if parameter value is 0 + Use miltiply insted of alpha blending + + + + A single visual characteristic of an avatar mesh, such as eyebrow height + + + + Index of this visual param + + + Internal name + + + Group ID this parameter belongs to + + + Name of the wearable this parameter belongs to + + + Displayable label of this characteristic + + + Displayable label for the minimum value of this characteristic + + + Displayable label for the maximum value of this characteristic + + + Default value + + + Minimum value + + + Maximum value + + + Is this param used for creation of bump layer? + + + Alpha blending/bump info + + + Color information + + + Array of param IDs that are drivers for this parameter + + + + Set all the values through the constructor + + Index of this visual param + Internal name + + + Displayable label of this characteristic + Displayable label for the minimum value of this characteristic + Displayable label for the maximum value of this characteristic + Default value + Minimum value + Maximum value + Is this param used for creation of bump layer? + Array of param IDs that are drivers for this parameter + Alpha blending/bump info + Color information + + + + Holds the Params array of all the avatar appearance parameters + + + + + + + + + + Delegate to wrap another delegate and its arguments + + + + + + + An instance of DelegateWrapper which calls InvokeWrappedDelegate, + which in turn calls the DynamicInvoke method of the wrapped + delegate + + + + + Callback used to call EndInvoke on the asynchronously + invoked DelegateWrapper + + + + + Executes the specified delegate with the specified arguments + asynchronously on a thread pool thread + + + + + + + Invokes the wrapped delegate synchronously + + + + + + + Calls EndInvoke on the wrapper and Close on the resulting WaitHandle + to prevent resource leaks + + + + + diff --git a/libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj b/libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj new file mode 100644 index 0000000..c527460 --- /dev/null +++ b/libremetaverse-core/LibreMetaverse/LibreMetaverse.csproj @@ -0,0 +1,98 @@ + + + Local + 14.0.25123 + 2.0 + {27C70F3A-0000-0000-0000-000000000000} + Debug + LibreMetaverse + JScript + Grid + IE50 + false + Library + LibreMetaverse + true + netcoreapp3.1 + Debug;Release;DockerBuild + + + True + 285212672 + False + TRACE;DEBUG + True + 4096 + False + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + True + 285212672 + False + TRACE + LibreMetaverse.XML + False + 4096 + True + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + none + Linux + false + false + false + linux-x64 + + + + + + + + + + + + + + + + + + + True + + + + + + + + + 1.2.0 + Sjofn LLC, OpenMetaverse Developers + LibreMetaverse + Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2019. All rights reserved. + LICENSE.txt + https://github.com/cinderblocks/libremetaverse + + + true + + \ No newline at end of file diff --git a/libremetaverse-core/LibreMetaverse/LibreMetaverse.nuspec b/libremetaverse-core/LibreMetaverse/LibreMetaverse.nuspec new file mode 100644 index 0000000..d4a4903 --- /dev/null +++ b/libremetaverse-core/LibreMetaverse/LibreMetaverse.nuspec @@ -0,0 +1,15 @@ + + + + LibreMetaverse + $version$ + Cinder Biscuits + Cinder Biscuits + https://github.com/cinderblocks/libremetaverse/blob/master/LICENSE.txt + https://github.com/cinderblocks/libremetaverse + false + LibreMetaverse allows your code to read and work with data send across a SecondLife, Halcyon, OpenSimulator, or related connection. + Copyright 2017 + LMV OMV OpenMetaverse OpenSim OpenSimulator Halcyon OpenMetaverseFoundation VirtualWorld Radegast SecondLife + + \ No newline at end of file diff --git a/libremetaverse-core/Libremetaverse.types/CRC32.cs b/libremetaverse-core/LibreMetaverseTypes/CRC32.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/CRC32.cs rename to libremetaverse-core/LibreMetaverseTypes/CRC32.cs diff --git a/libremetaverse-core/Libremetaverse.types/Color4.cs b/libremetaverse-core/LibreMetaverseTypes/Color4.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Color4.cs rename to libremetaverse-core/LibreMetaverseTypes/Color4.cs diff --git a/libremetaverse-core/Libremetaverse.types/DoubleDictionary.cs b/libremetaverse-core/LibreMetaverseTypes/DoubleDictionary.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/DoubleDictionary.cs rename to libremetaverse-core/LibreMetaverseTypes/DoubleDictionary.cs diff --git a/libremetaverse-core/Libremetaverse.types/Enums.cs b/libremetaverse-core/LibreMetaverseTypes/Enums.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Enums.cs rename to libremetaverse-core/LibreMetaverseTypes/Enums.cs diff --git a/libremetaverse-core/Libremetaverse.types/EnumsPrimitive.cs b/libremetaverse-core/LibreMetaverseTypes/EnumsPrimitive.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/EnumsPrimitive.cs rename to libremetaverse-core/LibreMetaverseTypes/EnumsPrimitive.cs diff --git a/libremetaverse-core/Libremetaverse.types/ExpiringCache.cs b/libremetaverse-core/LibreMetaverseTypes/ExpiringCache.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/ExpiringCache.cs rename to libremetaverse-core/LibreMetaverseTypes/ExpiringCache.cs diff --git a/libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj new file mode 100644 index 0000000..cf81120 --- /dev/null +++ b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverse.Types.csproj @@ -0,0 +1,85 @@ + + + Local + 14.0.25123 + 2.0 + {B37B02AD-0000-0000-0000-000000000000} + Debug + LibreMetaverse.Types + JScript + Grid + IE50 + false + netcoreapp3.1 + Debug;Release;DockerBuild + Library + LibreMetaverse + true + + + True + 285212672 + False + TRACE;DEBUG + True + 4096 + False + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + none + Linux + false + false + false + linux-x64 + + + True + 285212672 + False + TRACE + LibreMetaverseTypes.XML + False + 4096 + True + ..\bin\ + False + False + False + 4 + False + 1591,1574,0419 + AnyCPU + + + + + + + True + + + + + + + + + 1.2.0 + Sjofn LLC, Openmetaverse Developers + Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC. All rights reserved. + LICENSE.txt + https://github.com/cinderblocks/libremetaverse + + + true + + \ No newline at end of file diff --git a/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.XML b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.XML new file mode 100644 index 0000000..4a56938 --- /dev/null +++ b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.XML @@ -0,0 +1,2583 @@ + + + + LibreMetaverse.Types + + + + + An 8-bit color structure including an alpha channel + + + + Red + + + Green + + + Blue + + + Alpha + + + + + + + + + + + + + Builds a color from a byte array + + Byte array containing a 16 byte color + Beginning position in the byte array + True if the byte array stores inverted values, + otherwise false. For example the color black (fully opaque) inverted + would be 0xFF 0xFF 0xFF 0x00 + + + + Returns the raw bytes for this vector + + Byte array containing a 16 byte color + Beginning position in the byte array + True if the byte array stores inverted values, + otherwise false. For example the color black (fully opaque) inverted + would be 0xFF 0xFF 0xFF 0x00 + True if the alpha value is inverted in + addition to whatever the inverted parameter is. Setting inverted true + and alphaInverted true will flip the alpha value back to non-inverted, + but keep the other color bytes inverted + A 16 byte array containing R, G, B, and A + + + + Copy constructor + + Color to copy + + + + IComparable.CompareTo implementation + + Sorting ends up like this: |--Grayscale--||--Color--|. + Alpha is only used when the colors are otherwise equivalent + + + + Builds a color from a byte array + + Byte array containing a 16 byte color + Beginning position in the byte array + True if the byte array stores inverted values, + otherwise false. For example the color black (fully opaque) inverted + would be 0xFF 0xFF 0xFF 0x00 + True if the alpha value is inverted in + addition to whatever the inverted parameter is. Setting inverted true + and alphaInverted true will flip the alpha value back to non-inverted, + but keep the other color bytes inverted + + + + Writes the raw bytes for this color to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 16 bytes before the end of the array + + + + Serializes this color into four bytes in a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 4 bytes before the end of the array + True to invert the output (1.0 becomes 0 + instead of 255) + + + + Writes the raw bytes for this color to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 16 bytes before the end of the array + + + + Ensures that values are in range 0-1 + + + + + Create an RGB color from a hue, saturation, value combination + + Hue + Saturation + Value + An fully opaque RGB color (alpha is 1.0) + + + + Performs linear interpolation between two colors + + Color to start at + Color to end at + Amount to interpolate + The interpolated color + + + A Color4 with zero RGB values and fully opaque (alpha 1.0) + + + A Color4 with full RGB values (1.0) and fully opaque (alpha 1.0) + + + + Attribute class that allows extra attributes to be attached to ENUMs + + + + Text used when presenting ENUM to user + + + Default initializer + + + Text used when presenting ENUM to user + + + + The different types of grid assets + + + + Unknown asset type + + + Texture asset, stores in JPEG2000 J2C stream format + + + Sound asset + + + Calling card for another avatar + + + Link to a location in world + + + Collection of textures and parameters that can be worn by an avatar + + + Primitive that can contain textures, sounds, scripts and more + + + Notecard asset + + + Holds a collection of inventory items. "Category" in the Linden viewer + + + Linden scripting language script + + + LSO bytecode for a script + + + Uncompressed TGA texture + + + Collection of textures and shape parameters that can be worn + + + Uncompressed sound + + + Uncompressed TGA non-square image, not to be used as a texture + + + Compressed JPEG non-square image, not to be used as a texture + + + Animation + + + Sequence of animations, sounds, chat, and pauses + + + Simstate file + + + Asset is a link to another inventory item + + + Asset is a link to another inventory folder + + + Linden mesh format + + + widget? + + + Person? + + + + The different types of folder. + + + + None folder type + + + Texture folder type + + + Sound folder type + + + Calling card folder type + + + Landmark folder type + + + Clothing folder type + + + Object folder type + + + Notecard folder type + + + The root folder type + + + Non-conformant OpenSim root folder type + + + LSLText folder + + + Bodyparts folder + + + Trash folder + + + Snapshot folder + + + Lost And Found folder + + + Animation folder + + + Gesture folder + + + Favorites folder + + + Ensemble beginning range + + + Ensemble ending range + + + Current outfit folder + + + Outfit folder + + + My outfits folder + + + Mesh folder + + + Marketplace direct delivery inbox ("Received Items") + + + Marketplace direct delivery outbox + + + Basic root folder + + + Marketplace listings folder + + + Marketplace stock folder + + + Marketplace version. We *never* actually create folder of this type + + + Hypergrid Suitcase folder + + + + Inventory Item Types, eg Script, Notecard, Folder, etc + + + + Unknown + + + Texture + + + Sound + + + Calling Card + + + Landmark + + + Notecard + + + + + + Folder + + + + + + an LSL Script + + + + + + + + + + + + + + + + + + + + + + Item Sale Status + + + + Not for sale + + + The original is for sale + + + Copies are for sale + + + The contents of the object are for sale + + + + Types of wearable assets + + + + Body shape + + + Skin textures and attributes + + + Hair + + + Eyes + + + Shirt + + + Pants + + + Shoes + + + Socks + + + Jacket + + + Gloves + + + Undershirt + + + Underpants + + + Skirt + + + Alpha mask to hide parts of the avatar + + + Tattoo + + + Physics + + + Universal + + + Invalid wearable asset + + + + Identifier code for primitive types + + + + None + + + A Primitive + + + A Avatar + + + Linden grass + + + Linden tree + + + A primitive that acts as the source for a particle stream + + + A Linden tree + + + + Primary parameters for primitives such as Physics Enabled or Phantom + + + + Deprecated + + + Whether physics are enabled for this object + + + + + + + + + + + + + + + + + + + + + Whether this object contains an active touch script + + + + + + Whether this object can receive payments + + + Whether this object is phantom (no collisions) + + + + + + + + + + + + + + + Deprecated + + + + + + + + + + + + Deprecated + + + + + + + + + + + + + + + Server flag, will not be sent to clients. Specifies that + the object is destroyed when it touches a simulator edge + + + Server flag, will not be sent to clients. Specifies that + the object will be returned to the owner's inventory when it + touches a simulator edge + + + Server flag, will not be sent to clients. + + + Server flag, will not be sent to client. Specifies that + the object is hovering/flying + + + + + + + + + + + + + + + + Sound flags for sounds attached to primitives + + + + + + + + + + + + + + + + + + + + + + + + + + Material type for a primitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Used in a helper function to roughly determine prim shape + + + + + Extra parameters for primitives, these flags are for features that have + been added after the original ObjectFlags that has all eight bits + reserved already + + + + Whether this object has flexible parameters + + + Whether this object has light parameters + + + Whether this object is a sculpted prim + + + Whether this object is a light image map + + + Whether this object is a mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Attachment points for objects on avatar bodies + + + Both InventoryObject and InventoryAttachment types can be attached + + + + Right hand if object was not previously attached + + + Chest + + + Skull + + + Left shoulder + + + Right shoulder + + + Left hand + + + Right hand + + + Left foot + + + Right foot + + + Spine + + + Pelvis + + + Mouth + + + Chin + + + Left ear + + + Right ear + + + Left eyeball + + + Right eyeball + + + Nose + + + Right upper arm + + + Right forearm + + + Left upper arm + + + Left forearm + + + Right hip + + + Right upper leg + + + Right lower leg + + + Left hip + + + Left upper leg + + + Left lower leg + + + Stomach + + + Left pectoral + + + Right pectoral + + + HUD Center position 2 + + + HUD Top-right + + + HUD Top + + + HUD Top-left + + + HUD Center + + + HUD Bottom-left + + + HUD Bottom + + + HUD Bottom-right + + + Neck + + + Avatar Center + + + Left Ring Finger + + + Right Ring Finger + + + Tail Base + + + Tail Tip + + + Left Wing + + + Right Wing + + + Jaw + + + Alt Left Ear + + + Alt Right Ear + + + Alt Left Eye + + + Alt Right Eye + + + Tongue + + + Groin + + + Left Hind Foot + + + Right Hind Foot + + + + Tree foliage types + + + + Pine1 tree + + + Oak tree + + + Tropical Bush1 + + + Palm1 tree + + + Dogwood tree + + + Tropical Bush2 + + + Palm2 tree + + + Cypress1 tree + + + Cypress2 tree + + + Pine2 tree + + + Plumeria + + + Winter pinetree1 + + + Winter Aspen tree + + + Winter pinetree2 + + + Eucalyptus tree + + + Fern + + + Eelgrass + + + Sea Sword + + + Kelp1 plant + + + Beach grass + + + Kelp2 plant + + + + Grass foliage types + + + + + + + + + + + + + + + + + + + + + + + Action associated with clicking on an object + + + + Touch object + + + Sit on object + + + Purchase object or contents + + + Pay the object + + + Open task inventory + + + Play parcel media + + + Open parcel media + + + + Type of physics representation used for this prim in the simulator + + + + Use prim physics form this object + + + No physics, prim doesn't collide + + + Use convex hull represantion of this prim + + + For thread safety + + + For thread safety + + + + Purges expired objects from the cache. Called automatically by the purge timer. + + + + + Convert this matrix to euler rotations + + X euler angle + Y euler angle + Z euler angle + + + + Convert this matrix to a quaternion rotation + + A quaternion representation of this rotation matrix + + + + Construct a matrix from euler rotation values in radians + + X euler angle in radians + Y euler angle in radians + Z euler angle in radians + + + + Get a formatted string representation of the vector + + A string representation of the vector + + + A 4x4 matrix containing all zeroes + + + A 4x4 identity matrix + + + X value + + + Y value + + + Z value + + + W value + + + + Build a quaternion from normalized float values + + X value from -1.0 to 1.0 + Y value from -1.0 to 1.0 + Z value from -1.0 to 1.0 + + + + Constructor, builds a quaternion object from a byte array + + Byte array containing four four-byte floats + Offset in the byte array to start reading at + Whether the source data is normalized or + not. If this is true 12 bytes will be read, otherwise 16 bytes will + be read. + + + + Normalizes the quaternion + + + + + Builds a quaternion object from a byte array + + The source byte array + Offset in the byte array to start reading at + Whether the source data is normalized or + not. If this is true 12 bytes will be read, otherwise 16 bytes will + be read. + + + + Normalize this quaternion and serialize it to a byte array + + A 12 byte array containing normalized X, Y, and Z floating + point values in order using little endian byte ordering + + + + Writes the raw bytes for this quaternion to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 12 bytes before the end of the array + + + + Convert this quaternion to euler angles + + X euler angle + Y euler angle + Z euler angle + + + + Convert this quaternion to an angle around an axis + + Unit vector describing the axis + Angle around the axis, in radians + + + + Returns the conjugate (spatial inverse) of a quaternion + + + + + Build a quaternion from an axis and an angle of rotation around + that axis + + + + + Build a quaternion from an axis and an angle of rotation around + that axis + + Axis of rotation + Angle of rotation + + + + Creates a quaternion from a vector containing roll, pitch, and yaw + in radians + + Vector representation of the euler angles in + radians + Quaternion representation of the euler angles + + + + Creates a quaternion from roll, pitch, and yaw euler angles in + radians + + X angle in radians + Y angle in radians + Z angle in radians + Quaternion representation of the euler angles + + + + Conjugates and renormalizes a vector + + + + + Spherical linear interpolation between two quaternions + + + + + Get a string representation of the quaternion elements with up to three + decimal digits and separated by spaces only + + Raw string representation of the quaternion + + + A quaternion with a value of 0,0,0,1 + + + + A hierarchical token bucket for bandwidth throttling. See + http://en.wikipedia.org/wiki/Token_bucket for more information + + + + Parent bucket to this bucket, or null if this is a root + bucket + + + Size of the bucket in bytes. If zero, the bucket has + infinite capacity + + + Rate that the bucket fills, in bytes per millisecond. If + zero, the bucket always remains full + + + Number of tokens currently in the bucket + + + Time of the last drip, in system ticks + + + + The parent bucket of this bucket, or null if this bucket has no + parent. The parent bucket will limit the aggregate bandwidth of all + of its children buckets + + + + + Maximum burst rate in bytes per second. This is the maximum number + of tokens that can accumulate in the bucket at any one time + + + + + The speed limit of this bucket in bytes per second. This is the + number of tokens that are added to the bucket per second + + Tokens are added to the bucket any time + is called, at the granularity of + the system tick interval (typically around 15-22ms) + + + + The number of bytes that can be sent at this moment. This is the + current number of tokens in the bucket + If this bucket has a parent bucket that does not have + enough tokens for a request, will + return false regardless of the content of this bucket + + + + + Default constructor + + Parent bucket if this is a child bucket, or + null if this is a root bucket + Maximum size of the bucket in bytes, or + zero if this bucket has no maximum capacity + Rate that the bucket fills, in bytes per + second. If zero, the bucket always remains full + + + + Remove a given number of tokens from the bucket + + Number of tokens to remove from the bucket + True if the requested number of tokens were removed from + the bucket, otherwise false + + + + Remove a given number of tokens from the bucket + + Number of tokens to remove from the bucket + True if tokens were added to the bucket + during this call, otherwise false + True if the requested number of tokens were removed from + the bucket, otherwise false + + + + Add tokens to the bucket over time. The number of tokens added each + call depends on the length of time that has passed since the last + call to Drip + + True if tokens were added to the bucket, otherwise false + + + + Operating system + + + + Unknown + + + Microsoft Windows + + + Microsoft Windows CE + + + Linux + + + Apple OSX + + + + Runtime platform + + + + .NET runtime + + + Mono runtime: http://www.mono-project.com/ + + + Used for converting degrees to radians + + + Used for converting radians to degrees + + + + Provide a single instance of the CultureInfo class to help + parsing in situations where the grid assumes an en-us culture + + + + UNIX epoch in DateTime format + + + + Provide a single instance of the MD5 class to avoid making + duplicate copies and handle thread safety + + + + + Provide a single instance of the SHA-1 class to avoid + making duplicate copies and handle thread safety + + + + + Provide a single instance of a random number generator + to avoid making duplicate copies and handle thread safety + + + + + Clamp a given value between a range + + Value to clamp + Minimum allowable value + Maximum allowable value + A value inclusively between lower and upper + + + + Clamp a given value between a range + + Value to clamp + Minimum allowable value + Maximum allowable value + A value inclusively between lower and upper + + + + Clamp a given value between a range + + Value to clamp + Minimum allowable value + Maximum allowable value + A value inclusively between lower and upper + + + + Round a floating-point value to the nearest integer + + Floating point number to round + Integer + + + + Test if a single precision float is a finite number + + + + + Test if a double precision float is a finite number + + + + + Get the distance between two floating-point values + + First value + Second value + The distance between the two values + + + + Compute the MD5 hash for a byte array + + Byte array to compute the hash for + MD5 hash of the input data + + + + Compute the SHA1 hash for a byte array + + Byte array to compute the hash for + SHA1 hash of the input data + + + + Calculate the SHA1 hash of a given string + + The string to hash + The SHA1 hash as a string + + + + Compute the SHA256 hash for a byte array + + Byte array to compute the hash for + SHA256 hash of the input data + + + + Calculate the SHA256 hash of a given string + + The string to hash + The SHA256 hash as a string + + + + Calculate the MD5 hash of a given string + + The string to hash + An MD5 hash in string format, with $1$ prepended + + + + Calculate the MD5 hash of a given string + + The string to hash + The MD5 hash as a string + + + + Calculates a PBKDF2 hash of a given string + + The string to hash + The PBKDF2 hash of the supplied string + + + + Generate a random double precision floating point value + + Random value of type double + + + + Get the current running platform + + Enumeration of the current platform we are running on + + + + Get the current running runtime + + Enumeration of the current runtime we are running on + + + + Convert the first two bytes starting in the byte array in + little endian ordering to a signed short integer + + An array two bytes or longer + A signed short integer, will be zero if a short can't be + read at the given position + + + + Convert the first two bytes starting at the given position in + little endian ordering to a signed short integer + + An array two bytes or longer + Position in the array to start reading + A signed short integer, will be zero if a short can't be + read at the given position + + + + Convert the first four bytes starting at the given position in + little endian ordering to a signed integer + + An array four bytes or longer + Position to start reading the int from + A signed integer, will be zero if an int can't be read + at the given position + + + + Convert the first four bytes of the given array in little endian + ordering to a signed integer + + An array four bytes or longer + A signed integer, will be zero if the array contains + less than four bytes + + + + Convert the first eight bytes of the given array in little endian + ordering to a signed long integer + + An array eight bytes or longer + A signed long integer, will be zero if the array contains + less than eight bytes + + + + Convert the first eight bytes starting at the given position in + little endian ordering to a signed long integer + + An array eight bytes or longer + Position to start reading the long from + A signed long integer, will be zero if a long can't be read + at the given position + + + + Convert the first two bytes starting at the given position in + little endian ordering to an unsigned short + + Byte array containing the ushort + Position to start reading the ushort from + An unsigned short, will be zero if a ushort can't be read + at the given position + + + + Convert two bytes in little endian ordering to an unsigned short + + Byte array containing the ushort + An unsigned short, will be zero if a ushort can't be + read + + + + Convert the first four bytes starting at the given position in + little endian ordering to an unsigned integer + + Byte array containing the uint + Position to start reading the uint from + An unsigned integer, will be zero if a uint can't be read + at the given position + + + + Convert the first four bytes of the given array in little endian + ordering to an unsigned integer + + An array four bytes or longer + An unsigned integer, will be zero if the array contains + less than four bytes + + + + Convert the first eight bytes of the given array in little endian + ordering to an unsigned 64-bit integer + + An array eight bytes or longer + An unsigned 64-bit integer, will be zero if the array + contains less than eight bytes + + + + Convert four bytes in little endian ordering to a floating point + value + + Byte array containing a little ending floating + point value + Starting position of the floating point value in + the byte array + Single precision value + + + + Convert an integer to a byte array in little endian format + + The integer to convert + A four byte little endian array + + + + Convert an integer to a byte array in big endian format + + The integer to convert + A four byte big endian array + + + + Convert a 64-bit integer to a byte array in little endian format + + The value to convert + An 8 byte little endian array + + + + Convert a 64-bit unsigned integer to a byte array in little endian + format + + The value to convert + An 8 byte little endian array + + + + Convert a floating point value to four bytes in little endian + ordering + + A floating point value + A four byte array containing the value in little endian + ordering + + + + Converts an unsigned integer to a hexadecimal string + + An unsigned integer to convert to a string + A hexadecimal string 10 characters long + 0x7fffffff + + + + Convert a variable length UTF8 byte array to a string + + The UTF8 encoded byte array to convert + The decoded string + + + + Converts a byte array to a string containing hexadecimal characters + + The byte array to convert to a string + The name of the field to prepend to each + line of the string + A string containing hexadecimal characters on multiple + lines. Each line is prepended with the field name + + + + Converts a byte array to a string containing hexadecimal characters + + The byte array to convert to a string + Number of bytes in the array to parse + A string to prepend to each line of the hex + dump + A string containing hexadecimal characters on multiple + lines. Each line is prepended with the field name + + + + Convert a string to a UTF8 encoded byte array + + The string to convert + A null-terminated UTF8 byte array + + + + Converts a string containing hexadecimal characters to a byte array + + String containing hexadecimal characters + If true, gracefully handles null, empty and + uneven strings as well as stripping unconvertable characters + The converted byte array + + + + Returns true is c is a hexadecimal digit (A-F, a-f, 0-9) + + Character to test + true if hex digit, false if not + + + + Converts 1 or 2 character string into equivalant byte value + + 1 or 2 character string + byte + + + + Convert a float value to a byte given a minimum and maximum range + + Value to convert to a byte + Minimum value range + Maximum value range + A single byte representing the original float value + + + + Convert a byte to a float value given a minimum and maximum range + + Byte array to get the byte from + Position in the byte array the desired byte is at + Minimum value range + Maximum value range + A float value inclusively between lower and upper + + + + Convert a byte to a float value given a minimum and maximum range + + Byte to convert to a float value + Minimum value range + Maximum value range + A float value inclusively between lower and upper + + + + Attempts to parse a floating point value from a string, using an + EN-US number format + + String to parse + Resulting floating point number + True if the parse was successful, otherwise false + + + + Attempts to parse a floating point value from a string, using an + EN-US number format + + String to parse + Resulting floating point number + True if the parse was successful, otherwise false + + + + Tries to parse an unsigned 32-bit integer from a hexadecimal string + + String to parse + Resulting integer + True if the parse was successful, otherwise false + + + + Returns text specified in EnumInfo attribute of the enumerator + To add the text use [EnumInfo(Text = "Some nice text here")] before declaration + of enum values + + Enum value + Text representation of the enum + + + + Takes an AssetType and returns the string representation + + The source + The string version of the AssetType + + + + Translate a string name of an AssetType into the proper Type + + A string containing the AssetType name + The AssetType which matches the string name, or AssetType.Unknown if no match was found + + + + Takes a FolderType and returns the string representation + + The source + The string version of the FolderType + + + + Translate a string name of an FolderType into the proper Type + + A string containing the FolderType name + The FolderType which matches the string name, or FolderType. None if no match was found + + + + Convert an InventoryType to a string + + The to convert + A string representation of the source + + + + Convert a string into a valid InventoryType + + A string representation of the InventoryType to convert + A InventoryType object which matched the type + + + + Convert a SaleType to a string + + The to convert + A string representation of the source + + + + Convert a string into a valid SaleType + + A string representation of the SaleType to convert + A SaleType object which matched the type + + + + Converts a string used in LLSD to AttachmentPoint type + + String representation of AttachmentPoint to convert + AttachmentPoint enum + + + + Copy a byte array + + Byte array to copy + A copy of the given byte array + + + + Packs to 32-bit unsigned integers in to a 64-bit unsigned integer + + The left-hand (or X) value + The right-hand (or Y) value + A 64-bit integer containing the two 32-bit input values + + + + Unpacks two 32-bit unsigned integers from a 64-bit unsigned integer + + The 64-bit input integer + The left-hand (or X) output value + The right-hand (or Y) output value + + + + Convert an IP address object to an unsigned 32-bit integer + + IP address to convert + 32-bit unsigned integer holding the IP address bits + + + + Gets a unix timestamp for the current time + + An unsigned integer representing a unix timestamp for now + + + + Convert a UNIX timestamp to a native DateTime object + + An unsigned integer representing a UNIX + timestamp + A DateTime object containing the same time specified in + the given timestamp + + + + Convert a UNIX timestamp to a native DateTime object + + A signed integer representing a UNIX + timestamp + A DateTime object containing the same time specified in + the given timestamp + + + + Convert a native DateTime object to a UNIX timestamp + + A DateTime object you want to convert to a + timestamp + An unsigned integer representing a UNIX timestamp + + + + Swap two values + + Type of the values to swap + First value + Second value + + + + Try to parse an enumeration value from a string + + Enumeration type + String value to parse + Enumeration value on success + True if the parsing succeeded, otherwise false + + + + Swaps the high and low words in a byte. Converts aaaabbbb to bbbbaaaa + + Byte to swap the words in + Byte value with the words swapped + + + + Attempts to convert a string representation of a hostname or IP + address to a + + Hostname to convert to an IPAddress + Converted IP address object, or null if the conversion + failed + + + + A 128-bit Universally Unique Identifier, used throughout the Second + Life networking protocol + + + + The System.Guid object this struct wraps around + + + + Constructor that takes a string UUID representation + + A string representation of a UUID, case + insensitive and can either be hyphenated or non-hyphenated + UUID("11f8aa9c-b071-4242-836b-13b7abe0d489") + + + + Constructor that takes a System.Guid object + + A Guid object that contains the unique identifier + to be represented by this UUID + + + + Constructor that takes a byte array containing a UUID + + Byte array containing a 16 byte UUID + Beginning offset in the array + + + + Constructor that takes an unsigned 64-bit unsigned integer to + convert to a UUID + + 64-bit unsigned integer to convert to a UUID + + + + Copy constructor + + UUID to copy + + + + IComparable.CompareTo implementation + + + + + Assigns this UUID from 16 bytes out of a byte array + + Byte array containing the UUID to assign this UUID to + Starting position of the UUID in the byte array + + + + Returns a copy of the raw bytes for this UUID + + A 16 byte array containing this UUID + + + + Writes the raw bytes for this UUID to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 16 bytes before the end of the array + + + + Calculate an LLCRC (cyclic redundancy check) for this UUID + + The CRC checksum for this UUID + + + + Create a 64-bit integer representation from the second half of this UUID + + An integer created from the last eight bytes of this UUID + + + + Generate a UUID from a string + + A string representation of a UUID, case + insensitive and can either be hyphenated or non-hyphenated + UUID.Parse("11f8aa9c-b071-4242-836b-13b7abe0d489") + + + + Generate a UUID from a string + + A string representation of a UUID, case + insensitive and can either be hyphenated or non-hyphenated + Will contain the parsed UUID if successful, + otherwise null + True if the string was successfully parse, otherwise false + UUID.TryParse("11f8aa9c-b071-4242-836b-13b7abe0d489", result) + + + + Combine two UUIDs together by taking the MD5 hash of a byte array + containing both UUIDs + + First UUID to combine + Second UUID to combine + The UUID product of the combination + + + + + + UUID + + + + Slower than Random(), but generates a cryptographically secure UUID + + UUID + + + + Return a hash code for this UUID, used by .NET for hash tables + + An integer composed of all the UUID bytes XORed together + + + + Comparison function + + An object to compare to this UUID + True if the object is a UUID and both UUIDs are equal + + + + Comparison function + + UUID to compare to + True if the UUIDs are equal, otherwise false + + + + Get a hyphenated string representation of this UUID + + A string representation of this UUID, lowercase and + with hyphens + 11f8aa9c-b071-4242-836b-13b7abe0d489 + + + + Equals operator + + First UUID for comparison + Second UUID for comparison + True if the UUIDs are byte for byte equal, otherwise false + + + + Not equals operator + + First UUID for comparison + Second UUID for comparison + True if the UUIDs are not equal, otherwise true + + + + XOR operator + + First UUID + Second UUID + A UUID that is a XOR combination of the two input UUIDs + + + + String typecasting operator + + A UUID in string form. Case insensitive, + hyphenated or non-hyphenated + A UUID built from the string representation + + + An UUID with a value of all zeroes + + + A cache of UUID.Zero as a string to optimize a common path + + + + A two-dimensional vector with floating-point values + + + + X value + + + Y value + + + + Test if this vector is equal to another vector, within a given + tolerance range + + Vector to test against + The acceptable magnitude of difference + between the two vectors + True if the magnitude of difference between the two vectors + is less than the given tolerance, otherwise false + + + + Test if this vector is composed of all finite numbers + + + + + IComparable.CompareTo implementation + + + + + Builds a vector from a byte array + + Byte array containing two four-byte floats + Beginning position in the byte array + + + + Returns the raw bytes for this vector + + An eight-byte array containing X and Y + + + + Writes the raw bytes for this vector to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 8 bytes before the end of the array + + + + Parse a vector from a string + + A string representation of a 2D vector, enclosed + in arrow brackets and separated by commas + + + + Interpolates between two vectors using a cubic equation + + + + + Get a formatted string representation of the vector + + A string representation of the vector + + + + Get a string representation of the vector elements with up to three + decimal digits and separated by spaces only + + Raw string representation of the vector + + + A vector with a value of 0,0 + + + A vector with a value of 1,1 + + + A vector with a value of 1,0 + + + A vector with a value of 0,1 + + + + A three-dimensional vector with floating-point values + + + + X value + + + Y value + + + Z value + + + + Constructor, builds a vector from a byte array + + Byte array containing three four-byte floats + Beginning position in the byte array + + + + Test if this vector is equal to another vector, within a given + tolerance range + + Vector to test against + The acceptable magnitude of difference + between the two vectors + True if the magnitude of difference between the two vectors + is less than the given tolerance, otherwise false + + + + IComparable.CompareTo implementation + + + + + Test if this vector is composed of all finite numbers + + + + + Builds a vector from a byte array + + Byte array containing a 12 byte vector + Beginning position in the byte array + + + + Returns the raw bytes for this vector + + A 12 byte array containing X, Y, and Z + + + + Writes the raw bytes for this vector to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 12 bytes before the end of the array + + + + Parse a vector from a string + + A string representation of a 3D vector, enclosed + in arrow brackets and separated by commas + + + + Calculate the rotation between two vectors + + Normalized directional vector (such as 1,0,0 for forward facing) + Normalized target vector + + + + Interpolates between two vectors using a cubic equation + + + + + Get a formatted string representation of the vector + + A string representation of the vector + + + + Get a string representation of the vector elements with up to three + decimal digits and separated by spaces only + + Raw string representation of the vector + + + + Cross product between two vectors + + + + + Explicit casting for Vector3d > Vector3 + + + + + + A vector with a value of 0,0,0 + + + A vector with a value of 1,1,1 + + + A unit vector facing forward (X axis), value 1,0,0 + + + A unit vector facing left (Y axis), value 0,1,0 + + + A unit vector facing up (Z axis), value 0,0,1 + + + + A three-dimensional vector with doubleing-point values + + + + X value + + + Y value + + + Z value + + + + Constructor, builds a vector from a byte array + + Byte array containing three eight-byte doubles + Beginning position in the byte array + + + + Test if this vector is equal to another vector, within a given + tolerance range + + Vector to test against + The acceptable magnitude of difference + between the two vectors + True if the magnitude of difference between the two vectors + is less than the given tolerance, otherwise false + + + + IComparable.CompareTo implementation + + + + + Test if this vector is composed of all finite numbers + + + + + Builds a vector from a byte array + + Byte array containing a 24 byte vector + Beginning position in the byte array + + + + Returns the raw bytes for this vector + + A 24 byte array containing X, Y, and Z + + + + Writes the raw bytes for this vector to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 24 bytes before the end of the array + + + + Parse a vector from a string + + A string representation of a 3D vector, enclosed + in arrow brackets and separated by commas + + + + Interpolates between two vectors using a cubic equation + + + + + Get a formatted string representation of the vector + + A string representation of the vector + + + + Get a string representation of the vector elements with up to three + decimal digits and separated by spaces only + + Raw string representation of the vector + + + + Cross product between two vectors + + + + + Implicit casting for Vector3 > Vector3d + + + + + + A vector with a value of 0,0,0 + + + A vector with a value of 1,1,1 + + + A unit vector facing forward (X axis), value of 1,0,0 + + + A unit vector facing left (Y axis), value of 0,1,0 + + + A unit vector facing up (Z axis), value of 0,0,1 + + + X value + + + Y value + + + Z value + + + W value + + + + Constructor, builds a vector from a byte array + + Byte array containing four four-byte floats + Beginning position in the byte array + + + + Test if this vector is equal to another vector, within a given + tolerance range + + Vector to test against + The acceptable magnitude of difference + between the two vectors + True if the magnitude of difference between the two vectors + is less than the given tolerance, otherwise false + + + + IComparable.CompareTo implementation + + + + + Test if this vector is composed of all finite numbers + + + + + Builds a vector from a byte array + + Byte array containing a 16 byte vector + Beginning position in the byte array + + + + Returns the raw bytes for this vector + + A 16 byte array containing X, Y, Z, and W + + + + Writes the raw bytes for this vector to a byte array + + Destination byte array + Position in the destination array to start + writing. Must be at least 16 bytes before the end of the array + + + + Get a string representation of the vector elements with up to three + decimal digits and separated by spaces only + + Raw string representation of the vector + + + A vector with a value of 0,0,0,0 + + + A vector with a value of 1,1,1,1 + + + A vector with a value of 1,0,0,0 + + + A vector with a value of 0,1,0,0 + + + A vector with a value of 0,0,1,0 + + + A vector with a value of 0,0,0,1 + + + diff --git a/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.nuspec b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.nuspec new file mode 100644 index 0000000..2d87b09 --- /dev/null +++ b/libremetaverse-core/LibreMetaverseTypes/LibreMetaverseTypes.nuspec @@ -0,0 +1,15 @@ + + + + LibreMetaverse.Types + $version$ + Cinder Biscuits + Cinder Biscuits + https://github.com/cinderblocks/libremetaverse/blob/master/LICENSE.txt + https://github.com/cinderblocks/libremetaverse + false + LibreMetaverse type library + Copyright 2017 + LMV OMV OpenMetaverse OpenSim Halcyon OpenMetaverseFoundation VirtualWorld Radegast SecondLife + + \ No newline at end of file diff --git a/libremetaverse-core/Libremetaverse.types/Matrix4.cs b/libremetaverse-core/LibreMetaverseTypes/Matrix4.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Matrix4.cs rename to libremetaverse-core/LibreMetaverseTypes/Matrix4.cs diff --git a/libremetaverse-core/Libremetaverse.types/Quaternion.cs b/libremetaverse-core/LibreMetaverseTypes/Quaternion.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Quaternion.cs rename to libremetaverse-core/LibreMetaverseTypes/Quaternion.cs diff --git a/libremetaverse-core/Libremetaverse.types/ThreadSafeDictionary.cs b/libremetaverse-core/LibreMetaverseTypes/ThreadSafeDictionary.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/ThreadSafeDictionary.cs rename to libremetaverse-core/LibreMetaverseTypes/ThreadSafeDictionary.cs diff --git a/libremetaverse-core/Libremetaverse.types/TokenBucket.cs b/libremetaverse-core/LibreMetaverseTypes/TokenBucket.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/TokenBucket.cs rename to libremetaverse-core/LibreMetaverseTypes/TokenBucket.cs diff --git a/libremetaverse-core/Libremetaverse.types/UUID.cs b/libremetaverse-core/LibreMetaverseTypes/UUID.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/UUID.cs rename to libremetaverse-core/LibreMetaverseTypes/UUID.cs diff --git a/libremetaverse-core/Libremetaverse.types/Utils.cs b/libremetaverse-core/LibreMetaverseTypes/Utils.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Utils.cs rename to libremetaverse-core/LibreMetaverseTypes/Utils.cs diff --git a/libremetaverse-core/Libremetaverse.types/UtilsConversions.cs b/libremetaverse-core/LibreMetaverseTypes/UtilsConversions.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/UtilsConversions.cs rename to libremetaverse-core/LibreMetaverseTypes/UtilsConversions.cs diff --git a/libremetaverse-core/Libremetaverse.types/Vector2.cs b/libremetaverse-core/LibreMetaverseTypes/Vector2.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Vector2.cs rename to libremetaverse-core/LibreMetaverseTypes/Vector2.cs diff --git a/libremetaverse-core/Libremetaverse.types/Vector3.cs b/libremetaverse-core/LibreMetaverseTypes/Vector3.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Vector3.cs rename to libremetaverse-core/LibreMetaverseTypes/Vector3.cs diff --git a/libremetaverse-core/Libremetaverse.types/Vector3d.cs b/libremetaverse-core/LibreMetaverseTypes/Vector3d.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Vector3d.cs rename to libremetaverse-core/LibreMetaverseTypes/Vector3d.cs diff --git a/libremetaverse-core/Libremetaverse.types/Vector4.cs b/libremetaverse-core/LibreMetaverseTypes/Vector4.cs similarity index 100% rename from libremetaverse-core/Libremetaverse.types/Vector4.cs rename to libremetaverse-core/LibreMetaverseTypes/Vector4.cs diff --git a/libremetaverse-core/Libremetaverse.structureddata/LibreMetaverse-core.StructuredData.csproj b/libremetaverse-core/Libremetaverse.structureddata/LibreMetaverse-core.StructuredData.csproj deleted file mode 100644 index ceca150..0000000 --- a/libremetaverse-core/Libremetaverse.structureddata/LibreMetaverse-core.StructuredData.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - True - netcoreapp3.1 - Debug;Release;DockerBuild - x64 - LICENSE.txt - see LibreMetaverse-core - false - 1.0.3 - https://github.com/Madpeterz/libremetaverse-core - https://github.com/Madpeterz/libremetaverse-core - git - 1.0.3.0 - - - none - Linux - false - false - false - linux-x64 - - - - - - - True - - - - \ No newline at end of file diff --git a/libremetaverse-core/Libremetaverse.types/LibreMetaverse-core.Types.csproj b/libremetaverse-core/Libremetaverse.types/LibreMetaverse-core.Types.csproj deleted file mode 100644 index 691a94c..0000000 --- a/libremetaverse-core/Libremetaverse.types/LibreMetaverse-core.Types.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - True - netcoreapp3.1 - Debug;Release;DockerBuild - x64 - false - see LibreMetaverse-core - LICENSE.txt - https://github.com/Madpeterz/libremetaverse-core - https://github.com/Madpeterz/libremetaverse-core - git - 1.0.3.0 - 1.0.3.0 - 1.0.3 - - - none - Linux - false - false - false - linux-x64 - - - - True - - - - \ No newline at end of file diff --git a/libremetaverse-core/Libremetaverse/Imaging/BakeLayer.cs b/libremetaverse-core/Libremetaverse/Imaging/BakeLayer.cs index 654a700..24677f6 100644 --- a/libremetaverse-core/Libremetaverse/Imaging/BakeLayer.cs +++ b/libremetaverse-core/Libremetaverse/Imaging/BakeLayer.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.IO; using System.Drawing; using OpenMetaverse.Assets; +using log4net; namespace OpenMetaverse.Imaging { @@ -39,6 +40,7 @@ namespace OpenMetaverse.Imaging /// public class Baker { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); #region Properties /// Final baked texture public AssetTexture BakedTexture => bakedTexture; @@ -331,6 +333,7 @@ namespace OpenMetaverse.Imaging } // Apply any alpha wearable textures to make parts of the avatar disappear + m_log.DebugFormat("[XBakes]: Number of alpha wearable textures: {0}", alphaWearableTextures.Count); foreach (ManagedImage img in alphaWearableTextures) AddAlpha(bakedTexture.Image, img); diff --git a/libremetaverse-core/Libremetaverse/Imaging/TGALoader.cs b/libremetaverse-core/Libremetaverse/Imaging/TGALoader.cs index c9ead91..dd309bb 100644 --- a/libremetaverse-core/Libremetaverse/Imaging/TGALoader.cs +++ b/libremetaverse-core/Libremetaverse/Imaging/TGALoader.cs @@ -628,9 +628,8 @@ namespace OpenMetaverse.Imaging { return LoadTGA(f); } - } - return null; + return null; // file stream error } catch (System.IO.DirectoryNotFoundException) { diff --git a/libremetaverse-core/Libremetaverse/InventoryAISClient.cs b/libremetaverse-core/Libremetaverse/InventoryAISClient.cs index e255364..96dedc2 100644 --- a/libremetaverse-core/Libremetaverse/InventoryAISClient.cs +++ b/libremetaverse-core/Libremetaverse/InventoryAISClient.cs @@ -20,16 +20,11 @@ namespace LibreMetaverse [NonSerialized] private readonly GridClient Client; - private static HttpClient httpClient; + private static readonly HttpClient httpClient = new HttpClient(); public InventoryAISClient(GridClient client) { Client = client; - - HttpClientHandler clientHandler = new HttpClientHandler(); - clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }; - httpClient = new HttpClient(clientHandler); - httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Add("User-Agent", "LibreMetaverse AIS Client"); } diff --git a/libremetaverse-core/Libremetaverse/InventoryManager.cs b/libremetaverse-core/Libremetaverse/InventoryManager.cs index f25ddc7..90521ec 100644 --- a/libremetaverse-core/Libremetaverse/InventoryManager.cs +++ b/libremetaverse-core/Libremetaverse/InventoryManager.cs @@ -685,7 +685,6 @@ namespace OpenMetaverse List load_items = new List(); List owner_ids = new List(); - if (objects != null) { foreach (InventoryBase o in objects) diff --git a/libremetaverse-core/Libremetaverse/LibreMetaverse-core.csproj b/libremetaverse-core/Libremetaverse/LibreMetaverse-core.csproj deleted file mode 100644 index 0603d15..0000000 --- a/libremetaverse-core/Libremetaverse/LibreMetaverse-core.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - True - netcoreapp3.1 - Debug;Release;DockerBuild - x64 - false - LICENSE.txt - .net core targeted version of the LibreMetaverse project - https://github.com/Madpeterz/libremetaverse-core - https://github.com/Madpeterz/libremetaverse-core - git - 1.0.3 - 1.0.3.0 - - - none - Linux - false - false - false - linux-x64 - - - - - - - Always - - - - - - - - - - - - - - - True - - - - - - Always - - - Always - - - Always - - - Always - - - \ No newline at end of file diff --git a/libremetaverse-core/Libremetaverse/LibreMetaverse-core.nuspec b/libremetaverse-core/Libremetaverse/LibreMetaverse-core.nuspec deleted file mode 100644 index be54ca9..0000000 --- a/libremetaverse-core/Libremetaverse/LibreMetaverse-core.nuspec +++ /dev/null @@ -1,15 +0,0 @@ - - - - LibreMetaverse-core - $version$ - Madpeterz - Madpeterz - https://github.com/Madpeterz/libremetaverse-core/blob/master/LICENSE.txt - https://github.com/Madpeterz/libremetaverse-core - false - A port of LibreMetaverse to .net core cleaned up - Copyright 2020 - SecondLife Docker Linux Windows Secondbot CLI - - diff --git a/libremetaverse-core/Libremetaverse/Logger.cs b/libremetaverse-core/Libremetaverse/Logger.cs index c58f490..eb1cb46 100644 --- a/libremetaverse-core/Libremetaverse/Logger.cs +++ b/libremetaverse-core/Libremetaverse/Logger.cs @@ -1,209 +1,188 @@ +/* + * Copyright (c) 2006-2016, openmetaverse.co + * All rights reserved. + * + * - Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * - Neither the name of the openmetaverse.co nor the names + * of its contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + using System; -using System.Text; +using System.Reflection; +using log4net; +using log4net.Appender; +using log4net.Config; + +[assembly: XmlConfigurator(Watch = true)] namespace OpenMetaverse { - public abstract class LogWriter - { - public static void LogMessage(StringBuilder messageBuilder, Helpers.LogLevel Level) - { - var date = DateTime.Now; - string Message = messageBuilder.ToString(); - messageBuilder.Clear(); - messageBuilder.Append("["); - if (date.Hour < 10) messageBuilder.Append("0"); - messageBuilder.Append(date.Hour.ToString()); - messageBuilder.Append(":"); - if (date.Minute < 10) messageBuilder.Append("0"); - messageBuilder.Append(date.Minute.ToString()); - messageBuilder.Append("] "); - switch (Level) - { - case Helpers.LogLevel.Debug: - { - messageBuilder.Append("Debug - "); - break; - } - case Helpers.LogLevel.Info: - { - messageBuilder.Append("Status - "); - break; - } - case Helpers.LogLevel.Warning: - { - messageBuilder.Append("Warn - "); - break; - } - case Helpers.LogLevel.Error: - { - messageBuilder.Append("Error - "); - break; - } - default: - break; - } - messageBuilder.Append(Message); - WriteMessage(Message); - } - protected static void WriteMessage(string message) - { - - } - } - public class NoLogWriter : LogWriter - { - } - public class ConsoleWriter : LogWriter - { - public new static void WriteMessage(string message) - { - Console.WriteLine(message); - } - } - + /// + /// Singleton logging class for the entire library + /// public static class Logger { - // Warn,Error,Log,Debug functions - #region Message only methods without Levels - public static void Warn(string message) - { - Log(message, Helpers.LogLevel.Warning); - } - public static void Error(string message) - { - Log(message, Helpers.LogLevel.Error); - } - public static void Info(string message) - { - Log(message, Helpers.LogLevel.Info); - } - public static void DebugLog(string message) - { - Log(message, Helpers.LogLevel.Debug); - } - #endregion - #region Message+Exception without levels - public static void Warn(string message, Exception e) - { - Log(message, Helpers.LogLevel.Warning, null, e); - } - public static void Error(string message, Exception e) - { - Log(message, Helpers.LogLevel.Error, null, e); - } - public static void Info(string message, Exception e) - { - Log(message, Helpers.LogLevel.Info, null, e); - } - public static void DebugLog(string message, Exception e) - { - Log(message, Helpers.LogLevel.Debug, null, e); - } - #endregion - #region Message+Client without levels - public static void Warn(string message, GridClient client) - { - Log(message, Helpers.LogLevel.Warning, client); - } - public static void Error(string message, GridClient client) - { - Log(message, Helpers.LogLevel.Error, client); - } - public static void Info(string message, GridClient client) - { - Log(message, Helpers.LogLevel.Info, client); - } - public static void DebugLog(string message, GridClient client) - { - Log(message, Helpers.LogLevel.Debug, client); - } - #endregion - #region Message+Client+Exeption without levels [Anything else call Log Directly] - public static void Warn(string message, GridClient client, Exception exception) - { - Log(message, Helpers.LogLevel.Warning, client, exception); - } - public static void Error(string message, GridClient client, Exception exception) - { - Log(message, Helpers.LogLevel.Error, client, exception); - } - public static void Info(string message, GridClient client, Exception exception) - { - Log(message, Helpers.LogLevel.Info, client, exception); - } - public static void DebugLog(string message, GridClient client, Exception exception) - { - Log(message, Helpers.LogLevel.Debug, client, exception); - } - #endregion + /// + /// Callback used for client apps to receive log messages from + /// the library + /// + /// Data being logged + /// The severity of the log entry from + public delegate void LogCallback(object message, Helpers.LogLevel level); - public static void Log(string message, Helpers.LogLevel Level, GridClient client, Exception exception) + /// Triggered whenever a message is logged. If this is left + /// null, log messages will go to the console + public static event LogCallback OnLogMessage; + + /// log4net logging engine + public static ILog LogInstance; + + /// + /// Default constructor + /// + static Logger() { - Helpers.LogLevel UseLevel = Helpers.LogLevel.Info; - string useWriter = "Console"; - - if (client != null) + LogInstance = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + // If error level reporting isn't enabled we assume no logger is configured and initialize a default + // ConsoleAppender + if (!LogInstance.Logger.IsEnabledFor(log4net.Core.Level.Error)) { - UseLevel = client.Settings.LOG_LEVEL; - useWriter = client.Settings.LOG_WRITER; - } - if (UseLevel >= Level) - { - StringBuilder NewMessage = new StringBuilder(); - if (client != null) + IAppender appender = new ConsoleAppender { - if (client.Settings.LOG_NAMES) - { - NewMessage.Append("{"); - NewMessage.Append(client.Self.Name); - NewMessage.Append("} "); - } - } - NewMessage.Append(message); - switch (useWriter) - { - case "NoLogWriter": - { - break; - } - default: - { - ConsoleWriter.LogMessage(NewMessage, Level); - break; - } - } + Layout = new log4net.Layout.PatternLayout("%timestamp [%thread] %-5level - %message%newline") + }; + BasicConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), appender); + + if(Settings.LOG_LEVEL != Helpers.LogLevel.None) + LogInstance.Info("No log configuration found, defaulting to console logging"); } } - public static void LogFormat(string Message, Helpers.LogLevel Level, int Value) + + /// + /// Send a log message to the logging engine + /// + /// The log message + /// The severity of the log entry + public static void Log(object message, Helpers.LogLevel level) { - LogFormat(Message, new[] { Value.ToString() }); - } - public static void LogFormat(string Message, string[] Values) - { - LogFormat(Message, Helpers.LogLevel.Debug, Values); - } - public static void LogFormat(string Message, Helpers.LogLevel Level, string[] Values) - { - Log(String.Format(Message, Values), Level); + Log(message, level, null, null); } - #region Log overloads - public static void Log(string message) + /// + /// Send a log message to the logging engine + /// + /// The log message + /// The severity of the log entry + /// Instance of the client + public static void Log(object message, Helpers.LogLevel level, GridClient client) { - Log(message, Helpers.LogLevel.Debug); + Log(message, level, client, null); } - public static void Log(string message, Helpers.LogLevel Level) + + /// + /// Send a log message to the logging engine + /// + /// The log message + /// The severity of the log entry + /// Exception that was raised + public static void Log(object message, Helpers.LogLevel level, Exception exception) { - Log(message, Level, null, null); + Log(message, level, null, exception); } - public static void Log(string message, Helpers.LogLevel Level, GridClient client) + + /// + /// Send a log message to the logging engine + /// + /// The log message + /// The severity of the log entry + /// Instance of the client + /// Exception that was raised + public static void Log(object message, Helpers.LogLevel level, GridClient client, Exception exception) { - Log(message, Level, null, null); + if (client != null && client.Settings.LOG_NAMES) + message = $"<{client.Self.Name}>: {message}"; + + OnLogMessage?.Invoke(message, level); + + switch (level) + { + case Helpers.LogLevel.Debug: + if (Settings.LOG_LEVEL == Helpers.LogLevel.Debug) + LogInstance.Debug(message, exception); + break; + case Helpers.LogLevel.Info: + if (Settings.LOG_LEVEL == Helpers.LogLevel.Debug + || Settings.LOG_LEVEL == Helpers.LogLevel.Info) + LogInstance.Info(message, exception); + break; + case Helpers.LogLevel.Warning: + if (Settings.LOG_LEVEL == Helpers.LogLevel.Debug + || Settings.LOG_LEVEL == Helpers.LogLevel.Info + || Settings.LOG_LEVEL == Helpers.LogLevel.Warning) + LogInstance.Warn(message, exception); + break; + case Helpers.LogLevel.Error: + if (Settings.LOG_LEVEL == Helpers.LogLevel.Debug + || Settings.LOG_LEVEL == Helpers.LogLevel.Info + || Settings.LOG_LEVEL == Helpers.LogLevel.Warning + || Settings.LOG_LEVEL == Helpers.LogLevel.Error) + LogInstance.Error(message, exception); + break; + default: + break; + } } - public static void Log(string message, Helpers.LogLevel Level, Exception exception) + + /// + /// If the library is compiled with DEBUG defined, an event will be + /// fired if an OnLogMessage handler is registered and the + /// message will be sent to the logging engine + /// + /// The message to log at the DEBUG level to the + /// current logging engine + public static void DebugLog(object message) { - Log(message, Level, null, exception); + DebugLog(message, null); + } + + /// + /// If the library is compiled with DEBUG defined and + /// GridClient.Settings.DEBUG is true, an event will be + /// fired if an OnLogMessage handler is registered and the + /// message will be sent to the logging engine + /// + /// The message to log at the DEBUG level to the + /// current logging engine + /// Instance of the client + [System.Diagnostics.Conditional("DEBUG")] + public static void DebugLog(object message, GridClient client) + { + if (Settings.LOG_LEVEL != Helpers.LogLevel.Debug) return; + + if (client != null && client.Settings.LOG_NAMES) + message = $"<{client.Self.Name}>: {message}"; + + OnLogMessage?.Invoke(message, Helpers.LogLevel.Debug); + + LogInstance.Debug(message); } - #endregion } -} \ No newline at end of file +} diff --git a/libremetaverse-core/Libremetaverse/ObjectManager.cs b/libremetaverse-core/Libremetaverse/ObjectManager.cs index 572fc64..f6829f4 100644 --- a/libremetaverse-core/Libremetaverse/ObjectManager.cs +++ b/libremetaverse-core/Libremetaverse/ObjectManager.cs @@ -2624,7 +2624,7 @@ namespace OpenMetaverse catch (IndexOutOfRangeException ex) { Logger.Log("Error decoding an ObjectUpdateCompressed packet", Helpers.LogLevel.Warning, Client, ex); - Logger.Log(block.ToString(), Helpers.LogLevel.Warning); + Logger.Log(block, Helpers.LogLevel.Warning); } } } diff --git a/libremetaverse-core/Libremetaverse/Settings.cs b/libremetaverse-core/Libremetaverse/Settings.cs index 55843cf..d1a2613 100644 --- a/libremetaverse-core/Libremetaverse/Settings.cs +++ b/libremetaverse-core/Libremetaverse/Settings.cs @@ -340,15 +340,27 @@ namespace OpenMetaverse #region Logging Configuration - public string LOG_WRITER = "Console"; + /// + /// Get or set the minimum log level to output to the console by default + /// + /// If the library is not compiled with DEBUG defined and this level is set to DEBUG + /// You will get no output on the console. This behavior can be overriden by creating + /// a logger configuration file for log4net + /// + public static Helpers.LogLevel LOG_LEVEL = Helpers.LogLevel.None; + + /// Attach avatar names to log messages public bool LOG_NAMES = true; - public bool LOG_DISKCACHE = false; - public bool LOG_RESENDS = false; - public Helpers.LogLevel LOG_LEVEL = Helpers.LogLevel.Info; - + + /// Log packet retransmission info + public bool LOG_RESENDS = true; + + /// Log disk cache misses and other info + public bool LOG_DISKCACHE = true; + #endregion #region Private Fields - + private GridClient Client; private int priceUpload = 0; public static bool SORT_INVENTORY = false; @@ -375,6 +387,5 @@ namespace OpenMetaverse } #endregion - } } diff --git a/libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so b/libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1-i686.so deleted file mode 100644 index 193eca4b34eca3e82ea4fa8773f13adbccd7f86f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140028 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 TOe#!|NWeEDmf|j{oeom|LeQ{ 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¬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
|gUNS)nvNgdl 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%0AD+`16`)#^GX=e&hpy4z@~4D;;!ATX+DJeXMSl~ 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 U*drml`O|e?@wGUK_sPEg4Jl{knE(I) diff --git a/libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib b/libremetaverse-core/Libremetaverse/libopenjpeg-dotnet-2-1.5.0-dotnet-1.dylib deleted file mode 100644 index 91f7264fdba36cdeed9846718a95c9ca111e5bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130560 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 diff --git a/libremetaverse-core/Libremetaverse/openjpeg-dotnet-x86_64.dll b/libremetaverse-core/Libremetaverse/openjpeg-dotnet-x86_64.dll deleted file mode 100644 index 9e8cd21507bbf9eed60af9d664f166ac9b6ee1f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215040 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 t!vjfmVKD9v&=*yr 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 z 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�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�t&S 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

(ioPEbpZ->4)VHSn?eyKA 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%0A9w^9Q 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

NWNwD4vH6Hrgy)A}nvulatH^V3xCrZEv~ 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 SuYvm-xUYfx8u*uJ;6DJBJgk8L diff --git a/libremetaverse-core/libremetaverse-core.sln b/libremetaverse-core/libremetaverse-core.sln deleted file mode 100644 index d660f89..0000000 --- a/libremetaverse-core/libremetaverse-core.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30011.22 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core", "Libremetaverse\LibreMetaverse-core.csproj", "{21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core.StructuredData", "Libremetaverse.structureddata\LibreMetaverse-core.StructuredData.csproj", "{2AB39AF8-5296-44D9-8E25-595950D112E4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse-core.Types", "Libremetaverse.types\LibreMetaverse-core.Types.csproj", "{65583D32-5492-494E-9137-E288CB713167}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - DockerBuild|x64 = DockerBuild|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.Debug|x64.ActiveCfg = Debug|x64 - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.Debug|x64.Build.0 = Debug|x64 - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.Release|x64.ActiveCfg = Release|x64 - {21DA0F7B-FF4F-41AC-90EF-4A49A26AAC14}.Release|x64.Build.0 = Release|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.Debug|x64.ActiveCfg = Debug|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.Debug|x64.Build.0 = Debug|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.Release|x64.ActiveCfg = Release|x64 - {2AB39AF8-5296-44D9-8E25-595950D112E4}.Release|x64.Build.0 = Release|x64 - {65583D32-5492-494E-9137-E288CB713167}.Debug|x64.ActiveCfg = Debug|x64 - {65583D32-5492-494E-9137-E288CB713167}.Debug|x64.Build.0 = Debug|x64 - {65583D32-5492-494E-9137-E288CB713167}.DockerBuild|x64.ActiveCfg = DockerBuild|x64 - {65583D32-5492-494E-9137-E288CB713167}.DockerBuild|x64.Build.0 = DockerBuild|x64 - {65583D32-5492-494E-9137-E288CB713167}.Release|x64.ActiveCfg = Release|x64 - {65583D32-5492-494E-9137-E288CB713167}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0939E3DD-583A-454E-BF78-F9D77F907B6E} - EndGlobalSection -EndGlobal