@@ -2,25 +2,19 @@ package world.gregs.voidps.engine.data.definition
22
33import com.github.michaelbull.logging.InlineLogger
44import world.gregs.voidps.cache.Cache
5- import world.gregs.voidps.cache.FileCache
65import world.gregs.voidps.cache.Index
76import world.gregs.voidps.cache.definition.decoder.MapTileDecoder
8- import world.gregs.voidps.cache.definition.decoder.ObjectDecoder
97import world.gregs.voidps.engine.client.ui.chat.plural
10- import world.gregs.voidps.engine.client.update.batch.ZoneBatchUpdates
8+ import world.gregs.voidps.engine.data.ConfigFiles
119import world.gregs.voidps.engine.data.Settings
12- import world.gregs.voidps.engine.data.configFiles
1310import world.gregs.voidps.engine.entity.obj.GameObjects
1411import world.gregs.voidps.engine.map.collision.CollisionDecoder
15- import world.gregs.voidps.engine.map.collision.Collisions
16- import world.gregs.voidps.engine.map.collision.GameObjectCollisionAdd
17- import world.gregs.voidps.engine.map.collision.GameObjectCollisionRemove
1812import world.gregs.voidps.engine.map.obj.MapObjectsDecoder
1913import world.gregs.voidps.engine.map.obj.MapObjectsRotatedDecoder
2014import world.gregs.voidps.type.Region
2115import world.gregs.voidps.type.Zone
16+ import java.io.File
2217import kotlin.system.exitProcess
23- import kotlin.time.measureTimedValue
2418
2519/* *
2620 * Loads map collision and objects fast and direct
@@ -38,30 +32,53 @@ class MapDefinitions(
3832 private val decoder = MapObjectsDecoder (objects, definitions)
3933 private val rotationDecoder = MapObjectsRotatedDecoder (objects, definitions)
4034
41- fun loadCache ( xteas : Map <Int , IntArray >? = null): MapDefinitions {
35+ fun load ( configFiles : ConfigFiles , xteas : Map <Int , IntArray >? = null): MapDefinitions {
4236 try {
43- val start = System .currentTimeMillis()
44- var regions = 0
45- val settings = ByteArray (16384 )
46- for (regionX in 0 until 256 ) {
47- for (regionY in 0 until 256 ) {
48- if (! loadSettings(cache, regionX, regionY, settings)) {
49- continue
50- }
51- collisions.decode(settings, regionX shl 6 , regionY shl 6 )
52- val keys = if (xteas != null ) xteas[Region .id(regionX, regionY)] else null
53- decoder.decode(cache, settings, regionX, regionY, keys)
54- regions++
55- }
37+ if (! Settings [" storage.caching.active" , false ]) {
38+ loadCache(xteas)
39+ return this
40+ }
41+ val path = Settings [" storage.caching.path" ]
42+ File (path).mkdirs()
43+ val objectsFile = File (" ${path}${Settings [" storage.caching.objects" ]} " )
44+ val collisionsFile = File (" ${path}${Settings [" storage.caching.collisions" ]} " )
45+ if (objectsFile.exists() && collisionsFile.exists() && ! configFiles.cacheUpdate) {
46+ val start = System .currentTimeMillis()
47+ val zones = collisions.load(collisionsFile)
48+ objects.load(objectsFile)
49+ logger.info { " Loaded all maps $zones zones ${objects.size} ${" object" .plural(objects.size)} in ${System .currentTimeMillis() - start} ms" }
50+ } else {
51+ loadCache(xteas)
52+ val start = System .currentTimeMillis()
53+ collisions.save(collisionsFile)
54+ objects.save(objectsFile)
55+ logger.info { " Cached maps in ${System .currentTimeMillis() - start} ms" }
5656 }
57- logger.info { " Loaded $regions maps ${objects.size} ${" object" .plural(objects.size)} in ${System .currentTimeMillis() - start} ms" }
5857 return this
5958 } catch (e: ArrayIndexOutOfBoundsException ) {
6059 logger.error(e) { " Error loading map definition; do you have the latest cache?" }
6160 exitProcess(1 )
6261 }
6362 }
6463
64+ private fun loadCache (xteas : Map <Int , IntArray >? = null) {
65+ val start = System .currentTimeMillis()
66+ var regions = 0
67+ val settings = ByteArray (16384 )
68+ for (regionX in 0 until 256 ) {
69+ for (regionY in 0 until 256 ) {
70+ if (! loadSettings(cache, regionX, regionY, settings)) {
71+ continue
72+ }
73+ collisions.decode(settings, regionX shl 6 , regionY shl 6 )
74+ val keys = if (xteas != null ) xteas[Region .id(regionX, regionY)] else null
75+ decoder.decode(cache, settings, regionX, regionY, keys)
76+ regions++
77+ }
78+ }
79+ logger.info { " Loaded $regions maps ${objects.size} ${" object" .plural(objects.size)} in ${System .currentTimeMillis() - start} ms" }
80+ }
81+
6582 fun loadZone (from : Zone , to : Zone , rotation : Int , xteas : Map <Int , IntArray >? = null) {
6683 val start = System .currentTimeMillis()
6784 val settings = loadSettings(cache, from.region.x, from.region.y) ? : return
@@ -95,19 +112,4 @@ class MapDefinitions(
95112 return settings
96113 }
97114
98- companion object {
99- @JvmStatic
100- fun main (args : Array <String >) {
101- val properties = Settings .load()
102- // properties["storage.cache.path"] = "./data/cache-old/"
103- val (cache, duration) = measureTimedValue { FileCache .load(properties) }
104- println (" Loaded cache in ${duration.inWholeMilliseconds} ms" )
105- val files = configFiles()
106- val definitions = ObjectDefinitions (ObjectDecoder (member = true , lowDetail = false ).load(cache)).load(files.list(Settings [" definitions.objects" ]))
107- val collisions = Collisions ()
108- val add = GameObjectCollisionAdd (collisions)
109- val remove = GameObjectCollisionRemove (collisions)
110- val defs = MapDefinitions (CollisionDecoder (collisions), definitions, GameObjects (add, remove, ZoneBatchUpdates (), definitions, storeUnused = true ), cache).loadCache()
111- }
112- }
113115}
0 commit comments