UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

88 lines (87 loc) 2.55 kB
import { EventHandler } from "../../core/event-handler.js"; import { AppBase } from "../app-base.js"; import { ScriptAttributes } from "./script-attributes.js"; import { ScriptType } from "./script-type.js"; import { ScriptTypes } from "./script-types.js"; import { Script } from "./script.js"; const reservedScriptNames = /* @__PURE__ */ new Set([ "system", "entity", "create", "destroy", "swap", "move", "data", "scripts", "_scripts", "_scriptsIndex", "_scriptsData", "enabled", "_oldState", "onEnable", "onDisable", "onPostStateChange", "_onSetEnabled", "_checkState", "_onBeforeRemove", "_onInitializeAttributes", "_onInitialize", "_onPostInitialize", "_onUpdate", "_onPostUpdate", "_callbacks", "_callbackActive", "has", "get", "on", "off", "fire", "once", "hasEvent", // 'worker' is reserved to prevent users from overwriting the native Worker constructor "worker" ]); function getReservedScriptNames() { return reservedScriptNames; } function createScript(name, app) { if (reservedScriptNames.has(name)) { throw new Error(`Script name '${name}' is reserved, please rename the script`); } const scriptType = function(args) { EventHandler.prototype.initEventHandler.call(this); ScriptType.prototype.initScriptType.call(this, args); }; scriptType.prototype = Object.create(ScriptType.prototype); scriptType.prototype.constructor = scriptType; scriptType.extend = ScriptType.extend; scriptType.attributes = new ScriptAttributes(scriptType); registerScript(scriptType, name, app); return scriptType; } const reservedAttributes = {}; ScriptAttributes.reservedNames.forEach((value, value2, set) => { reservedAttributes[value] = 1; }); createScript.reservedAttributes = reservedAttributes; function registerScript(script, name, app) { if (typeof script !== "function") { throw new Error(`script class: '${script}' must be a constructor function (i.e. class).`); } if (!(script.prototype instanceof Script)) { throw new Error(`script class: '${ScriptType.__getScriptName(script)}' does not extend pc.Script.`); } name = name || script.__name || ScriptType.__getScriptName(script); if (reservedScriptNames.has(name)) { throw new Error(`script name: '${name}' is reserved, please change script name`); } script.__name = name; const registry = app ? app.scripts : AppBase.getApplication().scripts; registry.add(script); ScriptTypes.push(script); } export { createScript, getReservedScriptNames, registerScript };