Refactor avatar skilldepot and constellation/talent changing

Ensures Traveler retains talent levels and constellations on inactive elements when switching elements.
Relevant for any other skillDepot-changing activities like Windtrace too, though keeping those in the db might not be as useful.

Refactor avatar talent upgrade and access
Refactor skillExtraCharges
This commit is contained in:
AnimeGitB
2022-08-17 19:48:41 +09:30
parent 78b7fb70ac
commit fb1bacb0f8
14 changed files with 399 additions and 476 deletions

View File

@@ -244,32 +244,11 @@ public final class GiveCommand implements CommandHandler {
}
private static Avatar makeAvatar(AvatarData avatarData, int level, int promoteLevel, int constellation) {
// Calculate ascension level.
Avatar avatar = new Avatar(avatarData);
avatar.setLevel(level);
avatar.setPromoteLevel(promoteLevel);
// Add constellations.
int talentBase = switch (avatar.getAvatarId()) {
case 10000005 -> 70;
case 10000006 -> 40;
default -> (avatar.getAvatarId() - 10000000) * 10;
};
for (int i = 1; i <= constellation; i++) {
avatar.getTalentIdList().add(talentBase + i);
}
// Main character needs skill depot manually added.
if (avatar.getAvatarId() == GameConstants.MAIN_CHARACTER_MALE) {
avatar.setSkillDepotData(GameData.getAvatarSkillDepotDataMap().get(504));
}
else if (avatar.getAvatarId() == GameConstants.MAIN_CHARACTER_FEMALE) {
avatar.setSkillDepotData(GameData.getAvatarSkillDepotDataMap().get(704));
}
avatar.forceConstellationLevel(constellation);
avatar.recalcStats();
return avatar;
}

View File

@@ -37,9 +37,6 @@ public final class ResetConstCommand implements CommandHandler {
}
private void resetConstellation(Avatar avatar) {
avatar.getTalentIdList().clear();
avatar.setCoreProudSkillLevel(0);
avatar.recalcStats();
avatar.save();
avatar.forceConstellationLevel(-1);
}
}

View File

