Rework battles

This commit is contained in:
Melledy
2023-09-26 01:42:05 -07:00
parent 00fdc85ec4
commit 769a288e7b
4 changed files with 132 additions and 56 deletions

View File

@@ -1,15 +1,61 @@
package emu.lunarcore.game.battle; package emu.lunarcore.game.battle;
import emu.lunarcore.game.player.Player; import java.util.ArrayList;
import java.util.List;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.StageExcel;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.player.PlayerLineup;
import emu.lunarcore.game.scene.EntityMonster;
import emu.lunarcore.proto.SceneBattleInfoOuterClass.SceneBattleInfo;
import emu.lunarcore.proto.SceneMonsterOuterClass.SceneMonster;
import emu.lunarcore.proto.SceneMonsterWaveOuterClass.SceneMonsterWave;
import emu.lunarcore.util.Utils;
import lombok.Getter;
@Getter
public class Battle { public class Battle {
private final Player player; private final Player player;
private final PlayerLineup lineup;
private final List<EntityMonster> npcMonsters;
private StageExcel stage;
public Battle(Player player) { public Battle(Player player, PlayerLineup lineup, StageExcel stage) {
this.player = player; this.player = player;
this.lineup = lineup;
this.npcMonsters = new ArrayList<>();
this.stage = stage;
} }
public SceneBattleInfo toProto() {
var wave = SceneMonsterWave.newInstance()
.setStageId(stage.getId());
public Player getPlayer() { int[] monsters = {101203002, 100202003, 100204007, 100205006};
return player;
for (int i = 0; i < 5; i++) {
var m = SceneMonster.newInstance()
.setMonsterId(Utils.randomElement(monsters));
wave.addMonsterList(m);
}
var proto = SceneBattleInfo.newInstance()
.setStageId(stage.getId())
.setLogicRandomSeed(Utils.randomRange(1, Short.MAX_VALUE))
.addMonsterWaveList(wave)
.setWorldLevel(player.getWorldLevel());
// Avatars
for (int i = 0; i < lineup.getAvatars().size(); i++) {
GameAvatar avatar = getPlayer().getAvatarById(lineup.getAvatars().get(i));
if (avatar == null) continue;
proto.addBattleAvatarList(avatar.toBattleProto(i));
}
return proto;
} }
} }

View File

@@ -1,8 +1,11 @@
package emu.lunarcore.game.battle; package emu.lunarcore.game.battle;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import emu.lunarcore.data.GameData;
import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.player.Player; import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.scene.EntityMonster; import emu.lunarcore.game.scene.EntityMonster;
@@ -25,36 +28,71 @@ public class BattleService extends BaseGameService {
} }
public void onBattleStart(Player player, int attackerId, RepeatedInt attackedList) { public void onBattleStart(Player player, int attackerId, RepeatedInt attackedList) {
// Setup variables //
int entityId = attackedList.get(0); List<GameEntity> entities = new ArrayList<>();
GameEntity entity = null; List<EntityMonster> monsters = new ArrayList<>();
// Check if attacker is the player or not // Check if attacker is the player or not
if (player.getScene().getAvatarEntityIds().contains(attackerId)) { if (player.getScene().getAvatarEntityIds().contains(attackerId)) {
entity = player.getScene().getEntities().get(entityId); // Attacker is the player
} else if (player.getScene().getAvatarEntityIds().contains(entityId)) { for (int entityId : attackedList) {
entity = player.getScene().getEntities().get(attackerId); GameEntity entity = player.getScene().getEntities().get(entityId);
}
if (entity != null) {
if (entity != null) { entities.add(entity);
if (entity instanceof EntityMonster) { }
player.sendPacket(new PacketSceneCastSkillScRsp(player, (EntityMonster) entity)); }
return; } else {
} else if (entity instanceof EntityProp) { // Player is ambushed
player.sendPacket(new PacketSceneCastSkillScRsp(0)); GameEntity entity = player.getScene().getEntities().get(attackerId);
return;
if (entity != null) {
entities.add(entity);
} }
} }
player.sendPacket(new PacketSceneCastSkillScRsp(1)); // Give the client an error if not attacked entities detected
if (entities.size() == 0) {
player.sendPacket(new PacketSceneCastSkillScRsp(1));
return;
}
// Destroy props
var it = entities.iterator();
while (it.hasNext()) {
GameEntity entity = it.next();
if (entity instanceof EntityMonster monster) {
monsters.add(monster);
} else if (entity instanceof EntityProp) {
it.remove();
}
}
// Start battle
if (monsters.size() > 0) {
// Create battle and add npc monsters to it
Battle battle = new Battle(player, player.getLineupManager().getCurrentLineup(), GameData.getStageExcelMap().get(1));
battle.getNpcMonsters().addAll(monsters);
// Set battle and send rsp packet
player.setBattle(battle);
player.sendPacket(new PacketSceneCastSkillScRsp(player, battle));
return;
}
// Send packet
player.sendPacket(new PacketSceneCastSkillScRsp(0));
} }
public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage<AvatarBattleInfo> battleAvatars) { public void onBattleResult(Player player, BattleEndStatus result, RepeatedMessage<AvatarBattleInfo> battleAvatars) {
// Lose // Sanity
if (result == BattleEndStatus.BATTLE_END_LOSE) { if (!player.isInBattle()) {
return;
} }
// Get battle object
Battle battle = player.getBattle();
// Set health/energy // Set health/energy
for (var battleAvatar : battleAvatars) { for (var battleAvatar : battleAvatars) {
GameAvatar avatar = player.getAvatarById(battleAvatar.getId()); GameAvatar avatar = player.getAvatarById(battleAvatar.getId());
@@ -70,7 +108,15 @@ public class BattleService extends BaseGameService {
} }
// Sync with player // Sync with player
player.sendPacket(new PacketSyncLineupNotify(player.getLineupManager().getCurrentLineup())); player.sendPacket(new PacketSyncLineupNotify(battle.getLineup()));
// Delete enemies if the player won
if (result == BattleEndStatus.BATTLE_END_WIN) {
}
// Done - Clear battle object from player
player.setBattle(null);
} }
} }

