Compare commits

...

5 Commits

Author SHA1 Message Date
Melledy
db8cbd4f83 Add error message in case data files in resources could not be found 2022-05-19 03:05:57 -07:00
Melledy
f876470369 Fix dataloader not getting path correctly 2022-05-19 03:00:59 -07:00
Melledy
29941aa8d0 Add area_id to SceneObject 2022-05-19 02:28:46 -07:00
Melledy
5f8cc47e87 Fix bad casting exceptions with scene garbages objects 2022-05-19 02:28:25 -07:00
Melledy
3feb98f08b Fix issue with groups that dont have any suites 2022-05-19 02:19:18 -07:00
8 changed files with 75 additions and 11 deletions

View File

@ -48,18 +48,20 @@ public class DataLoader {
}
public static void CheckAllFiles() {
String pathSplitter = "defaults" + Pattern.quote(FileSystems.getDefault().getSeparator()) + "data" + Pattern.quote(FileSystems.getDefault().getSeparator());
try {
List<Path> filenames = FileUtils.getPathsFromResource("/defaults/data/");
if (filenames == null) {
Grasscutter.getLogger().error("We were unable to locate your default data files.");
}
for (Path file : filenames) {
String relativePath = String.valueOf(file).split(pathSplitter)[1];
String relativePath = String.valueOf(file).split("defaults[\\\\\\/]data[\\\\\\/]")[1];
CheckAndCopyData(relativePath);
}
} catch (Exception e) {
Grasscutter.getLogger().error("An error occurred while trying to check the data folder. \n", e);
Grasscutter.getLogger().error("An error occurred while trying to check the data folder.", e);
}
GenerateGachaMappings();

View File

@ -587,7 +587,7 @@ public class Scene {
// Load suites
int suite = group.init_config.suite;
if (suite == 0) {
if (suite == 0 || group.suites == null || group.suites.size() == 0) {
continue;
}
@ -599,6 +599,7 @@ public class Scene {
.map(g -> scriptManager.createGadget(group.id, group.block_id, g)).toList());
entities.addAll(suiteData.sceneMonsters.stream()
.map(mob -> scriptManager.createMonster(group.id, group.block_id, mob)).toList());
suite++;
} while (suite < group.init_config.end_suite);
}

View File

@ -164,7 +164,10 @@ public class SceneScriptManager {
public void loadGroupFromScript(SceneGroup group) {
group.load(getScene().getId());
if (group.variables != null) {
group.variables.forEach(var -> this.getVariables().put(var.name, var.value));
}
this.sceneGroups.put(group.id, group);
if(group.regions != null){

View File

@ -0,0 +1,28 @@
package emu.grasscutter.scripts;
import java.util.HashMap;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import emu.grasscutter.Grasscutter;
public class ScriptUtils {
public static HashMap<Object, Object> toMap(LuaTable table) {
HashMap<Object, Object> map = new HashMap<>();
LuaValue[] rootKeys = table.keys();
for (LuaValue k : rootKeys) {
if (table.get(k).istable()) {
map.put(k, toMap(table.get(k).checktable()));
} else {
map.put(k, table.get(k));
}
}
return map;
}
public static void print(LuaTable table) {
Grasscutter.getLogger().info(toMap(table).toString());
}
}

View File

@ -9,6 +9,10 @@ import lombok.ToString;
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -106,9 +110,17 @@ public class SceneGroup {
suites = ScriptLoader.getSerializer().toList(SceneSuite.class, bindings.get("suites"));
regions = ScriptLoader.getSerializer().toList(SceneRegion.class, bindings.get("regions"));
garbages = ScriptLoader.getSerializer().toObject(SceneGarbage.class, bindings.get("garbages"));
init_config = ScriptLoader.getSerializer().toObject(SceneInitConfig.class, bindings.get("init_config"));
// Garbages TODO fix properly later
Object garbagesValue = bindings.get("garbages");
if (garbagesValue != null && garbagesValue instanceof LuaValue garbagesTable) {
garbages = new SceneGarbage();
if (garbagesTable.checktable().get("gadgets") != LuaValue.NIL) {
garbages.gadgets = ScriptLoader.getSerializer().toList(SceneGadget.class, garbagesTable.checktable().get("gadgets").checktable());
}
}
// Add variables to suite
variables = ScriptLoader.getSerializer().toList(SceneVar.class, bindings.get("variables"));

View File

@ -9,6 +9,7 @@ import lombok.ToString;
public class SceneObject {
public int level;
public int config_id;
public int area_id;
public Position pos;
public Position rot;

View File

@ -2,6 +2,9 @@ package emu.grasscutter.scripts.serializer;
import com.esotericsoftware.reflectasm.ConstructorAccess;
import com.esotericsoftware.reflectasm.MethodAccess;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.scripts.ScriptUtils;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -9,6 +12,8 @@ import lombok.experimental.FieldDefaults;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@ -31,6 +36,10 @@ public class LuaSerializer implements Serializer {
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) {
@ -79,7 +88,7 @@ public class LuaSerializer implements Serializer {
}
try {
if(!methodAccessCache.containsKey(type)){
if (!methodAccessCache.containsKey(type)) {
cacheType(type);
}
var methodAccess = methodAccessCache.get(type);
@ -87,9 +96,10 @@ public class LuaSerializer implements Serializer {
object = (T) constructorCache.get(type).newInstance();
if(table == null){
if (table == null) {
return object;
}
LuaValue[] keys = table.keys();
for (LuaValue k : keys) {
try {
@ -117,6 +127,7 @@ public class LuaSerializer implements Serializer {
}
}
} catch (Exception e) {
Grasscutter.getLogger().info(ScriptUtils.toMap(table).toString());
e.printStackTrace();
}

View File

@ -9,6 +9,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@ -97,6 +98,11 @@ public final class FileUtils {
} catch (Exception e) {
// Eclipse puts resources in its bin folder
File f = new File(jarPath + "defaults/data/");
if (!f.exists() || f.listFiles().length == 0) {
return null;
}
result = Arrays.stream(f.listFiles()).map(File::toPath).toList();
}