[{"data":1,"prerenderedAt":1481},["ShallowReactive",2],{"navigation":3,"reference-navigation":62,"\u002Fdocs\u002Fdefining-bundle-tiles":365,"\u002Fdocs\u002Fdefining-bundle-tiles-surround":1476},[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":39,"body":367,"description":1471,"extension":1472,"meta":1473,"navigation":1152,"path":40,"seo":1474,"stem":41,"__hash__":1475},"docs\u002F1.docs\u002Fdefining-bundle-tiles.md",{"type":368,"value":369,"toc":1460},"minimark",[370,374,378,386,393,398,409,412,422,425,431,442,507,516,520,527,533,546,549,553,556,621,627,648,651,686,690,700,740,814,817,823,827,830,837,942,948,1002,1005,1022,1031,1034,1039,1133,1136,1159,1162,1166,1169,1326,1329,1335,1354,1358,1364,1410,1417,1421,1456],[371,372,39],"h1",{"id":373},"defining-bundle-tiles",[375,376,377],"p",{},"Tile definitions describe reusable map tiles: terrain, floors, walls, overlays, items placed as tiles, transition edges, and any other map layer entry that should be synchronized by tile id.",[375,379,380,381,385],{},"Tiles live in the common ",[382,383,384],"code",{},"tiles"," registry. The server uses them for map storage and collision. The client uses the same definitions to resolve visuals and render received map chunks.",[375,387,388,389,392],{},"If you are defining automatic terrain edges or corner overlays, see ",[390,391,35],"a",{"href":36},".",[394,395,397],"h2",{"id":396},"where-tiles-live","Where tiles live",[375,399,400,401,404,405,408],{},"Put tile definitions under ",[382,402,403],{},"common\u002Fdata\u002F\u003Cnamespace>\u002F",", where ",[382,406,407],{},"\u003Cnamespace>"," becomes the namespace part of each tile identifier.",[375,410,411],{},"You can define multiple tiles in one registry file:",[413,414,420],"pre",{"className":415,"code":417,"language":418,"meta":419},[416],"language-text","my-bundle\u002F\n  bundle.json\n  common\u002F\n    data\u002F\n      myworld\u002F\n        tiles.json\n","text","",[382,421,417],{"__ignoreMap":419},[375,423,424],{},"Or split each tile into its own JSON file:",[413,426,429],{"className":427,"code":428,"language":418,"meta":419},[416],"my-bundle\u002F\n  common\u002F\n    data\u002F\n      myworld\u002F\n        tiles\u002F\n          terrain\u002F\n            grass.json\n",[382,430,428],{"__ignoreMap":419},[375,432,433,434,437,438,441],{},"The merged ",[382,435,436],{},"tiles.json"," form stores entries by local name. This defines ",[382,439,440],{},"myworld:terrain\u002Fgrass",":",[413,443,447],{"className":444,"code":445,"language":446,"meta":419,"style":419},"language-json shiki shiki-themes github-light github-dark","{\n  \"entries\": {\n    \"terrain\u002Fgrass\": {\n      \"visual\": \"myworld:terrain\u002Fgrass\"\n    }\n  }\n}\n","json",[382,448,449,458,468,476,489,495,501],{"__ignoreMap":419},[450,451,454],"span",{"class":452,"line":453},"line",1,[450,455,457],{"class":456},"sVt8B","{\n",[450,459,461,465],{"class":452,"line":460},2,[450,462,464],{"class":463},"sj4cs","  \"entries\"",[450,466,467],{"class":456},": {\n",[450,469,471,474],{"class":452,"line":470},3,[450,472,473],{"class":463},"    \"terrain\u002Fgrass\"",[450,475,467],{"class":456},[450,477,479,482,485],{"class":452,"line":478},4,[450,480,481],{"class":463},"      \"visual\"",[450,483,484],{"class":456},": ",[450,486,488],{"class":487},"sZZnC","\"myworld:terrain\u002Fgrass\"\n",[450,490,492],{"class":452,"line":491},5,[450,493,494],{"class":456},"    }\n",[450,496,498],{"class":452,"line":497},6,[450,499,500],{"class":456},"  }\n",[450,502,504],{"class":452,"line":503},7,[450,505,506],{"class":456},"}\n",[375,508,509,510,513,514,392],{},"The split-file form uses the file path as the local name. For example, ",[382,511,512],{},"common\u002Fdata\u002Fmyworld\u002Ftiles\u002Fterrain\u002Fgrass.json"," also defines ",[382,515,440],{},[394,517,519],{"id":518},"tile-identifiers","Tile identifiers",[375,521,522,523,526],{},"Tile identifiers use the same ",[382,524,525],{},"namespace:name"," format as other Selene registries:",[413,528,531],{"className":529,"code":530,"language":418,"meta":419},[416],"myworld:terrain\u002Fgrass\nmyworld:terrain\u002Fwater\nmyworld:objects\u002Fstone_wall\nillarion:tile\u002Fgrass\n",[382,532,530],{"__ignoreMap":419},[375,534,535,536,539,540,542,543,392],{},"The namespace comes from the directory below ",[382,537,538],{},"common\u002Fdata\u002F",". The name comes from either the key inside ",[382,541,436],{}," or the relative path of a file below ",[382,544,545],{},"tiles\u002F",[375,547,548],{},"Use stable tile names once maps, saves, transitions, scripts, or migration data refer to them. Saved maps store numeric ids, but those ids are populated from tile identifiers. Renaming a tile definition means updating every place that refers to it.",[394,550,552],{"id":551},"tile-shape","Tile shape",[375,554,555],{},"A tile definition has these fields:",[413,557,559],{"className":444,"code":558,"language":446,"meta":419,"style":419},"{\n  \"visual\": \"myworld:terrain\u002Fgrass\",\n  \"impassable\": false,\n  \"passableAbove\": false,\n  \"metadata\": {},\n  \"tags\": []\n}\n",[382,560,561,565,578,590,601,609,617],{"__ignoreMap":419},[450,562,563],{"class":452,"line":453},[450,564,457],{"class":456},[450,566,567,570,572,575],{"class":452,"line":460},[450,568,569],{"class":463},"  \"visual\"",[450,571,484],{"class":456},[450,573,574],{"class":487},"\"myworld:terrain\u002Fgrass\"",[450,576,577],{"class":456},",\n",[450,579,580,583,585,588],{"class":452,"line":470},[450,581,582],{"class":463},"  \"impassable\"",[450,584,484],{"class":456},[450,586,587],{"class":463},"false",[450,589,577],{"class":456},[450,591,592,595,597,599],{"class":452,"line":478},[450,593,594],{"class":463},"  \"passableAbove\"",[450,596,484],{"class":456},[450,598,587],{"class":463},[450,600,577],{"class":456},[450,602,603,606],{"class":452,"line":491},[450,604,605],{"class":463},"  \"metadata\"",[450,607,608],{"class":456},": {},\n",[450,610,611,614],{"class":452,"line":497},[450,612,613],{"class":463},"  \"tags\"",[450,615,616],{"class":456},": []\n",[450,618,619],{"class":452,"line":503},[450,620,506],{"class":456},[375,622,623,626],{},[382,624,625],{},"visual"," is required. The other fields have defaults in the engine and can be omitted when the default is correct:",[413,628,630],{"className":444,"code":629,"language":446,"meta":419,"style":419},"{\n  \"visual\": \"myworld:terrain\u002Fgrass\"\n}\n",[382,631,632,636,644],{"__ignoreMap":419},[450,633,634],{"class":452,"line":453},[450,635,457],{"class":456},[450,637,638,640,642],{"class":452,"line":460},[450,639,569],{"class":463},[450,641,484],{"class":456},[450,643,488],{"class":487},[450,645,646],{"class":452,"line":470},[450,647,506],{"class":456},[375,649,650],{},"Fields:",[652,653,654,660,666,672,680],"ul",{},[655,656,657,659],"li",{},[382,658,625],{}," is the client visual identifier used to render the tile.",[655,661,662,665],{},[382,663,664],{},"impassable"," marks the tile as blocking movement.",[655,667,668,671],{},[382,669,670],{},"passableAbove"," lets this tile make a coordinate passable when it is placed above a blocking lower tile.",[655,673,674,677,678,392],{},[382,675,676],{},"metadata"," stores custom structured data that can be searched through ",[382,679,102],{},[655,681,682,685],{},[382,683,684],{},"tags"," are strings used for filtering and classification.",[394,687,689],{"id":688},"connecting-visuals","Connecting visuals",[375,691,692,693,696,697,392],{},"Tiles reference visuals by identifier. The visual itself is client data, usually declared under ",[382,694,695],{},"client\u002Fdata\u002F\u003Cnamespace>\u002Fvisuals.json"," or ",[382,698,699],{},"client\u002Fdata\u002F\u003Cnamespace>\u002Fvisuals\u002F**\u002F*.json",[413,701,702],{"className":444,"code":445,"language":446,"meta":419,"style":419},[382,703,704,708,714,720,728,732,736],{"__ignoreMap":419},[450,705,706],{"class":452,"line":453},[450,707,457],{"class":456},[450,709,710,712],{"class":452,"line":460},[450,711,464],{"class":463},[450,713,467],{"class":456},[450,715,716,718],{"class":452,"line":470},[450,717,473],{"class":463},[450,719,467],{"class":456},[450,721,722,724,726],{"class":452,"line":478},[450,723,481],{"class":463},[450,725,484],{"class":456},[450,727,488],{"class":487},[450,729,730],{"class":452,"line":491},[450,731,494],{"class":456},[450,733,734],{"class":452,"line":497},[450,735,500],{"class":456},[450,737,738],{"class":452,"line":503},[450,739,506],{"class":456},[413,741,743],{"className":444,"code":742,"language":446,"meta":419,"style":419},"{\n  \"entries\": {\n    \"terrain\u002Fgrass\": {\n      \"type\": \"variants\",\n      \"textures\": [\n        \"client\u002Ftextures\u002Fmyworld\u002Fterrain\u002Fgrass_0.png\",\n        \"client\u002Ftextures\u002Fmyworld\u002Fterrain\u002Fgrass_1.png\"\n      ]\n    }\n  }\n}\n",[382,744,745,749,755,761,773,781,788,793,799,804,809],{"__ignoreMap":419},[450,746,747],{"class":452,"line":453},[450,748,457],{"class":456},[450,750,751,753],{"class":452,"line":460},[450,752,464],{"class":463},[450,754,467],{"class":456},[450,756,757,759],{"class":452,"line":470},[450,758,473],{"class":463},[450,760,467],{"class":456},[450,762,763,766,768,771],{"class":452,"line":478},[450,764,765],{"class":463},"      \"type\"",[450,767,484],{"class":456},[450,769,770],{"class":487},"\"variants\"",[450,772,577],{"class":456},[450,774,775,778],{"class":452,"line":491},[450,776,777],{"class":463},"      \"textures\"",[450,779,780],{"class":456},": [\n",[450,782,783,786],{"class":452,"line":497},[450,784,785],{"class":487},"        \"client\u002Ftextures\u002Fmyworld\u002Fterrain\u002Fgrass_0.png\"",[450,787,577],{"class":456},[450,789,790],{"class":452,"line":503},[450,791,792],{"class":487},"        \"client\u002Ftextures\u002Fmyworld\u002Fterrain\u002Fgrass_1.png\"\n",[450,794,796],{"class":452,"line":795},8,[450,797,798],{"class":456},"      ]\n",[450,800,802],{"class":452,"line":801},9,[450,803,494],{"class":456},[450,805,807],{"class":452,"line":806},10,[450,808,500],{"class":456},[450,810,812],{"class":452,"line":811},11,[450,813,506],{"class":456},[375,815,816],{},"The tile and visual identifiers do not have to match, but matching them keeps data easy to scan. If the client cannot resolve the visual, the tile will have no renderable visual.",[375,818,819,820,822],{},"See ",[390,821,43],{"href":44}," for the full visual definition format.",[394,824,826],{"id":825},"collision-flags","Collision flags",[375,828,829],{},"The server checks tile flags when resolving movement.",[375,831,832,833,836],{},"Use ",[382,834,835],{},"impassable: true"," for blocking terrain or objects:",[413,838,840],{"className":444,"code":839,"language":446,"meta":419,"style":419},"{\n  \"entries\": {\n    \"terrain\u002Fwater\": {\n      \"visual\": \"myworld:terrain\u002Fwater\",\n      \"impassable\": true,\n      \"tags\": [\"myworld:liquid\"]\n    },\n    \"objects\u002Fstone_wall\": {\n      \"visual\": \"myworld:objects\u002Fstone_wall\",\n      \"impassable\": true\n    }\n  }\n}\n",[382,841,842,846,852,859,870,882,896,901,908,919,928,932,937],{"__ignoreMap":419},[450,843,844],{"class":452,"line":453},[450,845,457],{"class":456},[450,847,848,850],{"class":452,"line":460},[450,849,464],{"class":463},[450,851,467],{"class":456},[450,853,854,857],{"class":452,"line":470},[450,855,856],{"class":463},"    \"terrain\u002Fwater\"",[450,858,467],{"class":456},[450,860,861,863,865,868],{"class":452,"line":478},[450,862,481],{"class":463},[450,864,484],{"class":456},[450,866,867],{"class":487},"\"myworld:terrain\u002Fwater\"",[450,869,577],{"class":456},[450,871,872,875,877,880],{"class":452,"line":491},[450,873,874],{"class":463},"      \"impassable\"",[450,876,484],{"class":456},[450,878,879],{"class":463},"true",[450,881,577],{"class":456},[450,883,884,887,890,893],{"class":452,"line":497},[450,885,886],{"class":463},"      \"tags\"",[450,888,889],{"class":456},": [",[450,891,892],{"class":487},"\"myworld:liquid\"",[450,894,895],{"class":456},"]\n",[450,897,898],{"class":452,"line":503},[450,899,900],{"class":456},"    },\n",[450,902,903,906],{"class":452,"line":795},[450,904,905],{"class":463},"    \"objects\u002Fstone_wall\"",[450,907,467],{"class":456},[450,909,910,912,914,917],{"class":452,"line":801},[450,911,481],{"class":463},[450,913,484],{"class":456},[450,915,916],{"class":487},"\"myworld:objects\u002Fstone_wall\"",[450,918,577],{"class":456},[450,920,921,923,925],{"class":452,"line":806},[450,922,874],{"class":463},[450,924,484],{"class":456},[450,926,927],{"class":463},"true\n",[450,929,930],{"class":452,"line":811},[450,931,494],{"class":456},[450,933,935],{"class":452,"line":934},12,[450,936,500],{"class":456},[450,938,940],{"class":452,"line":939},13,[450,941,506],{"class":456},[375,943,832,944,947],{},[382,945,946],{},"passableAbove: true"," for upper-layer tiles that should override a blocking lower tile at the same coordinate. This is useful for bridges, transition overlays, or similar tiles that are placed above another tile:",[413,949,951],{"className":444,"code":950,"language":446,"meta":419,"style":419},"{\n  \"entries\": {\n    \"terrain\u002Fbridge\": {\n      \"visual\": \"myworld:terrain\u002Fbridge\",\n      \"passableAbove\": true\n    }\n  }\n}\n",[382,952,953,957,963,970,981,990,994,998],{"__ignoreMap":419},[450,954,955],{"class":452,"line":453},[450,956,457],{"class":456},[450,958,959,961],{"class":452,"line":460},[450,960,464],{"class":463},[450,962,467],{"class":456},[450,964,965,968],{"class":452,"line":470},[450,966,967],{"class":463},"    \"terrain\u002Fbridge\"",[450,969,467],{"class":456},[450,971,972,974,976,979],{"class":452,"line":478},[450,973,481],{"class":463},[450,975,484],{"class":456},[450,977,978],{"class":487},"\"myworld:terrain\u002Fbridge\"",[450,980,577],{"class":456},[450,982,983,986,988],{"class":452,"line":491},[450,984,985],{"class":463},"      \"passableAbove\"",[450,987,484],{"class":456},[450,989,927],{"class":463},[450,991,992],{"class":452,"line":497},[450,993,494],{"class":456},[450,995,996],{"class":452,"line":503},[450,997,500],{"class":456},[450,999,1000],{"class":452,"line":795},[450,1001,506],{"class":456},[375,1003,1004],{},"Collision is evaluated in layer order:",[652,1006,1007,1010,1013,1019],{},[655,1008,1009],{},"If the base tile is missing or impassable, the coordinate starts as blocked.",[655,1011,1012],{},"Additional impassable tiles keep or make the coordinate blocked.",[655,1014,1015,1016,1018],{},"An additional tile with ",[382,1017,946],{}," makes the coordinate passable again.",[655,1020,1021],{},"Impassable entities at the coordinate can still block movement afterward.",[375,1023,1024,1025,1027,1028,392],{},"Keep ",[382,1026,670],{}," for deliberate upper-layer overrides. Do not use it as a general substitute for ",[382,1029,1030],{},"impassable: false",[394,1032,1033],{"id":676},"Metadata",[375,1035,832,1036,1038],{},[382,1037,676],{}," for bundle-specific ids, migration data, editor categories, or values that scripts need to inspect.",[413,1040,1042],{"className":444,"code":1041,"language":446,"meta":419,"style":419},"{\n  \"entries\": {\n    \"terrain\u002Fgrass\": {\n      \"visual\": \"myworld:terrain\u002Fgrass\",\n      \"metadata\": {\n        \"legacyTileId\": 11,\n        \"biome\": \"plains\"\n      },\n      \"tags\": [\"myworld:terrain\", \"myworld:natural\"]\n    }\n  }\n}\n",[382,1043,1044,1048,1054,1060,1070,1077,1089,1099,1104,1121,1125,1129],{"__ignoreMap":419},[450,1045,1046],{"class":452,"line":453},[450,1047,457],{"class":456},[450,1049,1050,1052],{"class":452,"line":460},[450,1051,464],{"class":463},[450,1053,467],{"class":456},[450,1055,1056,1058],{"class":452,"line":470},[450,1057,473],{"class":463},[450,1059,467],{"class":456},[450,1061,1062,1064,1066,1068],{"class":452,"line":478},[450,1063,481],{"class":463},[450,1065,484],{"class":456},[450,1067,574],{"class":487},[450,1069,577],{"class":456},[450,1071,1072,1075],{"class":452,"line":491},[450,1073,1074],{"class":463},"      \"metadata\"",[450,1076,467],{"class":456},[450,1078,1079,1082,1084,1087],{"class":452,"line":497},[450,1080,1081],{"class":463},"        \"legacyTileId\"",[450,1083,484],{"class":456},[450,1085,1086],{"class":463},"11",[450,1088,577],{"class":456},[450,1090,1091,1094,1096],{"class":452,"line":503},[450,1092,1093],{"class":463},"        \"biome\"",[450,1095,484],{"class":456},[450,1097,1098],{"class":487},"\"plains\"\n",[450,1100,1101],{"class":452,"line":795},[450,1102,1103],{"class":456},"      },\n",[450,1105,1106,1108,1110,1113,1116,1119],{"class":452,"line":801},[450,1107,886],{"class":463},[450,1109,889],{"class":456},[450,1111,1112],{"class":487},"\"myworld:terrain\"",[450,1114,1115],{"class":456},", ",[450,1117,1118],{"class":487},"\"myworld:natural\"",[450,1120,895],{"class":456},[450,1122,1123],{"class":452,"line":806},[450,1124,494],{"class":456},[450,1126,1127],{"class":452,"line":811},[450,1128,500],{"class":456},[450,1130,1131],{"class":452,"line":934},[450,1132,506],{"class":456},[375,1134,1135],{},"The built-in registry implementation indexes metadata so Lua can find entries by a metadata key and value:",[413,1137,1141],{"className":1138,"code":1139,"language":1140,"meta":419,"style":419},"language-lua shiki shiki-themes github-light github-dark","local Registries = require(\"selene.registries\")\n\nlocal grass = Registries.findByMetadata(\"tiles\", \"legacyTileId\", 11)\n","lua",[382,1142,1143,1148,1154],{"__ignoreMap":419},[450,1144,1145],{"class":452,"line":453},[450,1146,1147],{},"local Registries = require(\"selene.registries\")\n",[450,1149,1150],{"class":452,"line":460},[450,1151,1153],{"emptyLinePlaceholder":1152},true,"\n",[450,1155,1156],{"class":452,"line":470},[450,1157,1158],{},"local grass = Registries.findByMetadata(\"tiles\", \"legacyTileId\", 11)\n",[375,1160,1161],{},"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 tile name unless the name is already meaningful.",[394,1163,1165],{"id":1164},"item-and-overlay-tiles","Item and overlay tiles",[375,1167,1168],{},"Tiles are not limited to ground terrain. A bundle can define item-like or overlay-like map tiles in the same registry:",[413,1170,1172],{"className":444,"code":1171,"language":446,"meta":419,"style":419},"{\n  \"entries\": {\n    \"items\u002Fapple\": {\n      \"visual\": \"myworld:items\u002Fapple\",\n      \"metadata\": {\n        \"itemId\": 15\n      },\n      \"tags\": [\"myworld:item\"]\n    },\n    \"transitions\u002Fgrass_to_dirt_north\": {\n      \"visual\": \"myworld:transitions\u002Fgrass_to_dirt_north\",\n      \"passableAbove\": true,\n      \"metadata\": {\n        \"from\": \"myworld:terrain\u002Fgrass\",\n        \"to\": \"myworld:terrain\u002Fdirt\"\n      },\n      \"tags\": [\"myworld:transition\"]\n    }\n  }\n}\n",[382,1173,1174,1178,1184,1191,1202,1208,1218,1222,1233,1237,1244,1255,1265,1271,1283,1294,1299,1311,1316,1321],{"__ignoreMap":419},[450,1175,1176],{"class":452,"line":453},[450,1177,457],{"class":456},[450,1179,1180,1182],{"class":452,"line":460},[450,1181,464],{"class":463},[450,1183,467],{"class":456},[450,1185,1186,1189],{"class":452,"line":470},[450,1187,1188],{"class":463},"    \"items\u002Fapple\"",[450,1190,467],{"class":456},[450,1192,1193,1195,1197,1200],{"class":452,"line":478},[450,1194,481],{"class":463},[450,1196,484],{"class":456},[450,1198,1199],{"class":487},"\"myworld:items\u002Fapple\"",[450,1201,577],{"class":456},[450,1203,1204,1206],{"class":452,"line":491},[450,1205,1074],{"class":463},[450,1207,467],{"class":456},[450,1209,1210,1213,1215],{"class":452,"line":497},[450,1211,1212],{"class":463},"        \"itemId\"",[450,1214,484],{"class":456},[450,1216,1217],{"class":463},"15\n",[450,1219,1220],{"class":452,"line":503},[450,1221,1103],{"class":456},[450,1223,1224,1226,1228,1231],{"class":452,"line":795},[450,1225,886],{"class":463},[450,1227,889],{"class":456},[450,1229,1230],{"class":487},"\"myworld:item\"",[450,1232,895],{"class":456},[450,1234,1235],{"class":452,"line":801},[450,1236,900],{"class":456},[450,1238,1239,1242],{"class":452,"line":806},[450,1240,1241],{"class":463},"    \"transitions\u002Fgrass_to_dirt_north\"",[450,1243,467],{"class":456},[450,1245,1246,1248,1250,1253],{"class":452,"line":811},[450,1247,481],{"class":463},[450,1249,484],{"class":456},[450,1251,1252],{"class":487},"\"myworld:transitions\u002Fgrass_to_dirt_north\"",[450,1254,577],{"class":456},[450,1256,1257,1259,1261,1263],{"class":452,"line":934},[450,1258,985],{"class":463},[450,1260,484],{"class":456},[450,1262,879],{"class":463},[450,1264,577],{"class":456},[450,1266,1267,1269],{"class":452,"line":939},[450,1268,1074],{"class":463},[450,1270,467],{"class":456},[450,1272,1274,1277,1279,1281],{"class":452,"line":1273},14,[450,1275,1276],{"class":463},"        \"from\"",[450,1278,484],{"class":456},[450,1280,574],{"class":487},[450,1282,577],{"class":456},[450,1284,1286,1289,1291],{"class":452,"line":1285},15,[450,1287,1288],{"class":463},"        \"to\"",[450,1290,484],{"class":456},[450,1292,1293],{"class":487},"\"myworld:terrain\u002Fdirt\"\n",[450,1295,1297],{"class":452,"line":1296},16,[450,1298,1103],{"class":456},[450,1300,1302,1304,1306,1309],{"class":452,"line":1301},17,[450,1303,886],{"class":463},[450,1305,889],{"class":456},[450,1307,1308],{"class":487},"\"myworld:transition\"",[450,1310,895],{"class":456},[450,1312,1314],{"class":452,"line":1313},18,[450,1315,494],{"class":456},[450,1317,1319],{"class":452,"line":1318},19,[450,1320,500],{"class":456},[450,1322,1324],{"class":452,"line":1323},20,[450,1325,506],{"class":456},[375,1327,1328],{},"Separate large generated sets by using the split-file layout when that makes them easier to maintain:",[413,1330,1333],{"className":1331,"code":1332,"language":418,"meta":419},[416],"my-bundle\u002F\n  common\u002F\n    data\u002F\n      myworld\u002F\n        tiles\u002F\n          terrain\u002F\n            grass.json\n          items\u002F\n            apple.json\n          transitions\u002F\n            grass_to_dirt_north.json\n",[382,1334,1332],{"__ignoreMap":419},[375,1336,1337,1338,1341,1342,1344,1345,1115,1347,1350,1351,392],{},"Each split file contains one tile definition, without an outer ",[382,1339,1340],{},"entries"," object. The identifier comes from the path below ",[382,1343,545],{},", so the examples above define ",[382,1346,440],{},[382,1348,1349],{},"myworld:items\u002Fapple",", and ",[382,1352,1353],{},"myworld:transitions\u002Fgrass_to_dirt_north",[394,1355,1357],{"id":1356},"using-tiles-from-lua","Using tiles from Lua",[375,1359,1360,1361,1363],{},"Server Lua APIs accept tile definitions from the ",[382,1362,384],{}," registry when placing, replacing, swapping, or removing map tiles.",[413,1365,1367],{"className":1138,"code":1366,"language":1140,"meta":419,"style":419},"local Registries = require(\"selene.registries\")\n\nlocal grass = Registries.findByName(\"tiles\", \"myworld:terrain\u002Fgrass\")\nlocal wall = Registries.findByName(\"tiles\", \"myworld:objects\u002Fstone_wall\")\n\nlocal coordinate = { x = 100, y = 64, z = 0 }\n\nmapTree:ReplaceTiles(coordinate, grass)\nmapTree:PlaceTile({ x = 101, y = 64, z = 0 }, wall)\n",[382,1368,1369,1373,1377,1382,1387,1391,1396,1400,1405],{"__ignoreMap":419},[450,1370,1371],{"class":452,"line":453},[450,1372,1147],{},[450,1374,1375],{"class":452,"line":460},[450,1376,1153],{"emptyLinePlaceholder":1152},[450,1378,1379],{"class":452,"line":470},[450,1380,1381],{},"local grass = Registries.findByName(\"tiles\", \"myworld:terrain\u002Fgrass\")\n",[450,1383,1384],{"class":452,"line":478},[450,1385,1386],{},"local wall = Registries.findByName(\"tiles\", \"myworld:objects\u002Fstone_wall\")\n",[450,1388,1389],{"class":452,"line":491},[450,1390,1153],{"emptyLinePlaceholder":1152},[450,1392,1393],{"class":452,"line":497},[450,1394,1395],{},"local coordinate = { x = 100, y = 64, z = 0 }\n",[450,1397,1398],{"class":452,"line":503},[450,1399,1153],{"emptyLinePlaceholder":1152},[450,1401,1402],{"class":452,"line":795},[450,1403,1404],{},"mapTree:ReplaceTiles(coordinate, grass)\n",[450,1406,1407],{"class":452,"line":801},[450,1408,1409],{},"mapTree:PlaceTile({ x = 101, y = 64, z = 0 }, wall)\n",[375,1411,1412,1413,1416],{},"Client Lua can inspect tiles that are already present on the local map through map lookup APIs. The returned tile exposes its ",[382,1414,1415],{},"Definition",", which is the same tile registry entry.",[394,1418,1420],{"id":1419},"practical-conventions","Practical conventions",[652,1422,1423,1430,1433,1436,1441,1447,1453],{},[655,1424,1425,1426,1429],{},"Put shared tile definitions in ",[382,1427,1428],{},"common\u002Fdata"," because both the server and client need them.",[655,1431,1432],{},"Put tile graphics in client visuals, then reference those visuals from tile definitions.",[655,1434,1435],{},"Keep terrain, item, object, and transition names grouped by path prefixes.",[655,1437,832,1438,1440],{},[382,1439,664],{}," for server gameplay collision, not just for visual height.",[655,1442,832,1443,1446],{},[382,1444,1445],{},"surfaceOffsetY"," or sorting fields on the visual when the tile only needs rendering adjustments.",[655,1448,1449,1450,1452],{},"Store legacy import ids in ",[382,1451,676],{}," so generated maps and migration tools can look them up.",[655,1454,1455],{},"Use tags for broad groups such as terrain, item, transition, liquid, wall, or harvestable.",[1457,1458,1459],"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":419,"searchDepth":460,"depth":460,"links":1461},[1462,1463,1464,1465,1466,1467,1468,1469,1470],{"id":396,"depth":460,"text":397},{"id":518,"depth":460,"text":519},{"id":551,"depth":460,"text":552},{"id":688,"depth":460,"text":689},{"id":825,"depth":460,"text":826},{"id":676,"depth":460,"text":1033},{"id":1164,"depth":460,"text":1165},{"id":1356,"depth":460,"text":1357},{"id":1419,"depth":460,"text":1420},"Define tile registry entries in Selene bundles, connect them to visuals, and use tile flags for map collision.","md",{},{"title":39,"description":1471},"4MYAMK65W9O_KMuS7tQsiQQVoUC0dMW18T2s6ENNl-g",[1477,1479],{"title":35,"path":36,"stem":37,"description":1478,"children":-1},"Define automatic tile transition overlays in Selene bundles with transition priorities and neighbour masks.",{"title":43,"path":44,"stem":45,"description":1480,"children":-1},"Learn how to define client visual entries in Selene bundles and reference them from tiles, entities, and Lua code.",1792747966452]