mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-06-29 00:58:48 +02:00
Merge branch 'master' into fix/gltf-corrupt-crash
This commit is contained in:
commit
fe7f89cc1b
23 changed files with 244 additions and 83 deletions
8
BUILD.md
8
BUILD.md
|
@ -1,13 +1,13 @@
|
||||||
# General Build Information
|
# General Build Information
|
||||||
|
|
||||||
*Last Updated on May 17, 2020*
|
*Last Updated on June 27, 2020*
|
||||||
|
|
||||||
### OS Specific Build Guides
|
### OS Specific Build Guides
|
||||||
|
|
||||||
* [Build Windows](BUILD_WIN.md) - complete instructions for Windows.
|
* [Build Windows](BUILD_WIN.md) - complete instructions for Windows.
|
||||||
* [Build Linux](BUILD_LINUX.md) - additional instructions for Linux.
|
* [Build Linux](BUILD_LINUX.md) - additional instructions for Linux.
|
||||||
* [Build OSX](BUILD_OSX.md) - additional instructions for OS X.
|
* [Build OSX](BUILD_OSX.md) - additional instructions for OS X.
|
||||||
* [Build Android](BUILD_ANDROID.md) - additional instructions for Android
|
* [Build Android](BUILD_ANDROID.md) - additional instructions for Android.
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
- [git](https://git-scm.com/downloads): >= 1.6
|
- [git](https://git-scm.com/downloads): >= 1.6
|
||||||
|
@ -78,11 +78,11 @@ Where /path/to/directory is the path to a directory where you wish the build fil
|
||||||
BUILD_NUMBER
|
BUILD_NUMBER
|
||||||
|
|
||||||
// The type of release.
|
// The type of release.
|
||||||
RELEASE_TYPE=PRODUCTION|PR
|
RELEASE_TYPE=PRODUCTION|PR|DEV
|
||||||
RELEASE_BUILD=PRODUCTION|PR
|
|
||||||
|
|
||||||
// TODO: What do these do?
|
// TODO: What do these do?
|
||||||
PRODUCTION_BUILD=0|1
|
PRODUCTION_BUILD=0|1
|
||||||
|
PR_BUILD=0|1
|
||||||
STABLE_BUILD=0|1
|
STABLE_BUILD=0|1
|
||||||
|
|
||||||
// TODO: What do these do?
|
// TODO: What do these do?
|
||||||
|
|
|
@ -247,7 +247,7 @@
|
||||||
"name": "standard_permissions",
|
"name": "standard_permissions",
|
||||||
"type": "table",
|
"type": "table",
|
||||||
"label": "Domain-Wide User Permissions",
|
"label": "Domain-Wide User Permissions",
|
||||||
"help": "Indicate which types of users can have which <a data-toggle='tooltip' data-html=true title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level permissions that might otherwise apply to that user. Additionally, if more than one parameter is applicable to a given user, the permissions given to that user will be the sum of all applicable parameters. For example, let’s say only localhost users can connect and only logged in users can lock and unlock entities. If a user is both logged in and on localhost then they will be able to both connect and lock/unlock entities.</p>'>domain-wide permissions</a>.",
|
"help": "Indicate which types of users can have which <a data-toggle='tooltip' data-html=true title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level permissions that might otherwise apply to that user. Additionally, if more than one parameter is applicable to a given user, the permissions given to that user will be the sum of all applicable parameters. For example, let’s say only localhost users can connect and only logged in users can lock and unlock entities. If a user is both logged in and on localhost then they will be able to both connect and lock/unlock entities.</p>'>domain-wide permissions</a>.",
|
||||||
"caption": "Standard Permissions",
|
"caption": "Standard Permissions",
|
||||||
"can_add_new_rows": false,
|
"can_add_new_rows": false,
|
||||||
"groups": [
|
"groups": [
|
||||||
|
@ -256,7 +256,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level permissions that might otherwise apply to that user. Additionally, if more than one parameter is applicable to a given user, the permissions given to that user will be the sum of all applicable parameters. For example, let’s say only localhost users can connect and only logged in users can lock and unlock entities. If a user is both logged in and on localhost then they will be able to both connect and lock/unlock entities.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level permissions that might otherwise apply to that user. Additionally, if more than one parameter is applicable to a given user, the permissions given to that user will be the sum of all applicable parameters. For example, let’s say only localhost users can connect and only logged in users can lock and unlock entities. If a user is both logged in and on localhost then they will be able to both connect and lock/unlock entities.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -337,7 +337,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -392,7 +392,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users in specific groups can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users in specific groups can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users in specific groups can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a users in specific groups can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users in specific groups can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether user in specific groups can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Permissions granted to a specific user will be a union of the permissions granted to the groups they are in, as well as permissions from the previous section. Group permissions are only granted if the user doesn’t have their own row in the per-account section, below.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users in specific groups can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users in specific groups can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users in specific groups can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a users in specific groups can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users in specific groups can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether user in specific groups can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Permissions granted to a specific user will be a union of the permissions granted to the groups they are in, as well as permissions from the previous section. Group permissions are only granted if the user doesn’t have their own row in the per-account section, below.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -498,7 +498,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -520,7 +520,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users in specific groups can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users in specific groups can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users in specific groups can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a users in specific groups can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users in specific groups can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether user in specific groups can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users in specific groups can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Permissions granted to a specific user will be a union of the permissions granted to the groups they are in. Group permissions are only granted if the user doesn’t have their own row in the per-account section, below.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users in specific groups can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users in specific groups can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users in specific groups can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users in specific groups can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a users in specific groups can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users in specific groups can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether user in specific groups can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users in specific groups can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property</li></ul><p>Permissions granted to a specific user will be a union of the permissions granted to the groups they are in. Group permissions are only granted if the user doesn’t have their own row in the per-account section, below.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -623,7 +623,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -641,7 +641,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level or group permissions that might otherwise apply to that user.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide User Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether a user can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether a user change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether a user can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether a user can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether a user can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether a user can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether a user can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether a user can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific user will supersede any parameter-level or group permissions that might otherwise apply to that user.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -722,7 +722,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -740,7 +740,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide IP Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users from specific IPs can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific IPs can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users from specific IPs can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users from specific IPs can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users from specific IPs can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users from specific IPs can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users from specific IPs can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users from specific IPs can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users from specific IPs can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific IP will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). IP address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide IP Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users from specific IPs can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific IPs can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users from specific IPs can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users from specific IPs can create new entities with a finite lifetime.</li><li><strong>Rez Temporary</strong><br />Sets whether a user can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users from specific IPs can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users from specific IPs can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users from specific IPs can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users from specific IPs can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users from specific IPs can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific IP will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). IP address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -821,7 +821,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -839,7 +839,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide MAC Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users with specific MACs can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific MACs can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users with specific MACs can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users with specific MACs can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users with specific MACs can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users with specific MACs can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users with specific MACs can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users with specific MACs can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users with specific MACs can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific MAC will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). MAC address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide MAC Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users with specific MACs can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific MACs can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users with specific MACs can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users with specific MACs can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users with specific MACs can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users with specific MACs can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users with specific MACs can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users with specific MACs can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users with specific MACs can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific MAC will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). MAC address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -920,7 +920,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
@ -938,7 +938,7 @@
|
||||||
"span": 1
|
"span": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide Machine Fingerprint Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users with specific Machine Fingerprints can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific Machine Fingerprints can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users with specific Machine Fingerprints can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users with specific Machine Fingerprints can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users with specific Machine Fingerprints can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users with specific Machine Fingerprints can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users with specific Machine Fingerprints can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users with specific Machine Fingerprints can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users with specific Machine Fingerprints can replace entire content sets by wiping existing domain content.</li><li><strong>Can Get and Set Private User Data</strong><br>Sets whether a user can get and set the Private User Data entity property</li></ul><p>Note that permissions assigned to a specific Machine Fingerprint will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). Machine Fingerprint address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
"label": "Permissions <a data-toggle='tooltip' data-html='true' title='<p><strong>Domain-Wide Machine Fingerprint Permissions</strong></p><ul><li><strong>Connect</strong><br />Sets whether users with specific Machine Fingerprints can connect to the domain.</li><li><strong>Lock / Unlock</strong><br />Sets whether users from specific Machine Fingerprints can change the “locked” property of an entity (either from on to off or off to on).</li><li><strong>Rez</strong><br />Sets whether users with specific Machine Fingerprints can create new entities.</li><li><strong>Rez Temporary</strong><br />Sets whether users with specific Machine Fingerprints can create new entities with a finite lifetime.</li><li><strong>Rez Certified</strong><br />Sets whether users with specific Machine Fingerprints can create new certified entities.</li><li><strong>Rez Temporary Certified</strong><br />Sets whether users with specific Machine Fingerprints can create new certified entities with a finite lifetime.</li><li><strong>Write Assets</strong><br />Sets whether users with specific Machine Fingerprints can make changes to the domain’s asset-server assets.</li><li><strong>Ignore Max Capacity</strong><br />Sets whether users with specific Machine Fingerprints can connect even if the domain has reached or exceeded its maximum allowed agents.</li><li><strong>Replace Content</strong><br>Sets whether users with specific Machine Fingerprints can replace entire content sets by wiping existing domain content.</li><li><strong>Get and Set Private User Data</strong><br>Sets whether a user can get and set the privateUserData entity property.</li></ul><p>Note that permissions assigned to a specific Machine Fingerprint will supersede any parameter-level permissions that might otherwise apply to that user (from groups or standard permissions above). Machine Fingerprint address permissions are overriden if the user has their own row in the users section.</p>'>?</a>",
|
||||||
"span": 11
|
"span": 11
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -1019,7 +1019,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "id_can_get_and_set_private_user_data",
|
"name": "id_can_get_and_set_private_user_data",
|
||||||
"label": "Can Get and Set Private User Data",
|
"label": "Get and Set Private User Data",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"editable": true,
|
"editable": true,
|
||||||
"default": false
|
"default": false
|
||||||
|
|
|
@ -3857,6 +3857,11 @@ void Application::showHelp() {
|
||||||
//InfoView::show(INFO_HELP_PATH, false, queryString.toString());
|
//InfoView::show(INFO_HELP_PATH, false, queryString.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::gotoTutorial() {
|
||||||
|
const QString TUTORIAL_ADDRESS = "file:///~/serverless/tutorial.json";
|
||||||
|
DependencyManager::get<AddressManager>()->handleLookupString(TUTORIAL_ADDRESS);
|
||||||
|
}
|
||||||
|
|
||||||
void Application::resizeEvent(QResizeEvent* event) {
|
void Application::resizeEvent(QResizeEvent* event) {
|
||||||
resizeGL();
|
resizeGL();
|
||||||
}
|
}
|
||||||
|
@ -4065,7 +4070,7 @@ std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl dom
|
||||||
bool success = tmpTree->readFromByteArray(domainURL.toString(), data);
|
bool success = tmpTree->readFromByteArray(domainURL.toString(), data);
|
||||||
if (success) {
|
if (success) {
|
||||||
tmpTree->reaverageOctreeElements();
|
tmpTree->reaverageOctreeElements();
|
||||||
tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), 0, 0, 0);
|
tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), "domain", 0, 0, 0);
|
||||||
}
|
}
|
||||||
std::map<QString, QString> namedPaths = tmpTree->getNamedPaths();
|
std::map<QString, QString> namedPaths = tmpTree->getNamedPaths();
|
||||||
|
|
||||||
|
@ -5545,8 +5550,8 @@ bool Application::importEntities(const QString& urlOrFilename, const bool isObse
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<EntityItemID> Application::pasteEntities(float x, float y, float z) {
|
QVector<EntityItemID> Application::pasteEntities(const QString& entityHostType, float x, float y, float z) {
|
||||||
return _entityClipboard->sendEntities(&_entityEditSender, getEntities()->getTree(), x, y, z);
|
return _entityClipboard->sendEntities(&_entityEditSender, getEntities()->getTree(), entityHostType, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::init() {
|
void Application::init() {
|
||||||
|
|
|
@ -375,7 +375,7 @@ signals:
|
||||||
void awayStateWhenFocusLostInVRChanged(bool enabled);
|
void awayStateWhenFocusLostInVRChanged(bool enabled);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
QVector<EntityItemID> pasteEntities(float x, float y, float z);
|
QVector<EntityItemID> pasteEntities(const QString& entityHostType, float x, float y, float z);
|
||||||
bool exportEntities(const QString& filename, const QVector<QUuid>& entityIDs, const glm::vec3* givenOffset = nullptr);
|
bool exportEntities(const QString& filename, const QVector<QUuid>& entityIDs, const glm::vec3* givenOffset = nullptr);
|
||||||
bool exportEntities(const QString& filename, float x, float y, float z, float scale);
|
bool exportEntities(const QString& filename, float x, float y, float z, float scale);
|
||||||
bool importEntities(const QString& url, const bool isObservable = true, const qint64 callerId = -1);
|
bool importEntities(const QString& url, const bool isObservable = true, const qint64 callerId = -1);
|
||||||
|
@ -425,6 +425,7 @@ public slots:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void showHelp();
|
static void showHelp();
|
||||||
|
static void gotoTutorial();
|
||||||
|
|
||||||
void cycleCamera();
|
void cycleCamera();
|
||||||
void cameraModeChanged();
|
void cameraModeChanged();
|
||||||
|
|
|
@ -816,6 +816,8 @@ Menu::Menu() {
|
||||||
|
|
||||||
addActionToQMenuAndActionHash(helpMenu, "Controls Reference", 0, qApp, SLOT(showHelp()));
|
addActionToQMenuAndActionHash(helpMenu, "Controls Reference", 0, qApp, SLOT(showHelp()));
|
||||||
|
|
||||||
|
addActionToQMenuAndActionHash(helpMenu, "Tutorial", 0, qApp, SLOT(gotoTutorial()));
|
||||||
|
|
||||||
helpMenu->addSeparator();
|
helpMenu->addSeparator();
|
||||||
|
|
||||||
// Help > Release Notes
|
// Help > Release Notes
|
||||||
|
|
|
@ -60,10 +60,11 @@ bool ClipboardScriptingInterface::importEntities(
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<EntityItemID> ClipboardScriptingInterface::pasteEntities(glm::vec3 position) {
|
QVector<EntityItemID> ClipboardScriptingInterface::pasteEntities(glm::vec3 position, const QString& entityHostType) {
|
||||||
QVector<EntityItemID> retVal;
|
QVector<EntityItemID> retVal;
|
||||||
BLOCKING_INVOKE_METHOD(qApp, "pasteEntities",
|
BLOCKING_INVOKE_METHOD(qApp, "pasteEntities",
|
||||||
Q_RETURN_ARG(QVector<EntityItemID>, retVal),
|
Q_RETURN_ARG(QVector<EntityItemID>, retVal),
|
||||||
|
Q_ARG(const QString&, entityHostType),
|
||||||
Q_ARG(float, position.x),
|
Q_ARG(float, position.x),
|
||||||
Q_ARG(float, position.y),
|
Q_ARG(float, position.y),
|
||||||
Q_ARG(float, position.z));
|
Q_ARG(float, position.z));
|
||||||
|
|
|
@ -117,10 +117,11 @@ public:
|
||||||
* Pastes the contents of the clipboard into the domain.
|
* Pastes the contents of the clipboard into the domain.
|
||||||
* @function Clipboard.pasteEntities
|
* @function Clipboard.pasteEntities
|
||||||
* @param {Vec3} position - The position to paste the clipboard contents at.
|
* @param {Vec3} position - The position to paste the clipboard contents at.
|
||||||
|
* @param {Entities.EntityHostType} [entityHostType="domain"] - The type of entities to create.
|
||||||
* @returns {Uuid[]} The IDs of the new entities that were created as a result of the paste operation. If entities couldn't
|
* @returns {Uuid[]} The IDs of the new entities that were created as a result of the paste operation. If entities couldn't
|
||||||
* be created then an empty array is returned.
|
* be created then an empty array is returned.
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE QVector<EntityItemID> pasteEntities(glm::vec3 position);
|
Q_INVOKABLE QVector<EntityItemID> pasteEntities(glm::vec3 position, const QString& entityHostType = "domain");
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ClipboardScriptingInterface_h
|
#endif // hifi_ClipboardScriptingInterface_h
|
||||||
|
|
|
@ -2657,11 +2657,12 @@ QByteArray EntityTree::remapActionDataIDs(QByteArray actionData, QHash<EntityIte
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<EntityItemID> EntityTree::sendEntities(EntityEditPacketSender* packetSender, EntityTreePointer localTree,
|
QVector<EntityItemID> EntityTree::sendEntities(EntityEditPacketSender* packetSender, EntityTreePointer localTree,
|
||||||
float x, float y, float z) {
|
const QString& entityHostType, float x, float y, float z) {
|
||||||
SendEntitiesOperationArgs args;
|
SendEntitiesOperationArgs args;
|
||||||
args.ourTree = this;
|
args.ourTree = this;
|
||||||
args.otherTree = localTree;
|
args.otherTree = localTree;
|
||||||
args.root = glm::vec3(x, y, z);
|
args.root = glm::vec3(x, y, z);
|
||||||
|
args.entityHostType = entityHostType;
|
||||||
// If this is called repeatedly (e.g., multiple pastes with the same data), the new elements will clash unless we
|
// If this is called repeatedly (e.g., multiple pastes with the same data), the new elements will clash unless we
|
||||||
// use new identifiers. We need to keep a map so that we can map parent identifiers correctly.
|
// use new identifiers. We need to keep a map so that we can map parent identifiers correctly.
|
||||||
QHash<EntityItemID, EntityItemID> map;
|
QHash<EntityItemID, EntityItemID> map;
|
||||||
|
@ -2751,6 +2752,11 @@ bool EntityTree::sendEntitiesOperation(const OctreeElementPointer& element, void
|
||||||
EntityItemID newID = getMapped(oldID);
|
EntityItemID newID = getMapped(oldID);
|
||||||
EntityItemProperties properties = item->getProperties();
|
EntityItemProperties properties = item->getProperties();
|
||||||
|
|
||||||
|
properties.setEntityHostTypeFromString(args->entityHostType);
|
||||||
|
if (properties.getEntityHostType() == entity::HostType::AVATAR) {
|
||||||
|
properties.setOwningAvatarID(AVATAR_SELF_ID);
|
||||||
|
}
|
||||||
|
|
||||||
EntityItemID oldParentID = properties.getParentID();
|
EntityItemID oldParentID = properties.getParentID();
|
||||||
if (oldParentID.isInvalidID()) { // no parent
|
if (oldParentID.isInvalidID()) { // no parent
|
||||||
properties.setPosition(properties.getPosition() + args->root);
|
properties.setPosition(properties.getPosition() + args->root);
|
||||||
|
|
|
@ -40,6 +40,7 @@ public:
|
||||||
class SendEntitiesOperationArgs {
|
class SendEntitiesOperationArgs {
|
||||||
public:
|
public:
|
||||||
glm::vec3 root;
|
glm::vec3 root;
|
||||||
|
QString entityHostType;
|
||||||
EntityTree* ourTree;
|
EntityTree* ourTree;
|
||||||
EntityTreePointer otherTree;
|
EntityTreePointer otherTree;
|
||||||
QHash<EntityItemID, EntityItemID>* map;
|
QHash<EntityItemID, EntityItemID>* map;
|
||||||
|
@ -177,7 +178,7 @@ public:
|
||||||
static QByteArray remapActionDataIDs(QByteArray actionData, QHash<EntityItemID, EntityItemID>& map);
|
static QByteArray remapActionDataIDs(QByteArray actionData, QHash<EntityItemID, EntityItemID>& map);
|
||||||
|
|
||||||
QVector<EntityItemID> sendEntities(EntityEditPacketSender* packetSender, EntityTreePointer localTree,
|
QVector<EntityItemID> sendEntities(EntityEditPacketSender* packetSender, EntityTreePointer localTree,
|
||||||
float x, float y, float z);
|
const QString& entityHostType, float x, float y, float z);
|
||||||
|
|
||||||
void entityChanged(EntityItemPointer entity);
|
void entityChanged(EntityItemPointer entity);
|
||||||
|
|
||||||
|
|
|
@ -249,8 +249,9 @@ public slots:
|
||||||
* Takes you to a specified metaverse address.
|
* Takes you to a specified metaverse address.
|
||||||
* @function location.handleLookupString
|
* @function location.handleLookupString
|
||||||
* @param {string} address - The address to go to: a <code>"hifi://"</code> address, an IP address (e.g.,
|
* @param {string} address - The address to go to: a <code>"hifi://"</code> address, an IP address (e.g.,
|
||||||
* <code>"127.0.0.1"</code> or <code>"localhost"</code>), a domain name, a named path on a domain (starts with
|
* <code>"127.0.0.1"</code> or <code>"localhost"</code>), a <code>file:///</code> address, a domain name, a named path
|
||||||
* <code>"/"</code>), a position or position and orientation, or a user (starts with <code>"@"</code>).
|
* on a domain (starts with <code>"/"</code>), a position or position and orientation, or a user (starts with
|
||||||
|
* <code>"@"</code>).
|
||||||
* @param {boolean} [fromSuggestions=false] - Set to <code>true</code> if the address is obtained from the "Goto" dialog.
|
* @param {boolean} [fromSuggestions=false] - Set to <code>true</code> if the address is obtained from the "Goto" dialog.
|
||||||
* Helps ensure that user's location history is correctly maintained.
|
* Helps ensure that user's location history is correctly maintained.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,8 +28,8 @@ const float ARCSECONDS_PER_ARCMINUTE = 60.0f;
|
||||||
const float ARCSECONDS_PER_DEGREE = ARCMINUTES_PER_DEGREE * ARCSECONDS_PER_ARCMINUTE;
|
const float ARCSECONDS_PER_DEGREE = ARCMINUTES_PER_DEGREE * ARCSECONDS_PER_ARCMINUTE;
|
||||||
|
|
||||||
const float EPSILON = 0.000001f; //smallish positive number - used as margin of error for some computations
|
const float EPSILON = 0.000001f; //smallish positive number - used as margin of error for some computations
|
||||||
const float SQUARE_ROOT_OF_2 = (float)sqrt(2.0f);
|
const float SQUARE_ROOT_OF_2 = 1.414214f;
|
||||||
const float SQUARE_ROOT_OF_3 = (float)sqrt(3.0f);
|
const float SQUARE_ROOT_OF_3 = 1.732051f;
|
||||||
const float METERS_PER_DECIMETER = 0.1f;
|
const float METERS_PER_DECIMETER = 0.1f;
|
||||||
const float METERS_PER_CENTIMETER = 0.01f;
|
const float METERS_PER_CENTIMETER = 0.01f;
|
||||||
const float METERS_PER_MILLIMETER = 0.001f;
|
const float METERS_PER_MILLIMETER = 0.001f;
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<link type="text/css" rel="stylesheet" href="css/FloofChat.css" media="screen,projection"/>
|
<link type="text/css" rel="stylesheet" href="css/FloofChat.css" media="screen,projection"/>
|
||||||
|
|
||||||
<link href="https://fonts.googleapis.com/css?family=Raleway:300,400,600,700" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css?family=Raleway:300,400,600,700" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&display=swap" rel="stylesheet">
|
||||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
@ -28,12 +29,20 @@
|
||||||
</span>
|
</span>
|
||||||
<div class="switch muteSwitch col s2">
|
<div class="switch muteSwitch col s2">
|
||||||
<label>
|
<label>
|
||||||
<span style="font-size: 20px" id="muteText">Mute</span>
|
<span id="muteText">Hide Popups</span>
|
||||||
<input type="checkbox" id="muteInput" onclick="muteSwitchToggle()">
|
<input type="checkbox" id="muteInput" onclick="muteSwitchToggle()">
|
||||||
<span class="lever waves-light"></span>
|
<span class="lever waves-light"></span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="switch muteSwitch col s2">
|
||||||
|
<label>
|
||||||
|
<span id="muteAudioText">Mute Sound</span>
|
||||||
|
<input type="checkbox" id="muteAudioInput" onclick="muteAudioSwitchToggle()">
|
||||||
|
<span class="lever waves-light"></span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<span class="col s1">
|
<span class="col s1">
|
||||||
</span>
|
</span>
|
||||||
<a class="waves-effect waves-light btn col s2" onclick="redock()">Redock</a>
|
<a class="waves-effect waves-light btn col s2" onclick="redock()">Redock</a>
|
||||||
|
@ -46,6 +55,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var muted = {"Local": false, "Domain": false, "Grid": false};
|
var muted = {"Local": false, "Domain": false, "Grid": false};
|
||||||
|
var mutedAudio = {"Local": false, "Domain": false, "Grid": false};
|
||||||
var instance;
|
var instance;
|
||||||
var appUUID;
|
var appUUID;
|
||||||
var messageData = {}; // The data that is sent along with the message.
|
var messageData = {}; // The data that is sent along with the message.
|
||||||
|
@ -171,13 +181,23 @@
|
||||||
case ext == "JPG":
|
case ext == "JPG":
|
||||||
case ext == "GIF":
|
case ext == "GIF":
|
||||||
case ext == "JPEG":
|
case ext == "JPEG":
|
||||||
elContent = elContent.replace(this, "<br/><img src='" + this + "'class=\"responsive z-depth-2\"><br/><a href=\"javascript:gotoClipboard('" + this + "');\" target='_blank'>" + this + "</a>");
|
elContent = elContent.replace(this, "<br/><img src='" + this
|
||||||
|
+ "'class=\"responsive z-depth-2\"><br/><a href=\"javascript:gotoClipboard('" + this + "');\" target='_blank'>" + this
|
||||||
|
+ "</a><a onclick=\"gotoExternalURL('" + this
|
||||||
|
+ "');return false;\"href=\"" + this
|
||||||
|
+ "\">📲</a>");
|
||||||
break;
|
break;
|
||||||
case ext == "iframe":
|
case ext == "iframe":
|
||||||
elContent = elContent.replace(this, "<br/><iframe class=\"z-depth-2\" src='" + this + "'width=\"440\" height=\"248\" frameborder=\"0\"></iframe>");
|
elContent = elContent.replace(this, "<br/><iframe class=\"z-depth-2\" src='" + this
|
||||||
|
+ "'width=\"440\" height=\"248\" frameborder=\"0\"></iframe>");
|
||||||
break;
|
break;
|
||||||
case ext == "webm":
|
case ext == "webm":
|
||||||
elContent = elContent.replace(this, "<br/><video controls class=\"z-depth-2 responsive\"><source src='" + this + "' type='video/" + ext + "'></video><br/><a href=\"javascript:gotoClipboard('" + this + "');\">" + this + "</a>");
|
elContent = elContent.replace(this, "<br/><video controls class=\"z-depth-2 responsive\"><source src='" + this
|
||||||
|
+ "' type='video/" + ext + "'></video><br/><a href=\"javascript:gotoClipboard('" + this
|
||||||
|
+ "');\">" + this
|
||||||
|
+ "</a><a onclick=\"gotoExternalURL('" + this
|
||||||
|
+ "');return false;\"href=\"" + this
|
||||||
|
+ "\">📲</a>");
|
||||||
break;
|
break;
|
||||||
case protocol === "HIFI":
|
case protocol === "HIFI":
|
||||||
case protocol === "hifi":
|
case protocol === "hifi":
|
||||||
|
@ -186,13 +206,24 @@
|
||||||
case !!this.match(/(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g):
|
case !!this.match(/(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g):
|
||||||
var youtubeMatch = this.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
|
var youtubeMatch = this.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
|
||||||
if (youtubeMatch && youtubeMatch[2].length == 11) {
|
if (youtubeMatch && youtubeMatch[2].length == 11) {
|
||||||
elContent = "<br/><iframe class=\"z-depth-2\" width='420' height='236' src='https://www.youtube.com/embed/" + youtubeMatch[2] + "' frameborder='0'></iframe><br/><a href=\"javascript:gotoURL('" + this + "');\">" + this + "</a>";
|
elContent = "<br/><iframe class=\"z-depth-2\" width='420' height='236' src='https://www.youtube.com/embed/" + youtubeMatch[2]
|
||||||
|
+ "' frameborder='0'></iframe><br/><a href=\"javascript:gotoURL('" + this
|
||||||
|
+ "');\">" + this
|
||||||
|
+ "</a><a onclick=\"gotoExternalURL('" + this
|
||||||
|
+ "');return false;\"href=\"" + this
|
||||||
|
+ "\">📲</a>";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// else fall through to default
|
// else fall through to default
|
||||||
default:
|
default:
|
||||||
elContent = elContent.replace(this, "<br/><a href=\"javascript:gotoURL('" + this + "');\">" + this + "</a>");
|
elContent = elContent.replace(this, "<br/><a onclick=\"gotoURL('" + this
|
||||||
|
+ "');return false;\" href=\"" + this
|
||||||
|
+ "\">" + this
|
||||||
|
+ "</a><a onclick=\"gotoExternalURL('" + this
|
||||||
|
+ "');return false;\"href=\"" + this
|
||||||
|
+ "\">📲</a>");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -285,6 +316,10 @@
|
||||||
emitWebEvent({type: "CMD", cmd: "URL", url: url});
|
emitWebEvent({type: "CMD", cmd: "URL", url: url});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function gotoExternalURL(url) {
|
||||||
|
emitWebEvent({ type: "CMD", cmd: "EXTERNALURL", url: url });
|
||||||
|
}
|
||||||
|
|
||||||
function gotoClipboard(url) {
|
function gotoClipboard(url) {
|
||||||
M.toast({html: 'Copied URL to Clipboard', classes: 'rounded pink white-text'});
|
M.toast({html: 'Copied URL to Clipboard', classes: 'rounded pink white-text'});
|
||||||
emitWebEvent({type: "CMD", cmd: "COPY", url: url});
|
emitWebEvent({type: "CMD", cmd: "COPY", url: url});
|
||||||
|
@ -322,7 +357,7 @@
|
||||||
location.reload();
|
location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
function logMessage(userName, message, logScreen, colour) {
|
function logMessage(timestamp, userName, message, logScreen, colour) {
|
||||||
var LogScreen = $("#" + logScreen);
|
var LogScreen = $("#" + logScreen);
|
||||||
var $logLine =
|
var $logLine =
|
||||||
$('<div/>')
|
$('<div/>')
|
||||||
|
@ -333,6 +368,10 @@
|
||||||
.addClass('z-depth-2')
|
.addClass('z-depth-2')
|
||||||
.data('chat-message', message).css("color", rgbToHex(colour))
|
.data('chat-message', message).css("color", rgbToHex(colour))
|
||||||
.appendTo(LogScreen);
|
.appendTo(LogScreen);
|
||||||
|
$('<span/>')
|
||||||
|
.addClass('LogLogLineTimestamp')
|
||||||
|
.text(timestamp).css("color", rgbToHex(colour))
|
||||||
|
.appendTo($logLine);
|
||||||
$('<b/>')
|
$('<b/>')
|
||||||
.addClass('LogLogLineMessage')
|
.addClass('LogLogLineMessage')
|
||||||
.text(userName + ": ").css("color", rgbToHex(colour))
|
.text(userName + ": ").css("color", rgbToHex(colour))
|
||||||
|
@ -350,19 +389,24 @@
|
||||||
|
|
||||||
function time() {
|
function time() {
|
||||||
var d = new Date();
|
var d = new Date();
|
||||||
|
var month = (d.getMonth()).toString();
|
||||||
|
var day = (d.getDate()).toString();
|
||||||
var h = (d.getHours()).toString();
|
var h = (d.getHours()).toString();
|
||||||
var m = (d.getMinutes()).toString();
|
var m = (d.getMinutes()).toString();
|
||||||
var s = (d.getSeconds()).toString();
|
var s = (d.getSeconds()).toString();
|
||||||
var h2 = ("0" + h).slice(-2);
|
var h2 = ("0" + h).slice(-2);
|
||||||
var m2 = ("0" + m).slice(-2);
|
var m2 = ("0" + m).slice(-2);
|
||||||
var s2 = ("0" + s).slice(-2);
|
var s2 = ("0" + s).slice(-2);
|
||||||
s2 += (d.getMilliseconds() / 1000).toFixed(2).slice(1);
|
// s2 += (d.getMilliseconds() / 1000).toFixed(2).slice(1);
|
||||||
return h2 + ":" + m2 + ":" + s2;
|
return month + "/" + day + " - " + h2 + ":" + m2 + ":" + s2;
|
||||||
}
|
}
|
||||||
|
|
||||||
var muteInput;
|
var muteInput;
|
||||||
var muteText;
|
var muteText;
|
||||||
|
|
||||||
|
var muteAudioInput;
|
||||||
|
var muteAudioText;
|
||||||
|
|
||||||
function muteSwitchToggle() {
|
function muteSwitchToggle() {
|
||||||
muted[getCurrTab()] = muteInput.checked;
|
muted[getCurrTab()] = muteInput.checked;
|
||||||
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
||||||
|
@ -370,17 +414,32 @@
|
||||||
emitWebEvent({type: "CMD", cmd: "MUTED", muted: muted});
|
emitWebEvent({type: "CMD", cmd: "MUTED", muted: muted});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function muteAudioSwitchToggle() {
|
||||||
|
mutedAudio[getCurrTab()] = muteAudioInput.checked;
|
||||||
|
muteAudioText.classList.add(muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
|
muteAudioText.classList.remove(!muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
|
emitWebEvent({ type: "CMD", cmd: "MUTEDAUDIO", muted: mutedAudio });
|
||||||
|
}
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
|
|
||||||
muteInput = document.getElementById("muteInput");
|
muteInput = document.getElementById("muteInput");
|
||||||
muteText = document.getElementById("muteText");
|
muteText = document.getElementById("muteText");
|
||||||
|
|
||||||
|
muteAudioInput = document.getElementById("muteAudioInput");
|
||||||
|
muteAudioText = document.getElementById("muteAudioText");
|
||||||
|
|
||||||
instance = M.Tabs.init(document.getElementById("tabs"), {
|
instance = M.Tabs.init(document.getElementById("tabs"), {
|
||||||
"onShow": function (e) {
|
"onShow": function (e) {
|
||||||
scrollChatLog(getCurrTab());
|
scrollChatLog(getCurrTab());
|
||||||
|
|
||||||
muteInput.checked = muted[getCurrTab()];
|
muteInput.checked = muted[getCurrTab()];
|
||||||
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
||||||
muteText.classList.remove(!muteInput.checked ? "red-text" : "white-text");
|
muteText.classList.remove(!muteInput.checked ? "red-text" : "white-text");
|
||||||
|
|
||||||
|
muteAudioInput.checked = mutedAudio[getCurrTab()];
|
||||||
|
muteAudioText.classList.add(muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
|
muteAudioText.classList.remove(!muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
instance.select("Local");
|
instance.select("Local");
|
||||||
|
@ -430,11 +489,11 @@
|
||||||
var temp = cmd.data;
|
var temp = cmd.data;
|
||||||
if (temp.length === 1) {
|
if (temp.length === 1) {
|
||||||
var temp2 = temp[0];
|
var temp2 = temp[0];
|
||||||
logMessage("[" + temp2[0] + "] " + temp2[2], temp2[1], temp2[4], temp2[3]);
|
logMessage("[" + temp2[0] + "] ", temp2[2], temp2[1], temp2[4], temp2[3]);
|
||||||
scrollChatLog(temp2[4]);
|
scrollChatLog(temp2[4]);
|
||||||
} else if (temp.length > 1) {
|
} else if (temp.length > 1) {
|
||||||
temp.forEach(function (msg) {
|
temp.forEach(function (msg) {
|
||||||
logMessage("[" + msg[0] + "] " + msg[2], msg[1], msg[4], msg[3]);
|
logMessage("[" + msg[0] + "] ", msg[2], msg[1], msg[4], msg[3]);
|
||||||
scrollChatLog(msg[4]);
|
scrollChatLog(msg[4]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -445,6 +504,12 @@
|
||||||
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
muteText.classList.add(muteInput.checked ? "red-text" : "white-text");
|
||||||
muteText.classList.remove(!muteInput.checked ? "red-text" : "white-text");
|
muteText.classList.remove(!muteInput.checked ? "red-text" : "white-text");
|
||||||
}
|
}
|
||||||
|
if (cmd.cmd === "MUTEDAUDIO") {
|
||||||
|
mutedAudio = cmd.muted;
|
||||||
|
muteAudioInput.checked = mutedAudio[getCurrTab()];
|
||||||
|
muteAudioText.classList.add(muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
|
muteAudioText.classList.remove(!muteAudioInput.checked ? "red-text" : "white-text");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, 100); // Delay to allow everything to settle
|
}, 100); // Delay to allow everything to settle
|
|
@ -23,6 +23,12 @@ var SHIFT_KEY = 33554432;
|
||||||
var FLOOF_CHAT_CHANNEL = "Chat";
|
var FLOOF_CHAT_CHANNEL = "Chat";
|
||||||
var FLOOF_NOTIFICATION_CHANNEL = "Floof-Notif";
|
var FLOOF_NOTIFICATION_CHANNEL = "Floof-Notif";
|
||||||
|
|
||||||
|
var MAIN_CHAT_WINDOW_HEIGHT = 450;
|
||||||
|
var MAIN_CHAT_WINDOW_WIDTH = 750;
|
||||||
|
|
||||||
|
var CHAT_BAR_HISTORY_LIMIT = 256;
|
||||||
|
var CHAT_HISTORY_LIMIT = 500;
|
||||||
|
|
||||||
Script.scriptEnding.connect(function () {
|
Script.scriptEnding.connect(function () {
|
||||||
shutdown();
|
shutdown();
|
||||||
});
|
});
|
||||||
|
@ -41,8 +47,8 @@ var appUUID = Uuid.generate();
|
||||||
|
|
||||||
var chatBar;
|
var chatBar;
|
||||||
var chatHistory;
|
var chatHistory;
|
||||||
var chatBarHistoryLimit = Settings.getValue(settingsRoot + "/chatBarHistoryLimit", 256);
|
var chatBarHistoryLimit = Settings.getValue(settingsRoot + "/chatBarHistoryLimit", CHAT_BAR_HISTORY_LIMIT);
|
||||||
var chatHistoryLimit = Settings.getValue(settingsRoot + "/chatHistoryLimit", 500);
|
var chatHistoryLimit = Settings.getValue(settingsRoot + "/chatHistoryLimit", CHAT_HISTORY_LIMIT);
|
||||||
var chatBarHistory = Settings.getValue(settingsRoot + "/chatBarHistory", ["Meow :3"]);
|
var chatBarHistory = Settings.getValue(settingsRoot + "/chatBarHistory", ["Meow :3"]);
|
||||||
var historyLog = [];
|
var historyLog = [];
|
||||||
|
|
||||||
|
@ -50,14 +56,16 @@ var visible = false;
|
||||||
var historyVisible = false;
|
var historyVisible = false;
|
||||||
var settingsRoot = "FloofChat";
|
var settingsRoot = "FloofChat";
|
||||||
|
|
||||||
var athenaGotoUrl = "https://metaverse.projectathena.io/interim/d-goto/app/goto.json";
|
var vircadiaGotoUrl = "https://metaverse.vircadia.com/interim/d-goto/app/goto.json";
|
||||||
var gotoJSONUrl = Settings.getValue(settingsRoot + "/gotoJSONUrl", athenaGotoUrl);
|
var gotoJSONUrl = Settings.getValue(settingsRoot + "/gotoJSONUrl", vircadiaGotoUrl);
|
||||||
|
|
||||||
var muted = Settings.getValue(settingsRoot + "/muted", {"Local": false, "Domain": false, "Grid": true});
|
var muted = Settings.getValue(settingsRoot + "/muted", {"Local": false, "Domain": false, "Grid": true});
|
||||||
|
var mutedAudio = Settings.getValue(settingsRoot + "/mutedAudio", {"Local": false, "Domain": false, "Grid": true});
|
||||||
|
var notificationSound = SoundCache.getSound(Script.resolvePath("resources/bubblepop.wav"));
|
||||||
|
|
||||||
var ws;
|
var ws;
|
||||||
var wsReady = false;
|
var wsReady = false;
|
||||||
var WEB_SOCKET_URL = "ws://chat.projectathena.io:8880"; // WebSocket for Grid chat.
|
var WEB_SOCKET_URL = "ws://chat.vircadia.com:8880"; // WebSocket for Grid chat.
|
||||||
var shutdownBool = false;
|
var shutdownBool = false;
|
||||||
|
|
||||||
var defaultColour = {red: 255, green: 255, blue: 255};
|
var defaultColour = {red: 255, green: 255, blue: 255};
|
||||||
|
@ -80,12 +88,12 @@ function init() {
|
||||||
setupHistoryWindow(false);
|
setupHistoryWindow(false);
|
||||||
|
|
||||||
chatBar = new OverlayWindow({
|
chatBar = new OverlayWindow({
|
||||||
source: Paths.defaultScripts + '/communityModules/chat/FloofChat.qml?' + Date.now(),
|
source: ROOT + "FloofChat.qml?" + Date.now(),
|
||||||
width: 360,
|
width: 360,
|
||||||
height: 180
|
height: 180
|
||||||
});
|
});
|
||||||
|
|
||||||
button.clicked.connect(toggleChatHistory);
|
button.clicked.connect(toggleMainChatWindow);
|
||||||
chatBar.fromQml.connect(fromQml);
|
chatBar.fromQml.connect(fromQml);
|
||||||
chatBar.sendToQml(JSON.stringify({visible: false, history: chatBarHistory}));
|
chatBar.sendToQml(JSON.stringify({visible: false, history: chatBarHistory}));
|
||||||
Controller.keyPressEvent.connect(keyPressEvent);
|
Controller.keyPressEvent.connect(keyPressEvent);
|
||||||
|
@ -106,6 +114,11 @@ function connectWebSocket(timeout) {
|
||||||
}
|
}
|
||||||
if (!cmd.FAILED) {
|
if (!cmd.FAILED) {
|
||||||
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
||||||
|
|
||||||
|
if (!mutedAudio["Grid"] && MyAvatar.sessionDisplayName !== cmd.displayName) {
|
||||||
|
playNotificationSound();
|
||||||
|
}
|
||||||
|
|
||||||
if (!muted["Grid"]) {
|
if (!muted["Grid"]) {
|
||||||
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
||||||
sender: "(G) " + cmd.displayName,
|
sender: "(G) " + cmd.displayName,
|
||||||
|
@ -166,13 +179,13 @@ function setupHistoryWindow() {
|
||||||
chatHistory = new OverlayWebWindow({
|
chatHistory = new OverlayWebWindow({
|
||||||
title: 'Chat',
|
title: 'Chat',
|
||||||
source: ROOT + "FloofChat.html?appUUID=" + appUUID + "&" + Date.now(),
|
source: ROOT + "FloofChat.html?appUUID=" + appUUID + "&" + Date.now(),
|
||||||
width: 900,
|
width: MAIN_CHAT_WINDOW_WIDTH,
|
||||||
height: 700,
|
height: MAIN_CHAT_WINDOW_HEIGHT,
|
||||||
visible: false
|
visible: false
|
||||||
});
|
});
|
||||||
chatHistory.setPosition({x: 0, y: Window.innerHeight - 700});
|
chatHistory.setPosition({x: 0, y: Window.innerHeight - MAIN_CHAT_WINDOW_HEIGHT});
|
||||||
chatHistory.webEventReceived.connect(onWebEventReceived);
|
chatHistory.webEventReceived.connect(onWebEventReceived);
|
||||||
chatHistory.closed.connect(toggleChatHistory);
|
chatHistory.closed.connect(toggleMainChatWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitScriptEvent(obj) {
|
function emitScriptEvent(obj) {
|
||||||
|
@ -180,7 +193,7 @@ function emitScriptEvent(obj) {
|
||||||
tablet.emitScriptEvent(JSON.stringify(obj));
|
tablet.emitScriptEvent(JSON.stringify(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleChatHistory() {
|
function toggleMainChatWindow() {
|
||||||
historyVisible = !historyVisible;
|
historyVisible = !historyVisible;
|
||||||
button.editProperties({isActive: historyVisible});
|
button.editProperties({isActive: historyVisible});
|
||||||
chatHistory.visible = historyVisible;
|
chatHistory.visible = historyVisible;
|
||||||
|
@ -282,18 +295,23 @@ function onWebEventReceived(event) {
|
||||||
if (event.type === "ready") {
|
if (event.type === "ready") {
|
||||||
chatHistory.emitScriptEvent(JSON.stringify({type: "MSG", data: historyLog}));
|
chatHistory.emitScriptEvent(JSON.stringify({type: "MSG", data: historyLog}));
|
||||||
chatHistory.emitScriptEvent(JSON.stringify({type: "CMD", cmd: "MUTED", muted: muted}));
|
chatHistory.emitScriptEvent(JSON.stringify({type: "CMD", cmd: "MUTED", muted: muted}));
|
||||||
|
chatHistory.emitScriptEvent(JSON.stringify({type: "CMD", cmd: "MUTEDAUDIO", muted: mutedAudio}));
|
||||||
}
|
}
|
||||||
if (event.type === "CMD") {
|
if (event.type === "CMD") {
|
||||||
if (event.cmd === "MUTED") {
|
if (event.cmd === "MUTED") {
|
||||||
muted = event.muted;
|
muted = event.muted;
|
||||||
Settings.setValue(settingsRoot + "/muted", muted);
|
Settings.setValue(settingsRoot + "/muted", muted);
|
||||||
}
|
}
|
||||||
|
if (event.cmd === "MUTEDAUDIO") {
|
||||||
|
mutedAudio = event.muted;
|
||||||
|
Settings.setValue(settingsRoot + "/mutedAudio", mutedAudio);
|
||||||
|
}
|
||||||
if (event.cmd === "COLOUR") {
|
if (event.cmd === "COLOUR") {
|
||||||
Settings.setValue(settingsRoot + "/" + event.colourType + "Colour", event.colour);
|
Settings.setValue(settingsRoot + "/" + event.colourType + "Colour", event.colour);
|
||||||
colours[event.colourType] = event.colour;
|
colours[event.colourType] = event.colour;
|
||||||
}
|
}
|
||||||
if (event.cmd === "REDOCK") {
|
if (event.cmd === "REDOCK") {
|
||||||
chatHistory.setPosition({x: 0, y: Window.innerHeight - 700});
|
chatHistory.setPosition({x: 0, y: Window.innerHeight - MAIN_CHAT_WINDOW_HEIGHT});
|
||||||
}
|
}
|
||||||
if (event.cmd === "GOTO") {
|
if (event.cmd === "GOTO") {
|
||||||
gotoConfirm(event.url);
|
gotoConfirm(event.url);
|
||||||
|
@ -307,12 +325,15 @@ function onWebEventReceived(event) {
|
||||||
visible: true
|
visible: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (event.cmd === "EXTERNALURL") {
|
||||||
|
Window.openUrl(event.url);
|
||||||
|
}
|
||||||
if (event.cmd === "COPY") {
|
if (event.cmd === "COPY") {
|
||||||
Window.copyToClipboard(event.url);
|
Window.copyToClipboard(event.url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event.type === "WEBMSG") {
|
if (event.type === "WEBMSG") {
|
||||||
event.avatarName = MyAvatar.displayName;
|
event.avatarName = MyAvatar.sessionDisplayName;
|
||||||
event = processChat(event);
|
event = processChat(event);
|
||||||
if (event.message === "") return;
|
if (event.message === "") return;
|
||||||
sendWS({
|
sendWS({
|
||||||
|
@ -325,7 +346,7 @@ function onWebEventReceived(event) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (event.type === "MSG") {
|
if (event.type === "MSG") {
|
||||||
event.avatarName = MyAvatar.displayName;
|
event.avatarName = MyAvatar.sessionDisplayName;
|
||||||
event = processChat(event);
|
event = processChat(event);
|
||||||
if (event.message === "") return;
|
if (event.message === "") return;
|
||||||
Messages.sendMessage("Chat", JSON.stringify({
|
Messages.sendMessage("Chat", JSON.stringify({
|
||||||
|
@ -340,6 +361,17 @@ function onWebEventReceived(event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function playNotificationSound() {
|
||||||
|
if (notificationSound.downloaded) {
|
||||||
|
var injectorOptions = {
|
||||||
|
localOnly: true,
|
||||||
|
position: MyAvatar.position,
|
||||||
|
volume: 0.02
|
||||||
|
};
|
||||||
|
Audio.playSound(notificationSound, injectorOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function replaceFormatting(text) {
|
function replaceFormatting(text) {
|
||||||
var found = false;
|
var found = false;
|
||||||
if (text.indexOf("**") !== -1) {
|
if (text.indexOf("**") !== -1) {
|
||||||
|
@ -423,6 +455,11 @@ function messageReceived(channel, message) {
|
||||||
if (cmd.channel === "Local") {
|
if (cmd.channel === "Local") {
|
||||||
if (Vec3.withinEpsilon(MyAvatar.position, cmd.position, 20)) {
|
if (Vec3.withinEpsilon(MyAvatar.position, cmd.position, 20)) {
|
||||||
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
||||||
|
|
||||||
|
if (!mutedAudio["Local"] && MyAvatar.sessionDisplayName !== cmd.displayName) {
|
||||||
|
playNotificationSound();
|
||||||
|
}
|
||||||
|
|
||||||
if (!muted["Local"]) {
|
if (!muted["Local"]) {
|
||||||
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
||||||
sender: "(L) " + cmd.displayName,
|
sender: "(L) " + cmd.displayName,
|
||||||
|
@ -433,6 +470,11 @@ function messageReceived(channel, message) {
|
||||||
}
|
}
|
||||||
} else if (cmd.channel === "Domain") {
|
} else if (cmd.channel === "Domain") {
|
||||||
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
||||||
|
|
||||||
|
if (!mutedAudio["Domain"] && MyAvatar.sessionDisplayName !== cmd.displayName) {
|
||||||
|
playNotificationSound();
|
||||||
|
}
|
||||||
|
|
||||||
if (!muted["Domain"]) {
|
if (!muted["Domain"]) {
|
||||||
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
||||||
sender: "(D) " + cmd.displayName,
|
sender: "(D) " + cmd.displayName,
|
||||||
|
@ -442,6 +484,11 @@ function messageReceived(channel, message) {
|
||||||
}
|
}
|
||||||
} else if (cmd.channel === "Grid") {
|
} else if (cmd.channel === "Grid") {
|
||||||
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
||||||
|
|
||||||
|
if (!mutedAudio["Grid"] && MyAvatar.sessionDisplayName !== cmd.displayName) {
|
||||||
|
playNotificationSound();
|
||||||
|
}
|
||||||
|
|
||||||
if (!muted["Grid"]) {
|
if (!muted["Grid"]) {
|
||||||
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
||||||
sender: "(G) " + cmd.displayName,
|
sender: "(G) " + cmd.displayName,
|
||||||
|
@ -451,6 +498,11 @@ function messageReceived(channel, message) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
addToLog(cmd.message, cmd.displayName, cmd.colour, cmd.channel);
|
||||||
|
|
||||||
|
if (MyAvatar.sessionDisplayName !== cmd.displayName) {
|
||||||
|
playNotificationSound();
|
||||||
|
}
|
||||||
|
|
||||||
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
Messages.sendLocalMessage(FLOOF_NOTIFICATION_CHANNEL, JSON.stringify({
|
||||||
sender: cmd.displayName,
|
sender: cmd.displayName,
|
||||||
text: replaceFormatting(cmd.message),
|
text: replaceFormatting(cmd.message),
|
||||||
|
@ -464,19 +516,22 @@ function messageReceived(channel, message) {
|
||||||
|
|
||||||
function time() {
|
function time() {
|
||||||
var d = new Date();
|
var d = new Date();
|
||||||
|
var month = (d.getMonth()).toString();
|
||||||
|
var day = (d.getDate()).toString();
|
||||||
var h = (d.getHours()).toString();
|
var h = (d.getHours()).toString();
|
||||||
var m = (d.getMinutes()).toString();
|
var m = (d.getMinutes()).toString();
|
||||||
var s = (d.getSeconds()).toString();
|
var s = (d.getSeconds()).toString();
|
||||||
var h2 = ("0" + h).slice(-2);
|
var h2 = ("0" + h).slice(-2);
|
||||||
var m2 = ("0" + m).slice(-2);
|
var m2 = ("0" + m).slice(-2);
|
||||||
var s2 = ("0" + s).slice(-2);
|
var s2 = ("0" + s).slice(-2);
|
||||||
s2 += (d.getMilliseconds() / 1000).toFixed(2).slice(1);
|
// s2 += (d.getMilliseconds() / 1000).toFixed(2).slice(1);
|
||||||
return h2 + ":" + m2 + ":" + s2;
|
return month + "/" + day + " - " + h2 + ":" + m2 + ":" + s2;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addToLog(msg, dp, colour, tab) {
|
function addToLog(msg, dp, colour, tab) {
|
||||||
historyLog.push([time(), msg, dp, colour, tab]);
|
var currentTimestamp = time();
|
||||||
chatHistory.emitScriptEvent(JSON.stringify({type: "MSG", data: [[time(), msg, dp, colour, tab]]}));
|
historyLog.push([currentTimestamp, msg, dp, colour, tab]);
|
||||||
|
chatHistory.emitScriptEvent(JSON.stringify({ type: "MSG", data: [[currentTimestamp, msg, dp, colour, tab]]}));
|
||||||
while (historyLog.length > chatHistoryLimit) {
|
while (historyLog.length > chatHistoryLimit) {
|
||||||
historyLog.shift();
|
historyLog.shift();
|
||||||
}
|
}
|
||||||
|
@ -503,7 +558,7 @@ function fromQml(message) {
|
||||||
if (cmd.message !== "") {
|
if (cmd.message !== "") {
|
||||||
addToChatBarHistory(cmd.message);
|
addToChatBarHistory(cmd.message);
|
||||||
if (cmd.event.modifiers === CONTROL_KEY) {
|
if (cmd.event.modifiers === CONTROL_KEY) {
|
||||||
cmd.avatarName = MyAvatar.displayName;
|
cmd.avatarName = MyAvatar.sessionDisplayName;
|
||||||
cmd = processChat(cmd);
|
cmd = processChat(cmd);
|
||||||
if (cmd.message === "") return;
|
if (cmd.message === "") return;
|
||||||
Messages.sendMessage(FLOOF_CHAT_CHANNEL, JSON.stringify({
|
Messages.sendMessage(FLOOF_CHAT_CHANNEL, JSON.stringify({
|
||||||
|
@ -512,7 +567,7 @@ function fromQml(message) {
|
||||||
displayName: cmd.avatarName
|
displayName: cmd.avatarName
|
||||||
}));
|
}));
|
||||||
} else if (cmd.event.modifiers === CONTROL_KEY + SHIFT_KEY) {
|
} else if (cmd.event.modifiers === CONTROL_KEY + SHIFT_KEY) {
|
||||||
cmd.avatarName = MyAvatar.displayName;
|
cmd.avatarName = MyAvatar.sessionDisplayName;
|
||||||
cmd = processChat(cmd);
|
cmd = processChat(cmd);
|
||||||
if (cmd.message === "") return;
|
if (cmd.message === "") return;
|
||||||
sendWS({
|
sendWS({
|
||||||
|
@ -524,7 +579,7 @@ function fromQml(message) {
|
||||||
displayName: cmd.avatarName
|
displayName: cmd.avatarName
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cmd.avatarName = MyAvatar.displayName;
|
cmd.avatarName = MyAvatar.sessionDisplayName;
|
||||||
cmd = processChat(cmd);
|
cmd = processChat(cmd);
|
||||||
if (cmd.message === "") return;
|
if (cmd.message === "") return;
|
||||||
Messages.sendMessage(FLOOF_CHAT_CHANNEL, JSON.stringify({
|
Messages.sendMessage(FLOOF_CHAT_CHANNEL, JSON.stringify({
|
||||||
|
@ -540,7 +595,7 @@ function fromQml(message) {
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
} else if (cmd.type === "CMD") {
|
} else if (cmd.type === "CMD") {
|
||||||
if (cmd.cmd === "Clicked") {
|
if (cmd.cmd === "Clicked") {
|
||||||
toggleChatHistory()
|
toggleMainChatWindow()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -565,7 +620,7 @@ function setVisible(_visible) {
|
||||||
|
|
||||||
function keyPressEvent(event) {
|
function keyPressEvent(event) {
|
||||||
if (event.key === H_KEY && !event.isAutoRepeat && event.isControl) {
|
if (event.key === H_KEY && !event.isAutoRepeat && event.isControl) {
|
||||||
toggleChatHistory()
|
toggleMainChatWindow()
|
||||||
}
|
}
|
||||||
if (event.key === ENTER_KEY && !event.isAutoRepeat && !visible) {
|
if (event.key === ENTER_KEY && !event.isAutoRepeat && !visible) {
|
||||||
setVisible(true);
|
setVisible(true);
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
@ -50,6 +50,12 @@ div.dockButton button.active {
|
||||||
border-top: none;
|
border-top: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#tabs {
|
||||||
|
width: 250px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -69,9 +75,10 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.ChatLog {
|
.ChatLog {
|
||||||
height: calc(100vh - 137px);
|
height: calc(100vh - 127px);
|
||||||
padding: 20px !important;
|
padding: 10px !important;
|
||||||
font-size: 20px;
|
font-size: 18px;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
color: white;
|
color: white;
|
||||||
background-color: black;
|
background-color: black;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
@ -80,7 +87,7 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.ChatLogLine {
|
.ChatLogLine {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ChatLogLineDisplayName {
|
.ChatLogLineDisplayName {
|
||||||
|
@ -91,25 +98,30 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.LogLogLine {
|
.LogLogLine {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 7px;
|
||||||
padding: 10px !important;
|
padding: 6px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.LogLogLineMessage {
|
.LogLogLineMessage {
|
||||||
/*font-style: italic;*/
|
/*font-style: italic;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.LogLogLineTimestamp {
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
.ChatInput {
|
.ChatInput {
|
||||||
color: #252525;
|
color: #252525;
|
||||||
background: #252525;
|
background: #252525;
|
||||||
height: 60px !important;
|
height: 45px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ChatInputText {
|
.ChatInputText {
|
||||||
padding: 5px !important;
|
padding: 5px 5px 5px 10px !important;
|
||||||
height: 50px !important;
|
height: 35px !important;
|
||||||
width: calc(100vw - 20px) !important;
|
width: calc(100vw - 20px) !important;
|
||||||
font-size: 20px !important;
|
font-size: 18px !important;
|
||||||
background-color: white !important;
|
background-color: white !important;
|
||||||
border-style: solid !important;
|
border-style: solid !important;
|
||||||
border-color: #232323 !important;
|
border-color: #232323 !important;
|
||||||
|
@ -146,6 +158,14 @@ body {
|
||||||
background-color: #a62113 !important;
|
background-color: #a62113 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#muteText {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#muteAudioText {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
img, a{
|
img, a{
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
BIN
scripts/communityScripts/chat/resources/bubblepop.wav
Normal file
BIN
scripts/communityScripts/chat/resources/bubblepop.wav
Normal file
Binary file not shown.
|
@ -34,16 +34,15 @@ var DEFAULT_SCRIPTS_COMBINED = [
|
||||||
"system/miniTablet.js",
|
"system/miniTablet.js",
|
||||||
"system/audioMuteOverlay.js",
|
"system/audioMuteOverlay.js",
|
||||||
"system/inspect.js",
|
"system/inspect.js",
|
||||||
"system/keyboardShortcuts/keyboardShortcuts.js",
|
"system/keyboardShortcuts/keyboardShortcuts.js"
|
||||||
"system/hand-track-walk.js"
|
|
||||||
];
|
];
|
||||||
var DEFAULT_SCRIPTS_SEPARATE = [
|
var DEFAULT_SCRIPTS_SEPARATE = [
|
||||||
"system/controllers/controllerScripts.js",
|
"system/controllers/controllerScripts.js",
|
||||||
"communityModules/notificationCore/notificationCore.js",
|
"communityScripts/notificationCore/notificationCore.js",
|
||||||
"simplifiedUI/ui/simplifiedNametag/simplifiedNametag.js",
|
"simplifiedUI/ui/simplifiedNametag/simplifiedNametag.js",
|
||||||
{"stable": "system/more/app-more.js", "beta": "https://cdn.vircadia.com/community-apps/more/app-more.js"},
|
{"stable": "system/more/app-more.js", "beta": "https://cdn.vircadia.com/community-apps/more/app-more.js"},
|
||||||
{"stable": "communityScripts/explore/explore.js", "beta": "https://metaverse.vircadia.com/interim/d-goto/app/explore.js"},
|
{"stable": "communityScripts/explore/explore.js", "beta": "https://metaverse.vircadia.com/interim/d-goto/app/explore.js"},
|
||||||
{"stable": "communityModules/chat/FloofChat.js", "beta": "https://content.fluffy.ws/scripts/chat/FloofChat.js"}
|
{"stable": "communityScripts/chat/FloofChat.js", "beta": "https://content.fluffy.ws/scripts/chat/FloofChat.js"}
|
||||||
//"system/chat.js"
|
//"system/chat.js"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
// Created by Keb Helion, February 2020.
|
// Created by Keb Helion, February 2020.
|
||||||
// Copyright 2020 Vircadia contributors.
|
// Copyright 2020 Vircadia contributors.
|
||||||
//
|
//
|
||||||
// This script adds a "More Apps" selector to "Vircadia" to allow the user to add optional functionalities to the tablet.
|
// This script adds a "More Apps" selector to Vircadia to allow the user to add optional functionalities to the tablet.
|
||||||
// This application has been designed to work directly from the Github repository.
|
// This application has been designed to work directly from the Github repository.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -42,6 +42,10 @@ p a {
|
||||||
color: SteelBlue;
|
color: SteelBlue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.appdesc a {
|
||||||
|
color: LightBlue;
|
||||||
|
}
|
||||||
|
|
||||||
font.appname {
|
font.appname {
|
||||||
font-family: 'Merriweather', sans-serif;
|
font-family: 'Merriweather', sans-serif;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
|
|
Loading…
Reference in a new issue