@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2 kB
JavaScript
import{EventHandler as t}from"../../core/event-handler.js";class s extends t{constructor(t){super(),this._scripts={},this._list=[],this._scriptSchemas=new Map,this.app=t}destroy(){this.app=null,this.off()}addSchema(t,s){s&&this._scriptSchemas.set(t,s)}getSchema(t){return this._scriptSchemas.get(t)}add(t){const s=t.__name;return this._scripts.hasOwnProperty(s)?(setTimeout((()=>{if(t.prototype.swap){const i=this._scripts[s],e=this._list.indexOf(i);this._list[e]=t,this._scripts[s]=t,this.fire("swap",s,t),this.fire(`swap:${s}`,t)}else console.warn(`script registry already has '${s}' script, define 'swap' method for new script type to enable code hot swapping`)})),!1):(this._scripts[s]=t,this._list.push(t),this.fire("add",s,t),this.fire(`add:${s}`,t),setTimeout((()=>{if(!this._scripts.hasOwnProperty(s))return;if(!this.app||!this.app.systems||!this.app.systems.script)return;const t=this.app.systems.script._components;let i;const e=[],r=[];for(t.loopIndex=0;t.loopIndex<t.length;t.loopIndex++){const r=t.items[t.loopIndex];if(r._scriptsIndex[s]&&r._scriptsIndex[s].awaiting){r._scriptsData&&r._scriptsData[s]&&(i=r._scriptsData[s].attributes);const t=r.create(s,{preloading:!0,ind:r._scriptsIndex[s].ind,attributes:i});t&&e.push(t);for(const t of r.scripts)r.initializeAttributes(t)}}for(let t=0;t<e.length;t++)e[t].enabled&&(e[t]._initialized=!0,r.push(e[t]),e[t].initialize&&e[t].initialize());for(let t=0;t<r.length;t++)r[t].enabled&&!r[t]._postInitialized&&(r[t]._postInitialized=!0,r[t].postInitialize&&r[t].postInitialize())})),!0)}remove(t){let s=t,i=t;if("string"!=typeof i?i=s.__name:s=this.get(i),this.get(i)!==s)return!1;delete this._scripts[i];const e=this._list.indexOf(s);return this._list.splice(e,1),this.fire("remove",i,s),this.fire(`remove:${i}`,s),!0}get(t){return this._scripts[t]||null}has(t){if("string"==typeof t)return this._scripts.hasOwnProperty(t);if(!t)return!1;const s=t.__name;return this._scripts[s]===t}list(){return this._list}}export{s as ScriptRegistry};