Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try to show characters' stories and voices #94

Merged
merged 5 commits into from
Apr 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/main/java/emu/grasscutter/data/GenshinData.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package emu.grasscutter.data;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import emu.grasscutter.Grasscutter;
Expand Down Expand Up @@ -54,6 +56,10 @@ public class GenshinData {
private static final Int2ObjectMap<AvatarCostumeData> avatarCostumeDataItemIdMap = new Int2ObjectLinkedOpenHashMap<>();

private static final Int2ObjectMap<SceneData> sceneDataMap = new Int2ObjectLinkedOpenHashMap<>();
private static final Int2ObjectMap<FetterData> fetterDataMap = new Int2ObjectOpenHashMap<>();

// Cache
private static Map<Integer, List<Integer>> fetters = new HashMap<>();

public static Int2ObjectMap<?> getMapByResourceDef(Class<?> resourceDefinition) {
Int2ObjectMap<?> map = null;
Expand Down Expand Up @@ -221,4 +227,17 @@ public static Int2ObjectMap<AvatarCostumeData> getAvatarCostumeDataItemIdMap() {
public static Int2ObjectMap<SceneData> getSceneDataMap() {
return sceneDataMap;
}

public static Map<Integer, List<Integer>> getFetterDataEntries() {
if (fetters.isEmpty()) {
fetterDataMap.forEach((k, v) -> {
if (!fetters.containsKey(v.getAvatarId())) {
fetters.put(v.getAvatarId(), new ArrayList<>());
}
fetters.get(v.getAvatarId()).add(k);
});
}

return fetters;
}
}
9 changes: 9 additions & 0 deletions src/main/java/emu/grasscutter/data/def/AvatarData.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ public class AvatarData extends GenshinResource {
private float[] defenseGrowthCurve;
private AvatarSkillDepotData skillDepot;
private IntList abilities;

private List<Integer> fetters;

@Override
public int getId(){
Expand Down Expand Up @@ -193,9 +195,16 @@ public IntList getAbilities() {
return abilities;
}

public List<Integer> getFetters() {
return fetters;
}

@Override
public void onLoad() {
this.skillDepot = GenshinData.getAvatarSkillDepotDataMap().get(this.SkillDepotId);

// Get fetters from GenshinData
this.fetters = GenshinData.getFetterDataEntries().get(this.Id);

int size = GenshinData.getAvatarCurveDataMap().size();
this.hpGrowthCurve = new float[size];
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/emu/grasscutter/data/def/FetterData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package emu.grasscutter.data.def;

import emu.grasscutter.data.GenshinResource;
import emu.grasscutter.data.ResourceType;
import emu.grasscutter.data.ResourceType.LoadPriority;

@ResourceType(name = {"FetterInfoExcelConfigData.json", "FettersExcelConfigData.json", "FetterStoryExcelConfigData.json"}, loadPriority = LoadPriority.HIGHEST)
public class FetterData extends GenshinResource {
private int AvatarId;
private int FetterId;

@Override
public int getId() {
return FetterId;
}

public int getAvatarId() {
return AvatarId;
}

@Override
public void onLoad() {
}
}
36 changes: 34 additions & 2 deletions src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package emu.grasscutter.game.avatar;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

Expand Down Expand Up @@ -39,9 +41,11 @@
import emu.grasscutter.game.inventory.GenshinItem;
import emu.grasscutter.game.props.ElementType;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.FetterState;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo;
import emu.grasscutter.net.proto.FetterDataOuterClass.FetterData;
import emu.grasscutter.net.proto.AvatarInfoOuterClass.AvatarInfo;
import emu.grasscutter.server.packet.send.PacketAbilityChangeNotify;
import emu.grasscutter.server.packet.send.PacketAvatarEquipChangeNotify;
Expand Down Expand Up @@ -73,6 +77,8 @@ public class GenshinAvatar {
@Transient private final Int2FloatOpenHashMap fightProp;
@Transient private Set<String> extraAbilityEmbryos;

private List<Integer> fetters;

private Map<Integer, Integer> skillLevelMap; // Talent levels
private Map<Integer, Integer> proudSkillBonusMap; // Talent bonus levels (from const)
private int skillDepotId;
Expand All @@ -89,7 +95,8 @@ public GenshinAvatar() {
this.equips = new Int2ObjectOpenHashMap<>();
this.fightProp = new Int2FloatOpenHashMap();
this.extraAbilityEmbryos = new HashSet<>();
this.proudSkillBonusMap = new HashMap<>(); // TODO Move to genshin avatar
this.proudSkillBonusMap = new HashMap<>();
this.fetters = new ArrayList<>(); // TODO Move to genshin avatar
}

// On creation
Expand Down Expand Up @@ -266,6 +273,14 @@ public Set<String> getExtraAbilityEmbryos() {
return extraAbilityEmbryos;
}

public void setFetterList(List<Integer> fetterList) {
this.fetters = fetterList;
}

public List<Integer> getFetterList() {
return fetters;
}

public float getCurrentHp() {
return currentHp;
}
Expand Down Expand Up @@ -385,6 +400,9 @@ public void recalcStats(boolean forceSendAbilityChange) {
// Extra ability embryos
Set<String> prevExtraAbilityEmbryos = this.getExtraAbilityEmbryos();
this.extraAbilityEmbryos = new HashSet<>();

// Fetters
this.setFetterList(data.getFetters());

// Get hp percent, set to 100% if none
float hpPercent = this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) <= 0 ? 1f : this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) / this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP);
Expand Down Expand Up @@ -683,6 +701,20 @@ public void save() {
}

public AvatarInfo toProto() {
AvatarFetterInfo.Builder avatarFetter = AvatarFetterInfo.newBuilder()
.setExpLevel(10)
.setExpNumber(6325); // Highest Level

if (this.getFetterList() != null) {
for (int i = 0; i < this.getFetterList().size(); i++) {
avatarFetter.addFetterList(
FetterData.newBuilder()
.setFetterId(this.getFetterList().get(i))
.setFetterState(FetterState.FINISH.getValue())
);
}
}

AvatarInfo.Builder avatarInfo = AvatarInfo.newBuilder()
.setAvatarId(this.getAvatarId())
.setGuid(this.getGuid())
Expand All @@ -696,7 +728,7 @@ public AvatarInfo toProto() {
.putAllProudSkillExtraLevel(getProudSkillBonusMap())
.setAvatarType(1)
.setBornTime(this.getBornTime())
.setFetterInfo(AvatarFetterInfo.newBuilder().setExpLevel(1))
.setFetterInfo(avatarFetter)
.setWearingFlycloakId(this.getFlyCloak())
.setCostumeId(this.getCostume());

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/emu/grasscutter/game/props/FetterState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package emu.grasscutter.game.props;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;

public enum FetterState {
NONE(0),
NOT_OPEN(1),
OPEN(1),
FINISH(3);

private final int value;
private static final Int2ObjectMap<FetterState> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, FetterState> stringMap = new HashMap<>();

static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}

private FetterState(int value) {
this.value = value;
}

public int getValue() {
return value;
}

public static FetterState getTypeByValue(int value) {
return map.getOrDefault(value, NONE);
}

public static FetterState getTypeByName(String name) {
return stringMap.getOrDefault(name, NONE);
}
}
Loading