View File

@@ -14,6 +14,7 @@ import emu.lunarcore.data.excel.MapEntranceExcel;
import emu.lunarcore.game.account.Account; import emu.lunarcore.game.account.Account;
import emu.lunarcore.game.avatar.AvatarStorage; import emu.lunarcore.game.avatar.AvatarStorage;
import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.gacha.PlayerGachaInfo; import emu.lunarcore.game.gacha.PlayerGachaInfo;
import emu.lunarcore.game.inventory.Inventory; import emu.lunarcore.game.inventory.Inventory;
import emu.lunarcore.game.scene.Scene; import emu.lunarcore.game.scene.Scene;
@@ -48,6 +49,7 @@ public class Player {
private int hcoin; // Jade private int hcoin; // Jade
private int mcoin; // Crystals private int mcoin; // Crystals
private transient Battle battle;
private transient Scene scene; private transient Scene scene;
private Position pos; private Position pos;
private int planeId; private int planeId;
@@ -207,6 +209,14 @@ public class Player {
return this.exp - GameData.getPlayerExpRequired(this.level); return this.exp - GameData.getPlayerExpRequired(this.level);
} }
public boolean isInBattle() {
return this.battle != null;
}
public void setBattle(Battle battle) {
this.battle = battle;
}
public void enterScene(int entryId, int teleportId) { public void enterScene(int entryId, int teleportId) {
// Get map entrance excel // Get map entrance excel
MapEntranceExcel entry = GameData.getMapEntranceExcelMap().get(entryId); MapEntranceExcel entry = GameData.getMapEntranceExcelMap().get(entryId);

View File

@@ -1,6 +1,7 @@
package emu.lunarcore.server.packet.send; package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.player.PlayerLineup; import emu.lunarcore.game.player.PlayerLineup;
import emu.lunarcore.game.player.Player; import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.scene.EntityMonster; import emu.lunarcore.game.scene.EntityMonster;
@@ -28,40 +29,13 @@ public class PacketSceneCastSkillScRsp extends BasePacket {
} }
// TODO // TODO
public PacketSceneCastSkillScRsp(Player player, EntityMonster monster) { public PacketSceneCastSkillScRsp(Player player, Battle battle) {
super(CmdId.SceneCastSkillScRsp); super(CmdId.SceneCastSkillScRsp);
var wave = SceneMonsterWave.newInstance()
.setStageId(monster.getStage().getId());
int[] monsters = {101203002, 100202003, 100204007, 100205006};
for (int i = 0; i < 5; i++) {
var m = SceneMonster.newInstance()
.setMonsterId(Utils.randomElement(monsters));
wave.addMonsterList(m);
}
var battle = SceneBattleInfo.newInstance()
.setStageId(monster.getStage().getId())
.setLogicRandomSeed(Utils.randomRange(1, Short.MAX_VALUE))
.addMonsterWaveList(wave)
.setWorldLevel(player.getWorldLevel());
// Avatars
PlayerLineup lineup = player.getLineupManager().getCurrentLineup();
for (int i = 0; i < lineup.getAvatars().size(); i++) {
GameAvatar avatar = player.getAvatarById(lineup.getAvatars().get(i));
if (avatar == null) continue;
battle.addBattleAvatarList(avatar.toBattleProto(i));
}
// Build data // Build data
var data = SceneCastSkillScRsp.newInstance() var data = SceneCastSkillScRsp.newInstance()
.setAttackedGroupId(monster.getGroupId()) //.setAttackedGroupId(monster.getGroupId())
.setBattleInfo(battle); .setBattleInfo(battle.toProto());
this.setData(data); this.setData(data);
} }