GithubHelp home page GithubHelp logo

islandzvw / halcyon Goto Github PK

View Code? Open in Web Editor NEW
21.0 17.0 29.0 65.24 MB

InWorldz Halcyon 3d virtual reality world simulator

License: BSD 3-Clause "New" or "Revised" License

C# 89.26% C++ 1.59% C 2.14% Python 0.03% PLpgSQL 0.12% Batchfile 0.02% Shell 0.01% Perl 0.02% NSIS 0.03% Makefile 0.36% HTML 5.89% CSS 0.07% XSLT 0.12% JavaScript 0.14% CMake 0.01% PHP 0.05% LSL 0.13%

halcyon's Introduction

Project moved

Please go to HalcyonGrid for the lastest edition and current details.

halcyon

InWorldz Halcyon 3D virtual world simulator.

Halcyon was originally based on the OpenSimulator project but was forked in 2010 to provide a stable platform for everyday use under high load. We have concentrated on performance and stability to provide a strong, stable base for the InWorldz grid - and now your grid too!

Build Status

Current status: Build status
Master branch: Build status

halcyon's People

Contributors

appurist avatar cinderblocks avatar ddaeschler avatar kf6kjg avatar kiranoot avatar mdickson avatar ryemutt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

halcyon's Issues

In-sim asset cache pruning

We should periodically (every 5 minutes?) prune the in-sim memory based asset cache so that we can set the per-sim values higher.

Spacebar "airbrakes" missing

Try falling and hitting the spacebar in both SL and InWorldz: the former brings you to a very slow fall, the latter doesn't do anything. Haven't yet explored the code or done a debugging pass to see where the bug lies.

This one's not high on my personal priority list, I just happened to run across it by accident.

WHIP Server listening on all ports blocks Halcyon.exe

Okay hoping I am posting this for the right repo as y'all have more then one repository (halcyon and WHIP-Server). I am testing on a local machine (not in full grid mode at the moment as I am just testing to see if this would work with my project).

When I run the Whip Server it appears it is listening on all ports and then when running Halcyon.exe (same machine per above testing) Halcyon says it doesn't have permission to listen on port 9000. I have all ports necessary unblocked in firewalls and modem/ routers so I know the firewall isn't an issue. Is there perhaps a way to define a listening port i.e. 32700 (as identified in the whip.cfg file)?

Thanks in advance.

Grid Services Command Line Parameters

I just checked with Ricky on this one. The User, Grid, and Messaging services are hard coded for reading Halcyon.ini from the local folder. It looks like a simple "copy the code block" from Halcyon.exe and put in for the each of the services where they read the Halcyon.ini. This will allow the services to also read from a common configuration source for the Master Halcyon.ini as well as an instance override Halcyon.ini source as it is available for the Halcyon.exe.

Optional wish is to have each one's config data to be also URL or Path location. This would greatly help in management of multiple instances of these services.

Linux (Basic)Physics support

How difficult would it be to bring the ancient OpenSim basicphysics module up to match the current code? If it's not difficult that could provide at least a stop-gap measure while the much more useful PhysX module is being worked on.

If it's not too complex, for instance doesn't take a complete API rework, just a matter of time and testing just point me in the right direction and I'll give it a go.

Inventory error

I have created account on my grid based halcyon server however when I try to add items to inventory I get a error about no root folder and the viewer says error fetching inventory. Any ideas how to setup or get inventory working g.

Application Exception - DataStore DLL missing OpenSim.Data.MySQL.dll

Visual Studio 2015, when trying to compile Halcyon in Debug, I get an error stating that OpenSim.Data.MySQL.dll is missing:

System.IO.FileNotFoundException was unhandled.
Message: An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll
Additional information: Could not load file or assembly 'file:///C:\opensim\bin\OpenSim.Data.MySQL.dll' or one of its dependencies. The system cannot find the file specified.

Please also see the attached logfiles. Did I miss a group of DLLs to download? Tried to copy over the MySQL dll from opensim and that just crashed the whole thing too :P Thank you for the help!

Animation state incorrect when logging in while falling

Another interesting SL/Halcyon animation state mismatch: TP to a great altitude, say 4040. Let your avatar fall, but log out long 'ere you reach ground or any objects. Some time later, log in again and note your avatar's animation while your altimeter continues to unwind.
SL: falling with flailing limbs (assuming no AO).
IW: standing still.

Permissions module quietly aborts

If the permissions module is turned off purposefully, or just has a typo in the configuration name, it is will silently disable its-self. There are no logs indicating that permissions are not running, while transparently giving all avatars permission over every object in the region.

If the permissions module is off, it should at least log that there are no permissions on the region. This will allow grid operators to easily deduce what the problem is if they desire restrictive permissions.

Embedded notecard missing from database.

My wife is trying to create an info Notecard for an AO. When she tries to embed another notecard and the end user tries to retrieve the embedded note card it opens with a forever "Loading" and an error Toast "Note card missing from database."

I tested this in Firestorm (Latest Release) and Singularity (Latest Release).

Happens on my grid running Halcyon 0.29.30 R6150

This also happens in InWorldz on Halcyon 0.29.30 R6148

MySQL DB error on the region console

Saw this error on the region 1 console, running Halcyon 0.9.31 release on the IMA Test grid.
11:29:54 - [SCENE]: Bulk storing 39 objects
11:29:55 - [SCENE]: Persistance failed with exception MySql.Data.MySqlClient.My SqlException (0x80004005): Out of range value for column 'nextPermissions' at row 14

