Improve commands that involve changing of avatar/item properties

This commit is contained in:
Melledy
2023-11-25 18:15:52 -08:00
parent 265ba8895a
commit 01b391684d
4 changed files with 129 additions and 71 deletions

View File

@@ -3,6 +3,9 @@ package emu.lunarcore.command;
import java.util.List;
import emu.lunarcore.LunarCore;
import emu.lunarcore.data.GameData;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.util.Utils;
import lombok.Getter;
@@ -81,4 +84,91 @@ public class CommandArgs {
}
return this.list.get(index);
}
// Utility commands
/**
* Changes the properties of an avatar based on the arguments provided
* @param avatar The targeted avatar to change
* @return A boolean of whether or not any changes were made to the avatar
*/
public boolean setProperties(GameAvatar avatar) {
boolean hasChanged = false;
// Try to set level
if (this.getLevel() > 0) {
avatar.setLevel(this.getLevel());
hasChanged = true;
}
// Try to set level
if (this.getLevel() > 0) {
avatar.setLevel(Math.min(this.getLevel(), 80));
avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel()));
hasChanged = true;
}
// Try to set promotion (ascension level)
if (this.getPromotion() >= 0) {
avatar.setPromotion(Math.min(this.getPromotion(), avatar.getExcel().getMaxPromotion()));
hasChanged = true;
}
// Try to set rank (eidolons)
if (this.getRank() >= 0) {
avatar.setRank(Math.min(this.getRank(), avatar.getExcel().getMaxRank()));
hasChanged = true;
}
// Try to set skill trees
if (this.getStage() > 0) {
for (int pointId : avatar.getExcel().getSkillTreeIds()) {
var skillTree = GameData.getAvatarSkillTreeExcel(pointId, 1);
if (skillTree == null) continue;
int minLevel = skillTree.isDefaultUnlock() ? 1 : 0;
int pointLevel = Math.max(Math.min(this.getStage(), skillTree.getMaxLevel()), minLevel);
avatar.getSkills().put(pointId, pointLevel);
}
hasChanged = true;
}
return hasChanged;
}
/**
* Changes the properties of an item based on the arguments provided
* @param item The targeted item to change
* @return A boolean of whether or not any changes were made to the item
*/
public boolean setProperties(GameItem item) {
boolean hasChanged = false;
if (item.getExcel().isEquipment()) {
// Try to set level
if (this.getLevel() > 0) {
item.setLevel(Math.min(this.getLevel(), 80));
item.setPromotion(Utils.getMinPromotionForLevel(item.getLevel()));
}
// Try to set promotion
if (this.getPromotion() >= 0) {
item.setPromotion(Math.min(this.getPromotion(), item.getExcel().getEquipmentExcel().getMaxPromotion()));
}
// Try to set rank (superimposition)
if (this.getRank() >= 0) {
item.setRank(Math.min(this.getRank(), item.getExcel().getEquipmentExcel().getMaxRank()));
}
} else if (item.getExcel().isRelic()) {
// Try to set level
if (this.getLevel() > 0) {
item.setLevel(Math.min(this.getLevel(), 15));
// TODO add substats
}
}
return hasChanged;
}
}

View File

