script engine work
This commit is contained in:
parent
cae96992c0
commit
f73f110aa8
@ -1,6 +1,7 @@
|
|||||||
import { clientUIButtonHook } from "/Scripts/client/uihooks";
|
import { clientUIButtonHook } from "/Scripts/client/uihooks";
|
||||||
import { Engine } from "/Scripts/types/engine";
|
import { Engine } from "/Scripts/types/engine";
|
||||||
import { Hook } from "/Scripts/types/hook";
|
import { Hook } from "/Scripts/types/hook";
|
||||||
|
import { AreaSelection } from "/Scripts/types/host/client/client-area-utils";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The client-wide hooks
|
* The client-wide hooks
|
||||||
@ -69,7 +70,12 @@ export const clientHooks: Hook[] = [
|
|||||||
case 'SelectFurniture': {
|
case 'SelectFurniture': {
|
||||||
} break;
|
} break;
|
||||||
case 'SelectRoom': {
|
case 'SelectRoom': {
|
||||||
engine.classes.areaUtils.static.selectAreaRectangular()
|
const areaSelection: AreaSelection = engine.classes.areaUtils.static.selectAreaRectangular()
|
||||||
|
console.log(JSON.stringify(areaSelection))
|
||||||
|
console.log(areaSelection.getType())
|
||||||
|
console.log(JSON.stringify(areaSelection.getType()))
|
||||||
|
console.log(areaSelection.getRectStart())
|
||||||
|
console.log(JSON.stringify(areaSelection.getRectStart()))
|
||||||
} break;
|
} break;
|
||||||
case 'ShowFurniture': {
|
case 'ShowFurniture': {
|
||||||
} break;
|
} break;
|
||||||
|
|||||||
@ -1,3 +1,20 @@
|
|||||||
|
import { Vector } from "/Scripts/types/spatial";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An area selection
|
||||||
|
*/
|
||||||
|
export interface AreaSelection {
|
||||||
|
getType: () => string,
|
||||||
|
/**
|
||||||
|
* Gets the start rectangle of the area
|
||||||
|
*/
|
||||||
|
getRectStart: () => Vector,
|
||||||
|
/**
|
||||||
|
* Gets the end rectangle of the area
|
||||||
|
*/
|
||||||
|
getRectEnd: () => Vector,
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for managing areas on the client
|
* Utilities for managing areas on the client
|
||||||
*/
|
*/
|
||||||
@ -6,6 +23,6 @@ export interface ClientAreaUtils {
|
|||||||
/**
|
/**
|
||||||
* Selects a rectangular area
|
* Selects a rectangular area
|
||||||
*/
|
*/
|
||||||
readonly selectAreaRectangular: () => void
|
readonly selectAreaRectangular: () => AreaSelection
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,3 +1,3 @@
|
|||||||
#maven.buildNumber.plugin properties file
|
#maven.buildNumber.plugin properties file
|
||||||
#Thu May 15 17:55:57 EDT 2025
|
#Fri May 16 13:50:39 EDT 2025
|
||||||
buildNumber=624
|
buildNumber=625
|
||||||
|
|||||||
@ -1847,6 +1847,7 @@ Script recompilation work
|
|||||||
HTML-defined buttons now directly eval in the js context instead of going through hook manager
|
HTML-defined buttons now directly eval in the js context instead of going through hook manager
|
||||||
Fix caching with deleted source files
|
Fix caching with deleted source files
|
||||||
Proof of concept of ui button calling engine code
|
Proof of concept of ui button calling engine code
|
||||||
|
Script engine direct access to joml vectors
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@ -13,7 +13,7 @@
|
|||||||
<joml.version>1.9.19</joml.version>
|
<joml.version>1.9.19</joml.version>
|
||||||
<recast.version>1.5.7</recast.version>
|
<recast.version>1.5.7</recast.version>
|
||||||
<imgui.version>1.86.11</imgui.version>
|
<imgui.version>1.86.11</imgui.version>
|
||||||
<graalvm.version>23.1.3</graalvm.version>
|
<graalvm.version>24.2.1</graalvm.version>
|
||||||
<junit.version>5.10.3</junit.version>
|
<junit.version>5.10.3</junit.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package electrosphere.client.interact.select;
|
package electrosphere.client.interact.select;
|
||||||
|
|
||||||
|
import org.graalvm.polyglot.HostAccess.Export;
|
||||||
import org.joml.Vector3d;
|
import org.joml.Vector3d;
|
||||||
import org.joml.Vector3i;
|
import org.joml.Vector3i;
|
||||||
|
|
||||||
@ -354,6 +355,7 @@ public class AreaSelection {
|
|||||||
* Gets the start point of the rectangular selection
|
* Gets the start point of the rectangular selection
|
||||||
* @return The start point
|
* @return The start point
|
||||||
*/
|
*/
|
||||||
|
@Export
|
||||||
public Vector3d getRectStart() {
|
public Vector3d getRectStart() {
|
||||||
return rectStart;
|
return rectStart;
|
||||||
}
|
}
|
||||||
@ -362,9 +364,9 @@ public class AreaSelection {
|
|||||||
* Gets the end point of the rectangular selection
|
* Gets the end point of the rectangular selection
|
||||||
* @return The end point
|
* @return The end point
|
||||||
*/
|
*/
|
||||||
|
@Export
|
||||||
public Vector3d getRectEnd() {
|
public Vector3d getRectEnd() {
|
||||||
return rectEnd;
|
return rectEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ public class ScriptClientAreaUtils {
|
|||||||
* Tries to select a rectangular area
|
* Tries to select a rectangular area
|
||||||
*/
|
*/
|
||||||
@Export
|
@Export
|
||||||
public static void selectAreaRectangular(){
|
public static AreaSelection selectAreaRectangular(){
|
||||||
// Vector3d blockCursorPos = Globals.cursorState.getBlockCursorPos();
|
// Vector3d blockCursorPos = Globals.cursorState.getBlockCursorPos();
|
||||||
Vector3d cursorPos = new Vector3d(EntityUtils.getPosition(Globals.cursorState.playerCursor));
|
Vector3d cursorPos = new Vector3d(EntityUtils.getPosition(Globals.cursorState.playerCursor));
|
||||||
Vector3i chunkPos = Globals.clientState.clientWorldData.convertRealToWorldSpace(cursorPos);
|
Vector3i chunkPos = Globals.clientState.clientWorldData.convertRealToWorldSpace(cursorPos);
|
||||||
@ -27,6 +27,7 @@ public class ScriptClientAreaUtils {
|
|||||||
AreaSelection selection = AreaSelection.selectRectangularBlockCavity(chunkPos, blockPos, AreaSelection.DEFAULT_SELECTION_RADIUS);
|
AreaSelection selection = AreaSelection.selectRectangularBlockCavity(chunkPos, blockPos, AreaSelection.DEFAULT_SELECTION_RADIUS);
|
||||||
Globals.cursorState.selectRectangularArea(selection);
|
Globals.cursorState.selectRectangularArea(selection);
|
||||||
CursorState.makeAreaVisible();
|
CursorState.makeAreaVisible();
|
||||||
|
return selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,6 @@ import electrosphere.net.synchronization.annotation.SynchronizedBehaviorTree;
|
|||||||
import electrosphere.net.synchronization.enums.BehaviorTreeIdEnums;
|
import electrosphere.net.synchronization.enums.BehaviorTreeIdEnums;
|
||||||
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
||||||
import electrosphere.renderer.anim.Animation;
|
import electrosphere.renderer.anim.Animation;
|
||||||
import electrosphere.script.utils.AccessTransforms;
|
|
||||||
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
||||||
import electrosphere.server.utils.ServerScriptUtils;
|
import electrosphere.server.utils.ServerScriptUtils;
|
||||||
import electrosphere.util.math.SpatialMathUtils;
|
import electrosphere.util.math.SpatialMathUtils;
|
||||||
@ -306,7 +305,7 @@ public class ServerEditorMovementTree implements BehaviorTree {
|
|||||||
);
|
);
|
||||||
|
|
||||||
//tell script engine we moved
|
//tell script engine we moved
|
||||||
ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", AccessTransforms.getVector(position));
|
ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", position);
|
||||||
} break;
|
} break;
|
||||||
case SLOWDOWN: {
|
case SLOWDOWN: {
|
||||||
CreatureUtils.setFacingVector(parent, facingVector);
|
CreatureUtils.setFacingVector(parent, facingVector);
|
||||||
|
|||||||
@ -30,7 +30,6 @@ import electrosphere.net.synchronization.annotation.SynchronizedBehaviorTree;
|
|||||||
import electrosphere.net.synchronization.enums.BehaviorTreeIdEnums;
|
import electrosphere.net.synchronization.enums.BehaviorTreeIdEnums;
|
||||||
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
||||||
import electrosphere.renderer.anim.Animation;
|
import electrosphere.renderer.anim.Animation;
|
||||||
import electrosphere.script.utils.AccessTransforms;
|
|
||||||
import electrosphere.server.ai.AI;
|
import electrosphere.server.ai.AI;
|
||||||
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
||||||
import electrosphere.server.utils.ServerScriptUtils;
|
import electrosphere.server.utils.ServerScriptUtils;
|
||||||
@ -359,7 +358,7 @@ public class ServerGroundMovementTree implements BehaviorTree {
|
|||||||
);
|
);
|
||||||
|
|
||||||
//tell script engine we moved
|
//tell script engine we moved
|
||||||
ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", AccessTransforms.getVector(position));
|
ServerScriptUtils.fireSignalOnEntity(parent, "entityGroundMove", position);
|
||||||
} break;
|
} break;
|
||||||
case SLOWDOWN: {
|
case SLOWDOWN: {
|
||||||
CreatureUtils.setFacingVector(parent, facingVector);
|
CreatureUtils.setFacingVector(parent, facingVector);
|
||||||
|
|||||||
@ -3,6 +3,8 @@ package electrosphere.script;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.ProcessBuilder.Redirect;
|
import java.lang.ProcessBuilder.Redirect;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.attribute.FileTime;
|
import java.nio.file.attribute.FileTime;
|
||||||
@ -19,6 +21,7 @@ import org.graalvm.polyglot.Value;
|
|||||||
|
|
||||||
import electrosphere.engine.Globals;
|
import electrosphere.engine.Globals;
|
||||||
import electrosphere.logger.LoggerInterface;
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
import electrosphere.script.access.FieldEnumerator;
|
||||||
import electrosphere.util.FileUtils;
|
import electrosphere.util.FileUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,9 +99,15 @@ public class ScriptContext {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
//Create the rules for guest accessing the host environment
|
//Create the rules for guest accessing the host environment
|
||||||
HostAccess accessRules = HostAccess.newBuilder(HostAccess.EXPLICIT)
|
HostAccess.Builder builder = HostAccess.newBuilder(HostAccess.EXPLICIT);
|
||||||
.allowArrayAccess(true)
|
builder.allowArrayAccess(true);
|
||||||
.build();
|
for(Field field : FieldEnumerator.getFields()){
|
||||||
|
builder.allowAccess(field);
|
||||||
|
}
|
||||||
|
for(Method method : FieldEnumerator.getMethods()){
|
||||||
|
builder.allowAccess(method);
|
||||||
|
}
|
||||||
|
HostAccess accessRules = builder.build();
|
||||||
|
|
||||||
//create context
|
//create context
|
||||||
context = Context.newBuilder("js")
|
context = Context.newBuilder("js")
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
package electrosphere.script.access;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.joml.Vector3d;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerates the fields to allow access to
|
||||||
|
*/
|
||||||
|
public class FieldEnumerator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the list of fields to allow to script context
|
||||||
|
* @return The list of fields
|
||||||
|
*/
|
||||||
|
public static List<Field> getFields(){
|
||||||
|
List<Field> rVal = new LinkedList<Field>();
|
||||||
|
try {
|
||||||
|
rVal.add(Vector3d.class.getField("x"));
|
||||||
|
rVal.add(Vector3d.class.getField("y"));
|
||||||
|
rVal.add(Vector3d.class.getField("z"));
|
||||||
|
} catch (NoSuchFieldException | SecurityException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the list of methods to allow to script context
|
||||||
|
* @return The list of methods
|
||||||
|
*/
|
||||||
|
public static List<Method> getMethods(){
|
||||||
|
List<Method> rVal = new LinkedList<Method>();
|
||||||
|
try {
|
||||||
|
rVal.add(Vector3d.class.getMethod("x"));
|
||||||
|
rVal.add(Vector3d.class.getMethod("y"));
|
||||||
|
rVal.add(Vector3d.class.getMethod("z"));
|
||||||
|
} catch (NoSuchMethodException | SecurityException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,31 +0,0 @@
|
|||||||
package electrosphere.script.access;
|
|
||||||
|
|
||||||
import org.graalvm.polyglot.HostAccess.Export;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A script's view of a 3d vector
|
|
||||||
*/
|
|
||||||
public class Vector {
|
|
||||||
|
|
||||||
@Export
|
|
||||||
public double x;
|
|
||||||
|
|
||||||
@Export
|
|
||||||
public double y;
|
|
||||||
|
|
||||||
@Export
|
|
||||||
public double z;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a vector
|
|
||||||
* @param x the x coordinate
|
|
||||||
* @param y the y coordinate
|
|
||||||
* @param z the z coordinate
|
|
||||||
*/
|
|
||||||
public Vector(double x, double y, double z){
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.z = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,11 +1,11 @@
|
|||||||
package electrosphere.script.translation;
|
package electrosphere.script.translation;
|
||||||
|
|
||||||
|
import org.joml.Vector3d;
|
||||||
|
|
||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
import electrosphere.entity.EntityUtils;
|
import electrosphere.entity.EntityUtils;
|
||||||
import electrosphere.entity.ServerEntityUtils;
|
import electrosphere.entity.ServerEntityUtils;
|
||||||
import electrosphere.entity.types.creature.CreatureUtils;
|
import electrosphere.entity.types.creature.CreatureUtils;
|
||||||
import electrosphere.script.access.Vector;
|
|
||||||
import electrosphere.script.utils.AccessTransforms;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server utilities provided to the js context
|
* Server utilities provided to the js context
|
||||||
@ -16,9 +16,9 @@ public class JSServerUtils {
|
|||||||
* Spawns a creature
|
* Spawns a creature
|
||||||
* @param creatureType The creature
|
* @param creatureType The creature
|
||||||
*/
|
*/
|
||||||
public static void spawnCreature(int sceneInstanceId, String creatureType, Vector position){
|
public static void spawnCreature(int sceneInstanceId, String creatureType, Vector3d position){
|
||||||
//TODO: find realm from scene id
|
//TODO: find realm from scene id
|
||||||
CreatureUtils.serverSpawnBasicCreature(null, AccessTransforms.getVector(position), creatureType, null);
|
CreatureUtils.serverSpawnBasicCreature(null, position, creatureType, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,8 +26,8 @@ public class JSServerUtils {
|
|||||||
* @param entity The entity
|
* @param entity The entity
|
||||||
* @return The position of the entity
|
* @return The position of the entity
|
||||||
*/
|
*/
|
||||||
public static Vector getPosition(Entity entity){
|
public static Vector3d getPosition(Entity entity){
|
||||||
return AccessTransforms.getVector(EntityUtils.getPosition(entity));
|
return EntityUtils.getPosition(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,8 +35,8 @@ public class JSServerUtils {
|
|||||||
* @param entity The entity
|
* @param entity The entity
|
||||||
* @param vector THe new position of the entity
|
* @param vector THe new position of the entity
|
||||||
*/
|
*/
|
||||||
public static void setPosition(Entity entity, Vector vector){
|
public static void setPosition(Entity entity, Vector3d vector){
|
||||||
ServerEntityUtils.repositionEntity(entity, AccessTransforms.getVector(vector));
|
ServerEntityUtils.repositionEntity(entity, vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
package electrosphere.script.utils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used for transforming datastructures to and from the script-access forms
|
|
||||||
* ie, converting a "Vector3d" into a "Vector" and vice versa
|
|
||||||
*/
|
|
||||||
public class AccessTransforms {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts a JOML vector to an access vector
|
|
||||||
* @param source The JOML vector
|
|
||||||
* @return The access vector
|
|
||||||
*/
|
|
||||||
public static electrosphere.script.access.Vector getVector(org.joml.Vector3d source){
|
|
||||||
return new electrosphere.script.access.Vector(source.x, source.y, source.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an access vector into a JOML vector
|
|
||||||
* @param source The access vectpr
|
|
||||||
* @return The JOML vector
|
|
||||||
*/
|
|
||||||
public static org.joml.Vector3d getVector(electrosphere.script.access.Vector source){
|
|
||||||
return new org.joml.Vector3d(source.x,source.y,source.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user