Log File reports:
2017-02-28 11:59:49,614 [STP SmartThreadPool Thread #0] DEBUG OpenSim.Region.Framework.Scenes.SceneObjectGroup - [SCENE]: Bulk storing 39 objects
2017-02-28 11:59:50,315 [STP SmartThreadPool Thread #0] ERROR OpenSim.Region.Framework.Scenes.Scene - [SCENE]: Persistance failed with exception MySql.Data.MySqlClient.MySqlException (0x80004005): Out of range value for column 'nextPermissions' at row 14
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at OpenSim.Data.MySQL.MySQLDataStore.BulkStoreObjectInventories(IEnumerable1 items, IEnumerable1 deletedItems) in X:\halcyon-0.9.31.6242\OpenSim\Data\MySQL\MySQLRegionData.cs:line 2531
at OpenSim.Region.Framework.Scenes.SceneObjectGroup.ProcessBulkBackup(IList`1 groups, IRegionDataStore datastore, Boolean forcedBackup) in X:\halcyon-0.9.31.6242\OpenSim\Region\Framework\Scenes\SceneObjectGroup.cs:line 1960
at OpenSim.Region.Framework.Scenes.Scene.PerformBackup(Boolean forceBackup) in X:\halcyon-0.9.31.6242\OpenSim\Region\Framework\Scenes\Scene.cs:line 1563, objects will not be untainted

I have verified that the 'nextPermissions' field does exist in the primitems table and is INT(11) NOT NULL,
MYSQL DB Server Version: 5.7

Purging a folder does nothing.

And I finally come around to why I wanted to be able to compile and run this on my Linux machine - not having a working Windows install I needed to run Halcyon under Linux to debug a problem we've been having on our grid for quite some time now. This issue report is about that bug - now that I've conclusively found the root of the problem.

The user's view of the problem: Purging an inventory folder from the Trash causes the folder to disappear, but it shows back up in the Trash after a relog.

The developer's view of the problem: The line that does the work has been commented out with "will fix in the next patch" - see https://github.com/InWorldz/halcyon/blame/master/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs#L1504
It's high time for that patch from whomever commented that line out! :P

On an aside: this is the bug that Vin thought was because we are running on MySQL instead of Cassandra. However the smoking gun indicates that this will happen on all grids no matter the storage implementation. BTW: I complement whomever designed the migration process. Also whomever designed the abstraction layers: while it was a LOT of work to follow the logic through all the indirection and polymorphism, it's a nicely extensible system.

Halcyon.ini sections missing?

While converting the settings from the OpenSim.ini to Halcyon.ini I noticed the [Economy] section is missing. That has the price levels for select processes such as PriceUpload, PriceGroupCreate,
EconomyBaseAccount. All these are used to control who has access to these features as long as they have the specified level of money, lacking any other way to manage who has the option to use those features.
Also the section for [VivoxVoice] or stub for any other voice connection was missing.
The Current file has all of the IP addreses and Database logon info for InWorldz in it. Not to good for internal security I suspect. Possible replacement with pattern tags?
While some other tags were missing they seemed to be out of date or unused legacy options no longer needed.

llGetEnv() sim_channel and sim_version compatibility

sim_channel and sim_version are two requests to llGetEnv that are part of the SL "spec" - they have examples of structure that result in scripter expectations and consequent unforseen uses - but that are not currently matching that defacto spec terribly well.

Firstly: sim_channel to me, based on LL's and Inworldz' usage, is the software name - in this case "Halcyon Server" and should be changed to such. Yes that's an incompatible change from InWorldz where the string was "InWorldz Server": the product's name has changed and it cannot be called by the old name anymore, at least not without causing confusion on other grids. It is not, as some have thought, ever changed across grids: in SL it is "Second Life Server" no matter whether the main grid or the beta grid. The only place that I can think it would change is if the region was running one of the testing server editions, such as "Magnum". In this case it still is the product name, just a special and highly volatile product name.

Following the above logic, sim_version has a problem: it doesn't follow the defacto "spec" in the format of the version string. Following the LL format makes the most sense to support script compatibility for scripts coming from that grid, but InWorlds historically implemented a different format. My suggestion is to revert it to the LL-style version numbering so that scripters fresh from SL get back what they expect: "11.22.33.9876" as documented on the LSL wiki instead of "InWorldz 11.22.33 R9876" or "Halcyon 11.22.33 R9876" as the code currently returns. Again, the reasoning is that some scripts may be, for whatever reason, parsing the contents and attempting to use the results in unpredictable ways. As a side note, why is this being so redundant and putting in the server product name?!

Now this means that existing scripts that are attempting to parse these values may have issues: people may have already coded relying on the existing format. I can't say one way or the other. What I can see is that when I look at the SL wiki page for llGetEnv() I see a string format that will be returned, and when I test in InWorldz or on Halcyon I don't get what I expect based on what I read there. Another side note: a simple parse of the sim_channel would quickly let any script know what simulator type it's on.

I have an incoming pull request waiting on the results of this discussion, however I figured this kind of change needed more input up front before locking in the changes and submitting them for review.

Halcyon startup crash

Getting this error

2017-04-07 13:40:20,363 [1] INFO OpenSim.Application - [HALCYON MAIN]: configured log4net using default Halcyon.exe.config
2017-04-07 13:40:20,394 [1] INFO OpenSim.Application - Performing compatibility checks...
2017-04-07 13:40:20,410 [1] INFO OpenSim.Application - Environment is compatible.

2017-04-07 13:40:20,441 [ConsoleThread] INFO OpenSim.ConfigurationLoader - [CONFIG] Reading configuration settings
2017-04-07 13:40:20,441 [ConsoleThread] INFO OpenSim.ConfigurationLoader - [CONFIG] Reading configuration file C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\bin\Halcyon.ini
2017-04-07 13:40:20,519 [ConsoleThread] INFO OpenSim.Framework.Servers.BaseOpenSimServer - [STARTUP]: Beginning startup processing
2017-04-07 13:40:20,551 [ConsoleThread] INFO OpenSim.OpenSim - ====================================================================
2017-04-07 13:40:20,551 [ConsoleThread] INFO OpenSim.OpenSim - ========================= STARTING HALCYON =========================
2017-04-07 13:40:20,551 [ConsoleThread] INFO OpenSim.OpenSim - ====================================================================
2017-04-07 13:40:20,551 [ConsoleThread] INFO OpenSim.OpenSim - [HALCYON MAIN]: Running in grid mode
2017-04-07 13:40:20,551 [ConsoleThread] INFO OpenSim.OpenSim - GC: Server mode: False, Interactive
2017-04-07 13:40:20,582 [ConsoleThread] INFO OpenSim.Region.Framework.StorageManager - [DATASTORE]: Attempting to load OpenSim.Data.MySQL.dll
2017-04-07 13:40:20,598 [ConsoleThread] INFO OpenSim.Region.Framework.StorageManager - [DATASTORE]: Added IRegionDataStore Interface
2017-04-07 13:40:20,598 [ConsoleThread] INFO OpenSim.Region.ClientStack.ClientStackManager - [CLIENTSTACK]: Attempting to load OpenSim.Region.ClientStack.LindenUDP.dll
2017-04-07 13:40:20,644 [ConsoleThread] INFO OpenSim.Region.ClientStack.ClientStackManager - [CLIENTSTACK]: Added IClientNetworkServer Interface
2017-04-07 13:40:20,644 [ConsoleThread] DEBUG OpenSim.OpenSimBase - [HALCYONBASE] Attempting to load asset server id=WHIP
2017-04-07 13:40:20,660 [ConsoleThread] INFO OpenSim.Framework.PluginLoader1 - [PLUGINS]: Initializing addin manager 2017-04-07 13:40:20,785 [ConsoleThread] INFO OpenSim.Framework.PluginLoader1 - [PLUGINS]: Loading extension point /OpenSim/AssetClient
2017-04-07 13:40:20,801 [ConsoleThread] ERROR OpenSim.Application - [APPLICATION]:
APPLICATION EXCEPTION DETECTED: System.UnhandledExceptionEventArgs

Exception: System.Exception: Asset server WHIP could not be loaded
at OpenSim.OpenSimBase.InitializeAssetCache() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Base\OpenSimBase.cs:line 324
at OpenSim.OpenSimBase.Initialize() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Base\OpenSimBase.cs:line 286
at OpenSim.Region.ClientStack.RegionApplicationBase.StartupSpecific() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Region\ClientStack\RegionApplicationBase.cs:line 107
at OpenSim.OpenSimBase.StartupSpecific() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Base\OpenSimBase.cs:line 201
at OpenSim.OpenSim.StartupSpecific() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Base\OpenSim.cs:line 163
at OpenSim.Framework.Servers.BaseOpenSimServer.Startup() in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\OpenSim\Framework\Servers\BaseOpenSimServer.cs:line 300
at OpenSim.Application.Main(String[] args) in C:\Users\Administrator\Downloads\halcyon-dev\halcyon-dev\InWorldz\Halcyon\Application.cs:line 145

Application is terminating: True

Every thing in uni is correct and the compile worked just fine.
What is the issue

Economy Module

Now that I've opened my big mouth and have said everything is up and running smoothly, the boss (my wife) wants to implement a working economy module. I've had no luck researching the various "modules" out there as far as they would relate to Halcyon. (Hell, even the OpenSim stuff was rather pitiful) I know a working economy is possible, InWorldz is doing it. We have a working LandTool.php (or rather a LandTool.aspx) that allows us to sell and buy land. In the DB I can set avatar's balances and avatars can exchange funds. But of course there is no automation to any of this.

Cannot Run Server + Errors

Greetings, as i am not sure what i am doing wrong here with getting Halcyon to work. I have compiled and successfully run OpenSim and WhiteCore with no problems. I have been attempting to get this to run for over two weeks.

Windows 10, standalone, 127.0.0.1

So i started by downloading the latest master of Halcyon and compiled successfully (in 64Bit)

Downloaded the whip-win64-bin.zip and setup the whip.cfg file and the image below shows what happens

image 1

Next i did the halcyon.ini file, i only changed the ip address and setup the mysql information, and changed the whip url

I did the hc-database.exe --init --type core -h database_host -u database_username -p password (with correct mysql information) and verified tables were created in the mysql database

Then opps errors and Halcyon closes,

07:44:15 - [HALCYON MAIN]: configured log4net using default Halcyon.exe.config
07:44:15 - Performing compatibility checks...
07:44:15 - Environment is compatible.

07:44:16 - [CONFIG] Reading configuration settings
07:44:16 - [CONFIG] Reading configuration file D:\Servers\Halcyon\halcyon-master\bin\Halcyon.ini
07:44:16 - [STARTUP]: Beginning startup processing
07:44:16 - ==================================================================== 07:44:16 - ========================= STARTING HALCYON ========================= 07:44:16 - ==================================================================== 07:44:16 - [HALCYON MAIN]: Running in sandbox mode
07:44:16 - GC: Server mode: False, Interactive
07:44:16 - [DATASTORE]: Attempting to load OpenSim.Data.MySQL.dll
07:44:16 - [DATASTORE]: Added IRegionDataStore Interface
07:44:16 - [CLIENTSTACK]: Attempting to load OpenSim.Region.ClientStack.LindenUDP.dll
07:44:16 - [CLIENTSTACK]: Added IClientNetworkServer Interface
07:44:16 - [HALCYONBASE] Attempting to load asset server id=WHIP
07:44:16 - [PLUGINS]: Initializing addin manager
07:44:16 - [PLUGINS]: Loading extension point /OpenSim/AssetClient
07:44:16 - [APPLICATION]:
APPLICATION EXCEPTION DETECTED: System.UnhandledExceptionEventArgs

Exception: System.Exception: Asset server WHIP could not be loaded
at OpenSim.OpenSimBase.InitializeAssetCache()
at OpenSim.Region.ClientStack.RegionApplicationBase.StartupSpecific()
at OpenSim.OpenSimBase.StartupSpecific()
at OpenSim.OpenSim.StartupSpecific()
at OpenSim.Framework.Servers.BaseOpenSimServer.Startup()
at OpenSim.Application.Main(String[] args)

Application is terminating: True

Unhandled Exception: System.Exception: Asset server WHIP could not be loaded
at OpenSim.OpenSimBase.InitializeAssetCache()
at OpenSim.Region.ClientStack.RegionApplicationBase.StartupSpecific()
at OpenSim.OpenSimBase.StartupSpecific()
at OpenSim.OpenSim.StartupSpecific()
at OpenSim.Framework.Servers.BaseOpenSimServer.Startup()
at OpenSim.Application.Main(String[] args)


I have consulted the wiki and the information is very limited for Halcyon and none for Whip.

Under MySQL emptying the trash does not purge folders, only items

This seems specific to the MySQL storage implementation as I was not able to replicate the bug on the live InWorldz grid.

Here's how to test:

  1. Create a new folder in your inventory. It will be named "New Folder".
  2. Delete the new folder.
  3. Observe that the "delete" has moved the folder to the Trash, and the "New Folder" is sitting right at the top. This is correct and expected.
  4. Right-click on the Trash and select "Empty Trash".
  5. Observe that the everything in the Trash disappears from your inventory. This is correct and expected: the client removes the items and folders from its own view of inventory.
  6. Relog.
  7. Open Inventory and expand your Trash folder.
  8. Observe to see if the "New Folder" is in the Trash.

If step 8 shows the "New Folder", then the bug is still in effect.

Replicated with the following setup:

Firestorm 4.7.3 (47323) Aug 17 2015 18:14:04 (Firestorm-Releasex64) with OpenSimulator support

On current Halcyon compilation under Mono on Linux, as well as the 0.9.11 R5513 binary release of InWorldz.

(Side note: this is a fork of issue #23, as that issue was found to be covering at least 3 different problems at the same time.)

Orphaned records in inventoryitems for Current Outfit folder content

When an avatar creates an outfit, a linked record is created in the Current Outfit folder with assetType=25 and the AssetID is the folderID folder placed in the My Outfits folder in the inventoryfolders table. When the Outfit is removed from the Appearance or the Outfits in the Inventory window, the linked record in the Current Outfit folder is not removed. Over time an accumulation of a lot of orphaned records build up in the inventoryitems table. I recommend that the process called to remove an outfit, also include removing the inventoryitem record where assetID=inventoryitem.folderID and assetType=25.

-- List of orphan records in inventoryitems
Select *
From inventoryitems
Where assetType=25 and assetID not in
(Select folderID From inventoryfolders)

Halcyon.Sample.Ini Economy Section is Missing

The released sample Halcyon.ini files does not have the Economy section in it. This is the only place where the price values can be set for controlling all uploads, group creation and other settings related to fees and economy controls. While most grids wont need or use money operations this is still the only option open to control access to upload and group creation in a grid if those features are to be restricted to only approved persons.

It looks like this was the only place to set the default prim limit for any region, though this might only be a redundant entry since the value is set in each region.

[Economy]

; 45000 is the highest value that the sim could possibly report because of protocol constraints
ObjectCapacity = 30000
; Money Unit fee to upload textures, animations etc
PriceUpload = 0
; Money Unit fee to create groups
PriceGroupCreate = 0
; This is the account Money goes to for fees.  Remember, economy requires that money circulates somewhere... even if it's an upload fee
;EconomyBaseAccount = <UUID of Account that holds the starting cash>

Get rid of insane overloads on SimChat

Inside Scene.PacketHandlers.cs, there are an insane number of confusing overloads on the SimChat function. These have already caused a regression and are prone to cause more coding errors especially if the method signatures need to change again in the future.

I propose that only the first SimChat method that takes all of the parameters be left in place and any parameters that now completed as part of the overloads be left as optional parameters with sane defaults.

Purging a specific empty folder does nothing

This occurs on both MySQL, tested here at home, and Cassandra-based grids, tested on the live InWordlz grid.

Here's how to test:

  1. Create a new folder in your inventory. It will be named "New Folder".
  2. Delete the new folder.
  3. Observe that the "delete" has moved the folder to the Trash, and the "New Folder" is sitting right at the top. This is correct and expected.
  4. Right-click on the "New Folder" sitting in the Trash and select "Purge Item".
  5. Observe that the folder disappears from your inventory. This is correct and expected: the client removes the folder from its own view of inventory.
  6. Relog.
  7. Open Inventory and expand your Trash folder.
  8. Observe to see if the "New Folder" is in the Trash.

If step 8 shows the "New Folder", then the bug is still in effect.

Replicated with the following setup:

Firestorm 4.7.3 (47323) Aug 17 2015 18:14:04 (Firestorm-Releasex64) with OpenSimulator support

You are at 145.0, 138.0, 19.8 in Nargo located at vm-1-4.inworldz.com (198.61.243.4:9035)
SLURL: http://places.inworldz.com/Nargo/145/138/20
(global coordinates 250769.0, 255370.0, 19.8)
InWorldz 0.9.17 R5720

Side note: I'm not sure why I'm in this region, it's just where I happened to be when I logged in. If you have a better place for me to do testing, please let me know!

(Side note 2: this is a fork of issue #23, as that issue was found to be covering at least 3 different problems at the same time.)

Add memcached support

Due to the slowness of some cloud storage solutions, we will be adding memcached support to create a responsive caching cluster for asset gets.

This ticket will track and associate the work involved. Also opened a ticket on the aperture process.

How to handle changes that specifically break InWorldz backwards compatilibilty?

I'm seeing now multiple instances of "hey, we might need to be able to keep X feature running the way it always has been for InWorldz". I've got no problem directly with that: the business has clients to keep happy. So the question is how to do so in the cleanest way? Can or should said process also be used for fixing backwards compatibility issues between various Halcyon releases?

While this discussion is based on issues brought up in #51 and #56 it is more about an overarching business decision than a specific decision on a specific case.

I can think of a few ways of doing this, most likely not exhaustive and not in any particular order:

  1. Compile time flags, such as an INWORLDZ_COMPAT flag, surrounding blocks of code. Said flag could be specified at build time for testing and release editions.
  2. Refactoring relevant code to call specialized private methods that are chosen based on a setting in a configuration file.
  3. Refactoring relevant code to call specialized classes via interface definitions (polymorphism) that are chosen based on a setting in a configuration file.
  4. The InWorldz team keeping a private set of patches to, or a private fork of, the Halcyon source that is for keeping such things and others from proving to be a hindrance to Halcyon itself.

There are likely other ways as well.

I think that information ownership could cause a problem for 2 and 3: potentially many sections of the code could be wanting to know this information. 4 could provide some benefit in that it would allow you to develop private extensions that might have licensing issues, but could mean MORE work for a small team. 1 at least shares the load, but means messier code.

Thoughts, opinions, decisions?

Wiki installation instructions

The current installation instructions is close to non-existent, it may slow down or stop potential developers from contributing or using halcyon in the first place.

I have during the installation process created documentation on how to do this, since my setup is not completely running yet, the documentation is subject to change (otherwise I would post it here)

I wish for someone to grant me access to insert/update a wiki page on the installation process.
Please, could any of you give me this access? @kf6kjg @zauberparacelsus @MatthewBeardmore @CmdrCupcake @cinderblocks

I reached out to @jimtarber via twitter to hear him out if I had any changes, since he has done most contribution, so code wise I have done a fork with the main reason to improve the setup procedure. (done one small enhancement so far)

I'm new to github, since I usually use subversion.

Recently unloaded script cache

We should keep the script bytecode for a number of recently unloaded scripts in memory to prevent a load from hitting the disk cache unnecessarily.

Wiki documentation

I've added several pages to the wiki, providing what I hope is a good foundation. Please review/edit.

If you would like to see a different structure or additions that you don't have the time to accomplish, let me know: I'll see what I can do.

The installation instructions in particular need attention, I'll be starting that once I actually start attempting to do so myself!

.Net Core

.Net Core is an alternative implementation of the .Net Framework, which is lighter, faster, and cross-platform. Porting Halcyon to it may improve performance and improve cross-platform compatibility somewhat.

Hard coded Grid Names and grid specific references

InWorldz shows up in the viewer in several places and the money amount shows as $Iz or sometimes as $Os. It is not good maintenance to have multiple places to set the grid name or the common Library folder name or any other grid specific title that will require changing every hard coded place they occur or trying to use the region settings to do it.

Regardless of how a process may run and what information it may be able to access from the Halcyon ini file, all processes should have access to the database system. If the process supplies some display data that is grid specific it could get that from the database. If nothing else, there should be one place where grid information can be set up and all needed processes can get it once on startup and use it there after. Once set for a grid it will not likely be changing very often. I think this will require some careful consideration before it becomes a bigger problem with many dependent grids.

Bank avatar account is hard-coded

As determined in #332, the avatar currency account is hard-coded:

public static UUID CURRENCY_ACCOUNT_ID = new UUID("efbfe4e6-95c2-4af3-9d27-25a35c2fd575");

This should be configurable via a halcyon.ini option.

There is an existing known value for this, named EconomyBaseAccount in the [Economy] section, which could be used for this. This option was only supported by certain development/example modules, specifically the SampleCurrencyModule, but I don't see any reason to create a new setting for this.

So this issue is in response to #332, and requests that the CURRENCY_ACCOUNT_ID be configurable via EconomyBaseAccount in the [Economy] section of the halcyon.ini file.

Initial Grid Setup: Going Public

After hashing out most of the major issues I've got a pretty stable 20 region grid up and running. Though it's kinda lonely on there with just the two of us. We'd like to open the grid to others, right now the only way to create users is to manually do via the user console. I can't be at the console all the time. How do I setup a way to automate the user creation process for someone visiting the grid website?

Another thing I've tried to Implement is buying land, for right now at $0, using landtool.php. Though I failed miserably. I think it was because I tried using the landtool.php from the OpenSim wiki. Eventually I would like to implement an economy as well. Basic at first. Baby steps.

Main priority is user creation. I want to be able to invite others to the grid without having to manually create the accounts.

Unknown column 'Materials' in 'field list' exception in MySQLDataStore

OpenSim.Data.MySQL.MySQLDataStore.ExecuteNonQuery(MysqlCommand c): Throws an exception when performing c.ExecuteNonQuery();

Error: Additional information: Unknown column 'Materials' in 'field list'

Reproduction steps: Loaded an oar (seanston.oar linked below) and the exception occurred. Deleted the region and created a new one. The exception continued to occur. Added Materials column to primshapes, exception does not occur any longer.

seanston.oar: https://drive.google.com/open?id=0Bz23IMCDYq0NZVl4ckJ5VmtLb28

Solution: Added Materials column to primshapes table in Inworldz database.

Query: "INSERT INTO primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, Media, Materials, State, PhysicsData, PreferredPhysicsShape, VertexCount, HighLODBytes, MidLODBytes, LowLODBytes, LowestLODBytes) values (?UUID0, ?Shape0, ?ScaleX0, ?ScaleY0, ?ScaleZ0, ?PCode0, ?PathBegin0, ?PathEnd0, ?PathScaleX0, ?PathScaleY0, ?PathShearX0, ?PathShearY0, ?PathSkew0, ?PathCurve0, ?PathRadiusOffset0, ?PathRevolutions0, ?PathTaperX0, ?PathTaperY0, ?PathTwist0, ?PathTwistBegin0, ?ProfileBegin0, ?ProfileEnd0, ?ProfileCurve0, ?ProfileHollow0, ?Texture0, ?ExtraParams0, ?Media0, ?Materials0, ?State0, ?PhysicsData0, ?PreferredPhysicsShape0, ?VertexCount0, ?HighLODBytes0, ?MidLODBytes0, ?LowLODBytes0, ?LowestLODBytes0),(?UUID1, ?Shape1, ?ScaleX1, ?ScaleY1, ?ScaleZ1, ?PCode1, ?PathBegin1, ?PathEnd1, ?PathScaleX1, ?PathScaleY1, ?PathShearX1, ?PathShearY1, ?PathSkew1, ?PathCurve1, ?PathRadiusOffset1, ?PathRevolutions1, ?PathTaperX1, ?PathTaperY1, ?PathTwist1, ?PathTwistBegin1, ?ProfileBegin1, ?ProfileEnd1, ?ProfileCurve1, ?ProfileHollow1, ?Texture1, ?ExtraParams1, ?Media1, ?Materials1, ?State1, ?PhysicsData1, ?PreferredPhysicsShape1, ?VertexCount1, ?HighLODBytes1, ?MidLODBytes1, ?LowLODBytes1, ?LowestLODBytes1) ON DUPLICATE KEY UPDATE UUID=VALUES(UUID), Shape=VALUES(Shape), ScaleX=VALUES(ScaleX), ScaleY=VALUES(ScaleY), ScaleZ=VALUES(ScaleZ), PCode=VALUES(PCode), PathBegin=VALUES(PathBegin), PathEnd=VALUES(PathEnd), PathScaleX=VALUES(PathScaleX), PathScaleY=VALUES(PathScaleY), PathShearX=VALUES(PathShearX), PathShearY=VALUES(PathShearY), PathSkew=VALUES(PathSkew), PathCurve=VALUES(PathCurve), PathRadiusOffset=VALUES(PathRadiusOffset), PathRevolutions=VALUES(PathRevolutions), PathTaperX=VALUES(PathTaperX), PathTaperY=VALUES(PathTaperY), PathTwist=VALUES(PathTwist), PathTwistBegin=VALUES(PathTwistBegin), ProfileBegin=VALUES(ProfileBegin), ProfileEnd=VALUES(ProfileEnd), ProfileCurve=VALUES(ProfileCurve), ProfileHollow=VALUES(ProfileHollow), Texture=VALUES(Texture), ExtraParams=VALUES(ExtraParams), Media=VALUES(Media), Materials=VALUES(Materials), State=VALUES(State), PhysicsData=VALUES(PhysicsData), PreferredPhysicsShape=VALUES(PreferredPhysicsShape), VertexCount=VALUES(VertexCount), HighLODBytes=VALUES(HighLODBytes), MidLODBytes=VALUES(MidLODBytes), LowLODBytes=VALUES(LowLODBytes), LowestLODBytes=VALUES(LowestLODBytes);"

Sucessful build but no Halcyon.ini.example?

Good job on getting the server code up! It even compiled out of the gate after executing ./runprebuild.sh and opening the solution in monodevelop.

However the ini file example is missing from the codebase, so I can't boot up the server to give it a test run. I'll see if I can sneak one from a friend who's got a working grid.

Or if there's something else I need to do, let me know - I'm already contemplating what needs to be written for documentation! :D

ROW_FORMAT=FIXED on line 1213 in inworldz-core-base.sql causes hc-database.exe to fail to create mysql db.

The text "ROW_FORMAT=FIXED" on line 1213 in ithe file nworldz-core-base.sql causes hc-database.exe to fail to finish creating the database on MySQL 5.7.9 (Windows) and later. Not all the required tables are created.

Halcyon.exe will still run however when the initial region is created and you get to the point where you enter the Master Avatar the server terminates with the error table inworldz.users does not exist.

Subsequent runs of halcyon.exe produce the above error and the error table inwordz.regionsettings does not exist and terminates.

Removing ROW_FORMAT=FIXED solves the issue and allows hc-database.exe to create the full MySQL database and halcyon.exe runs as expected.

Default wearables and Library items not accessible due to owner check

We have a problem in the Halcyon code in that the default avatars are broken, and I believe that is because the outfit includes inventory items that are in the (shared) Library. I think the root problem is the owner check in the inventory code, which is necessary for security reasons, but it prevents an outfit from having items in the Library or being any specific item ID (like a constant).

Second Life solves the Library problem by copying any Library items to the user's inventory when they are added to an avatar. I'm not sure if it just provides a new item ID or other details, but it is very visible in Second Life as it copies a whole outfit folder to the user inventory when it is worn from the Library.

In this case though, it's actually the default avatar wearables, not the Library (see image below), so it may be possible to just use a list of exceptions, a whitelist for "built-in" itemIDs that skip the inventory owner check.
Default outfit
Default wearables
I'm not sure of the specific here yet (in the problem or any possible solutions) but I wanted to document the problem so that everyone is aware.

Halcyon.Sample.Ini Voice Section

The released file does not contain any section for voice support. I wanted to have voice in my grid back when I started my grid project with InWorldz, but had only heard rumors of an options by Vivox to support OpenSim grids with a free voice account. Well, I eventually stumbled on the information. Perhaps this can be included for those who will wish to have voice as I have not found any alternatives that are still in operation.
[VivoxVoice]
; NOTE: This requires contacting Vivox and putting in an application with them.
; ## Apply for Vivox at http://support.vivox.com/opensim/ for your free account. See listed terms there.
; ## When your application is accepted you will be emailed the section settings to place here.
enabled = false

Voice not working in InWorldz V3 RC

Conversation with Cinder follows:

Cinder: const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
Cinder: there's a region flag and a parcel flag, both need to be active for that button to light up, as well as being connected to vivox, but that isn't the issue.
Cinder: ok, it's the allow voice region flag that's missing for sure.
Cinder: not missing, just off i guess.

Add support for display names

In viewer i click to change displayname and it says it failed. I looked in the halcyon code and i see that it should be able to handle setting display names. is this a bug?

hc-database schema

When using hc-database.exe I can designate that my table is not named inworldz by using the -s flag. However, the queries for creating the triggers appear to be hard-coded to the database name inworldz, at least when running --init.

When using -s halcyon, I see the following:

Unable to load CORE schema: Error TRIGGER command denied to user 'redacted'@'redacted' for table 'economy_transaction'
While executing query 
/*!50003 CREATE*/ /*!50003 TRIGGER `inworldz`.`upd_total_on_new_trans`
AFTER INSERT ON `inworldz`.`economy_transaction`
FOR EACH ROW
BEGIN
  IF (SELECT COUNT(*) FROM economy_totals WHERE user_id = NEW.destAvatarId) = 0 THEN
        INSERT IGNORE INTO economy_totals SELECT NEW.destAvatarId, SUM(transactionAmount) FROM economy_transaction WHERE destAvatarID = NEW.destAvatarId;
  ELSE
        UPDATE economy_totals SET total = total + NEW.transactionAmount WHERE user_id = NEW.destAvatarId;
  END IF;
END */

Context:

/*!50003 SET sql_mode              = '' */ 

/*!50003 CREATE*/ /*!50003 TRIGGER `inworldz`.`upd_total_on_new_trans`
AFTER INSERT ON `inworldz`.`economy_transaction`
FOR EACH ROW
BEGIN
  IF (SELECT COUNT(*) FROM economy_totals WHERE user_id = NEW.destAvatarId) = 0 THEN
        INSERT IGNORE INTO economy_totals SELECT NEW.destAvatarId, SUM(transactionAmount) FROM economy_transaction WHERE destAvatarID = NEW.destAvatarId;
  ELSE
        UPDATE economy_totals SET total = total + NEW.transactionAmount WHERE user_id = NEW.destAvatarId;
  END IF;
END */
;
/*!50003 SET sql_mode              = @saved_sql_mode */ 

There is no database inworldz, and the tables are created under halcyon correctly.

Expose Grid Name through llGetEnv

This is a suggestion that I thought may be useful, which is that by passing the "grid_name" parameter to llGetEnv, it will return the name of the grid that the script is running on. For example, run it on InWorldz, it'll return "InWorldz". Run it on InWorldz Beta, it'll return "InWorldz Beta". Run it on HalcyonGrid2000, get "Halcyon Grid 2000" in return.

I figure that this function will be useful to scripts written for Halcyon. If OpenSim or WhiteCoreSim include a similar extension for llGetEnv, Halcyon can probably follow that extensions convention to reduce the work needed to get opensim scripts to work with Halcyon.

Possible MySQL bug adding/updating a region on the grid server.

As I've been exploring the code, especially as regards the MySQL information, it seems that there's a lot of old dead code - however I'm never 100% certain that any one piece is actually dead...

One of them is what appears to be an SQL bug in assigning the owner's UUID to a region. Look near the end of the line for owner_uuid - ?owner_uuid. However, I think this may be dead code that's never called - I'm pretty sure you guys would have migrated this off, but I can't find where it might have gone to... Unless you only migrated inventory to Cassandra and left the region stuff in MySQL?

What's WhisperVoice?

The code is somehow loading it, and is (because of some changes I'm working on) no longer running on my local copy because WhisperVoice isn't able to be loaded for some reason. My question is: what is/was it, and is it needed any more?

Add Support for Inventory Archive

I'm adding this as support for Inventory Archives (IAR files) is something that will be requested, and it is something that would be useful for open grids, where users may wish to transfer their inventory. One of the stated goals for Halcyon was that people running desktop sandboxes would be able to sync builds to and from InWorldz (or other grids), and IAR could provide a useful medium.

Though, obviously there would need to be some checks in order to cull objects based on creator and perms (export perms in particular). That, and perhaps it could be implemented in a way that does NOT require users to give out their plaintext password.

"save oar" Commands and Errors

Halcyon currently has three commands to save an oar file:
save oar < oar name > < store_assets > - Save a region's data to an OAR archive
saveexplicit oar < region name > < oar filename > < store_assets > - Save a region's data to an OAR archive
saveportable oar < oar filename > [allowed_uuid allowed_uuid ...] - Save a region's data to an OAR archive with assets suitable for export from inworldz.

These are currently each separate code sections doing almost the same things. Though the "saveportable oar" appears to be only a stub that was never implemented or completed as it does nothing. The other two have a lot of errors resulting in assets not being saved in the oar.
Related issue: Skip UUIDs (that can't be) read from damaged assets #343

I propose these three commands be combined into one process with extended parms:
save oar
< region name > - deprecated parameter since multiple regions per simulator is not allowed in Halcyon at this time. So it would only be the active region.
< oar name > - output file path/name.
< store_assets > - flag 1=store assets, 0=not store assets.
[allowed_uuid allowed_uuid ...] - I am not sure what this was intended to do, appears to be an allowed asset by UUID list for export to provide a list of content to export with the oar.
< compatible > - flag 1=OpenSim output compatibility as .oar, 0=Halcyon format as .har to aid in identifying content format used. Where oar = Opensim Archived Region, har = Halcyon Archived Region

That way there is support for other grids using the OpenSim format or Halcyon format.
Currently the errors returned are the same xml structure error regardless of asset for this command:
save oar MyRegion.oar 1

2017-03-13 08:19:30,196 [ConsoleThread] ERROR OpenSim.Region.Framework.Scenes.UuidGatherer - [ASSET GATHERER]: Failed to get part - System.NullReferenceException: Object reference not set to an instance of an object.
at OpenSim.Region.Framework.Scenes.UuidGatherer.GatherAssetUuids(SceneObjectGroup sceneObject, IDictionary2 assetUuids) in X:\halcyon-0.9.32.6272\OpenSim\Region\Framework\Scenes\UuidGatherer.cs:line 117 at OpenSim.Region.Framework.Scenes.UuidGatherer.GetSceneObjectAssetUuids(UUID sceneObjectUuid, IDictionary2 assetUuids) in X:\halcyon-0.9.32.6272\OpenSim\Region\Framework\Scenes\UuidGatherer.cs:line 287
at OpenSim.Region.Framework.Scenes.UuidGatherer.GatherAssetUuids(UUID assetUuid, AssetType assetType, IDictionary2 assetUuids) in X:\halcyon-0.9.32.6272\OpenSim\Region\Framework\Scenes\UuidGatherer.cs:line 98 at OpenSim.Region.Framework.Scenes.UuidGatherer.GatherAssetUuids(SceneObjectGroup sceneObject, IDictionary2 assetUuids) in X:\halcyon-0.9.32.6272\OpenSim\Region\Framework\Scenes\UuidGatherer.cs:line 170
2017-03-13 08:19:30,212 [ConsoleThread] DEBUG OpenSim.Region.Framework.Scenes.UuidGatherer - [ASSET GATHERER]: Texture entry length for prim was 98 (min is 46)
2017-03-13 08:19:30,227 [ConsoleThread] ERROR OpenSim.Region.Framework.Scenes.Serialization.SceneObjectSerializer - [SERIALIZER]: Deserialization of xml failed with System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)
at OpenSim.Region.Framework.Scenes.Serialization.SceneObjectSerializer.FromOriginalXmlFormat(UUID fromUserInventoryItemID, String xmlData) in X:\halcyon-0.9.32.6272\OpenSim\Region\Framework\Scenes\Serialization\SceneObjectSerializer.cs:line 139. xml was ITG

I have noticed the export process has an adverse effect on the simulation while it is being processed. The save and load processes could be a prime candidate for moving to an external process module independent of simulator operation. Loading the exported region archive will change a running simulator, so that might require a suspension of the simulator or a way to communicate with that process. Not so with the archive export.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.