[{"data":1,"prerenderedAt":1452},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fadvanced\u002Fplugins":3,"surround:\u002Fgame-engine\u002Fadvanced\u002Fplugins":1201,"navigation":1212},{"id":4,"title":5,"body":6,"description":1194,"extension":1195,"meta":1196,"navigation":63,"path":1197,"seo":1198,"stem":1199,"__hash__":1200},"docs\u002F01.game-engine\u002F08.advanced\u002F01.plugins.md","Pluginy",{"type":7,"value":8,"toc":1183},"minimark",[9,14,23,380,384,548,561,565,685,689,747,751,839,844,1064,1068,1075,1122,1126,1176,1179],[10,11,13],"h2",{"id":12},"model-pluginu","Model pluginu",[15,16,17,18,22],"p",{},"Plugin to manifest + funkcje aktywacji. ",[19,20,21],"code",{},"PluginHost"," zarządza cyklem życia, zależnościami i uprawnieniami.",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-ts shiki shiki-themes github-light github-dark","import { PluginHost, type PluginDefinition } from '@engine'\n\nconst host = new PluginHost({\n  engineVersion: '0.1.0',\n  logger: engine.getLogger(),\n  events: engine.getEvents(),\n  services: { assets: engine.getAssets() },\n  maxFailures: 3\n})\n\nconst plugin: PluginDefinition = {\n  manifest: {\n    id: 'my-plugin',\n    version: '1.0.0',\n    engine: '>=0.1.0',\n    name: 'Mój plugin',\n    permissions: ['systems', 'events']\n  },\n  activate(context) {\n    context.registerSystem({\n      name: 'spawn',\n      update(dt) {\n        context.events.emit('spawn:tick', { dt })\n      }\n    })\n  },\n  deactivate() {}\n}\n\nhost.install(plugin)\nhost.activate('my-plugin')\n","ts","",[19,31,32,58,65,88,100,112,123,135,144,150,155,174,180,191,202,213,224,242,248,264,275,286,299,316,322,328,333,342,348,353,365],{"__ignoreMap":29},[33,34,37,41,45,48,51,54],"span",{"class":35,"line":36},"line",1,[33,38,40],{"class":39},"szBVR","import",[33,42,44],{"class":43},"sVt8B"," { PluginHost, ",[33,46,47],{"class":39},"type",[33,49,50],{"class":43}," PluginDefinition } ",[33,52,53],{"class":39},"from",[33,55,57],{"class":56},"sZZnC"," '@engine'\n",[33,59,61],{"class":35,"line":60},2,[33,62,64],{"emptyLinePlaceholder":63},true,"\n",[33,66,68,71,75,78,81,85],{"class":35,"line":67},3,[33,69,70],{"class":39},"const",[33,72,74],{"class":73},"sj4cs"," host",[33,76,77],{"class":39}," =",[33,79,80],{"class":39}," new",[33,82,84],{"class":83},"sScJk"," PluginHost",[33,86,87],{"class":43},"({\n",[33,89,91,94,97],{"class":35,"line":90},4,[33,92,93],{"class":43},"  engineVersion: ",[33,95,96],{"class":56},"'0.1.0'",[33,98,99],{"class":43},",\n",[33,101,103,106,109],{"class":35,"line":102},5,[33,104,105],{"class":43},"  logger: engine.",[33,107,108],{"class":83},"getLogger",[33,110,111],{"class":43},"(),\n",[33,113,115,118,121],{"class":35,"line":114},6,[33,116,117],{"class":43},"  events: engine.",[33,119,120],{"class":83},"getEvents",[33,122,111],{"class":43},[33,124,126,129,132],{"class":35,"line":125},7,[33,127,128],{"class":43},"  services: { assets: engine.",[33,130,131],{"class":83},"getAssets",[33,133,134],{"class":43},"() },\n",[33,136,138,141],{"class":35,"line":137},8,[33,139,140],{"class":43},"  maxFailures: ",[33,142,143],{"class":73},"3\n",[33,145,147],{"class":35,"line":146},9,[33,148,149],{"class":43},"})\n",[33,151,153],{"class":35,"line":152},10,[33,154,64],{"emptyLinePlaceholder":63},[33,156,158,160,163,166,169,171],{"class":35,"line":157},11,[33,159,70],{"class":39},[33,161,162],{"class":73}," plugin",[33,164,165],{"class":39},":",[33,167,168],{"class":83}," PluginDefinition",[33,170,77],{"class":39},[33,172,173],{"class":43}," {\n",[33,175,177],{"class":35,"line":176},12,[33,178,179],{"class":43},"  manifest: {\n",[33,181,183,186,189],{"class":35,"line":182},13,[33,184,185],{"class":43},"    id: ",[33,187,188],{"class":56},"'my-plugin'",[33,190,99],{"class":43},[33,192,194,197,200],{"class":35,"line":193},14,[33,195,196],{"class":43},"    version: ",[33,198,199],{"class":56},"'1.0.0'",[33,201,99],{"class":43},[33,203,205,208,211],{"class":35,"line":204},15,[33,206,207],{"class":43},"    engine: ",[33,209,210],{"class":56},"'>=0.1.0'",[33,212,99],{"class":43},[33,214,216,219,222],{"class":35,"line":215},16,[33,217,218],{"class":43},"    name: ",[33,220,221],{"class":56},"'Mój plugin'",[33,223,99],{"class":43},[33,225,227,230,233,236,239],{"class":35,"line":226},17,[33,228,229],{"class":43},"    permissions: [",[33,231,232],{"class":56},"'systems'",[33,234,235],{"class":43},", ",[33,237,238],{"class":56},"'events'",[33,240,241],{"class":43},"]\n",[33,243,245],{"class":35,"line":244},18,[33,246,247],{"class":43},"  },\n",[33,249,251,254,257,261],{"class":35,"line":250},19,[33,252,253],{"class":83},"  activate",[33,255,256],{"class":43},"(",[33,258,260],{"class":259},"s4XuR","context",[33,262,263],{"class":43},") {\n",[33,265,267,270,273],{"class":35,"line":266},20,[33,268,269],{"class":43},"    context.",[33,271,272],{"class":83},"registerSystem",[33,274,87],{"class":43},[33,276,278,281,284],{"class":35,"line":277},21,[33,279,280],{"class":43},"      name: ",[33,282,283],{"class":56},"'spawn'",[33,285,99],{"class":43},[33,287,289,292,294,297],{"class":35,"line":288},22,[33,290,291],{"class":83},"      update",[33,293,256],{"class":43},[33,295,296],{"class":259},"dt",[33,298,263],{"class":43},[33,300,302,305,308,310,313],{"class":35,"line":301},23,[33,303,304],{"class":43},"        context.events.",[33,306,307],{"class":83},"emit",[33,309,256],{"class":43},[33,311,312],{"class":56},"'spawn:tick'",[33,314,315],{"class":43},", { dt })\n",[33,317,319],{"class":35,"line":318},24,[33,320,321],{"class":43},"      }\n",[33,323,325],{"class":35,"line":324},25,[33,326,327],{"class":43},"    })\n",[33,329,331],{"class":35,"line":330},26,[33,332,247],{"class":43},[33,334,336,339],{"class":35,"line":335},27,[33,337,338],{"class":83},"  deactivate",[33,340,341],{"class":43},"() {}\n",[33,343,345],{"class":35,"line":344},28,[33,346,347],{"class":43},"}\n",[33,349,351],{"class":35,"line":350},29,[33,352,64],{"emptyLinePlaceholder":63},[33,354,356,359,362],{"class":35,"line":355},30,[33,357,358],{"class":43},"host.",[33,360,361],{"class":83},"install",[33,363,364],{"class":43},"(plugin)\n",[33,366,368,370,373,375,377],{"class":35,"line":367},31,[33,369,358],{"class":43},[33,371,372],{"class":83},"activate",[33,374,256],{"class":43},[33,376,188],{"class":56},[33,378,379],{"class":43},")\n",[10,381,383],{"id":382},"manifest-i-uprawnienia","Manifest i uprawnienia",[24,385,387],{"className":26,"code":386,"language":28,"meta":29,"style":29},"type PluginManifest = {\n  id: string\n  version: string\n  engine: string\n  name?: string\n  description?: string\n  author?: string\n  dependencies?: string[]\n  permissions?: PluginPermission[]\n}\n\ntype PluginPermission =\n  | 'systems'\n  | 'importers'\n  | 'panels'\n  | 'events'\n  | 'scenes'\n  | 'assets'\n  | 'storage'\n",[19,388,389,400,410,419,428,438,447,456,469,481,485,489,498,506,513,520,527,534,541],{"__ignoreMap":29},[33,390,391,393,396,398],{"class":35,"line":36},[33,392,47],{"class":39},[33,394,395],{"class":83}," PluginManifest",[33,397,77],{"class":39},[33,399,173],{"class":43},[33,401,402,405,407],{"class":35,"line":60},[33,403,404],{"class":259},"  id",[33,406,165],{"class":39},[33,408,409],{"class":73}," string\n",[33,411,412,415,417],{"class":35,"line":67},[33,413,414],{"class":259},"  version",[33,416,165],{"class":39},[33,418,409],{"class":73},[33,420,421,424,426],{"class":35,"line":90},[33,422,423],{"class":259},"  engine",[33,425,165],{"class":39},[33,427,409],{"class":73},[33,429,430,433,436],{"class":35,"line":102},[33,431,432],{"class":259},"  name",[33,434,435],{"class":39},"?:",[33,437,409],{"class":73},[33,439,440,443,445],{"class":35,"line":114},[33,441,442],{"class":259},"  description",[33,444,435],{"class":39},[33,446,409],{"class":73},[33,448,449,452,454],{"class":35,"line":125},[33,450,451],{"class":259},"  author",[33,453,435],{"class":39},[33,455,409],{"class":73},[33,457,458,461,463,466],{"class":35,"line":137},[33,459,460],{"class":259},"  dependencies",[33,462,435],{"class":39},[33,464,465],{"class":73}," string",[33,467,468],{"class":43},"[]\n",[33,470,471,474,476,479],{"class":35,"line":146},[33,472,473],{"class":259},"  permissions",[33,475,435],{"class":39},[33,477,478],{"class":83}," PluginPermission",[33,480,468],{"class":43},[33,482,483],{"class":35,"line":152},[33,484,347],{"class":43},[33,486,487],{"class":35,"line":157},[33,488,64],{"emptyLinePlaceholder":63},[33,490,491,493,495],{"class":35,"line":176},[33,492,47],{"class":39},[33,494,478],{"class":83},[33,496,497],{"class":39}," =\n",[33,499,500,503],{"class":35,"line":182},[33,501,502],{"class":39},"  |",[33,504,505],{"class":56}," 'systems'\n",[33,507,508,510],{"class":35,"line":193},[33,509,502],{"class":39},[33,511,512],{"class":56}," 'importers'\n",[33,514,515,517],{"class":35,"line":204},[33,516,502],{"class":39},[33,518,519],{"class":56}," 'panels'\n",[33,521,522,524],{"class":35,"line":215},[33,523,502],{"class":39},[33,525,526],{"class":56}," 'events'\n",[33,528,529,531],{"class":35,"line":226},[33,530,502],{"class":39},[33,532,533],{"class":56}," 'scenes'\n",[33,535,536,538],{"class":35,"line":244},[33,537,502],{"class":39},[33,539,540],{"class":56}," 'assets'\n",[33,542,543,545],{"class":35,"line":250},[33,544,502],{"class":39},[33,546,547],{"class":56}," 'storage'\n",[549,550,553],"callout",{"title":551,"type":552},"Manifest to nie piaskownica","danger",[15,554,555,556,560],{},"Uprawnienia ograniczają ",[557,558,559],"strong",{},"API kontekstu",", ale kod pluginu działa w tym samym realmie co gra. Manifest jest bramką API, nie sandboxem — instaluj tylko pluginy z zaufanych źródeł.",[10,562,564],{"id":563},"api-hosta","API hosta",[24,566,568],{"className":26,"code":567,"language":28,"meta":29,"style":29},"install(plugin); activate(id); activateAll(); deactivate(id); uninstall(id); dispose()\nupdate(deltaTime); get(id); has(id); list(); summary()\ngetSystems(); enableSystem(owner, name); getImporters(); getPanels()\n\nparseVersion(input); compareVersions(a, b); isValidRange(range); satisfiesRange(version, range)\n",[19,569,570,604,632,655,659],{"__ignoreMap":29},[33,571,572,574,577,579,582,585,588,591,593,596,598,601],{"class":35,"line":36},[33,573,361],{"class":83},[33,575,576],{"class":43},"(plugin); ",[33,578,372],{"class":83},[33,580,581],{"class":43},"(id); ",[33,583,584],{"class":83},"activateAll",[33,586,587],{"class":43},"(); ",[33,589,590],{"class":83},"deactivate",[33,592,581],{"class":43},[33,594,595],{"class":83},"uninstall",[33,597,581],{"class":43},[33,599,600],{"class":83},"dispose",[33,602,603],{"class":43},"()\n",[33,605,606,609,612,615,617,620,622,625,627,630],{"class":35,"line":60},[33,607,608],{"class":83},"update",[33,610,611],{"class":43},"(deltaTime); ",[33,613,614],{"class":83},"get",[33,616,581],{"class":43},[33,618,619],{"class":83},"has",[33,621,581],{"class":43},[33,623,624],{"class":83},"list",[33,626,587],{"class":43},[33,628,629],{"class":83},"summary",[33,631,603],{"class":43},[33,633,634,637,639,642,645,648,650,653],{"class":35,"line":67},[33,635,636],{"class":83},"getSystems",[33,638,587],{"class":43},[33,640,641],{"class":83},"enableSystem",[33,643,644],{"class":43},"(owner, name); ",[33,646,647],{"class":83},"getImporters",[33,649,587],{"class":43},[33,651,652],{"class":83},"getPanels",[33,654,603],{"class":43},[33,656,657],{"class":35,"line":90},[33,658,64],{"emptyLinePlaceholder":63},[33,660,661,664,667,670,673,676,679,682],{"class":35,"line":102},[33,662,663],{"class":83},"parseVersion",[33,665,666],{"class":43},"(input); ",[33,668,669],{"class":83},"compareVersions",[33,671,672],{"class":43},"(a, b); ",[33,674,675],{"class":83},"isValidRange",[33,677,678],{"class":43},"(range); ",[33,680,681],{"class":83},"satisfiesRange",[33,683,684],{"class":43},"(version, range)\n",[10,686,688],{"id":687},"przepływ-aktywacji","Przepływ aktywacji",[690,691,692,703,717,724,734,741],"ol",{},[693,694,695,698,699,702],"li",{},[19,696,697],{},"install()"," waliduje manifest i unikalność ",[19,700,701],{},"id"," — nic więcej. Katalog może zainstalować cały zestaw przed aktywacją.",[693,704,705,708,709,712,713,716],{},[19,706,707],{},"activate()"," sprawdza zakres ",[19,710,711],{},"engine",", aktywuje zależności (DFS z detekcją cykli), buduje kontekst z capability-gatingiem i woła ",[19,714,715],{},"activate(context)",".",[693,718,719,720,723],{},"Rejestracje trafiają do rejestrów z właścicielem (",[19,721,722],{},"owner = id","), więc dezaktywacja usuwa je jednym przebiegiem.",[693,725,726,729,730,733],{},[19,727,728],{},"adapter.update"," woła ",[19,731,732],{},"plugins.update(deltaTime)"," po scenie.",[693,735,736,737,740],{},"Wyjątek systemu jest liczony; po ",[19,738,739],{},"maxFailures"," system zostaje automatycznie wyłączony.",[693,742,743,746],{},[19,744,745],{},"deactivate()"," idzie od zależnych do zależności: hook pluginu, disposery LIFO, czyszczenie rejestrów.",[10,748,750],{"id":749},"punkty-rozszerzeń","Punkty rozszerzeń",[752,753,754,770],"table",{},[755,756,757],"thead",{},[758,759,760,764,767],"tr",{},[761,762,763],"th",{},"Rejestr",[761,765,766],{},"Co dodaje",[761,768,769],{},"Przykład",[771,772,773,787,804,824],"tbody",{},[758,774,775,781,784],{},[776,777,778],"td",{},[19,779,780],{},"SystemRegistry",[776,782,783],{},"Systemy z kolejnością i budżetem błędów",[776,785,786],{},"Spawn, AI, pogoda",[758,788,789,794,801],{},[776,790,791],{},[19,792,793],{},"ImporterRegistry",[776,795,796,797,800],{},"Importery plików (wbudowany ",[19,798,799],{},"tiled",")",[776,802,803],{},"Własny format map",[758,805,806,811,821],{},[776,807,808],{},[19,809,810],{},"PanelRegistry",[776,812,813,814,817,818,800],{},"Panele edytora (",[19,815,816],{},"mount","\u002F",[19,819,820],{},"unmount",[776,822,823],{},"Inspector, statystyki",[758,825,826,831,834],{},[776,827,828],{},[19,829,830],{},"events",[776,832,833],{},"Zdarzenia w przestrzeni nazw pluginu",[776,835,836],{},[19,837,838],{},"my-plugin:*",[840,841,843],"h3",{"id":842},"przykład-system-pogody","Przykład: system pogody",[24,845,847],{"className":26,"code":846,"language":28,"meta":29,"style":29},"const weatherPlugin: PluginDefinition = {\n  manifest: {\n    id: 'weather',\n    version: '1.0.0',\n    engine: '>=0.1.0',\n    permissions: ['systems', 'events']\n  },\n  activate(context) {\n    let timer = 0\n    context.registerSystem({\n      name: 'weather',\n      update(dt) {\n        timer += dt\n        if (timer > 30) {\n          timer = 0\n          context.events.emit('weather:change', {\n            type: context.random.pick(['rain', 'clear', 'fog'])\n          })\n        }\n      }\n    })\n  }\n}\n",[19,848,849,864,868,877,885,893,905,909,919,933,941,949,959,970,986,995,1010,1037,1042,1047,1051,1055,1060],{"__ignoreMap":29},[33,850,851,853,856,858,860,862],{"class":35,"line":36},[33,852,70],{"class":39},[33,854,855],{"class":73}," weatherPlugin",[33,857,165],{"class":39},[33,859,168],{"class":83},[33,861,77],{"class":39},[33,863,173],{"class":43},[33,865,866],{"class":35,"line":60},[33,867,179],{"class":43},[33,869,870,872,875],{"class":35,"line":67},[33,871,185],{"class":43},[33,873,874],{"class":56},"'weather'",[33,876,99],{"class":43},[33,878,879,881,883],{"class":35,"line":90},[33,880,196],{"class":43},[33,882,199],{"class":56},[33,884,99],{"class":43},[33,886,887,889,891],{"class":35,"line":102},[33,888,207],{"class":43},[33,890,210],{"class":56},[33,892,99],{"class":43},[33,894,895,897,899,901,903],{"class":35,"line":114},[33,896,229],{"class":43},[33,898,232],{"class":56},[33,900,235],{"class":43},[33,902,238],{"class":56},[33,904,241],{"class":43},[33,906,907],{"class":35,"line":125},[33,908,247],{"class":43},[33,910,911,913,915,917],{"class":35,"line":137},[33,912,253],{"class":83},[33,914,256],{"class":43},[33,916,260],{"class":259},[33,918,263],{"class":43},[33,920,921,924,927,930],{"class":35,"line":146},[33,922,923],{"class":39},"    let",[33,925,926],{"class":43}," timer ",[33,928,929],{"class":39},"=",[33,931,932],{"class":73}," 0\n",[33,934,935,937,939],{"class":35,"line":152},[33,936,269],{"class":43},[33,938,272],{"class":83},[33,940,87],{"class":43},[33,942,943,945,947],{"class":35,"line":157},[33,944,280],{"class":43},[33,946,874],{"class":56},[33,948,99],{"class":43},[33,950,951,953,955,957],{"class":35,"line":176},[33,952,291],{"class":83},[33,954,256],{"class":43},[33,956,296],{"class":259},[33,958,263],{"class":43},[33,960,961,964,967],{"class":35,"line":182},[33,962,963],{"class":43},"        timer ",[33,965,966],{"class":39},"+=",[33,968,969],{"class":43}," dt\n",[33,971,972,975,978,981,984],{"class":35,"line":193},[33,973,974],{"class":39},"        if",[33,976,977],{"class":43}," (timer ",[33,979,980],{"class":39},">",[33,982,983],{"class":73}," 30",[33,985,263],{"class":43},[33,987,988,991,993],{"class":35,"line":204},[33,989,990],{"class":43},"          timer ",[33,992,929],{"class":39},[33,994,932],{"class":73},[33,996,997,1000,1002,1004,1007],{"class":35,"line":215},[33,998,999],{"class":43},"          context.events.",[33,1001,307],{"class":83},[33,1003,256],{"class":43},[33,1005,1006],{"class":56},"'weather:change'",[33,1008,1009],{"class":43},", {\n",[33,1011,1012,1015,1018,1021,1024,1026,1029,1031,1034],{"class":35,"line":226},[33,1013,1014],{"class":43},"            type: context.random.",[33,1016,1017],{"class":83},"pick",[33,1019,1020],{"class":43},"([",[33,1022,1023],{"class":56},"'rain'",[33,1025,235],{"class":43},[33,1027,1028],{"class":56},"'clear'",[33,1030,235],{"class":43},[33,1032,1033],{"class":56},"'fog'",[33,1035,1036],{"class":43},"])\n",[33,1038,1039],{"class":35,"line":244},[33,1040,1041],{"class":43},"          })\n",[33,1043,1044],{"class":35,"line":250},[33,1045,1046],{"class":43},"        }\n",[33,1048,1049],{"class":35,"line":266},[33,1050,321],{"class":43},[33,1052,1053],{"class":35,"line":277},[33,1054,327],{"class":43},[33,1056,1057],{"class":35,"line":288},[33,1058,1059],{"class":43},"  }\n",[33,1061,1062],{"class":35,"line":301},[33,1063,347],{"class":43},[10,1065,1067],{"id":1066},"diagnostyka-pluginów","Diagnostyka pluginów",[15,1069,1070,1071,1074],{},"Raport diagnostyczny silnika zawiera sekcję ",[19,1072,1073],{},"plugins"," z licznikami i audytem uprawnień:",[24,1076,1078],{"className":26,"code":1077,"language":28,"meta":29,"style":29},"const report = engine.getDiagnosticsReport()\nconsole.log(report.plugins)\nconsole.log(host.summary())\n",[19,1079,1080,1097,1108],{"__ignoreMap":29},[33,1081,1082,1084,1087,1089,1092,1095],{"class":35,"line":36},[33,1083,70],{"class":39},[33,1085,1086],{"class":73}," report",[33,1088,77],{"class":39},[33,1090,1091],{"class":43}," engine.",[33,1093,1094],{"class":83},"getDiagnosticsReport",[33,1096,603],{"class":43},[33,1098,1099,1102,1105],{"class":35,"line":60},[33,1100,1101],{"class":43},"console.",[33,1103,1104],{"class":83},"log",[33,1106,1107],{"class":43},"(report.plugins)\n",[33,1109,1110,1112,1114,1117,1119],{"class":35,"line":67},[33,1111,1101],{"class":43},[33,1113,1104],{"class":83},[33,1115,1116],{"class":43},"(host.",[33,1118,629],{"class":83},[33,1120,1121],{"class":43},"())\n",[10,1123,1125],{"id":1124},"wersje","Wersje",[24,1127,1129],{"className":26,"code":1128,"language":28,"meta":29,"style":29},"import { satisfiesRange } from '@engine'\n\nsatisfiesRange('0.1.0', '>=0.1.0')\nsatisfiesRange('0.2.0', '^0.1.0')\n",[19,1130,1131,1142,1146,1160],{"__ignoreMap":29},[33,1132,1133,1135,1138,1140],{"class":35,"line":36},[33,1134,40],{"class":39},[33,1136,1137],{"class":43}," { satisfiesRange } ",[33,1139,53],{"class":39},[33,1141,57],{"class":56},[33,1143,1144],{"class":35,"line":60},[33,1145,64],{"emptyLinePlaceholder":63},[33,1147,1148,1150,1152,1154,1156,1158],{"class":35,"line":67},[33,1149,681],{"class":83},[33,1151,256],{"class":43},[33,1153,96],{"class":56},[33,1155,235],{"class":43},[33,1157,210],{"class":56},[33,1159,379],{"class":43},[33,1161,1162,1164,1166,1169,1171,1174],{"class":35,"line":90},[33,1163,681],{"class":83},[33,1165,256],{"class":43},[33,1167,1168],{"class":56},"'0.2.0'",[33,1170,235],{"class":43},[33,1172,1173],{"class":56},"'^0.1.0'",[33,1175,379],{"class":43},[15,1177,1178],{},"Zakresy wersji są walidowane przy aktywacji — plugin niezgodny z silnikiem nie wystartuje.",[1180,1181,1182],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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":29,"searchDepth":67,"depth":67,"links":1184},[1185,1186,1187,1188,1189,1192,1193],{"id":12,"depth":60,"text":13},{"id":382,"depth":60,"text":383},{"id":563,"depth":60,"text":564},{"id":687,"depth":60,"text":688},{"id":749,"depth":60,"text":750,"children":1190},[1191],{"id":842,"depth":67,"text":843},{"id":1066,"depth":60,"text":1067},{"id":1124,"depth":60,"text":1125},"PluginHost, manifest, uprawnienia, punkty rozszerzeń, zależności z detekcją cykli i budżety błędów. Jak pisać pluginy bezpiecznie.","md",{},"\u002Fgame-engine\u002Fadvanced\u002Fplugins",{"title":5,"description":1194},"01.game-engine\u002F08.advanced\u002F01.plugins","QjmXPLw-SwsUPxTmBR5eO56dC6cxyWlL_ZRIiyT6t2A",[1202,1207],{"title":1203,"path":1204,"stem":1205,"description":1206,"children":-1},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves","ProjectRepository z atomowym zapisem, PlayerSaveRepository i sześć backendów SaveStore — od localStorage po SQL.",{"title":1208,"path":1209,"stem":1210,"description":1211,"children":-1},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm","Opcjonalny most TS↔WASM dla ciężkiego compute. Instalacja Emscripten, kompilacja C++23, zasady granicy i graceful fallback.",[1213,1324,1385],{"title":1214,"path":1215,"stem":1216,"children":1217},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1218,1220,1224,1228,1232,1258,1287,1297,1312,1316,1320],{"title":1219,"path":1215,"stem":1216},"Przegląd",{"title":1221,"path":1222,"stem":1223},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1225,"path":1226,"stem":1227},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1229,"path":1230,"stem":1231},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1233,"path":1234,"stem":1235,"children":1236,"page":1257},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1237,1241,1245,1249,1253],{"title":1238,"path":1239,"stem":1240},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1242,"path":1243,"stem":1244},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1246,"path":1247,"stem":1248},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":1250,"path":1251,"stem":1252},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":1254,"path":1255,"stem":1256},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":1259,"path":1260,"stem":1261,"children":1262,"page":1257},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1263,1267,1271,1275,1279,1283],{"title":1264,"path":1265,"stem":1266},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":1268,"path":1269,"stem":1270},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":1272,"path":1273,"stem":1274},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":1276,"path":1277,"stem":1278},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":1280,"path":1281,"stem":1282},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":1284,"path":1285,"stem":1286},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":1288,"path":1289,"stem":1290,"children":1291,"page":1257},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1292,1296],{"title":1293,"path":1294,"stem":1295},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1203,"path":1204,"stem":1205},{"title":1298,"path":1299,"stem":1300,"children":1301,"page":1257},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1302,1303,1304,1308],{"title":5,"path":1197,"stem":1199},{"title":1208,"path":1209,"stem":1210},{"title":1305,"path":1306,"stem":1307},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1309,"path":1310,"stem":1311},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1313,"path":1314,"stem":1315},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1317,"path":1318,"stem":1319},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1321,"path":1322,"stem":1323},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1325,"path":1326,"stem":1327,"children":1328},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1329,1330,1333,1336,1357],{"title":1219,"path":1326,"stem":1327},{"title":1221,"path":1331,"stem":1332},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1225,"path":1334,"stem":1335},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1337,"path":1338,"stem":1339,"children":1340,"page":1257},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1341,1345,1349,1353],{"title":1342,"path":1343,"stem":1344},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1346,"path":1347,"stem":1348},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1350,"path":1351,"stem":1352},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1354,"path":1355,"stem":1356},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1358,"path":1359,"stem":1360,"children":1361,"page":1257},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1362,1366,1370,1374,1377,1381],{"title":1363,"path":1364,"stem":1365},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1367,"path":1368,"stem":1369},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1371,"path":1372,"stem":1373},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1313,"path":1375,"stem":1376},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1378,"path":1379,"stem":1380},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1382,"path":1383,"stem":1384},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1386,"path":1387,"stem":1388,"children":1389},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1390,1391,1394,1415,1428,1448],{"title":1219,"path":1387,"stem":1388},{"title":1221,"path":1392,"stem":1393},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1395,"path":1396,"stem":1397,"children":1398,"page":1257},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1399,1403,1407,1411],{"title":1400,"path":1401,"stem":1402},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1404,"path":1405,"stem":1406},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1408,"path":1409,"stem":1410},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1412,"path":1413,"stem":1414},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1416,"path":1417,"stem":1418,"children":1419,"page":1257},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1420,1424],{"title":1421,"path":1422,"stem":1423},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1425,"path":1426,"stem":1427},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1429,"path":1430,"stem":1431,"children":1432,"page":1257},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1433,1436,1440,1444],{"title":1229,"path":1434,"stem":1435},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1437,"path":1438,"stem":1439},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1441,"path":1442,"stem":1443},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1445,"path":1446,"stem":1447},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1449,"path":1450,"stem":1451},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307763]