[{"data":1,"prerenderedAt":1923},["ShallowReactive",2],{"navigation":3,"reference-navigation":62,"\u002Fdocs\u002Fdefining-bundle-sounds":365,"\u002Fdocs\u002Fdefining-bundle-sounds-surround":1918},[4,22,26,30,34,38,42,46,50,54,58],{"title":5,"path":6,"stem":7,"children":8},"Bundle Developer","\u002Fdocs\u002Fbundle-developer","1.docs\u002F1.bundle-developer\u002Findex",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Terminology","\u002Fdocs\u002Fbundle-developer\u002Fterminology","1.docs\u002F1.bundle-developer\u002F1.terminology",{"title":15,"path":16,"stem":17},"Prerequisites","\u002Fdocs\u002Fbundle-developer\u002Fprerequisites","1.docs\u002F1.bundle-developer\u002F2.prerequisites",{"title":19,"path":20,"stem":21},"Bundle Layout","\u002Fdocs\u002Fbundle-developer\u002Flayout","1.docs\u002F1.bundle-developer\u002F3.layout",{"title":23,"path":24,"stem":25},"Custom Registry Developer Guide","\u002Fdocs\u002Fcustom-registries","1.docs\u002Fcustom-registries",{"title":27,"path":28,"stem":29},"Defining Bundle Entities","\u002Fdocs\u002Fdefining-bundle-entities","1.docs\u002Fdefining-bundle-entities",{"title":31,"path":32,"stem":33},"Defining Bundle Sounds","\u002Fdocs\u002Fdefining-bundle-sounds","1.docs\u002Fdefining-bundle-sounds",{"title":35,"path":36,"stem":37},"Defining Bundle Tile Transitions","\u002Fdocs\u002Fdefining-bundle-tile-transitions","1.docs\u002Fdefining-bundle-tile-transitions",{"title":39,"path":40,"stem":41},"Defining Bundle Tiles","\u002Fdocs\u002Fdefining-bundle-tiles","1.docs\u002Fdefining-bundle-tiles",{"title":43,"path":44,"stem":45},"Defining Bundle Visuals","\u002Fdocs\u002Fdefining-bundle-visuals","1.docs\u002Fdefining-bundle-visuals",{"title":47,"path":48,"stem":49},"Bundle Event System Developer Guide","\u002Fdocs\u002Fevent-system","1.docs\u002Fevent-system",{"title":51,"path":52,"stem":53},"Getting Started with Selene Bundles","\u002Fdocs\u002Fgetting-started-bundles","1.docs\u002Fgetting-started-bundles",{"title":55,"path":56,"stem":57},"Making Resource Packs","\u002Fdocs\u002Fmaking-resource-packs","1.docs\u002Fmaking-resource-packs",{"title":59,"path":60,"stem":61},"Bundle Network API Developer Guide","\u002Fdocs\u002Fnetwork-apis","1.docs\u002Fnetwork-apis",[63,212,253],{"title":64,"path":65,"stem":66,"children":67,"page":121},"Modules","\u002Freference\u002Fmodules","2.reference\u002F1.modules",[68,122,167],{"title":69,"path":70,"stem":71,"children":72,"page":121},"Common","\u002Freference\u002Fmodules\u002Fcommon","2.reference\u002F1.modules\u002F1.common",[73,77,81,85,89,93,97,101,105,109,113,117],{"title":74,"path":75,"stem":76},"debug","\u002Freference\u002Fmodules\u002Fcommon\u002Fdebug","2.reference\u002F1.modules\u002F1.common\u002Fdebug",{"title":78,"path":79,"stem":80},"mathx","\u002Freference\u002Fmodules\u002Fcommon\u002Fmathx","2.reference\u002F1.modules\u002F1.common\u002Fmathx",{"title":82,"path":83,"stem":84},"os","\u002Freference\u002Fmodules\u002Fcommon\u002Fos","2.reference\u002F1.modules\u002F1.common\u002Fos",{"title":86,"path":87,"stem":88},"package","\u002Freference\u002Fmodules\u002Fcommon\u002Fpackage","2.reference\u002F1.modules\u002F1.common\u002Fpackage",{"title":90,"path":91,"stem":92},"selene.grid","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.grid","2.reference\u002F1.modules\u002F1.common\u002Fselene.grid",{"title":94,"path":95,"stem":96},"selene.http","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.http","2.reference\u002F1.modules\u002F1.common\u002Fselene.http",{"title":98,"path":99,"stem":100},"selene.i18n","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.i18n","2.reference\u002F1.modules\u002F1.common\u002Fselene.i18n",{"title":102,"path":103,"stem":104},"selene.registries","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.registries","2.reference\u002F1.modules\u002F1.common\u002Fselene.registries",{"title":106,"path":107,"stem":108},"selene.resources","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.resources","2.reference\u002F1.modules\u002F1.common\u002Fselene.resources",{"title":110,"path":111,"stem":112},"selene.schedules","\u002Freference\u002Fmodules\u002Fcommon\u002Fselene.schedules","2.reference\u002F1.modules\u002F1.common\u002Fselene.schedules",{"title":114,"path":115,"stem":116},"stringx","\u002Freference\u002Fmodules\u002Fcommon\u002Fstringx","2.reference\u002F1.modules\u002F1.common\u002Fstringx",{"title":118,"path":119,"stem":120},"tablex","\u002Freference\u002Fmodules\u002Fcommon\u002Ftablex","2.reference\u002F1.modules\u002F1.common\u002Ftablex",false,{"title":123,"path":124,"stem":125,"children":126,"page":121},"Server","\u002Freference\u002Fmodules\u002Fserver","2.reference\u002F1.modules\u002F2.server",[127,131,135,139,143,147,151,155,159,163],{"title":128,"path":129,"stem":130},"selene.attributes","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.attributes","2.reference\u002F1.modules\u002F2.server\u002Fselene.attributes",{"title":132,"path":133,"stem":134},"selene.config","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.config","2.reference\u002F1.modules\u002F2.server\u002Fselene.config",{"title":136,"path":137,"stem":138},"selene.dimensions","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.dimensions","2.reference\u002F1.modules\u002F2.server\u002Fselene.dimensions",{"title":140,"path":141,"stem":142},"selene.entities","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.entities","2.reference\u002F1.modules\u002F2.server\u002Fselene.entities",{"title":144,"path":145,"stem":146},"selene.map","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.map","2.reference\u002F1.modules\u002F2.server\u002Fselene.map",{"title":148,"path":149,"stem":150},"selene.network","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.network","2.reference\u002F1.modules\u002F2.server\u002Fselene.network",{"title":152,"path":153,"stem":154},"selene.players","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.players","2.reference\u002F1.modules\u002F2.server\u002Fselene.players",{"title":156,"path":157,"stem":158},"selene.saves","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.saves","2.reference\u002F1.modules\u002F2.server\u002Fselene.saves",{"title":160,"path":161,"stem":162},"selene.server","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.server","2.reference\u002F1.modules\u002F2.server\u002Fselene.server",{"title":164,"path":165,"stem":166},"selene.sounds","\u002Freference\u002Fmodules\u002Fserver\u002Fselene.sounds","2.reference\u002F1.modules\u002F2.server\u002Fselene.sounds",{"title":168,"path":169,"stem":170,"children":171,"page":121},"Client","\u002Freference\u002Fmodules\u002Fclient","2.reference\u002F1.modules\u002F3.client",[172,176,179,183,187,190,194,197,200,204,208],{"title":173,"path":174,"stem":175},"selene.camera","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.camera","2.reference\u002F1.modules\u002F3.client\u002Fselene.camera",{"title":140,"path":177,"stem":178},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.entities","2.reference\u002F1.modules\u002F3.client\u002Fselene.entities",{"title":180,"path":181,"stem":182},"selene.game","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.game","2.reference\u002F1.modules\u002F3.client\u002Fselene.game",{"title":184,"path":185,"stem":186},"selene.input","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.input","2.reference\u002F1.modules\u002F3.client\u002Fselene.input",{"title":144,"path":188,"stem":189},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.map","2.reference\u002F1.modules\u002F3.client\u002Fselene.map",{"title":191,"path":192,"stem":193},"selene.movement.grid","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.movement.grid","2.reference\u002F1.modules\u002F3.client\u002Fselene.movement.grid",{"title":148,"path":195,"stem":196},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.network","2.reference\u002F1.modules\u002F3.client\u002Fselene.network",{"title":164,"path":198,"stem":199},"\u002Freference\u002Fmodules\u002Fclient\u002Fselene.sounds","2.reference\u002F1.modules\u002F3.client\u002Fselene.sounds",{"title":201,"path":202,"stem":203},"selene.textures","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.textures","2.reference\u002F1.modules\u002F3.client\u002Fselene.textures",{"title":205,"path":206,"stem":207},"selene.ui.lml","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.ui.lml","2.reference\u002F1.modules\u002F3.client\u002Fselene.ui.lml",{"title":209,"path":210,"stem":211},"selene.visuals","\u002Freference\u002Fmodules\u002Fclient\u002Fselene.visuals","2.reference\u002F1.modules\u002F3.client\u002Fselene.visuals",{"title":213,"path":214,"stem":215,"children":216,"page":121},"Data","\u002Freference\u002Fdata","2.reference\u002F2.data",[217,241],{"title":69,"path":218,"stem":219,"children":220,"page":121},"\u002Freference\u002Fdata\u002Fcommon","2.reference\u002F2.data\u002F1.common",[221,225,229,233,237],{"title":222,"path":223,"stem":224},"Component Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fcomponentdefinition","2.reference\u002F2.data\u002F1.common\u002FComponentDefinition",{"title":226,"path":227,"stem":228},"Entity Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fentitydefinition","2.reference\u002F2.data\u002F1.common\u002FEntityDefinition",{"title":230,"path":231,"stem":232},"Sound Definition","\u002Freference\u002Fdata\u002Fcommon\u002Fsounddefinition","2.reference\u002F2.data\u002F1.common\u002FSoundDefinition",{"title":234,"path":235,"stem":236},"Tile Definition","\u002Freference\u002Fdata\u002Fcommon\u002Ftiledefinition","2.reference\u002F2.data\u002F1.common\u002FTileDefinition",{"title":238,"path":239,"stem":240},"Transition Definition","\u002Freference\u002Fdata\u002Fcommon\u002Ftransitiondefinition","2.reference\u002F2.data\u002F1.common\u002FTransitionDefinition",{"title":168,"path":242,"stem":243,"children":244,"page":121},"\u002Freference\u002Fdata\u002Fclient","2.reference\u002F2.data\u002F3.client",[245,249],{"title":246,"path":247,"stem":248},"Audio Definition","\u002Freference\u002Fdata\u002Fclient\u002Faudiodefinition","2.reference\u002F2.data\u002F3.client\u002FAudioDefinition",{"title":250,"path":251,"stem":252},"Visual Definition","\u002Freference\u002Fdata\u002Fclient\u002Fvisualdefinition","2.reference\u002F2.data\u002F3.client\u002FVisualDefinition",{"title":254,"path":255,"stem":256,"children":257,"page":121},"Classes","\u002Freference\u002Fclasses","2.reference\u002F3.classes",[258,286,318],{"title":69,"path":259,"stem":260,"children":261,"page":121},"\u002Freference\u002Fclasses\u002Fcommon","2.reference\u002F3.classes\u002F1.common",[262,266,270,274,278,282],{"title":263,"path":264,"stem":265},"Coordinate","\u002Freference\u002Fclasses\u002Fcommon\u002Fcoordinate","2.reference\u002F3.classes\u002F1.common\u002FCoordinate",{"title":267,"path":268,"stem":269},"CustomRegistryObject","\u002Freference\u002Fclasses\u002Fcommon\u002Fcustomregistryobject","2.reference\u002F3.classes\u002F1.common\u002FCustomRegistryObject",{"title":271,"path":272,"stem":273},"LuaReference","\u002Freference\u002Fclasses\u002Fcommon\u002Fluareference","2.reference\u002F3.classes\u002F1.common\u002FLuaReference",{"title":275,"path":276,"stem":277},"Observable","\u002Freference\u002Fclasses\u002Fcommon\u002Fobservable","2.reference\u002F3.classes\u002F1.common\u002FObservable",{"title":279,"path":280,"stem":281},"RegistryObject","\u002Freference\u002Fclasses\u002Fcommon\u002Fregistryobject","2.reference\u002F3.classes\u002F1.common\u002FRegistryObject",{"title":283,"path":284,"stem":285},"Signal","\u002Freference\u002Fclasses\u002Fcommon\u002Fsignal","2.reference\u002F3.classes\u002F1.common\u002FSignal",{"title":123,"path":287,"stem":288,"children":289,"page":121},"\u002Freference\u002Fclasses\u002Fserver","2.reference\u002F3.classes\u002F2.server",[290,294,298,302,306,310,314],{"title":291,"path":292,"stem":293},"Dimension","\u002Freference\u002Fclasses\u002Fserver\u002Fdimension","2.reference\u002F3.classes\u002F2.server\u002FDimension",{"title":295,"path":296,"stem":297},"Entity","\u002Freference\u002Fclasses\u002Fserver\u002Fentity","2.reference\u002F3.classes\u002F2.server\u002FEntity",{"title":299,"path":300,"stem":301},"LoginQueueEntry","\u002Freference\u002Fclasses\u002Fserver\u002Floginqueueentry","2.reference\u002F3.classes\u002F2.server\u002FLoginQueueEntry",{"title":303,"path":304,"stem":305},"MapTree","\u002Freference\u002Fclasses\u002Fserver\u002Fmaptree","2.reference\u002F3.classes\u002F2.server\u002FMapTree",{"title":307,"path":308,"stem":309},"Player","\u002Freference\u002Fclasses\u002Fserver\u002Fplayer","2.reference\u002F3.classes\u002F2.server\u002FPlayer",{"title":311,"path":312,"stem":313},"ScopedChunkView","\u002Freference\u002Fclasses\u002Fserver\u002Fscopedchunkview","2.reference\u002F3.classes\u002F2.server\u002FScopedChunkView",{"title":315,"path":316,"stem":317},"TransientTile","\u002Freference\u002Fclasses\u002Fserver\u002Ftransienttile","2.reference\u002F3.classes\u002F2.server\u002FTransientTile",{"title":168,"path":319,"stem":320,"children":321,"page":121},"\u002Freference\u002Fclasses\u002Fclient","2.reference\u002F3.classes\u002F3.client",[322,326,330,334,337,341,345,349,353,357,361],{"title":323,"path":324,"stem":325},"Actor","\u002Freference\u002Fclasses\u002Fclient\u002Factor","2.reference\u002F3.classes\u002F3.client\u002FActor",{"title":327,"path":328,"stem":329},"Drawable","\u002Freference\u002Fclasses\u002Fclient\u002Fdrawable","2.reference\u002F3.classes\u002F3.client\u002FDrawable",{"title":331,"path":332,"stem":333},"DrawableVisual2D","\u002Freference\u002Fclasses\u002Fclient\u002Fdrawablevisual2d","2.reference\u002F3.classes\u002F3.client\u002FDrawableVisual2D",{"title":295,"path":335,"stem":336},"\u002Freference\u002Fclasses\u002Fclient\u002Fentity","2.reference\u002F3.classes\u002F3.client\u002FEntity",{"title":338,"path":339,"stem":340},"IsoVisualComponent","\u002Freference\u002Fclasses\u002Fclient\u002Fisovisualcomponent","2.reference\u002F3.classes\u002F3.client\u002FIsoVisualComponent",{"title":342,"path":343,"stem":344},"LuaTexture","\u002Freference\u002Fclasses\u002Fclient\u002Fluatexture","2.reference\u002F3.classes\u002F3.client\u002FLuaTexture",{"title":346,"path":347,"stem":348},"Skin","\u002Freference\u002Fclasses\u002Fclient\u002Fskin","2.reference\u002F3.classes\u002F3.client\u002FSkin",{"title":350,"path":351,"stem":352},"TextFieldTextFieldClickListener","\u002Freference\u002Fclasses\u002Fclient\u002Ftextfield.textfieldclicklistener","2.reference\u002F3.classes\u002F3.client\u002FTextField.TextFieldClickListener",{"title":354,"path":355,"stem":356},"Tile","\u002Freference\u002Fclasses\u002Fclient\u002Ftile","2.reference\u002F3.classes\u002F3.client\u002FTile",{"title":358,"path":359,"stem":360},"Visual2D","\u002Freference\u002Fclasses\u002Fclient\u002Fvisual2d","2.reference\u002F3.classes\u002F3.client\u002FVisual2D",{"title":362,"path":363,"stem":364},"Visual2DComponent","\u002Freference\u002Fclasses\u002Fclient\u002Fvisual2dcomponent","2.reference\u002F3.classes\u002F3.client\u002FVisual2DComponent",{"id":366,"title":31,"body":367,"description":1913,"extension":1914,"meta":1915,"navigation":1150,"path":32,"seo":1916,"stem":33,"__hash__":1917},"docs\u002F1.docs\u002Fdefining-bundle-sounds.md",{"type":368,"value":369,"toc":1896},"minimark",[370,374,383,390,393,398,401,417,427,494,497,554,557,561,572,575,583,586,592,601,641,651,655,664,667,673,676,682,689,779,786,790,797,803,816,819,823,826,867,872,893,896,917,921,930,998,1000,1038,1041,1045,1052,1085,1097,1101,1104,1110,1117,1120,1124,1129,1186,1189,1198,1201,1210,1216,1220,1223,1268,1271,1280,1283,1292,1298,1301,1304,1412,1415,1433,1436,1440,1445,1589,1594,1736,1739,1745,1749,1752,1763,1769,1775,1781,1787,1793,1800,1804,1807,1838,1841,1845,1892],[371,372,31],"h1",{"id":373},"defining-bundle-sounds",[375,376,377,378,382],"p",{},"Sound definitions describe named sounds that scripts can play. They live in the common ",[379,380,381],"code",{},"sounds"," registry so both server and client code can refer to the same identifier.",[375,384,385,386,389],{},"Audio definitions describe the client-side asset and playback defaults behind a sound. They live in the client ",[379,387,388],{},"audio"," registry because only the client loads and plays audio files.",[375,391,392],{},"Use this guide when you are adding sound effects to a bundle, wiring server gameplay events to client playback, or overriding audio in a resource pack.",[394,395,397],"h2",{"id":396},"sound-and-audio-split","Sound and audio split",[375,399,400],{},"Selene separates a playable sound into two definitions:",[402,403,404,411],"ul",{},[405,406,407,408,410],"li",{},"A common ",[379,409,381],{}," entry gives scripts a stable gameplay-facing identifier.",[405,412,413,414,416],{},"A client ",[379,415,388],{}," entry points to the actual audio file and defines playback defaults.",[375,418,419,420,423,424,426],{},"For example, the sound ",[379,421,422],{},"myworld:ui\u002Fclick"," can point to audio ",[379,425,422],{},":",[428,429,434],"pre",{"className":430,"code":431,"language":432,"meta":433,"style":433},"language-json shiki shiki-themes github-light github-dark","{\n  \"entries\": {\n    \"ui\u002Fclick\": {\n      \"audio\": \"myworld:ui\u002Fclick\"\n    }\n  }\n}\n","json","",[379,435,436,445,455,463,476,482,488],{"__ignoreMap":433},[437,438,441],"span",{"class":439,"line":440},"line",1,[437,442,444],{"class":443},"sVt8B","{\n",[437,446,448,452],{"class":439,"line":447},2,[437,449,451],{"class":450},"sj4cs","  \"entries\"",[437,453,454],{"class":443},": {\n",[437,456,458,461],{"class":439,"line":457},3,[437,459,460],{"class":450},"    \"ui\u002Fclick\"",[437,462,454],{"class":443},[437,464,466,469,472],{"class":439,"line":465},4,[437,467,468],{"class":450},"      \"audio\"",[437,470,471],{"class":443},": ",[437,473,475],{"class":474},"sZZnC","\"myworld:ui\u002Fclick\"\n",[437,477,479],{"class":439,"line":478},5,[437,480,481],{"class":443},"    }\n",[437,483,485],{"class":439,"line":484},6,[437,486,487],{"class":443},"  }\n",[437,489,491],{"class":439,"line":490},7,[437,492,493],{"class":443},"}\n",[375,495,496],{},"The matching client audio entry can then point at the file:",[428,498,500],{"className":430,"code":499,"language":432,"meta":433,"style":433},"{\n  \"entries\": {\n    \"ui\u002Fclick\": {\n      \"type\": \"simple\",\n      \"file\": \"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\"\n    }\n  }\n}\n",[379,501,502,506,512,518,531,541,545,549],{"__ignoreMap":433},[437,503,504],{"class":439,"line":440},[437,505,444],{"class":443},[437,507,508,510],{"class":439,"line":447},[437,509,451],{"class":450},[437,511,454],{"class":443},[437,513,514,516],{"class":439,"line":457},[437,515,460],{"class":450},[437,517,454],{"class":443},[437,519,520,523,525,528],{"class":439,"line":465},[437,521,522],{"class":450},"      \"type\"",[437,524,471],{"class":443},[437,526,527],{"class":474},"\"simple\"",[437,529,530],{"class":443},",\n",[437,532,533,536,538],{"class":439,"line":478},[437,534,535],{"class":450},"      \"file\"",[437,537,471],{"class":443},[437,539,540],{"class":474},"\"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\"\n",[437,542,543],{"class":439,"line":484},[437,544,481],{"class":443},[437,546,547],{"class":439,"line":490},[437,548,487],{"class":443},[437,550,552],{"class":439,"line":551},8,[437,553,493],{"class":443},[375,555,556],{},"The identifiers do not have to match, but matching them keeps data easy to scan. Use separate identifiers when several gameplay sounds intentionally share the same audio asset.",[394,558,560],{"id":559},"where-sounds-live","Where sounds live",[375,562,563,564,567,568,571],{},"Put sound definitions under ",[379,565,566],{},"common\u002Fdata\u002F\u003Cnamespace>\u002F",", where ",[379,569,570],{},"\u003Cnamespace>"," becomes the namespace part of each sound identifier.",[375,573,574],{},"You can define multiple sounds in one registry file:",[428,576,581],{"className":577,"code":579,"language":580,"meta":433},[578],"language-text","my-bundle\u002F\n  bundle.json\n  common\u002F\n    data\u002F\n      myworld\u002F\n        sounds.json\n","text",[379,582,579],{"__ignoreMap":433},[375,584,585],{},"Or split each sound into its own JSON file:",[428,587,590],{"className":588,"code":589,"language":580,"meta":433},[578],"my-bundle\u002F\n  common\u002F\n    data\u002F\n      myworld\u002F\n        sounds\u002F\n          ui\u002F\n            click.json\n",[379,591,589],{"__ignoreMap":433},[375,593,594,595,598,599,426],{},"The merged ",[379,596,597],{},"sounds.json"," form stores entries by local name. This defines ",[379,600,422],{},[428,602,603],{"className":430,"code":431,"language":432,"meta":433,"style":433},[379,604,605,609,615,621,629,633,637],{"__ignoreMap":433},[437,606,607],{"class":439,"line":440},[437,608,444],{"class":443},[437,610,611,613],{"class":439,"line":447},[437,612,451],{"class":450},[437,614,454],{"class":443},[437,616,617,619],{"class":439,"line":457},[437,618,460],{"class":450},[437,620,454],{"class":443},[437,622,623,625,627],{"class":439,"line":465},[437,624,468],{"class":450},[437,626,471],{"class":443},[437,628,475],{"class":474},[437,630,631],{"class":439,"line":478},[437,632,481],{"class":443},[437,634,635],{"class":439,"line":484},[437,636,487],{"class":443},[437,638,639],{"class":439,"line":490},[437,640,493],{"class":443},[375,642,643,644,647,648,650],{},"The split-file form uses the file path as the local name. For example, ",[379,645,646],{},"common\u002Fdata\u002Fmyworld\u002Fsounds\u002Fui\u002Fclick.json"," also defines ",[379,649,422],{},".",[394,652,654],{"id":653},"where-audio-lives","Where audio lives",[375,656,657,658,567,661,663],{},"Put audio definitions under ",[379,659,660],{},"client\u002Fdata\u002F\u003Cnamespace>\u002F",[379,662,570],{}," becomes the namespace part of each audio identifier.",[375,665,666],{},"You can define multiple audio entries in one registry file:",[428,668,671],{"className":669,"code":670,"language":580,"meta":433},[578],"my-bundle\u002F\n  client\u002F\n    data\u002F\n      myworld\u002F\n        audio.json\n    audio\u002F\n      myworld\u002F\n        ui\u002F\n          click.ogg\n",[379,672,670],{"__ignoreMap":433},[375,674,675],{},"Or split each audio entry into its own JSON file:",[428,677,680],{"className":678,"code":679,"language":580,"meta":433},[578],"my-bundle\u002F\n  client\u002F\n    data\u002F\n      myworld\u002F\n        audio\u002F\n          ui\u002F\n            click.json\n",[379,681,679],{"__ignoreMap":433},[375,683,594,684,598,687,426],{},[379,685,686],{},"audio.json",[379,688,422],{},[428,690,692],{"className":430,"code":691,"language":432,"meta":433,"style":433},"{\n  \"entries\": {\n    \"ui\u002Fclick\": {\n      \"type\": \"simple\",\n      \"file\": \"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\",\n      \"volume\": 1,\n      \"pitch\": 1,\n      \"loop\": false\n    }\n  }\n}\n",[379,693,694,698,704,710,720,731,743,754,764,769,774],{"__ignoreMap":433},[437,695,696],{"class":439,"line":440},[437,697,444],{"class":443},[437,699,700,702],{"class":439,"line":447},[437,701,451],{"class":450},[437,703,454],{"class":443},[437,705,706,708],{"class":439,"line":457},[437,707,460],{"class":450},[437,709,454],{"class":443},[437,711,712,714,716,718],{"class":439,"line":465},[437,713,522],{"class":450},[437,715,471],{"class":443},[437,717,527],{"class":474},[437,719,530],{"class":443},[437,721,722,724,726,729],{"class":439,"line":478},[437,723,535],{"class":450},[437,725,471],{"class":443},[437,727,728],{"class":474},"\"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\"",[437,730,530],{"class":443},[437,732,733,736,738,741],{"class":439,"line":484},[437,734,735],{"class":450},"      \"volume\"",[437,737,471],{"class":443},[437,739,740],{"class":450},"1",[437,742,530],{"class":443},[437,744,745,748,750,752],{"class":439,"line":490},[437,746,747],{"class":450},"      \"pitch\"",[437,749,471],{"class":443},[437,751,740],{"class":450},[437,753,530],{"class":443},[437,755,756,759,761],{"class":439,"line":551},[437,757,758],{"class":450},"      \"loop\"",[437,760,471],{"class":443},[437,762,763],{"class":450},"false\n",[437,765,767],{"class":439,"line":766},9,[437,768,481],{"class":443},[437,770,772],{"class":439,"line":771},10,[437,773,487],{"class":443},[437,775,777],{"class":439,"line":776},11,[437,778,493],{"class":443},[375,780,643,781,647,784,650],{},[379,782,783],{},"client\u002Fdata\u002Fmyworld\u002Faudio\u002Fui\u002Fclick.json",[379,785,422],{},[394,787,789],{"id":788},"sound-identifiers","Sound identifiers",[375,791,792,793,796],{},"Sound identifiers use the same ",[379,794,795],{},"namespace:name"," format as other Selene registries:",[428,798,801],{"className":799,"code":800,"language":580,"meta":433},[578],"myworld:ui\u002Fclick\nmyworld:effects\u002Fdoor_open\nmyworld:ambient\u002Fwind\n",[379,802,800],{"__ignoreMap":433},[375,804,805,806,809,810,812,813,650],{},"The namespace comes from the directory below ",[379,807,808],{},"common\u002Fdata\u002F",". The name comes from either the key inside ",[379,811,597],{}," or the relative path of a file below ",[379,814,815],{},"sounds\u002F",[375,817,818],{},"Use stable names once scripts, map triggers, entity components, or saved data refer to a sound. Renaming a sound definition means updating every reference to it.",[394,820,822],{"id":821},"sound-shape","Sound shape",[375,824,825],{},"A sound definition has these fields:",[428,827,829],{"className":430,"code":828,"language":432,"meta":433,"style":433},"{\n  \"audio\": \"myworld:ui\u002Fclick\",\n  \"metadata\": {},\n  \"tags\": []\n}\n",[379,830,831,835,847,855,863],{"__ignoreMap":433},[437,832,833],{"class":439,"line":440},[437,834,444],{"class":443},[437,836,837,840,842,845],{"class":439,"line":447},[437,838,839],{"class":450},"  \"audio\"",[437,841,471],{"class":443},[437,843,844],{"class":474},"\"myworld:ui\u002Fclick\"",[437,846,530],{"class":443},[437,848,849,852],{"class":439,"line":457},[437,850,851],{"class":450},"  \"metadata\"",[437,853,854],{"class":443},": {},\n",[437,856,857,860],{"class":439,"line":465},[437,858,859],{"class":450},"  \"tags\"",[437,861,862],{"class":443},": []\n",[437,864,865],{"class":439,"line":478},[437,866,493],{"class":443},[375,868,869,871],{},[379,870,388],{}," is required. The other fields have defaults in the engine and can be omitted when the default is correct:",[428,873,875],{"className":430,"code":874,"language":432,"meta":433,"style":433},"{\n  \"audio\": \"myworld:ui\u002Fclick\"\n}\n",[379,876,877,881,889],{"__ignoreMap":433},[437,878,879],{"class":439,"line":440},[437,880,444],{"class":443},[437,882,883,885,887],{"class":439,"line":447},[437,884,839],{"class":450},[437,886,471],{"class":443},[437,888,475],{"class":474},[437,890,891],{"class":439,"line":457},[437,892,493],{"class":443},[375,894,895],{},"Fields:",[402,897,898,903,911],{},[405,899,900,902],{},[379,901,388],{}," is the client audio identifier resolved when the sound is played.",[405,904,905,908,909,650],{},[379,906,907],{},"metadata"," stores custom structured data that can be searched through ",[379,910,102],{},[405,912,913,916],{},[379,914,915],{},"tags"," are strings used for filtering and classification.",[394,918,920],{"id":919},"simple-audio","Simple audio",[375,922,923,924,927,928,650],{},"Use ",[379,925,926],{},"simple"," for sound effects that can be played through ",[379,929,164],{},[428,931,933],{"className":430,"code":932,"language":432,"meta":433,"style":433},"{\n  \"type\": \"simple\",\n  \"file\": \"client\u002Faudio\u002Fmyworld\u002Feffects\u002Fdoor_open.ogg\",\n  \"volume\": 0.8,\n  \"pitch\": 1,\n  \"loop\": false\n}\n",[379,934,935,939,950,962,974,985,994],{"__ignoreMap":433},[437,936,937],{"class":439,"line":440},[437,938,444],{"class":443},[437,940,941,944,946,948],{"class":439,"line":447},[437,942,943],{"class":450},"  \"type\"",[437,945,471],{"class":443},[437,947,527],{"class":474},[437,949,530],{"class":443},[437,951,952,955,957,960],{"class":439,"line":457},[437,953,954],{"class":450},"  \"file\"",[437,956,471],{"class":443},[437,958,959],{"class":474},"\"client\u002Faudio\u002Fmyworld\u002Feffects\u002Fdoor_open.ogg\"",[437,961,530],{"class":443},[437,963,964,967,969,972],{"class":439,"line":465},[437,965,966],{"class":450},"  \"volume\"",[437,968,471],{"class":443},[437,970,971],{"class":450},"0.8",[437,973,530],{"class":443},[437,975,976,979,981,983],{"class":439,"line":478},[437,977,978],{"class":450},"  \"pitch\"",[437,980,471],{"class":443},[437,982,740],{"class":450},[437,984,530],{"class":443},[437,986,987,990,992],{"class":439,"line":484},[437,988,989],{"class":450},"  \"loop\"",[437,991,471],{"class":443},[437,993,763],{"class":450},[437,995,996],{"class":439,"line":490},[437,997,493],{"class":443},[375,999,895],{},[402,1001,1002,1008,1016,1024,1033],{},[405,1003,1004,1007],{},[379,1005,1006],{},"file"," is the bundle-relative audio asset path.",[405,1009,1010,1013,1014,650],{},[379,1011,1012],{},"volume"," is multiplied with the volume passed by Lua. If omitted, Selene uses ",[379,1015,740],{},[405,1017,1018,1021,1022,650],{},[379,1019,1020],{},"pitch"," is multiplied with the pitch passed by Lua. If omitted, Selene uses ",[379,1023,740],{},[405,1025,1026,1029,1030,650],{},[379,1027,1028],{},"loop"," makes the sound repeat until it is stopped. If omitted, Selene uses ",[379,1031,1032],{},"false",[405,1034,1035,1037],{},[379,1036,907],{}," stores custom data for client-side lookup.",[375,1039,1040],{},"Use short, memory-friendly files for sound effects. Selene loads simple audio as a sound asset and caches it by file path.",[394,1042,1044],{"id":1043},"music-audio","Music audio",[375,1046,1047,1048,1051],{},"The client audio registry also supports ",[379,1049,1050],{},"music"," entries:",[428,1053,1055],{"className":430,"code":1054,"language":432,"meta":433,"style":433},"{\n  \"type\": \"music\",\n  \"file\": \"client\u002Faudio\u002Fmyworld\u002Fmusic\u002Ftheme.ogg\"\n}\n",[379,1056,1057,1061,1072,1081],{"__ignoreMap":433},[437,1058,1059],{"class":439,"line":440},[437,1060,444],{"class":443},[437,1062,1063,1065,1067,1070],{"class":439,"line":447},[437,1064,943],{"class":450},[437,1066,471],{"class":443},[437,1068,1069],{"class":474},"\"music\"",[437,1071,530],{"class":443},[437,1073,1074,1076,1078],{"class":439,"line":457},[437,1075,954],{"class":450},[437,1077,471],{"class":443},[437,1079,1080],{"class":474},"\"client\u002Faudio\u002Fmyworld\u002Fmusic\u002Ftheme.ogg\"\n",[437,1082,1083],{"class":439,"line":465},[437,1084,493],{"class":443},[375,1086,1087,1088,1090,1091,1093,1094,1096],{},"The current ",[379,1089,164],{}," playback path resolves ",[379,1092,926],{}," audio definitions. Use ",[379,1095,1050],{}," entries only for systems that explicitly consume music audio definitions.",[394,1098,1100],{"id":1099},"audio-file-paths","Audio file paths",[375,1102,1103],{},"Audio file paths are bundle-relative paths, such as:",[428,1105,1108],{"className":1106,"code":1107,"language":580,"meta":433},[578],"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\nclient\u002Faudio\u002Fmyworld\u002Fambient\u002Fwind.ogg\n",[379,1109,1107],{"__ignoreMap":433},[375,1111,1112,1113,1116],{},"The path is resolved from the loaded bundle files. Keep paths under ",[379,1114,1115],{},"client\u002Faudio\u002F"," for discoverability, even though the resolver only requires a valid bundle-relative path.",[375,1118,1119],{},"If you are overriding an existing audio asset in a resource pack, keep the same internal path as the original bundle. If you are defining a new audio entry, choose a path that matches your bundle's own audio layout.",[394,1121,1123],{"id":1122},"playing-sounds-from-client-lua","Playing sounds from client Lua",[375,1125,1126,1127,426],{},"Client Lua can play local sounds through ",[379,1128,164],{},[428,1130,1134],{"className":1131,"code":1132,"language":1133,"meta":433,"style":433},"language-lua shiki shiki-themes github-light github-dark","local Registries = require(\"selene.registries\")\nlocal Sounds = require(\"selene.sounds\")\n\nlocal click = Registries.findByName(\"sounds\", \"myworld:ui\u002Fclick\")\n\nSounds.playSound(click)\nSounds.playSound(click, {\n  volume = 0.5,\n  pitch = 1.1\n})\n","lua",[379,1135,1136,1141,1146,1152,1157,1161,1166,1171,1176,1181],{"__ignoreMap":433},[437,1137,1138],{"class":439,"line":440},[437,1139,1140],{},"local Registries = require(\"selene.registries\")\n",[437,1142,1143],{"class":439,"line":447},[437,1144,1145],{},"local Sounds = require(\"selene.sounds\")\n",[437,1147,1148],{"class":439,"line":457},[437,1149,1151],{"emptyLinePlaceholder":1150},true,"\n",[437,1153,1154],{"class":439,"line":465},[437,1155,1156],{},"local click = Registries.findByName(\"sounds\", \"myworld:ui\u002Fclick\")\n",[437,1158,1159],{"class":439,"line":478},[437,1160,1151],{"emptyLinePlaceholder":1150},[437,1162,1163],{"class":439,"line":484},[437,1164,1165],{},"Sounds.playSound(click)\n",[437,1167,1168],{"class":439,"line":490},[437,1169,1170],{},"Sounds.playSound(click, {\n",[437,1172,1173],{"class":439,"line":551},[437,1174,1175],{},"  volume = 0.5,\n",[437,1177,1178],{"class":439,"line":766},[437,1179,1180],{},"  pitch = 1.1\n",[437,1182,1183],{"class":439,"line":771},[437,1184,1185],{},"})\n",[375,1187,1188],{},"Client Lua can stop the currently tracked instance of a sound:",[428,1190,1192],{"className":1131,"code":1191,"language":1133,"meta":433,"style":433},"Sounds.stopSound(click)\n",[379,1193,1194],{"__ignoreMap":433},[437,1195,1196],{"class":439,"line":440},[437,1197,1191],{},[375,1199,1200],{},"Or stop all sounds managed by the client sound manager:",[428,1202,1204],{"className":1131,"code":1203,"language":1133,"meta":433,"style":433},"Sounds.stopAllSounds()\n",[379,1205,1206],{"__ignoreMap":433},[437,1207,1208],{"class":439,"line":440},[437,1209,1203],{},[375,1211,1212,1215],{},[379,1213,1214],{},"stopSound"," is most useful for looping sounds. Non-looping sounds usually finish on their own.",[394,1217,1219],{"id":1218},"playing-sounds-from-server-lua","Playing sounds from server Lua",[375,1221,1222],{},"Server Lua can play a sound for a specific player:",[428,1224,1226],{"className":1131,"code":1225,"language":1133,"meta":433,"style":433},"local Registries = require(\"selene.registries\")\nlocal Sounds = require(\"selene.sounds\")\n\nlocal doorOpen = Registries.findByName(\"sounds\", \"myworld:effects\u002Fdoor_open\")\n\nSounds.playSound(player, doorOpen, {\n  volume = 0.8,\n  pitch = 1\n})\n",[379,1227,1228,1232,1236,1240,1245,1249,1254,1259,1264],{"__ignoreMap":433},[437,1229,1230],{"class":439,"line":440},[437,1231,1140],{},[437,1233,1234],{"class":439,"line":447},[437,1235,1145],{},[437,1237,1238],{"class":439,"line":457},[437,1239,1151],{"emptyLinePlaceholder":1150},[437,1241,1242],{"class":439,"line":465},[437,1243,1244],{},"local doorOpen = Registries.findByName(\"sounds\", \"myworld:effects\u002Fdoor_open\")\n",[437,1246,1247],{"class":439,"line":478},[437,1248,1151],{"emptyLinePlaceholder":1150},[437,1250,1251],{"class":439,"line":484},[437,1252,1253],{},"Sounds.playSound(player, doorOpen, {\n",[437,1255,1256],{"class":439,"line":490},[437,1257,1258],{},"  volume = 0.8,\n",[437,1260,1261],{"class":439,"line":551},[437,1262,1263],{},"  pitch = 1\n",[437,1265,1266],{"class":439,"line":766},[437,1267,1185],{},[375,1269,1270],{},"Play a positional sound near a coordinate:",[428,1272,1274],{"className":1131,"code":1273,"language":1133,"meta":433,"style":433},"Sounds.playSoundAt(100, 100, 0, doorOpen, dimension)\n",[379,1275,1276],{"__ignoreMap":433},[437,1277,1278],{"class":439,"line":440},[437,1279,1273],{},[375,1281,1282],{},"Or broadcast a non-positional sound in a dimension:",[428,1284,1286],{"className":1131,"code":1285,"language":1133,"meta":433,"style":433},"Sounds.playGlobalSound(doorOpen, dimension)\n",[379,1287,1288],{"__ignoreMap":433},[437,1289,1290],{"class":439,"line":440},[437,1291,1285],{},[375,1293,1294,1295,1297],{},"The server sends the sound identifier plus volume and pitch to clients. Each client then resolves the sound's ",[379,1296,388],{}," entry locally and plays the referenced audio file.",[394,1299,1300],{"id":907},"Metadata",[375,1302,1303],{},"Use sound metadata for imported ids, sound categories, editor grouping, or migration data:",[428,1305,1307],{"className":430,"code":1306,"language":432,"meta":433,"style":433},"{\n  \"entries\": {\n    \"effects\u002Fdoor_open\": {\n      \"audio\": \"myworld:effects\u002Fdoor_open\",\n      \"metadata\": {\n        \"legacySoundId\": 21,\n        \"category\": \"environment\"\n      },\n      \"tags\": [\n        \"myworld:effect\",\n        \"myworld:environment\"\n      ]\n    }\n  }\n}\n",[379,1308,1309,1313,1319,1326,1337,1344,1356,1366,1371,1379,1386,1391,1397,1402,1407],{"__ignoreMap":433},[437,1310,1311],{"class":439,"line":440},[437,1312,444],{"class":443},[437,1314,1315,1317],{"class":439,"line":447},[437,1316,451],{"class":450},[437,1318,454],{"class":443},[437,1320,1321,1324],{"class":439,"line":457},[437,1322,1323],{"class":450},"    \"effects\u002Fdoor_open\"",[437,1325,454],{"class":443},[437,1327,1328,1330,1332,1335],{"class":439,"line":465},[437,1329,468],{"class":450},[437,1331,471],{"class":443},[437,1333,1334],{"class":474},"\"myworld:effects\u002Fdoor_open\"",[437,1336,530],{"class":443},[437,1338,1339,1342],{"class":439,"line":478},[437,1340,1341],{"class":450},"      \"metadata\"",[437,1343,454],{"class":443},[437,1345,1346,1349,1351,1354],{"class":439,"line":484},[437,1347,1348],{"class":450},"        \"legacySoundId\"",[437,1350,471],{"class":443},[437,1352,1353],{"class":450},"21",[437,1355,530],{"class":443},[437,1357,1358,1361,1363],{"class":439,"line":490},[437,1359,1360],{"class":450},"        \"category\"",[437,1362,471],{"class":443},[437,1364,1365],{"class":474},"\"environment\"\n",[437,1367,1368],{"class":439,"line":551},[437,1369,1370],{"class":443},"      },\n",[437,1372,1373,1376],{"class":439,"line":766},[437,1374,1375],{"class":450},"      \"tags\"",[437,1377,1378],{"class":443},": [\n",[437,1380,1381,1384],{"class":439,"line":771},[437,1382,1383],{"class":474},"        \"myworld:effect\"",[437,1385,530],{"class":443},[437,1387,1388],{"class":439,"line":776},[437,1389,1390],{"class":474},"        \"myworld:environment\"\n",[437,1392,1394],{"class":439,"line":1393},12,[437,1395,1396],{"class":443},"      ]\n",[437,1398,1400],{"class":439,"line":1399},13,[437,1401,481],{"class":443},[437,1403,1405],{"class":439,"line":1404},14,[437,1406,487],{"class":443},[437,1408,1410],{"class":439,"line":1409},15,[437,1411,493],{"class":443},[375,1413,1414],{},"Registry metadata can be queried from Lua:",[428,1416,1418],{"className":1131,"code":1417,"language":1133,"meta":433,"style":433},"local Registries = require(\"selene.registries\")\n\nlocal doorOpen = Registries.findByMetadata(\"sounds\", \"legacySoundId\", 21)\n",[379,1419,1420,1424,1428],{"__ignoreMap":433},[437,1421,1422],{"class":439,"line":440},[437,1423,1140],{},[437,1425,1426],{"class":439,"line":447},[437,1427,1151],{"emptyLinePlaceholder":1150},[437,1429,1430],{"class":439,"line":457},[437,1431,1432],{},"local doorOpen = Registries.findByMetadata(\"sounds\", \"legacySoundId\", 21)\n",[375,1434,1435],{},"Use metadata keys consistently. If you are importing from an older content pipeline, store the old id in metadata instead of baking it into the sound name unless the name is already meaningful.",[394,1437,1439],{"id":1438},"complete-example","Complete example",[375,1441,1442],{},[379,1443,1444],{},"common\u002Fdata\u002Fmyworld\u002Fsounds.json",[428,1446,1448],{"className":430,"code":1447,"language":432,"meta":433,"style":433},"{\n  \"entries\": {\n    \"ui\u002Fclick\": {\n      \"audio\": \"myworld:ui\u002Fclick\",\n      \"tags\": [\"myworld:ui\"]\n    },\n    \"effects\u002Fdoor_open\": {\n      \"audio\": \"myworld:effects\u002Fdoor_open\",\n      \"metadata\": {\n        \"legacySoundId\": 21\n      },\n      \"tags\": [\"myworld:effect\"]\n    },\n    \"ambient\u002Fwind\": {\n      \"audio\": \"myworld:ambient\u002Fwind_loop\",\n      \"tags\": [\"myworld:ambient\"]\n    }\n  }\n}\n",[379,1449,1450,1454,1460,1466,1476,1489,1494,1500,1510,1516,1525,1529,1540,1544,1551,1562,1574,1579,1584],{"__ignoreMap":433},[437,1451,1452],{"class":439,"line":440},[437,1453,444],{"class":443},[437,1455,1456,1458],{"class":439,"line":447},[437,1457,451],{"class":450},[437,1459,454],{"class":443},[437,1461,1462,1464],{"class":439,"line":457},[437,1463,460],{"class":450},[437,1465,454],{"class":443},[437,1467,1468,1470,1472,1474],{"class":439,"line":465},[437,1469,468],{"class":450},[437,1471,471],{"class":443},[437,1473,844],{"class":474},[437,1475,530],{"class":443},[437,1477,1478,1480,1483,1486],{"class":439,"line":478},[437,1479,1375],{"class":450},[437,1481,1482],{"class":443},": [",[437,1484,1485],{"class":474},"\"myworld:ui\"",[437,1487,1488],{"class":443},"]\n",[437,1490,1491],{"class":439,"line":484},[437,1492,1493],{"class":443},"    },\n",[437,1495,1496,1498],{"class":439,"line":490},[437,1497,1323],{"class":450},[437,1499,454],{"class":443},[437,1501,1502,1504,1506,1508],{"class":439,"line":551},[437,1503,468],{"class":450},[437,1505,471],{"class":443},[437,1507,1334],{"class":474},[437,1509,530],{"class":443},[437,1511,1512,1514],{"class":439,"line":766},[437,1513,1341],{"class":450},[437,1515,454],{"class":443},[437,1517,1518,1520,1522],{"class":439,"line":771},[437,1519,1348],{"class":450},[437,1521,471],{"class":443},[437,1523,1524],{"class":450},"21\n",[437,1526,1527],{"class":439,"line":776},[437,1528,1370],{"class":443},[437,1530,1531,1533,1535,1538],{"class":439,"line":1393},[437,1532,1375],{"class":450},[437,1534,1482],{"class":443},[437,1536,1537],{"class":474},"\"myworld:effect\"",[437,1539,1488],{"class":443},[437,1541,1542],{"class":439,"line":1399},[437,1543,1493],{"class":443},[437,1545,1546,1549],{"class":439,"line":1404},[437,1547,1548],{"class":450},"    \"ambient\u002Fwind\"",[437,1550,454],{"class":443},[437,1552,1553,1555,1557,1560],{"class":439,"line":1409},[437,1554,468],{"class":450},[437,1556,471],{"class":443},[437,1558,1559],{"class":474},"\"myworld:ambient\u002Fwind_loop\"",[437,1561,530],{"class":443},[437,1563,1565,1567,1569,1572],{"class":439,"line":1564},16,[437,1566,1375],{"class":450},[437,1568,1482],{"class":443},[437,1570,1571],{"class":474},"\"myworld:ambient\"",[437,1573,1488],{"class":443},[437,1575,1577],{"class":439,"line":1576},17,[437,1578,481],{"class":443},[437,1580,1582],{"class":439,"line":1581},18,[437,1583,487],{"class":443},[437,1585,1587],{"class":439,"line":1586},19,[437,1588,493],{"class":443},[375,1590,1591],{},[379,1592,1593],{},"client\u002Fdata\u002Fmyworld\u002Faudio.json",[428,1595,1597],{"className":430,"code":1596,"language":432,"meta":433,"style":433},"{\n  \"entries\": {\n    \"ui\u002Fclick\": {\n      \"type\": \"simple\",\n      \"file\": \"client\u002Faudio\u002Fmyworld\u002Fui\u002Fclick.ogg\"\n    },\n    \"effects\u002Fdoor_open\": {\n      \"type\": \"simple\",\n      \"file\": \"client\u002Faudio\u002Fmyworld\u002Feffects\u002Fdoor_open.ogg\",\n      \"volume\": 0.8\n    },\n    \"ambient\u002Fwind_loop\": {\n      \"type\": \"simple\",\n      \"file\": \"client\u002Faudio\u002Fmyworld\u002Fambient\u002Fwind_loop.ogg\",\n      \"volume\": 0.6,\n      \"loop\": true\n    }\n  }\n}\n",[379,1598,1599,1603,1609,1615,1625,1633,1637,1643,1653,1663,1672,1676,1683,1693,1704,1715,1724,1728,1732],{"__ignoreMap":433},[437,1600,1601],{"class":439,"line":440},[437,1602,444],{"class":443},[437,1604,1605,1607],{"class":439,"line":447},[437,1606,451],{"class":450},[437,1608,454],{"class":443},[437,1610,1611,1613],{"class":439,"line":457},[437,1612,460],{"class":450},[437,1614,454],{"class":443},[437,1616,1617,1619,1621,1623],{"class":439,"line":465},[437,1618,522],{"class":450},[437,1620,471],{"class":443},[437,1622,527],{"class":474},[437,1624,530],{"class":443},[437,1626,1627,1629,1631],{"class":439,"line":478},[437,1628,535],{"class":450},[437,1630,471],{"class":443},[437,1632,540],{"class":474},[437,1634,1635],{"class":439,"line":484},[437,1636,1493],{"class":443},[437,1638,1639,1641],{"class":439,"line":490},[437,1640,1323],{"class":450},[437,1642,454],{"class":443},[437,1644,1645,1647,1649,1651],{"class":439,"line":551},[437,1646,522],{"class":450},[437,1648,471],{"class":443},[437,1650,527],{"class":474},[437,1652,530],{"class":443},[437,1654,1655,1657,1659,1661],{"class":439,"line":766},[437,1656,535],{"class":450},[437,1658,471],{"class":443},[437,1660,959],{"class":474},[437,1662,530],{"class":443},[437,1664,1665,1667,1669],{"class":439,"line":771},[437,1666,735],{"class":450},[437,1668,471],{"class":443},[437,1670,1671],{"class":450},"0.8\n",[437,1673,1674],{"class":439,"line":776},[437,1675,1493],{"class":443},[437,1677,1678,1681],{"class":439,"line":1393},[437,1679,1680],{"class":450},"    \"ambient\u002Fwind_loop\"",[437,1682,454],{"class":443},[437,1684,1685,1687,1689,1691],{"class":439,"line":1399},[437,1686,522],{"class":450},[437,1688,471],{"class":443},[437,1690,527],{"class":474},[437,1692,530],{"class":443},[437,1694,1695,1697,1699,1702],{"class":439,"line":1404},[437,1696,535],{"class":450},[437,1698,471],{"class":443},[437,1700,1701],{"class":474},"\"client\u002Faudio\u002Fmyworld\u002Fambient\u002Fwind_loop.ogg\"",[437,1703,530],{"class":443},[437,1705,1706,1708,1710,1713],{"class":439,"line":1409},[437,1707,735],{"class":450},[437,1709,471],{"class":443},[437,1711,1712],{"class":450},"0.6",[437,1714,530],{"class":443},[437,1716,1717,1719,1721],{"class":439,"line":1564},[437,1718,758],{"class":450},[437,1720,471],{"class":443},[437,1722,1723],{"class":450},"true\n",[437,1725,1726],{"class":439,"line":1576},[437,1727,481],{"class":443},[437,1729,1730],{"class":439,"line":1581},[437,1731,487],{"class":443},[437,1733,1734],{"class":439,"line":1586},[437,1735,493],{"class":443},[375,1737,1738],{},"Recommended asset layout:",[428,1740,1743],{"className":1741,"code":1742,"language":580,"meta":433},[578],"my-bundle\u002F\n  common\u002F\n    data\u002F\n      myworld\u002F\n        sounds.json\n  client\u002F\n    data\u002F\n      myworld\u002F\n        audio.json\n    audio\u002F\n      myworld\u002F\n        ui\u002F\n          click.ogg\n        effects\u002F\n          door_open.ogg\n        ambient\u002F\n          wind_loop.ogg\n",[379,1744,1742],{"__ignoreMap":433},[394,1746,1748],{"id":1747},"resource-pack-overrides","Resource pack overrides",[375,1750,1751],{},"Resource packs can override sounds in three ways:",[402,1753,1754,1757,1760],{},[405,1755,1756],{},"Replace the audio file at the same internal path.",[405,1758,1759],{},"Replace the client audio definition and point it to a different file or change default volume, pitch, or looping.",[405,1761,1762],{},"Replace the common sound definition and point it to a different audio identifier.",[375,1764,1765,1766,1768],{},"For example, to override only the audio file for ",[379,1767,422],{},", mirror the original path:",[428,1770,1773],{"className":1771,"code":1772,"language":580,"meta":433},[578],"global_client_bundles\u002F\n  my-resource-pack\u002F\n    client\u002F\n      audio\u002F\n        myworld\u002F\n          ui\u002F\n            click.ogg\n",[379,1774,1772],{"__ignoreMap":433},[375,1776,1777,1778,1780],{},"To override an audio definition from a merged registry file, mirror the original ",[379,1779,686],{}," path:",[428,1782,1785],{"className":1783,"code":1784,"language":580,"meta":433},[578],"global_client_bundles\u002F\n  my-resource-pack\u002F\n    client\u002F\n      data\u002F\n        myworld\u002F\n          audio.json\n",[379,1786,1784],{"__ignoreMap":433},[375,1788,1789,1790,1792],{},"If the original audio definition was split into ",[379,1791,783],{},", mirror that file path instead.",[375,1794,1795,1796,1799],{},"See ",[1797,1798,55],"a",{"href":56}," for the broader override workflow.",[394,1801,1803],{"id":1802},"hot-reload-behavior","Hot reload behavior",[375,1805,1806],{},"Sound and audio definitions are loaded through the bundle registry system.",[402,1808,1809,1816,1823,1829,1835],{},[405,1810,1811,1812,1815],{},"Updating ",[379,1813,1814],{},"common\u002Fdata\u002F\u003Cnamespace>\u002Fsounds.json"," reloads the merged sound file.",[405,1817,1818,1819,1822],{},"Updating a file below ",[379,1820,1821],{},"common\u002Fdata\u002F\u003Cnamespace>\u002Fsounds\u002F"," reloads that single sound entry.",[405,1824,1811,1825,1828],{},[379,1826,1827],{},"client\u002Fdata\u002F\u003Cnamespace>\u002Faudio.json"," reloads the merged audio file.",[405,1830,1818,1831,1834],{},[379,1832,1833],{},"client\u002Fdata\u002F\u003Cnamespace>\u002Faudio\u002F"," reloads that single audio entry.",[405,1836,1837],{},"If both a merged registry file and split registry directory exist for the same namespace in the same bundle, the merged file is authoritative.",[375,1839,1840],{},"The sound manager caches loaded audio files by path. If you replace the audio file itself while the client is running, restart the client or trigger a full reload if your workflow requires the cached asset to be recreated.",[394,1842,1844],{"id":1843},"checklist","Checklist",[402,1846,1847,1855,1862,1867,1876,1883,1889],{},[405,1848,1849,1850,1852,1853,650],{},"Put gameplay-facing sound definitions under ",[379,1851,1814],{}," or ",[379,1854,1821],{},[405,1856,1857,1858,1852,1860,650],{},"Put client audio definitions under ",[379,1859,1827],{},[379,1861,1833],{},[405,1863,1864,1865,650],{},"Put referenced audio assets under ",[379,1866,1115],{},[405,1868,1869,1870,1872,1873,650],{},"Reference sounds from Lua through the ",[379,1871,381],{}," registry, such as ",[379,1874,1875],{},"myworld:effects\u002Fdoor_open",[405,1877,923,1878,1880,1881,650],{},[379,1879,926],{}," audio for sounds played through ",[379,1882,164],{},[405,1884,923,1885,1888],{},[379,1886,1887],{},"loop: true"," only for sounds that scripts can deliberately stop.",[405,1890,1891],{},"Keep sound identifiers stable once scripts, triggers, or saved data refer to them.",[1893,1894,1895],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":433,"searchDepth":447,"depth":447,"links":1897},[1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912],{"id":396,"depth":447,"text":397},{"id":559,"depth":447,"text":560},{"id":653,"depth":447,"text":654},{"id":788,"depth":447,"text":789},{"id":821,"depth":447,"text":822},{"id":919,"depth":447,"text":920},{"id":1043,"depth":447,"text":1044},{"id":1099,"depth":447,"text":1100},{"id":1122,"depth":447,"text":1123},{"id":1218,"depth":447,"text":1219},{"id":907,"depth":447,"text":1300},{"id":1438,"depth":447,"text":1439},{"id":1747,"depth":447,"text":1748},{"id":1802,"depth":447,"text":1803},{"id":1843,"depth":447,"text":1844},"Define sound registry entries in Selene bundles, connect them to client audio files, and play them from Lua.","md",{},{"title":31,"description":1913},"bAPnCv2RwA5cGZram4FQ_rC-SQn0fmBoEU1wfpzwdf8",[1919,1921],{"title":27,"path":28,"stem":29,"description":1920,"children":-1},"Define entity registry entries in Selene bundles, attach visuals and scripts, and create entities from Lua.",{"title":35,"path":36,"stem":37,"description":1922,"children":-1},"Define automatic tile transition overlays in Selene bundles with transition priorities and neighbour masks.",1792747966451]