mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-15 04:54:05 +09:00
saved players position is now restored but offsetted to the right for some reason
This commit is contained in:
@@ -10,7 +10,6 @@ import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
|
||||
import net.torvald.terrarum.realestate.LandUtil
|
||||
import net.torvald.terrarum.toInt
|
||||
import net.torvald.terrarum.tvda.*
|
||||
import net.torvald.terrarum.utils.PlayerLastStatus
|
||||
import java.io.File
|
||||
import java.util.zip.GZIPOutputStream
|
||||
|
||||
@@ -94,11 +93,8 @@ class WorldSavingThread(
|
||||
WriteSavegame.saveProgress += 1f
|
||||
|
||||
// Write World //
|
||||
// record all player's last position
|
||||
playersList.forEach {
|
||||
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)
|
||||
addFile(disk, world)
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ class QuickSingleplayerWorldSavingThread(
|
||||
playersList.forEach {
|
||||
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)
|
||||
addFile(disk, world); skimmer.appendEntryOnly(world)
|
||||
|
||||
|
||||
@@ -65,13 +65,11 @@ object WritePlayer {
|
||||
player.totalPlayTime += time_t - ingame.loadedTime_t
|
||||
|
||||
|
||||
// restore player prop backup created on load-time
|
||||
if (ingame.world.playersLastStatus[player.uuid] != null) {
|
||||
// restore player prop backup created on load-time for multiplayer
|
||||
if (ingame.isMultiplayer) {
|
||||
player.setPosition(player.unauthorisedPlayerProps.physics.position)
|
||||
if (ingame.isMultiplayer) {
|
||||
player.actorValue = player.unauthorisedPlayerProps.actorValue!!
|
||||
player.inventory = player.unauthorisedPlayerProps.inventory!!
|
||||
}
|
||||
player.actorValue = player.unauthorisedPlayerProps.actorValue!!
|
||||
player.inventory = player.unauthorisedPlayerProps.inventory!!
|
||||
}
|
||||
|
||||
|
||||
@@ -141,29 +139,22 @@ object ReadActor {
|
||||
val bodypartsFile = disk.getFile(-1025)
|
||||
|
||||
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)
|
||||
actor.reassembleSprite(
|
||||
disk,
|
||||
actor.sprite!!,
|
||||
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
|
||||
actor.spriteGlow,
|
||||
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
|
||||
)
|
||||
actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow)
|
||||
else
|
||||
actor.reassembleSprite(
|
||||
actor.sprite!!,
|
||||
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
|
||||
actor.spriteGlow,
|
||||
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
|
||||
)
|
||||
actor.reassembleSprite(actor.sprite!!, actor.spriteGlow)
|
||||
}
|
||||
else if (actor is ActorWithBody && actor is HasAssembledSprite) {
|
||||
if (actor.animDesc != null) actor.sprite = 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) {
|
||||
savingStatus = 0
|
||||
|
||||
val hasThumbnail = (mode == SaveMode.WORLD)
|
||||
Echo("Save queued")
|
||||
|
||||
IngameRenderer.screencapExportCallback = {
|
||||
Echo("Generating thumbnail...")
|
||||
if (hasThumbnail) {
|
||||
IngameRenderer.screencapExportCallback = {
|
||||
Echo("Generating thumbnail...")
|
||||
|
||||
val w = 960
|
||||
val h = 640
|
||||
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
|
||||
IngameRenderer.fboRGBexport = p
|
||||
//PixmapIO2._writeTGA(gzout, p, true, true)
|
||||
//p.dispose()
|
||||
IngameRenderer.fboRGBexportedLatch = true
|
||||
val w = 960
|
||||
val h = 640
|
||||
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
|
||||
IngameRenderer.fboRGBexport = p
|
||||
//PixmapIO2._writeTGA(gzout, p, true, true)
|
||||
//p.dispose()
|
||||
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()
|
||||
|
||||
// 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.ReferencingRanges
|
||||
import net.torvald.terrarum.gameactors.Actor
|
||||
import net.torvald.terrarum.gameactors.ActorID
|
||||
import net.torvald.terrarum.gameactors.BlockMarkerActor
|
||||
import net.torvald.terrarum.gameworld.BlockLayer
|
||||
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.tvda.ByteArray64
|
||||
import net.torvald.terrarum.tvda.ByteArray64Writer
|
||||
import net.torvald.terrarum.utils.PlayerLastStatus
|
||||
import net.torvald.terrarum.weather.WeatherMixer
|
||||
import java.io.Reader
|
||||
|
||||
@@ -29,7 +29,7 @@ object WriteWorld {
|
||||
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 currentPlayTime_t = time_t - ingame.loadedTime_t
|
||||
|
||||
@@ -38,29 +38,30 @@ object WriteWorld {
|
||||
world.lastPlayTime = time_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.addAll(actorIDbuf.sorted().distinct())
|
||||
world.actors.addAll(actorsList.map { it.referenceID }.sorted().distinct())
|
||||
|
||||
world.randSeeds[0] = RoguelikeRandomiser.RNG.state0
|
||||
world.randSeeds[1] = RoguelikeRandomiser.RNG.state1
|
||||
world.randSeeds[2] = WeatherMixer.RNG.state0
|
||||
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
|
||||
}
|
||||
|
||||
operator fun invoke(ingame: TerrarumIngame, time_t: Long): String {
|
||||
return Common.jsoner.toJson(preWrite(ingame, time_t))
|
||||
operator fun invoke(ingame: TerrarumIngame, time_t: Long, actorsList: List<Actor>, playersList: List<IngamePlayer>): String {
|
||||
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)
|
||||
|
||||
Common.jsoner.toJson(preWrite(ingame, time_t), baw)
|
||||
Common.jsoner.toJson(preWrite(ingame, time_t, actorsList, playersList), baw)
|
||||
baw.flush(); baw.close()
|
||||
|
||||
return baw.toByteArray64()
|
||||
|
||||
Reference in New Issue
Block a user