mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-13 22:04:36 +01:00
Implement return items when leveling up avatars/relics/light cones
This commit is contained in:
@@ -12,6 +12,11 @@ import lombok.Getter;
|
|||||||
|
|
||||||
// Game data that is parsed by the server goes here
|
// Game data that is parsed by the server goes here
|
||||||
public class GameDepot {
|
public class GameDepot {
|
||||||
|
// Exp
|
||||||
|
@Getter private static List<AvatarExpItemExcel> avatarExpExcels = new ArrayList<>();
|
||||||
|
@Getter private static List<EquipmentExpItemExcel> equipmentExpExcels = new ArrayList<>();
|
||||||
|
@Getter private static List<RelicExpItemExcel> relicExpExcels = new ArrayList<>();
|
||||||
|
|
||||||
// Relics
|
// Relics
|
||||||
private static Int2ObjectMap<List<RelicMainAffixExcel>> relicMainAffixDepot = new Int2ObjectOpenHashMap<>();
|
private static Int2ObjectMap<List<RelicMainAffixExcel>> relicMainAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||||
private static Int2ObjectMap<List<RelicSubAffixExcel>> relicSubAffixDepot = new Int2ObjectOpenHashMap<>();
|
private static Int2ObjectMap<List<RelicSubAffixExcel>> relicSubAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package emu.lunarcore.data.excel;
|
package emu.lunarcore.data.excel;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import emu.lunarcore.data.GameData;
|
import emu.lunarcore.data.GameData;
|
||||||
|
import emu.lunarcore.data.GameDepot;
|
||||||
import emu.lunarcore.data.GameResource;
|
import emu.lunarcore.data.GameResource;
|
||||||
import emu.lunarcore.data.ResourceType;
|
import emu.lunarcore.data.ResourceType;
|
||||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -19,9 +23,21 @@ public class AvatarExpItemExcel extends GameResource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
|
// Set exp for this item
|
||||||
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
||||||
if (excel == null) return;
|
if (excel == null) return;
|
||||||
|
|
||||||
excel.setAvatarExp(Exp);
|
excel.setAvatarExp(Exp);
|
||||||
|
|
||||||
|
// Add to game depot
|
||||||
|
if (Exp > 0) {
|
||||||
|
GameDepot.getAvatarExpExcels().add(this);
|
||||||
|
GameDepot.getAvatarExpExcels().sort(new Comparator<AvatarExpItemExcel>() {
|
||||||
|
@Override
|
||||||
|
public int compare(AvatarExpItemExcel o1, AvatarExpItemExcel o2) {
|
||||||
|
return o2.getExp() - o1.getExp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package emu.lunarcore.data.excel;
|
package emu.lunarcore.data.excel;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import emu.lunarcore.data.GameData;
|
import emu.lunarcore.data.GameData;
|
||||||
|
import emu.lunarcore.data.GameDepot;
|
||||||
import emu.lunarcore.data.GameResource;
|
import emu.lunarcore.data.GameResource;
|
||||||
import emu.lunarcore.data.ResourceType;
|
import emu.lunarcore.data.ResourceType;
|
||||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||||
|
import emu.lunarcore.game.inventory.ItemRarity;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -20,10 +24,22 @@ public class EquipmentExpItemExcel extends GameResource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
|
// Set exp for this item
|
||||||
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
||||||
if (excel == null) return;
|
if (excel == null) return;
|
||||||
|
|
||||||
excel.setEquipmentExp(ExpProvide);
|
excel.setEquipmentExp(ExpProvide);
|
||||||
excel.setExpCost(CoinCost);
|
excel.setExpCost(CoinCost);
|
||||||
|
|
||||||
|
// Add to game depot
|
||||||
|
if (ExpProvide > 0) {
|
||||||
|
GameDepot.getEquipmentExpExcels().add(this);
|
||||||
|
GameDepot.getEquipmentExpExcels().sort(new Comparator<EquipmentExpItemExcel>() {
|
||||||
|
@Override
|
||||||
|
public int compare(EquipmentExpItemExcel o1, EquipmentExpItemExcel o2) {
|
||||||
|
return o2.getExpProvide() - o1.getExpProvide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package emu.lunarcore.data.excel;
|
package emu.lunarcore.data.excel;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import emu.lunarcore.data.GameData;
|
import emu.lunarcore.data.GameData;
|
||||||
|
import emu.lunarcore.data.GameDepot;
|
||||||
import emu.lunarcore.data.GameResource;
|
import emu.lunarcore.data.GameResource;
|
||||||
import emu.lunarcore.data.ResourceType;
|
import emu.lunarcore.data.ResourceType;
|
||||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||||
|
import emu.lunarcore.game.inventory.ItemRarity;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@@ -20,10 +24,22 @@ public class RelicExpItemExcel extends GameResource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
|
// Set exp for this item
|
||||||
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
ItemExcel excel = GameData.getItemExcelMap().get(ItemID);
|
||||||
if (excel == null) return;
|
if (excel == null) return;
|
||||||
|
|
||||||
excel.setRelicExp(ExpProvide);
|
excel.setRelicExp(ExpProvide);
|
||||||
excel.setExpCost(CoinCost);
|
excel.setExpCost(CoinCost);
|
||||||
|
|
||||||
|
// Add to game depot
|
||||||
|
if (ExpProvide > 0 && excel.getRarity() != ItemRarity.SuperRare) {
|
||||||
|
GameDepot.getRelicExpExcels().add(this);
|
||||||
|
GameDepot.getRelicExpExcels().sort(new Comparator<RelicExpItemExcel>() {
|
||||||
|
@Override
|
||||||
|
public int compare(RelicExpItemExcel o1, RelicExpItemExcel o2) {
|
||||||
|
return o2.getExpProvide() - o1.getExpProvide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import emu.lunarcore.data.GameData;
|
import emu.lunarcore.data.GameData;
|
||||||
|
import emu.lunarcore.data.GameDepot;
|
||||||
import emu.lunarcore.data.common.ItemParam;
|
import emu.lunarcore.data.common.ItemParam;
|
||||||
import emu.lunarcore.data.excel.*;
|
import emu.lunarcore.data.excel.*;
|
||||||
import emu.lunarcore.data.excel.ItemComposeExcel.FormulaType;
|
import emu.lunarcore.data.excel.ItemComposeExcel.FormulaType;
|
||||||
@@ -15,6 +16,8 @@ import emu.lunarcore.server.game.GameServer;
|
|||||||
import emu.lunarcore.server.packet.BasePacket;
|
import emu.lunarcore.server.packet.BasePacket;
|
||||||
import emu.lunarcore.server.packet.CmdId;
|
import emu.lunarcore.server.packet.CmdId;
|
||||||
import emu.lunarcore.server.packet.send.*;
|
import emu.lunarcore.server.packet.send.*;
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||||
|
|
||||||
public class InventoryService extends BaseGameService {
|
public class InventoryService extends BaseGameService {
|
||||||
@@ -34,18 +37,18 @@ public class InventoryService extends BaseGameService {
|
|||||||
if (promoteData == null) return;
|
if (promoteData == null) return;
|
||||||
|
|
||||||
// Exp gain
|
// Exp gain
|
||||||
int expGain = 0;
|
int amount = 0;
|
||||||
|
|
||||||
// Verify items
|
// Verify items
|
||||||
for (ItemParam param : items) {
|
for (ItemParam param : items) {
|
||||||
GameItem item = player.getInventory().getItemByParam(param);
|
GameItem item = player.getInventory().getItemByParam(param);
|
||||||
if (item == null || item.getExcel().getAvatarExp() == 0 || item.getCount() < param.getCount()) return;
|
if (item == null || item.getExcel().getAvatarExp() == 0 || item.getCount() < param.getCount()) return;
|
||||||
|
|
||||||
expGain += item.getExcel().getAvatarExp() * param.getCount();
|
amount += item.getExcel().getAvatarExp() * param.getCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify credits
|
// Verify credits
|
||||||
int cost = expGain / 10;
|
int cost = amount / 10;
|
||||||
if (player.getScoin() < cost) {
|
if (player.getScoin() < cost) {
|
||||||
player.sendPacket(new PacketAvatarExpUpScRsp());
|
player.sendPacket(new PacketAvatarExpUpScRsp());
|
||||||
return;
|
return;
|
||||||
@@ -61,11 +64,11 @@ public class InventoryService extends BaseGameService {
|
|||||||
int exp = avatar.getExp();
|
int exp = avatar.getExp();
|
||||||
int reqExp = GameData.getAvatarExpRequired(avatar.getExcel().getExpGroup(), level);
|
int reqExp = GameData.getAvatarExpRequired(avatar.getExcel().getExpGroup(), level);
|
||||||
|
|
||||||
while (expGain > 0 && reqExp > 0 && level < maxLevel) {
|
while (amount > 0 && reqExp > 0 && level < maxLevel) {
|
||||||
// Do calculations
|
// Do calculations
|
||||||
int toGain = Math.min(expGain, reqExp - exp);
|
int toGain = Math.min(amount, reqExp - exp);
|
||||||
exp += toGain;
|
exp += toGain;
|
||||||
expGain -= toGain;
|
amount -= toGain;
|
||||||
// Level up
|
// Level up
|
||||||
if (exp >= reqExp) {
|
if (exp >= reqExp) {
|
||||||
// Exp
|
// Exp
|
||||||
@@ -83,8 +86,28 @@ public class InventoryService extends BaseGameService {
|
|||||||
avatar.save();
|
avatar.save();
|
||||||
player.save();
|
player.save();
|
||||||
|
|
||||||
// TODO add back leftover exp
|
// Calculate leftover exp
|
||||||
List<GameItem> returnItems = new ArrayList<>();
|
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
|
||||||
|
|
||||||
|
while (GameDepot.getAvatarExpExcels().size() > 0) {
|
||||||
|
int oldAmount = amount;
|
||||||
|
for (var expExcel : GameDepot.getAvatarExpExcels()) {
|
||||||
|
if (amount >= expExcel.getExp()) {
|
||||||
|
leftoverItems.put(expExcel.getItemID(), leftoverItems.get(expExcel.getItemID()) + 1);
|
||||||
|
amount -= expExcel.getExp();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldAmount == amount) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create leftover exp items
|
||||||
|
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
player.getInventory().addItems(returnItems);
|
||||||
|
|
||||||
// Send packets
|
// Send packets
|
||||||
player.sendPacket(new PacketPlayerSyncScNotify(avatar));
|
player.sendPacket(new PacketPlayerSyncScNotify(avatar));
|
||||||
@@ -246,7 +269,7 @@ public class InventoryService extends BaseGameService {
|
|||||||
|
|
||||||
// Exp gain
|
// Exp gain
|
||||||
int cost = 0;
|
int cost = 0;
|
||||||
int expGain = 0;
|
int amount = 0;
|
||||||
|
|
||||||
// Verify items
|
// Verify items
|
||||||
for (ItemParam param : items) {
|
for (ItemParam param : items) {
|
||||||
@@ -258,7 +281,7 @@ public class InventoryService extends BaseGameService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (item.getExcel().getEquipmentExp() > 0) {
|
if (item.getExcel().getEquipmentExp() > 0) {
|
||||||
expGain += item.getExcel().getEquipmentExp() * param.getCount();
|
amount += item.getExcel().getEquipmentExp() * param.getCount();
|
||||||
cost += item.getExcel().getEquipmentExpCost() * param.getCount();
|
cost += item.getExcel().getEquipmentExpCost() * param.getCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,11 +302,11 @@ public class InventoryService extends BaseGameService {
|
|||||||
int exp = equip.getExp();
|
int exp = equip.getExp();
|
||||||
int reqExp = GameData.getEquipmentExpRequired(equip.getExcel().getEquipmentExcel().getExpType(), level);
|
int reqExp = GameData.getEquipmentExpRequired(equip.getExcel().getEquipmentExcel().getExpType(), level);
|
||||||
|
|
||||||
while (expGain > 0 && reqExp > 0 && level < maxLevel) {
|
while (amount > 0 && reqExp > 0 && level < maxLevel) {
|
||||||
// Do calculations
|
// Do calculations
|
||||||
int toGain = Math.min(expGain, reqExp - exp);
|
int toGain = Math.min(amount, reqExp - exp);
|
||||||
exp += toGain;
|
exp += toGain;
|
||||||
expGain -= toGain;
|
amount -= toGain;
|
||||||
// Level up
|
// Level up
|
||||||
if (exp >= reqExp) {
|
if (exp >= reqExp) {
|
||||||
// Exp
|
// Exp
|
||||||
@@ -301,8 +324,28 @@ public class InventoryService extends BaseGameService {
|
|||||||
equip.save();
|
equip.save();
|
||||||
player.save();
|
player.save();
|
||||||
|
|
||||||
// TODO add back leftover exp
|
// Calculate leftover exp
|
||||||
List<GameItem> returnItems = new ArrayList<>();
|
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
|
||||||
|
|
||||||
|
while (GameDepot.getEquipmentExpExcels().size() > 0) {
|
||||||
|
int oldAmount = amount;
|
||||||
|
for (var expExcel : GameDepot.getEquipmentExpExcels()) {
|
||||||
|
if (amount >= expExcel.getExpProvide()) {
|
||||||
|
leftoverItems.put(expExcel.getItemID(), leftoverItems.get(expExcel.getItemID()) + 1);
|
||||||
|
amount -= expExcel.getExpProvide();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldAmount == amount) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create leftover exp items
|
||||||
|
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
player.getInventory().addItems(returnItems);
|
||||||
|
|
||||||
// Send packets
|
// Send packets
|
||||||
player.sendPacket(new PacketPlayerSyncScNotify(equip));
|
player.sendPacket(new PacketPlayerSyncScNotify(equip));
|
||||||
@@ -398,7 +441,7 @@ public class InventoryService extends BaseGameService {
|
|||||||
|
|
||||||
// Exp gain
|
// Exp gain
|
||||||
int cost = 0;
|
int cost = 0;
|
||||||
int expGain = 0;
|
int amount = 0;
|
||||||
|
|
||||||
// Verify items
|
// Verify items
|
||||||
for (ItemParam param : items) {
|
for (ItemParam param : items) {
|
||||||
@@ -409,12 +452,12 @@ public class InventoryService extends BaseGameService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (item.getExcel().getRelicExp() > 0) {
|
if (item.getExcel().getRelicExp() > 0) {
|
||||||
expGain += item.getExcel().getRelicExp() * param.getCount();
|
amount += item.getExcel().getRelicExp() * param.getCount();
|
||||||
cost += item.getExcel().getRelicExpCost() * param.getCount();
|
cost += item.getExcel().getRelicExpCost() * param.getCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.getTotalExp() > 0) {
|
if (item.getTotalExp() > 0) {
|
||||||
expGain += (int) Math.floor(item.getTotalExp() * 0.80D);
|
amount += (int) Math.floor(item.getTotalExp() * 0.80D);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,12 +479,12 @@ public class InventoryService extends BaseGameService {
|
|||||||
int upgrades = 0;
|
int upgrades = 0;
|
||||||
int reqExp = GameData.getRelicExpRequired(equip.getExcel().getRelicExcel().getExpType(), level);
|
int reqExp = GameData.getRelicExpRequired(equip.getExcel().getRelicExcel().getExpType(), level);
|
||||||
|
|
||||||
while (expGain > 0 && reqExp > 0 && level < maxLevel) {
|
while (amount > 0 && reqExp > 0 && level < maxLevel) {
|
||||||
// Do calculations
|
// Do calculations
|
||||||
int toGain = Math.min(expGain, reqExp - exp);
|
int toGain = Math.min(amount, reqExp - exp);
|
||||||
exp += toGain;
|
exp += toGain;
|
||||||
totalExp += toGain;
|
totalExp += toGain;
|
||||||
expGain -= toGain;
|
amount -= toGain;
|
||||||
// Level up
|
// Level up
|
||||||
if (exp >= reqExp) {
|
if (exp >= reqExp) {
|
||||||
// Exp
|
// Exp
|
||||||
@@ -469,8 +512,28 @@ public class InventoryService extends BaseGameService {
|
|||||||
equip.save();
|
equip.save();
|
||||||
player.save();
|
player.save();
|
||||||
|
|
||||||
// TODO add back leftover exp
|
// Calculate leftover exp
|
||||||
List<GameItem> returnItems = new ArrayList<>();
|
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
|
||||||
|
|
||||||
|
while (GameDepot.getRelicExpExcels().size() > 0) {
|
||||||
|
int oldAmount = amount;
|
||||||
|
for (var expExcel : GameDepot.getRelicExpExcels()) {
|
||||||
|
if (amount >= expExcel.getExpProvide()) {
|
||||||
|
leftoverItems.put(expExcel.getItemID(), leftoverItems.get(expExcel.getItemID()) + 1);
|
||||||
|
amount -= expExcel.getExpProvide();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldAmount == amount) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create leftover exp items
|
||||||
|
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
player.getInventory().addItems(returnItems);
|
||||||
|
|
||||||
// Send packets
|
// Send packets
|
||||||
player.sendPacket(new PacketPlayerSyncScNotify(equip));
|
player.sendPacket(new PacketPlayerSyncScNotify(equip));
|
||||||
|
|||||||
Reference in New Issue
Block a user