Implement cocoons

This commit is contained in:
Melledy
2023-09-29 03:22:14 -07:00
parent 23b62639bd
commit 2b8ab8d639
8 changed files with 125 additions and 18 deletions

View File

@@ -32,6 +32,7 @@ public class GameData {
private static Int2ObjectMap<AvatarRankExcel> avatarRankExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<EquipmentPromotionExcel> equipmentPromotionExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<MazeBuffExcel> mazeBuffExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<CocoonExcel> cocoonExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<PlayerLevelExcel> playerLevelExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<ExpTypeExcel> expTypeExcelMap = new Int2ObjectOpenHashMap<>();
@@ -109,4 +110,8 @@ public class GameData {
public static MazeBuffExcel getMazeBuffExcel(int buffId, int level) {
return mazeBuffExcelMap.get((buffId << 4) + level);
}
public static CocoonExcel getCocoonExcel(int cocoonId, int worldLevel) {
return cocoonExcelMap.get((cocoonId << 8) + worldLevel);
}
}

View File

@@ -0,0 +1,28 @@
package emu.lunarcore.data.excel;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
import emu.lunarcore.util.Utils;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import lombok.Getter;
@Getter
@ResourceType(name = {"CocoonConfig.json"})
public class CocoonExcel extends GameResource {
private int ID;
private int WorldLevel;
private int PropID;
private int StaminaCost;
private int MaxWave;
private IntArrayList StageIDList;
private IntArrayList DropList;
@Override
public int getId() {
return (ID << 8) + WorldLevel;
}
public int getRandomStage() {
return Utils.randomElement(StageIDList);
}
}

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.CocoonExcel;
import emu.lunarcore.data.excel.StageExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.player.Player;
@@ -16,6 +17,7 @@ import emu.lunarcore.proto.BattleEndStatusOuterClass.BattleEndStatus;
import emu.lunarcore.server.game.BaseGameService;
import emu.lunarcore.server.game.GameServer;
import emu.lunarcore.server.packet.send.PacketSceneCastSkillScRsp;
import emu.lunarcore.server.packet.send.PacketStartCocoonStageScRsp;
import emu.lunarcore.server.packet.send.PacketSyncLineupNotify;
import us.hebi.quickbuf.RepeatedInt;
@@ -27,7 +29,7 @@ public class BattleService extends BaseGameService {
super(server);
}
public void onBattleStart(Player player, int attackerId, RepeatedInt attackedList) {
public void startBattle(Player player, int attackerId, RepeatedInt attackedList) {
// Setup variables
List<GameEntity> entities = new ArrayList<>();
List<EntityMonster> monsters = new ArrayList<>();
@@ -44,7 +46,7 @@ public class BattleService extends BaseGameService {
entities.add(entity);
}
}
//
isPlayerCaster = true;
} else {
// Player is ambushed
@@ -108,15 +110,50 @@ public class BattleService extends BaseGameService {
}
// Set battle and send rsp packet
player.setBattle(battle);
player.sendPacket(new PacketSceneCastSkillScRsp(player, battle));
player.sendPacket(new PacketSceneCastSkillScRsp(battle));
return;
}
// Send packet
player.sendPacket(new PacketSceneCastSkillScRsp(0));
}
public void startCocoon(Player player, int cocoonId, int worldLevel, int wave) {
// Get cocoon data
CocoonExcel cocoonExcel = GameData.getCocoonExcel(cocoonId, worldLevel);
if (cocoonExcel == null) {
player.sendPacket(new PacketStartCocoonStageScRsp());
return;
}
// Get waves
wave = Math.min(Math.max(1, wave), cocoonExcel.getMaxWave());
// Get stages from cocoon
List<StageExcel> stages = new ArrayList<>();
for (int i = 0; i < wave; i++) {
StageExcel stage = GameData.getStageExcelMap().get(cocoonExcel.getRandomStage());
if (stage != null) {
stages.add(stage);
}
}
// Sanity
if (stages.size() <= 0) {
player.sendPacket(new PacketStartCocoonStageScRsp());
return;
}
// Build battle from cocoon data
Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), stages);
// Send packet
player.sendPacket(new PacketStartCocoonStageScRsp(battle, cocoonId, wave));
}
public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage<AvatarBattleInfo> battleAvatars) {
public void finishBattle(Player player, BattleEndStatus result, RepeatedMessage<AvatarBattleInfo> battleAvatars) {
// Sanity
if (!player.isInBattle()) {
return;
@@ -153,5 +190,4 @@ public class BattleService extends BaseGameService {
// Done - Clear battle object from player
player.setBattle(null);
}
}

View File

@@ -14,7 +14,7 @@ public class HandlerPVEBattleResultCsReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = PVEBattleResultCsReq.parseFrom(data);
session.getServer().getBattleService().onBattleResult(
session.getServer().getBattleService().finishBattle(
session.getPlayer(),
req.getEndStatus(),
req.getStt().getBattleAvatarList()

View File

@@ -15,7 +15,7 @@ public class HandlerSceneCastSkillCsReq extends PacketHandler {
var req = SceneCastSkillCsReq.parseFrom(data);
if (req.hasAttackedEntityIdList()) {
session.getServer().getBattleService().onBattleStart(session.getPlayer(), req.getAttackerId(), req.getAttackedEntityIdList());
session.getServer().getBattleService().startBattle(session.getPlayer(), req.getAttackerId(), req.getAttackedEntityIdList());
} else {
session.send(new PacketSceneCastSkillScRsp());
}

View File

@@ -0,0 +1,19 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.proto.StartCocoonStageCsReqOuterClass.StartCocoonStageCsReq;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
@Opcodes(CmdId.StartCocoonStageCsReq)
public class HandlerStartCocoonStageCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = StartCocoonStageCsReq.parseFrom(data);
session.getServer().getBattleService().startCocoon(session.getPlayer(), req.getCocoonId(), req.getWorldLevel(), req.getWave());
}
}

View File

@@ -1,17 +1,9 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.player.PlayerLineup;
import emu.lunarcore.game.scene.entity.EntityMonster;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.SceneBattleInfoOuterClass.SceneBattleInfo;
import emu.lunarcore.proto.SceneCastSkillScRspOuterClass.SceneCastSkillScRsp;
import emu.lunarcore.proto.SceneMonsterOuterClass.SceneMonster;
import emu.lunarcore.proto.SceneMonsterWaveOuterClass.SceneMonsterWave;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.util.Utils;
public class PacketSceneCastSkillScRsp extends BasePacket {
@@ -28,13 +20,11 @@ public class PacketSceneCastSkillScRsp extends BasePacket {
this.setData(data);
}
// TODO
public PacketSceneCastSkillScRsp(Player player, Battle battle) {
public PacketSceneCastSkillScRsp(Battle battle) {
super(CmdId.SceneCastSkillScRsp);
// Build data
var data = SceneCastSkillScRsp.newInstance()
//.setAttackedGroupId(monster.getGroupId())
.setBattleInfo(battle.toProto());
this.setData(data);

View File

@@ -0,0 +1,29 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.proto.StartCocoonStageScRspOuterClass.StartCocoonStageScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketStartCocoonStageScRsp extends BasePacket {
public PacketStartCocoonStageScRsp() {
super(CmdId.StartCocoonStageScRsp);
var data = StartCocoonStageScRsp.newInstance()
.setRetcode(1);
this.setData(data);
}
public PacketStartCocoonStageScRsp(Battle battle, int cocoonId, int wave) {
super(CmdId.StartCocoonStageScRsp);
var data = StartCocoonStageScRsp.newInstance()
.setBattleInfo(battle.toProto())
.setCocoonId(cocoonId)
.setWave(wave);
this.setData(data);
}
}