-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.d.ts
1473 lines (1268 loc) · 59.5 KB
/
index.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
declare module 'vatom-spaces-plugins' {
/** 2D vector */
interface Vector2 {
x: number,
y: number
}
/** 3D vector */
interface Vector3 {
x: number,
y: number,
z: number
}
/** Quaternion */
interface Quaternion {
x: number,
y: number,
z: number,
w: number,
}
/** Details about a plugin */
interface PluginDetails {
/** Identifier of the plugin */
id: string,
/** Name of the plugin */
name: string,
/** Description of the plugin */
description: string,
/** Identifier of the business that created the plugin */
business_id: string,
/** Version of the plugin */
version: number
}
/** Response from the payments API */
interface PaymentResponse {
/** Date, in milliseconds, of the last update */
lastUpdate: number,
/** `true` if the payment method is valid, `false` otherwise */
isValid: boolean,
/** Status of the payment details */
status: string
}
/** Event that contains information from an input capture */
interface InputCaptureEvent {
/** Width of the current window. */
windowWidth: number,
/** Height of the current window. */
windowHeight: number,
/** Identifier of the object given when the request started. */
objectID: string,
/** World co-ordinates of the hit point (only if an object identifier was given). */
point?: Vector3,
/** UV co-ordinates of the hit point (only if an object identifier was given). Useful for interacting with 2D content on a 3D plane. */
uv?: Vector2
}
/** Options relating to playback of audio */
interface AudioOptions {
/** Position in the x axis. */
x: number,
/** Position in the y axis. */
height: number,
/** Position in the z axis. */
y: number,
/** Radius around the position in which to play the sound. */
radius: number,
/** Volume at which to play the sound. Value should be between 0 and 1. Default is 1, which indicates full volume. */
volume: number
}
/** Used for registering hooks that propagate client-side */
interface Hook {
/** Name of the hook. */
name: string,
/** Function to execute when the hook is triggered. */
callback: HookCallback
}
/** Represents a panel that can be attached to a menu item. */
interface MenuPanel {
/** URL to display in this panel as an iframe. Cannot use in conjunction with `component`. */
iframeURL?: string,
/** A React component to display. The component will receive the following props: `plugin`, `onClose`. Cannot use in conjunction with `iframeURL`. */
component?: any,
/** Width of the panel. Default is 320 pixels. */
width?: number,
/** Maximum height (in pixels) that the panel should be. Defaults to the height of the content inside. */
maxHeight?: number,
/** When using the "plugin-settings" section, these are the settings used. */
fields?: ComponentSettings[]
}
/** Represents a menu item that can be registered */
interface MenuItem {
/** Identifier of the menu item. */
id: string,
/** URL to the icon for the menu. */
icon: string,
/** Text to display under the icon. */
text: string,
/** Location of the menu item. */
section: "controls" | "usermenu" | "infopanel" | "overlay-top" | "plugin-settings" | "start-screen" | "file-menu" | "insert-object" | "admin-panel",
/** Title of the icon. */
title: string,
/** Color that will be used for both the icon and the text. */
color: string,
/** Color that will be used for just the text. Defaults to `color` if not given. */
textColor?: string,
/** Sorting order for this item, ranging from 0 (on the left) to infinity (on the right). Default is 0. */
order?: number,
/** `true` when the menu item should stay either on or off (e.g: mute/unmute or avatar video), `false` otherwise. Default is `false`. */
persistent?: boolean,
/** `true` to use the actual icon provided (instead of changing icon color), `false` to change icon color based on `color` field. Default is `false`. */
useRawIcon?: boolean,
/** `true` to hide the menu item from non-admins, `false` to show the menu item to non-admins. Default is `false`. */
adminOnly?: boolean,
/** If `true` and section == 'usermenu', the menu icon appears on the current user's options. Default is `false`. */
currentUser?: boolean,
/** If `false` and section == 'usermenu', the menu icon does not appear on other user's options. Default is `true`. */
otherUsers?: boolean,
/** Number to show as a notification badge on the menu item. Does not display a badge for values <= 0. */
badgeCount?: number,
/** Called when the menu button is pressed. */
action?: (evt: { id: string, name: string, profileURL: string }) => void,
/** Panel that will be displayed when this menu item is clicked. */
panel: MenuPanel
}
/** Options for a promp popup */
interface PromptOptions {
/** Icon to show. */
icon?: PopupIcon,
/** Title of the prompt. Default is the name of the plugin. */
title?: string,
/** Text to display. */
text?: string,
/** Type of input to show. */
inputType?: "text" | "textarea" | "email" | "password" | "number" | "tel" | "url",
/** Initial value to display in the input. */
initialValue?: string,
/** Placeholder text to show when no value is specified. */
placeholder?: string
}
/** Options for a Toast message */
interface ToastOptions {
/** Icon to display on the left of the message. */
icon?: string,
/** Text to display. */
text?: string,
/** Color of the text. */
textColor?: string,
/** Duration to show the message for. */
duration?: number,
/** `true` if the message should not automatically close, `false` otherwise. */
isSticky?: boolean,
/** Color of the action and cancel button text. */
buttonColor?: string,
/** Text to display on an action button to the right of the message. */
buttonText?: string,
/** Function to execute when the action button is clicked. */
buttonAction?: () => {},
/** Text to display on a cancel button to the right of the message. */
buttonCancelText?: string,
/** Function to execute when the cancel button is clicked. */
buttonCancelAction?: () => {}
}
/** Item to show as a popup. */
interface PopupItem {
/** Title of the popup. */
title: string,
/** Panel that should be displayed. */
panel: MenuPanel
}
/** Options relating to the user status bar */
interface StatusOptions {
/** Identifier of the user you would like to create this item for. Default is your own user ID. */
userID: string,
/** Order in which to display this top status icon. */
order: number,
/** Size of the top status icon. */
size: number,
/** Width of the top status icon. */
width: number,
/** Height of the top status icon. */
height: number
}
/** Options relating to the animation of an object */
interface AnimateOptions {
/** Identifer of the object to animate. */
target: string,
/** Final properties of the object after the animation finishes. Cannot be used in conjunction with `field`. */
final: MapItemProperties,
/** Field to animate. Cannot be used in conjunction with `final`. */
field: "position.x" | "position.y" | "position.z" | "scale" | "opacity",
/** Final value to animate to. */
value: any,
/** Number of milliseconds to show the animation for. */
duration: number,
/** Number of milliseconds to wait before starting the animation. */
delay: number,
/** `true` to save the final state (after the animation completes) to the database, `false` otherwise. */
save: boolean
}
/** Instance for a component */
interface ComponentInstance {
/** Reference to the plugin that registered this component. */
plugin: BasePlugin
/** Identifier of this component instance. */
componentID: string,
/** Identifier of the object that this component is attached to. */
objectID: string,
/** Properties for the object that this component is attached to. */
fields: MapItemProperties
}
/** Vertex point for an object */
interface VertexPoint {
/** Identifier of the vertex point */
id: string,
/** Name of the vertext point */
name: string,
/** List of vertices */
vertices: Vector3[],
/** List of indices */
indices: number[]
}
/** Settings for a component */
interface ComponentSettings {
/** Identifier of this setting. */
id: string,
/** Name of this setting. */
name: string,
/** Type of this setting. */
type: ComponentSettingsType,
/** Value of the setting. Do not specify if users should be able to change the value. */
value: any,
/** Description of what the setting does. */
help: string,
/** When the type is `"select"`, this represents the list of values in the dropdown. */
values?: any[],
/** When the type is `"select"`, `"color"`, `"checkbox"`, `"number"`, `"text"`, `"slider"` or `"textarea"`, this represents the default value to use when no value already exists. */
default?: any,
/** When the type is `"slider"`, this represents the minimum value. Default is 0. */
min?: number,
/** When the type is `"slider"`, this represents the maximum value. Default is 1. */
max?: number,
/** When the type is `"slider"`, `true` shows the value as a percentage (i.e. multiplies the value by 100), whereas `false` will show the raw value. Default is `false`. */
percent?: boolean,
/** When the type is `"slider"`, `true` fills the slider up to the current value (useful for volume slider), whereas `false` does not fill the slider. Default is `false`. */
fill?: boolean,
/** When the type is `"slider"`, `true` shows the current value, `false` otherwise. Default is `false`. */
showValue?: boolean,
/** When the type is `"slider"`, this represents the number of decimal places to use for the value. Default is 0. */
precision?: number,
/** When the type is `"vertical-space"`, this represents the height of the space (in pixels). Default is 5. */
height?: number,
/** When the type is `"two-stack"`, this represents the height between the two elements. Default is 5. */
heightBetween?: number,
/** When the type is `"two-stack"`, this represents the first element to show. */
first?: ComponentSettings,
/** When the type is `"two-stack"`, this represents the second element to show. */
second?: ComponentSettings,
/** When the type is `"button"`, this is called when the button is clicked. */
onClick?: () => void,
/** When the type is `"button"`, this is called when the button is clicked. It is an alias for `onClick`. */
action?: () => void,
}
/** Information regarding a component */
interface ComponentInfo {
/** Identifier of this component. */
id: string,
/** Name of this component. */
name: string,
/** Description of this component. */
description: string,
/** Settings that can be changed by users. */
settings: ComponentSettings[] | ((item: MapItemProperties) => ComponentSettings[]),
/** List of item types that this component can be attached to. */
only?: string[],
}
/** Options used when creating a texture */
interface TextureOptions {
/** Width of the texture. Should be a power of 2. */
width: number,
/** Height of the texture. Should be a power of 2. */
height: number
}
/** Properties for a map item */
interface MapItemProperties {
/** Identifier of this item. */
id: string,
/** Type of this item. */
type: string,
/** Position in the x axis. */
x: number,
/** Position in the y axis. */
height: number,
/** Position in the z axis. */
y: number,
/** `true` if this item is not allowed to be edited, `false` otherwise. */
locked: boolean,
/** `true` if this item has a click interaction, `false` otherwise. */
targetable: boolean,
/** `true` if this item has collision enabled, `false` otherwise. */
collide: boolean,
/** `true` if this item only exists locally and not saved in the database, `false` if it exists in the database. */
clientOnly: boolean
}
/** Represents a map item that can be found in the space */
interface MapItem {
/** Identifier of this item. */
id: string,
/** `true` if this item is an avatar, `false` otherwise. */
isAvatar: boolean,
/** Properties for this item. */
properties: MapItemProperties,
/**
* Updates the properties of this object.
* @param props Properties that should be updated.
* @param save `true` to save this change to the database (only allowed by admins), `false` to keep the object client-side. Default is `false`.
* @param merge `true` to set the given properties as the item properties, overriding any properties not given. `false` to combine the given properties with the existing properties. Default is `false`.
*/
updateProperties: (props: {}, save: boolean = false, merge: boolean = false) => Promise<void>,
/**
* Called when this item has been clicked.
* @param emit `true` to notify any `"click"` event listeners, `false` otherwise. Default is `true`
* @param raycastHit Hit from the raycast. Default is `null`.
*/
onClick: (emit: boolean = true, raycastHit: RaycastHit = null) => void
}
/** Represents a map item that is used by avatars */
interface AvatarMapItem extends MapItem {
/** Name of the user. */
displayName: string,
/** Color of the user. */
color: string,
/** Volume of the user, in dB. */
volume: number,
/** `true` if the user is muted, `false` otherwise. */
muted: boolean,
/** `true` if the user is speaking, `false` otherwise. */
isSpeaking: boolean,
/** `true` if this is the primary item for the user. */
isPrimary: boolean
}
/** Data related to registering a new avatar */
interface AvatarData {
/** Identifier for the avatar. */
id: string,
/** Name of the avatar. */
name: string,
/** Type of the avatar. */
type: string,
/** Properties for the avatar. */
properties: {
/** URL to the actual avatar model. */
url: string,
}
}
/** Data related to a single user */
interface UserData {
/** Identifier for this user. */
id: string,
/** Name of this user. */
name: string,
/** Database identifier for this user. */
userID: string,
/** Role for this user. */
role?: string
}
/** Options for the animation overriding */
interface AnimationOverrideOptions {
/** Name of the animation to play, without the skeleton name. */
animation: string,
/** Name of the animation to play before the main animation, without the skeleton name. */
animation_start?: string,
/** Name of the animation to play when ending the override, without the skeleton name. */
animation_end?: string,
/** Amount of times to play the animation for, or `true` to loop forever. Default is 1. */
loop?: number | boolean,
/** Locks the avatar into moving at this fixed speed per second (user won't be able to move their avatar while the animation is running). Specify `{ x: 0, y: 0, z: 0 }` to lock the avatar in place. */
fixed_movement?: Vector3,
/** Can be `"smooth"` (default) to wait for the animation cycle to complete, `"immediate"` to cancel the animation immediately when the user moves, or `"none"` to not allow the user to cancel movement. */
cancel_mode?: "smooth" | "immediate" | "none",
/** `true` to merge the animation with the default animations for walk, run etc. */
merge?: boolean
}
/** Represents a hit from a raycast */
interface RaycastHit {
/** Item that has been hit. */
mapItem: MapItem,
/** Distance between the current user and the object that has been hit. */
distance: number,
/** Point of intersection (in world co-ordinates) */
point?: Vector3
}
/** Options relating to performing a raycast */
interface RaycastOptions {
/** Point, with values between 0 and 1, determing the co-ordinate on the screen. Use `{ x: 0.5, y: 0.5 }` to pick from the center of the screen. */
screenPosition: Vector2,
/** Start of the ray in 3D space. */
worldPosition: Vector3,
/** Direction of the ray. Ignored if `screenPosition` is given. */
worldDirection: Vector3,
/** Length of the ray. Default is infinity. */
length: number,
/** `true` to only hit items with `collide === true` set, `false` to hit all items. */
collision: boolean
}
/** Options when capturing an image inside the space */
interface ImageCaptureOptions {
/** Width of the image to capture. If not specified, the current viewport width is used. */
width: number,
/** Height of the image to capture. If not specified, the current viewport height is used. */
height: number,
/** Format of the image to capture. Default is "image/png". */
format: "image/png" | "image/jpeg",
/** Only applicable when format is "image/jpeg". Quality of the image to capture, from 0 (lowest) to 1 (highest). Default is 0.9 */
quality: number,
/** `true` to hide the name tags, `false` otherwise. Default is `false`. */
hideNameTags: boolean,
/** Optional. Position to move the camera to. */
cameraPosition?: Vector3,
/** Optional. Only applicable if `cameraPosition` is set. Position to have the camera look at. */
cameraTarget?: Vector3,
}
/** Storage item from a bucket */
interface StorageItem {
/** Name of the item. */
name: string,
/** Size of the item, in bytes. */
size: number,
/** MIME type of the item. */
mimeType: string,
/** Date that the item was created. */
dateCreated: Date,
/** Date that the item was modified. */
dateModified: Date,
/** URL to the item. */
url: string
}
/** Event that contains information from a component being clicked */
interface ComponentClickEvent {
/** Point at which the click hit, in world space. */
position: Vector3,
/** Position on the UV that was hit. Can be used to calculate where on a shape the click happened (e.g.: `let x = uv.x * screenWidth`) */
uv: Vector2
}
/** Options relating to setting the view mode */
interface ViewModeOptions {
/** Configuration options for the given view mode. Available fields are dependent on the given view mode. */
config: object,
/** `true` to enable fullscreen mode, `false` to exit fullscreen mode. */
fullscreen: boolean,
/** `true` to request pointer lock (only supported in "first-person" view mode), `false` to exit pointer lock. */
pointerLock: boolean,
}
/** Callback function for an input capture event */
type InputCaptureCallback = (event: InputCaptureEvent) => void
/** Callback function for a hook */
type HookCallback = (data: any) => any
/** Type of icon to use in a popup */
type PopupIcon = "info" | "success" | "question" | "error" | "warning"
/** Type of component setting */
type ComponentSettingsType = "label" | "section" | "collapse-section" | "two-stack" | "vertical-space" | "select" | "select-item" | "file" | "color" | "checkbox" | "button" | "field-button" | "half-button" | "number" | "text" | "slider" | "bind-key" | "vector2" | "vector3" | "textarea"
/** Type of view mode */
type ViewMode = "swivel" | "advanced" | "first-person"
/** Type of bucket to use when interfacing with storage */
type BucketType = "space" | "server" | "user"
/** Base plugin class. All plugins should extend this class. */
class BasePlugin {
/** Identifier for this plugin */
id: string
/** Name of this plugin */
name: string
/** Description of this plugin */
description: string
/** Identifier of the business that this plugin belongs to */
business_id: string
/** Current version of this plugin */
version: number
/** React component for the settings panel of this plugin */
settingsPanel: any
/** Color of this plugin's control button when selected (if in use) */
selectedColour: '#2DCA8C'
/** Color of this plugin's control button when unselected (if in use) */
unselectedColour: '#AAAAAA'
/** Color of this plugin's control button when inactive (if in use) */
inactiveColour: '#FA5252'
/** Handles interaction with the main app */
app: AppComponent
/** Handles interaction with the audio system */
audio: Audio
/** Handles the registering and invoking of hooks, which are overridable global events */
hooks: HooksComponent
/** Handles interaction with the menu system */
menus: Menus
/** Handles communication between different instances of the plugin */
messages: Messages
/** Handles the creation and manipulation of objects in the space */
objects: Objects
/** Handles the manual creation of textures */
texture: Textures
/** Handles the management of the user's position and appearance */
user: User
/** Handles interaction with the world */
world: World
/** Handles interaction with the storage system */
storage: StorageComponent
/** Handles pathing */
paths: {
/**
* Converts a relative path to an absolute path.
* @param path Relative path to an image.
* @returns Absolute path to the image.
*/
absolute: (path: string) => string
}
/** Called when the plugin is loaded */
onLoad(): void
/** Called when the user has entered the space */
onEnter(): void
/** Called when the plugin is unloaded (usually from uninstalling the plugin) */
onUnload(): void
/** Called when the settings for this plugin have changed */
onSettingsUpdated(): void
/**
* Called when this plugin has received a message originating from this same plugin.
* @param msg Message that has been received.
* @param fromID Identifier of the user who sent the message.
*/
onMessage(msg: any, fromID: string): void
/**
* Called when this plugin has received a request. The first instance
* with a truthy return value is used as the response.
* @param msg Message that has been requested.
* @param fromID Identifier of the user who sent the message.
*/
onRequest(msg: any, fromID: string): void
/**
* Called when the current user has moved.
* @param x Position of the user in the `x` axis.
* @param y Position of the user in the `y` axis.
* @param z Position of the user in the `z` axis.
*/
onUserMoved(x: number, y: number, z: number): void
/** Called when the current user's profile data has changed */
onCurrentUserUpdated(): void
/**
* Gets the value from the given field.
* @param id Identifier of the field to get the value from.
*/
getField(id: string): any
/**
* Sets the value of the given field, which only admins can do.
* @param id Identifier of the field to set.
* @param value Value to set the field to.
*/
setField(id: string, value: any): Promise<void>
/**
* Gets the component field for a given object.
* @param objectID Identifier of the object to get the component field for.
* @param componentID Identifier of the component to get the field for.
* @param name Name of the field.
* @returns Value of the component field.
*/
getComponentField(objectID: string, componentID: string, name: string): any
}
/** Handles interaction with the main app */
class AppComponent {
/**
* Gets details about the plugin if it has been loaded, otherwise it returns `null`.
* @param id Identifier of the plugin to get details for.
*/
getPluginDetails(id: string): Promise<PluginDetails>
/**
* Checks if the given object has its input captured by a plugin.
* @param id Identifier of the object that should be checked.
* @returns `true` if this object has its input captured, `false` otherwise.
*/
hasInputCapture(id: string): Promise<boolean>
/**
* Request full input event capture. While capture is active, all keyboard and pointer events will be sent
* to the given callback.
*
* When capturing ends, one last message will be sent, equivalent to:
* ```js
* this.messages.send({ type: "input-capture-ended" })
* ```
* @param id Identifier of the object to capture input for.
* @param callback Function to execute when receiving an event.
*/
requestInputCapture(id: string, callback: InputCaptureCallback): Promise<void>
/** Stops the current input capture, if any. */
stopInputCapture(): void
/**
* Starts a paid plugin session.
* @param plugin Details of the plugin to start a session for.
*/
startPaidSession(plugin: PluginDetails): Promise<string>
/**
* Stops a paid plugin session.
* @param sessionID Identifier of the session to stop.
*/
stopPaidSession(sessionID: string): Promise<void>
/** @returns Payment details of the current space */
checkPayment(): Promise<PaymentResponse>
/**
* Opens the given URL in a new tab.
* @param url URL to open.
* @param features Optional features to apply when opening the URL.
*/
openURL(url: string, features: string = ''): void
}
/** Handles interaction with the audio system */
class Audio {
/**
* Preloads a sound, so that the call to `play()` does not have to wait.
* @param url URL to the sound effect.
*/
preload(url: string): void
/**
* Plays audio in the space. Should only be used for small audio files.
* @param url URL to the sound file.
* @param options Options relating to the playback.
* @returns Identifier of the audio source that is being played, or `null` if something went wrong.
*/
play(url: string, options: AudioOptions): Promise<string | null>
/**
* Stops playing an audio source with the matching identifier.
* @param id Identifier of the audio source to stop.
*/
stop(id: string): void
}
/** Handles the registering and invoking of hooks, which are overridable global events. */
class HooksComponent {
/**
* Registers a hook event handler.
* @param name Name of the hook.
* @param callback Function to be called. If this function returns a truthy value, the hook is interrupted.
*/
addHandler(name: string, callback: HookCallback): void
/**
* Removes a hook event handler.
* @param name Name of the hook.
* @param callback Function that was used for the hook.
*/
removeHandler(name: string, callback: HookCallback): void
/**
* Triggers a hook that matches the given name. If any handler returns a
* truthy value, hook processing will stop and that value will be returned.
* @param name Name of the hook.
* @param data Any data to be passed to the handlers.
* @returns Response from the first handler with a truthy value, or else false.
*/
trigger(name: string, data: any): Promise<any>
/**
* Triggers a hook and returns all truthy responses.
* @param name Name of the hook.
* @param data Any data to be passed to the handlers.
* @returns All truthy responses.
*/
triggerAll(name: string, data: any): Promise<any[]>
}
/** Handles interaction with the menu system */
class Menus {
/**
* Displays a message in a popup.
* @param text Text to display.
* @param title Title of the message. Default is the name of the plugin.
* @param icon Icon to show. Default is "info".
*/
alert(text: string, title: string, icon: PopupIcon): Promise<void>
/**
* Displays a confirmation message in a popup.
* @param text Text to display.
* @param title Title of message. Default is the name of the plugin.
* @param icon Icon to show. Default is "question".
*/
confirm(text: string, title: string, icon: PopupIcon): Promise<boolean>
/**
* Asks the user for text input.
* @param options Prompt options.
* @returns Text that the user entered, or `null` if the user cancelled.
*/
prompt(options: PromptOptions): Promise<string | null>
/**
* Displays a Toast message near the bottom of the screen.
* @param options Toast options.
* @returns Identifier of the Toast message.
*/
toast(options: ToastOptions): Promise<string>
/**
* Closes the Toast message that matches the given identifier.
* @param id Identifier of the Toast message to close.
*/
closeToast(id: string): void
/**
* Displays a popup.
* @param options Popup configuration options.
* @returns Identifier of the popup.
*/
displayPopup(options: PopupItem): Promise<string>
/**
* Closes the popup that matches the given identifier.
* @param id Identifier of the popup to close.
*/
closePopup(id: string): void
/**
* Registers a new menu item.
* @param options Menu options.
* @returns Identifier for the menu item.
*/
register(options: MenuItem): Promise<string>
/**
* Updates the fields for the given menu item.
* @param id Identifier of the menu item to update.
* @param changes Changes to make to the menu item.
*/
update(id: string, changes: MenuItem): void
/**
* Unregisters an existing menu item.
* @param id Identifier for the menu item to unregister.
*/
unregister(id: string): void
/**
* Sends a message to any open iframe panels. A panel can listen for these
* messages by using the `"onmessage"` window event.
* @param data Data to pass on.
*/
postMessage(data: any): void
/** Returns focus to the space. */
returnFocus(): void
}
/** Handles communication between different instances of the plugin */
class Messages {
/**
* Send a message to all instances of this plugin on other devices.
* Message will be received in the `onMessage` method.
* @param msg Message to send.
* @param isGlobal `true` to send to everyone on the entire server, `false` to send to everyone within rendering range. Default is `false`.
* @param targetUserID If given, it is the identifier of a user to send a message to (regardless of where that user is). Default is ''.
* @param objectID If given, this object identifier will be attached to the sent payload. Default is ''.
* @param componentID If given, this component identifier will be attached to the sent payload. Default is ''.
*/
send(msg: any, isGlobal: boolean = false, targetUserID: string = '', objectID: string = '', componentID: string = ''): void
/**
* Send a message to all instances of this plugin on other devices, and
* then wait for the first response.
* @param msg Message to send.
* @param isGlobal `true` to send to everyone on the entire server, `false` to send to everyone within rendering range. Default is `false`.
* @param targetUserID If given, it is the identifier of a user to send a message to (regardless of where that user is). Default is ''.
* @param objectID If given, this object identifier will be attached to the sent payload. Default is ''.
* @param componentID If given, this component identifier will be attached to the sent payload. Default is ''.
* @returns Response from the request.
*/
request(msg: any, isGlobal: boolean = false, targetUserID: string = '', objectID: string = '', componentID: string = ''): Promise<any>
}
/** Handles the creation and manipulation of objects in the space */
class Objects {
/**
* Animates an object.
* @param options Options relating to the animation of the object.
*/
animate(options: AnimateOptions): Promise<void>
/**
* Creates a new object. Will be created as a client-only object, unless
* `clientOnly: false` is specified in the options.
* @param options Options relating to the object to create.
* @returns Identifier of the object that has been created.
*/
create(options: MapItemProperties): Promise<string>
/**
* Updates an existing object.
* @param id Identifier of the object to update.
* @param options Properties of the object to update.
* @param localOnly `true` to only update the local values of fields. NOTE: If the remote object is updated, it will be overwritten again.
*/
update(id: string, options: MapItemProperties, localOnly: boolean = false): Promise<void>
/**
* Removes an object.
* @param id Identifier of the object to remove.
* @param options Options relating to the removal of the object.
* @param options.clientOnly `true` if we only want to remove this object for this user, `false` if we want to remove it from the server. Default is `false`.
*/
remove(id: string, options: { clientOnly: boolean = false }): void
/**
* Creates a status item that appears above a user's avatar. Will always be
* a client-only object.
* @param options Options relating to the status item.
* @param properties Properties of the status item to create.
* @returns Identifier of the status item that has been created, or `null` if some issue occurred.
*/
createStatusItem(options: StatusOptions, properties: MapItemProperties): Promise<string | null>
/**
* Creates a top status icon that appears above a user's avatar. Will always be
* a client-only object.
* @param options Options relating to the top status icon.
* @param properties Properties of the top status icon to create.
* @returns Identifier of the top status icon that has been created, or `null` if some issue occurred.
*/
createTopStatusIcon(options: StatusOptions, properties: MapItemProperties): Promise<string | null>
/**
* Updates an existing status item.
* @param userID Identifier of the user to update the status item for.
* @param itemID Identifier of the status item to update.
* @param properties Properties of the object to update.
*/
updateStatusItem(userID: string, itemID: string, properties: MapItemProperties): void
/**
* Updates an existing top status icon.
* @param userID Identifier of the user to update the top status icon for.
* @param itemID Identifier of the top status icon to update.
* @param properties Properties of the object to update.
*/
updateTopStatusIcon(userID: string, itemID: string, properties: MapItemProperties): void
/**
* Removes the status item that matches the given identifier.
* @param userID Identifier of the user to remove the status item from.
* @param itemID Identifier of the status item to remove.
*/
removeStatusItem(userID: string, itemID: string): void
/**
* Removes the top status icon that matches the given identifier.
* @param userID Identifier of the user to remove the top status icon from.
* @param itemID Identifier of the top status icon to remove.
*/
removeTopStatusIcon(userID: string, itemID: string): void
/**
* Converts from euler angles (in radians) to quaternion.
* @param euler Euler angles to convert.
* @returns Quaternion.
*/
eulerToQuat(euler: Vector3): Promise<Quaternion>
/**
* Converts from quaternion angles to euler in radians.
* @param quat Quaternion angles to convert.
* @returns Euler angles.
*/
quatToEuler(quat: Quaternion): Promise<Vector3>
/**
* Gets the properties of an object.
* @param id Identifier of the object to get the properties for.
* @returns Properties of the object matching the given identifier.
*/
get(id: string): Promise<MapItemProperties>
/**
* Gets the animations of an object as a JSON string.
* @param id Identifier of the object to get animations for.
* @returns JSON string of all animations associated with this object.
*/
getAnimations(id: string): Promise<string>
/**
* Gets the rotation, as a quaternion, for the given object.
* @param id Identifier of the object to get the rotation for.
* @returns Rotation, as a quaternion, for the given object.
*/
getRotationQuat(id: string): Promise<Quaternion>
/**
* Gets the rotation, as Euler angles in radians, for the given object.
* @param id Identifier of the object to get the rotation for.
* @returns Rotation, as Euler angles in radians, for the given object.
*/
getRotationEuler(id: string): Promise<Vector3>
/** @returns All the currently registered component instances. */
getComponentInstances(): ComponentInstance[]
/**
* Finds the mesh vertex points for the given object.
* @param objectID Identifier of the object to get the mesh vertex points for.
* @returns Mesh vertex points for the given object, or `null` if no object is found.
*/
getVertices(objectID: string): Promise<VertexPoint[] | null>
/**
* Fetches all the objects within a radius.
* @param x Position in the x axis.
* @param y Position in the y axis.
* @param radius Radius around the given X and Y co-ordinates.
* @returns List of item properties that are within the given radius.
*/
fetchInRadius(x: number, y: number, radius: number): Promise<MapItemProperties[]>
/**
* Register a component so that it can be attached to objects.
* @param component Component to register.
* @param info Information about the component.
*/
registerComponent(component: BaseComponent, info: ComponentInfo): Promise<void>
/**
* Moves an object to a position.
* @param targetPosition Position to move the object to.
* @param speed Speed to move the object at.