Skip to content

Commit

Permalink
Support character version 37. Should fix #65 and #25
Browse files Browse the repository at this point in the history
  • Loading branch information
Kakoen committed Apr 21, 2023
1 parent a11e43d commit 01c8fd1
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 56 deletions.
Expand Up @@ -23,7 +23,7 @@
@Slf4j
public class ValheimCharacter implements ValheimArchive {

private static final int MAX_SUPPORTED_CHARACTER_VERSION = 33;
private static final int MAX_SUPPORTED_CHARACTER_VERSION = 37;

private int version;
private int kills;
Expand Down
Expand Up @@ -18,7 +18,7 @@
@Slf4j
public class Inventory {

private static final int MAX_SUPPORTED_INVENTORY_VERSION = 103;
private static final int MAX_SUPPORTED_INVENTORY_VERSION = 104;

private int version;
private List<InventoryItem> inventoryItems;
Expand Down
Expand Up @@ -3,10 +3,12 @@
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import net.kakoen.valheim.save.parser.ZPackage;
import net.kakoen.valheim.save.struct.Vector2i;

import java.util.LinkedHashMap;
import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
Expand All @@ -21,7 +23,8 @@ public class InventoryItem {
private int variant;
private long crafterId;
private String crafterName;

private Map<String, String> customData;

public InventoryItem(ZPackage zPackage, int version) {
name = zPackage.readString();
stack = zPackage.readInt32();
Expand All @@ -32,6 +35,7 @@ public InventoryItem(ZPackage zPackage, int version) {
variant = version >= 102 ? zPackage.readInt32() : 0;
crafterId = version >= 103 ? zPackage.readLong() : 0;
crafterName = version >= 103 ? zPackage.readString() : "";
customData = version >= 104 ? zPackage.readMap() : new LinkedHashMap<>();
}

public void save(ZPackage writer) {
Expand All @@ -44,5 +48,6 @@ public void save(ZPackage writer) {
writer.writeInt32(variant);
writer.writeLong(crafterId);
writer.writeString(crafterName);
writer.writeMap(customData);
}
}
Expand Up @@ -18,18 +18,21 @@ public class MapPin {
private Vector3 position;
private PinType pinType;
private boolean checked;
private long ownerId;

public MapPin(ZPackage zPackage, int mapVersion) {
name = zPackage.readString();
position = zPackage.readVector3();
pinType = new PinType(zPackage.readInt32());
checked = (mapVersion >= 3) && zPackage.readBool();
ownerId = mapVersion >= 6 ? zPackage.readLong() : 0L;
}

public void save(ZPackage writer) {
writer.writeString(name);
writer.writeVector3(position);
writer.writeInt32(pinType.getId());
writer.writeBool(checked);
writer.writeLong(ownerId);
}
}
@@ -1,28 +1,28 @@
package net.kakoen.valheim.save.archive.character;

import java.util.ArrayList;
import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import net.kakoen.valheim.save.archive.hints.ValheimArchiveReaderHints;
import net.kakoen.valheim.save.exception.ValheimArchiveUnsupportedVersionException;
import net.kakoen.valheim.save.parser.ZPackage;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MinimapData {

private static final int MAX_SUPPORTED_MAP_VERSION = 4;
private static final int MAX_SUPPORTED_MAP_VERSION = 7;

private int version;
private int textureSize;
private byte[] explored;
private byte[] exploredOthers;
private List<MapPin> pins;
private boolean visibleToOthers;

Expand All @@ -34,30 +34,41 @@ public MinimapData(ZPackage zPackage, ValheimArchiveReaderHints hints) throws Va
}
log.warn("Map version {} encountered, but latest tested map version was {}", version, MAX_SUPPORTED_MAP_VERSION);
}
textureSize = zPackage.readInt32();
explored = zPackage.readBytes(textureSize * textureSize);


ZPackage minimapPackage = version >= 7 ? zPackage.readCompressedPackage() : zPackage;

textureSize = minimapPackage.readInt32();
explored = minimapPackage.readBytes(textureSize * textureSize);

if(version >= 5) {
exploredOthers = minimapPackage.readBytes(textureSize * textureSize);
}

if(version >= 2) {
int pinsCount = zPackage.readInt32();
int pinsCount = minimapPackage.readInt32();
pins = new ArrayList<>();
for(int i = 0; i < pinsCount; i++) {
pins.add(new MapPin(zPackage, version));
pins.add(new MapPin(minimapPackage, version));
}
}

if(version >= 4) {
visibleToOthers = zPackage.readBool();
visibleToOthers = minimapPackage.readBool();
}
}

public void save(ZPackage zPackage) {
zPackage.writeInt32(version);
zPackage.writeInt32(textureSize);
zPackage.writeBytes(explored);

zPackage.writeInt32(pins.size());
pins.forEach(pin -> pin.save(zPackage));

zPackage.writeBool(visibleToOthers);

zPackage.writeCompressedPackage(minimapPackage -> {
minimapPackage.writeInt32(textureSize);
minimapPackage.writeBytes(explored);
minimapPackage.writeBytes(exploredOthers);

minimapPackage.writeInt32(pins.size());
pins.forEach(pin -> pin.save(minimapPackage));

minimapPackage.writeBool(visibleToOthers);
});
}
}
Expand Up @@ -22,14 +22,15 @@
@AllArgsConstructor
@Slf4j
public class PlayerData {
private static final int MAX_SUPPORTED_PLAYERDATA_VERSION = 24;

private static final int MAX_SUPPORTED_PLAYERDATA_VERSION = 26;
private static final int MAX_SUPPORTED_SKILLS_VERSION = 2;

private int version;
private float maxHealth;
private float health;
private float stamina;
private float stamina2;
private boolean firstSpawn;
private float timeSinceDeath;
private String guardianPower;
Expand All @@ -50,10 +51,13 @@ public class PlayerData {
private Vector3 hairColor;
private int modelIndex;
private List<Food> foods;

private int skillsVersion;
private Map<Integer, Skill> skills;

private Map<String, String> customData;
private float maxEitr;
private float eitr;

public PlayerData(ZPackage zPackage, ValheimArchiveReaderHints hints) throws ValheimArchiveUnsupportedVersionException {
version = zPackage.readInt32();
if(version > MAX_SUPPORTED_PLAYERDATA_VERSION) {
Expand Down Expand Up @@ -85,21 +89,20 @@ public PlayerData(ZPackage zPackage, ValheimArchiveReaderHints hints) throws Val
this.zdoId = new ZdoId(zPackage);
}
this.inventory = new Inventory(zPackage, hints);

knownRecipes = zPackage.readStringSet();

// Known stations

int knownStationsCount = zPackage.readInt32();
knownStations = new LinkedHashMap<>();
for(int i = 0; i < knownStationsCount; i++) {
knownStations.put(zPackage.readString(), zPackage.readInt32());
}

knownMaterials = zPackage.readStringSet();
shownTutorials = zPackage.readStringSet();
uniques = zPackage.readStringSet();
trophies = zPackage.readStringSet();

// Known biomes
int knownBiomesCount = zPackage.readInt32();
knownBiomes = new LinkedHashMap<>();
Expand All @@ -112,29 +115,37 @@ public PlayerData(ZPackage zPackage, ValheimArchiveReaderHints hints) throws Val
}
knownBiomes.put(biomeId, biomeName);
}

int knownTextsCount = zPackage.readInt32();
knownTexts = new LinkedHashMap<>();
for(int i = 0; i < knownTextsCount; i++) {
knownTexts.put(zPackage.readString(), zPackage.readString());
}

beardItem = zPackage.readString();
hairItem = zPackage.readString();
skinColor = zPackage.readVector3();
hairColor = zPackage.readVector3();
modelIndex = zPackage.readInt32();

int foodsCount = zPackage.readInt32();
foods = new ArrayList<>();
for(int i = 0; i < foodsCount; i++) {
foods.add(new Food(zPackage));
}

readSkills(zPackage, hints);


customData = version >= 26 ? zPackage.readMap() : new LinkedHashMap<>();

if (version >= 26) {
stamina2 = zPackage.readSingle();
maxEitr = zPackage.readSingle();
eitr = zPackage.readSingle();
}

}

private void readSkills(ZPackage zPackage, ValheimArchiveReaderHints hints) throws ValheimArchiveUnsupportedVersionException {
skillsVersion = zPackage.readInt32();
if(skillsVersion > MAX_SUPPORTED_SKILLS_VERSION) {
Expand All @@ -143,14 +154,14 @@ private void readSkills(ZPackage zPackage, ValheimArchiveReaderHints hints) thro
}
log.warn("Skills version is {}, last tested version is {}", version, MAX_SUPPORTED_SKILLS_VERSION);
}

int skillCount = zPackage.readInt32();
skills = new LinkedHashMap<>();
for(int i = 0; i < skillCount; i++) {
skills.put(zPackage.readInt32(), new Skill(zPackage.readSingle(), zPackage.readSingle()));
}
}

