diff --git a/build.gradle.kts b/build.gradle.kts index 4b6e6ff02..0fbca253e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,6 +9,7 @@ plugins { val javaVersion = "18.0.2" val javaMajorVersion = "18" val kotlinTargetJdk = "18" +val holocoreLogLevel: String? by project subprojects { ext { @@ -18,10 +19,6 @@ subprojects { } } -application { - mainClass.set("com.projectswg.holocore.ProjectSWG") -} - repositories { maven("https://dev.joshlarson.me/maven2") mavenCentral() @@ -89,10 +86,26 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configure destinationDirectory.set(File(destinationDirectory.get().asFile.path.replace("kotlin", "java"))) } -tasks.create("runDebug") { +tasks.getByName("run") { + this as JavaExec + dependsOn(tasks.getByName("test")) + enableAssertions = true classpath = sourceSets.main.get().runtimeClasspath mainClass.set("com.projectswg.holocore.ProjectSWG") + + if (holocoreLogLevel != null) + args = listOf("--log-level", holocoreLogLevel!!) +} + +tasks.create("runProduction") { + this as JavaExec + + classpath = sourceSets.main.get().runtimeClasspath + mainClass.set("com.projectswg.holocore.ProjectSWG") + + if (holocoreLogLevel != null) + args = listOf("--log-level", holocoreLogLevel!!) } tasks.create("runClientdataConversion") { diff --git a/pswgcommon b/pswgcommon index 275762883..0bff580da 160000 --- a/pswgcommon +++ b/pswgcommon @@ -1 +1 @@ -Subproject commit 2757628832c2d4034114ab84f9bcb12c710c7c50 +Subproject commit 0bff580dacf002f2e3c606d95349396179146c24 diff --git a/serverdata/terrain/bocctyyy_ht.tga b/serverdata/terrain/bocctyyy_ht.tga new file mode 100644 index 000000000..34dd3687c Binary files /dev/null and b/serverdata/terrain/bocctyyy_ht.tga differ diff --git a/serverdata/terrain/corellia.trn b/serverdata/terrain/corellia.trn new file mode 100644 index 000000000..aa3ee2e85 Binary files /dev/null and b/serverdata/terrain/corellia.trn differ diff --git a/serverdata/terrain/dantooine.trn b/serverdata/terrain/dantooine.trn new file mode 100644 index 000000000..6bd32bfc6 Binary files /dev/null and b/serverdata/terrain/dantooine.trn differ diff --git a/serverdata/terrain/dathomir.trn b/serverdata/terrain/dathomir.trn new file mode 100644 index 000000000..537be0788 Binary files /dev/null and b/serverdata/terrain/dathomir.trn differ diff --git a/serverdata/terrain/endor.trn b/serverdata/terrain/endor.trn new file mode 100644 index 000000000..dcf9a44fc Binary files /dev/null and b/serverdata/terrain/endor.trn differ diff --git a/serverdata/terrain/hracca_ht.tga b/serverdata/terrain/hracca_ht.tga new file mode 100644 index 000000000..4349c2c6b Binary files /dev/null and b/serverdata/terrain/hracca_ht.tga differ diff --git a/serverdata/terrain/kashyyyk.trn b/serverdata/terrain/kashyyyk.trn new file mode 100644 index 000000000..9b1aa5934 Binary files /dev/null and b/serverdata/terrain/kashyyyk.trn differ diff --git a/serverdata/terrain/kashyyyk_dead_forest.trn b/serverdata/terrain/kashyyyk_dead_forest.trn new file mode 100644 index 000000000..b397b9f91 Binary files /dev/null and b/serverdata/terrain/kashyyyk_dead_forest.trn differ diff --git a/serverdata/terrain/kashyyyk_dead_forest_ht.tga b/serverdata/terrain/kashyyyk_dead_forest_ht.tga new file mode 100644 index 000000000..148676a78 Binary files /dev/null and b/serverdata/terrain/kashyyyk_dead_forest_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_hunting.trn b/serverdata/terrain/kashyyyk_hunting.trn new file mode 100644 index 000000000..7e35cfa66 Binary files /dev/null and b/serverdata/terrain/kashyyyk_hunting.trn differ diff --git a/serverdata/terrain/kashyyyk_hunting_canyon01_ht.tga b/serverdata/terrain/kashyyyk_hunting_canyon01_ht.tga new file mode 100644 index 000000000..e4b75dd00 Binary files /dev/null and b/serverdata/terrain/kashyyyk_hunting_canyon01_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_hunting_ht.tga b/serverdata/terrain/kashyyyk_hunting_ht.tga new file mode 100644 index 000000000..cc9a02dd9 Binary files /dev/null and b/serverdata/terrain/kashyyyk_hunting_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_main.trn b/serverdata/terrain/kashyyyk_main.trn new file mode 100644 index 000000000..eaebe35a6 Binary files /dev/null and b/serverdata/terrain/kashyyyk_main.trn differ diff --git a/serverdata/terrain/kashyyyk_main_height.tga b/serverdata/terrain/kashyyyk_main_height.tga new file mode 100644 index 000000000..d698cd644 Binary files /dev/null and b/serverdata/terrain/kashyyyk_main_height.tga differ diff --git a/serverdata/terrain/kashyyyk_main_path.tga b/serverdata/terrain/kashyyyk_main_path.tga new file mode 100644 index 000000000..b756ae293 Binary files /dev/null and b/serverdata/terrain/kashyyyk_main_path.tga differ diff --git a/serverdata/terrain/kashyyyk_main_trail01.tga b/serverdata/terrain/kashyyyk_main_trail01.tga new file mode 100644 index 000000000..5a084a154 Binary files /dev/null and b/serverdata/terrain/kashyyyk_main_trail01.tga differ diff --git a/serverdata/terrain/kashyyyk_main_trail02.tga b/serverdata/terrain/kashyyyk_main_trail02.tga new file mode 100644 index 000000000..b135ba02f Binary files /dev/null and b/serverdata/terrain/kashyyyk_main_trail02.tga differ diff --git a/serverdata/terrain/kashyyyk_north_dungeons.trn b/serverdata/terrain/kashyyyk_north_dungeons.trn new file mode 100644 index 000000000..80e05651e Binary files /dev/null and b/serverdata/terrain/kashyyyk_north_dungeons.trn differ diff --git a/serverdata/terrain/kashyyyk_north_dungeons_ht.tga b/serverdata/terrain/kashyyyk_north_dungeons_ht.tga new file mode 100644 index 000000000..8ec57daaf Binary files /dev/null and b/serverdata/terrain/kashyyyk_north_dungeons_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_pob_dungeons.trn b/serverdata/terrain/kashyyyk_pob_dungeons.trn new file mode 100644 index 000000000..0c706c3c9 Binary files /dev/null and b/serverdata/terrain/kashyyyk_pob_dungeons.trn differ diff --git a/serverdata/terrain/kashyyyk_rryatt_trail.trn b/serverdata/terrain/kashyyyk_rryatt_trail.trn new file mode 100644 index 000000000..564bf1046 Binary files /dev/null and b/serverdata/terrain/kashyyyk_rryatt_trail.trn differ diff --git a/serverdata/terrain/kashyyyk_rryatt_trail_height.tga b/serverdata/terrain/kashyyyk_rryatt_trail_height.tga new file mode 100644 index 000000000..0e465f488 Binary files /dev/null and b/serverdata/terrain/kashyyyk_rryatt_trail_height.tga differ diff --git a/serverdata/terrain/kashyyyk_rryatt_trail_level_4_ht.tga b/serverdata/terrain/kashyyyk_rryatt_trail_level_4_ht.tga new file mode 100644 index 000000000..9e2ae2bfa Binary files /dev/null and b/serverdata/terrain/kashyyyk_rryatt_trail_level_4_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_rryatt_trail_level_5_ht.tga b/serverdata/terrain/kashyyyk_rryatt_trail_level_5_ht.tga new file mode 100644 index 000000000..7e7c3df91 Binary files /dev/null and b/serverdata/terrain/kashyyyk_rryatt_trail_level_5_ht.tga differ diff --git a/serverdata/terrain/kashyyyk_south_dungeons.trn b/serverdata/terrain/kashyyyk_south_dungeons.trn new file mode 100644 index 000000000..cd99e5410 Binary files /dev/null and b/serverdata/terrain/kashyyyk_south_dungeons.trn differ diff --git a/serverdata/terrain/kashyyyk_waterfall_area_ht.tga b/serverdata/terrain/kashyyyk_waterfall_area_ht.tga new file mode 100644 index 000000000..6414daaad Binary files /dev/null and b/serverdata/terrain/kashyyyk_waterfall_area_ht.tga differ diff --git a/serverdata/terrain/lok.trn b/serverdata/terrain/lok.trn new file mode 100644 index 000000000..3a30adabc Binary files /dev/null and b/serverdata/terrain/lok.trn differ diff --git a/serverdata/terrain/mustafar.trn b/serverdata/terrain/mustafar.trn new file mode 100644 index 000000000..276d7fb99 Binary files /dev/null and b/serverdata/terrain/mustafar.trn differ diff --git a/serverdata/terrain/mustafar_droid_canyon_height.tga b/serverdata/terrain/mustafar_droid_canyon_height.tga new file mode 100644 index 000000000..e072f9fc4 Binary files /dev/null and b/serverdata/terrain/mustafar_droid_canyon_height.tga differ diff --git a/serverdata/terrain/mustafar_height.tga b/serverdata/terrain/mustafar_height.tga new file mode 100644 index 000000000..bb92bd1ab Binary files /dev/null and b/serverdata/terrain/mustafar_height.tga differ diff --git a/serverdata/terrain/mustafar_height_moutnains.tga b/serverdata/terrain/mustafar_height_moutnains.tga new file mode 100644 index 000000000..aa76e8c9c Binary files /dev/null and b/serverdata/terrain/mustafar_height_moutnains.tga differ diff --git a/serverdata/terrain/mustafar_volcao_arena_height.tga b/serverdata/terrain/mustafar_volcao_arena_height.tga new file mode 100644 index 000000000..1eea75f42 Binary files /dev/null and b/serverdata/terrain/mustafar_volcao_arena_height.tga differ diff --git a/serverdata/terrain/naboo.trn b/serverdata/terrain/naboo.trn new file mode 100644 index 000000000..3976d44f8 Binary files /dev/null and b/serverdata/terrain/naboo.trn differ diff --git a/serverdata/terrain/rori.trn b/serverdata/terrain/rori.trn new file mode 100644 index 000000000..b9b69bd5c Binary files /dev/null and b/serverdata/terrain/rori.trn differ diff --git a/serverdata/terrain/slavers_ht.tga b/serverdata/terrain/slavers_ht.tga new file mode 100644 index 000000000..be4174cf0 Binary files /dev/null and b/serverdata/terrain/slavers_ht.tga differ diff --git a/serverdata/terrain/taanab.trn b/serverdata/terrain/taanab.trn new file mode 100644 index 000000000..bc701e3d4 Binary files /dev/null and b/serverdata/terrain/taanab.trn differ diff --git a/serverdata/terrain/talus.trn b/serverdata/terrain/talus.trn new file mode 100644 index 000000000..976cf248c Binary files /dev/null and b/serverdata/terrain/talus.trn differ diff --git a/serverdata/terrain/tatooine.trn b/serverdata/terrain/tatooine.trn new file mode 100644 index 000000000..4961e92c5 Binary files /dev/null and b/serverdata/terrain/tatooine.trn differ diff --git a/serverdata/terrain/tatt_heightmap_jawa_tradepost.tga b/serverdata/terrain/tatt_heightmap_jawa_tradepost.tga new file mode 100644 index 000000000..011e77d4a Binary files /dev/null and b/serverdata/terrain/tatt_heightmap_jawa_tradepost.tga differ diff --git a/serverdata/terrain/umbra.trn b/serverdata/terrain/umbra.trn new file mode 100644 index 000000000..418456617 Binary files /dev/null and b/serverdata/terrain/umbra.trn differ diff --git a/serverdata/terrain/yavin4.trn b/serverdata/terrain/yavin4.trn new file mode 100644 index 000000000..dc0c19f32 Binary files /dev/null and b/serverdata/terrain/yavin4.trn differ diff --git a/src/main/java/com/projectswg/holocore/ProjectSWG.java b/src/main/java/com/projectswg/holocore/ProjectSWG.java index ab4e75a35..c5892ce4f 100644 --- a/src/main/java/com/projectswg/holocore/ProjectSWG.java +++ b/src/main/java/com/projectswg/holocore/ProjectSWG.java @@ -29,6 +29,7 @@ package com.projectswg.holocore; import com.projectswg.common.data.encodables.chat.ChatAvatar; import com.projectswg.common.data.encodables.galaxy.Galaxy; import com.projectswg.common.data.encodables.galaxy.Galaxy.GalaxyStatus; +import com.projectswg.common.data.swgiff.parsers.SWGParser; import com.projectswg.holocore.intents.support.data.control.ServerStatusIntent; import com.projectswg.holocore.resources.support.data.client_info.ServerFactory; import com.projectswg.holocore.resources.support.data.control.ServerStatus; @@ -95,15 +96,7 @@ public class ProjectSWG { return 0; } - File logDirectory = new File("log"); - if (!logDirectory.isDirectory() && !logDirectory.mkdir()) - Log.w("Failed to make log directory!"); - if (arguments.containsKey("print-colors")) - Log.addWrapper(new AnsiColorLogWrapper()); - else - Log.addWrapper(new ConsoleLogWrapper()); - Log.addWrapper(new FileLogWrapper(new File(logDirectory, "log.txt"))); - + setupLogging(arguments); if (ProjectSWG.class.getResourceAsStream("/marker.txt") == null) { Log.a("Failed to read Holocore resources - aborting"); return -1; @@ -134,6 +127,7 @@ public class ProjectSWG { // TODO: Replace all iffs with sdbs private static void initializeServerFactory() { + SWGParser.setBasePath("serverdata"); try { ServerFactory.getInstance().updateServerIffs(); } catch (IOException e) { @@ -200,10 +194,35 @@ public class ProjectSWG { PswgDatabase.INSTANCE.initialize(dbStr, db); } + private static void setupLogging(Map arguments) { + Log.LogLevel logLevel = Log.LogLevel.TRACE; + if (arguments.containsKey("log-level")) { + try { + logLevel = Log.LogLevel.valueOf((String) arguments.get("log-level")); + } catch (IllegalArgumentException | ClassCastException e) { + System.err.println("Invalid log level: " + arguments.get("log-level")); + } + } + + if (arguments.containsKey("print-colors")) + Log.addWrapper(new AnsiColorLogWrapper(logLevel)); + else + Log.addWrapper(new ConsoleLogWrapper(logLevel)); + + if (arguments.containsKey("log-file")) { + File logDirectory = new File("log"); + if (!logDirectory.isDirectory() && !logDirectory.mkdir()) + Log.w("Failed to make log directory!"); + Log.addWrapper(new FileLogWrapper(new File(logDirectory, "log.txt"))); + } + } + private static ArgumentParser createArgumentOptions() { ArgumentParser parser = new ArgumentParser(); parser.addArgument(Argument.builder("help").shortName('h').longName("help").isOptional(true).description("print this message").build()); parser.addArgument(Argument.builder("print-colors").shortName('C').longName("print-colors").isOptional(true).description("print colors to signify various log levels").build()); + parser.addArgument(Argument.builder("log-file").shortName('f').longName("log-file").isOptional(true).description("enable logging to file").build()); + parser.addArgument(Argument.builder("log-level").shortName('l').longName("log-level").argCount('1').isOptional(true).description("specify log level [TRACE, DATA, INFO, WARN, ERROR, ASSERT]").build()); parser.addArgument(Argument.builder("database").shortName('c').longName("database").argCount('1').isOptional(true).description("sets the connection string for mongodb (default: mongodb://localhost)").build()); parser.addArgument(Argument.builder("database-name").shortName('d').longName("dbName").argCount('1').isOptional(true).description("sets the mongodb database (default: cu)").build()); diff --git a/src/utility/java/com/projectswg/utility/clientdata/ConvertTerrain.kt b/src/utility/java/com/projectswg/utility/clientdata/ConvertTerrain.kt new file mode 100644 index 000000000..8a54c809c --- /dev/null +++ b/src/utility/java/com/projectswg/utility/clientdata/ConvertTerrain.kt @@ -0,0 +1,104 @@ +/*********************************************************************************** + * Copyright (c) 2022 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ + +package com.projectswg.utility.clientdata + +import com.projectswg.common.data.location.Terrain +import com.projectswg.common.data.swgiff.IffForm +import com.projectswg.common.data.swgiff.parsers.SWGParser +import com.projectswg.common.data.swgiff.parsers.terrain.TerrainTemplate +import java.io.File +import java.io.IOException +import java.io.RandomAccessFile + + +internal class ConvertTerrain : Converter { + + override fun convert() { + println("Converting terrain...") + try { + var beforeSize = 0L + var afterSize = 0L + for (terrain in TERRAIN_LIST) { + val inputFile = File("clientdata", terrain.file) + val terrainTemplate = SWGParser.parse(inputFile) ?: continue + val output = IffForm.write(terrainTemplate.write()) + val outputFile = File("serverdata", terrain.file) + if (!outputFile.exists()) + outputFile.createNewFile() + RandomAccessFile(outputFile, "rw").channel.use { + it.truncate(output.remaining().toLong()) + while (output.hasRemaining()) { + it.write(output) + } + } + SWGParser.parse(outputFile) + println("%-25s [%2.2f%%] ${inputFile.length()} -> ${outputFile.length()}".format("$terrain:", 100 - outputFile.length().toFloat() / inputFile.length() * 100)) + beforeSize += inputFile.length() + afterSize += outputFile.length() + + for (bitmap in terrainTemplate.bitmapGroup.bitmaps.values) { + val bitmapFile = bitmap.file ?: continue + if (terrainTemplate.isBitmapReferenced(bitmap.familyId)) + File("clientdata", bitmapFile).copyTo(File("serverdata", bitmapFile)) + } + } + println("$beforeSize -> $afterSize") + } catch (e: IOException) { + e.printStackTrace() + } + } + + companion object { + + private val TERRAIN_LIST = listOf( + Terrain.CORELLIA, + Terrain.DANTOOINE, + Terrain.DATHOMIR, + Terrain.ENDOR, + Terrain.KASHYYYK_DEAD_FOREST, + Terrain.KASHYYYK_HUNTING, + Terrain.KASHYYYK_MAIN, + Terrain.KASHYYYK_NORTH_DUNGEONS, + Terrain.KASHYYYK_POB_DUNGEONS, + Terrain.KASHYYYK_RRYATT_TRAIL, + Terrain.KASHYYYK_SOUTH_DUNGEONS, + Terrain.KASHYYYK, + Terrain.LOK, + Terrain.MUSTAFAR, + Terrain.NABOO, + Terrain.RORI, + Terrain.TAANAB, + Terrain.TALUS, + Terrain.TATOOINE, + Terrain.UMBRA, + Terrain.YAVIN4, + ) + + } + +} \ No newline at end of file diff --git a/src/utility/java/com/projectswg/utility/clientdata/Converters.java b/src/utility/java/com/projectswg/utility/clientdata/Converters.java index f18117779..1d79d69cf 100644 --- a/src/utility/java/com/projectswg/utility/clientdata/Converters.java +++ b/src/utility/java/com/projectswg/utility/clientdata/Converters.java @@ -18,7 +18,8 @@ public enum Converters { BUFFS (() -> new ConvertDatatable("datatables/buff/buff.iff", "serverdata/buff/buff.sdb", true)), SKILLS (() -> new ConvertDatatable("datatables/skill/skills.iff", "serverdata/skill/skills.sdb", true)), PROFESSION_TEMPLATES (ConvertProfessionTemplates::new), - APPEARANCE_TABLE (() -> new ConvertDatatable("datatables/appearance/appearance_table.iff", "serverdata/appearance/appearance_table.sdb", true)); + APPEARANCE_TABLE (() -> new ConvertDatatable("datatables/appearance/appearance_table.iff", "serverdata/appearance/appearance_table.sdb", true)), + TERRAINS (ConvertTerrain::new); private final Supplier converter;