@@ -3,11 +3,9 @@ package emu.lunarcore.command.commands;
import emu.lunarcore.command.Command;
import emu.lunarcore.command.CommandArgs;
import emu.lunarcore.command.CommandHandler;
import emu.lunarcore.data.GameData;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify;
import emu.lunarcore.util.Utils;
@Command(label = "avatar", aliases = {"a"}, permission = "player.avatar", desc = "/avatar lv(level) p(ascension) r(eidolon) s(skill levels). Sets the current avatar's properties")
public class AvatarCommand implements CommandHandler {
@@ -27,49 +25,8 @@ public class AvatarCommand implements CommandHandler {
return;
}
boolean hasChanged = false;
// Try to set level
if (args.getLevel() > 0) {
avatar.setLevel(args.getLevel());
hasChanged = true;
}
// Try to set level
if (args.getLevel() > 0) {
avatar.setLevel(Math.min(args.getLevel(), 80));
avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel()));
hasChanged = true;
}
// Try to set promotion (ascension level)
if (args.getPromotion() >= 0) {
avatar.setPromotion(Math.min(args.getPromotion(), avatar.getExcel().getMaxPromotion()));
hasChanged = true;
}
// Try to set rank (eidolons)
if (args.getRank() >= 0) {
avatar.setRank(Math.min(args.getRank(), avatar.getExcel().getMaxRank()));
hasChanged = true;
}
// Try to set skill trees
if (args.getStage() > 0) {
for (int pointId : avatar.getExcel().getSkillTreeIds()) {
var skillTree = GameData.getAvatarSkillTreeExcel(pointId, 1);
if (skillTree == null) continue;
int minLevel = skillTree.isDefaultUnlock() ? 1 : 0;
int pointLevel = Math.max(Math.min(args.getStage(), skillTree.getMaxLevel()), minLevel);
avatar.getSkills().put(pointId, pointLevel);
}
hasChanged = true;
}
// Done
if (hasChanged) {
// Change properties
if (args.setProperties(avatar)) {
// Save avatar
avatar.save();

View File

@@ -8,6 +8,7 @@ import emu.lunarcore.command.CommandArgs;
import emu.lunarcore.command.CommandHandler;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ItemExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.enums.ItemMainType;
import emu.lunarcore.game.enums.ItemRarity;
import emu.lunarcore.game.enums.ItemSubType;
@@ -25,6 +26,7 @@ public class GiveAllCommand implements CommandHandler {
return;
}
Player target = args.getTarget();
String type = args.get(0).toLowerCase();
switch (type) {
@@ -43,51 +45,72 @@ public class GiveAllCommand implements CommandHandler {
items.add(new GameItem(2, 50_000_000));
// Add to target's inventory
args.getTarget().getInventory().addItems(items, true);
target.getInventory().addItems(items, true);
// Send message
this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " items");
this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " items");
}
case "lc", "lightcones" -> {
// Get lightcones
List<GameItem> items = GameData.getItemExcelMap().values()
.stream()
.filter(ItemExcel::isEquipment)
.map(excel -> new GameItem(excel, 1))
.map(excel -> {
var item = new GameItem(excel, 1);
args.setProperties(item);
return item;
})
.toList();
// Add to target's inventory
args.getTarget().getInventory().addItems(items, true);
target.getInventory().addItems(items, true);
// Send message
this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " light cones");
this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " light cones");
}
case "r", "relics" -> {
// Get relics
List<GameItem> items = GameData.getItemExcelMap().values()
.stream()
.filter(excel -> excel.isRelic() && excel.getRarity() == ItemRarity.SuperRare)
.map(excel -> new GameItem(excel, 1))
.map(excel -> {
var item = new GameItem(excel, 1);
args.setProperties(item);
return item;
})
.toList();
// Add to target's inventory
args.getTarget().getInventory().addItems(items, true);
target.getInventory().addItems(items, true);
// Send message
this.sendMessage(sender, "Giving " + args.getTarget().getName() + " " + items.size() + " relics");
this.sendMessage(sender, "Giving " + target.getName() + " " + items.size() + " relics");
}
case "a", "characters", "avatars" -> {
// All avatars and their eidolons
for (ItemExcel excel : GameData.getItemExcelMap().values()) {
if (excel.getItemMainType() == ItemMainType.AvatarCard) {
args.getTarget().getInventory().addItem(excel, 1);
// Skip if target already has this avatar
if (target.getAvatars().hasAvatar(excel.getId())) {
continue;
}
// Add avatar
target.getInventory().addItem(excel, 1);
// Set avatar properties
GameAvatar avatar = target.getAvatarById(excel.getId());
if (avatar != null) {
args.setProperties(avatar);
}
} else if (excel.getItemSubType() == ItemSubType.Eidolon) {
args.getTarget().getInventory().addItem(excel, 6);
// Add eidolons
target.getInventory().addItem(excel, 6);
}
}
// Send message
this.sendMessage(sender, "Giving " + args.getTarget().getName() + " all avatars");
this.sendMessage(sender, "Giving " + target.getName() + " all avatars");
}
}
}

View File

@@ -41,22 +41,10 @@ public class GiveCommand implements CommandHandler {
if (itemData.getItemMainType() == ItemMainType.AvatarCard) {
// Add avatar
GameAvatar avatar = new GameAvatar(itemData.getId());
if (args.getTarget().addAvatar(avatar)) {
// Try to set level
if (args.getLevel() > 0) {
avatar.setLevel(Math.min(args.getLevel(), 80));
avatar.setPromotion(Utils.getMinPromotionForLevel(avatar.getLevel()));
}
// Try to set promotion
if (args.getPromotion() >= 0) {
avatar.setPromotion(Math.min(args.getPromotion(), avatar.getExcel().getMaxPromotion()));
}
// Try to set rank
if (args.getRank() >= 0) {
avatar.setRank(Math.min(args.getRank(), avatar.getExcel().getMaxRank()));
}
// Change avatar properties
args.setProperties(avatar);
}
} else if (itemData.isEquippable()) {
for (int i = 0; i < amount; i++) {