Skip to content

Commit

Permalink
Merge pull request Grasscutters#94 from Yazawazi/development
Browse files Browse the repository at this point in the history
Try to show characters' stories and voices
  • Loading branch information
KingRainbow44 committed Apr 22, 2022
2 parents 94b80f0 + d37543b commit e76b60d
Show file tree
Hide file tree
Showing 8 changed files with 2,299 additions and 2 deletions.
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

0 comments on commit e76b60d

Please sign in to comment.