public void save(ZPackage writer) {
writer.writeInt32(MAX_SUPPORTED_PLAYERDATA_VERSION);
writer.writeSingle(maxHealth);
Expand All @@ -161,46 +172,50 @@ public void save(ZPackage writer) {
writer.writeString(guardianPower);
writer.writeSingle(guardianPowerCooldown);
inventory.save(writer);

writer.writeStringSet(knownRecipes);

writer.writeInt32(knownStations.size());
knownStations.forEach((k, v) -> {
writer.writeString(k);
writer.writeInt32(v);
});

writer.writeStringSet(knownMaterials);
writer.writeStringSet(shownTutorials);
writer.writeStringSet(uniques);
writer.writeStringSet(trophies);

writer.writeInt32(knownBiomes.size());
knownBiomes.forEach((k, v) -> {
writer.writeInt32(k);
});

writer.writeInt32(knownTexts.size());
knownTexts.forEach((k, v) -> {
writer.writeString(k);
writer.writeString(v);
});

writer.writeString(beardItem);
writer.writeString(hairItem);
writer.writeVector3(skinColor);
writer.writeVector3(hairColor);
writer.writeInt32(modelIndex);

writer.writeInt32(foods.size());
foods.forEach(food -> food.save(writer));

writer.writeInt32(MAX_SUPPORTED_SKILLS_VERSION);
writer.writeInt32(skills.size());
skills.forEach((key, skill) -> {
writer.writeInt32(key);
skill.save(writer);
});
writer.writeMap(customData);
writer.writeSingle(stamina2);
writer.writeSingle(maxEitr);
writer.writeSingle(eitr);
}
}

0 comments on commit 01c8fd1

Please sign in to comment.