@@ -15,7 +15,6 @@ import emu.grasscutter.utils.Position;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import java.util.List;
import java.util.Set;
@Command(
label = "setConst",
@@ -33,7 +32,7 @@ public final class SetConstCommand implements CommandHandler {
try {
int constLevel = Integer.parseInt(args.get(0));
if (constLevel < 0 || constLevel > 6) {
if (constLevel < -1 || constLevel > 6) {
CommandHandler.sendTranslatedMessage(sender, "commands.setConst.range_error");
return;
}
@@ -52,19 +51,7 @@ public final class SetConstCommand implements CommandHandler {
private void setConstellation(Player player, Avatar avatar, int constLevel) {
int currentConstLevel = avatar.getCoreProudSkillLevel();
IntArrayList talentIds = new IntArrayList(avatar.getSkillDepot().getTalents());
Set<Integer> talentIdList = avatar.getTalentIdList();
talentIdList.clear();
avatar.setCoreProudSkillLevel(0);
for(int talent = 0; talent < constLevel; talent++) {
AvatarTalentData talentData = GameData.getAvatarTalentDataMap().get(talentIds.getInt(talent));
int mainCostItemId = talentData.getMainCostItemId();
player.getInventory().addItem(mainCostItemId);
Grasscutter.getGameServer().getInventorySystem().unlockAvatarConstellation(player, avatar.getGuid());
}
avatar.forceConstellationLevel(constLevel);
// force player to reload scene when necessary
if (constLevel < currentConstLevel) {

View File

@@ -4,10 +4,7 @@ import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.data.excels.AvatarSkillDepotData;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketAvatarSkillChangeNotify;
import emu.grasscutter.server.packet.send.PacketAvatarSkillUpgradeRsp;
import java.util.List;
@@ -17,34 +14,6 @@ import java.util.List;
permission = "player.settalent",
permissionTargeted = "player.settalent.others")
public final class TalentCommand implements CommandHandler {
private void setTalentLevel(Player sender, Player player, Avatar avatar, int talentId, int talentLevel) {
var skillLevelMap = avatar.getSkillLevelMap();
int oldLevel = skillLevelMap.get(talentId);
if (talentLevel < 0 || talentLevel > 15) {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
return;
}
// Upgrade skill
skillLevelMap.put(talentId, talentLevel);
avatar.save();
// Packet
player.sendPacket(new PacketAvatarSkillChangeNotify(avatar, talentId, oldLevel, talentLevel));
player.sendPacket(new PacketAvatarSkillUpgradeRsp(avatar, talentId, oldLevel, talentLevel));
String successMessage = "commands.talent.set_id";
AvatarSkillDepotData depot = avatar.getSkillDepot();
if (talentId == depot.getSkills().get(0)) {
successMessage = "commands.talent.set_atk";
} else if (talentId == depot.getSkills().get(1)) {
successMessage = "commands.talent.set_e";
} else if (talentId == depot.getEnergySkill()) {
successMessage = "commands.talent.set_q";
}
CommandHandler.sendTranslatedMessage(sender, successMessage, talentLevel);
}
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (args.size() < 1){
@@ -52,9 +21,19 @@ public final class TalentCommand implements CommandHandler {
return;
}
EntityAvatar entity = targetPlayer.getTeamManager().getCurrentAvatarEntity();
Avatar avatar = entity.getAvatar();
String cmdSwitch = args.get(0);
Avatar avatar = targetPlayer.getTeamManager().getCurrentAvatarEntity().getAvatar();
AvatarSkillDepotData skillDepot = avatar.getSkillDepot();
if (skillDepot == null) { // Avatars without skill depots aren't a suitable target even with manual skillId specified
CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_skill_id");
return;
}
int skillIdNorAtk = skillDepot.getSkills().get(0);
int skillIdE = skillDepot.getSkills().get(1);
int skillIdQ = skillDepot.getEnergySkill();
int skillId = 0;
int newLevel = -1;
String cmdSwitch = args.get(0).toLowerCase();
switch (cmdSwitch) {
default -> {
sendUsageMessage(sender);
@@ -62,42 +41,56 @@ public final class TalentCommand implements CommandHandler {
}
case "set" -> {
if (args.size() < 3) {
sendUsageMessage(sender);
sendUsageMessage(sender);
return;
}
try {
int skillId = Integer.parseInt(args.get(1));
int newLevel = Integer.parseInt(args.get(2));
setTalentLevel(sender, targetPlayer, avatar, skillId, newLevel);
skillId = Integer.parseInt(args.get(1));
} catch (NumberFormatException ignored) {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_skill_id");
return;
}
try {
newLevel = Integer.parseInt(args.get(2));
} catch (NumberFormatException ignored) {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_skill_level");
return;
}
if (avatar.setSkillLevel(skillId, newLevel)) {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_id", newLevel);
} else {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
}
}
case "n", "e", "q" -> {
if (args.size() < 2) {
sendUsageMessage(sender);
return;
}
AvatarSkillDepotData SkillDepot = avatar.getSkillDepot();
int skillId = switch (cmdSwitch) {
default -> SkillDepot.getSkills().get(0);
case "e" -> SkillDepot.getSkills().get(1);
case "q" -> SkillDepot.getEnergySkill();
};
try {
int newLevel = Integer.parseInt(args.get(1));
setTalentLevel(sender, targetPlayer, avatar, skillId, newLevel);
newLevel = Integer.parseInt(args.get(1));
} catch (NumberFormatException ignored) {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.invalid_level");
return;
}
skillId = switch (cmdSwitch) {
default -> skillIdNorAtk;
case "e" -> skillIdE;
case "q" -> skillIdQ;
};
if (avatar.setSkillLevel(skillId, newLevel)) {
switch (cmdSwitch) {
default -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_atk", newLevel);
case "e" -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_e", newLevel);
case "q" -> CommandHandler.sendTranslatedMessage(sender, "commands.talent.set_q", newLevel);
}
} else {
CommandHandler.sendTranslatedMessage(sender, "commands.talent.lower_16");
}
}
case "getid" -> {
int skillIdNorAtk = avatar.getSkillDepot().getSkills().get(0);
int skillIdE = avatar.getSkillDepot().getSkills().get(1);
int skillIdQ = avatar.getSkillDepot().getEnergySkill();
CommandHandler.sendTranslatedMessage(sender, "commands.talent.normal_attack_id", Integer.toString(skillIdNorAtk));
CommandHandler.sendTranslatedMessage(sender, "commands.talent.e_skill_id", Integer.toString(skillIdE));
CommandHandler.sendTranslatedMessage(sender, "commands.talent.q_skill_id", Integer.toString(skillIdQ));