mirror of
https://github.com/Anime-Game-Servers/AnimeGamesLua.git
synced 2024-11-26 22:00:32 +00:00
Initial commit
This commit is contained in:
commit
5714e799cd
42
.gitignore
vendored
Normal file
42
.gitignore
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
.gradle
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
out/
|
||||
!**/src/main/**/out/
|
||||
!**/src/test/**/out/
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
!**/src/main/**/bin/
|
||||
!**/src/test/**/bin/
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
20
.idea/gradle.xml
generated
Normal file
20
.idea/gradle.xml
generated
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleHome" value="/usr/share/java/gradle" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/BaseLua" />
|
||||
<option value="$PROJECT_DIR$/GILua" />
|
||||
<option value="$PROJECT_DIR$/JNLuaEngine" />
|
||||
<option value="$PROJECT_DIR$/LuaJEngine" />
|
||||
</set>
|
||||
</option>
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="KotlinJpsPluginSettings">
|
||||
<option name="version" value="1.9.10" />
|
||||
</component>
|
||||
</project>
|
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
44
BaseLua/build.gradle.kts
Normal file
44
BaseLua/build.gradle.kts
Normal file
@ -0,0 +1,44 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("java-library")
|
||||
kotlin("jvm") version "1.9.10"
|
||||
}
|
||||
|
||||
group = "org.anime_game_servers"
|
||||
version = "0.1"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("com.esotericsoftware:reflectasm:1.11.9")
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
val compileKotlin: KotlinCompile by tasks
|
||||
compileKotlin.kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
val compileTestKotlin: KotlinCompile by tasks
|
||||
compileTestKotlin.kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
|
||||
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create<MavenPublication>("maven") {
|
||||
from(components["kotlin"])
|
||||
artifactId = "BaseLua"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package org.anime_game_servers.lua.engine;
|
||||
|
||||
import org.anime_game_servers.lua.models.IntValueEnum;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
import org.anime_game_servers.lua.serialize.Serializer;
|
||||
|
||||
public interface LuaEngine {
|
||||
//TODO move to a better place
|
||||
static ScriptFinder scriptFinder = null;
|
||||
|
||||
<T extends Enum<T>> boolean addGlobalEnumByOrdinal(String name, T[] enumArray);
|
||||
|
||||
<T extends Enum<T> & IntValueEnum> boolean addGlobalEnumByIntValue(String name, T[] enumArray);
|
||||
|
||||
boolean addGlobalStaticClass(String name, Class<?> staticClass);
|
||||
|
||||
boolean addObject(String name, Object object);
|
||||
|
||||
Serializer getSerializer();
|
||||
|
||||
LuaScript getScript(String scriptName, ScriptType scriptType);
|
||||
|
||||
LuaTable getTable(Object table);
|
||||
|
||||
LuaTable createTable();
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package org.anime_game_servers.lua.engine;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.script.ScriptException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface LuaScript {
|
||||
boolean hasMethod(@Nonnull String methodName);
|
||||
|
||||
@Nullable
|
||||
LuaValue callMethod(@Nonnull String methodName, Object... args) throws ScriptException, NoSuchMethodException;
|
||||
|
||||
void evaluate() throws ScriptException;
|
||||
|
||||
<T> T getGlobalVariable(String name, Class<T> type);
|
||||
|
||||
<T> List<T> getGlobalVariableList(String name, Class<T> type);
|
||||
|
||||
<T> Map<String, T> getGlobalVariableMap(String name, Class<T> type);
|
||||
|
||||
LuaEngine getEngine();
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
package org.anime_game_servers.lua.engine;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Set;
|
||||
|
||||
public interface LuaTable {
|
||||
boolean has(String key);
|
||||
|
||||
@Nullable
|
||||
Object get(String key);
|
||||
|
||||
@Nullable
|
||||
Object get(int key);
|
||||
|
||||
int getInt(String key);
|
||||
|
||||
int optInt(String key, int defaultValue);
|
||||
|
||||
int getInt(int key);
|
||||
|
||||
int optInt(int key, int defaultValue);
|
||||
|
||||
void set(int key, int value);
|
||||
|
||||
void set(String key, int value);
|
||||
|
||||
double getDouble(String key);
|
||||
|
||||
double optDouble(String key, double defaultValue);
|
||||
|
||||
double getDouble(int key);
|
||||
|
||||
double optDouble(int key, double defaultValue);
|
||||
|
||||
float getFloat(String key);
|
||||
|
||||
float optFloat(String key, float defaultValue);
|
||||
|
||||
float getFloat(int key);
|
||||
|
||||
float optFloat(int key, float defaultValue);
|
||||
|
||||
void set(int key, double value);
|
||||
|
||||
void set(String key, double value);
|
||||
|
||||
boolean getBoolean(String key);
|
||||
|
||||
boolean optBoolean(String key, boolean defaultValue);
|
||||
|
||||
boolean getBoolean(int key);
|
||||
|
||||
boolean optBoolean(int key, boolean defaultValue);
|
||||
|
||||
void set(int key, boolean value);
|
||||
|
||||
void set(String key, boolean value);
|
||||
|
||||
String getString(String key);
|
||||
|
||||
String optString(String key, String defaultValue);
|
||||
|
||||
String getString(int key);
|
||||
|
||||
String optString(int key, String defaultValue);
|
||||
|
||||
void set(int key, String value);
|
||||
|
||||
void set(String key, String value);
|
||||
|
||||
@Nullable
|
||||
LuaTable getTable(String key);
|
||||
|
||||
@Nullable
|
||||
LuaTable getTable(int key);
|
||||
|
||||
void set(int key, LuaTable value);
|
||||
|
||||
void set(String key, LuaTable value);
|
||||
|
||||
Set<String> getKeys();
|
||||
|
||||
int[] getAsIntArray();
|
||||
|
||||
int getSize();
|
||||
|
||||
Object getRawTable();
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package org.anime_game_servers.lua.engine;
|
||||
|
||||
public interface LuaValue {
|
||||
boolean isNull();
|
||||
|
||||
boolean isBoolean();
|
||||
|
||||
boolean isInteger();
|
||||
|
||||
boolean isLong();
|
||||
|
||||
boolean isDouble();
|
||||
|
||||
boolean isFloat();
|
||||
|
||||
boolean isString();
|
||||
|
||||
boolean isTable();
|
||||
|
||||
boolean asBoolean();
|
||||
|
||||
int asInteger();
|
||||
|
||||
long asLong();
|
||||
|
||||
double asDouble();
|
||||
|
||||
float asFloat();
|
||||
|
||||
String asString();
|
||||
|
||||
<T> T asObject(Class<T> type);
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.anime_game_servers.lua.engine;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Path;
|
||||
|
||||
public interface ScriptFinder {
|
||||
InputStream openScript(String scriptName);
|
||||
Path getScriptPath(String scriptName);
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
package org.anime_game_servers.lua.models;
|
||||
|
||||
public class BooleanLuaValue extends MockLuaValue {
|
||||
public static final BooleanLuaValue TRUE = new BooleanLuaValue(true);
|
||||
public static final BooleanLuaValue FALSE = new BooleanLuaValue(false);
|
||||
private final boolean value;
|
||||
public BooleanLuaValue(boolean value){
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBoolean() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean asBoolean() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInteger() {
|
||||
return value ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long asLong() {
|
||||
return value ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double asDouble() {
|
||||
return value ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float asFloat() {
|
||||
return value ? 1 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return value ? "true" : "false";
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T asObject(Class<T> type) {
|
||||
if(type == Boolean.class)
|
||||
return type.cast(value);
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package org.anime_game_servers.lua.models;
|
||||
|
||||
public class IntLuaValue extends MockLuaValue {
|
||||
public static final IntLuaValue ZERO = new IntLuaValue(0);
|
||||
public static final IntLuaValue ONE = new IntLuaValue(1);
|
||||
public static final IntLuaValue N_ONE = new IntLuaValue(-1);
|
||||
|
||||
|
||||
private final int value;
|
||||
|
||||
public IntLuaValue(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInteger() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean asBoolean() {
|
||||
return value != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInteger() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long asLong() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double asDouble() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float asFloat() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return Integer.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T asObject(Class<T> type) {
|
||||
if(type == Number.class)
|
||||
return type.cast(value);
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package org.anime_game_servers.lua.models;
|
||||
|
||||
public interface IntValueEnum {
|
||||
int getValue();
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package org.anime_game_servers.lua.models;
|
||||
|
||||
|
||||
import org.anime_game_servers.lua.engine.LuaValue;
|
||||
|
||||
public abstract class MockLuaValue implements LuaValue {
|
||||
@Override
|
||||
public boolean isNull() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBoolean() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInteger() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLong() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDouble() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFloat() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTable() {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package org.anime_game_servers.lua.models
|
||||
|
||||
enum class ScriptType(
|
||||
val addDefaultGlobals: Boolean,
|
||||
val precompile: Boolean
|
||||
) {
|
||||
DATA_STORAGE(false, false),
|
||||
STATIC_EXECUTABLE(false, true),
|
||||
EXECUTABLE(true, true),
|
||||
ONE_TIME_EXECUTABLE(true, false),
|
||||
INCLUDE(true, true);
|
||||
}
|
@ -0,0 +1,142 @@
|
||||
package org.anime_game_servers.lua.serialize;
|
||||
|
||||
|
||||
import com.esotericsoftware.reflectasm.ConstructorAccess;
|
||||
import com.esotericsoftware.reflectasm.MethodAccess;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public abstract class BaseSerializer implements Serializer {
|
||||
|
||||
protected static final Map<Class<?>, MethodAccess> methodAccessCache = new ConcurrentHashMap<>();
|
||||
protected static final Map<Class<?>, ConstructorAccess<?>> constructorCache = new ConcurrentHashMap<>();
|
||||
protected static final Map<Class<?>, Map<String, FieldMeta>> fieldMetaCache = new ConcurrentHashMap<>();
|
||||
public abstract <T> List<T> toList(Class<T> type, Object obj);
|
||||
|
||||
public abstract <T> T toObject(Class<T> type, Object obj);
|
||||
|
||||
public abstract <T> Map<String,T> toMap(Class<T> type, Object obj);
|
||||
|
||||
|
||||
protected String getSetterName(String fieldName) {
|
||||
if (fieldName == null || fieldName.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
if (fieldName.length() == 1) {
|
||||
return "set" + fieldName.toUpperCase();
|
||||
}
|
||||
return "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
|
||||
}
|
||||
|
||||
protected <T> Map<String, FieldMeta> cacheType(Class<T> type) {
|
||||
if (fieldMetaCache.containsKey(type)) {
|
||||
return fieldMetaCache.get(type);
|
||||
}
|
||||
if (!constructorCache.containsKey(type)) {
|
||||
constructorCache.putIfAbsent(type, ConstructorAccess.get(type));
|
||||
}
|
||||
var methodAccess = Optional.ofNullable(methodAccessCache.get(type)).orElse(MethodAccess.get(type));
|
||||
methodAccessCache.putIfAbsent(type, methodAccess);
|
||||
|
||||
var fieldMetaMap = new HashMap<String, FieldMeta>();
|
||||
var methodNameSet = new HashSet<>(Arrays.stream(methodAccess.getMethodNames()).toList());
|
||||
|
||||
Class<?> classtype = type;
|
||||
while(classtype!=null){
|
||||
Arrays.stream(classtype.getDeclaredFields())
|
||||
.forEach(field -> {
|
||||
if(methodNameSet.contains(getSetterName(field.getName()))) {
|
||||
var setter = getSetterName(field.getName());
|
||||
var index = methodAccess.getIndex(setter);
|
||||
fieldMetaMap.put(field.getName(), new FieldMeta(field.getName(), setter, index, field.getType(), field));
|
||||
} else {
|
||||
field.setAccessible(true);
|
||||
fieldMetaMap.put(field.getName(), new FieldMeta(field.getName(), null, -1, field.getType(), field));
|
||||
}
|
||||
});
|
||||
classtype = classtype.getSuperclass();
|
||||
}
|
||||
|
||||
Arrays.stream(type.getFields())
|
||||
.filter(field -> !fieldMetaMap.containsKey(field.getName()))
|
||||
.filter(field -> methodNameSet.contains(getSetterName(field.getName())))
|
||||
.forEach(field -> {
|
||||
var setter = getSetterName(field.getName());
|
||||
var index = methodAccess.getIndex(setter);
|
||||
fieldMetaMap.put(field.getName(), new FieldMeta(field.getName(), setter, index, field.getType(), field));
|
||||
});
|
||||
|
||||
fieldMetaCache.put(type, fieldMetaMap);
|
||||
return fieldMetaMap;
|
||||
}
|
||||
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, int value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null){
|
||||
fieldMeta.getField().setInt(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, double value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null) {
|
||||
fieldMeta.getField().setDouble(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, float value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null) {
|
||||
fieldMeta.getField().setFloat(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, long value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null) {
|
||||
fieldMeta.getField().setLong(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, boolean value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null) {
|
||||
fieldMeta.getField().setBoolean(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
protected void set(Object object, @Nonnull FieldMeta fieldMeta, @Nullable MethodAccess methodAccess, Object value){
|
||||
try {
|
||||
if (methodAccess != null && fieldMeta.getSetter() != null) {
|
||||
methodAccess.invoke(object, fieldMeta.getIndex(), value);
|
||||
} else if(fieldMeta.getField() != null) {
|
||||
fieldMeta.getField().set(object, value);
|
||||
}
|
||||
} catch (Exception ex){
|
||||
//Grasscutter.getLogger().warn("Failed to set field {} of type {} to value {}", fieldMeta.getName(), fieldMeta.getType(), value, ex);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package org.anime_game_servers.lua.serialize
|
||||
|
||||
import java.lang.reflect.Field
|
||||
|
||||
data class FieldMeta(
|
||||
val name: String? = null,
|
||||
val setter: String? = null,
|
||||
val index: Int = 0,
|
||||
val type: Class<*>? = null,
|
||||
val field: Field? = null
|
||||
)
|
@ -0,0 +1,4 @@
|
||||
package org.anime_game_servers.lua.serialize;
|
||||
|
||||
public interface Serializer {
|
||||
}
|
46
GILua/build.gradle.kts
Normal file
46
GILua/build.gradle.kts
Normal file
@ -0,0 +1,46 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("java-library")
|
||||
kotlin("jvm") version "1.9.10"
|
||||
}
|
||||
|
||||
group = "org.anime_game_servers"
|
||||
version = "0.1"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
api(project(":BaseLua"))
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
compileOnly("org.projectlombok:lombok:1.18.30")
|
||||
annotationProcessor("org.projectlombok:lombok:1.18.30")
|
||||
implementation("com.github.davidmoten:rtree-multi:0.1")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
val compileKotlin: KotlinCompile by tasks
|
||||
compileKotlin.kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
val compileTestKotlin: KotlinCompile by tasks
|
||||
compileTestKotlin.kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create<MavenPublication>("maven") {
|
||||
from(components["kotlin"])
|
||||
groupId = "org.anime_game_servers"
|
||||
artifactId = "GIlua"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package org.anime_game_servers.gi_lua;
|
||||
|
||||
import com.github.davidmoten.rtreemulti.Entry;
|
||||
import com.github.davidmoten.rtreemulti.RTree;
|
||||
import com.github.davidmoten.rtreemulti.geometry.Geometry;
|
||||
import com.github.davidmoten.rtreemulti.geometry.Rectangle;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class SceneIndexManager {
|
||||
|
||||
public static <T> RTree<T, Geometry> buildIndex(int dimensions, Collection<T> elements, Function<T, Geometry> extractor){
|
||||
RTree<T, Geometry> rtree = RTree.dimensions(dimensions).create();
|
||||
return rtree.add(elements.stream().map(e -> Entry.entry(e, extractor.apply(e))).toList());
|
||||
}
|
||||
public static <T> List<T> queryNeighbors(RTree<T, Geometry> tree, double[] position, int range){
|
||||
var result = new ArrayList<T>();
|
||||
Rectangle rectangle = Rectangle.create(calRange(position, -range), calRange(position, range));
|
||||
var queryResult = tree.search(rectangle);
|
||||
queryResult.forEach(q -> result.add(q.value()));
|
||||
return result;
|
||||
}
|
||||
private static double[] calRange(double[] position, int range){
|
||||
var newPos = position.clone();
|
||||
for(int i=0;i<newPos.length;i++){
|
||||
newPos[i] += range;
|
||||
}
|
||||
return newPos;
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class DummyPoint {
|
||||
private Position pos;
|
||||
private Position rot;
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class Explore {
|
||||
private String name;
|
||||
private int exp;
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import com.github.davidmoten.rtreemulti.geometry.Point;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
public class Position implements Serializable {
|
||||
@Getter @Setter private float x;
|
||||
@Getter @Setter private float y;
|
||||
@Getter @Setter private float z;
|
||||
|
||||
public Position() {}
|
||||
|
||||
public Position(float x, float y) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public Position(float x, float y, float z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public Position(List<Float> xyz) {
|
||||
switch (xyz.size()) {
|
||||
default: // Might want to error on excess elements, but maybe we want to extend to 3+3 representation later.
|
||||
case 3:
|
||||
this.z = xyz.get(2); // Fall-through
|
||||
case 2:
|
||||
this.y = xyz.get(1); // Fall-through
|
||||
case 1:
|
||||
this.x = xyz.get(0); // pointless fall-through
|
||||
case 0:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public Point toPoint() {
|
||||
return Point.create(x,y,z);
|
||||
}
|
||||
|
||||
/**
|
||||
* To XYZ array for Spatial Index
|
||||
*/
|
||||
public double[] toDoubleArray() {
|
||||
return new double[]{ x, y, z};
|
||||
}
|
||||
/**
|
||||
* To XZ array for Spatial Index (Blocks)
|
||||
*/
|
||||
public double[] toXZDoubleArray() {
|
||||
return new double[]{x, z};
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import com.github.davidmoten.rtreemulti.RTree;
|
||||
import com.github.davidmoten.rtreemulti.geometry.Geometry;
|
||||
import com.github.davidmoten.rtreemulti.geometry.Rectangle;
|
||||
import lombok.*;
|
||||
import org.anime_game_servers.gi_lua.SceneIndexManager;
|
||||
import org.anime_game_servers.gi_lua.utils.GIScriptLoader;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
|
||||
import javax.script.ScriptException;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneBlock {
|
||||
@Setter(AccessLevel.PACKAGE)
|
||||
private int id;
|
||||
private Position max;
|
||||
private Position min;
|
||||
|
||||
private int sceneId;
|
||||
private Map<Integer,SceneGroup> groups;
|
||||
private RTree<SceneGroup, Geometry> sceneGroupIndex;
|
||||
|
||||
private transient boolean loaded; // Not an actual variable in the scripts either
|
||||
|
||||
public void setLoaded(boolean loaded) {
|
||||
this.loaded = loaded;
|
||||
}
|
||||
|
||||
public SceneBlock load(int sceneId, GIScriptLoader scriptLoader) {
|
||||
if (this.loaded) {
|
||||
return this;
|
||||
}
|
||||
this.sceneId = sceneId;
|
||||
this.setLoaded(true);
|
||||
|
||||
val cs = scriptLoader.getSceneScript(sceneId, "scene" + sceneId + "_block" + this.id + ".lua", ScriptType.DATA_STORAGE);
|
||||
|
||||
if (cs == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Eval script
|
||||
try {
|
||||
cs.evaluate();
|
||||
|
||||
// Set groups
|
||||
this.groups = cs.getGlobalVariableList("groups", SceneGroup.class).stream()
|
||||
.collect(Collectors.toMap(x -> x.getId(), y -> y, (a, b) -> a));
|
||||
|
||||
this.groups.values().forEach(g -> g.block_id = this.id);
|
||||
this.sceneGroupIndex = SceneIndexManager.buildIndex(3, this.groups.values(), g -> g.getPos().toPoint());
|
||||
} catch (ScriptException exception) {
|
||||
//Grasscutter.getLogger().error("An error occurred while loading block " + this.id + " in scene " + sceneId, exception);
|
||||
}
|
||||
//Grasscutter.getLogger().debug("Successfully loaded block {} in scene {}.", this.id, sceneId);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Rectangle toRectangle() {
|
||||
return Rectangle.create(this.min.toXZDoubleArray(), this.max.toXZDoubleArray());
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@Getter
|
||||
@ToString
|
||||
public class SceneBossChest {
|
||||
private int life_time;
|
||||
private int monster_config_id;
|
||||
private int resin;
|
||||
private int take_num;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneBusiness {
|
||||
private int type;
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneConfig {
|
||||
private Position vision_anchor;
|
||||
private Position born_pos;
|
||||
private Position born_rot;
|
||||
private Position begin_pos;
|
||||
private Position size;
|
||||
private float die_y;
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.anime_game_servers.gi_lua.models.constants.EntityType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneGadget extends SceneObject{
|
||||
private int gadget_id;
|
||||
private int state;
|
||||
private int point_type;
|
||||
private SceneBossChest boss_chest;
|
||||
private int chest_drop_id;
|
||||
private int interact_id;
|
||||
private boolean isOneoff;
|
||||
private int draft_id;
|
||||
private int route_id;
|
||||
private boolean start_route = true;
|
||||
private boolean is_use_point_array = false;
|
||||
private boolean persistent = false;
|
||||
private boolean showcutscene;
|
||||
private Explore explore;
|
||||
private List<Integer> arguments;
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return EntityType.GADGET;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneGarbage {
|
||||
private List<SceneGadget> gadgets;
|
||||
}
|
@ -0,0 +1,186 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.gi_lua.utils.GIScriptLoader;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneGroup {
|
||||
public transient int block_id; // Not an actual variable in the scripts but we will keep it here for reference
|
||||
|
||||
@Setter
|
||||
private int id;
|
||||
private int refresh_id;
|
||||
@Nullable
|
||||
private Position pos;
|
||||
|
||||
@Nullable
|
||||
private Map<Integer, SceneMonster> monsters; // <ConfigId, Monster>
|
||||
@Nullable
|
||||
private Map<Integer, SceneNPC> npcs; // <ConfigId, Npc>
|
||||
@Nullable
|
||||
private Map<Integer, SceneGadget> gadgets; // <ConfigId, Gadgets>
|
||||
@Nullable
|
||||
private Map<String, SceneTrigger> triggers;
|
||||
@Nullable
|
||||
private Map<Integer, SceneRegion> regions;
|
||||
@Nullable
|
||||
private List<SceneSuite> suites;
|
||||
@Nullable
|
||||
private List<SceneVar> variables;
|
||||
|
||||
@Nullable
|
||||
private SceneBusiness business;
|
||||
@Nullable
|
||||
private SceneGarbage garbages;
|
||||
@Nullable
|
||||
private SceneInitConfig init_config;
|
||||
private final boolean dynamic_load = false;
|
||||
|
||||
@Nullable
|
||||
private SceneReplaceable is_replaceable;
|
||||
|
||||
private transient boolean loaded; // Not an actual variable in the scripts either
|
||||
private transient LuaScript script;
|
||||
|
||||
public static SceneGroup of(int groupId) {
|
||||
var group = new SceneGroup();
|
||||
group.id = groupId;
|
||||
return group;
|
||||
}
|
||||
|
||||
public int getBusinessType() {
|
||||
return this.business == null ? 0 : this.business.getType();
|
||||
}
|
||||
|
||||
public List<SceneGadget> getGarbageGadgets() {
|
||||
return this.garbages == null ? null : this.garbages.getGadgets();
|
||||
}
|
||||
|
||||
public boolean isReplaceable() {
|
||||
return this.is_replaceable != null ? this.is_replaceable.isValue() : false;
|
||||
}
|
||||
|
||||
public SceneSuite getSuiteByIndex(int index) {
|
||||
if (index < 1 || index > suites.size()) {
|
||||
return null;
|
||||
}
|
||||
return this.suites.get(index - 1);
|
||||
}
|
||||
|
||||
public synchronized SceneGroup load(int sceneId, GIScriptLoader scriptLoader) {
|
||||
if (this.loaded) {
|
||||
return this;
|
||||
}
|
||||
// Set flag here so if there is no script, we don't call this function over and over again.
|
||||
this.loaded = true;
|
||||
|
||||
val cs = scriptLoader.getSceneScript(sceneId, "scene" + sceneId + "_group" + this.id + ".lua", ScriptType.EXECUTABLE);
|
||||
|
||||
if (cs == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
this.script = cs;
|
||||
|
||||
// Eval script
|
||||
try {
|
||||
cs.evaluate();
|
||||
|
||||
// Set
|
||||
this.monsters = cs.getGlobalVariableList("monsters", SceneMonster.class).stream()
|
||||
.collect(Collectors.toMap(x -> x.config_id, y -> y, (a, b) -> a));
|
||||
this.monsters.values().forEach(m -> m.group = this);
|
||||
|
||||
this.npcs = cs.getGlobalVariableList("npcs", SceneNPC.class).stream()
|
||||
.collect(Collectors.toMap(x -> x.config_id, y -> y, (a, b) -> a));
|
||||
this.npcs.values().forEach(m -> m.group = this);
|
||||
|
||||
this.gadgets = cs.getGlobalVariableList("gadgets", SceneGadget.class).stream()
|
||||
.collect(Collectors.toMap(x -> x.config_id, y -> y, (a, b) -> a));
|
||||
this.gadgets.values().forEach(m -> m.group = this);
|
||||
|
||||
this.triggers = cs.getGlobalVariableList("triggers", SceneTrigger.class).stream()
|
||||
.collect(Collectors.toMap(SceneTrigger::getName, y -> y, (a, b) -> a));
|
||||
this.triggers.values().forEach(t -> t.setCurrentGroup(this));
|
||||
|
||||
this.suites = cs.getGlobalVariableList("suites", SceneSuite.class);
|
||||
this.regions = cs.getGlobalVariableList("regions", SceneRegion.class).stream()
|
||||
.collect(Collectors.toMap(x -> x.config_id, y -> y, (a, b) -> a));
|
||||
this.regions.values().forEach(m -> m.group = this);
|
||||
|
||||
this.init_config = cs.getGlobalVariable("init_config", SceneInitConfig.class);
|
||||
|
||||
// Garbages // TODO: fix properly later
|
||||
/*Object garbagesValue = this.bindings.get("garbages");
|
||||
if (garbagesValue instanceof LuaValue garbagesTable) {
|
||||
this.garbages = new SceneGarbage();
|
||||
if (garbagesTable.checktable().get("gadgets") != LuaValue.NIL) {
|
||||
this.garbages.gadgets = ScriptLoader.getSerializer().toList(SceneGadget.class, garbagesTable.checktable().get("gadgets").checktable());
|
||||
this.garbages.gadgets.forEach(m -> m.group = this);
|
||||
}
|
||||
}*/
|
||||
|
||||
// Add variables to suite
|
||||
this.variables = cs.getGlobalVariableList("variables", SceneVar.class);
|
||||
|
||||
// Add monsters and gadgets to suite
|
||||
this.suites.forEach(i -> i.init(this));
|
||||
|
||||
} catch (Exception e) {
|
||||
//Grasscutter.getLogger().error("An error occurred while loading group " + this.id + " in scene " + sceneId + ".", e);
|
||||
}
|
||||
|
||||
//Grasscutter.getLogger().debug("Successfully loaded group {} in scene {}.", this.id, sceneId);
|
||||
return this;
|
||||
}
|
||||
|
||||
public int findInitSuiteIndex(int exclude_index) { //TODO: Investigate end index
|
||||
if (init_config == null) return 1;
|
||||
if (init_config.getIo_type() == 1) return init_config.getSuite(); //IO TYPE FLOW
|
||||
if (init_config.isRand_suite()) {
|
||||
if (suites.size() == 1) {
|
||||
return init_config.getSuite();
|
||||
} else {
|
||||
List<Integer> randSuiteList = new ArrayList<>();
|
||||
for (int i = 0; i < suites.size(); i++) {
|
||||
if (i == exclude_index) continue;
|
||||
|
||||
var suite = suites.get(i);
|
||||
for (int j = 0; j < suite.getRand_weight(); j++) randSuiteList.add(Integer.valueOf(i + 1));
|
||||
}
|
||||
return randSuiteList.get(new Random().nextInt(randSuiteList.size()));
|
||||
}
|
||||
}
|
||||
return init_config.getSuite();
|
||||
}
|
||||
|
||||
public Optional<SceneBossChest> searchBossChestInGroup() {
|
||||
return this.gadgets.values().stream().map(g -> g.getBoss_chest()).filter(Objects::nonNull)
|
||||
.filter(bossChest -> bossChest.getMonster_config_id() > 0)
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
/*public List<SceneGroup> getReplaceableGroups(Collection<SceneGroup> loadedGroups) {
|
||||
return this.is_replaceable == null ? List.of() :
|
||||
Optional.ofNullable(GameData.getGroupReplacements().get(this.id)).stream()
|
||||
.map(GroupReplacementData::getReplace_groups)
|
||||
.flatMap(List::stream)
|
||||
.map(replacementId -> loadedGroups.stream().filter(g -> g.id == replacementId).findFirst())
|
||||
.filter(Optional::isPresent).map(Optional::get)
|
||||
.filter(replacementGroup -> replacementGroup.is_replaceable != null)
|
||||
.filter(replacementGroup -> (replacementGroup.is_replaceable.isValue()
|
||||
&& replacementGroup.is_replaceable.getVersion() <= this.is_replaceable.getVersion())
|
||||
|| replacementGroup.is_replaceable.isNew_bin_only())
|
||||
.toList();
|
||||
}*/
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneInitConfig {
|
||||
private int suite;
|
||||
private int end_suite;
|
||||
private int io_type ;
|
||||
private boolean rand_suite;
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import com.github.davidmoten.rtreemulti.RTree;
|
||||
import com.github.davidmoten.rtreemulti.geometry.Geometry;
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.gi_lua.SceneIndexManager;
|
||||
import org.anime_game_servers.gi_lua.utils.GIScriptLoader;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
|
||||
import javax.script.ScriptException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneMeta {
|
||||
|
||||
private SceneConfig config;
|
||||
private Map<Integer, SceneBlock> blocks;
|
||||
|
||||
private LuaScript context;
|
||||
|
||||
private RTree<SceneBlock, Geometry> sceneBlockIndex;
|
||||
|
||||
public static SceneMeta of(int sceneId, GIScriptLoader scriptLoader) {
|
||||
return new SceneMeta().load(sceneId, scriptLoader);
|
||||
}
|
||||
|
||||
public SceneMeta load(int sceneId, GIScriptLoader scriptLoader) {
|
||||
// Get compiled script if cached
|
||||
val cs = scriptLoader.getSceneScript(sceneId, "scene"+sceneId+".lua", ScriptType.DATA_STORAGE);
|
||||
|
||||
if (cs == null) {
|
||||
//Grasscutter.getLogger().warn("No script found for scene " + sceneId);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Eval script
|
||||
try {
|
||||
cs.evaluate();
|
||||
|
||||
this.config = cs.getGlobalVariable("scene_config", SceneConfig.class);
|
||||
|
||||
// TODO optimize later
|
||||
// Create blocks
|
||||
List<Integer> blockIds = cs.getGlobalVariableList("blocks", Integer.class);
|
||||
List<SceneBlock> blocks = cs.getGlobalVariableList("block_rects", SceneBlock.class);
|
||||
|
||||
for (int i = 0; i < blocks.size(); i++) {
|
||||
SceneBlock block = blocks.get(i);
|
||||
block.setId(blockIds.get(i));
|
||||
}
|
||||
|
||||
this.blocks = blocks.stream().collect(Collectors.toMap(b -> b.getId(), b -> b, (a, b) -> a));
|
||||
this.sceneBlockIndex = SceneIndexManager.buildIndex(2, blocks, SceneBlock::toRectangle);
|
||||
|
||||
} catch (ScriptException exception) {
|
||||
//Grasscutter.getLogger().error("An error occurred while running a script.", exception);
|
||||
return null;
|
||||
}
|
||||
//Grasscutter.getLogger().debug("Successfully loaded metadata in scene {}.", sceneId);
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.anime_game_servers.gi_lua.models.constants.EntityType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneMonster extends SceneObject{
|
||||
private int monster_id;
|
||||
private int pose_id;
|
||||
private String pose_logic_state;
|
||||
private int drop_id;
|
||||
private boolean disableWander;
|
||||
private int title_id;
|
||||
private int special_name_id;
|
||||
private List<Integer> affix;
|
||||
private boolean isElite;
|
||||
private int climate_area_id;
|
||||
private int ai_config_id;
|
||||
private int kill_score;
|
||||
private int speed_level;
|
||||
private long tag;
|
||||
private boolean is_light_config;
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return EntityType.MONSTER;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.anime_game_servers.gi_lua.models.constants.EntityType;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneNPC extends SceneObject{
|
||||
private int npc_id;
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return EntityType.NPC;
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.anime_game_servers.gi_lua.models.constants.EntityType;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public abstract class SceneObject {
|
||||
protected int level;
|
||||
protected int config_id;
|
||||
protected int area_id;
|
||||
protected int vision_level = 0;
|
||||
protected int mark_flag;
|
||||
protected String drop_tag;
|
||||
protected int guest_ban_drop;
|
||||
protected int oneoff_reset_version;
|
||||
protected int sight_group_index;
|
||||
// server_global_value_config, might be group only
|
||||
|
||||
protected Position pos;
|
||||
protected Position rot;
|
||||
/**
|
||||
* not set by lua
|
||||
*/
|
||||
protected transient SceneGroup group;
|
||||
|
||||
public abstract EntityType getType();
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.anime_game_servers.gi_lua.models.constants.EntityType;
|
||||
import org.anime_game_servers.gi_lua.models.constants.ScriptRegionShape;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Getter
|
||||
public class SceneRegion extends SceneObject{
|
||||
private int shape;
|
||||
// for CUBIC
|
||||
private Position size;
|
||||
// for SPHERE AND CYLINDER
|
||||
private int radius;
|
||||
// for CYLINDER and POLYGON
|
||||
private float height;
|
||||
private List<Position> point_array;
|
||||
private List<String> team_ability_group;
|
||||
private boolean is_trigger_reload_group;
|
||||
|
||||
public boolean contains(Position position) {
|
||||
switch (shape) {
|
||||
case ScriptRegionShape.CUBIC:
|
||||
return (Math.abs(pos.getX() - position.getX()) <= size.getX()/2f) &&
|
||||
(Math.abs(pos.getY() - position.getY()) <= size.getY()/2f) &&
|
||||
(Math.abs(pos.getZ() - position.getZ()) <= size.getZ()/2f);
|
||||
case ScriptRegionShape.SPHERE:
|
||||
var x = Math.pow(pos.getX() - position.getX(), 2);
|
||||
var y = Math.pow(pos.getY() - position.getY(), 2);
|
||||
var z = Math.pow(pos.getZ() - position.getZ(), 2);
|
||||
// ^ means XOR in java!
|
||||
return x + y + z <= (radius*radius);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getGroupId() {
|
||||
return group.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return EntityType.REGION;
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneReplaceable {
|
||||
// TODO move to modifiable value in SceneGroupInstance
|
||||
@Setter
|
||||
private boolean value;
|
||||
private int version;
|
||||
private boolean new_bin_only;
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import lombok.val;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneSuite {
|
||||
// make it refer the default empty list to avoid NPE caused by some group
|
||||
private List<Integer> monsters = List.of();
|
||||
private List<Integer> gadgets = List.of();
|
||||
private List<String> triggers = List.of();
|
||||
private List<Integer> regions = List.of();
|
||||
private int rand_weight;
|
||||
|
||||
private boolean ban_refresh = false;
|
||||
|
||||
private transient List<SceneMonster> sceneMonsters = List.of();
|
||||
private transient List<SceneGadget> sceneGadgets = List.of();
|
||||
private transient List<SceneTrigger> sceneTriggers = List.of();
|
||||
private transient List<SceneRegion> sceneRegions = List.of();
|
||||
|
||||
public void init(SceneGroup sceneGroup) {
|
||||
val monsters = sceneGroup.getMonsters();
|
||||
if(monsters != null){
|
||||
this.sceneMonsters = new ArrayList<>(
|
||||
this.monsters.stream()
|
||||
.filter(monsters::containsKey)
|
||||
.map(monsters::get)
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
val gadgets = sceneGroup.getGadgets();
|
||||
if(gadgets != null){
|
||||
this.sceneGadgets = new ArrayList<>(
|
||||
this.gadgets.stream()
|
||||
.filter(gadgets::containsKey)
|
||||
.map(gadgets::get)
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
val triggers = sceneGroup.getTriggers();
|
||||
if(triggers != null) {
|
||||
this.sceneTriggers = new ArrayList<>(
|
||||
this.triggers.stream()
|
||||
.filter(triggers::containsKey)
|
||||
.map(triggers::get)
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
val regions = sceneGroup.getRegions();
|
||||
if(regions != null) {
|
||||
this.sceneRegions = new ArrayList<>(
|
||||
this.regions.stream()
|
||||
.filter(regions::containsKey)
|
||||
.map(regions::get)
|
||||
.toList()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
// todo find way to deserialize from lua with final fields, maybe with the help of Builder?
|
||||
public class SceneTrigger {
|
||||
/**
|
||||
* When the trigger count is set to this, it only gets unregistered on a return of != 0 from the trigger function.
|
||||
*/
|
||||
public static final int INF_TRIGGERS = 0;
|
||||
|
||||
private String name;
|
||||
private int config_id;
|
||||
private int event;
|
||||
private int trigger_count = 1;
|
||||
private String source;
|
||||
private String condition;
|
||||
private String action;
|
||||
private String tag;
|
||||
private String tlog_tag;
|
||||
private boolean forbid_guest;
|
||||
|
||||
private transient SceneGroup currentGroup;
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@ToString
|
||||
@Getter
|
||||
public class SceneVar {
|
||||
private int configId;
|
||||
private String name;
|
||||
private int value;
|
||||
private boolean no_refresh;
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
package org.anime_game_servers.gi_lua.models;
|
||||
|
||||
public class ScriptArgs {
|
||||
public int param1;
|
||||
public int param2;
|
||||
public int param3;
|
||||
public int source_eid; // Source entity
|
||||
public int target_eid;
|
||||
public int group_id;
|
||||
public String source; // source string, used for timers
|
||||
public int type; // lua event type, used by scripts and the ScriptManager
|
||||
|
||||
public ScriptArgs(int groupId, int eventType) {
|
||||
this(groupId, eventType, 0,0);
|
||||
}
|
||||
|
||||
public ScriptArgs(int groupId, int eventType, int param1) {
|
||||
this(groupId, eventType, param1,0);
|
||||
}
|
||||
|
||||
public ScriptArgs(int groupId, int eventType, int param1, int param2) {
|
||||
this.type = eventType;
|
||||
this.param1 = param1;
|
||||
this.param2 = param2;
|
||||
this.group_id = groupId;
|
||||
}
|
||||
|
||||
public int getParam1() {
|
||||
return param1;
|
||||
}
|
||||
|
||||
public ScriptArgs setParam1(int param1) {
|
||||
this.param1 = param1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getParam2() {
|
||||
return param2;
|
||||
}
|
||||
|
||||
public ScriptArgs setParam2(int param2) {
|
||||
this.param2 = param2;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getParam3() {
|
||||
return param3;
|
||||
}
|
||||
|
||||
public ScriptArgs setParam3(int param3) {
|
||||
this.param3 = param3;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getSourceEntityId() {
|
||||
return source_eid;
|
||||
}
|
||||
|
||||
public ScriptArgs setSourceEntityId(int source_eid) {
|
||||
this.source_eid = source_eid;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getTargetEntityId() {
|
||||
return target_eid;
|
||||
}
|
||||
|
||||
public ScriptArgs setTargetEntityId(int target_eid) {
|
||||
this.target_eid = target_eid;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getEventSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
public ScriptArgs setEventSource(String source) {
|
||||
this.source = source;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ScriptArgs setEventSource(int source) {
|
||||
return setEventSource(Integer.toString(source));
|
||||
}
|
||||
|
||||
public int getGroupId() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public ScriptArgs setGroupId(int group_id) {
|
||||
this.group_id = group_id;
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public enum EntityType {
|
||||
NONE,
|
||||
AVATAR,
|
||||
MONSTER,
|
||||
NPC,
|
||||
GADGET,
|
||||
REGION,
|
||||
WEAPON,
|
||||
WEATHER,
|
||||
SCENE,
|
||||
TEAM,
|
||||
MASSIVE_ENTITY ,
|
||||
MPLEVEL,
|
||||
PLAY_TEAM_ENTITY,
|
||||
EYE_POINT;
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public class EventType {
|
||||
public static final int EVENT_NONE = 0;
|
||||
/**
|
||||
* param1: monster.configId
|
||||
*/
|
||||
public static final int EVENT_ANY_MONSTER_DIE = 1;
|
||||
public static final int EVENT_ANY_GADGET_DIE = 2;
|
||||
public static final int EVENT_VARIABLE_CHANGE = 3;
|
||||
public static final int EVENT_ENTER_REGION = 4;
|
||||
public static final int EVENT_LEAVE_REGION = 5;
|
||||
public static final int EVENT_GADGET_CREATE = 6;
|
||||
public static final int EVENT_GADGET_STATE_CHANGE = 7;
|
||||
public static final int EVENT_DUNGEON_SETTLE = 8;
|
||||
public static final int EVENT_SELECT_OPTION = 9;
|
||||
public static final int EVENT_CLIENT_EXECUTE = 10;
|
||||
public static final int EVENT_ANY_MONSTER_LIVE = 11;
|
||||
public static final int EVENT_SPECIFIC_MONSTER_HP_CHANGE = 12;
|
||||
public static final int EVENT_CITY_LEVELUP_UNLOCK_DUNGEON_ENTRY = 13;
|
||||
public static final int EVENT_DUNGEON_BROADCAST_ONTIMER = 14;
|
||||
public static final int EVENT_TIMER_EVENT = 15;
|
||||
public static final int EVENT_CHALLENGE_SUCCESS = 16;
|
||||
public static final int EVENT_CHALLENGE_FAIL = 17;
|
||||
public static final int EVENT_SEAL_BATTLE_BEGIN = 18;
|
||||
public static final int EVENT_SEAL_BATTLE_END = 19;
|
||||
public static final int EVENT_GATHER = 20;
|
||||
public static final int EVENT_QUEST_FINISH = 21;
|
||||
public static final int EVENT_MONSTER_BATTLE = 22;
|
||||
public static final int EVENT_CITY_LEVELUP = 23;
|
||||
public static final int EVENT_CUTSCENE_END = 24;
|
||||
public static final int EVENT_AVATAR_NEAR_PLATFORM = 25; // also send by the client
|
||||
public static final int EVENT_PLATFORM_REACH_POINT = 26;
|
||||
public static final int EVENT_UNLOCK_TRANS_POINT = 27;
|
||||
public static final int EVENT_QUEST_START = 28;
|
||||
public static final int EVENT_GROUP_LOAD = 29;
|
||||
public static final int EVENT_GROUP_WILL_UNLOAD = 30;
|
||||
public static final int EVENT_GROUP_WILL_REFRESH = 31;
|
||||
public static final int EVENT_GROUP_REFRESH = 32;
|
||||
public static final int EVENT_DUNGEON_REWARD_GET = 33;
|
||||
public static final int EVENT_SPECIFIC_GADGET_HP_CHANGE = 34;
|
||||
public static final int EVENT_MONSTER_TIDE_OVER = 35;
|
||||
public static final int EVENT_MONSTER_TIDE_CREATE = 36;
|
||||
public static final int EVENT_MONSTER_TIDE_DIE = 37;
|
||||
public static final int EVENT_SEALAMP_PHASE_CHANGE = 38;
|
||||
public static final int EVENT_BLOSSOM_PROGRESS_FINISH = 39;
|
||||
public static final int EVENT_BLOSSOM_CHEST_DIE = 40;
|
||||
public static final int EVENT_GADGET_PLAY_START = 41;
|
||||
public static final int EVENT_GADGET_PLAY_START_CD = 42;
|
||||
public static final int EVENT_GADGET_PLAY_STOP = 43;
|
||||
public static final int EVENT_GADGET_LUA_NOTIFY = 44;
|
||||
public static final int EVENT_MP_PLAY_PREPARE = 45;
|
||||
public static final int EVENT_MP_PLAY_BATTLE = 46;
|
||||
public static final int EVENT_MP_PLAY_PREPARE_INTERRUPT = 47;
|
||||
public static final int EVENT_SELECT_DIFFICULTY = 48;
|
||||
public static final int EVENT_SCENE_MP_PLAY_BATTLE_STATE = 49;
|
||||
public static final int EVENT_SCENE_MP_PLAY_BATTLE_STAGE_CHANGE = 50;
|
||||
public static final int EVENT_SCENE_MP_PLAY_BATTLE_RESULT = 51;
|
||||
public static final int EVENT_SEAL_BATTLE_PROGRESS_DECREASE = 52;
|
||||
public static final int EVENT_GENERAL_REWARD_DIE = 53;
|
||||
public static final int EVENT_SCENE_MP_PLAY_BATTLE_INTERRUPT = 54;
|
||||
public static final int EVENT_MONSTER_DIE_BEFORE_LEAVE_SCENE = 55;
|
||||
public static final int EVENT_SCENE_MP_PLAY_OPEN = 56;
|
||||
public static final int EVENT_OFFERING_LEVELUP = 57;
|
||||
public static final int EVENT_DUNGEON_REVIVE = 58;
|
||||
public static final int EVENT_SCENE_MP_PLAY_ALL_AVATAR_DIE = 59;
|
||||
public static final int EVENT_DUNGEON_ALL_AVATAR_DIE = 60;
|
||||
public static final int EVENT_GENERAL_REWARD_TAKEN = 61;
|
||||
public static final int EVENT_PLATFORM_REACH_ARRAYPOINT = 62;
|
||||
public static final int EVENT_SCENE_MULTISTAGE_PLAY_STAGE_END = 63;
|
||||
public static final int EVENT_SCENE_MULTISTAGE_PLAY_END_STAGE_REQ = 64;
|
||||
public static final int EVENT_MECHANICUS_PICKED_CARD = 65;
|
||||
public static final int EVENT_POOL_MONSTER_TIDE_OVER = 66;
|
||||
public static final int EVENT_POOL_MONSTER_TIDE_CREATE = 67;
|
||||
public static final int EVENT_POOL_MONSTER_TIDE_DIE = 68;
|
||||
public static final int EVENT_DUNGEON_AVATAR_SLIP_DIE = 69;
|
||||
public static final int EVENT_GALLERY_START = 70;
|
||||
public static final int EVENT_GALLERY_STOP = 71;
|
||||
public static final int EVENT_TIME_AXIS_PASS = 72;
|
||||
public static final int EVENT_FLEUR_FAIR_DUNGEON_ALL_PLAYER_ENTER = 73;
|
||||
public static final int EVENT_GADGETTALK_DONE = 74;
|
||||
public static final int EVENT_SET_GAME_TIME = 75;
|
||||
public static final int EVENT_HIDE_AND_SEEK_PLAYER_QUIT = 76;
|
||||
public static final int EVENT_AVATAR_DIE = 77;
|
||||
public static final int EVENT_SCENE_MULTISTAGE_PLAY_STAGE_START = 78;
|
||||
public static final int EVENT_GALLERY_PROGRESS_PASS = 79;
|
||||
public static final int EVENT_GALLERY_PROGRESS_EMPTY = 80;
|
||||
public static final int EVENT_GALLERY_PROGRESS_FULL = 81;
|
||||
public static final int EVENT_HUNTING_FINISH_FINAL = 82;
|
||||
public static final int EVENT_USE_WIDGET_TOY_FOX_CAMERA = 83;
|
||||
public static final int EVENT_LUNA_RITE_SACRIFICE = 84;
|
||||
public static final int EVENT_SUMO_SWITCH_TEAM_EVENT = 85;
|
||||
public static final int EVENT_FISHING_START = 86;
|
||||
public static final int EVENT_FISHING_STOP = 87;
|
||||
public static final int EVENT_FISHING_QTE_FINISH = 88;
|
||||
public static final int EVENT_FISHING_TIMEOUT_FLEE = 89;
|
||||
public static final int EVENT_ROGUE_CELL_STATE_CHANGE = 90;
|
||||
public static final int EVENT_ROGUE_CELL_CONSTRUCT = 91;
|
||||
public static final int EVENT_ROGUE_CELL_FINISH_SELECT_CARD = 92;
|
||||
public static final int EVENT_ANY_MONSTER_CAPTURE = 93;
|
||||
public static final int EVENT_ACTIVITY_INTERACT_GADGET = 94;
|
||||
public static final int EVENT_CHALLENGE_PAUSE = 95;
|
||||
public static final int EVENT_LEVEL_TAG_CHANGE = 96;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_START = 97;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_RESTART = 98;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_REACTIVE = 99;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_OUT_STUCK = 100;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_EXIT_TRY = 101;
|
||||
public static final int EVENT_CUSTOM_DUNGEON_OFFICIAL_RESTART = 102;
|
||||
public static final int EVENT_ANY_MONSTER_CAPTURE_AND_DISAPPEAR = 103;
|
||||
public static final int EVENT_MICHIAE_INTERACT = 104;
|
||||
public static final int EVENT_SELECT_UIINTERACT = 105;
|
||||
public static final int EVENT_LUA_NOTIFY = 106;
|
||||
public static final int EVENT_PHOTO_FINISH = 107;
|
||||
public static final int EVENT_IRODORI_MASTER_READY = 108;
|
||||
public static final int EVENT_ROGUE_START_FIGHT = 109;
|
||||
public static final int EVENT_ROGUE_CREAGE_FIGHT_GADGET = 110;
|
||||
public static final int EVENT_ROGUE_CREAGE_REPAIR_GADGET = 111;
|
||||
public static final int EVENT_ROGUE_OPEN_ACCESS = 112;
|
||||
public static final int EVENT_GADGET_GIVING_FINISHED = 113;
|
||||
public static final int EVENT_OBSERVATION_POINT_NOTIFY = 114;
|
||||
public static final int EVENT_GADGET_GIVING_TAKEBACK = 115;
|
||||
public static final int EVENT_ECHO_SHELL_INTERACT = 116;
|
||||
public static final int EVENT_PLATFORM_ARRIVAL = 2701;
|
||||
public static final int EVENT_PLAYER_BACK_GALLERY_REVIVE_POINT = 2800;
|
||||
public static final int EVENT_GALLERY_CANNOT_START_AFTER_COUNTDOWN = 2801;
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public enum GroupKillPolicy {
|
||||
GROUP_KILL_NONE,
|
||||
GROUP_KILL_ALL,
|
||||
GROUP_KILL_MONSTER,
|
||||
GROUP_KILL_GADGET,
|
||||
GROUP_KILL_NPC
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public class ScriptGadgetState {
|
||||
public static final int Default = 0;
|
||||
public static final int GatherDrop = 1;
|
||||
public static final int ChestLocked = 101;
|
||||
public static final int ChestOpened = 102;
|
||||
public static final int ChestTrap = 103;
|
||||
public static final int ChestBramble = 104;
|
||||
public static final int ChestFrozen = 105;
|
||||
public static final int ChestRock = 106;
|
||||
public static final int GearStart = 201;
|
||||
public static final int GearStop = 202;
|
||||
public static final int GearAction1 = 203;
|
||||
public static final int GearAction2 = 204;
|
||||
public static final int CrystalResonate1 = 301;
|
||||
public static final int CrystalResonate2 = 302;
|
||||
public static final int CrystalExplode = 303;
|
||||
public static final int CrystalDrain = 304;
|
||||
public static final int StatueActive = 401;
|
||||
public static final int Action01 = 901;
|
||||
public static final int Action02 = 902;
|
||||
public static final int Action03 = 903;
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public class ScriptRegionShape {
|
||||
public static final int NONE = 0;
|
||||
public static final int SPHERE = 1;
|
||||
public static final int CUBIC = 2;
|
||||
public static final int CYLINDER = 3;
|
||||
public static final int POLYGON = 4;
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public enum SealBattleType {
|
||||
NONE,
|
||||
ENERGY_CHARGE,
|
||||
KILL_MONSTER
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants;
|
||||
|
||||
public enum VisionLevelType {
|
||||
VISION_LEVEL_NORMAL,
|
||||
VISION_LEVEL_LITTLE_REMOTE,
|
||||
VISION_LEVEL_REMOTE,
|
||||
VISION_LEVEL_SUPER,
|
||||
VISION_LEVEL_NEARBY,
|
||||
VISION_LEVEL_SUPER_NEARBY,
|
||||
VISION_LEVEL_SUPER_NUM,
|
||||
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants.temporary;
|
||||
|
||||
public enum ExhibitionPlayType {
|
||||
Challenge,
|
||||
Gallery,
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants.temporary;
|
||||
|
||||
public enum FlowSuiteOperatePolicy {
|
||||
DEFAULT,
|
||||
COMPLETE
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants.temporary;
|
||||
|
||||
public enum GalleryProgressScoreType {
|
||||
GALLERY_PROGRESS_SCORE_NONE,
|
||||
GALLERY_PROGRESS_SCORE_NO_DEGRADE
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package org.anime_game_servers.gi_lua.models.constants.temporary;
|
||||
|
||||
public enum GalleryProgressScoreUIType {
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_NONE,
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_BUOYANT_COMBAT,
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_SUMO_STAGE,
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_DIG,
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_CRYSTAL_LINK,
|
||||
GALLERY_PROGRESS_SCORE_UI_TYPE_TREASURE;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class ActivityOpenAndCloseTime {
|
||||
private Date openTime;
|
||||
private Date closeTime;
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib
|
||||
|
||||
interface ControllerLuaContext<GadgetEntity> : LuaContext {
|
||||
val gadget:GadgetEntity
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib
|
||||
|
||||
import org.anime_game_servers.gi_lua.models.SceneGroup
|
||||
import org.anime_game_servers.gi_lua.models.ScriptArgs
|
||||
import org.anime_game_servers.lua.engine.LuaEngine
|
||||
|
||||
interface GroupEventLuaContext: LuaContext {
|
||||
fun getGroupInstance(): SceneGroup
|
||||
fun getArgs(): ScriptArgs
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib;
|
||||
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
|
||||
public interface LuaContext {
|
||||
LuaEngine getEngine();
|
||||
ScriptLibHandler getScriptLibHandler();
|
||||
}
|
@ -0,0 +1,866 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib;
|
||||
|
||||
import lombok.val;
|
||||
|
||||
import static org.anime_game_servers.gi_lua.utils.ScriptUtils.posToLua;
|
||||
|
||||
public class ScriptLib {
|
||||
|
||||
/**
|
||||
* Context free functions
|
||||
*/
|
||||
|
||||
public static ScriptLibStaticHandler staticHandler;
|
||||
public static void PrintLog(String msg) {
|
||||
staticHandler.PrintLog(msg);
|
||||
}
|
||||
|
||||
public static int GetEntityType(int entityId){
|
||||
return staticHandler.GetEntityType(entityId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Context independent functions
|
||||
*/
|
||||
public static void PrintContextLog(LuaContext context, String msg) {
|
||||
context.getScriptLibHandler().PrintContextLog(context, msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* GroupEventLuaContext functions
|
||||
*/
|
||||
|
||||
public static int SetGadgetStateByConfigId(GroupEventLuaContext context, int configId, int gadgetState) {
|
||||
return context.getScriptLibHandler().SetGadgetStateByConfigId(context, configId, gadgetState);
|
||||
}
|
||||
|
||||
public static int SetGroupGadgetStateByConfigId(GroupEventLuaContext context, int groupId, int configId, int gadgetState) {
|
||||
return context.getScriptLibHandler().SetGroupGadgetStateByConfigId(context, groupId, configId, gadgetState);
|
||||
}
|
||||
|
||||
public static int SetWorktopOptionsByGroupId(GroupEventLuaContext context, int groupId, int configId, Object optionsTable) {
|
||||
val options = context.getEngine().getTable(optionsTable);
|
||||
return context.getScriptLibHandler().SetWorktopOptionsByGroupId(context, groupId, configId, options);
|
||||
}
|
||||
|
||||
public static int SetWorktopOptions(GroupEventLuaContext context, Object rawTable){
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().SetWorktopOptions(context, table);
|
||||
}
|
||||
|
||||
public static int DelWorktopOptionByGroupId(GroupEventLuaContext context, int groupId, int configId, int option) {
|
||||
return context.getScriptLibHandler().DelWorktopOptionByGroupId(context, groupId, configId, option);
|
||||
}
|
||||
public static int DelWorktopOption(GroupEventLuaContext context, int var1){
|
||||
return context.getScriptLibHandler().DelWorktopOption(context, var1);
|
||||
}
|
||||
|
||||
// Some fields are guessed
|
||||
public static int AutoMonsterTide(GroupEventLuaContext context, int challengeIndex, int groupId, Integer[] ordersConfigId, int tideCount, int sceneLimit, int param6) {
|
||||
return context.getScriptLibHandler().AutoMonsterTide(context, challengeIndex, groupId, ordersConfigId, tideCount, sceneLimit, param6);
|
||||
}
|
||||
|
||||
public static int GoToGroupSuite(GroupEventLuaContext context, int groupId, int suite) {
|
||||
return context.getScriptLibHandler().GoToGroupSuite(context, groupId, suite);
|
||||
}
|
||||
|
||||
public static int AddExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite) {
|
||||
return context.getScriptLibHandler().AddExtraGroupSuite(context, groupId, suite);
|
||||
}
|
||||
public static int RemoveExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite) {
|
||||
return context.getScriptLibHandler().RemoveExtraGroupSuite(context, groupId, suite);
|
||||
}
|
||||
public static int KillExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite) {
|
||||
return context.getScriptLibHandler().KillExtraGroupSuite(context, groupId, suite);
|
||||
}
|
||||
|
||||
public static int AddExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy){
|
||||
return context.getScriptLibHandler().AddExtraFlowSuite(context, groupId, suiteId, flowSuitePolicy);
|
||||
}
|
||||
public static int RemoveExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy){
|
||||
return context.getScriptLibHandler().RemoveExtraFlowSuite(context, groupId, suiteId, flowSuitePolicy);
|
||||
}
|
||||
public static int KillExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy){
|
||||
return context.getScriptLibHandler().KillExtraFlowSuite(context, groupId, suiteId, flowSuitePolicy);
|
||||
}
|
||||
|
||||
public static int ActiveChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, int timeLimitOrGroupId, int groupId, int objectiveKills, int param5) {
|
||||
return context.getScriptLibHandler().ActiveChallenge(context, challengeIndex, challengeId, timeLimitOrGroupId, groupId, objectiveKills, param5);
|
||||
}
|
||||
|
||||
public static int StartChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, Object challengeParams) {
|
||||
val conditionParamTable = context.getEngine().getTable(challengeParams);
|
||||
return context.getScriptLibHandler().StartChallenge(context, challengeIndex, challengeId, conditionParamTable);
|
||||
}
|
||||
|
||||
public static int StopChallenge(GroupEventLuaContext context, int challengeIndex, int result) {
|
||||
return context.getScriptLibHandler().StopChallenge(context, challengeIndex, result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or removed time from the challenge
|
||||
* TODO verify and implement
|
||||
* @param context
|
||||
* @param challengeId The active target challenges id
|
||||
* @param duration The duration to add or remove
|
||||
* @return 0 if success, 1 if no challenge is active, 2 if the challenge id doesn't match the active challenge,
|
||||
* 3 if modifying the duration failed
|
||||
*/
|
||||
public static int AddChallengeDuration(GroupEventLuaContext context, int challengeId, int duration) {
|
||||
return context.getScriptLibHandler().AddChallengeDuration(context, challengeId, duration);
|
||||
}
|
||||
|
||||
public static int GetGroupMonsterCountByGroupId(GroupEventLuaContext context, int groupId) {
|
||||
return context.getScriptLibHandler().GetGroupMonsterCountByGroupId(context, groupId);
|
||||
}
|
||||
|
||||
// TODO check existence
|
||||
public static int CreateVariable(GroupEventLuaContext context, String type, Object value) {
|
||||
//TODO implement
|
||||
switch (type){
|
||||
case "int":
|
||||
default:
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
// TODO check existence
|
||||
public static int SetVariableValue(GroupEventLuaContext context, int var1) {
|
||||
//TODO implement var1 type
|
||||
return 0;
|
||||
}
|
||||
public static int GetVariableValue(GroupEventLuaContext context, int var1) {
|
||||
//TODO implement var1 type
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int GetGroupVariableValue(GroupEventLuaContext context, String var) {
|
||||
return context.getScriptLibHandler().GetGroupVariableValue(context, var);
|
||||
}
|
||||
|
||||
public static int GetGroupVariableValueByGroup(GroupEventLuaContext context, String name, int groupId){
|
||||
return context.getScriptLibHandler().GetGroupVariableValueByGroup(context, name, groupId);
|
||||
}
|
||||
|
||||
public static int SetGroupVariableValue(GroupEventLuaContext context, String varName, int value) {
|
||||
return context.getScriptLibHandler().SetGroupVariableValue(context, varName, value);
|
||||
}
|
||||
|
||||
public static int SetGroupVariableValueByGroup(GroupEventLuaContext context, String key, int value, int groupId){
|
||||
return context.getScriptLibHandler().SetGroupVariableValueByGroup(context, key, value, groupId);
|
||||
}
|
||||
|
||||
public static int ChangeGroupVariableValue(GroupEventLuaContext context, String varName, int value) {
|
||||
return context.getScriptLibHandler().ChangeGroupVariableValue(context, varName, value);
|
||||
}
|
||||
|
||||
public static int ChangeGroupVariableValueByGroup(GroupEventLuaContext context, String name, int value, int groupId){
|
||||
return context.getScriptLibHandler().ChangeGroupVariableValueByGroup(context, name, value, groupId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the actions and triggers to designated group
|
||||
*/
|
||||
public static int RefreshGroup(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().RefreshGroup(context, table);
|
||||
}
|
||||
|
||||
public static int GetRegionEntityCount(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().GetRegionEntityCount(context, table);
|
||||
}
|
||||
|
||||
public int GetRegionConfigId(GroupEventLuaContext context, Object rawTable){
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().GetRegionConfigId(context, table);
|
||||
}
|
||||
|
||||
public static int TowerCountTimeStatus(GroupEventLuaContext context, int isDone, int var2){
|
||||
return context.getScriptLibHandler().TowerCountTimeStatus(context, isDone, var2);
|
||||
}
|
||||
public static int GetGroupMonsterCount(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetGroupMonsterCount(context);
|
||||
}
|
||||
|
||||
public static int SetMonsterBattleByGroup(GroupEventLuaContext context, int configId, int groupId) {
|
||||
return context.getScriptLibHandler().SetMonsterBattleByGroup(context, configId, groupId);
|
||||
}
|
||||
|
||||
public static int CauseDungeonFail(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().CauseDungeonFail(context);
|
||||
}
|
||||
|
||||
public static int SetEntityServerGlobalValueByConfigId(GroupEventLuaContext context, int cfgId, String sgvName, int value){
|
||||
return context.getScriptLibHandler().SetEntityServerGlobalValueByConfigId(context, cfgId, sgvName, value);
|
||||
}
|
||||
|
||||
public static int SetGroupLogicStateValue(GroupEventLuaContext context, String sgvName, int value){
|
||||
return context.getScriptLibHandler().SetGroupLogicStateValue(context, sgvName, value);
|
||||
}
|
||||
|
||||
public static int SetIsAllowUseSkill(GroupEventLuaContext context, int canUse){
|
||||
return context.getScriptLibHandler().SetIsAllowUseSkill(context, canUse);
|
||||
}
|
||||
|
||||
public static int KillEntityByConfigId(LuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().KillEntityByConfigId(context, table);
|
||||
}
|
||||
|
||||
public static int CreateMonster(GroupEventLuaContext context, Object rawTable){
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().CreateMonster(context, table);
|
||||
}
|
||||
|
||||
public static int TowerMirrorTeamSetUp(GroupEventLuaContext context, int team, int var1) {
|
||||
return context.getScriptLibHandler().TowerMirrorTeamSetUp(context, team, var1);
|
||||
}
|
||||
|
||||
public static int CreateGadget(GroupEventLuaContext context, Object rawTable){
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().CreateGadget(context, table);
|
||||
}
|
||||
|
||||
public static int CheckRemainGadgetCountByGroupId(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().CheckRemainGadgetCountByGroupId(context, table);
|
||||
}
|
||||
|
||||
public static int GetGadgetStateByConfigId(GroupEventLuaContext context, int groupId, int configId){
|
||||
return context.getScriptLibHandler().GetGadgetStateByConfigId(context, groupId, configId);
|
||||
}
|
||||
|
||||
public static int MarkPlayerAction(GroupEventLuaContext context, int var1, int var2, int var3){
|
||||
return context.getScriptLibHandler().MarkPlayerAction(context, var1, var2, var3);
|
||||
}
|
||||
|
||||
public static int AddQuestProgress(GroupEventLuaContext context, String eventNotifyName){
|
||||
return context.getScriptLibHandler().AddQuestProgress(context, eventNotifyName);
|
||||
}
|
||||
|
||||
/**
|
||||
* change the state of gadget
|
||||
*/
|
||||
public static int ChangeGroupGadget(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().ChangeGroupGadget(context, table);
|
||||
}
|
||||
|
||||
public static int GetSceneOwnerUid(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetSceneOwnerUid(context);
|
||||
}
|
||||
|
||||
public static int GetHostQuestState(GroupEventLuaContext context, int questId){
|
||||
return context.getScriptLibHandler().GetHostQuestState(context, questId);
|
||||
}
|
||||
|
||||
public static int GetQuestState(GroupEventLuaContext context, int entityId, int questId){
|
||||
return context.getScriptLibHandler().GetQuestState(context, entityId, questId);
|
||||
}
|
||||
|
||||
public static int ShowReminder(GroupEventLuaContext context, int reminderId){
|
||||
return context.getScriptLibHandler().ShowReminder(context, reminderId);
|
||||
}
|
||||
|
||||
public static int RemoveEntityByConfigId(GroupEventLuaContext context, int groupId, int entityType, int configId){
|
||||
return context.getScriptLibHandler().RemoveEntityByConfigId(context, groupId, entityType, configId);
|
||||
}
|
||||
|
||||
public static int CreateGroupTimerEvent(GroupEventLuaContext context, int groupID, String source, double time) {
|
||||
return context.getScriptLibHandler().CreateGroupTimerEvent(context, groupID, source, time);
|
||||
}
|
||||
|
||||
public static int CancelGroupTimerEvent(GroupEventLuaContext context, int groupID, String source) {
|
||||
return context.getScriptLibHandler().CancelGroupTimerEvent(context, groupID, source);
|
||||
}
|
||||
|
||||
public static int GetGroupSuite(GroupEventLuaContext context, int groupId) {
|
||||
return context.getScriptLibHandler().GetGroupSuite(context, groupId);
|
||||
}
|
||||
public static int SetGroupReplaceable(GroupEventLuaContext context, int groupId, boolean value) {
|
||||
return context.getScriptLibHandler().SetGroupReplaceable(context, groupId, value);
|
||||
}
|
||||
|
||||
public static Object GetSceneUidList(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetSceneUidList(context);
|
||||
}
|
||||
|
||||
public static int GetSeaLampActivityPhase(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetSeaLampActivityPhase(context);
|
||||
}
|
||||
public static int GadgetPlayUidOp(GroupEventLuaContext context, int groupId, int gadget_crucible, int var3, int var4, String var5, int var6 ){
|
||||
return context.getScriptLibHandler().GadgetPlayUidOp(context, groupId, gadget_crucible, var3, var4, var5, var6);
|
||||
}
|
||||
public static long GetServerTime(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetServerTime(context);
|
||||
}
|
||||
public static long GetServerTimeByWeek(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetServerTimeByWeek(context);
|
||||
}
|
||||
public static int GetCurTriggerCount(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetCurTriggerCount(context);
|
||||
}
|
||||
public static int GetChannellerSlabLoopDungeonLimitTime(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetChannellerSlabLoopDungeonLimitTime(context);
|
||||
}
|
||||
public static boolean IsPlayerAllAvatarDie(GroupEventLuaContext context, int sceneUid){
|
||||
return context.getScriptLibHandler().IsPlayerAllAvatarDie(context, sceneUid);
|
||||
}
|
||||
|
||||
public static int sendShowCommonTipsToClient(GroupEventLuaContext context, String title, String content, int closeTime) {
|
||||
return context.getScriptLibHandler().sendShowCommonTipsToClient(context, title, content, closeTime);
|
||||
}
|
||||
|
||||
public static int sendCloseCommonTipsToClient(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().sendCloseCommonTipsToClient(context);
|
||||
}
|
||||
|
||||
public static int CreateFatherChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, int timeLimit, Object conditionTable){
|
||||
val conditionLuaTable = context.getEngine().getTable(conditionTable);
|
||||
return context.getScriptLibHandler().CreateFatherChallenge(context, challengeIndex, challengeId, timeLimit, conditionLuaTable);
|
||||
}
|
||||
public static int StartFatherChallenge(GroupEventLuaContext context, int challengeIndex){
|
||||
return context.getScriptLibHandler().StartFatherChallenge(context, challengeIndex);
|
||||
}
|
||||
public static int ModifyFatherChallengeProperty(GroupEventLuaContext context, int challengeId, int propertyTypeIndex, int value){
|
||||
return context.getScriptLibHandler().ModifyFatherChallengeProperty(context, challengeId, propertyTypeIndex, value);
|
||||
}
|
||||
public static int AttachChildChallenge(GroupEventLuaContext context, int fatherChallengeIndex, int childChallengeIndex,
|
||||
int childChallengeId, Object var4Table, Object var5Table, Object var6Table){
|
||||
val conditionArray = context.getEngine().getTable(var4Table);
|
||||
val var5 = context.getEngine().getTable(var5Table);
|
||||
val conditionTable = context.getEngine().getTable(var6Table);
|
||||
return context.getScriptLibHandler().AttachChildChallenge(context, fatherChallengeIndex, childChallengeIndex,
|
||||
childChallengeId, conditionArray, var5, conditionTable);
|
||||
}
|
||||
public static int CreateEffigyChallengeMonster(GroupEventLuaContext context, int var1, Object var2Table){
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().CreateEffigyChallengeMonster(context, var1, var2);
|
||||
}
|
||||
public static int GetEffigyChallengeMonsterLevel(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetEffigyChallengeMonsterLevel(context);
|
||||
}
|
||||
public static int AddTeamEntityGlobalFloatValue(GroupEventLuaContext context, Object sceneUidListTable, String var2, int var3){
|
||||
val sceneUidList = context.getEngine().getTable(sceneUidListTable);
|
||||
return context.getScriptLibHandler().AddTeamEntityGlobalFloatValue(context, sceneUidList, var2, var3);
|
||||
}
|
||||
public static int CreateBlossomChestByGroupId(GroupEventLuaContext context, int groupId, int chestConfigId){
|
||||
return context.getScriptLibHandler().CreateBlossomChestByGroupId(context, groupId, chestConfigId);
|
||||
}
|
||||
public static int GetBlossomScheduleStateByGroupId(GroupEventLuaContext context, int groupId){
|
||||
return context.getScriptLibHandler().GetBlossomScheduleStateByGroupId(context, groupId);
|
||||
}
|
||||
public static int SetBlossomScheduleStateByGroupId(GroupEventLuaContext context, int groupId, int state){
|
||||
return context.getScriptLibHandler().SetBlossomScheduleStateByGroupId(context, groupId, state);
|
||||
}
|
||||
public static int RefreshBlossomGroup(GroupEventLuaContext context, Object rawTable) {
|
||||
val configTable = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().RefreshBlossomGroup(context, configTable);
|
||||
}
|
||||
public static int RefreshBlossomDropRewardByGroupId(GroupEventLuaContext context, int groupId){
|
||||
return context.getScriptLibHandler().RefreshBlossomDropRewardByGroupId(context, groupId);
|
||||
}
|
||||
public static int AddBlossomScheduleProgressByGroupId(GroupEventLuaContext context, int groupId){
|
||||
return context.getScriptLibHandler().AddBlossomScheduleProgressByGroupId(context, groupId);
|
||||
}
|
||||
public static int GetBlossomRefreshTypeByGroupId(GroupEventLuaContext context, int groupId){
|
||||
return context.getScriptLibHandler().GetBlossomRefreshTypeByGroupId(context, groupId);
|
||||
}
|
||||
public static int RefreshHuntingClueGroup(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().RefreshHuntingClueGroup(context);
|
||||
}
|
||||
public static int GetHuntingMonsterExtraSuiteIndexVec(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetHuntingMonsterExtraSuiteIndexVec(context);
|
||||
}
|
||||
public static int SetGroupTempValue(GroupEventLuaContext context, String name, int value, Object var3Table) {
|
||||
val var3 = context.getEngine().getTable(var3Table);
|
||||
return context.getScriptLibHandler().SetGroupTempValue(context, name, value, var3);
|
||||
}
|
||||
public static int GetGroupTempValue(GroupEventLuaContext context, String name, Object var2Table) {
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().GetGroupTempValue(context, name, var2);
|
||||
}
|
||||
|
||||
public static int FinishExpeditionChallenge(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().FinishExpeditionChallenge(context);
|
||||
}
|
||||
public static int ExpeditionChallengeEnterRegion(GroupEventLuaContext context, boolean var1){
|
||||
return context.getScriptLibHandler().ExpeditionChallengeEnterRegion(context, var1);
|
||||
}
|
||||
|
||||
public static int StartSealBattle(GroupEventLuaContext context, int gadgetId, Object var2Table) {
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().StartSealBattle(context, gadgetId, var2);
|
||||
}
|
||||
|
||||
public static int InitTimeAxis(GroupEventLuaContext context, String var1, Object var2Table, boolean var3){
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().InitTimeAxis(context, var1, var2, var3);
|
||||
}
|
||||
public static int EndTimeAxis(GroupEventLuaContext context, String var1){
|
||||
return context.getScriptLibHandler().EndTimeAxis(context, var1);
|
||||
}
|
||||
|
||||
public static int SetTeamEntityGlobalFloatValue(GroupEventLuaContext context, Object sceneUidListTable, String var2, int var3){
|
||||
val sceneUidList = context.getEngine().getTable(sceneUidListTable);
|
||||
return context.getScriptLibHandler().SetTeamEntityGlobalFloatValue(context, sceneUidList, var2, var3);
|
||||
}
|
||||
|
||||
public static int SetTeamServerGlobalValue(GroupEventLuaContext context, int sceneUid, String var2, int var3){
|
||||
return context.getScriptLibHandler().SetTeamServerGlobalValue(context, sceneUid, var2, var3);
|
||||
}
|
||||
|
||||
public static int AddTeamServerGlobalValue(GroupEventLuaContext context, int ownerId, String sgvName, int value){
|
||||
return context.getScriptLibHandler().AddTeamServerGlobalValue(context, ownerId, sgvName, value);
|
||||
}
|
||||
|
||||
public static int GetTeamServerGlobalValue(GroupEventLuaContext context, int ownerId, String sgvName, int value){
|
||||
return context.getScriptLibHandler().GetTeamServerGlobalValue(context, ownerId, sgvName, value);
|
||||
}
|
||||
|
||||
public static int GetLanternRiteValue(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetLanternRiteValue(context);
|
||||
}
|
||||
|
||||
public static int CreateMonsterFaceAvatar(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().CreateMonsterFaceAvatar(context, table);
|
||||
}
|
||||
|
||||
public static int ChangeToTargetLevelTag(GroupEventLuaContext context, int var1){
|
||||
return context.getScriptLibHandler().ChangeToTargetLevelTag(context, var1);
|
||||
}
|
||||
|
||||
public static int AddSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId){
|
||||
return context.getScriptLibHandler().AddSceneTag(context, sceneId, sceneTagId);
|
||||
}
|
||||
|
||||
public static int DelSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId){
|
||||
return context.getScriptLibHandler().DelSceneTag(context, sceneId, sceneTagId);
|
||||
}
|
||||
|
||||
public static boolean CheckSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId){
|
||||
return context.getScriptLibHandler().CheckSceneTag(context, sceneId, sceneTagId);
|
||||
}
|
||||
public static int StartHomeGallery(GroupEventLuaContext context, int galleryId, int uid){
|
||||
return context.getScriptLibHandler().StartHomeGallery(context, galleryId, uid);
|
||||
}
|
||||
|
||||
public static int StartGallery(GroupEventLuaContext context, int galleryId){
|
||||
return context.getScriptLibHandler().StartGallery(context, galleryId);
|
||||
}
|
||||
|
||||
public static int StopGallery(GroupEventLuaContext context, int galleryId, boolean var2){
|
||||
return context.getScriptLibHandler().StopGallery(context, galleryId, var2);
|
||||
}
|
||||
|
||||
public static int UpdatePlayerGalleryScore(GroupEventLuaContext context, int galleryId, Object var2Table) {
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().UpdatePlayerGalleryScore(context, galleryId, var2);
|
||||
}
|
||||
public static int InitGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId, Object progressTable,
|
||||
int scoreUiTypeIndex, int scoreTypeIndex) {
|
||||
val progress = context.getEngine().getTable(progressTable);
|
||||
return context.getScriptLibHandler().InitGalleryProgressScore(context, name, galleryId, progress, scoreUiTypeIndex, scoreTypeIndex);
|
||||
}
|
||||
public static int InitGalleryProgressWithScore(GroupEventLuaContext context, String name, int galleryId, Object progressTable,
|
||||
int maxProgress, int scoreUiTypeIndex, int scoreTypeIndex) {
|
||||
val progress = context.getEngine().getTable(progressTable);
|
||||
return context.getScriptLibHandler().InitGalleryProgressWithScore(context, name, galleryId, progress, maxProgress, scoreUiTypeIndex, scoreTypeIndex);
|
||||
}
|
||||
public static int AddGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId, int score) {
|
||||
return context.getScriptLibHandler().AddGalleryProgressScore(context, name, galleryId, score);
|
||||
}
|
||||
public static int GetGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId) {
|
||||
return context.getScriptLibHandler().GetGalleryProgressScore(context, name, galleryId);
|
||||
}
|
||||
public static int SetHandballGalleryBallPosAndRot(GroupEventLuaContext context, int galleryId, Object positionTable, Object rotationTable){
|
||||
val position = context.getEngine().getTable(positionTable);
|
||||
val rotation = context.getEngine().getTable(rotationTable);
|
||||
return context.getScriptLibHandler().SetHandballGalleryBallPosAndRot(context, galleryId, position, rotation);
|
||||
}
|
||||
|
||||
public static int UnlockFloatSignal(GroupEventLuaContext context, int groupId, int gadgetSignalId){
|
||||
return context.getScriptLibHandler().UnlockFloatSignal(context, groupId, gadgetSignalId);
|
||||
}
|
||||
|
||||
public static int SendServerMessageByLuaKey(GroupEventLuaContext context, String var1, Object var2Table){
|
||||
var var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().SendServerMessageByLuaKey(context, var1, var2);
|
||||
}
|
||||
|
||||
public static int TryReallocateEntityAuthority(GroupEventLuaContext context, int uid, int endConfig, int var3){
|
||||
return context.getScriptLibHandler().TryReallocateEntityAuthority(context, uid, endConfig, var3);
|
||||
}
|
||||
|
||||
public static int ForceRefreshAuthorityByConfigId(GroupEventLuaContext context, int var1, int uid){
|
||||
return context.getScriptLibHandler().ForceRefreshAuthorityByConfigId(context, var1, uid);
|
||||
}
|
||||
|
||||
public static int AddPlayerGroupVisionType(GroupEventLuaContext context, Object uidsTable, Object var2Table){
|
||||
val uids = context.getEngine().getTable(uidsTable);
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().AddPlayerGroupVisionType(context, uids, var2);
|
||||
}
|
||||
|
||||
public static int DelPlayerGroupVisionType(GroupEventLuaContext context, Object uidsTable, Object var2Table){
|
||||
val uids = context.getEngine().getTable(uidsTable);
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().DelPlayerGroupVisionType(context, uids, var2);
|
||||
}
|
||||
|
||||
public static int MoveAvatarByPointArray(GroupEventLuaContext context, int uid, int targetId, Object var3Table, String var4){
|
||||
val var3 = context.getEngine().getTable(var3Table);
|
||||
return context.getScriptLibHandler().MoveAvatarByPointArray(context, uid, targetId, var3, var4);
|
||||
}
|
||||
|
||||
public static int MovePlayerToPos(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().MovePlayerToPos(context, table);
|
||||
}
|
||||
|
||||
public static int TransPlayerToPos(GroupEventLuaContext context, Object rawTable) {
|
||||
val var1 = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().TransPlayerToPos(context, var1);
|
||||
}
|
||||
|
||||
public static int PlayCutScene(GroupEventLuaContext context, int cutsceneId, int var2){
|
||||
return context.getScriptLibHandler().PlayCutScene(context, cutsceneId, var2);
|
||||
}
|
||||
|
||||
public static int PlayCutSceneWithParam(GroupEventLuaContext context, int cutsceneId, int var2, Object var3Table){
|
||||
val var3 = context.getEngine().getTable(var3Table);
|
||||
return context.getScriptLibHandler().PlayCutSceneWithParam(context, cutsceneId, var2, var3);
|
||||
}
|
||||
|
||||
public static int ScenePlaySound(GroupEventLuaContext context, Object soundInfoTable) {
|
||||
val soundInfo = context.getEngine().getTable(soundInfoTable);
|
||||
return context.getScriptLibHandler().ScenePlaySound(context, soundInfo);
|
||||
}
|
||||
|
||||
public static int BeginCameraSceneLook(GroupEventLuaContext context, Object sceneLookParamsTable){
|
||||
val sceneLookParams = context.getEngine().getTable(sceneLookParamsTable);
|
||||
return context.getScriptLibHandler().BeginCameraSceneLook(context, sceneLookParams);
|
||||
}
|
||||
|
||||
public int ClearPlayerEyePoint(GroupEventLuaContext context, int var1){
|
||||
return context.getScriptLibHandler().ClearPlayerEyePoint(context, var1);
|
||||
}
|
||||
|
||||
public static int ShowReminderRadius(GroupEventLuaContext context, int var1, Object var2Table, int var3){
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().ShowReminderRadius(context, var1, var2, var3);
|
||||
}
|
||||
public static int ShowClientGuide(GroupEventLuaContext context, String guideName){
|
||||
return context.getScriptLibHandler().ShowClientGuide(context, guideName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Activates a dungeon checkpoint.
|
||||
* @param context a group event lua context
|
||||
* @param pointId the scene point id of the dungeon checkpoint
|
||||
* @return 0 if successful, 1 if dungeon manager is null, 2 if dungeon manager failed to activate the checkpoint
|
||||
*/
|
||||
public static int ActivateDungeonCheckPoint(GroupEventLuaContext context, int pointId){
|
||||
return context.getScriptLibHandler().ActivateDungeonCheckPoint(context, pointId);
|
||||
}
|
||||
|
||||
public static int SetWeatherAreaState(GroupEventLuaContext context, int var1, int var2){
|
||||
return context.getScriptLibHandler().SetWeatherAreaState(context, var1, var2);
|
||||
}
|
||||
|
||||
public static int EnterWeatherArea(GroupEventLuaContext context, int weatherAreaId){
|
||||
return context.getScriptLibHandler().EnterWeatherArea(context, weatherAreaId);
|
||||
}
|
||||
|
||||
public static boolean CheckIsInMpMode(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().CheckIsInMpMode(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO properly implement
|
||||
* var3 might contain the next point, sometimes is a single int, sometimes multiple ints as array
|
||||
* var4 has RouteType route_type, bool turn_mode
|
||||
*/
|
||||
public static int SetPlatformPointArray(GroupEventLuaContext context, int entityConfigId, int pointArrayId, Object var3Table, Object var4Table){
|
||||
val var3 = context.getEngine().getTable(var3Table);
|
||||
val var4 = context.getEngine().getTable(var4Table);
|
||||
return context.getScriptLibHandler().SetPlatformPointArray(context, entityConfigId, pointArrayId, var3, var4);
|
||||
}
|
||||
|
||||
//TODO check
|
||||
public static int SetPlatformRouteId(GroupEventLuaContext context, int entityConfigId, int routeId){
|
||||
return context.getScriptLibHandler().SetPlatformRouteId(context, entityConfigId, routeId);
|
||||
}
|
||||
|
||||
//TODO check
|
||||
public static int StartPlatform(GroupEventLuaContext context, int configId){
|
||||
return context.getScriptLibHandler().StartPlatform(context, configId);
|
||||
}
|
||||
|
||||
//TODO check
|
||||
public static int StopPlatform(GroupEventLuaContext context, int configId){
|
||||
return context.getScriptLibHandler().StopPlatform(context, configId);
|
||||
}
|
||||
|
||||
public static int CreateChannellerSlabCampRewardGadget(GroupEventLuaContext context, int configId){
|
||||
return context.getScriptLibHandler().CreateChannellerSlabCampRewardGadget(context, configId);
|
||||
}
|
||||
|
||||
public static int AssignPlayerShowTemplateReminder(GroupEventLuaContext context, int var1, Object var2Table){
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().AssignPlayerShowTemplateReminder(context, var1, var2);
|
||||
}
|
||||
|
||||
public static int RevokePlayerShowTemplateReminder(GroupEventLuaContext context, int var1, Object var2Table){
|
||||
val var2 = context.getEngine().getTable(var2Table);
|
||||
return context.getScriptLibHandler().RevokePlayerShowTemplateReminder(context, var1, var2);
|
||||
}
|
||||
|
||||
public static int UnlockForce(GroupEventLuaContext context, int force){
|
||||
return context.getScriptLibHandler().UnlockForce(context, force);
|
||||
}
|
||||
|
||||
public static int LockForce(GroupEventLuaContext context, int force){
|
||||
return context.getScriptLibHandler().LockForce(context, force);
|
||||
}
|
||||
|
||||
public static int KillGroupEntity(GroupEventLuaContext context, Object rawTable) {
|
||||
val table = context.getEngine().getTable(rawTable);
|
||||
return context.getScriptLibHandler().KillGroupEntity(context, table);
|
||||
}
|
||||
|
||||
public static int GetGadgetIdByEntityId(GroupEventLuaContext context, int entityId){
|
||||
return context.getScriptLibHandler().GetGadgetIdByEntityId(context, entityId);
|
||||
}
|
||||
public static int GetMonsterIdByEntityId(GroupEventLuaContext context, int entityId){
|
||||
return context.getScriptLibHandler().GetMonsterIdByEntityId(context, entityId);
|
||||
}
|
||||
public static int GetMonsterConfigId(GroupEventLuaContext context, int entityId){
|
||||
return context.getScriptLibHandler().GetMonsterConfigId(context, entityId);
|
||||
}
|
||||
public static int GetMonsterID(GroupEventLuaContext context, int var1){
|
||||
return context.getScriptLibHandler().GetMonsterID(context, var1);
|
||||
}
|
||||
public static int GetEntityIdByConfigId(GroupEventLuaContext context, int configId){
|
||||
return context.getScriptLibHandler().GetEntityIdByConfigId(context, configId);
|
||||
}
|
||||
public static int GetAvatarEntityIdByUid(GroupEventLuaContext context, int uid){
|
||||
return context.getScriptLibHandler().GetAvatarEntityIdByUid(context, uid);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static Object GetPosByEntityId(GroupEventLuaContext context, int entityId){
|
||||
val pos = context.getScriptLibHandler().GetPosByEntityId(context, entityId);
|
||||
return posToLua(pos, context.getEngine()).getRawTable();
|
||||
}
|
||||
|
||||
public static Object GetRotationByEntityId(GroupEventLuaContext context, int entityId){
|
||||
val rot = context.getScriptLibHandler().GetPosByEntityId(context, entityId);
|
||||
return posToLua(rot, context.getEngine()).getRawTable();
|
||||
}
|
||||
|
||||
public static Object GetActivityOpenAndCloseTimeByScheduleId(GroupEventLuaContext context, int scheduleId){
|
||||
var result = context.getEngine().createTable();
|
||||
var activityConfig = context.getScriptLibHandler().GetActivityOpenAndCloseTimeByScheduleId(context, scheduleId);
|
||||
|
||||
if(activityConfig != null){
|
||||
result.set(1, activityConfig.getOpenTime().getTime());
|
||||
result.set(2, activityConfig.getCloseTime().getTime());
|
||||
}
|
||||
|
||||
return result.getRawTable();
|
||||
}
|
||||
|
||||
public static int GetGameHour(GroupEventLuaContext context){
|
||||
return context.getScriptLibHandler().GetGameHour(context);
|
||||
}
|
||||
|
||||
public static int ActivateGroupLinkBundle(GroupEventLuaContext context, int groupId){
|
||||
return context.getScriptLibHandler().ActivateGroupLinkBundle(context, groupId);
|
||||
}
|
||||
public static int ActivateGroupLinkBundleByBundleId(GroupEventLuaContext context, int bundleId){
|
||||
return context.getScriptLibHandler().ActivateGroupLinkBundleByBundleId(context, bundleId);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param givingId The id if the giving element found in [GivingData]
|
||||
* @param groupId The groupdId of the group containing the gadget
|
||||
* @param gadgetCfgId The gadgets target configId
|
||||
* @return 0 if success, something else if failed
|
||||
*/
|
||||
public static int ActiveGadgetItemGiving(GroupEventLuaContext context, int givingId, int groupId, int gadgetCfgId){
|
||||
return context.getScriptLibHandler().ActiveGadgetItemGiving(context, givingId, groupId, gadgetCfgId);
|
||||
}
|
||||
|
||||
public static int AddChessBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int uid, int pointsToAdd){
|
||||
return context.getScriptLibHandler().AddChessBuildingPoints(context, groupId, param2, uid, pointsToAdd);
|
||||
}
|
||||
|
||||
public static int AddEntityGlobalFloatValueByConfigId(GroupEventLuaContext context, Object param1Table, String param2, int param3){
|
||||
val param1 = context.getEngine().getTable(param1Table);
|
||||
return context.getScriptLibHandler().AddEntityGlobalFloatValueByConfigId(context, param1, param2, param3);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @return
|
||||
*/
|
||||
public static int AddExhibitionAccumulableData(GroupEventLuaContext context, int uid, String param2, int param3){
|
||||
return context.getScriptLibHandler().AddExhibitionAccumulableData(context, uid, param2, param3);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @param param4Table contains the fields "play_type" is part of the enum [ExhibitionPlayType] and "gallery_id"
|
||||
* @return
|
||||
*/
|
||||
public static int AddExhibitionAccumulableDataAfterSuccess(GroupEventLuaContext context, int uid, String param2, int param3, Object param4Table){
|
||||
val param4 = context.getEngine().getTable(param4Table);
|
||||
return context.getScriptLibHandler().AddExhibitionAccumulableDataAfterSuccess(context, uid, param2, param3, param4);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @return
|
||||
*/
|
||||
public static int AddExhibitionReplaceableData(GroupEventLuaContext context, int uid, String param2, int param3){
|
||||
return context.getScriptLibHandler().AddExhibitionReplaceableData(context, uid, param2, param3);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @param param4Table contains the fields "play_type" is part of the enum [ExhibitionPlayType] and "gallery_id"
|
||||
* @return
|
||||
*/
|
||||
public static int AddExhibitionReplaceableDataAfterSuccess(GroupEventLuaContext context, int uid, String param2, int param3, Object param4Table){
|
||||
val param4 = context.getEngine().getTable(param4Table);
|
||||
return context.getScriptLibHandler().AddExhibitionReplaceableDataAfterSuccess(context, uid, param2, param3, param4);
|
||||
}
|
||||
|
||||
public static int AddFleurFairMultistagePlayBuffEnergy(GroupEventLuaContext context, int groupId, int param2, int uid, int bonusId){
|
||||
return context.getScriptLibHandler().AddFleurFairMultistagePlayBuffEnergy(context, groupId, param2, uid, bonusId);
|
||||
}
|
||||
|
||||
public static int AddGadgetPlayProgress(GroupEventLuaContext context, int param1, int param2, int progressChange){
|
||||
return context.getScriptLibHandler().AddGadgetPlayProgress(context, param1, param2, progressChange);
|
||||
}
|
||||
|
||||
public static int AddIrodoriChessBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int points){
|
||||
return context.getScriptLibHandler().AddIrodoriChessBuildingPoints(context, groupId, param2, points);
|
||||
}
|
||||
public static int AddIrodoriChessTowerServerGlobalValue(GroupEventLuaContext context, int groupId, int param2, int param3, int delta){
|
||||
return context.getScriptLibHandler().AddIrodoriChessTowerServerGlobalValue(context, groupId, param2, param3, delta);
|
||||
}
|
||||
public static int AddMechanicusBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int uid, int delta){
|
||||
return context.getScriptLibHandler().AddMechanicusBuildingPoints(context, groupId, param2, uid, delta);
|
||||
}
|
||||
|
||||
public static int AddRegionRecycleProgress(GroupEventLuaContext context, int regionId, int delta){
|
||||
return context.getScriptLibHandler().AddRegionRecycleProgress(context, regionId, delta);
|
||||
}
|
||||
public static int AddRegionSearchProgress(GroupEventLuaContext context, int regionId, int delta){
|
||||
return context.getScriptLibHandler().AddRegionSearchProgress(context, regionId, delta);
|
||||
}
|
||||
public static int AddRegionalPlayVarValue(GroupEventLuaContext context, int uid, int regionId, int delta){
|
||||
return context.getScriptLibHandler().AddRegionalPlayVarValue(context, uid, regionId, delta);
|
||||
}
|
||||
public static int AddSceneMultiStagePlayUidValue(GroupEventLuaContext context, int groupId, int param2, String param3, int uid, int param5){
|
||||
return context.getScriptLibHandler().AddSceneMultiStagePlayUidValue(context, groupId, param2, param3, uid, param5);
|
||||
}
|
||||
public static int AddScenePlayBattleProgress(GroupEventLuaContext context, int groupId, int progress){
|
||||
return context.getScriptLibHandler().AddScenePlayBattleProgress(context, groupId, progress);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param param1Table contains the following fields: param_index:int, param_list:Table, param_uid_list:Table,
|
||||
* duration:int, target_uid_list:Table
|
||||
* @return
|
||||
*/
|
||||
public static int AssignPlayerUidOpNotify(GroupEventLuaContext context, Object param1Table){
|
||||
val param1 = context.getEngine().getTable(param1Table);
|
||||
return context.getScriptLibHandler().AssignPlayerUidOpNotify(context, param1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Methods used in EntityControllers/using ControllerLuaContext
|
||||
*/
|
||||
|
||||
public static int SetGadgetState(ControllerLuaContext<?> context, int gadgetState) {
|
||||
return context.getScriptLibHandler().SetGadgetState(context, gadgetState);
|
||||
}
|
||||
|
||||
public static int GetGadgetState(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetGadgetState(context);
|
||||
}
|
||||
|
||||
public static int ResetGadgetState(ControllerLuaContext<?> context, int gadgetState) {
|
||||
return context.getScriptLibHandler().ResetGadgetState(context, gadgetState);
|
||||
}
|
||||
|
||||
public static int SetGearStartValue(ControllerLuaContext<?> context, int startValue) {
|
||||
return context.getScriptLibHandler().SetGearStartValue(context, startValue);
|
||||
}
|
||||
|
||||
public static int GetGearStartValue(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetGearStartValue(context);
|
||||
}
|
||||
|
||||
public static int SetGearStopValue(ControllerLuaContext<?> context, int startValue) {
|
||||
return context.getScriptLibHandler().SetGearStopValue(context, startValue);
|
||||
}
|
||||
|
||||
public static int GetGearStopValue(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetGearStopValue(context);
|
||||
}
|
||||
|
||||
public static int GetGadgetStateBeginTime(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetGadgetStateBeginTime(context);
|
||||
}
|
||||
|
||||
public static int GetContextGadgetConfigId(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetContextGadgetConfigId(context);
|
||||
}
|
||||
|
||||
public static int GetContextGroupId(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetContextGroupId(context);
|
||||
}
|
||||
|
||||
public static int SetGadgetEnableInteract(ControllerLuaContext<?> context, int groupId, int configId, boolean enable) {
|
||||
return context.getScriptLibHandler().SetGadgetEnableInteract(context, groupId, configId, enable);
|
||||
}
|
||||
|
||||
public static int DropSubfield(ControllerLuaContext<?> context, Object paramsTable) {
|
||||
val params = context.getEngine().getTable(paramsTable);
|
||||
return context.getScriptLibHandler().DropSubfield(context, params);
|
||||
}
|
||||
|
||||
public static int[] GetGatherConfigIdList(ControllerLuaContext<?> context) {
|
||||
return context.getScriptLibHandler().GetGatherConfigIdList(context);
|
||||
}
|
||||
}
|
@ -0,0 +1,402 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib;
|
||||
|
||||
import org.anime_game_servers.gi_lua.models.Position;
|
||||
import org.anime_game_servers.lua.engine.LuaTable;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public interface ScriptLibHandler {
|
||||
|
||||
/**
|
||||
* Context independent functions
|
||||
*/
|
||||
void PrintContextLog(LuaContext context, String msg);
|
||||
|
||||
|
||||
/**
|
||||
* GroupEventLuaContext functions
|
||||
*/
|
||||
|
||||
int SetGadgetStateByConfigId(GroupEventLuaContext context, int configId, int gadgetState);
|
||||
int SetGroupGadgetStateByConfigId(GroupEventLuaContext context, int groupId, int configId, int gadgetState);
|
||||
int SetWorktopOptionsByGroupId(GroupEventLuaContext context, int groupId, int configId, LuaTable options);
|
||||
int SetWorktopOptions(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int DelWorktopOptionByGroupId(GroupEventLuaContext context, int groupId, int configId, int option);
|
||||
int DelWorktopOption(GroupEventLuaContext context, int var1);
|
||||
|
||||
// Some fields are guessed
|
||||
int AutoMonsterTide(GroupEventLuaContext context, int challengeIndex, int groupId, Integer[] ordersConfigId, int tideCount, int sceneLimit, int param6);
|
||||
int GoToGroupSuite(GroupEventLuaContext context, int groupId, int suite);
|
||||
|
||||
int AddExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite);
|
||||
int RemoveExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite);
|
||||
int KillExtraGroupSuite(GroupEventLuaContext context, int groupId, int suite);
|
||||
|
||||
int AddExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy);
|
||||
int RemoveExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy);
|
||||
int KillExtraFlowSuite(GroupEventLuaContext context, int groupId, int suiteId, int flowSuitePolicy);
|
||||
|
||||
int ActiveChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, int timeLimitOrGroupId, int groupId, int objectiveKills, int param5);
|
||||
|
||||
int StartChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, LuaTable challengeParams);
|
||||
|
||||
int StopChallenge(GroupEventLuaContext context, int challengeIndex, int result);
|
||||
|
||||
/**
|
||||
* Adds or removed time from the challenge
|
||||
* TODO verify and implement
|
||||
* @param context
|
||||
* @param challengeId The active target challenges id
|
||||
* @param duration The duration to add or remove
|
||||
* @return 0 if success, 1 if no challenge is active, 2 if the challenge id doesn't match the active challenge,
|
||||
* 3 if modifying the duration failed
|
||||
*/
|
||||
int AddChallengeDuration(GroupEventLuaContext context, int challengeId, int duration);
|
||||
|
||||
int GetGroupMonsterCountByGroupId(GroupEventLuaContext context, int groupId);
|
||||
|
||||
int CreateVariable(GroupEventLuaContext context, String type, LuaTable value);
|
||||
int SetVariableValue(GroupEventLuaContext context, int var1);
|
||||
int GetVariableValue(GroupEventLuaContext context, int var1);
|
||||
|
||||
int GetGroupVariableValue(GroupEventLuaContext context, String var);
|
||||
|
||||
int GetGroupVariableValueByGroup(GroupEventLuaContext context, String name, int groupId);
|
||||
|
||||
int SetGroupVariableValue(GroupEventLuaContext context, String varName, int value);
|
||||
|
||||
int SetGroupVariableValueByGroup(GroupEventLuaContext context, String key, int value, int groupId);
|
||||
|
||||
int ChangeGroupVariableValue(GroupEventLuaContext context, String varName, int value);
|
||||
|
||||
int ChangeGroupVariableValueByGroup(GroupEventLuaContext context, String name, int value, int groupId);
|
||||
|
||||
|
||||
/**
|
||||
* Set the actions and triggers to designated group
|
||||
*/
|
||||
int RefreshGroup(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int GetRegionEntityCount(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int GetRegionConfigId(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int TowerCountTimeStatus(GroupEventLuaContext context, int isDone, int var2);
|
||||
int GetGroupMonsterCount(GroupEventLuaContext context);
|
||||
|
||||
int SetMonsterBattleByGroup(GroupEventLuaContext context, int configId, int groupId);
|
||||
|
||||
int CauseDungeonFail(GroupEventLuaContext context);
|
||||
|
||||
int SetEntityServerGlobalValueByConfigId(GroupEventLuaContext context, int cfgId, String sgvName, int value);
|
||||
|
||||
int SetGroupLogicStateValue(GroupEventLuaContext context, String sgvName, int value);
|
||||
|
||||
int SetIsAllowUseSkill(GroupEventLuaContext context, int canUse);
|
||||
|
||||
int KillEntityByConfigId(LuaContext context, LuaTable table);
|
||||
|
||||
int CreateMonster(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int TowerMirrorTeamSetUp(GroupEventLuaContext context, int team, int var1) ;
|
||||
|
||||
int CreateGadget(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int CheckRemainGadgetCountByGroupId(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int GetGadgetStateByConfigId(GroupEventLuaContext context, int groupId, int configId);
|
||||
|
||||
int MarkPlayerAction(GroupEventLuaContext context, int var1, int var2, int var3);
|
||||
int AddQuestProgress(GroupEventLuaContext context, String eventNotifyName);
|
||||
|
||||
/**
|
||||
* change the state of gadget
|
||||
*/
|
||||
int ChangeGroupGadget(GroupEventLuaContext context, LuaTable table) ;
|
||||
|
||||
int GetSceneOwnerUid(GroupEventLuaContext context);
|
||||
int GetHostQuestState(GroupEventLuaContext context, int questId);
|
||||
int GetQuestState(GroupEventLuaContext context, int entityId, int questId);
|
||||
int ShowReminder(GroupEventLuaContext context, int reminderId);
|
||||
int RemoveEntityByConfigId(GroupEventLuaContext context, int groupId, int entityType, int configId);
|
||||
int CreateGroupTimerEvent(GroupEventLuaContext context, int groupID, String source, double time);
|
||||
int CancelGroupTimerEvent(GroupEventLuaContext context, int groupID, String source);
|
||||
|
||||
int GetGroupSuite(GroupEventLuaContext context, int groupId);
|
||||
int SetGroupReplaceable(GroupEventLuaContext context, int groupId, boolean value) ;
|
||||
Object GetSceneUidList(GroupEventLuaContext context);
|
||||
int GetSeaLampActivityPhase(GroupEventLuaContext context);
|
||||
int GadgetPlayUidOp(GroupEventLuaContext context, int groupId, int gadget_crucible, int var3, int var4, String var5, int var6 );
|
||||
long GetServerTime(GroupEventLuaContext context);
|
||||
long GetServerTimeByWeek(GroupEventLuaContext context);
|
||||
int GetCurTriggerCount(GroupEventLuaContext context);
|
||||
int GetChannellerSlabLoopDungeonLimitTime(GroupEventLuaContext context);
|
||||
boolean IsPlayerAllAvatarDie(GroupEventLuaContext context, int sceneUid);
|
||||
|
||||
int sendShowCommonTipsToClient(GroupEventLuaContext context, String title, String content, int closeTime);
|
||||
|
||||
int sendCloseCommonTipsToClient(GroupEventLuaContext context);
|
||||
int CreateFatherChallenge(GroupEventLuaContext context, int challengeIndex, int challengeId, int timeLimit, LuaTable conditionTable);
|
||||
int StartFatherChallenge(GroupEventLuaContext context, int challengeIndex);
|
||||
int ModifyFatherChallengeProperty(GroupEventLuaContext context, int challengeId, int propertyTypeIndex, int value);
|
||||
int AttachChildChallenge(GroupEventLuaContext context, int fatherChallengeIndex, int childChallengeIndex,
|
||||
int childChallengeId, LuaTable var4, LuaTable var5, LuaTable var6);
|
||||
int CreateEffigyChallengeMonster(GroupEventLuaContext context, int var1, LuaTable var2Table);
|
||||
int GetEffigyChallengeMonsterLevel(GroupEventLuaContext context);
|
||||
int AddTeamEntityGlobalFloatValue(GroupEventLuaContext context, LuaTable sceneUidListTable, String var2, int var3);
|
||||
int CreateBlossomChestByGroupId(GroupEventLuaContext context, int groupId, int chestConfigId);
|
||||
int GetBlossomScheduleStateByGroupId(GroupEventLuaContext context, int groupId);
|
||||
int SetBlossomScheduleStateByGroupId(GroupEventLuaContext context, int groupId, int state);
|
||||
int RefreshBlossomGroup(GroupEventLuaContext context, LuaTable table);
|
||||
int RefreshBlossomDropRewardByGroupId(GroupEventLuaContext context, int groupId);
|
||||
int AddBlossomScheduleProgressByGroupId(GroupEventLuaContext context, int groupId);
|
||||
int GetBlossomRefreshTypeByGroupId(GroupEventLuaContext context, int groupId);
|
||||
int RefreshHuntingClueGroup(GroupEventLuaContext context);
|
||||
int GetHuntingMonsterExtraSuiteIndexVec(GroupEventLuaContext context);
|
||||
int SetGroupTempValue(GroupEventLuaContext context, String name, int value, LuaTable var3Table);
|
||||
int GetGroupTempValue(GroupEventLuaContext context, String name, LuaTable var2);
|
||||
|
||||
int FinishExpeditionChallenge(GroupEventLuaContext context);
|
||||
int ExpeditionChallengeEnterRegion(GroupEventLuaContext context, boolean var1);
|
||||
int StartSealBattle(GroupEventLuaContext context, int gadgetId, LuaTable var2);
|
||||
|
||||
int InitTimeAxis(GroupEventLuaContext context, String var1, LuaTable var2, boolean var3);
|
||||
int EndTimeAxis(GroupEventLuaContext context, String var1);
|
||||
|
||||
int SetTeamEntityGlobalFloatValue(GroupEventLuaContext context, LuaTable sceneUidListTable, String var2, int var3);
|
||||
|
||||
int SetTeamServerGlobalValue(GroupEventLuaContext context, int sceneUid, String var2, int var3);
|
||||
|
||||
int AddTeamServerGlobalValue(GroupEventLuaContext context, int ownerId, String sgvName, int value);
|
||||
|
||||
int GetTeamServerGlobalValue(GroupEventLuaContext context, int ownerId, String sgvName, int value);
|
||||
|
||||
int GetLanternRiteValue(GroupEventLuaContext context);
|
||||
|
||||
int CreateMonsterFaceAvatar(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int ChangeToTargetLevelTag(GroupEventLuaContext context, int var1);
|
||||
|
||||
int AddSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId);
|
||||
|
||||
int DelSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId);
|
||||
|
||||
boolean CheckSceneTag(GroupEventLuaContext context, int sceneId, int sceneTagId);
|
||||
int StartHomeGallery(GroupEventLuaContext context, int galleryId, int uid);
|
||||
|
||||
int StartGallery(GroupEventLuaContext context, int galleryId);
|
||||
|
||||
int StopGallery(GroupEventLuaContext context, int galleryId, boolean var2);
|
||||
|
||||
int UpdatePlayerGalleryScore(GroupEventLuaContext context, int galleryId, LuaTable var2);
|
||||
int InitGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId, LuaTable progressTable,
|
||||
int scoreUiTypeIndex, int scoreTypeIndex);
|
||||
int InitGalleryProgressWithScore(GroupEventLuaContext context, String name, int galleryId, LuaTable progress,
|
||||
int maxProgress, int scoreUiTypeIndex, int scoreTypeIndex);
|
||||
int AddGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId, int score);
|
||||
int GetGalleryProgressScore(GroupEventLuaContext context, String name, int galleryId) ;
|
||||
int SetHandballGalleryBallPosAndRot(GroupEventLuaContext context, int galleryId, LuaTable positionTable, LuaTable rotationTable);
|
||||
|
||||
int UnlockFloatSignal(GroupEventLuaContext context, int groupId, int gadgetSignalId);
|
||||
|
||||
int SendServerMessageByLuaKey(GroupEventLuaContext context, String var1, LuaTable var2);
|
||||
|
||||
int TryReallocateEntityAuthority(GroupEventLuaContext context, int uid, int endConfig, int var3);
|
||||
|
||||
int ForceRefreshAuthorityByConfigId(GroupEventLuaContext context, int var1, int uid);
|
||||
|
||||
int AddPlayerGroupVisionType(GroupEventLuaContext context, LuaTable uidsTable, LuaTable var2);
|
||||
|
||||
int DelPlayerGroupVisionType(GroupEventLuaContext context, LuaTable uidsTable, LuaTable var2);
|
||||
|
||||
int MoveAvatarByPointArray(GroupEventLuaContext context, int uid, int targetId, LuaTable var3, String var4);
|
||||
|
||||
int MovePlayerToPos(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int TransPlayerToPos(GroupEventLuaContext context, LuaTable table);
|
||||
|
||||
int PlayCutScene(GroupEventLuaContext context, int cutsceneId, int var2);
|
||||
|
||||
int PlayCutSceneWithParam(GroupEventLuaContext context, int cutsceneId, int var2, LuaTable var3);
|
||||
|
||||
int ScenePlaySound(GroupEventLuaContext context, LuaTable soundInfoTable);
|
||||
|
||||
int BeginCameraSceneLook(GroupEventLuaContext context, LuaTable sceneLookParamsTable);
|
||||
|
||||
public int ClearPlayerEyePoint(GroupEventLuaContext context, int var1);
|
||||
|
||||
int ShowReminderRadius(GroupEventLuaContext context, int var1, LuaTable var2, int var3);
|
||||
int ShowClientGuide(GroupEventLuaContext context, String guideName);
|
||||
|
||||
/**
|
||||
* Activates a dungeon checkpoint.
|
||||
* @param context a group event lua context
|
||||
* @param pointId the scene point id of the dungeon checkpoint
|
||||
* @return 0 if successful, 1 if dungeon manager is null, 2 if dungeon manager failed to activate the checkpoint
|
||||
*/
|
||||
int ActivateDungeonCheckPoint(GroupEventLuaContext context, int pointId);
|
||||
|
||||
//TODO check
|
||||
int SetWeatherAreaState(GroupEventLuaContext context, int var1, int var2);
|
||||
|
||||
int EnterWeatherArea(GroupEventLuaContext context, int weatherAreaId);
|
||||
|
||||
//TODO check
|
||||
boolean CheckIsInMpMode(GroupEventLuaContext context);
|
||||
|
||||
/**
|
||||
* TODO properly implement
|
||||
* var3 might contain the next point, sometimes is a single int, sometimes multiple ints as array
|
||||
* var4 has RouteType route_type, bool turn_mode
|
||||
*/
|
||||
int SetPlatformPointArray(GroupEventLuaContext context, int entityConfigId, int pointArrayId, LuaTable var3, LuaTable var4);
|
||||
|
||||
//TODO check
|
||||
int SetPlatformRouteId(GroupEventLuaContext context, int entityConfigId, int routeId);
|
||||
|
||||
//TODO check
|
||||
int StartPlatform(GroupEventLuaContext context, int configId);
|
||||
|
||||
//TODO check
|
||||
int StopPlatform(GroupEventLuaContext context, int configId);
|
||||
|
||||
int CreateChannellerSlabCampRewardGadget(GroupEventLuaContext context, int configId);
|
||||
|
||||
int AssignPlayerShowTemplateReminder(GroupEventLuaContext context, int var1, LuaTable var2);
|
||||
|
||||
int RevokePlayerShowTemplateReminder(GroupEventLuaContext context, int var1, LuaTable var2);
|
||||
|
||||
int UnlockForce(GroupEventLuaContext context, int force);
|
||||
|
||||
int LockForce(GroupEventLuaContext context, int force);
|
||||
|
||||
int KillGroupEntity(GroupEventLuaContext context, LuaTable table);
|
||||
int GetGadgetIdByEntityId(GroupEventLuaContext context, int entityId);
|
||||
int GetMonsterIdByEntityId(GroupEventLuaContext context, int entityId);
|
||||
int GetMonsterConfigId(GroupEventLuaContext context, int entityId);
|
||||
int GetMonsterID(GroupEventLuaContext context, int var1);
|
||||
int GetEntityIdByConfigId(GroupEventLuaContext context, int configId);
|
||||
int GetAvatarEntityIdByUid(GroupEventLuaContext context, int uid);
|
||||
|
||||
|
||||
Position GetPosByEntityId(GroupEventLuaContext context, int entityId);
|
||||
|
||||
Position GetRotationByEntityId(GroupEventLuaContext context, int entityId);
|
||||
|
||||
ActivityOpenAndCloseTime GetActivityOpenAndCloseTimeByScheduleId(GroupEventLuaContext context, int scheduleId);
|
||||
|
||||
int GetGameHour(GroupEventLuaContext context);
|
||||
|
||||
int ActivateGroupLinkBundle(GroupEventLuaContext context, int groupId);
|
||||
int ActivateGroupLinkBundleByBundleId(GroupEventLuaContext context, int bundleId);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param givingId The id if the giving element found in [GivingData]
|
||||
* @param groupId The groupdId of the group containing the gadget
|
||||
* @param gadgetCfgId The gadgets target configId
|
||||
* @return 0 if success, something else if failed
|
||||
*/
|
||||
int ActiveGadgetItemGiving(GroupEventLuaContext context, int givingId, int groupId, int gadgetCfgId);
|
||||
|
||||
int AddChessBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int uid, int pointsToAdd);
|
||||
|
||||
int AddEntityGlobalFloatValueByConfigId(GroupEventLuaContext context, Object param1Table, String param2, int param3);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @return
|
||||
*/
|
||||
int AddExhibitionAccumulableData(GroupEventLuaContext context, int uid, String param2, int param3);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @param param4 contains the fields "play_type" is part of the enum [ExhibitionPlayType] and "gallery_id"
|
||||
* @return
|
||||
*/
|
||||
int AddExhibitionAccumulableDataAfterSuccess(GroupEventLuaContext context, int uid, String param2, int param3, LuaTable param4);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @return
|
||||
*/
|
||||
int AddExhibitionReplaceableData(GroupEventLuaContext context, int uid, String param2, int param3);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param uid
|
||||
* @param param2 probably the name of the data field
|
||||
* @param param3
|
||||
* @param param4 contains the fields "play_type" is part of the enum [ExhibitionPlayType] and "gallery_id"
|
||||
* @return
|
||||
*/
|
||||
int AddExhibitionReplaceableDataAfterSuccess(GroupEventLuaContext context, int uid, String param2, int param3, LuaTable param4);
|
||||
|
||||
int AddFleurFairMultistagePlayBuffEnergy(GroupEventLuaContext context, int groupId, int param2, int uid, int bonusId);
|
||||
|
||||
int AddGadgetPlayProgress(GroupEventLuaContext context, int param1, int param2, int progressChange);
|
||||
|
||||
int AddIrodoriChessBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int points);
|
||||
int AddIrodoriChessTowerServerGlobalValue(GroupEventLuaContext context, int groupId, int param2, int param3, int delta);
|
||||
int AddMechanicusBuildingPoints(GroupEventLuaContext context, int groupId, int param2, int uid, int delta);
|
||||
|
||||
int AddRegionRecycleProgress(GroupEventLuaContext context, int regionId, int delta);
|
||||
int AddRegionSearchProgress(GroupEventLuaContext context, int regionId, int delta);
|
||||
int AddRegionalPlayVarValue(GroupEventLuaContext context, int uid, int regionId, int delta);
|
||||
int AddSceneMultiStagePlayUidValue(GroupEventLuaContext context, int groupId, int param2, String param3, int uid, int param5);
|
||||
int AddScenePlayBattleProgress(GroupEventLuaContext context, int groupId, int progress);
|
||||
|
||||
/**
|
||||
* TODO implement
|
||||
* @param context
|
||||
* @param param1Table contains the following fields: param_index:int, param_list:Table, param_uid_list:Table,
|
||||
* duration:int, target_uid_list:Table
|
||||
* @return
|
||||
*/
|
||||
int AssignPlayerUidOpNotify(GroupEventLuaContext context, LuaTable param1Table);
|
||||
|
||||
|
||||
/**
|
||||
* Methods used in EntityControllers/using ControllerLuaContext
|
||||
*/
|
||||
|
||||
int SetGadgetState(ControllerLuaContext context, int gadgetState);
|
||||
|
||||
int GetGadgetState(ControllerLuaContext context);
|
||||
|
||||
int ResetGadgetState(ControllerLuaContext context, int gadgetState) ;
|
||||
|
||||
int SetGearStartValue(ControllerLuaContext context, int startValue);
|
||||
|
||||
int GetGearStartValue(ControllerLuaContext context);
|
||||
|
||||
int SetGearStopValue(ControllerLuaContext context, int startValue);
|
||||
|
||||
int GetGearStopValue(ControllerLuaContext context) ;
|
||||
|
||||
int GetGadgetStateBeginTime(ControllerLuaContext context);
|
||||
|
||||
int GetContextGadgetConfigId(ControllerLuaContext context) ;
|
||||
|
||||
int GetContextGroupId(ControllerLuaContext context);
|
||||
|
||||
int SetGadgetEnableInteract(ControllerLuaContext context, int groupId, int configId, boolean enable);
|
||||
|
||||
int DropSubfield(ControllerLuaContext context, LuaTable paramsTable);
|
||||
|
||||
int[] GetGatherConfigIdList(ControllerLuaContext context);
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.anime_game_servers.gi_lua.script_lib;
|
||||
|
||||
public interface ScriptLibStaticHandler {
|
||||
void PrintLog(String msg);
|
||||
int GetEntityType(int entityId);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package org.anime_game_servers.gi_lua.utils;
|
||||
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
|
||||
public interface GIScriptLoader {
|
||||
LuaScript getSceneScript(int sceneId, String scriptName, ScriptType scriptType);
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package org.anime_game_servers.gi_lua.utils;
|
||||
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.gi_lua.models.Position;
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
import org.anime_game_servers.lua.engine.LuaTable;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class ScriptUtils {
|
||||
|
||||
public static LuaTable posToLua(Position position, LuaEngine engine){
|
||||
var result = engine.createTable();
|
||||
if(position != null){
|
||||
result.set("x", position.getX());
|
||||
result.set("y", position.getY());
|
||||
result.set("z", position.getZ());
|
||||
} else {
|
||||
result.set("x", 0);
|
||||
result.set("y", 0);
|
||||
result.set("z", 0);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Position luaToPos(LuaTable position){
|
||||
val result = new Position();
|
||||
if(position != null){
|
||||
result.setX(position.optInt("x", 0));
|
||||
result.setY(position.optInt("y", 0));
|
||||
result.setZ(position.optInt("z", 0));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
37
JNLuaEngine/build.gradle.kts
Normal file
37
JNLuaEngine/build.gradle.kts
Normal file
@ -0,0 +1,37 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("java-library")
|
||||
kotlin("jvm") version "1.9.10"
|
||||
}
|
||||
|
||||
group = "org.anime_game_servers"
|
||||
version = "1.0-SNAPSHOT"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
implementation(project(":BaseLua"))
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("org.anime_game_servers:JNLua_GC:0.1.0")
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
compileOnly("org.projectlombok:lombok:1.18.30")
|
||||
annotationProcessor("org.projectlombok:lombok:1.18.30")
|
||||
implementation("com.esotericsoftware:reflectasm:1.11.9")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
val compileKotlin: KotlinCompile by tasks
|
||||
compileKotlin.kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
val compileTestKotlin: KotlinCompile by tasks
|
||||
compileTestKotlin.kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.val;
|
||||
import org.terasology.jnlua.Converter;
|
||||
import org.terasology.jnlua.DefaultConverter;
|
||||
import org.terasology.jnlua.LuaState;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class JNLuaConverter implements Converter {
|
||||
@Getter private static final JNLuaConverter INSTANCE = new JNLuaConverter();
|
||||
final Converter defaultConverter = DefaultConverter.getInstance();
|
||||
@Override
|
||||
public int getTypeDistance(LuaState luaState, int i, Class<?> aClass) {
|
||||
return defaultConverter.getTypeDistance(luaState, i, aClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T convertLuaValue(LuaState luaState, int i, Class<T> aClass) {
|
||||
return defaultConverter.convertLuaValue(luaState, i, aClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertJavaObject(LuaState luaState, Object o) {
|
||||
if (o instanceof Map<?, ?> fields) {
|
||||
val first = fields.entrySet().stream().findFirst();
|
||||
if (first.isPresent() && first.get().getKey() instanceof String && first.get().getValue() instanceof Integer) {
|
||||
luaState.newTable();
|
||||
for (var entry : fields.entrySet()) {
|
||||
luaState.pushInteger((Integer) entry.getValue());
|
||||
luaState.setField(-2, (String) entry.getKey());
|
||||
}
|
||||
return;
|
||||
}
|
||||
} /*else if (o instanceof ScriptLib lib) {
|
||||
luaState.newTable();
|
||||
val methods = lib.getClass().getMethods();
|
||||
Arrays.stream(methods).forEach(m -> {
|
||||
val isStatic = Modifier.isStatic(m.getModifiers());
|
||||
class TempFunc implements NamedJavaFunction {
|
||||
@Override
|
||||
public String getName() {
|
||||
return m.getName();
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public int invoke(LuaState luaState) {
|
||||
var argSize = luaState.getTop();
|
||||
List<Object> args = new ArrayList<>();
|
||||
for (int i = 0; i < argSize; ++i) {
|
||||
args.add(luaState.checkJavaObject(i + 1, Object.class));
|
||||
}
|
||||
try {
|
||||
Object caller = isStatic ? null : o;
|
||||
Object ret = m.invoke(caller, args.toArray());
|
||||
luaState.pushJavaObject(ret);
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Error on invoking binding function. ", e);
|
||||
throw e;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
val func = new TempFunc();
|
||||
luaState.pushJavaFunction(func);
|
||||
luaState.setField(-2, func.getName());
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}*/
|
||||
defaultConverter.convertJavaObject(luaState, o);
|
||||
}
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.engine.LuaTable;
|
||||
import org.anime_game_servers.lua.models.IntValueEnum;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
import org.anime_game_servers.lua.serialize.Serializer;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.terasology.jnlua.JavaFunction;
|
||||
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import javax.script.SimpleBindings;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class JNLuaEngine implements LuaEngine {
|
||||
@Getter
|
||||
private final ScriptEngineManager manager;
|
||||
@Getter(onMethod = @__(@Override))
|
||||
private final JNLuaSerializer serializer;
|
||||
@Getter
|
||||
private final SimpleBindings bindings;
|
||||
|
||||
public JNLuaEngine() {
|
||||
manager = new ScriptEngineManager();
|
||||
bindings = new SimpleBindings();
|
||||
this.serializer = new JNLuaSerializer();
|
||||
|
||||
bindings.put("print", (JavaFunction) luaState -> {
|
||||
//logger.debug("[LUA] print {} ", luaState.checkString(1));
|
||||
return 1;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Enum<T>> boolean addGlobalEnumByOrdinal(String name, T[] enumArray) {
|
||||
Map<String, Integer> table = new HashMap<>();
|
||||
Arrays.stream(enumArray).forEach(e -> {
|
||||
table.put(e.name(), e.ordinal());
|
||||
table.put(e.name().toUpperCase(), e.ordinal());
|
||||
});
|
||||
bindings.put(name, table);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Enum<T> & IntValueEnum> boolean addGlobalEnumByIntValue(String name, T[] enumArray) {
|
||||
Map<String, Integer> table = new HashMap<>();
|
||||
Arrays.stream(enumArray).forEach(e -> {
|
||||
table.put(e.name(), e.getValue());
|
||||
table.put(e.name().toUpperCase(), e.getValue());
|
||||
});
|
||||
bindings.put(name, table);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addGlobalStaticClass(String name, Class<?> staticClass) {
|
||||
try {
|
||||
bindings.put(name, staticClass.getConstructor().newInstance());
|
||||
return true;
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
|
||||
NoSuchMethodException e) {
|
||||
//logger.error("Failed to add static class to lua engine: " + name, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addObject(String name, Object object) {
|
||||
bindings.put(name, object);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LuaScript getScript(String scriptName, ScriptType scriptType) {
|
||||
final Path scriptPath = scriptFinder.getScriptPath(scriptName);
|
||||
if (!Files.exists(scriptPath)) return null;
|
||||
|
||||
try {
|
||||
return new JNLuaScript(this, scriptPath, scriptType);
|
||||
} catch (IOException | ScriptException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable getTable(Object table) {
|
||||
return new JNLuaTable((AbstractMap<?, ?>) table);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable createTable() {
|
||||
return new JNLuaTable(new HashMap<>());
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import lombok.val;
|
||||
import org.terasology.jnlua.LuaState;
|
||||
import org.terasology.jnlua.NamedJavaFunction;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
import static org.anime_game_servers.lua.engine.LuaEngine.scriptFinder;
|
||||
|
||||
public class JNLuaRequireCommonFunction implements NamedJavaFunction {
|
||||
public static final JNLuaRequireCommonFunction INSTANCE = new JNLuaRequireCommonFunction();
|
||||
@Override
|
||||
public int invoke(LuaState luaState) {
|
||||
val requiredName = luaState.checkString(1);
|
||||
luaState.remove(1);
|
||||
val path = "Common/" + requiredName + ".lua";
|
||||
val includePath = scriptFinder.getScriptPath(path);
|
||||
if (!Files.exists(includePath)) {
|
||||
//LuaEngine.logger.error("Require script not found. {}", path);
|
||||
return 1;
|
||||
}
|
||||
try {
|
||||
val includeScript = Files.newInputStream(includePath);
|
||||
luaState.load(includeScript, requiredName, "t");
|
||||
luaState.call(0, 0);
|
||||
} catch (IOException e) {
|
||||
//LuaEngine.logger.error("Error on loading require script. {}", path, e);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "require";
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.engine.LuaValue;
|
||||
import org.anime_game_servers.lua.models.BooleanLuaValue;
|
||||
import org.anime_game_servers.lua.models.IntLuaValue;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.terasology.jnlua.script.CompiledLuaScript;
|
||||
import org.terasology.jnlua.script.LuaBindings;
|
||||
import org.terasology.jnlua.script.LuaScriptEngine;
|
||||
|
||||
import javax.script.*;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class JNLuaScript implements LuaScript {
|
||||
|
||||
final Reader scriptReader;
|
||||
@Nullable
|
||||
private final CompiledLuaScript compiledScript;
|
||||
private final LuaBindings binding;
|
||||
private final JNLuaEngine engine;
|
||||
private final LuaScriptEngine scriptEngine;
|
||||
SimpleScriptContext context = new SimpleScriptContext();
|
||||
|
||||
JNLuaScript(JNLuaEngine engine, Path scriptPath, ScriptType scriptType) throws ScriptException, IOException {
|
||||
this.engine = engine;
|
||||
this.scriptEngine = (LuaScriptEngine) engine.getManager().getEngineByName("jnlua");
|
||||
if(scriptType.getAddDefaultGlobals()) {
|
||||
context.setBindings(engine.getBindings(), ScriptContext.GLOBAL_SCOPE);
|
||||
}
|
||||
this.binding = (LuaBindings) scriptEngine.createBindings();
|
||||
context.setBindings(binding, ScriptContext.ENGINE_SCOPE);
|
||||
val luaState = binding.getLuaState();
|
||||
luaState.setConverter(JNLuaConverter.getINSTANCE());
|
||||
|
||||
val requireFunction = JNLuaRequireCommonFunction.INSTANCE;
|
||||
binding.put(requireFunction.getName(), requireFunction);
|
||||
scriptReader = Files.newBufferedReader(scriptPath);
|
||||
if(scriptType.getPrecompile()) {
|
||||
this.compiledScript = (CompiledLuaScript) ((Compilable) scriptEngine).compile(scriptReader);
|
||||
} else {
|
||||
this.compiledScript = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasMethod(@NotNull String methodName) {
|
||||
return binding.containsKey(methodName);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LuaValue callMethod(@NotNull String methodName, Object... args) throws ScriptException, NoSuchMethodException {
|
||||
val result = ((Invocable) scriptEngine).invokeFunction(methodName, args);
|
||||
if (result instanceof Boolean) {
|
||||
return ((Boolean) result) ? BooleanLuaValue.TRUE : BooleanLuaValue.FALSE;
|
||||
} else if (result instanceof Integer) {
|
||||
return new IntLuaValue((Integer) result);
|
||||
}
|
||||
//TODO
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void evaluate() throws ScriptException {
|
||||
if(compiledScript != null) {
|
||||
compiledScript.eval(context);
|
||||
} else {
|
||||
scriptEngine.eval(scriptReader, context);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getGlobalVariable(String name, Class<T> type) {
|
||||
return engine.getSerializer().toObject(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> List<T> getGlobalVariableList(String name, Class<T> type) {
|
||||
return engine.getSerializer().toList(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Map<String, T> getGlobalVariableMap(String name, Class<T> type) {
|
||||
return engine.getSerializer().toMap(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaEngine getEngine() {
|
||||
return engine;
|
||||
}
|
||||
}
|
@ -0,0 +1,208 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import org.anime_game_servers.lua.serialize.BaseSerializer;
|
||||
import org.terasology.jnlua.LuaValueProxy;
|
||||
import org.terasology.jnlua.util.AbstractTableMap;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
public class JNLuaSerializer extends BaseSerializer {
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
public static Integer getInt(Object value) {
|
||||
if (value instanceof Integer l) {
|
||||
return l.intValue();
|
||||
} else if (value instanceof Double d) {
|
||||
return d.intValue();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static Float getFloat(Object value) {
|
||||
if (value instanceof Double l) {
|
||||
return l.floatValue();
|
||||
} else if (value instanceof Integer l) {
|
||||
return l.floatValue();
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
// ...
|
||||
@Override
|
||||
public <T> List<T> toList(Class<T> type, Object obj) {
|
||||
return serializeList(type, (LuaValueProxy) obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toObject(Class<T> type, Object obj) {
|
||||
return serialize(type, null, (LuaValueProxy) obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Map<String, T> toMap(Class<T> type, Object obj) {
|
||||
return serializeMap(type, (LuaValueProxy) obj);
|
||||
}
|
||||
|
||||
private <T> T objectToClass(Class<T> type, Object value) {
|
||||
T object = null;
|
||||
|
||||
if (value instanceof Integer) {
|
||||
object = (T) getInt(value);
|
||||
} else if (value instanceof Double) {
|
||||
object = (T) getFloat(value);
|
||||
} else if (value instanceof String) {
|
||||
object = (T) value;
|
||||
} else if (value instanceof Boolean) {
|
||||
object = (T) value;
|
||||
} else {
|
||||
object = serialize(type, null, (LuaValueProxy) value);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
public <T> List<T> serializeList(Class<T> type, LuaValueProxy table) {
|
||||
List<T> list = new ArrayList<>();
|
||||
|
||||
if (table == null) {
|
||||
return list;
|
||||
}
|
||||
|
||||
var tableObj = (Map<String, Object>) table;
|
||||
try {
|
||||
for (var k : tableObj.entrySet()) {
|
||||
try {
|
||||
var keyValue = k.getValue();
|
||||
|
||||
T object = objectToClass(type, keyValue);
|
||||
|
||||
if (object != null) {
|
||||
list.add(object);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception serializing list", e);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
private Class<?> getListType(Class<?> type, @Nullable Field field){
|
||||
if(field == null){
|
||||
return type.getTypeParameters()[0].getClass();
|
||||
}
|
||||
Type fieldType = field.getGenericType();
|
||||
if(fieldType instanceof ParameterizedType){
|
||||
return (Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public <T> T serialize(Class<T> type, @Nullable Field field, LuaValueProxy table) {
|
||||
T object = null;
|
||||
|
||||
if (type == List.class) {
|
||||
try {
|
||||
Class<?> listType = getListType(type, field);
|
||||
return (T) serializeList(listType, table);
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception serializing", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (!fieldMetaCache.containsKey(type)) {
|
||||
cacheType(type);
|
||||
}
|
||||
var methodAccess = methodAccessCache.get(type);
|
||||
var fieldMetaMap = fieldMetaCache.get(type);
|
||||
|
||||
object = (T) constructorCache.get(type).newInstance();
|
||||
|
||||
if (table == null) {
|
||||
return object;
|
||||
}
|
||||
|
||||
var tableObj = (AbstractTableMap<String>) table;
|
||||
for (var k : tableObj.entrySet()) {
|
||||
try {
|
||||
var keyName = k.getKey();
|
||||
if (!fieldMetaMap.containsKey(keyName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var fieldMeta = fieldMetaMap.get(keyName);
|
||||
var keyValue = k.getValue();
|
||||
if (fieldMeta.getType().equals(float.class)) {
|
||||
set(object, fieldMeta, methodAccess, getFloat(keyValue));
|
||||
} else if (fieldMeta.getType().equals(double.class)) {
|
||||
set(object, fieldMeta, methodAccess, (double) keyValue);
|
||||
} else if (fieldMeta.getType().equals(int.class)) {
|
||||
set(object, fieldMeta, methodAccess, getInt(keyValue));
|
||||
} else if (fieldMeta.getType().equals(String.class)) {
|
||||
set(object, fieldMeta, methodAccess, keyValue);
|
||||
} else if (fieldMeta.getType().equals(boolean.class)) {
|
||||
set(object, fieldMeta, methodAccess, (boolean) keyValue);
|
||||
} else if (fieldMeta.getType().equals(List.class)) {
|
||||
LuaValueProxy objTable = (LuaValueProxy) tableObj.get(k.getKey());
|
||||
Class<?> listType = getListType(type, fieldMeta.getField());
|
||||
List<?> listObj = serializeList(listType, objTable);
|
||||
set(object, fieldMeta, methodAccess, listObj);
|
||||
} else {
|
||||
set(object, fieldMeta, methodAccess, serialize(fieldMeta.getType(), fieldMeta.getField(), (LuaValueProxy) keyValue));
|
||||
//methodAccess.invoke(object, fieldMeta.index, keyValue);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// LuaEngine.logger.error("Exception serializing", ex);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception serializing", e);
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
public <T> Map<String, T> serializeMap(Class<T> type, LuaValueProxy table) {
|
||||
Map<String, T> map = new HashMap<>();
|
||||
|
||||
if (table == null) {
|
||||
return map;
|
||||
}
|
||||
|
||||
var tableObj = (Map<String, Object>) table;
|
||||
|
||||
try {
|
||||
for (var k : tableObj.entrySet()) {
|
||||
try {
|
||||
var keyValue = k.getValue();
|
||||
|
||||
T object = objectToClass(type, keyValue);
|
||||
|
||||
if (object != null) {
|
||||
map.put(k.getKey(), object);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception serializing map", e);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
@ -0,0 +1,255 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.lua.engine.LuaTable;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class JNLuaTable implements LuaTable {
|
||||
|
||||
AbstractMap<Object, Object> table;
|
||||
|
||||
JNLuaTable(AbstractMap<?, ?> table) {
|
||||
this.table = (AbstractMap<Object, Object>) table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean has(String key) {
|
||||
return table.containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(String key) {
|
||||
return table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(int key) {
|
||||
return table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String key) {
|
||||
return ((Number) table.get(key)).intValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int optInt(String key, int defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).intValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(int key) {
|
||||
return ((Number) table.get(key)).intValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int optInt(int key, int defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).intValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, int value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, int value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble(String key) {
|
||||
return ((Number) table.get(key)).doubleValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double optDouble(String key, double defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).doubleValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble(int key) {
|
||||
return ((Number) table.get(key)).doubleValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double optDouble(int key, double defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).doubleValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getFloat(String key) {
|
||||
return ((Number) table.get(key)).floatValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float optFloat(String key, float defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).floatValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getFloat(int key) {
|
||||
return ((Number) table.get(key)).floatValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float optFloat(int key, float defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Number)
|
||||
return ((Number) value).floatValue();
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, double value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, double value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String key) {
|
||||
return (Boolean) table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean optBoolean(String key, boolean defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Boolean)
|
||||
return (boolean) value;
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(int key) {
|
||||
return (Boolean) table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean optBoolean(int key, boolean defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof Boolean)
|
||||
return (boolean) value;
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, boolean value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, boolean value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(String key) {
|
||||
return (String) table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String optString(String key, String defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof String)
|
||||
return (String) value;
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(int key) {
|
||||
return (String) table.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String optString(int key, String defaultValue) {
|
||||
val value = table.get(key);
|
||||
if (value instanceof String)
|
||||
return (String) value;
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, String value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, String value) {
|
||||
table.put(key, value);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LuaTable getTable(String key) {
|
||||
return new JNLuaTable((AbstractMap<?, ?>) table.get(key));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LuaTable getTable(int key) {
|
||||
return new JNLuaTable((AbstractMap<?, ?>) table.get(key));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, LuaTable value) {
|
||||
table.put(key, value.getRawTable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, LuaTable value) {
|
||||
table.put(key, value.getRawTable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getKeys() {
|
||||
//TODO check if this is correct
|
||||
val keys = table.keySet();
|
||||
if (keys != null) {
|
||||
return (Set<String>) (Set<?>) keys;
|
||||
}
|
||||
return IntStream.rangeClosed(1, table.size()).mapToObj(String::valueOf).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getAsIntArray() {
|
||||
int[] result = new int[table.size()];
|
||||
for (int i = 0; i < table.size(); i++) {
|
||||
result[i] = (Integer) table.get(i + 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return table.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getRawTable() {
|
||||
return table;
|
||||
}
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
package org.anime_game_servers.jnlua_engine;
|
||||
|
||||
import com.esotericsoftware.reflectasm.MethodAccess;
|
||||
import org.terasology.jnlua.LuaState;
|
||||
import org.terasology.jnlua.LuaState53;
|
||||
import org.terasology.jnlua.NamedJavaFunction;
|
||||
import org.terasology.jnlua.script.LuaBindings;
|
||||
|
||||
import javax.script.ScriptEngine;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* TODO remove?
|
||||
*/
|
||||
public class ScriptBinding {
|
||||
final static Map<Class<?>, MethodAccess> methodAccessCache = new ConcurrentHashMap<>();
|
||||
|
||||
public static MethodAccess getMethodAccessByClazz(Class<?> type) {
|
||||
if (!methodAccessCache.containsKey(type)) {
|
||||
methodAccessCache.putIfAbsent(type, MethodAccess.get(type));
|
||||
}
|
||||
return methodAccessCache.get(type);
|
||||
}
|
||||
|
||||
public static void coerce(ScriptEngine engine, String bindName, Object o) {
|
||||
if (o == null) {
|
||||
return;
|
||||
}
|
||||
List<NamedJavaFunction> bindings = new ArrayList<>();
|
||||
LuaState53 L = (LuaState53) ((LuaBindings) engine.createBindings()).getLuaState();
|
||||
|
||||
//Bind Enum.
|
||||
if (o instanceof Map) {
|
||||
var fields = (Map<String, Integer>) o;
|
||||
for (var enumField : fields.entrySet()) {
|
||||
L.pushJavaObject(enumField.getValue());
|
||||
L.setField(-2, enumField.getKey());
|
||||
}
|
||||
} else {
|
||||
var methods = getMethodAccessByClazz(o.getClass());
|
||||
Arrays.stream(methods.getMethodNames()).forEach(m -> {
|
||||
class TempFunc implements NamedJavaFunction {
|
||||
@Override
|
||||
public String getName() {
|
||||
return m;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int invoke(LuaState luaState) {
|
||||
var argSize = luaState.getTop();
|
||||
List<Object> args = new ArrayList<>();
|
||||
for (int i = 0; i < argSize; ++i) {
|
||||
args.add(luaState.checkJavaObject(i + 1, Object.class));
|
||||
}
|
||||
try {
|
||||
Object ret = methods.invoke(o, m, args.toArray());
|
||||
luaState.pushJavaObject(ret);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("Error on invoking binding function. " + e);
|
||||
throw e;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
bindings.add(new TempFunc());
|
||||
}
|
||||
);
|
||||
|
||||
var fields = o.getClass().getFields();
|
||||
L.newTable();
|
||||
Arrays.stream(fields).forEach(f -> {
|
||||
try {
|
||||
L.pushJavaObject(f.get(o));
|
||||
L.setField(-2, f.getName());
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
for (var func : bindings) {
|
||||
String name = func.getName();
|
||||
|
||||
L.pushJavaFunction(func);
|
||||
L.setField(-2, name);
|
||||
}
|
||||
|
||||
L.luaGetsubtable(L.REGISTRYINDEX, "_LOADED");
|
||||
L.pushValue(-2);
|
||||
L.setField(-2, bindName);
|
||||
L.pop(1);
|
||||
L.rawGet(L.REGISTRYINDEX, 2);
|
||||
L.pushValue(-2);
|
||||
L.setField(-2, bindName);
|
||||
L.pop(1);
|
||||
}
|
||||
}
|
27
LuaJEngine/build.gradle.kts
Normal file
27
LuaJEngine/build.gradle.kts
Normal file
@ -0,0 +1,27 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("java-library")
|
||||
}
|
||||
|
||||
group = "org.anime_game_servers"
|
||||
version = "1.0-SNAPSHOT"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
implementation(project(":BaseLua"))
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("org.anime_game_servers:luaj:3.0.3")
|
||||
compileOnly("org.projectlombok:lombok:1.18.30")
|
||||
annotationProcessor("org.projectlombok:lombok:1.18.30")
|
||||
implementation("com.esotericsoftware:reflectasm:1.11.9")
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
package org.anime_game_servers.luaj_engine;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.models.IntValueEnum;
|
||||
import org.anime_game_servers.lua.models.ScriptType;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.lib.ResourceFinder;
|
||||
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
|
||||
import org.luaj.vm2.script.LuajContext;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class LuaJEngine implements LuaEngine {
|
||||
private final ScriptEngineManager manager;
|
||||
private final LuajContext context;
|
||||
|
||||
@Getter
|
||||
private final ScriptEngine engine;
|
||||
@Getter(onMethod = @__(@Override))
|
||||
private final LuaJSerializer serializer;
|
||||
|
||||
public LuaJEngine() {
|
||||
manager = new ScriptEngineManager();
|
||||
engine = manager.getEngineByName("luaj");
|
||||
|
||||
serializer = new LuaJSerializer();
|
||||
context = (LuajContext) engine.getContext();
|
||||
|
||||
// Set engine to replace require as a temporary fix to missing scripts
|
||||
context.globals.finder = new ResourceFinder() {
|
||||
@Override
|
||||
public InputStream findResource(String filename) {
|
||||
val stream = scriptFinder.openScript(filename);
|
||||
return stream!=null ? stream : new ByteArrayInputStream(new byte[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useRawParamString() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Enum<T>> boolean addGlobalEnumByOrdinal(String name, T[] enumArray) {
|
||||
LuaTable table = new LuaTable();
|
||||
Arrays.stream(enumArray).forEach(e -> {
|
||||
table.set(e.name(), e.ordinal());
|
||||
table.set(e.name().toUpperCase(), e.ordinal());
|
||||
});
|
||||
context.globals.set(name, table);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Enum<T> & IntValueEnum> boolean addGlobalEnumByIntValue(String name, T[] enumArray) {
|
||||
LuaTable table = new LuaTable();
|
||||
Arrays.stream(enumArray).forEach(e -> {
|
||||
table.set(e.name(), e.getValue());
|
||||
table.set(e.name().toUpperCase(), e.getValue());
|
||||
});
|
||||
context.globals.set(name, table);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addGlobalStaticClass(String name, Class<?> staticClass) {
|
||||
try {
|
||||
context.globals.set(name, CoerceJavaToLua.coerce(staticClass.getConstructor().newInstance()));
|
||||
return true;
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
|
||||
NoSuchMethodException e) {
|
||||
//logger.error("Failed to add static class to lua engine: " + name, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addObject(String name, Object object) {
|
||||
context.globals.set(name, CoerceJavaToLua.coerce(object));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LuaScript getScript(String scriptName, ScriptType scriptType) {
|
||||
final Path scriptPath = scriptFinder.getScriptPath(scriptName);
|
||||
if (!Files.exists(scriptPath)) return null;
|
||||
|
||||
try {
|
||||
return new LuaJScript(this, scriptPath);
|
||||
} catch (IOException | ScriptException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public org.anime_game_servers.lua.engine.LuaTable getTable(Object table) {
|
||||
if (table instanceof LuaTable)
|
||||
return new LuaJTable(this, (LuaTable) table);
|
||||
throw new IllegalArgumentException("Table must be a LuaTable");
|
||||
}
|
||||
|
||||
@Override
|
||||
public org.anime_game_servers.lua.engine.LuaTable createTable() {
|
||||
return new LuaJTable(this, new LuaTable());
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package org.anime_game_servers.luaj_engine;
|
||||
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.lua.engine.LuaEngine;
|
||||
import org.anime_game_servers.lua.engine.LuaScript;
|
||||
import org.anime_game_servers.lua.engine.LuaValue;
|
||||
import org.anime_game_servers.lua.models.BooleanLuaValue;
|
||||
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.script.Bindings;
|
||||
import javax.script.Compilable;
|
||||
import javax.script.CompiledScript;
|
||||
import javax.script.ScriptException;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class LuaJScript implements LuaScript {
|
||||
private final CompiledScript compiledScript;
|
||||
private final Bindings binding;
|
||||
private final LuaJEngine engine;
|
||||
|
||||
public LuaJScript(LuaJEngine engine, Path scriptPath) throws IOException, ScriptException {
|
||||
this.engine = engine;
|
||||
this.compiledScript = ((Compilable) engine.getEngine()).compile(Files.newBufferedReader(scriptPath));
|
||||
this.binding = engine.getEngine().createBindings();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasMethod(@Nonnull String methodName) {
|
||||
return binding.containsKey(methodName) && ((org.luaj.vm2.LuaValue) binding.get(methodName)).isfunction();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaValue callMethod(@Nonnull String methodName, Object... args) {
|
||||
val function = (org.luaj.vm2.LuaValue) binding.get(methodName);
|
||||
if (function == null || !function.isfunction()) {
|
||||
//LuaEngine.logger.warn("Attempted to call method {} on script {} but it does not exist or is not a function", methodName, this);
|
||||
return BooleanLuaValue.FALSE;
|
||||
}
|
||||
|
||||
org.luaj.vm2.LuaValue[] luaArgs;
|
||||
|
||||
luaArgs = new org.luaj.vm2.LuaValue[args.length];
|
||||
for (int i = 0; i < args.length; i++)
|
||||
luaArgs[i] = CoerceJavaToLua.coerce(args[i]);
|
||||
|
||||
return new LuaJValue(engine, function.invoke(luaArgs).arg1());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void evaluate() throws ScriptException {
|
||||
this.compiledScript.eval(this.binding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getGlobalVariable(String name, Class<T> type) {
|
||||
return engine.getSerializer().toObject(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> List<T> getGlobalVariableList(String name, Class<T> type) {
|
||||
return engine.getSerializer().toList(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Map<String, T> getGlobalVariableMap(String name, Class<T> type) {
|
||||
return engine.getSerializer().toMap(type, binding.get(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaEngine getEngine() {
|
||||
return engine;
|
||||
}
|
||||
}
|
@ -0,0 +1,186 @@
|
||||
package org.anime_game_servers.luaj_engine;
|
||||
|
||||
import org.anime_game_servers.lua.serialize.BaseSerializer;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class LuaJSerializer extends BaseSerializer {
|
||||
|
||||
|
||||
@Override
|
||||
public <T> List<T> toList(Class<T> type, Object obj) {
|
||||
return serializeList(type, (LuaTable) obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toObject(Class<T> type, Object obj) {
|
||||
return serialize(type, null, (LuaTable) obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Map<String, T> toMap(Class<T> type, Object obj) {
|
||||
return serializeMap(type, (LuaTable) obj);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private <T> T valueToType(Class<T> type, LuaValue keyValue) {
|
||||
T object = null;
|
||||
|
||||
if (keyValue.istable()) {
|
||||
object = serialize(type, null, keyValue.checktable());
|
||||
} else if (keyValue.isint()) {
|
||||
object = (T) (Integer) keyValue.toint();
|
||||
} else if (keyValue.isnumber()) {
|
||||
object = (T) (Float) keyValue.tofloat(); // terrible...
|
||||
} else if (keyValue.isstring()) {
|
||||
object = (T) keyValue.tojstring();
|
||||
} else if (keyValue.isboolean()) {
|
||||
object = (T) (Boolean) keyValue.toboolean();
|
||||
} else {
|
||||
object = (T) keyValue;
|
||||
}
|
||||
if (object == null) {
|
||||
//LuaEngine.logger.warn("Can't serialize value: {} to type: {}", keyValue, type);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
private <T> Map<String, T> serializeMap(Class<T> type, LuaTable table) {
|
||||
Map<String, T> map = new HashMap<>();
|
||||
|
||||
if (table == null) {
|
||||
return map;
|
||||
}
|
||||
|
||||
try {
|
||||
LuaValue[] keys = table.keys();
|
||||
for (LuaValue k : keys) {
|
||||
try {
|
||||
LuaValue keyValue = table.get(k);
|
||||
T object = valueToType(type, keyValue);
|
||||
|
||||
if (object != null) {
|
||||
map.put(String.valueOf(k), object);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception while serializing map", e);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
public <T> List<T> serializeList(Class<T> type, LuaTable table) {
|
||||
List<T> list = new ArrayList<>();
|
||||
|
||||
if (table == null) {
|
||||
return list;
|
||||
}
|
||||
|
||||
try {
|
||||
LuaValue[] keys = table.keys();
|
||||
for (LuaValue k : keys) {
|
||||
try {
|
||||
LuaValue keyValue = table.get(k);
|
||||
|
||||
T object = valueToType(type, keyValue);
|
||||
|
||||
if (object != null) {
|
||||
list.add(object);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception while serializing list", e);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
private Class<?> getListType(Class<?> type, @Nullable Field field) {
|
||||
if (field == null) {
|
||||
return type.getTypeParameters()[0].getClass();
|
||||
}
|
||||
Type fieldType = field.getGenericType();
|
||||
if (fieldType instanceof ParameterizedType) {
|
||||
return (Class<?>) ((ParameterizedType) fieldType).getActualTypeArguments()[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public <T> T serialize(Class<T> type, @Nullable Field field, LuaTable table) {
|
||||
T object = null;
|
||||
|
||||
if (type == List.class) {
|
||||
try {
|
||||
Class<?> listType = getListType(type, field);
|
||||
return (T) serializeList(listType, table);
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.error("Exception while serializing {}", type.getName(), e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (!fieldMetaCache.containsKey(type)) {
|
||||
cacheType(type);
|
||||
}
|
||||
var methodAccess = methodAccessCache.get(type);
|
||||
var fieldMetaMap = fieldMetaCache.get(type);
|
||||
|
||||
object = (T) constructorCache.get(type).newInstance();
|
||||
|
||||
if (table == null) {
|
||||
return object;
|
||||
}
|
||||
|
||||
LuaValue[] keys = table.keys();
|
||||
for (LuaValue k : keys) {
|
||||
try {
|
||||
var keyName = k.checkjstring();
|
||||
if (!fieldMetaMap.containsKey(keyName)) {
|
||||
continue;
|
||||
}
|
||||
var fieldMeta = fieldMetaMap.get(keyName);
|
||||
LuaValue keyValue = table.get(k);
|
||||
|
||||
if (keyValue.istable()) {
|
||||
set(object, fieldMeta, methodAccess, serialize(fieldMeta.getType(), fieldMeta.getField(), keyValue.checktable()));
|
||||
} else if (fieldMeta.getType().equals(float.class)) {
|
||||
set(object, fieldMeta, methodAccess, keyValue.tofloat());
|
||||
} else if (fieldMeta.getType().equals(int.class)) {
|
||||
set(object, fieldMeta, methodAccess, keyValue.toint());
|
||||
} else if (fieldMeta.getType().equals(String.class)) {
|
||||
set(object, fieldMeta, methodAccess, keyValue.tojstring());
|
||||
} else if (fieldMeta.getType().equals(boolean.class)) {
|
||||
set(object, fieldMeta, methodAccess, keyValue.toboolean());
|
||||
} else {
|
||||
set(object, fieldMeta, methodAccess, keyValue.tojstring());
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
//LuaEngine.logger.error("Exception serializing", ex);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//LuaEngine.logger.info(ScriptUtils.toMap(table).toString());
|
||||
//LuaEngine.logger.error("Exception while serializing {}", type.getName(), e);
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
}
|
@ -0,0 +1,228 @@
|
||||
package org.anime_game_servers.luaj_engine;
|
||||
|
||||
import lombok.val;
|
||||
import org.anime_game_servers.lua.engine.LuaTable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Set;
|
||||
|
||||
public class LuaJTable implements LuaTable {
|
||||
private final org.luaj.vm2.LuaTable table;
|
||||
private final LuaJEngine engine;
|
||||
|
||||
LuaJTable(LuaJEngine engine, org.luaj.vm2.LuaTable table) {
|
||||
this.table = table;
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean has(String key) {
|
||||
return !table.get(key).isnil();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(String key) {
|
||||
return new LuaJValue(engine, table.get(key));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get(int key) {
|
||||
return new LuaJValue(engine, table.get(key));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String key) {
|
||||
return table.get(key).checkint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int optInt(String key, int defaultValue) {
|
||||
return table.get(key).optint(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(int key) {
|
||||
return table.get(key).checkint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int optInt(int key, int defaultValue) {
|
||||
return table.get(key).optint(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, int value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, int value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble(String key) {
|
||||
return table.get(key).checkdouble();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double optDouble(String key, double defaultValue) {
|
||||
return table.get(key).optdouble(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble(int key) {
|
||||
return table.get(key).checkdouble();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double optDouble(int key, double defaultValue) {
|
||||
return table.get(key).optdouble(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getFloat(String key) {
|
||||
return table.get(key).tofloat();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float optFloat(String key, float defaultValue) {
|
||||
return (float) table.get(key).optdouble(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getFloat(int key) {
|
||||
return table.get(key).tofloat();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float optFloat(int key, float defaultValue) {
|
||||
return (float) table.get(key).optdouble(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, double value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, double value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String key) {
|
||||
return table.get(key).toboolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean optBoolean(String key, boolean defaultValue) {
|
||||
return table.get(key).optboolean(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(int key) {
|
||||
return table.get(key).toboolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean optBoolean(int key, boolean defaultValue) {
|
||||
return table.get(key).optboolean(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, boolean value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, boolean value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(String key) {
|
||||
return table.get(key).tojstring();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String optString(String key, String defaultValue) {
|
||||
return table.get(key).optjstring(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(int key) {
|
||||
return table.get(key).toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String optString(int key, String defaultValue) {
|
||||
return table.get(key).optjstring(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, String value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, String value) {
|
||||
table.set(key, org.luaj.vm2.LuaValue.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable getTable(String key) {
|
||||
val variable = table.get(key);
|
||||
if (!variable.istable()) {
|
||||
return null;
|
||||
}
|
||||
return new LuaJTable(engine, variable.checktable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable getTable(int key) {
|
||||
val variable = table.get(key);
|
||||
if (!variable.istable()) {
|
||||
return null;
|
||||
}
|
||||
return new LuaJTable(engine, variable.checktable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(int key, LuaTable value) {
|
||||
val rawTable = value.getRawTable();
|
||||
if (rawTable instanceof org.luaj.vm2.LuaTable)
|
||||
table.set(key, (org.luaj.vm2.LuaTable) rawTable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(String key, LuaTable value) {
|
||||
val rawTable = value.getRawTable();
|
||||
if (rawTable instanceof org.luaj.vm2.LuaTable)
|
||||
table.set(key, (org.luaj.vm2.LuaTable) rawTable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getKeys() {
|
||||
return Arrays.stream(table.keys()).map(org.luaj.vm2.LuaValue::tojstring).collect(java.util.stream.Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getAsIntArray() {
|
||||
val array = new int[table.length()];
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
array[i] = table.get(i + 1).optint(0);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return table.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getRawTable() {
|
||||
return table;
|
||||
}
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
package org.anime_game_servers.luaj_engine;
|
||||
|
||||
import org.anime_game_servers.lua.engine.LuaValue;
|
||||
|
||||
public class LuaJValue implements LuaValue {
|
||||
private final org.luaj.vm2.LuaValue value;
|
||||
private final LuaJEngine engine;
|
||||
|
||||
LuaJValue(LuaJEngine engine, org.luaj.vm2.LuaValue value) {
|
||||
this.engine = engine;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNull() {
|
||||
return value.isnil();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBoolean() {
|
||||
return value.isboolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInteger() {
|
||||
return value.isint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLong() {
|
||||
return value.islong();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDouble() {
|
||||
return value.isnumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFloat() {
|
||||
return value.isnumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isString() {
|
||||
return value.isstring();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTable() {
|
||||
return value.istable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean asBoolean() {
|
||||
return value.toboolean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInteger() {
|
||||
return value.toint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long asLong() {
|
||||
return value.tolong();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double asDouble() {
|
||||
return value.todouble();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float asFloat() {
|
||||
return value.tofloat();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String asString() {
|
||||
return value.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T asObject(Class<T> type) {
|
||||
if (!value.istable()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return engine.getSerializer().toObject(type, value.checktable());
|
||||
}
|
||||
}
|
63
build.gradle.kts
Normal file
63
build.gradle.kts
Normal file
@ -0,0 +1,63 @@
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("java")
|
||||
id("maven-publish")
|
||||
kotlin("jvm") version "1.9.10"
|
||||
}
|
||||
|
||||
group = "org.anime_game_servers"
|
||||
version = "0.1"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
allprojects {
|
||||
apply(plugin ="maven-publish")
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = "ags-mvn-Releases"
|
||||
url = uri("https://mvn.animegameservers.org/releases")
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
maven {
|
||||
name = "agsmvnrelease"
|
||||
url = uri("https://mvn.animegameservers.org/releases")
|
||||
credentials(PasswordCredentials::class)
|
||||
authentication {
|
||||
create<BasicAuthentication>("basic")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
val compileKotlin: KotlinCompile by tasks
|
||||
compileKotlin.kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
val compileTestKotlin: KotlinCompile by tasks
|
||||
compileTestKotlin.kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
#Fri Oct 06 21:24:40 CEST 2023
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
234
gradlew
vendored
Executable file
234
gradlew
vendored
Executable file
@ -0,0 +1,234 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=${0##*/}
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
89
gradlew.bat
vendored
Normal file
89
gradlew.bat
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
5
settings.gradle.kts
Normal file
5
settings.gradle.kts
Normal file
@ -0,0 +1,5 @@
|
||||
rootProject.name = "AnimeGameLua"
|
||||
include("LuaJEngine")
|
||||
include("JNLuaEngine")
|
||||
include("GILua")
|
||||
include("BaseLua")
|
Loading…
Reference in New Issue
Block a user