diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 000000000..5568b5d67
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,80 @@
+init:
+ - ps: if ($env:APPVEYOR_REPO_TAG -eq "true") { $env:TAG_VERSION = "$env:APPVEYOR_REPO_TAG_NAME.$env:APPVEYOR_BUILD_NUMBER" } else { $env:TAG_VERSION = "v3.0.$env:APPVEYOR_BUILD_NUMBER" }
+ - ps: $env:TAG_VERSION = $env:TAG_VERSION -replace 'v',''
+ - ps: Write-Host "Setting version to '$env:TAG_VERSION'"
+ - ps: Update-AppveyorBuild -Version "$env:TAG_VERSION"
+
+environment:
+ matrix:
+ - job_name: Windows x64 Build
+ platform: x64
+ appveyor_build_worker_image: Visual Studio 2019
+ configuration: ReleaseWindows
+ - job_name: Windows x86 Build
+ platform: x86
+ appveyor_build_worker_image: Visual Studio 2019
+ configuration: ReleaseWindows
+
+ BugsplatDatabase: sjofnllc
+ PfxDownloadUrl:
+ secure: T8uKu+tTR2G7LDE1zPGNOi+prl4YaKXP6DOC5eU6A14FEQkd8PFR3nQ1WMwryphJ
+ PfxDownloadPasswd:
+ secure: nAIqrjhaoamhiuAcae/xNw==
+ PfxPassword:
+ secure: +vWSGzLkiBGVIxfPb+iRtD+/maQjI2d92hN4PoNAxMc=
+
+branches:
+ except:
+ - localbuilding
+
+pull_requests:
+ do_not_increment_build_number: true
+
+build:
+ project: radegast.sln
+ parallel: true
+ verbosity: minimal
+
+cache:
+ - packages -> **\packages.config
+ - '%LocalAppData%\NuGet\Cache'
+
+dotnet_csproj:
+ patch: true
+ file: '**\*.csproj;**\*.props'
+ version: '{version}'
+ assembly_version: '{version}'
+ file_version: '{version}'
+
+before_build:
+ - nuget restore radegast.sln
+ - ps: util/InstallRemotePfx.ps1 -PfxDownloadUrl $env:PfxDownloadUrl -PfxDownloadUser AppVeyor -PfxDownloadPasswd $env:PfxDownloadPasswd -PfxPasswd $env:PfxPassword
+
+after_build:
+ - ps: New-Item -ItemType directory -Path .\$env:PLATFORM
+ - cmd: '7z a -ttar -so Radegast-%TAG_VERSION%.tar %APPVEYOR_BUILD_FOLDER%\bin\Release\ | 7z a -si Radegast_%PLATFORM%-%TAG_VERSION%.tbz'
+ - ps: Copy-Item bin\Release\RadegastSetup_$env:PLATFORM.msi RadegastSetup_$env:PLATFORM-$env:TAG_VERSION.msi
+ - ps: Copy-Item bin\Release\RadegastBundle_$env:PLATFORM.exe RadegastSetup_$env:PLATFORM-$env:TAG_VERSION.exe
+
+artifacts:
+ - path: 'RadegastSetup*.exe'
+ name: 'Radegast Windows x64 Bundle'
+ type: Auto
+ - path: 'RadegastSetup*.msi'
+ name: 'Radegast Windows x64 MSI'
+ type: Auto
+ - path: 'Radegast*.tbz'
+ name: 'Radegast Linux x64'
+ type: Auto
+ - path: 'RadegastSetup*.exe'
+ name: 'Radegast Windows x86 Bundle'
+ type: Auto
+ - path: 'RadegastSetup*.msi'
+ name: 'Radegast Windows x86 MSI'
+ type: Auto
+ - path: 'Radegast-*.tbz'
+ name: 'Radegast Linux x86'
+ type: Auto
+ - path: 'bin\Release\Radegast.pdb'
+ name: 'Radegast symbols'
+ type: Auto
diff --git a/.gitignore b/.gitignore
index 942751b06..0eb4ea55d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,12 +2,17 @@
*.suo
bin
obj
+packages
compile.bat
-*.sln
*.sln.cache
-*.csproj
*.bak
*.resources
*~
*.userprefs
-.vs
\ No newline at end of file
+.vs
+.idea
+libremetaverse/
+sparkle/
+Radegast/Generated/
+ProductInstallFiles.wxs
+.DS_Store
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 3269b371c..000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "libopenmetaverse"]
- path = libopenmetaverse
- url = https://github.com/openmetaversefoundation/libopenmetaverse.git
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3f76ddb24..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-language: csharp
-solution: Radegast.sln
-
-os:
- - linux
-
-branches:
- except:
- - /^build-/
-
-install:
- - "export BUILD_MAJOR=2"
- - "export BUILD_MINOR=19"
- - "export GIT_TAG=build-$BUILD_MAJOR.$BUILD_MINOR.$TRAVIS_BUILD_NUMBER-$TRAVIS_OS_NAME-$TRAVIS_BRANCH-$(date -u '+%Y-%m-%d')"
- - "export GIT_ARTIFACT=Radegast-$GIT_TAG.zip"
- - "./ci/install.sh"
-
-before_deploy:
- - "./ci/before_deploy.sh"
-
-deploy:
- provider: releases
- api_key:
- secure: wDIvmLG2B0wA4Ngp+avp1qQOU3lpUIC79C/iEo/BDNA4TQJLeAvYrQ7mXVjXrSP41LCB9aWmjjlTJk8nRbEcTWwiYTRDPRqvxo32/BPsW6zaBrqHGP1dF3R8L/KtVRf97iNJJRXWHZssNYsuakBKTHp6dPt68qU6k3cig7aiVH/qTwawYpI9/qtUUdfuN3h9/PciujyAr/XBpTzS7xLHsHShchMpgEVhGqtjd+yR2z0qojNs645Iit7lZOMrtjuqNLjxXS3WLbWVHT22upX+00ovlJXT6fUtkHKWuAW3hSEN525/I8bl7NExLpy9yOUa/D1JALBgrd2qxhsECJ+sJ9ms59iQxYJOOpfuk6KIjmtD+i4f6h2rSOjOtbc1dUvA9+SH27o00DPjFQKPA0lLqEPGBxdlFE0ocOHI2UW1wvTRSAUhJe6QLLatVLJl5TfcDOsM7JC29XeuHXL1wHFRqEq8agpdR8UqueaDkfAWVPXQRywVD/aUFrMMJEfxTncVhRXepLL3z2uHwjpRaw5JJ7hsU5eaEEvIRMzR73IOCHlfmqCtjE7bMVmO9Zn0BjGJURHCk77I395QLWnCOuMShWm1OnH5Klxjehlgqtpdhaj83OgsnE7/sXsMPaqxwtzusTRsRYmJz/4D5B7/TPVNDzK2Xewr0NKEBmY3n/MnAqc=
- skip_cleanup: true
- file: $GIT_ARTIFACT
- on:
- repo: nooperation/radegast
- all_branches: true
-
-env:
- global:
- secure: u7t+c2187aIGA/Kn/DV1/4kjJ/BmQ6/x5AKAbqdFy7R8xdY2ohOpbITclZ7aox+6PdErmrQBUNZoTfQmehYTw/DOIhA6DE3N4wJ0tGVMnOWAwsX/KWddeQkycfF/SIhcOUrl+3Muv9CJiskYHul7mnfNZzv78ZHFfoaP3zt0Jy6JEOJmAiE36OLh9NBGRyRjVWLg4AVTXdNo0vFmOZgzOoJHPAtkB/18OjZp1RHe5l9io5ww4BY/ZcxodG52WaqTwKh2fCt1juF64a1rncQiUgkBWl7jocErS3DOQ9c5/60kAhimEVAKyaSJJlpBXbYwY7IIAatDwa6ep/0xZ5pIh6QW0ffSXuxBrf15NmlKZqmuUVJ32avVRJ53rvg2MZLrsJwBC+8bsrk6RyXoph/lCweiepHm5v0c68i89xviXXV8X9xN8fxyCGQOMKR6xP7/uMbpEbIWiSmuz5ayw19HFKkTeefqWq+Q4McaTOXf56lJ7gQIDN1QLOlmGJd7A57ftJYlfr5He7hS5ciXrEshDh+Yu4PdIUz2pB73LsHmT22XPWs575g0nxwcsE3dv86h/CuVWuOyZT6u5DIokj4k+rF2rXqqXCrJ3/Wp9T26S3UO/Q5gVVXTEymIsBqjPzbnbuRcYwK97r8vEXJ1dGKZMrhNX33GnqBVVIfrs7ZJHas=
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 000000000..77a9f5c54
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+ 1.0.0
+ Radegast Metaverse Client
+ Sjofn LLC
+ Copyright (c) 2009-2015, Radegast Development Team. Copyright (c) 2016-2022, Sjofn, LLC. All rights reserved.
+ Radegast is a trademark of Sjofn LLC.
+ Sjofn LLC
+
+
diff --git a/Install/RadegastBundle/BuildProperties.wxi b/Install/RadegastBundle/BuildProperties.wxi
new file mode 100644
index 000000000..a338c0824
--- /dev/null
+++ b/Install/RadegastBundle/BuildProperties.wxi
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastBundle/Bundle.wxs b/Install/RadegastBundle/Bundle.wxs
new file mode 100644
index 000000000..16f9e5595
--- /dev/null
+++ b/Install/RadegastBundle/Bundle.wxs
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastBundle/NetFx48.wxs b/Install/RadegastBundle/NetFx48.wxs
new file mode 100644
index 000000000..39b03cc53
--- /dev/null
+++ b/Install/RadegastBundle/NetFx48.wxs
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx48MinRelease)"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastBundle/RadegastBundle.wixproj b/Install/RadegastBundle/RadegastBundle.wixproj
new file mode 100644
index 000000000..9e228fc40
--- /dev/null
+++ b/Install/RadegastBundle/RadegastBundle.wixproj
@@ -0,0 +1,102 @@
+
+
+
+ Release
+ x86
+ 3.1.0
+ cccc26b5-aa17-47d8-8d5d-707a78ec9a10
+ 2.0
+ RadegastBundle_$(Platform)
+ Bundle
+
+
+ ..\..\bin\$(Configuration)\
+ obj\$(Configuration)\
+ x86
+ true
+ true
+
+
+ ..\..\bin\Release\
+ obj\Release\
+ x86
+ true
+ true
+
+
+ ..\..\bin\$(Configuration)\
+ obj\$(Configuration)\
+ x64
+ true
+ true
+
+
+ ..\..\bin\Release\
+ obj\Release\
+ x64
+ true
+ true
+
+
+
+
+
+
+
+ $(WixExtDir)\WixUtilExtension.dll
+ WixUtilExtension
+
+
+ $(WixExtDir)\WixNetFxExtension.dll
+ WixNetFxExtension
+
+
+ $(WixExtDir)\WixBalExtension.dll
+ WixBalExtension
+
+
+
+
+ RadegastSetup
+ {0f0271af-0841-45a5-8737-9239550839b7}
+ True
+ True
+ Binaries;Content;Satellites
+ INSTALLFOLDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))
+ $(WindowsKitsRoot)bin\x64\
+ $(WindowsKitsRoot)bin\$(Platform)\
+ $([System.IO.Directory]::GetDirectories('$(WindowsKitsRoot)bin',"10.0.*"))
+ $(SignToolPathBin.Split(';').Length)
+ $([MSBuild]::Add(-1, $(SignToolPathLen)))
+ $(SignToolPathBin.Split(';').GetValue($(SignToolPathIndex)))\
+ $(SignToolPathBase)x64\
+ $(SignToolPathBase)$(Platform)\
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Install/RadegastBundle/assets/license.rtf b/Install/RadegastBundle/assets/license.rtf
new file mode 100644
index 000000000..5a946cc04
Binary files /dev/null and b/Install/RadegastBundle/assets/license.rtf differ
diff --git a/Install/RadegastBundle/assets/radegast.ico b/Install/RadegastBundle/assets/radegast.ico
new file mode 100644
index 000000000..80e2e85a5
Binary files /dev/null and b/Install/RadegastBundle/assets/radegast.ico differ
diff --git a/Install/RadegastSetup/BuildProperties.wxi b/Install/RadegastSetup/BuildProperties.wxi
new file mode 100644
index 000000000..8d333f92a
--- /dev/null
+++ b/Install/RadegastSetup/BuildProperties.wxi
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastSetup/NetFx48.wxs b/Install/RadegastSetup/NetFx48.wxs
new file mode 100644
index 000000000..0aa1125db
--- /dev/null
+++ b/Install/RadegastSetup/NetFx48.wxs
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx48MinRelease)"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastSetup/Product.wxs b/Install/RadegastSetup/Product.wxs
new file mode 100644
index 000000000..d31768fce
--- /dev/null
+++ b/Install/RadegastSetup/Product.wxs
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(var.companyName)
+
+ $(var.aboutUrl)
+ $(var.aboutUrl)
+ $(var.aboutUrl)
+
+ https://radegast.life/
+
+ $(var.totalFileSize)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastSetup/RadegastSetup.wixproj b/Install/RadegastSetup/RadegastSetup.wixproj
new file mode 100644
index 000000000..755d0b6cd
--- /dev/null
+++ b/Install/RadegastSetup/RadegastSetup.wixproj
@@ -0,0 +1,126 @@
+
+
+
+ Release
+ x86
+ 3.1.0
+ 0f0271af-0841-45a5-8737-9239550839b7
+ 2.0
+ RadegastSetup_$(Platform)
+ Package
+ RadegastSetup
+
+
+ ..\..\bin\$(Configuration)\
+ obj\$(Configuration)\
+ x86
+ true
+ true
+ ICE99
+
+
+ ..\..\bin\Release\
+ obj\Release\
+ x86
+ true
+ true
+ False
+ ICE99
+
+
+ ..\..\bin\$(Configuration)\
+ obj\$(Configuration)\
+ x64
+ true
+ true
+ ICE99
+
+
+ ..\..\bin\Release\
+ obj\Release\
+ x64
+ true
+ true
+ False
+ ICE99
+
+
+
+
+
+
+
+
+
+
+ $(WixExtDir)\WixNetFxExtension.dll
+ WixNetFxExtension
+
+
+ $(WixExtDir)\WixUtilExtension.dll
+ WixUtilExtension
+
+
+ $(WixExtDir)\WixUIExtension.dll
+ WixUIExtension
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Radegast
+ {f02f3c44-dcfc-964f-0516-85f7f141ccdd}
+ True
+ True
+ Binaries;Content;Satellites
+ INSTALLFOLDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))
+ $([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))
+ $(WindowsKitsRoot)bin\x64\
+ $(WindowsKitsRoot)bin\$(Platform)\
+ $([System.IO.Directory]::GetDirectories('$(WindowsKitsRoot)bin',"10.0.*"))
+ $(SignToolPathBin.Split(';').Length)
+ $([MSBuild]::Add(-1, $(SignToolPathLen)))
+ $(SignToolPathBin.Split(';').GetValue($(SignToolPathIndex)))\
+ $(SignToolPathBase)x64\
+ $(SignToolPathBase)$(Platform)\
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Install/RadegastSetup/UI.wxi b/Install/RadegastSetup/UI.wxi
new file mode 100644
index 000000000..77f7d9ccc
--- /dev/null
+++ b/Install/RadegastSetup/UI.wxi
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Install/RadegastSetup/VCRedist.wxs b/Install/RadegastSetup/VCRedist.wxs
new file mode 100644
index 000000000..8f29b93ad
--- /dev/null
+++ b/Install/RadegastSetup/VCRedist.wxs
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastSetup/VoicePack.wxs b/Install/RadegastSetup/VoicePack.wxs
new file mode 100644
index 000000000..42bc7d6ff
--- /dev/null
+++ b/Install/RadegastSetup/VoicePack.wxs
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Install/RadegastSetup/assets/license.rtf b/Install/RadegastSetup/assets/license.rtf
new file mode 100644
index 000000000..5a946cc04
Binary files /dev/null and b/Install/RadegastSetup/assets/license.rtf differ
diff --git a/Install/RadegastSetup/assets/radegast.ico b/Install/RadegastSetup/assets/radegast.ico
new file mode 100644
index 000000000..80e2e85a5
Binary files /dev/null and b/Install/RadegastSetup/assets/radegast.ico differ
diff --git a/Install/RadegastSetup/slvoice/DbgHelp.dll b/Install/RadegastSetup/slvoice/DbgHelp.dll
new file mode 100644
index 000000000..660d9207d
Binary files /dev/null and b/Install/RadegastSetup/slvoice/DbgHelp.dll differ
diff --git a/Install/RadegastSetup/slvoice/README.txt b/Install/RadegastSetup/slvoice/README.txt
new file mode 100644
index 000000000..0ddceb98d
--- /dev/null
+++ b/Install/RadegastSetup/slvoice/README.txt
@@ -0,0 +1,3 @@
+The files in this directory are governed under their respective licenses as held by Linden Lab and Vivox under the LGPL 2.1
+
+Additional license holders can be found in vivox_licenses.txt
diff --git a/Install/RadegastSetup/slvoice/SLVoice.exe b/Install/RadegastSetup/slvoice/SLVoice.exe
new file mode 100644
index 000000000..7094b317b
Binary files /dev/null and b/Install/RadegastSetup/slvoice/SLVoice.exe differ
diff --git a/Install/RadegastSetup/slvoice/ortp.dll b/Install/RadegastSetup/slvoice/ortp.dll
new file mode 100644
index 000000000..7d8a27331
Binary files /dev/null and b/Install/RadegastSetup/slvoice/ortp.dll differ
diff --git a/Install/RadegastSetup/slvoice/ortp.pdb b/Install/RadegastSetup/slvoice/ortp.pdb
new file mode 100644
index 000000000..5673e0923
Binary files /dev/null and b/Install/RadegastSetup/slvoice/ortp.pdb differ
diff --git a/Install/RadegastSetup/slvoice/vivox_licenses.txt b/Install/RadegastSetup/slvoice/vivox_licenses.txt
new file mode 100644
index 000000000..a0d16af6a
--- /dev/null
+++ b/Install/RadegastSetup/slvoice/vivox_licenses.txt
@@ -0,0 +1,244 @@
+/* Copyright (c) 2013-2018 by Mercer Road Corp
+ *
+ * Permission to use, copy, modify or distribute this software in binary or source form
+ * for any purpose is allowed only under explicit prior consent in writing from Mercer Road Corp
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND MERCER ROAD CORP DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL MERCER ROAD CORP
+ * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+/* ====================================================================
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2000-2001 The Apache Software Foundation. All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+*
+* 3. The end-user documentation included with the redistribution,
+* if any, must include the following acknowledgment:
+* "This product includes software developed by the
+* Apache Software Foundation (http://www.apache.org/)."
+* Alternately, this acknowledgment may appear in the software itself,
+* if and wherever such third-party acknowledgments normally appear.
+*
+* 4. The names "Apache" and "Apache Software Foundation" must
+* not be used to endorse or promote products derived from this
+* software without prior written permission. For written
+* permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache",
+* nor may "Apache" appear in their name, without prior written
+* permission of the Apache Software Foundation.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
+* ITS 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.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation. For more
+* information on the Apache Software Foundation, please see
+* .
+*/
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+*/
+
+
+/* ====================================================================
+* The Vovida Software License, Version 1.0
+*
+* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+*
+* 3. The names "VOCAL", "Vovida Open Communication Application Library",
+* and "Vovida Open Communication Application Library (VOCAL)" must
+* not be used to endorse or promote products derived from this
+* software without prior written permission. For written
+* permission, please contact vocal@vovida.org.
+*
+* 4. Products derived from this software may not be called "VOCAL", nor
+* may "VOCAL" appear in their name, without prior written
+* permission of Vovida Networks, Inc.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
+* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
+* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
+* IN EXCESS OF $1,000, NOR FOR ANY 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.
+*
+* ====================================================================
+*
+* This software consists of voluntary contributions made by Vovida
+* Networks, Inc. and many individuals on behalf of Vovida Networks,
+* Inc. For more information on Vovida Networks, Inc., please see
+* .
+*
+*/
+
+/* Copyright (C) 2007-2008 Jean-Marc Valin
+Copyright (C) 2008 Thorvald Natvig
+
+File: resample.c
+Arbitrary resampling code
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+*/
+
+/*
+Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
+ Jean-Marc Valin, Timothy B. Terriberry,
+ CSIRO, Gregory Maxwell, Mark Borgerding,
+ Erik de Castro Lopo
+
+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.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+- Neither the name of Internet Society, IETF or IETF Trust, nor the
+names of specific 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.
+
+Opus is subject to the royalty-free patent licenses which are
+specified at:
+
+Xiph.Org Foundation:
+https://datatracker.ietf.org/ipr/1524/
+
+Microsoft Corporation:
+https://datatracker.ietf.org/ipr/1914/
+
+Broadcom Corporation:
+https://datatracker.ietf.org/ipr/1526/
+*/
+
+The accompanying product may be protected by one or more U.S. and foreign patents and/or pending patent applications held by Polycom, Inc.
+
+
+Tencent is pleased to support the open source community by making RapidJSON available.
+
+Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
+
+If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License.
+If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms. Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license.
+A copy of the MIT License is included in this file.
+
+The msinttypes r29
+Copyright (c) 2006-2013 Alexander Chemeris
+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.
+* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+* Neither the name of copyright holder 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 REGENTS 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 REGENTS AND 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.
+
+Terms of the MIT License:
+--------------------------------------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Install/RadegastSetup/slvoice/vivox_sdk_license.txt b/Install/RadegastSetup/slvoice/vivox_sdk_license.txt
new file mode 100644
index 000000000..10ec0d4fe
--- /dev/null
+++ b/Install/RadegastSetup/slvoice/vivox_sdk_license.txt
@@ -0,0 +1,182 @@
+=================
+Vivox SDK License
+=================
+
+RSA Data Security, Inc. MD5 Message-Digest Algorithm
+
+================
+
+Audio coding: Polycom Siren14TM (ITU-T Rec. G.722.1 Annex C)
+
+Open Source Software Licensing
+Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below.
+
+
+*************************************************************
+*************************************************************
+
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 1999-2000 by authors.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+*************************************************************
+*************************************************************
+RTP code under Lesser General Public License
+
+/*
+The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
+Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+************************************************************
+*************************************************************
+
+
+
+
+/*
+ * The Vovida Software License, Version 1.0
+ *
+ * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The names "VOCAL", "Vovida Open Communication Application Library",
+ * and "Vovida Open Communication Application Library (VOCAL)" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact vocal@vovida.org.
+ *
+ * 4. Products derived from this software may not be called "VOCAL", nor
+ * may "VOCAL" appear in their name, without prior written
+ * permission of Vovida Networks, Inc.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
+ * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
+ * IN EXCESS OF $1,000, NOR FOR ANY 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.
+ *
+ *
+ * This software consists of voluntary contributions made by Vovida
+ * Networks, Inc. and many individuals on behalf of Vovida Networks,
+ * Inc. For more information on Vovida Networks, Inc., please see
+ *
+ *
+ */
+*************************************************************
+*************************************************************
+
+Internet Software Consortium code
+
+/* This is from the BIND 4.9.4 release, modified to compile by itself*/
+/* Copyright (c) 1996 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+*************************************************************
+
+*************************************************************
+
+************************************************************
+
+http://tinyxpath.sourceforge.net/
+
+TinyXPath is covered by the zlib license :
+
+ www.sourceforge.net/projects/tinyxpath
+ Copyright (c) 2002-2006 Yves Berquin (yvesb@users.sourceforge.net)
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product documentation
+ would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+************************************************************
+************************************************************
+
+THE FREE SOFTWARE FOUNDATION
+
+Any customer may request the source code for all open source portions of this product which are covered by the Free Software Foundation's General Public License (GPL), for a period of three years from purchase. Please contact the vendor from whom you obtained this product for instructions. A fee equivalent to the cost of making the code available may be charged. Alternatively, customers may choose to download desired GPL components directly from their original vendors. Specifically, this product contains the following GPL-licensed components:
+
+From Vivox:
+ - Assorted software components. To request source, contact Vivox at:
+ Vivox, Inc.
+ Attn: customer support
+ 40 Speen Street Suite 402
+ Framingham, MA 01701
+
diff --git a/Install/RadegastSetup/slvoice/vivoxsdk.dll b/Install/RadegastSetup/slvoice/vivoxsdk.dll
new file mode 100644
index 000000000..232130031
Binary files /dev/null and b/Install/RadegastSetup/slvoice/vivoxsdk.dll differ
diff --git a/Install/RadegastSetup/slvoice/vivoxsdk.lib b/Install/RadegastSetup/slvoice/vivoxsdk.lib
new file mode 100644
index 000000000..631145ae2
Binary files /dev/null and b/Install/RadegastSetup/slvoice/vivoxsdk.lib differ
diff --git a/Install/RadegastSetup/slvoice/vivoxsdk.pdb b/Install/RadegastSetup/slvoice/vivoxsdk.pdb
new file mode 100644
index 000000000..1f6c05c65
Binary files /dev/null and b/Install/RadegastSetup/slvoice/vivoxsdk.pdb differ
diff --git a/Install/RadegastSetup/slvoice/zlib1.dll b/Install/RadegastSetup/slvoice/zlib1.dll
new file mode 100644
index 000000000..1cf8a476e
Binary files /dev/null and b/Install/RadegastSetup/slvoice/zlib1.dll differ
diff --git a/Install/RadegastSetup/vcredist/Microsoft_VC120_CRT_x86.msm b/Install/RadegastSetup/vcredist/Microsoft_VC120_CRT_x86.msm
new file mode 100644
index 000000000..a1bee6630
Binary files /dev/null and b/Install/RadegastSetup/vcredist/Microsoft_VC120_CRT_x86.msm differ
diff --git a/Install/RadegastSetup/vcredist/Microsoft_VC140_CRT_x86.msm b/Install/RadegastSetup/vcredist/Microsoft_VC140_CRT_x86.msm
new file mode 100644
index 000000000..d39c257d1
Binary files /dev/null and b/Install/RadegastSetup/vcredist/Microsoft_VC140_CRT_x86.msm differ
diff --git a/LICENSE.txt b/LICENSE.txt
index d2c728ec4..46951a37a 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,69 +1,156 @@
-Radegast Metaverse Client
-Copyright (c) 2009-2014, Radegast Development Team
-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.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the application "Radegast", 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 HOLDER 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.
-
-Based on SLeek (BSD License)
-Copyright 2006-2008, Paul Clement (a.k.a. Delta)
-All rights reserved.
-
-Uses PrimMesher (BSD License)
- 2010 Dahlia Trimble
-http://forge.opensimulator.org/gf/project/primmesher/
-
-Uses AIMLBot (LGPL License)
-The AIMLBot library (Program#) is a .NET implementation of the AIML standard.
- 2006 Nicholas H.Tollervey (http://ntoll.org)
-http://aimlbot.sourceforge.net/
-
-Uses FMOD Library (FMOD Non Commercial License)
-FMOD Ex SoundSystem Copyright 2005-2009 Firelight Technologies Pty, Ltd.
-Redistributions in binary form must follow the following rules:
-* The FMOD library cannot be used for resale or other commercial distribution
-* This license cannot be used for products which do not make profit but are still commercially released
-* This license cannot be used for commercial services, where the executable containing fmod is not sold, but the data is
-(If you want to redistribute Radegast commercially, remove fmodex.dll, fmodex*.so and fmodex*.dylib)
-
-Uses Ogg Vorbis codec (BSD License)
-Copyright 2002, Xiph.org Foundation
-
-Uses log4net (Apache 2.0 License)
-Copyright Apache Software Foundation
-
-Uses LSL parser from OpenSimulator project (BSD License)
-Copyright Contributors, http://opensimulator.org/
-
-Uses OpenTK library (MIT License)
-Copyright 2006 - 2009 The Open Toolkit library.
-http://www.opentk.com/
-
-Uses artwork files are licenced under the
-Creative Commons Share and Share Alike 3.0
-Copyright 2002-2009 Linden Research Inc.
-
-Command Line Library (MIT License)
-Copyright 2005 - 2010 Giacomo Stelluti Scala
-http://commandline.codeplex.com/
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+Copyright(c) 2009-2014, Radegast Development Team
+Copyright(c) 2016-2021, Sjofn, LLC
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+This version of the GNU Lesser General Public License incorporates the terms
+and conditions of version 3 of the GNU General Public License, supplemented
+by the additional permissions listed below.
+
+0. Additional Definitions.
+
+As used herein, this License refers to version 3 of the GNU Lesser General
+Public License, and the GNU GPL refers to version 3 of the
+GNU General Public License.
+
+The Library refers to a covered work governed by this License, other than
+an Application or a Combined Work as defined below.
+
+An Application is any work that makes use of an interface provided by the
+Library, but which is not otherwise based on the Library. Defining a subclass
+of a class defined by the Library is deemed a mode of using an interface
+provided by the Library.
+
+A Combined Work is a work produced by combining or linking an Application
+with the Library. The particular version of the Library with which the
+Combined Work was made is also called the Linked Version.
+
+The Minimal Corresponding Source for a Combined Work means the Corresponding
+Source for the Combined Work, excluding any source code for portions of the
+Combined Work that, considered in isolation, are based on the Application,
+and not on the Linked Version.
+
+The Corresponding Application Code for a Combined Work means the object code
+and/or source code for the Application, including any data and utility programs
+needed for reproducing the Combined Work from the Application, but excluding
+the System Libraries of the Combined Work.
+
+1. Exception to Section 3 of the GNU GPL.
+
+You may convey a covered work under sections 3 and 4 of this License without
+being bound by section 3 of the GNU GPL.
+
+2. Conveying Modified Versions.
+
+If you modify a copy of the Library, and, in your modifications, a facility
+refers to a function or data to be supplied by an Application that uses the
+facility (other than as an argument passed when the facility is invoked),
+then you may convey a copy of the modified version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the function or
+ data, the facility still operates, and performs whatever part of its
+ purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of this
+ License applicable to that copy.
+
+3. Object Code Incorporating Material from Library Header Files.
+
+The object code form of an Application may incorporate material from a header
+file that is part of the Library. You may convey such object code under terms
+of your choice, provided that, if the incorporated material is not limited to
+numerical parameters, data structure layouts and accessors, or small macros,
+inline functions and templates (ten or fewer lines in length),
+you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the Library
+ is used in it and that the Library and its use are covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL
+ and this license document.
+
+4. Combined Works.
+
+You may convey a Combined Work under terms of your choice that, taken together,
+effectively do not restrict modification of the portions of the Library
+contained in the Combined Work and reverse engineering for debugging such
+modifications, if you also do each of the following:
+
+ a) Give prominent notice with each copy of the Combined Work that the
+ Library is used in it and that the Library and its use are covered
+ by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and
+ this license document.
+
+ c) For a Combined Work that displays copyright notices during execution,
+ include the copyright notice for the Library among these notices, as well
+ as a reference directing the user to the copies of the GNU GPL
+ and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form suitable
+ for, and under terms that permit, the user to recombine or relink
+ the Application with a modified version of the Linked Version to
+ produce a modified Combined Work, in the manner specified by section 6
+ of the GNU GPL for conveying Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time a
+ copy of the Library already present on the user's computer system,
+ and (b) will operate properly with a modified version of the Library
+ that is interface-compatible with the Linked Version.
+
+ e) Provide Installation Information, but only if you would otherwise be
+ required to provide such information under section 6 of the GNU GPL, and
+ only to the extent that such information is necessary to install and
+ execute a modified version of the Combined Work produced by recombining
+ or relinking the Application with a modified version of the Linked Version.
+ (If you use option 4d0, the Installation Information must accompany the
+ Minimal Corresponding Source and Corresponding Application Code. If you
+ use option 4d1, you must provide the Installation Information in the
+ manner specified by section 6 of the GNU GPL for
+ conveying Corresponding Source.)
+
+5. Combined Libraries.
+
+You may place library facilities that are a work based on the Library side by
+side in a single library together with other library facilities that are not
+Applications and are not covered by this License, and convey such a combined
+library under terms of your choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based on
+ the Library, uncombined with any other library facilities, conveyed under
+ the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it is a
+ work based on the Library, and explaining where to find the accompanying
+ uncombined form of the same work.
+
+6. Revised Versions of the GNU Lesser General Public License.
+
+The Free Software Foundation may publish revised and/or new versions of the
+GNU Lesser General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library as you
+received it specifies that a certain numbered version of the GNU Lesser
+General Public License or any later version applies to it, you have the
+option of following the terms and conditions either of that published version
+or of any later version published by the Free Software Foundation. If the
+Library as you received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser General
+Public License ever published by the Free Software Foundation.
+
+If the Library as you received it specifies that a proxy can decide whether
+future versions of the GNU Lesser General Public License shall apply, that
+proxy's public statement of acceptance of any version is permanent
+authorization for you to choose that version for the Library.
diff --git a/README.md b/README.md
index b9ffcfcf4..ae929c52a 100644
--- a/README.md
+++ b/README.md
@@ -1,79 +1,107 @@
-# Author
+```
+██████╗ █████╗ ██████╗ ███████╗ ██████╗ █████╗ ███████╗████████╗
+██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝ ██╔══██╗██╔════╝╚══██╔══╝
+██████╔╝███████║██║ ██║█████╗ ██║ ███╗███████║███████╗ ██║
+██╔══██╗██╔══██║██║ ██║██╔══╝ ██║ ██║██╔══██║╚════██║ ██║
+██║ ██║██║ ██║██████╔╝███████╗╚██████╔╝██║ ██║███████║ ██║
+╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝
+```
+Radegast Metaverse Client (http://radegast.life/)
-Project founder and development lead:
+[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://github.com/cinderblocks/radegast/blob/master/LICENSE.txt)
+[![Latest version downloads](https://img.shields.io/github/downloads-pre/cinderblocks/radegast/latest/total)](https://radegast.life/downloads/)
+[![Build status](https://ci.appveyor.com/api/projects/status/g34olv3opd2vho32/branch/master?svg=true)](https://ci.appveyor.com/project/cinderblocks57647/radegast/branch/master)
+[![Commits per month](https://img.shields.io/github/commit-activity/m/cinderblocks/radegast)](https://www.github.com/cinderblocks/radegast/)
+[![ZEC](https://img.shields.io/keybase/zec/cinder)](https://keybase.io/cinder) [![BTC](https://img.shields.io/keybase/btc/cinder)](https://keybase.io/cinder)
-* **Latif Khalifa** (email latifer radegast.org)
+## Getting started
-Developers:
+Radegast is a virtual world client compatible with Second Life and OpenSimulator.
+Its main purpose is to provide an alternative client to Linden Lab derived virtual world viewers.
+There is a strong focus on accessability and non-3D interaction.
+
+### Prerequisites
+
+Radegast requires .NET Framework 4.8 or compatible Mono version to build and run.
+
+### Contributing
+
+Pull requests are nice. Try not to be a dick, and we will all get along just fine.
+
+## Authors
+
+### Project founder:
+
+* **Latif Khalifa**
+
+### Current maintainer and lead developer:
+
+* **Cinder Roxley** (email cinder cinderblocks.biz)
+
+### Contributors:
+
+* **nooperation**
+* **Luminous Luminos**
+
+### Alumni Contributors:
* **Douglas R. Miles**
* **Mojito Sorbet**
* **Robin Cornelius**
* **Revolution Smythe**
-# License
-
-**Radegast Metaverse Client**
-*Copyright © 2009-2016, Radegast Development Team*
-*All rights reserved.*
+## License
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+**Radegast Metaverse Client**
+* Copyright © 2009-2018, Radegast Development Team
+* Copyright © 2017-2022, Sjofn, LLC.
+* All rights reserved.
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-* Neither the name of the application "Radegast", nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+ Radegast is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-*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 HOLDER 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.*
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-# Bundled libraries
+## Acknowledgments
-Based on SLeek (BSD License)
-Copyright © 2006-2008, Paul Clement (a.k.a. Delta)
-All rights reserved.
+Based on SLeek
+Copyright © 2006-2008, Paul Clement (a.k.a. Delta)
+All rights reserved.
-Uses PrimMesher (BSD License)
-© 2010 Dahlia Trimble
-http://forge.opensimulator.org/gf/project/primmesher/
+PrimMesher
+Copyright © 2010 Dahlia Trimble
+http://forge.opensimulator.org/gf/project/primmesher/
-Uses AIMLBot (LGPL License)
-The AIMLBot library (Program#) is a .NET implementation of the AIML standard.
-© 2006 Nicholas H.Tollervey (http://ntoll.org)
-http://aimlbot.sourceforge.net/
+Ogg Vorbis
+Copyright © 2002, Xiph.org Foundation
-Uses FMOD Library (FMOD Non Commercial License)
-FMOD Ex SoundSystem Copyright © 2005-2009 Firelight Technologies Pty, Ltd.
-Redistributions in binary form must follow the following rules:
-* The FMOD library cannot be used for resale or other commercial distribution
-* This license cannot be used for products which do not make profit but are still commercially released
-* This license cannot be used for commercial services, where the executable containing fmod is not sold, but the data is
-(If you want to redistribute Radegast commercially, remove fmodex.dll, fmodex*.so and fmodex*.dylib)
+log4net
+Copyright © Apache Software Foundation
-Uses Ogg Vorbis codec (BSD License)
-Copyright © 2002, Xiph.org Foundation
+OpenTK 3D
+Copyright © 2006-2014 Stefanos Apostolopoulos for the Open Toolkit library.
-Uses log4net (Apache 2.0 License)
-Copyright © Apache Software Foundation
+OpenJpegDotNet
+Copyright © 2021 Takuya Takuchi and Sjofn LLC
-Uses LSL parser from OpenSimulator project (BSD License)
-Copyright © Contributors, http://opensimulator.org/
+Command Line Library
+Copyright © 2005-2010 Giacomo Stelluti Scala
-Uses TAO OpenGL framework (MIT License)
-Copyright © 2003-2007 Tao Framework Team
-http://www.taoframework.com
-All rights reserved.
+CSAT Library
+Copyright © 2011 mjt
+http://code.google.com/p/csat/
-Uses artwork files are licenced under the
-Creative Commons Share and Share Alike 3.0
-Copyright © 2002-2009 Linden Research Inc.
+zlib.net
+Copyright © 1996-2017 Greg Roelofs, Jean-loup Gailly and Mark Adler.
-Command Line Library (MIT License)
-Copyright © 2005 - 2010 Giacomo Stelluti Scala
-http://commandline.codeplex.com/
+AIMLBot
+The AIMLBot library (Program#) is a .NET implementation of the AIML standard.
+Copyright © 2006 Nicholas H.Tollervey (http://ntoll.org)
+http://aimlbot.sourceforge.net/
-Uses code snippets from CSAT Library (MIT License)
-Copyright © 2011 mjt
-http://code.google.com/p/csat/
+SmartIrc4net
+Copyright © 2003-2005 Mirco Bauer
+http://www.meebey.net/projects/smartirc4net/
-Uses SmartIrc4net (LGPL)
-Copyright © 2003-2005 Mirco Bauer
-http://www.meebey.net/projects/smartirc4net/
+Artwork files are licenced under the
+Creative Commons Share and Share Alike 3.0
+Copyright © 2002-2009 Linden Research Inc.
diff --git a/Radegast.sln b/Radegast.sln
new file mode 100644
index 000000000..e474cc19a
--- /dev/null
+++ b/Radegast.sln
@@ -0,0 +1,362 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29403.142
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radegast", "Radegast\Radegast.csproj", "{F02F3C44-DCFC-964F-0516-85F7F141CCDD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radegast.Plugin.Alice", "plugins\Radegast.Plugin.Alice\Radegast.Plugin.Alice.csproj", "{F9B15290-651E-0E8B-2E12-A6E89A3D30F3}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ {9305ECC4-7FFF-1417-686C-AB2754057B83} = {9305ECC4-7FFF-1417-686C-AB2754057B83}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radegast.Plugin.SimpleBuilder", "plugins\Radegast.Plugin.SimpleBuilder\Radegast.Plugin.SimpleBuilder.csproj", "{6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radegast.Plugin.IRC", "plugins\Radegast.Plugin.IRC\Radegast.Plugin.IRC.csproj", "{195B1187-85BC-EE94-0E2A-35477A8A2554}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Radegast.Plugin.Speech", "plugins\Radegast.Plugin.Speech\RadSpeech\Radegast.Plugin.Speech.csproj", "{9305ECC4-7FFF-1417-686C-AB2754057B83}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RadSpeechLin", "plugins\Radegast.Plugin.Speech\RadSpeechLin\RadSpeechLin.csproj", "{17A48A95-0307-1A3A-AC8C-52F098CEE5BC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ {9305ECC4-7FFF-1417-686C-AB2754057B83} = {9305ECC4-7FFF-1417-686C-AB2754057B83}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RadSpeechWin", "plugins\Radegast.Plugin.Speech\RadSpeechWin\RadSpeechWin.csproj", "{E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ {9305ECC4-7FFF-1417-686C-AB2754057B83} = {9305ECC4-7FFF-1417-686C-AB2754057B83}
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RadSpeechMac", "plugins\Radegast.Plugin.Speech\RadSpeechMac\RadSpeechMac.csproj", "{45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD} = {F02F3C44-DCFC-964F-0516-85F7F141CCDD}
+ {9305ECC4-7FFF-1417-686C-AB2754057B83} = {9305ECC4-7FFF-1417-686C-AB2754057B83}
+ EndProjectSection
+EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "RadegastBundle", "Install\RadegastBundle\RadegastBundle.wixproj", "{CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0F0271AF-0841-45A5-8737-9239550839B7} = {0F0271AF-0841-45A5-8737-9239550839B7}
+ EndProjectSection
+EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "RadegastSetup", "Install\RadegastSetup\RadegastSetup.wixproj", "{0F0271AF-0841-45A5-8737-9239550839B7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {195B1187-85BC-EE94-0E2A-35477A8A2554} = {195B1187-85BC-EE94-0E2A-35477A8A2554}
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3} = {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC} = {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F} = {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}
+ {9305ECC4-7FFF-1417-686C-AB2754057B83} = {9305ECC4-7FFF-1417-686C-AB2754057B83}
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{08765E83-89EC-45F8-945B-5A1A8F88C92E}"
+ ProjectSection(SolutionItems) = preProject
+ .appveyor.yml = .appveyor.yml
+ .gitignore = .gitignore
+ Directory.Build.props = Directory.Build.props
+ LICENSE.txt = LICENSE.txt
+ README.md = README.md
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ ReleaseLinux|Any CPU = ReleaseLinux|Any CPU
+ ReleaseLinux|x64 = ReleaseLinux|x64
+ ReleaseLinux|x86 = ReleaseLinux|x86
+ ReleaseMacOS|Any CPU = ReleaseMacOS|Any CPU
+ ReleaseMacOS|x64 = ReleaseMacOS|x64
+ ReleaseMacOS|x86 = ReleaseMacOS|x86
+ ReleaseWindows|Any CPU = ReleaseWindows|Any CPU
+ ReleaseWindows|x64 = ReleaseWindows|x64
+ ReleaseWindows|x86 = ReleaseWindows|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|x64.ActiveCfg = Debug|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|x64.Build.0 = Debug|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|x86.ActiveCfg = Debug|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Debug|x86.Build.0 = Debug|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|x64.ActiveCfg = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|x64.Build.0 = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|x86.ActiveCfg = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.Release|x86.Build.0 = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|x64.Build.0 = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseLinux|x86.Build.0 = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|x64.Build.0 = Release|x64
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {F02F3C44-DCFC-964F-0516-85F7F141CCDD}.ReleaseWindows|x86.Build.0 = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|x64.ActiveCfg = Debug|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|x64.Build.0 = Debug|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|x86.ActiveCfg = Debug|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Debug|x86.Build.0 = Debug|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|x64.ActiveCfg = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|x64.Build.0 = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|x86.ActiveCfg = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.Release|x86.Build.0 = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|x64.Build.0 = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseLinux|x86.Build.0 = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|x64.Build.0 = Release|x64
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {F9B15290-651E-0E8B-2E12-A6E89A3D30F3}.ReleaseWindows|x86.Build.0 = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|x64.ActiveCfg = Debug|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|x64.Build.0 = Debug|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|x86.ActiveCfg = Debug|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Debug|x86.Build.0 = Debug|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|x64.ActiveCfg = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|x64.Build.0 = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|x86.ActiveCfg = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.Release|x86.Build.0 = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|x64.Build.0 = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseLinux|x86.Build.0 = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|x64.Build.0 = Release|x64
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {6CADC6BB-D8C5-ADE5-A172-3D7F0D4A427F}.ReleaseWindows|x86.Build.0 = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|x64.ActiveCfg = Debug|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|x64.Build.0 = Debug|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|x86.ActiveCfg = Debug|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Debug|x86.Build.0 = Debug|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|Any CPU.Build.0 = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|x64.ActiveCfg = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|x64.Build.0 = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|x86.ActiveCfg = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.Release|x86.Build.0 = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|x64.Build.0 = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseLinux|x86.Build.0 = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|x64.Build.0 = Release|x64
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {195B1187-85BC-EE94-0E2A-35477A8A2554}.ReleaseWindows|x86.Build.0 = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|x64.ActiveCfg = Debug|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|x64.Build.0 = Debug|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|x86.ActiveCfg = Debug|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Debug|x86.Build.0 = Debug|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|x64.ActiveCfg = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|x64.Build.0 = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|x86.ActiveCfg = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.Release|x86.Build.0 = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|x64.Build.0 = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseLinux|x86.Build.0 = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|x64.Build.0 = Release|x64
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {9305ECC4-7FFF-1417-686C-AB2754057B83}.ReleaseWindows|x86.Build.0 = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|x64.ActiveCfg = Debug|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|x64.Build.0 = Debug|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|x86.ActiveCfg = Debug|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Debug|x86.Build.0 = Debug|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|x64.ActiveCfg = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|x64.Build.0 = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|x86.ActiveCfg = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.Release|x86.Build.0 = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|x64.Build.0 = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseLinux|x86.Build.0 = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {17A48A95-0307-1A3A-AC8C-52F098CEE5BC}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|x64.ActiveCfg = Debug|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|x64.Build.0 = Debug|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|x86.ActiveCfg = Debug|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Debug|x86.Build.0 = Debug|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|x64.ActiveCfg = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|x64.Build.0 = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|x86.ActiveCfg = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.Release|x86.Build.0 = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|x64.Build.0 = Release|x64
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {E2D28A95-CE35-1A3A-77BB-52F063FDE5BC}.ReleaseWindows|x86.Build.0 = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|x64.ActiveCfg = Debug|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|x64.Build.0 = Debug|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|x86.ActiveCfg = Debug|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Debug|x86.Build.0 = Debug|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|x64.ActiveCfg = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|x64.Build.0 = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|x86.ActiveCfg = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.Release|x86.Build.0 = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseLinux|x64.ActiveCfg = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseLinux|x86.ActiveCfg = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|Any CPU.ActiveCfg = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|Any CPU.Build.0 = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|x64.ActiveCfg = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|x64.Build.0 = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|x86.ActiveCfg = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseMacOS|x86.Build.0 = Release|x86
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseWindows|Any CPU.ActiveCfg = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseWindows|Any CPU.Build.0 = Release|Any CPU
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseWindows|x64.ActiveCfg = Release|x64
+ {45A78A95-310A-1A3A-DA8F-52F0C6D1E5BC}.ReleaseWindows|x86.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Debug|Any CPU.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Debug|x64.ActiveCfg = Release|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Debug|x86.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Release|Any CPU.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Release|x64.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.Release|x86.ActiveCfg = Release|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseLinux|Any CPU.ActiveCfg = Release|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseLinux|Any CPU.Build.0 = Release|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseLinux|x64.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseLinux|x86.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseMacOS|Any CPU.ActiveCfg = Release|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseMacOS|Any CPU.Build.0 = Release|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseMacOS|x64.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseMacOS|x86.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|x86
+ {CCCC26B5-AA17-47D8-8D5D-707A78EC9A10}.ReleaseWindows|x86.Build.0 = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Debug|Any CPU.ActiveCfg = Release|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Debug|x64.ActiveCfg = Release|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Debug|x86.ActiveCfg = Release|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Release|Any CPU.ActiveCfg = Release|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Release|x64.ActiveCfg = Release|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.Release|x86.ActiveCfg = Release|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseLinux|Any CPU.ActiveCfg = Release|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseLinux|Any CPU.Build.0 = Release|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseLinux|x64.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseLinux|x86.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseMacOS|Any CPU.ActiveCfg = Release|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseMacOS|Any CPU.Build.0 = Release|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseMacOS|x64.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseMacOS|x86.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseWindows|Any CPU.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseWindows|x64.ActiveCfg = ReleaseWindows|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseWindows|x64.Build.0 = ReleaseWindows|x64
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseWindows|x86.ActiveCfg = ReleaseWindows|x86
+ {0F0271AF-0841-45A5-8737-9239550839B7}.ReleaseWindows|x86.Build.0 = ReleaseWindows|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {826CED37-F899-43A9-8117-21878E146F81}
+ EndGlobalSection
+EndGlobal
diff --git a/Radegast.sln.DotSettings b/Radegast.sln.DotSettings
new file mode 100644
index 000000000..6e6a5b166
--- /dev/null
+++ b/Radegast.sln.DotSettings
@@ -0,0 +1,7 @@
+
+ True
+ True
+ True
+ True
+ True
+ True
\ No newline at end of file
diff --git a/Radegast/AutogenerateFiles.targets b/Radegast/AutogenerateFiles.targets
new file mode 100644
index 000000000..4b1c4de89
--- /dev/null
+++ b/Radegast/AutogenerateFiles.targets
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Radegast/Automation/AutoSit.cs b/Radegast/Automation/AutoSit.cs
index 2f1e452fa..e4aef4da4 100644
--- a/Radegast/Automation/AutoSit.cs
+++ b/Radegast/Automation/AutoSit.cs
@@ -1,35 +1,24 @@
-//
-// Radegast Metaverse Client
-//Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
+/**
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using System.Timers;
using OpenMetaverse;
@@ -50,13 +39,12 @@ public static explicit operator AutoSitPreferences(OSD osd){
PrimitiveName = ""
};
- if (osd != null && osd.Type == OSDType.Map)
- {
- OSDMap map = (OSDMap)osd;
- prefs.Primitive = map.ContainsKey("Primitive") ? map["Primitive"].AsUUID() : UUID.Zero;
- prefs.PrimitiveName = prefs.Primitive != UUID.Zero && map.ContainsKey("PrimitiveName") ? map["PrimitiveName"].AsString() : "";
- prefs.Enabled = map.ContainsKey("Enabled") ? map["Enabled"].AsBoolean() : false;
- }
+ if (osd == null || osd.Type != OSDType.Map) return prefs;
+
+ OSDMap map = (OSDMap)osd;
+ prefs.Primitive = map.ContainsKey("Primitive") ? map["Primitive"].AsUUID() : UUID.Zero;
+ prefs.PrimitiveName = prefs.Primitive != UUID.Zero && map.ContainsKey("PrimitiveName") ? map["PrimitiveName"].AsString() : "";
+ prefs.Enabled = map.ContainsKey("Enabled") && map["Enabled"].AsBoolean();
return prefs;
}
@@ -67,11 +55,13 @@ public static implicit operator OSD(AutoSitPreferences prefs){
public static explicit operator OSDMap(AutoSitPreferences prefs)
{
- OSDMap map = new OSDMap(3);
+ OSDMap map = new OSDMap(3)
+ {
+ ["Primitive"] = prefs.Primitive,
+ ["PrimitiveName"] = prefs.PrimitiveName,
+ ["Enabled"] = prefs.Enabled
+ };
- map["Primitive"] = prefs.Primitive;
- map["PrimitiveName"] = prefs.PrimitiveName;
- map["Enabled"] = prefs.Enabled;
return map;
}
@@ -92,9 +82,9 @@ public AutoSit(RadegastInstance instance)
{
m_instance = instance;
m_Timer = new Timer(10 * 1000);
- m_Timer.Elapsed += new ElapsedEventHandler((sender, args) => {
+ m_Timer.Elapsed += (sender, args) => {
TrySit();
- });
+ };
m_Timer.Enabled = false;
}
@@ -110,7 +100,7 @@ public void Dispose()
public AutoSitPreferences Preferences
{
- get { return !m_instance.Client.Network.Connected ? null : (AutoSitPreferences)m_instance.ClientSettings; }
+ get => !m_instance.Client.Network.Connected ? null : (AutoSitPreferences)m_instance.ClientSettings;
set {
m_instance.ClientSettings["AutoSit"] = value;
@@ -143,17 +133,16 @@ public void PrimitiveContextAction(object sender, EventArgs e)
public void Objects_ObjectProperties(object sender, ObjectPropertiesEventArgs e)
{
- if (e.Properties.ObjectID == Preferences.Primitive)
+ if (e.Properties.ObjectID != Preferences.Primitive) return;
+
+ Preferences = new AutoSitPreferences
{
- Preferences = new AutoSitPreferences
- {
- Primitive = Preferences.Primitive,
- PrimitiveName = e.Properties.Name,
- Enabled = Preferences.Enabled
- };
+ Primitive = Preferences.Primitive,
+ PrimitiveName = e.Properties.Name,
+ Enabled = Preferences.Enabled
+ };
- m_instance.Client.Objects.ObjectProperties -= Objects_ObjectProperties;
- }
+ m_instance.Client.Objects.ObjectProperties -= Objects_ObjectProperties;
}
public void TrySit()
diff --git a/Radegast/Automation/LSLHelper.cs b/Radegast/Automation/LSLHelper.cs
index 877fd0af0..8e135c576 100644
--- a/Radegast/Automation/LSLHelper.cs
+++ b/Radegast/Automation/LSLHelper.cs
@@ -1,36 +1,25 @@
-//
-// Radegast Metaverse Client
-//Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
+/**
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
using System.Threading;
using OpenMetaverse;
@@ -41,17 +30,15 @@ namespace Radegast.Automation
public class LSLHelper : IDisposable
{
public bool Enabled;
- public UUID AllowedOwner;
+ public HashSet AllowedOwners;
RadegastInstance instance;
- GridClient client
- {
- get { return instance.Client; }
- }
+ GridClient client => instance.Client;
public LSLHelper(RadegastInstance instance)
{
this.instance = instance;
+ AllowedOwners = new HashSet(StringComparer.OrdinalIgnoreCase);
}
public void Dispose()
@@ -67,7 +54,12 @@ public void LoadSettings()
return;
OSDMap map = (OSDMap)instance.ClientSettings["LSLHelper"];
Enabled = map["enabled"];
- AllowedOwner = map["allowed_owner"];
+ AllowedOwners.Clear();
+ var allowedOwnerList = map["allowed_owner"].AsString();
+ if (!string.IsNullOrWhiteSpace(allowedOwnerList))
+ {
+ AllowedOwners.UnionWith(allowedOwnerList.Split(';'));
+ }
}
catch { }
}
@@ -77,9 +69,11 @@ public void SaveSettings()
if (!client.Network.Connected) return;
try
{
- OSDMap map = new OSDMap(2);
- map["enabled"] = Enabled;
- map["allowed_owner"] = AllowedOwner;
+ OSDMap map = new OSDMap(2)
+ {
+ ["enabled"] = Enabled,
+ ["allowed_owner"] = string.Join(";", AllowedOwners)
+ };
instance.ClientSettings["LSLHelper"] = map;
}
catch { }
@@ -103,14 +97,14 @@ public bool ProcessIM(InstantMessageEventArgs e)
{
case InstantMessageDialog.MessageFromObject:
{
- if (e.IM.FromAgentID != AllowedOwner)
+ if (!AllowedOwners.Contains(e.IM.FromAgentID.ToString()))
{
return true;
}
string[] args = e.IM.Message.Trim().Split('^');
if (args.Length < 1) return false;
- switch (args[0].Trim())
+ switch (args[0].Trim().ToLower())
{
case "group_invite":
{
@@ -145,13 +139,41 @@ public bool ProcessIM(InstantMessageEventArgs e)
if (item == null)
return false;
client.Inventory.GiveItem(item.UUID, item.Name, item.AssetType, sendTo, true);
- WorkPool.QueueUserWorkItem(sync =>
+ ThreadPool.QueueUserWorkItem(sync =>
instance.TabConsole.DisplayNotificationInChat(
- string.Format("Gave {0} to {1}", item.Name, instance.Names.Get(sendTo, true)),
+ $"Gave {item.Name} to {instance.Names.Get(sendTo, true)}",
ChatBufferTextStyle.ObjectChat)
);
return true;
}
+ case "say": /* This one doesn't work yet. I don't know why. TODO. - Nico */
+ {
+ if (args.Length < 2) return true;
+ ChatType ct = ChatType.Normal;
+ int chan = 0;
+ if (args.Length > 2 && int.TryParse(args[2].Trim(), out chan) && chan < 0)
+ {
+ chan = 0;
+ }
+ if (args.Length > 3)
+ {
+ switch (args[3].Trim().ToLower())
+ {
+ case "whisper":
+ {
+ ct = ChatType.Whisper;
+ break;
+ }
+ case "shout":
+ {
+ ct = ChatType.Shout;
+ }
+ break;
+ }
+ }
+ client.Self.Chat(args[1].Trim(), chan, ct);
+ return true;
+ }
}
}
break;
@@ -165,7 +187,7 @@ private void ProcessInvite(string[] args)
if (args == null || args.Length < 4)
return;
- WorkPool.QueueUserWorkItem(sync =>
+ ThreadPool.QueueUserWorkItem(sync =>
{
try
{
@@ -190,19 +212,19 @@ private void ProcessInvite(string[] args)
client.Groups.GroupMembersReply += handler;
client.Groups.RequestGroupMembers(groupID);
- bool success = gotMembers.WaitOne(30 * 1000, false);
+ gotMembers.WaitOne(30 * 1000, false);
client.Groups.GroupMembersReply -= handler;
if (Members != null && Members.ContainsKey(invitee))
{
instance.TabConsole.DisplayNotificationInChat(
- string.Format("Not inviting {0} ({1}) to {2} ({3}), already member", instance.Names.Get(invitee, true), invitee, instance.Groups[groupID].Name, groupID),
+ $"Not inviting {instance.Names.Get(invitee, true)} ({invitee}) to {instance.Groups[groupID].Name} ({groupID}), already member",
ChatBufferTextStyle.ObjectChat);
}
else
{
instance.TabConsole.DisplayNotificationInChat(
- string.Format("Inviting {0} ({1}) to {2} ({3})", instance.Names.Get(invitee, true), invitee, instance.Groups[groupID].Name, groupID),
+ $"Inviting {instance.Names.Get(invitee, true)} ({invitee}) to {instance.Groups[groupID].Name} ({groupID})",
ChatBufferTextStyle.ObjectChat);
client.Groups.Invite(groupID, new List(1) { roleID }, invitee);
}
@@ -210,7 +232,7 @@ private void ProcessInvite(string[] args)
else
{
instance.TabConsole.DisplayNotificationInChat(
- string.Format("Cannot invite to group {0}, I don't appear to be in it.", groupID),
+ $"Cannot invite to group {groupID}, I don't appear to be in it.",
ChatBufferTextStyle.Error);
}
}
diff --git a/Radegast/Automation/PseudoHome.cs b/Radegast/Automation/PseudoHome.cs
index 0747c5138..06f6cb1cd 100644
--- a/Radegast/Automation/PseudoHome.cs
+++ b/Radegast/Automation/PseudoHome.cs
@@ -1,37 +1,24 @@
-//
-// Radegast Metaverse Client
-//Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// Implements RAD-354
+/**
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using System.Timers;
using OpenMetaverse;
@@ -58,7 +45,7 @@ public static explicit operator PseudoHomePreferences(OSD osd)
if (osd != null && osd.Type == OSDType.Map)
{
OSDMap map = (OSDMap)osd;
- prefs.Enabled = map.ContainsKey("Enabled") ? map["Enabled"].AsBoolean() : false;
+ prefs.Enabled = map.ContainsKey("Enabled") && map["Enabled"].AsBoolean();
prefs.Region = map.ContainsKey("Region") ? map["Region"].AsString().Trim() : "";
prefs.Position = map.ContainsKey("Position") ? map["Position"].AsVector3() : new Vector3();
prefs.Tolerance = map.ContainsKey("Tolerance") ? Math.Min(256, Math.Max(1, map["Tolerance"].AsUInteger())) : 256;
@@ -74,12 +61,14 @@ public static implicit operator OSD(PseudoHomePreferences prefs)
public static explicit operator OSDMap(PseudoHomePreferences prefs)
{
- OSDMap map = new OSDMap(4);
+ OSDMap map = new OSDMap(4)
+ {
+ ["Enabled"] = prefs != null && prefs.Enabled,
+ ["Region"] = prefs?.Region != null ? prefs.Region.Trim() : string.Empty,
+ ["Position"] = prefs?.Position ?? Vector3.Zero,
+ ["Tolerance"] = prefs?.Tolerance ?? 256
+ };
- map["Enabled"] = prefs != null ? prefs.Enabled : false;
- map["Region"] = prefs != null && prefs.Region != null ? prefs.Region.Trim() : string.Empty;
- map["Position"] = prefs != null ? prefs.Position : Vector3.Zero;
- map["Tolerance"] = prefs != null ? prefs.Tolerance : 256;
return map;
}
@@ -105,20 +94,17 @@ public PseudoHome(RadegastInstance instance)
{
m_instance = instance;
m_Timer = new Timer(5000);
- m_Timer.Elapsed += new ElapsedEventHandler((sender, args) => {
+ m_Timer.Elapsed += (sender, args) => {
ETGoHome();
- });
+ };
m_Timer.Enabled = false;
}
public PseudoHomePreferences Preferences
{
- get { return !m_instance.Client.Network.Connected ? null : (PseudoHomePreferences)m_instance.ClientSettings; }
+ get => !m_instance.Client.Network.Connected ? null : (PseudoHomePreferences)m_instance.ClientSettings;
- set
- {
- m_instance.ClientSettings["PseudoHome"] = value;
- }
+ set => m_instance.ClientSettings["PseudoHome"] = value;
}
public void ETGoHome()
diff --git a/Radegast/Core/AutoPilot.cs b/Radegast/Core/AutoPilot.cs
index 61a169916..0e6fff093 100644
--- a/Radegast/Core/AutoPilot.cs
+++ b/Radegast/Core/AutoPilot.cs
@@ -1,33 +1,23 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
+/*
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
+
using System.Collections.Generic;
using OpenMetaverse;
@@ -56,18 +46,15 @@ int NextWaypoint
System.Threading.Thread.Sleep(500);
Client.Self.AutoPilotLocal((int)Waypoints[nwp].X, (int)Waypoints[nwp].Y, (int)Waypoints[nwp].Z);
}
- get
- {
- return nwp;
- }
+ get => nwp;
}
public AutoPilot(GridClient client)
{
Client = client;
Ticker.Enabled = false;
- Ticker.Elapsed += new System.Timers.ElapsedEventHandler(Ticker_Elapsed);
- Client.Objects.TerseObjectUpdate += new System.EventHandler(Objects_TerseObjectUpdate);
+ Ticker.Elapsed += Ticker_Elapsed;
+ Client.Objects.TerseObjectUpdate += Objects_TerseObjectUpdate;
}
void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)
diff --git a/Radegast/Core/AutoPilot2.cs b/Radegast/Core/AutoPilot2.cs
deleted file mode 100644
index 874bcfc26..000000000
--- a/Radegast/Core/AutoPilot2.cs
+++ /dev/null
@@ -1,501 +0,0 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
-using System;
-using System.Timers;
-using System.Collections.Generic;
-using OpenMetaverse;
-
-namespace Radegast
-{
- public class AutoPilot2
- {
- #region Declarations
- ///
- /// Delegate to pass the coordinate value of next waypoint to an event-handler
- ///
- public delegate void WaypointDelegate(Vector3d waypoint);
-
- ///
- /// Delegate to pass the coordinate value of next waypoint and the new Status of AutoPilot to an event-handler
- ///
- public delegate void AutoPilotStatusDelegate(AutoPilotStatus newStatus, Vector3d nextWaypoint);
-
- ///
- /// Enum declaration representing the statuses of AutoPilot
- ///
- public enum AutoPilotStatus
- {
- Idle,
- Paused,
- Moving,
- Cancelled,
- Finished,
- Failed
- }
- #endregion Declarations
-
- #region Private Variables
- private GridClient Client;
- private Vector3d myGlobalPosition;
- private List waypoints = new List();
- private int waypointIndex = 0;
- private AutoPilotStatus status = AutoPilotStatus.Idle;
- private double waypointRadius = 2d;
- private Timer ticker = new Timer(500);
- private int stuckTimeout = 10000;
- private int lastDistance = 0;
- private int lastDistanceChanged = -1;
- #endregion Private Variables
-
- #region Public Variables/Properties
- public bool Loop = false;
-
- ///
- /// The Status of the AutoPilot instance
- ///
- public AutoPilotStatus Status
- {
- get
- {
- return status;
- }
- }
-
- ///
- /// The Vector3d Waypoints in the AutoPilot instance
- ///
- /// Must have at least 2 Waypoints
- public List Waypoints
- {
- get
- {
- return waypoints;
- }
- set
- {
- if (value.Count > 1)
- {
- Stop(AutoPilotStatus.Idle);
- waypoints = value;
- }
- else
- {
- throw new ArgumentOutOfRangeException("Waypoints", "Must have at least 2 Waypoints");
- }
- }
- }
-
- ///
- /// The previous Vector3d Waypoint along the path. Returns Vector3d.Zero if there is no previous waypoint.
- ///
- public Vector3d PreviousWaypoint
- {
- get
- {
- return waypointIndex >= 1 ? waypoints[waypointIndex - 1] : Vector3d.Zero;
- }
- }
-
- ///
- /// The next Vector3d Waypoint along the path. Returns Vector3d.Zero if there is no next waypoint.
- ///
- public Vector3d NextWaypoint
- {
- get
- {
- return waypointIndex < waypoints.Count ? waypoints[waypointIndex] : Vector3d.Zero;
- }
- }
-
- ///
- /// The next Waypoint's index. A new value will immediately take effect if AutoPilot is not Idle
- ///
- /// NextWaypointIndex must be greater than or equal to 0 and less than the number of Waypoints
- /// Must have at least 2 Waypoints
- public int NextWaypointIndex
- {
- set
- {
- if (waypoints.Count > 1)
- {
- if (Loop)
- {
- waypointIndex = value % waypoints.Count;
- }
- else if (value < waypoints.Count && value >= 0)
- {
- waypointIndex = value;
- }
- else
- {
- throw new ArgumentOutOfRangeException("NextWaypointIndex", "Value must be greater than or equal to 0 and less than the number of Waypoints");
- }
- if (status != AutoPilotStatus.Idle)
- {
- Client.Self.AutoPilotCancel();
- SetStatus(AutoPilotStatus.Moving);
- Client.Self.AutoPilot(waypoints[waypointIndex].X, waypoints[waypointIndex].Y, waypoints[waypointIndex].Z);
- }
- }
- else
- {
- throw new Exception("Must have at least 2 Waypoints");
- }
- }
- get
- {
- return waypointIndex;
- }
- }
-
- ///
- /// The next Waypoint's index
- ///
- public bool NextWaypointIsFinal
- {
- get
- {
- return waypointIndex == (waypoints.Count - 1);
- }
- }
-
- ///
- /// Returns true if next Waypoint is the Start
- ///
- public bool NextWaypointIsStart
- {
- get
- {
- return waypointIndex == 0 && waypoints.Count > 1;
- }
- }
-
- ///
- /// The Waypoint detection radius
- ///
- /// WaypointRadius must be greater than 0
- public double WaypointRadius
- {
- get
- {
- return waypointRadius;
- }
- set
- {
- if (value > 0)
- {
- waypointRadius = value;
- }
- else
- {
- throw new ArgumentOutOfRangeException("WaypointRadius", "Value must be greater than 0");
- }
- }
- }
-
- ///
- /// The timeout in milliseconds before being considered stuck
- ///
- /// StuckTimeout must be greater than 0
- public int StuckTimeout
- {
- get
- {
- return stuckTimeout;
- }
- set
- {
- if (value > 0)
- {
- stuckTimeout = value;
- }
- else
- {
- throw new ArgumentOutOfRangeException("StuckTimeout", "Value must be greater than 0");
- }
- }
- }
- #endregion Public Variables/Properties
-
- #region Public Events
- ///
- /// Event for when agent arrives at a Waypoint
- ///
- public event WaypointDelegate OnWaypointArrival;
-
- ///
- /// Event for when AutoPilot's status changes
- ///
- public event AutoPilotStatusDelegate OnStatusChange;
- #endregion Public Events
-
- ///
- /// Constructor.
- ///
- /// The GridClient to use
- public AutoPilot2(GridClient client)
- {
- Client = client;
- Client.Objects.TerseObjectUpdate += new System.EventHandler(Objects_TerseObjectUpdate);
- ticker.Elapsed += new ElapsedEventHandler(ticker_Elapsed);
- }
-
- #region Public Methods
- ///
- /// Triggers Autopilot to move towards next waypoint along the path
- ///
- /// Next Waypoint index
- public int MoveToNextWaypoint()
- {
- return MoveToNextWaypoint(true);
- }
-
- ///
- /// Triggers Autopilot to move towards next waypoint along the path
- ///
- /// Increment current Waypoint index
- /// Must have at least 2 Waypoints
- /// Next Waypoint index
- public int MoveToNextWaypoint(bool increment)
- {
- if (waypoints.Count > 1)
- {
- if (increment)
- {
- NextWaypointIndex++;
- }
- else
- {
- Client.Self.AutoPilotCancel();
- Vector3d nextWaypoint = NextWaypoint;
- SetStatus(AutoPilotStatus.Moving);
- Client.Self.AutoPilot(nextWaypoint.X, nextWaypoint.Y, nextWaypoint.Z);
- }
- return waypointIndex;
- }
- else
- {
- throw new Exception("Must have at least 2 Waypoints");
- }
- }
-
- ///
- /// Starts AutoPilot from an Idle state. Will trigger a Moving status change.
- ///
- /// Must have at least 2 Waypoints
- /// Status must be Idle
- /// Next Waypoint index
- public int Start()
- {
- if (waypoints.Count > 1)
- {
- if (status == AutoPilotStatus.Idle)
- {
- ticker.Start();
- return MoveToNextWaypoint(false);
- }
- else
- {
- throw new Exception("Status must be Idle");
- }
- }
- else
- {
- throw new Exception("Must have at least 2 Waypoints");
- }
- }
-
- ///
- /// Restarts AutoPilot. Will trigger a Cancel status change if not already cancelled.
- ///
- /// Must have at least 2 Waypoints
- /// Next Waypoint index
- public int Restart()
- {
- if (waypoints.Count > 1)
- {
- Stop();
- lastDistanceChanged = -1;
- return MoveToNextWaypoint(false);
- }
- else
- {
- throw new Exception("Must have at least 2 Waypoints");
- }
- }
-
- ///
- /// Pauses AutoPilot from a Moving state. Will trigger a Paused status change.
- ///
- /// Status must be Moving
- /// Next Waypoint index
- public int Pause()
- {
- if (status == AutoPilotStatus.Moving)
- {
- ticker.Stop();
- Client.Self.AutoPilotCancel();
- SetStatus(AutoPilotStatus.Paused);
- return waypointIndex;
- }
- else
- {
- throw new Exception("Status must be Moving");
- }
- }
-
- ///
- /// Resumes AutoPilot from a Paused state. Will trigger a Moving status change.
- ///
- /// Status must be Paused
- /// Next Waypoint index
- public int Resume()
- {
- if (status == AutoPilotStatus.Paused)
- {
- ticker.Start();
- return MoveToNextWaypoint(false);
- }
- else
- {
- throw new Exception("Status must be Paused");
- }
- }
-
- ///
- /// Stops AutoPilot. Will trigger a Cancel status change if not already cancelled.
- ///
- public void Stop()
- {
- Stop(AutoPilotStatus.Cancelled);
- }
-
- ///
- /// Stops AutoPilot. Will trigger the given status if not already in that state.
- ///
- /// The new status for AutoPilot. Cannot be Moving
- /// newStatus cannot be Moving
- public void Stop(AutoPilotStatus newStatus)
- {
- if (newStatus != AutoPilotStatus.Moving)
- {
- ticker.Stop();
- Client.Self.AutoPilotCancel();
- SetStatus(newStatus);
- lastDistanceChanged = -1;
- waypointIndex = 0;
- }
- else
- {
- throw new ArgumentOutOfRangeException("newStatus", "Value cannot be Moving");
- }
- }
- #endregion Public Methods
-
- #region Private Methods
- ///
- /// Sets AutoPilot's Status. If newStatus is different from current Status than it will cause OnStatusChange event trigger.
- ///
- /// The new Status AutoPilot is to be changed to
- /// True if OnStatusChanged triggered
- private bool SetStatus(AutoPilotStatus newStatus)
- {
- AutoPilotStatus oldStatus = status;
- if (oldStatus != newStatus)
- {
- status = newStatus;
- if (OnStatusChange != null)
- {
- OnStatusChange(status, NextWaypoint);
- }
- return true;
- }
- else
- {
- return false;
- }
- }
-
- ///
- /// Event Handler for waypoint distance checking
- ///
- private void Objects_TerseObjectUpdate(object sender, TerseObjectUpdateEventArgs e)
- {
- if (status == AutoPilotStatus.Moving && e.Update.Avatar && e.Update.LocalID == Client.Self.LocalID)
- {
- uint regionX, regionY;
- Utils.LongToUInts(e.Simulator.Handle, out regionX, out regionY);
- myGlobalPosition = new Vector3d(
- regionX + e.Update.Position.X,
- regionY + e.Update.Position.Y,
- e.Update.Position.Z
- );
- if (Vector3d.Distance(myGlobalPosition, NextWaypoint) <= waypointRadius)
- {
- if (NextWaypointIsFinal && !Loop)
- {
- Stop(AutoPilotStatus.Finished);
- }
- else
- {
- if (OnWaypointArrival != null)
- {
- OnWaypointArrival(NextWaypoint);
- }
- MoveToNextWaypoint();
- }
- }
- }
- }
-
- ///
- /// Event Handler for Timer which detects if agent is stuck
- ///
- private void ticker_Elapsed(object sender, ElapsedEventArgs e)
- {
- if (status == AutoPilotStatus.Moving)
- {
- int distance = (int)Vector3d.Distance(myGlobalPosition, NextWaypoint);
- if (distance != lastDistance || lastDistanceChanged < 0)
- {
- lastDistance = distance;
- lastDistanceChanged = System.Environment.TickCount;
- }
- else if (Math.Abs(System.Environment.TickCount - lastDistanceChanged) > stuckTimeout)
- {
- Vector3d nextWaypoint = NextWaypoint;
- Stop(AutoPilotStatus.Failed);
- }
- }
- }
- #endregion Private Methods
- }
-}
\ No newline at end of file
diff --git a/Radegast/Core/ChatBufferItem.cs b/Radegast/Core/ChatBufferItem.cs
index 96ab366b2..3f5ffb5aa 100644
--- a/Radegast/Core/ChatBufferItem.cs
+++ b/Radegast/Core/ChatBufferItem.cs
@@ -1,33 +1,23 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
+/**
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
+
using System;
using OpenMetaverse;
@@ -35,13 +25,6 @@ namespace Radegast
{
public class ChatBufferItem
{
- private DateTime timestamp;
- private string from;
- private UUID id;
- private string text;
- private ChatBufferTextStyle style;
- private ChatEventArgs rawMessage;
-
public ChatBufferItem()
{
@@ -49,48 +32,24 @@ public ChatBufferItem()
public ChatBufferItem(DateTime timestamp, string from, UUID id, string text, ChatBufferTextStyle style)
{
- this.timestamp = timestamp;
- this.from = from;
- this.id = id;
- this.text = text;
- this.style = style;
+ Timestamp = timestamp;
+ From = from;
+ ID = id;
+ Text = text;
+ Style = style;
}
- public DateTime Timestamp
- {
- get { return timestamp; }
- set { timestamp = value; }
- }
+ public DateTime Timestamp { get; set; }
- public string From
- {
- get { return from; }
- set { from = value; }
- }
+ public string From { get; set; }
- public UUID ID
- {
- get { return id; }
- set { id = value; }
- }
+ public UUID ID { get; set; }
- public string Text
- {
- get { return text; }
- set { text = value; }
- }
+ public string Text { get; set; }
- public ChatBufferTextStyle Style
- {
- get { return style; }
- set { style = value; }
- }
+ public ChatBufferTextStyle Style { get; set; }
- public ChatEventArgs RawMessage
- {
- get { return rawMessage; }
- set { rawMessage = value; }
- }
+ public ChatEventArgs RawMessage { get; set; }
}
public enum ChatBufferTextStyle
diff --git a/Radegast/Core/ChatTextManager.cs b/Radegast/Core/ChatTextManager.cs
index 33f311948..d53dd9fd1 100644
--- a/Radegast/Core/ChatTextManager.cs
+++ b/Radegast/Core/ChatTextManager.cs
@@ -1,42 +1,32 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
+/*
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2023, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
+
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
-using Radegast.Netcom;
+using Radegast;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
-using System.Web.Script.Serialization;
-using System.ComponentModel;
+using System.Reflection;
+using Newtonsoft.Json;
namespace Radegast
{
@@ -46,9 +36,8 @@ public class ChatTextManager : IDisposable
public event EventHandler ChatLineAdded;
private RadegastInstance instance;
- private RadegastNetcom netcom { get { return instance.Netcom; } }
- private GridClient client { get { return instance.Client; } }
- private ITextPrinter textPrinter;
+ private Radegast.Netcom netcom => instance.Netcom;
+ private GridClient client => instance.Client;
private List textBuffer;
@@ -58,29 +47,28 @@ public class ChatTextManager : IDisposable
public ChatTextManager(RadegastInstance instance, ITextPrinter textPrinter)
{
- this.textPrinter = textPrinter;
- this.textBuffer = new List();
+ TextPrinter = textPrinter;
+ textBuffer = new List();
this.instance = instance;
InitializeConfig();
// Callbacks
- netcom.ChatReceived += new EventHandler(netcom_ChatReceived);
- netcom.ChatSent += new EventHandler(netcom_ChatSent);
- netcom.AlertMessageReceived += new EventHandler(netcom_AlertMessageReceived);
+ netcom.ChatReceived += netcom_ChatReceived;
+ netcom.ChatSent += netcom_ChatSent;
+ netcom.AlertMessageReceived += netcom_AlertMessageReceived;
}
public void Dispose()
{
- netcom.ChatReceived -= new EventHandler(netcom_ChatReceived);
- netcom.ChatSent -= new EventHandler(netcom_ChatSent);
- netcom.AlertMessageReceived -= new EventHandler(netcom_AlertMessageReceived);
+ netcom.ChatReceived -= netcom_ChatReceived;
+ netcom.ChatSent -= netcom_ChatSent;
+ netcom.AlertMessageReceived -= netcom_AlertMessageReceived;
}
private void InitializeConfig()
{
Settings s = instance.GlobalSettings;
- var serializer = new JavaScriptSerializer();
if (s["chat_timestamps"].Type == OSDType.Unknown)
{
@@ -90,7 +78,7 @@ private void InitializeConfig()
{
try
{
- s["chat_fonts"] = serializer.Serialize(Settings.DefaultFontSettings);
+ s["chat_fonts"] = JsonConvert.SerializeObject(Settings.DefaultFontSettings);
}
catch (Exception ex)
{
@@ -100,7 +88,7 @@ private void InitializeConfig()
try
{
- fontSettings = serializer.Deserialize>(s["chat_fonts"]);
+ fontSettings = JsonConvert.DeserializeObject>(s["chat_fonts"]);
}
catch (Exception ex)
{
@@ -109,7 +97,7 @@ private void InitializeConfig()
showTimestamps = s["chat_timestamps"].AsBoolean();
- s.OnSettingChanged += new Settings.SettingChangedCallback(s_OnSettingChanged);
+ s.OnSettingChanged += s_OnSettingChanged;
}
void s_OnSettingChanged(object sender, SettingsEventArgs e)
@@ -119,12 +107,11 @@ void s_OnSettingChanged(object sender, SettingsEventArgs e)
showTimestamps = e.Value.AsBoolean();
ReprintAllText();
}
- else if(e.Key == "chat_fonts")
+ else if (e.Key == "chat_fonts")
{
try
{
- var serializer = new JavaScriptSerializer();
- fontSettings = serializer.Deserialize>(e.Value);
+ fontSettings = JsonConvert.DeserializeObject>(e.Value);
}
catch (Exception ex)
{
@@ -143,7 +130,7 @@ private void netcom_ChatSent(object sender, ChatSentEventArgs e)
private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)
{
- if (e.Message.ToLower().Contains("autopilot canceled")) return; //workaround the stupid autopilot alerts
+ if (e.NotificationId == "AutopilotCanceled") { return; } // workaround the stupid autopilot alerts
ChatBufferItem item = new ChatBufferItem(
DateTime.Now, "Alert message", UUID.Zero, ": " + e.Message, ChatBufferTextStyle.Alert);
@@ -159,7 +146,10 @@ private void netcom_ChatReceived(object sender, ChatEventArgs e)
public void PrintStartupMessage()
{
ChatBufferItem title = new ChatBufferItem(
- DateTime.Now, "", UUID.Zero, Properties.Resources.RadegastTitle + " " + RadegastBuild.VersionString, ChatBufferTextStyle.StartupTitle);
+ DateTime.Now, "",
+ UUID.Zero,
+ Properties.Resources.RadegastTitle + " " + Assembly.GetExecutingAssembly().GetName().Version,
+ ChatBufferTextStyle.StartupTitle);
ChatBufferItem ready = new ChatBufferItem(
DateTime.Now, "", UUID.Zero, "Ready.", ChatBufferTextStyle.StatusBlue);
@@ -172,10 +162,7 @@ public void PrintStartupMessage()
public void ProcessBufferItem(ChatBufferItem item, bool addToBuffer)
{
- if (ChatLineAdded != null)
- {
- ChatLineAdded(this, new ChatLineAddedArgs(item));
- }
+ ChatLineAdded?.Invoke(this, new ChatLineAddedArgs(item));
lock (SyncChat)
{
@@ -184,60 +171,60 @@ public void ProcessBufferItem(ChatBufferItem item, bool addToBuffer)
if (showTimestamps)
{
- if(fontSettings.ContainsKey("Timestamp"))
+ if (fontSettings.ContainsKey("Timestamp"))
{
var fontSetting = fontSettings["Timestamp"];
- textPrinter.ForeColor = fontSetting.ForeColor;
- textPrinter.BackColor = fontSetting.BackColor;
- textPrinter.Font = fontSetting.Font;
- textPrinter.PrintText(item.Timestamp.ToString("[HH:mm] "));
+ TextPrinter.ForeColor = fontSetting.ForeColor;
+ TextPrinter.BackColor = fontSetting.BackColor;
+ TextPrinter.Font = fontSetting.Font;
+ TextPrinter.PrintText(item.Timestamp.ToString("[HH:mm] "));
}
else
{
- textPrinter.ForeColor = SystemColors.GrayText;
- textPrinter.BackColor = Color.Transparent;
- textPrinter.Font = Settings.FontSetting.DefaultFont;
- textPrinter.PrintText(item.Timestamp.ToString("[HH:mm] "));
+ TextPrinter.ForeColor = SystemColors.GrayText;
+ TextPrinter.BackColor = Color.Transparent;
+ TextPrinter.Font = Settings.FontSetting.DefaultFont;
+ TextPrinter.PrintText(item.Timestamp.ToString("[HH:mm] "));
}
}
- if(fontSettings.ContainsKey("Name"))
+ if (fontSettings.ContainsKey("Name"))
{
var fontSetting = fontSettings["Name"];
- textPrinter.ForeColor = fontSetting.ForeColor;
- textPrinter.BackColor = fontSetting.BackColor;
- textPrinter.Font = fontSetting.Font;
+ TextPrinter.ForeColor = fontSetting.ForeColor;
+ TextPrinter.BackColor = fontSetting.BackColor;
+ TextPrinter.Font = fontSetting.Font;
}
else
{
- textPrinter.ForeColor = SystemColors.WindowText;
- textPrinter.BackColor = Color.Transparent;
- textPrinter.Font = Settings.FontSetting.DefaultFont;
+ TextPrinter.ForeColor = SystemColors.WindowText;
+ TextPrinter.BackColor = Color.Transparent;
+ TextPrinter.Font = Settings.FontSetting.DefaultFont;
}
if (item.Style == ChatBufferTextStyle.Normal && item.ID != UUID.Zero && instance.GlobalSettings["av_name_link"])
{
- textPrinter.InsertLink(item.From, string.Format("secondlife:///app/agent/{0}/about", item.ID));
+ TextPrinter.InsertLink(item.From, $"secondlife:///app/agent/{item.ID}/about");
}
else
{
- textPrinter.PrintText(item.From);
+ TextPrinter.PrintText(item.From);
}
- if(fontSettings.ContainsKey(item.Style.ToString()))
+ if (fontSettings.ContainsKey(item.Style.ToString()))
{
var fontSetting = fontSettings[item.Style.ToString()];
- textPrinter.ForeColor = fontSetting.ForeColor;
- textPrinter.BackColor = fontSetting.BackColor;
- textPrinter.Font = fontSetting.Font;
+ TextPrinter.ForeColor = fontSetting.ForeColor;
+ TextPrinter.BackColor = fontSetting.BackColor;
+ TextPrinter.Font = fontSetting.Font;
}
else
{
- textPrinter.ForeColor = SystemColors.WindowText;
- textPrinter.BackColor = Color.Transparent;
- textPrinter.Font = Settings.FontSetting.DefaultFont;
+ TextPrinter.ForeColor = SystemColors.WindowText;
+ TextPrinter.BackColor = Color.Transparent;
+ TextPrinter.Font = Settings.FontSetting.DefaultFont;
}
- textPrinter.PrintTextLine(item.Text);
+ TextPrinter.PrintTextLine(item.Text);
}
}
@@ -264,7 +251,7 @@ private void ProcessOutgoingChat(ChatSentEventArgs e)
sb.Append(e.Message);
ChatBufferItem item = new ChatBufferItem(
- DateTime.Now, string.Format("(channel {0}) {1}", e.Channel, client.Self.Name), client.Self.AgentID, sb.ToString(), ChatBufferTextStyle.StatusDarkBlue);
+ DateTime.Now, $"(channel {e.Channel}) {client.Self.Name}", client.Self.AgentID, sb.ToString(), ChatBufferTextStyle.StatusDarkBlue);
ProcessBufferItem(item, true);
@@ -273,12 +260,15 @@ private void ProcessOutgoingChat(ChatSentEventArgs e)
private void ProcessIncomingChat(ChatEventArgs e)
{
- if (string.IsNullOrEmpty(e.Message)) return;
+ if (string.IsNullOrEmpty(e.Message)) { return; }
// Check if the sender agent is muted
- if (e.SourceType == ChatSourceType.Agent &&
- null != client.Self.MuteList.Find(me => me.Type == MuteType.Resident && me.ID == e.SourceID)
- ) return;
+ if (e.SourceType == ChatSourceType.Agent
+ && client.Self.MuteList.Find(me => me.Type == MuteType.Resident
+ && me.ID == e.SourceID) != null)
+ {
+ return;
+ }
// Check if it's script debug
if (e.Type == ChatType.Debug && !instance.GlobalSettings["show_script_errors"])
@@ -289,12 +279,17 @@ private void ProcessIncomingChat(ChatEventArgs e)
// Check if sender object is muted
if (e.SourceType == ChatSourceType.Object &&
null != client.Self.MuteList.Find(me =>
- (me.Type == MuteType.Resident && me.ID == e.OwnerID) // Owner muted
- || (me.Type == MuteType.Object && me.ID == e.SourceID) // Object muted by ID
- || (me.Type == MuteType.ByName && me.Name == e.FromName) // Object muted by name
- )) return;
+ (me.Type == MuteType.Resident && me.ID == e.OwnerID) // Owner muted
+ || (me.Type == MuteType.Object && me.ID == e.SourceID) // Object muted by ID
+ || (me.Type == MuteType.ByName && me.Name == e.FromName) // Object muted by name
+ ))
+ {
+ return;
+ }
- if (instance.RLV.Enabled && e.Message.StartsWith("@"))
+ if (instance.RLV.Enabled
+ && e.Type == ChatType.OwnerSay
+ && e.Message.StartsWith("@"))
{
instance.RLV.TryProcessCMD(e);
#if !DEBUG
@@ -304,21 +299,14 @@ private void ProcessIncomingChat(ChatEventArgs e)
#endif
}
- ChatBufferItem item = new ChatBufferItem();
- item.ID = e.SourceID;
- item.RawMessage = e;
+ ChatBufferItem item = new ChatBufferItem { ID = e.SourceID, RawMessage = e };
StringBuilder sb = new StringBuilder();
- if (e.SourceType == ChatSourceType.Agent)
- {
- item.From = instance.Names.Get(e.SourceID, e.FromName);
- }
- else
- {
- item.From = e.FromName;
- }
+ item.From = e.SourceType == ChatSourceType.Agent
+ ? instance.Names.Get(e.SourceID, e.FromName)
+ : e.FromName;
- bool isEmote = e.Message.ToLower().StartsWith("/me ");
+ bool isEmote = e.Message.StartsWith("/me ", StringComparison.OrdinalIgnoreCase);
if (!isEmote)
{
@@ -337,18 +325,28 @@ private void ProcessIncomingChat(ChatEventArgs e)
if (isEmote)
{
- if (e.SourceType == ChatSourceType.Agent && instance.RLV.RestictionActive("recvemote", e.SourceID.ToString()))
+ if (e.SourceType == ChatSourceType.Agent &&
+ instance.RLV.RestictionActive("recvemote", e.SourceID.ToString()))
+ {
sb.Append(" ...");
+ }
else
+ {
sb.Append(e.Message.Substring(3));
+ }
}
else
{
sb.Append(": ");
- if (e.SourceType == ChatSourceType.Agent && !e.Message.StartsWith("/") && instance.RLV.RestictionActive("recvchat", e.SourceID.ToString()))
+ if (e.SourceType == ChatSourceType.Agent && !e.Message.StartsWith("/") &&
+ instance.RLV.RestictionActive("recvchat", e.SourceID.ToString()))
+ {
sb.Append("...");
+ }
else
+ {
sb.Append(e.Message);
+ }
}
item.Timestamp = DateTime.Now;
@@ -357,15 +355,15 @@ private void ProcessIncomingChat(ChatEventArgs e)
switch (e.SourceType)
{
case ChatSourceType.Agent:
- if(e.FromName.EndsWith("Linden"))
+ if (e.FromName.EndsWith("Linden"))
{
item.Style = ChatBufferTextStyle.LindenChat;
}
- else if(isEmote)
+ else if (isEmote)
{
item.Style = ChatBufferTextStyle.Emote;
}
- else if(e.SourceID == client.Self.AgentID)
+ else if (e.SourceID == client.Self.AgentID)
{
item.Style = ChatBufferTextStyle.Self;
}
@@ -375,24 +373,20 @@ private void ProcessIncomingChat(ChatEventArgs e)
}
break;
case ChatSourceType.Object:
- if (e.Type == ChatType.OwnerSay)
+ switch (e.Type)
{
- if(isEmote)
- {
+ case ChatType.OwnerSay when isEmote:
item.Style = ChatBufferTextStyle.Emote;
- }
- else
- {
+ break;
+ case ChatType.OwnerSay:
item.Style = ChatBufferTextStyle.OwnerSay;
- }
- }
- else if (e.Type == ChatType.Debug)
- {
- item.Style = ChatBufferTextStyle.Error;
- }
- else
- {
- item.Style = ChatBufferTextStyle.ObjectChat;
+ break;
+ case ChatType.Debug:
+ item.Style = ChatBufferTextStyle.Error;
+ break;
+ default:
+ item.Style = ChatBufferTextStyle.ObjectChat;
+ break;
}
break;
}
@@ -405,7 +399,7 @@ private void ProcessIncomingChat(ChatEventArgs e)
public void ReprintAllText()
{
- textPrinter.ClearText();
+ TextPrinter.ClearText();
foreach (ChatBufferItem item in textBuffer)
{
@@ -418,21 +412,16 @@ public void ClearInternalBuffer()
textBuffer.Clear();
}
- public ITextPrinter TextPrinter
- {
- get { return textPrinter; }
- set { textPrinter = value; }
- }
+ public ITextPrinter TextPrinter { get; set; }
}
public class ChatLineAddedArgs : EventArgs
{
- ChatBufferItem mItem;
- public ChatBufferItem Item { get { return mItem; } }
+ public ChatBufferItem Item { get; }
public ChatLineAddedArgs(ChatBufferItem item)
{
- mItem = item;
+ Item = item;
}
}
}
diff --git a/Radegast/Core/ClientSignatures.cs b/Radegast/Core/ClientSignatures.cs
deleted file mode 100644
index b962b6ac8..000000000
--- a/Radegast/Core/ClientSignatures.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id: IMTextManager.cs 361 2009-10-24 15:04:57Z latifer $
-//
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Reflection;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-
-namespace Radegast
-{
- public class ClientSignatures
- {
- public static Dictionary Signatures { get; private set; }
-
- static ClientSignatures()
- {
- Signatures = new Dictionary();
-
- try
- {
- OSDMap clients = (OSDMap)OSDParser.DeserializeLLSDXml(Properties.Resources.client_signatures);
-
- foreach (KeyValuePair kvp in clients)
- {
- UUID sig;
-
- if (UUID.TryParse(kvp.Key, out sig))
- {
- if (kvp.Value.Type == OSDType.Map)
- {
- OSDMap client = (OSDMap)kvp.Value;
- if (client.ContainsKey("name"))
- {
- Signatures.Add(sig, client["name"].AsString());
- }
- }
- }
- }
- }
- catch
- {
- Logger.Log("Failed to parse client signatures.", Helpers.LogLevel.Warning);
- }
- }
- }
-}
diff --git a/Radegast/Core/Commands/CommandsManager.cs b/Radegast/Core/Commands/CommandsManager.cs
index 5d34901d7..f43c39f42 100644
--- a/Radegast/Core/Commands/CommandsManager.cs
+++ b/Radegast/Core/Commands/CommandsManager.cs
@@ -1,47 +1,32 @@
-//
-// Radegast Metaverse Client
-// Copyright (c) 2009-2014, Radegast Development Team
-// 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.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the application "Radegast", 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 HOLDER 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.
-//
-// $Id$
-//
+/**
+ * Radegast Metaverse Client
+ * Copyright(c) 2009-2014, Radegast Development Team
+ * Copyright(c) 2016-2020, Sjofn, LLC
+ * All rights reserved.
+ *
+ * Radegast is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.If not, see.
+ */
+
using System;
using System.Collections.Generic;
-#if (COGBOT_LIBOMV || USE_STHREADS)
-using ThreadPoolUtil;
-using Thread = ThreadPoolUtil.Thread;
-using ThreadPool = ThreadPoolUtil.ThreadPool;
-using Monitor = ThreadPoolUtil.Monitor;
-#endif
using System.Threading;
+using System.Threading.Tasks;
using OpenMetaverse;
namespace Radegast.Commands
{
- public class CommandsManager : ICommandInterpreter, IDisposable
+ public class CommandsManager : ICommandInterpreter
{
public static string CmdPrefix = "//";
public readonly List CommandsLoaded = new List();
@@ -51,7 +36,7 @@ public class CommandsManager : ICommandInterpreter, IDisposable
public Queue> CommandQueue = new Queue>();
public AutoResetEvent CommandQueued = new AutoResetEvent(false);
- private Thread _commandWorker;
+ private CancellationTokenSource commandWorkerCancelToken;
public CommandsManager(RadegastInstance inst)
{
@@ -59,65 +44,56 @@ public CommandsManager(RadegastInstance inst)
AddCmd("help", "Shows help info", "help help",
(name, cmdargs, writeline) =>
{
- string args = String.Join(" ", cmdargs);
+ string args = string.Join(" ", cmdargs);
Help(args, writeline);
lock (InterpretersLoaded) foreach (ICommandInterpreter manager in InterpretersLoaded)
- {
- manager.Help(args, writeline);
- }
+ {
+ manager.Help(args, writeline);
+ }
});
- _commandWorker = new Thread(CommandsManager_CommandWorker)
- {
- Name = "CommandsManager Worker",
- IsBackground = true
- };
- _commandWorker.Start();
+ commandWorkerCancelToken = new CancellationTokenSource();
+ Task task = Task.Factory.StartNew(CommandWorker,
+ commandWorkerCancelToken.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
- void CommandsManager_CommandWorker()
+ void CommandWorker()
{
- try
+ while (true)
{
- while (true)
+ if (commandWorkerCancelToken.Token.IsCancellationRequested)
+ {
+ break;
+ }
+ if (CommandQueue.Count == 0)
+ {
+ CommandQueued.WaitOne();
+ }
+ if (commandWorkerCancelToken.Token.IsCancellationRequested)
+ {
+ break;
+ }
+ KeyValuePair todo;
+ lock (CommandQueue)
{
if (CommandQueue.Count == 0)
- CommandQueued.WaitOne();
- KeyValuePair todo;
- lock (CommandQueue)
{
- if (CommandQueue.Count == 0)
- {
- continue;
- }
- todo = CommandQueue.Dequeue();
- }
- try
- {
-
- todo.Value();
- }
- catch (ThreadAbortException)
- {
- break;
- }
- catch (Exception ex)
- {
- instance.TabConsole.DisplayNotificationInChat(
- string.Format("Command error: {0} \n{1} {2} ", todo.Key, ex.Message, ex.StackTrace));
+ continue;
}
+ todo = CommandQueue.Dequeue();
}
- }
- finally
- {
- CommandQueue.Clear();
try
{
- if (CommandQueued != null) CommandQueued.Close();
+
+ todo.Value();
}
- catch (Exception)
+ catch (Exception ex)
{
+ instance.TabConsole.DisplayNotificationInChat(
+ string.Format("Command error: {0} \n{1} {2} ", todo.Key, ex.Message, ex.StackTrace));
}
}
+ CommandQueue.Clear();
+ CommandQueued?.Close();
}
public void EnqueueCommand(string name, ThreadStart ts)
@@ -193,7 +169,7 @@ public bool LoadType(Type type)
c = type.GetConstructor(Type.EmptyTypes);
if (c != null)
{
- IRadegastCommand plug = (IRadegastCommand)c.Invoke(new object[0]);
+ IRadegastCommand plug = (IRadegastCommand)c.Invoke(Array.Empty