/// /// class Feature { constructor() { this.FeatureManager = undefined this.events = {} this.customEvents = {} this.forgeEvents = {} this.soopyEvents = {} this.dynamicEvents = new Set() this.id = undefined this.enabled = false } setId(id) { this.id = id } getId() { return this.id } _onDisable() { Object.values(this.events).forEach(e => this.FeatureManager.unregisterEvent(e)) //calling parent unregister to avoid the set in unregister event Object.values(this.customEvents).forEach(e => this.FeatureManager.unregisterCustom(e)) //calling parent unregister to avoid the set in unregister event Object.values(this.forgeEvents).forEach(e => this.FeatureManager.unregisterForge(e)) //calling parent unregister to avoid the set in unregister event Object.values(this.soopyEvents).forEach(e => this.FeatureManager.unregisterSoopy(e)) //calling parent unregister to avoid the set in unregister event this.onDisable() this.events = {} this.customEvents = {} this.enabled = false this.stepEvent.unregister() } _onEnable(parent) { this.FeatureManager = parent this.enabled = true this.stepEvent = this.registerStep(false, 5, () => { this.dynamicEvents.forEach(e => e.update()) }) this.onEnable() } onDisable() { } onEnable() { } registerEvent(event, func) { let theEvent = this.FeatureManager.registerEvent(event, func, this) this.events[theEvent.id] = theEvent return new CtEvent(theEvent, undefined, [event, func], this) } unregisterEvent(event) { this.FeatureManager.unregisterEvent(event) delete this.events[event.id] } registerSoopy(event, func) { let theEvent = this.FeatureManager.registerSoopy(event, func, this) this.soopyEvents[theEvent.id] = theEvent return new SoopyEvent(theEvent, undefined, [event, func], this) } unregisterSoopy(event) { this.FeatureManager.unregisterSoopy(event) delete this.soopyEvents[event.id] } registerForge(event, func, messageIfError) { let theEvent try { theEvent = this.FeatureManager.registerForge(event, func, this) } catch (e) { //TODO: option to disable this chat message + fallback register for some that support (eg fallback of RenderWorldLastEvent to ct 'renderWorld') if (!messageIfError) messageIfError = "An error occured while registering the event " + event.class.toString().split(".").pop() + ", this may cause " + this.constructor.name + " to not work properly." ChatLib.chat(this.FeatureManager.messagePrefix + messageIfError) } if (theEvent) this.forgeEvents[theEvent.id] = theEvent return new ForgeEvent(theEvent, theEvent.trigger, [event, func, messageIfError], this) } unregisterForge(event) { if (!event) return this.FeatureManager.unregisterForge(event) delete this.forgeEvents[event.id] } registerChat(criteria, func) { let theEvent = this.FeatureManager.registerChat(criteria, func, this) this.customEvents[theEvent.id] = theEvent return new CustomEvent(theEvent, theEvent.trigger, [criteria, func], this) } registerActionBar(criteria, func) { let theEvent = this.FeatureManager.registerActionBar(criteria, func, this) this.customEvents[theEvent.id] = theEvent return new CustomEvent(theEvent, theEvent.trigger, [criteria, func], this) } registerStep(isFps, interval, func) { let theEvent = this.FeatureManager.registerStep(isFps, interval, func, this) this.customEvents[theEvent.id] = theEvent return new CustomEvent(theEvent, theEvent.trigger, [isFps, interval, func], this) } registerCustom(event, func) { let theEvent = this.FeatureManager.registerCustom(event, func, this) this.customEvents[theEvent.id] = theEvent return new CustomEvent(theEvent, theEvent.trigger, [event, func], this) } registerCommand(name, func) { this.FeatureManager.commandFuncs[name] = func this.FeatureManager.registerCommand(name, (...args) => { if (this.FeatureManager.commandFuncs[name]) { this.FeatureManager.commandFuncs[name].call(this, ...(args || [])) } else { ChatLib.chat(this.FeatureManager.messagePrefix + "This command is not available atm") } }, this) return new CommandEvent(name, undefined, [name, func], this) } unregisterCommand(name) { delete this.FeatureManager.commandFuncs[name] } unregisterCustom(event) { this.FeatureManager.unregisterCustom(event) delete this.customEvents[event.id] } createCustomEvent(eventId) { return this.FeatureManager.createCustomEvent(eventId) } } export default Feature class Event { constructor(data, trigger, registerArgs = [], parent) { this.data = data this.trigger = trigger this.registerArgs = registerArgs this.parent = parent this.enabled = true this.when = undefined } update() { let shouldBeEnabled = !!this.when() if (this.enabled === shouldBeEnabled) return if (this.enabled) { this.unregister() } else { this.register() } } /** * Runs the function given as the argument every 5seconds * And will make sure that the event is only registered when the condition is true */ registeredWhen(fun) { this.when = fun if (!fun()) { this.unregister() } this.parent.dynamicEvents.add(this) return this } register() { if (this.enabled) return this.enabled = true this.actuallyRegister() } unregister() { if (!this.enabled) return this.enabled = false this.actuallyUnregister() } actuallyRegister() { } actuallyUnregister() { } } class CtEvent extends Event { actuallyRegister() { let newEvent = this.parent.registerEvent(...this.registerArgs) this.data = newEvent.data this.trigger = newEvent.trigger } actuallyUnregister() { this.parent.unregisterEvent(this.data) } } class SoopyEvent extends Event { actuallyRegister() { let newEvent = this.parent.registerSoopy(...this.registerArgs) this.data = newEvent.data this.trigger = newEvent.trigger } actuallyUnregister() { this.parent.unregisterSoopy(this.data) } } class CommandEvent extends Event { actuallyRegister() { let newEvent = this.parent.registerCommand(...this.registerArgs) this.data = newEvent.data this.trigger = newEvent.trigger } actuallyUnregister() { this.parent.unregisterCommand(this.data) } } class ForgeEvent extends Event { actuallyRegister() { let newEvent = this.parent.registerForge(...this.registerArgs) this.data = newEvent.data this.trigger = newEvent.trigger } actuallyUnregister() { this.parent.unregisterForge(this.data) } } class CustomEvent extends Event { actuallyRegister() { let newEvent = this.trigger.register() this.data = newEvent.data this.trigger = newEvent.trigger } actuallyUnregister() { this.trigger.unregister() } }