items executing hooks on usage
This commit is contained in:
parent
e0e90cdd1e
commit
00176449e1
14
assets/Scripts/client/clienthooks.ts
Normal file
14
assets/Scripts/client/clienthooks.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { Engine } from "/Scripts/types/engine";
|
||||
import { Hook } from "/Scripts/types/hook";
|
||||
|
||||
/**
|
||||
* The client-wide hooks
|
||||
*/
|
||||
export const clientHooks: Hook[] = [
|
||||
{
|
||||
signal: "OPEN_VOXEL",
|
||||
callback: (engine: Engine) => {
|
||||
engine.classes.menuUtils.static.openVoxel()
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -6,6 +6,9 @@ import { Entity } from "/Scripts/types/host/entity/entity"
|
||||
*/
|
||||
export type Item = Entity
|
||||
|
||||
/**
|
||||
* An inventory
|
||||
*/
|
||||
export interface Inventory {
|
||||
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ import { Client, NamespaceClient } from '/Scripts/client/client'
|
||||
import { HookManager } from '/Scripts/engine/hooks/hook-manager'
|
||||
import { SceneLoader } from '/Scripts/engine/scene/scene-loader'
|
||||
import { Engine } from '/Scripts/types/engine'
|
||||
import { clientHooks } from '/Scripts/client/clienthooks'
|
||||
|
||||
/**
|
||||
* The core engine values
|
||||
@ -25,5 +26,10 @@ export const ENGINE_onInit = () => {
|
||||
engine.sceneLoader.engine = engine
|
||||
engine.hookManager.engine = engine
|
||||
|
||||
//load global hooks
|
||||
clientHooks.forEach(hook => {
|
||||
engine.hookManager.registerGlobalHook(hook,false)
|
||||
})
|
||||
|
||||
loggerScripts.INFO('Script Engine Initialized')
|
||||
}
|
||||
|
||||
@ -95,6 +95,28 @@ export class HookManager {
|
||||
scene.signalHookMap[hookSignal] = sceneSignalArray
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a global hook
|
||||
* @param hook The hook
|
||||
*/
|
||||
registerGlobalHook(hook: Hook, isServerScene: boolean){
|
||||
const trackedHook: TrackedHook = {
|
||||
...hook,
|
||||
scope: isServerScene ? HookScope.SCENE_SERVER : HookScope.SCENE_CLIENT,
|
||||
}
|
||||
//add to flat array
|
||||
this.hooks.push(trackedHook)
|
||||
//add to signal array
|
||||
const hookSignal: string = hook.signal
|
||||
const signalArray: Array<TrackedHook> = this.signalHookMap?.[hookSignal] ? this.signalHookMap?.[hookSignal] : []
|
||||
signalArray.push(trackedHook)
|
||||
this.signalHookMap[hookSignal] = signalArray
|
||||
loggerScripts.DEBUG('register signal hook map')
|
||||
loggerScripts.DEBUG(hookSignal)
|
||||
loggerScripts.DEBUG(Object.keys(this.signalHookMap) + '')
|
||||
loggerScripts.DEBUG(this.signalHookMap[hookSignal] + '')
|
||||
}
|
||||
|
||||
/**
|
||||
* Deregisters a hook
|
||||
* @param scene The scene which introduced the hook
|
||||
@ -118,7 +140,8 @@ export class HookManager {
|
||||
const globalHooks: Array<TrackedHook> = this.signalHookMap[signal]
|
||||
if(!!globalHooks){
|
||||
globalHooks.forEach(trackedHook => {
|
||||
trackedHook.callback(...argsRaw)
|
||||
loggerScripts.DEBUG("Called global hook")
|
||||
trackedHook.callback(this.engine, ...argsRaw)
|
||||
})
|
||||
} else {
|
||||
//There isn't a hook registered for this signal at the global level
|
||||
@ -131,7 +154,8 @@ export class HookManager {
|
||||
const sceneHooks: Array<TrackedHook> = scene.signalHookMap[signal]
|
||||
if(!!sceneHooks){
|
||||
sceneHooks.forEach(trackeHook => {
|
||||
trackeHook.callback(...argsRaw)
|
||||
loggerScripts.DEBUG("Called local hook")
|
||||
trackeHook.callback(this.engine, ...argsRaw)
|
||||
})
|
||||
} else {
|
||||
//There isn't a hook registered for this signal at the scene level
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import { Engine } from "/Scripts/types/engine";
|
||||
|
||||
|
||||
/**
|
||||
@ -13,6 +14,6 @@ export interface Hook {
|
||||
/**
|
||||
* The function to call when the signal is fired
|
||||
*/
|
||||
readonly callback: (...value: any) => void,
|
||||
readonly callback: (engine: Engine, ...value: any) => void,
|
||||
|
||||
}
|
||||
|
||||
11
assets/Scripts/types/host/renderer/ui/menus.ts
Normal file
11
assets/Scripts/types/host/renderer/ui/menus.ts
Normal file
@ -0,0 +1,11 @@
|
||||
/**
|
||||
* Utilities for ui menu interactions
|
||||
*/
|
||||
export interface MenuUtils {
|
||||
|
||||
/**
|
||||
* Opens the voxel selection menu
|
||||
*/
|
||||
readonly openVoxel: () => void
|
||||
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
import { Entity } from "/Scripts/types/host/entity/entity";
|
||||
import { MenuUtils } from "/Scripts/types/host/renderer/ui/menus";
|
||||
import { TutorialUtils } from "/Scripts/types/host/renderer/ui/tutorial";
|
||||
import { Vector } from "/Scripts/types/spatial";
|
||||
|
||||
@ -28,6 +29,10 @@ export interface StaticClasses {
|
||||
*/
|
||||
readonly serverUtils?: Class<ServerUtils>,
|
||||
|
||||
/**
|
||||
* Utilities for interacting with menus on client
|
||||
*/
|
||||
readonly menuUtils?: Class<MenuUtils>,
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -857,6 +857,7 @@ Filter toolbar slots out of equip menu
|
||||
Fix attack tree checks
|
||||
Disable client equip tests until can review
|
||||
Toolbar scrolling
|
||||
Items executing script engine hooks on usage
|
||||
|
||||
# TODO
|
||||
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package electrosphere.client.item;
|
||||
|
||||
import electrosphere.client.script.ClientScriptUtils;
|
||||
import electrosphere.client.ui.menu.WindowStrings;
|
||||
import electrosphere.client.ui.menu.WindowUtils;
|
||||
import electrosphere.client.ui.menu.ingame.MenuGeneratorsTerrainEditing;
|
||||
@ -48,6 +49,14 @@ public class ItemActions {
|
||||
if(shooterTree != null){
|
||||
shooterTree.fire();
|
||||
}
|
||||
ClientToolbarState clientToolbarState = ClientToolbarState.getClientToolbarState(Globals.playerEntity);
|
||||
Entity primaryEntity = clientToolbarState.getCurrentPrimaryItem();
|
||||
if(primaryEntity != null && Globals.gameConfigCurrent.getItemMap().getItem(primaryEntity) != null){
|
||||
Item data = Globals.gameConfigCurrent.getItemMap().getItem(primaryEntity);
|
||||
if(data.getClientSidePrimary() != null){
|
||||
ClientScriptUtils.fireSignal(data.getClientSidePrimary());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
package electrosphere.client.script;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.script.ScriptEngine;
|
||||
|
||||
/**
|
||||
* Utilities for dealing with the scripting engine from the client's perspective
|
||||
*/
|
||||
public class ClientScriptUtils {
|
||||
|
||||
/**
|
||||
* Fires a signal
|
||||
* @param signalName The name of the signal
|
||||
* @param args The arguments provided alongside the signal
|
||||
*/
|
||||
public static void fireSignal(String signalName, Object ... args){
|
||||
if(Globals.scriptEngine != null && Globals.scriptEngine.isInitialized()){
|
||||
Globals.scriptEngine.fireSignal(signalName, ScriptEngine.GLOBAL_SCENE, args);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package electrosphere.client.ui.menu.script;
|
||||
|
||||
import org.graalvm.polyglot.HostAccess.Export;
|
||||
|
||||
import electrosphere.client.ui.menu.WindowStrings;
|
||||
import electrosphere.client.ui.menu.WindowUtils;
|
||||
import electrosphere.client.ui.menu.ingame.MenuGeneratorsTerrainEditing;
|
||||
import electrosphere.controls.ControlHandler.ControlsState;
|
||||
import electrosphere.engine.Globals;
|
||||
|
||||
/**
|
||||
* Utilities provided to the scripting interface that allow creating/destroying menus
|
||||
*/
|
||||
public class ScriptMenuUtils {
|
||||
|
||||
/**
|
||||
* Opens the voxel selection menu
|
||||
*/
|
||||
@Export
|
||||
public static void openVoxel(){
|
||||
WindowUtils.replaceWindow(WindowStrings.VOXEL_TYPE_SELECTION,MenuGeneratorsTerrainEditing.createVoxelTypeSelectionPanel());
|
||||
Globals.controlHandler.hintUpdateControlState(ControlsState.IN_GAME_MAIN_MENU);
|
||||
}
|
||||
|
||||
}
|
||||
@ -13,6 +13,7 @@ import org.graalvm.polyglot.Source;
|
||||
import org.graalvm.polyglot.Source.Builder;
|
||||
import org.graalvm.polyglot.Value;
|
||||
|
||||
import electrosphere.client.ui.menu.script.ScriptMenuUtils;
|
||||
import electrosphere.client.ui.menu.tutorial.TutorialMenus;
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.engine.Main;
|
||||
@ -92,6 +93,7 @@ public class ScriptEngine {
|
||||
{"simulation",Main.class},
|
||||
{"tutorialUtils",TutorialMenus.class},
|
||||
{"serverUtils",JSServerUtils.class},
|
||||
{"menuUtils",ScriptMenuUtils.class},
|
||||
};
|
||||
|
||||
//singletons from the host that are provided to the javascript context
|
||||
|
||||
Loading…
Reference in New Issue
Block a user