Add Support of Item Combine (#513)

* Add Support of Item Combine

* Add Support of Item Combine

Co-authored-by: Melledy <52122272+Melledy@users.noreply.github.com>
This commit is contained in:
Akka
2022-05-05 01:06:13 +08:00
committed by GitHub
parent 06983e9e84
commit 48d1e026ef
6 changed files with 335 additions and 8 deletions

View File

@@ -0,0 +1,83 @@
package emu.grasscutter.game.combine;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.def.CombineData;
import emu.grasscutter.game.inventory.ItemType;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.proto.RetcodeOuterClass;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.PacketCombineRsp;
import it.unimi.dsi.fastutil.Pair;
import java.util.List;
public class CombineManger {
private final GameServer gameServer;
public GameServer getGameServer() {
return gameServer;
}
public CombineManger(GameServer gameServer) {
this.gameServer = gameServer;
}
public CombineResult combineItem(Player player, int cid, int count){
// check config exist
if(!GameData.getCombineDataMap().containsKey(cid)){
player.getWorld().getHost().sendPacket(new PacketCombineRsp());
return null;
}
CombineData combineData = GameData.getCombineDataMap().get(cid);
if(combineData.getPlayerLevel() > player.getLevel()){
return null;
}
// check enough
var enough = combineData.getMaterialItems().stream()
.filter(item -> player.getInventory()
.getInventoryTab(ItemType.ITEM_MATERIAL)
.getItemById(item.getId())
.getCount() < item.getCount() * count
)
.findAny()
.isEmpty();
// if not enough
if(!enough){
player.getWorld().getHost().sendPacket(
new PacketCombineRsp(RetcodeOuterClass.Retcode.RET_ITEM_COMBINE_COUNT_NOT_ENOUGH_VALUE)
);
return null;
}
if (player.getMora() >= combineData.getScoinCost()) {
player.setMora(player.getMora() - combineData.getScoinCost() * count);
} else {
return null;
}
// try to remove materials
combineData.getMaterialItems().stream()
.map(item -> Pair.of(player.getInventory()
.getInventoryTab(ItemType.ITEM_MATERIAL)
.getItemById(item.getId())
,item.getCount() * count)
)
.forEach(item -> player.getInventory().removeItem(item.first(), item.second()));
// make the result
player.getInventory().addItem(combineData.getResultItemId(),
combineData.getResultItemCount() * count);
CombineResult result = new CombineResult();
result.setMaterial(List.of());
result.setResult(List.of(new CombineData.CombineItemPair(combineData.getResultItemId(),
combineData.getResultItemCount() * count)));
// TODO lucky characters
result.setExtra(List.of());
result.setBack(List.of());
return result;
}
}

View File

@@ -0,0 +1,45 @@
package emu.grasscutter.game.combine;
import emu.grasscutter.data.def.CombineData;
import java.util.List;
public class CombineResult {
private List<CombineData.CombineItemPair> material;
private List<CombineData.CombineItemPair> result;
private List<CombineData.CombineItemPair> extra;
private List<CombineData.CombineItemPair> back;
public List<CombineData.CombineItemPair> getMaterial() {
return material;
}
public void setMaterial(List<CombineData.CombineItemPair> material) {
this.material = material;
}
public List<CombineData.CombineItemPair> getResult() {
return result;
}
public void setResult(List<CombineData.CombineItemPair> result) {
this.result = result;
}
public List<CombineData.CombineItemPair> getExtra() {
return extra;
}
public void setExtra(List<CombineData.CombineItemPair> extra) {
this.extra = extra;
}
public List<CombineData.CombineItemPair> getBack() {
return back;
}
public void setBack(List<CombineData.CombineItemPair> back) {
this.back = back;
}
}