mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-12 21:34:35 +01:00
Implement cocoons
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
28
src/main/java/emu/lunarcore/data/excel/CocoonExcel.java
Normal file
28
src/main/java/emu/lunarcore/data/excel/CocoonExcel.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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,7 +110,7 @@ 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;
|
||||
}
|
||||
|
||||
@@ -116,7 +118,42 @@ public class BattleService extends BaseGameService {
|
||||
player.sendPacket(new PacketSceneCastSkillScRsp(0));
|
||||
}
|
||||
|
||||
public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage<AvatarBattleInfo> battleAvatars) {
|
||||
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 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user