mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-11 02:54:04 +09:00
saved players position is now restored but offsetted to the right for some reason
This commit is contained in:
@@ -27,11 +27,11 @@ interface HasAssembledSprite {
|
|||||||
* reassembleSprite(this.sprite, this.spriteGlow)
|
* reassembleSprite(this.sprite, this.spriteGlow)
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
|
fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
|
||||||
if (anim != null && sprite != null)
|
if (animDesc != null && sprite != null)
|
||||||
_rebuild(anim, sprite)
|
_rebuild(animDesc!!, sprite)
|
||||||
if (animGlow != null && spriteGlow != null)
|
if (animDescGlow != null && spriteGlow != null)
|
||||||
_rebuild(animGlow, spriteGlow)
|
_rebuild(animDescGlow!!, spriteGlow)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
|
/*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
|
||||||
|
|||||||
@@ -345,12 +345,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun postInitForNewGame() {
|
private fun postInitForNewGame() {
|
||||||
// go to spawn position
|
|
||||||
printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})")
|
|
||||||
|
|
||||||
// worldSavefileName = "$savegameNickname-${world.worldIndex}"
|
|
||||||
// playerSavefileName = (actorGamer.actorValue.getAsString(AVKey.NAME) ?: "Player") + "-${actorGamer.uuid}"
|
|
||||||
|
|
||||||
worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world)
|
worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world)
|
||||||
playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer)
|
playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer)
|
||||||
|
|
||||||
@@ -366,6 +360,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
Common.CHARSET
|
Common.CHARSET
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// go to spawn position
|
||||||
|
printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})")
|
||||||
actorGamer.setPosition(
|
actorGamer.setPosition(
|
||||||
world.spawnX * TILE_SIZED,
|
world.spawnX * TILE_SIZED,
|
||||||
world.spawnY * TILE_SIZED
|
world.spawnY * TILE_SIZED
|
||||||
|
|||||||
@@ -1,16 +1,5 @@
|
|||||||
package net.torvald.terrarum.modulebasegame.console
|
package net.torvald.terrarum.modulebasegame.console
|
||||||
|
|
||||||
import net.torvald.terrarum.App
|
|
||||||
import net.torvald.terrarum.Terrarum
|
|
||||||
import net.torvald.terrarum.Terrarum.ingame
|
|
||||||
import net.torvald.terrarum.console.ConsoleCommand
|
|
||||||
import net.torvald.terrarum.console.Echo
|
|
||||||
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
|
||||||
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
|
|
||||||
import net.torvald.terrarum.serialise.WriteActor
|
|
||||||
import net.torvald.terrarum.serialise.WriteWorld
|
|
||||||
import java.io.IOException
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2017-07-18.
|
* Created by minjaesong on 2017-07-18.
|
||||||
*/
|
*/
|
||||||
@@ -34,7 +23,7 @@ import java.io.IOException
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
object ExportWorld : ConsoleCommand {
|
/*object ExportWorld : ConsoleCommand {
|
||||||
override fun execute(args: Array<String>) {
|
override fun execute(args: Array<String>) {
|
||||||
if (args.size == 2) {
|
if (args.size == 2) {
|
||||||
try {
|
try {
|
||||||
@@ -57,9 +46,9 @@ object ExportWorld : ConsoleCommand {
|
|||||||
override fun printUsage() {
|
override fun printUsage() {
|
||||||
Echo("Usage: Exportworld filename-without-extension")
|
Echo("Usage: Exportworld filename-without-extension")
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
object ExportActor : ConsoleCommand {
|
/*object ExportActor : ConsoleCommand {
|
||||||
override fun execute(args: Array<String>) {
|
override fun execute(args: Array<String>) {
|
||||||
if (args.size == 2) {
|
if (args.size == 2) {
|
||||||
try {
|
try {
|
||||||
@@ -89,4 +78,4 @@ object ExportActor : ConsoleCommand {
|
|||||||
Echo("Usage: exportactor (id) filename-without-extension")
|
Echo("Usage: exportactor (id) filename-without-extension")
|
||||||
Echo("blank ID for player")
|
Echo("blank ID for player")
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
@@ -78,18 +78,18 @@ class IngamePlayer : ActorHumanoid {
|
|||||||
* reassembleSprite(this.sprite, this.spriteGlow)
|
* reassembleSprite(this.sprite, this.spriteGlow)
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
|
fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
|
||||||
if (anim != null && sprite != null)
|
if (animDesc != null && sprite != null)
|
||||||
_rebuild(anim, sprite)
|
_rebuild(animDesc!!, sprite)
|
||||||
if (animGlow != null && spriteGlow != null)
|
if (animDescGlow != null && spriteGlow != null)
|
||||||
_rebuild(animGlow, spriteGlow)
|
_rebuild(animDescGlow!!, spriteGlow)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
|
fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
|
||||||
if (anim != null && sprite != null)
|
if (animDesc != null && sprite != null)
|
||||||
_rebuild(disk, anim, sprite)
|
_rebuild(disk, animDesc!!, sprite)
|
||||||
if (animGlow != null && spriteGlow != null)
|
if (animDescGlow != null && spriteGlow != null)
|
||||||
_rebuild(disk, animGlow, spriteGlow)
|
_rebuild(disk, animDescGlow!!, spriteGlow)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) {
|
private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) {
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameactors
|
|||||||
|
|
||||||
import net.torvald.spriteanimation.SpriteAnimation
|
import net.torvald.spriteanimation.SpriteAnimation
|
||||||
import net.torvald.terrarum.ModMgr
|
import net.torvald.terrarum.ModMgr
|
||||||
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
|
||||||
import net.torvald.terrarum.gameactors.AVKey
|
import net.torvald.terrarum.gameactors.AVKey
|
||||||
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2017-02-10.
|
* Created by minjaesong on 2017-02-10.
|
||||||
@@ -31,7 +29,7 @@ object PlayerBuilderTestSubject1 {
|
|||||||
|
|
||||||
p.sprite = SpriteAnimation(p)
|
p.sprite = SpriteAnimation(p)
|
||||||
p.spriteGlow = SpriteAnimation(p)
|
p.spriteGlow = SpriteAnimation(p)
|
||||||
p.reassembleSprite(p.sprite, p.animDesc, p.spriteGlow, p.animDescGlow)
|
p.reassembleSprite(p.sprite, p.spriteGlow)
|
||||||
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)
|
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)
|
||||||
|
|
||||||
// ingame must teleport the player to the spawn point
|
// ingame must teleport the player to the spawn point
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import net.torvald.spriteanimation.SpriteAnimation
|
|||||||
import net.torvald.terrarum.ModMgr
|
import net.torvald.terrarum.ModMgr
|
||||||
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
|
||||||
import net.torvald.terrarum.gameactors.AVKey
|
import net.torvald.terrarum.gameactors.AVKey
|
||||||
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by minjaesong on 2021-07-07.
|
* Created by minjaesong on 2021-07-07.
|
||||||
@@ -31,7 +30,7 @@ object PlayerBuilderWerebeastTest {
|
|||||||
|
|
||||||
p.sprite = SpriteAnimation(p)
|
p.sprite = SpriteAnimation(p)
|
||||||
p.spriteGlow = SpriteAnimation(p)
|
p.spriteGlow = SpriteAnimation(p)
|
||||||
p.reassembleSprite(p.sprite, p.animDesc, p.spriteGlow, p.animDescGlow)
|
p.reassembleSprite(p.sprite, p.spriteGlow)
|
||||||
p.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0)
|
p.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0)
|
||||||
|
|
||||||
p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE)
|
p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE)
|
||||||
|
|||||||
@@ -459,13 +459,13 @@ class UIItemPlayerCells(
|
|||||||
skimmer.getFile(-1L)?.bytes?.let {
|
skimmer.getFile(-1L)?.bytes?.let {
|
||||||
val animFile = skimmer.getFile(-2L)!!
|
val animFile = skimmer.getFile(-2L)!!
|
||||||
val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET))
|
val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET))
|
||||||
val sprite = SpriteAnimation(p)
|
p.sprite = SpriteAnimation(p)
|
||||||
val animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
|
p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
|
||||||
p.reassembleSprite(skimmer, sprite, animDesc)
|
p.reassembleSprite(skimmer, p.sprite)
|
||||||
sprite.textureRegion.get(0,0).let {
|
p.sprite!!.textureRegion.get(0,0).let {
|
||||||
thumb = it
|
thumb = it
|
||||||
}
|
}
|
||||||
this.sprite = sprite
|
this.sprite = p.sprite
|
||||||
}
|
}
|
||||||
|
|
||||||
hasTexture = true
|
hasTexture = true
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
|
|||||||
import net.torvald.terrarum.realestate.LandUtil
|
import net.torvald.terrarum.realestate.LandUtil
|
||||||
import net.torvald.terrarum.toInt
|
import net.torvald.terrarum.toInt
|
||||||
import net.torvald.terrarum.tvda.*
|
import net.torvald.terrarum.tvda.*
|
||||||
import net.torvald.terrarum.utils.PlayerLastStatus
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.zip.GZIPOutputStream
|
import java.util.zip.GZIPOutputStream
|
||||||
|
|
||||||
@@ -94,11 +93,8 @@ class WorldSavingThread(
|
|||||||
WriteSavegame.saveProgress += 1f
|
WriteSavegame.saveProgress += 1f
|
||||||
|
|
||||||
// Write World //
|
// Write World //
|
||||||
// record all player's last position
|
|
||||||
playersList.forEach {
|
val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t, actorsList, playersList))
|
||||||
ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer)
|
|
||||||
}
|
|
||||||
val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t))
|
|
||||||
val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
|
val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
|
||||||
addFile(disk, world)
|
addFile(disk, world)
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class QuickSingleplayerWorldSavingThread(
|
|||||||
playersList.forEach {
|
playersList.forEach {
|
||||||
ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer)
|
ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer)
|
||||||
}
|
}
|
||||||
val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t))
|
val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t, actorsList, playersList))
|
||||||
val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
|
val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
|
||||||
addFile(disk, world); skimmer.appendEntryOnly(world)
|
addFile(disk, world); skimmer.appendEntryOnly(world)
|
||||||
|
|
||||||
|
|||||||
@@ -65,13 +65,11 @@ object WritePlayer {
|
|||||||
player.totalPlayTime += time_t - ingame.loadedTime_t
|
player.totalPlayTime += time_t - ingame.loadedTime_t
|
||||||
|
|
||||||
|
|
||||||
// restore player prop backup created on load-time
|
// restore player prop backup created on load-time for multiplayer
|
||||||
if (ingame.world.playersLastStatus[player.uuid] != null) {
|
if (ingame.isMultiplayer) {
|
||||||
player.setPosition(player.unauthorisedPlayerProps.physics.position)
|
player.setPosition(player.unauthorisedPlayerProps.physics.position)
|
||||||
if (ingame.isMultiplayer) {
|
player.actorValue = player.unauthorisedPlayerProps.actorValue!!
|
||||||
player.actorValue = player.unauthorisedPlayerProps.actorValue!!
|
player.inventory = player.unauthorisedPlayerProps.inventory!!
|
||||||
player.inventory = player.unauthorisedPlayerProps.inventory!!
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -141,29 +139,22 @@ object ReadActor {
|
|||||||
val bodypartsFile = disk.getFile(-1025)
|
val bodypartsFile = disk.getFile(-1025)
|
||||||
|
|
||||||
actor.sprite = SpriteAnimation(actor)
|
actor.sprite = SpriteAnimation(actor)
|
||||||
if (animFileGlow != null) actor.spriteGlow = SpriteAnimation(actor)
|
actor.animDesc = ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET))
|
||||||
|
if (animFileGlow != null) {
|
||||||
|
actor.spriteGlow = SpriteAnimation(actor)
|
||||||
|
actor.animDescGlow = ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
|
||||||
|
}
|
||||||
|
|
||||||
if (bodypartsFile != null)
|
if (bodypartsFile != null)
|
||||||
actor.reassembleSprite(
|
actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow)
|
||||||
disk,
|
|
||||||
actor.sprite!!,
|
|
||||||
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
|
|
||||||
actor.spriteGlow,
|
|
||||||
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
|
|
||||||
)
|
|
||||||
else
|
else
|
||||||
actor.reassembleSprite(
|
actor.reassembleSprite(actor.sprite!!, actor.spriteGlow)
|
||||||
actor.sprite!!,
|
|
||||||
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
|
|
||||||
actor.spriteGlow,
|
|
||||||
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
else if (actor is ActorWithBody && actor is HasAssembledSprite) {
|
else if (actor is ActorWithBody && actor is HasAssembledSprite) {
|
||||||
if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor)
|
if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor)
|
||||||
if (actor.animDescGlow != null) actor.spriteGlow = SpriteAnimation(actor)
|
if (actor.animDescGlow != null) actor.spriteGlow = SpriteAnimation(actor)
|
||||||
|
|
||||||
actor.reassembleSprite(actor.sprite, actor.animDesc, actor.spriteGlow, actor.animDescGlow)
|
actor.reassembleSprite(actor.sprite, actor.spriteGlow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,25 +41,27 @@ object WriteSavegame {
|
|||||||
|
|
||||||
operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) {
|
operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) {
|
||||||
savingStatus = 0
|
savingStatus = 0
|
||||||
|
val hasThumbnail = (mode == SaveMode.WORLD)
|
||||||
Echo("Save queued")
|
Echo("Save queued")
|
||||||
|
|
||||||
IngameRenderer.screencapExportCallback = {
|
if (hasThumbnail) {
|
||||||
Echo("Generating thumbnail...")
|
IngameRenderer.screencapExportCallback = {
|
||||||
|
Echo("Generating thumbnail...")
|
||||||
|
|
||||||
val w = 960
|
val w = 960
|
||||||
val h = 640
|
val h = 640
|
||||||
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
|
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
|
||||||
IngameRenderer.fboRGBexport = p
|
IngameRenderer.fboRGBexport = p
|
||||||
//PixmapIO2._writeTGA(gzout, p, true, true)
|
//PixmapIO2._writeTGA(gzout, p, true, true)
|
||||||
//p.dispose()
|
//p.dispose()
|
||||||
IngameRenderer.fboRGBexportedLatch = true
|
IngameRenderer.fboRGBexportedLatch = true
|
||||||
|
|
||||||
Echo("Done thumbnail generation")
|
Echo("Done thumbnail generation")
|
||||||
|
}
|
||||||
|
IngameRenderer.screencapRequested = true
|
||||||
}
|
}
|
||||||
IngameRenderer.screencapRequested = true
|
|
||||||
|
|
||||||
val savingThread = Thread(getSaveThread(time_t, mode, disk, outFile, ingame, true, isAuto, errorHandler, callback), "TerrarumBasegameGameSaveThread")
|
val savingThread = Thread(getSaveThread(time_t, mode, disk, outFile, ingame, hasThumbnail, isAuto, errorHandler, callback), "TerrarumBasegameGameSaveThread")
|
||||||
savingThread.start()
|
savingThread.start()
|
||||||
|
|
||||||
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package net.torvald.terrarum.serialise
|
|||||||
import net.torvald.terrarum.CommonResourcePool
|
import net.torvald.terrarum.CommonResourcePool
|
||||||
import net.torvald.terrarum.ReferencingRanges
|
import net.torvald.terrarum.ReferencingRanges
|
||||||
import net.torvald.terrarum.gameactors.Actor
|
import net.torvald.terrarum.gameactors.Actor
|
||||||
import net.torvald.terrarum.gameactors.ActorID
|
|
||||||
import net.torvald.terrarum.gameactors.BlockMarkerActor
|
import net.torvald.terrarum.gameactors.BlockMarkerActor
|
||||||
import net.torvald.terrarum.gameworld.BlockLayer
|
import net.torvald.terrarum.gameworld.BlockLayer
|
||||||
import net.torvald.terrarum.gameworld.GameWorld
|
import net.torvald.terrarum.gameworld.GameWorld
|
||||||
@@ -14,6 +13,7 @@ import net.torvald.terrarum.modulebasegame.worldgenerator.RoguelikeRandomiser
|
|||||||
import net.torvald.terrarum.realestate.LandUtil
|
import net.torvald.terrarum.realestate.LandUtil
|
||||||
import net.torvald.terrarum.tvda.ByteArray64
|
import net.torvald.terrarum.tvda.ByteArray64
|
||||||
import net.torvald.terrarum.tvda.ByteArray64Writer
|
import net.torvald.terrarum.tvda.ByteArray64Writer
|
||||||
|
import net.torvald.terrarum.utils.PlayerLastStatus
|
||||||
import net.torvald.terrarum.weather.WeatherMixer
|
import net.torvald.terrarum.weather.WeatherMixer
|
||||||
import java.io.Reader
|
import java.io.Reader
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ object WriteWorld {
|
|||||||
actor !is IngamePlayer // IngamePlayers must not be saved with the world
|
actor !is IngamePlayer // IngamePlayers must not be saved with the world
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun preWrite(ingame: TerrarumIngame, time_t: Long): GameWorld {
|
private fun preWrite(ingame: TerrarumIngame, time_t: Long, actorsList: List<Actor>, playersList: List<IngamePlayer>): GameWorld {
|
||||||
val world = ingame.world
|
val world = ingame.world
|
||||||
val currentPlayTime_t = time_t - ingame.loadedTime_t
|
val currentPlayTime_t = time_t - ingame.loadedTime_t
|
||||||
|
|
||||||
@@ -38,29 +38,30 @@ object WriteWorld {
|
|||||||
world.lastPlayTime = time_t
|
world.lastPlayTime = time_t
|
||||||
world.totalPlayTime += currentPlayTime_t
|
world.totalPlayTime += currentPlayTime_t
|
||||||
|
|
||||||
val actorIDbuf = ArrayList<ActorID>()
|
|
||||||
ingame.actorContainerActive.cloneToList().filter { actorAcceptable(it) }.forEach { actorIDbuf.add(it.referenceID) }
|
|
||||||
ingame.actorContainerInactive.cloneToList().filter { actorAcceptable(it) }.forEach { actorIDbuf.add(it.referenceID) }
|
|
||||||
|
|
||||||
world.actors.clear()
|
world.actors.clear()
|
||||||
world.actors.addAll(actorIDbuf.sorted().distinct())
|
world.actors.addAll(actorsList.map { it.referenceID }.sorted().distinct())
|
||||||
|
|
||||||
world.randSeeds[0] = RoguelikeRandomiser.RNG.state0
|
world.randSeeds[0] = RoguelikeRandomiser.RNG.state0
|
||||||
world.randSeeds[1] = RoguelikeRandomiser.RNG.state1
|
world.randSeeds[1] = RoguelikeRandomiser.RNG.state1
|
||||||
world.randSeeds[2] = WeatherMixer.RNG.state0
|
world.randSeeds[2] = WeatherMixer.RNG.state0
|
||||||
world.randSeeds[3] = WeatherMixer.RNG.state1
|
world.randSeeds[3] = WeatherMixer.RNG.state1
|
||||||
|
|
||||||
|
// record all player's last position
|
||||||
|
playersList.forEach {
|
||||||
|
world.playersLastStatus.put(it.uuid.toString(), PlayerLastStatus(it, ingame.isMultiplayer))
|
||||||
|
}
|
||||||
|
|
||||||
return world
|
return world
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun invoke(ingame: TerrarumIngame, time_t: Long): String {
|
operator fun invoke(ingame: TerrarumIngame, time_t: Long, actorsList: List<Actor>, playersList: List<IngamePlayer>): String {
|
||||||
return Common.jsoner.toJson(preWrite(ingame, time_t))
|
return Common.jsoner.toJson(preWrite(ingame, time_t, actorsList, playersList))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun encodeToByteArray64(ingame: TerrarumIngame, time_t: Long): ByteArray64 {
|
fun encodeToByteArray64(ingame: TerrarumIngame, time_t: Long, actorsList: List<Actor>, playersList: List<IngamePlayer>): ByteArray64 {
|
||||||
val baw = ByteArray64Writer(Common.CHARSET)
|
val baw = ByteArray64Writer(Common.CHARSET)
|
||||||
|
|
||||||
Common.jsoner.toJson(preWrite(ingame, time_t), baw)
|
Common.jsoner.toJson(preWrite(ingame, time_t, actorsList, playersList), baw)
|
||||||
baw.flush(); baw.close()
|
baw.flush(); baw.close()
|
||||||
|
|
||||||
return baw.toByteArray64()
|
return baw.toByteArray64()
|
||||||
|
|||||||
Reference in New Issue
Block a user