mirror of
https://github.com/Anime-Game-Servers/AGSLunarCore.git
synced 2024-11-27 06:10:25 +00:00
Rework scene skill handler a bit
This commit is contained in:
parent
e15d91bfd8
commit
ac494b9d13
@ -23,12 +23,12 @@ public class SkillAbilityInfo {
|
||||
|
||||
// Skip if not a maze skill
|
||||
if (ability.getName().contains("MazeSkill")) {
|
||||
skill = new MazeSkill(avatarExcel);
|
||||
skill = new MazeSkill(avatarExcel, 2);
|
||||
avatarExcel.setMazeSkill(skill);
|
||||
|
||||
actionList = skill.getCastActions();
|
||||
} else if (ability.getName().contains("NormalAtk")) {
|
||||
skill = new MazeSkill(avatarExcel);
|
||||
skill = new MazeSkill(avatarExcel, 1);
|
||||
avatarExcel.setMazeAttack(skill);
|
||||
|
||||
actionList = skill.getAttackActions();
|
||||
@ -64,13 +64,18 @@ public class SkillAbilityInfo {
|
||||
for (TaskInfo t : task.getSuccessTaskList()) {
|
||||
parseTask(skill, actionList, t);
|
||||
}
|
||||
} else if (task.getOnAttack() != null) {
|
||||
if (task.getType().contains("AdventureTriggerAttack")) {
|
||||
} else if (task.getType().contains("AdventureTriggerAttack")) {
|
||||
if (task.getOnAttack() != null) {
|
||||
for (TaskInfo t : task.getOnAttack()) {
|
||||
parseTask(skill, skill.getAttackActions(), t);
|
||||
}
|
||||
} else if (task.getType().contains("AdventureFireProjectile")) {
|
||||
for (TaskInfo t : task.getOnAttack()) {
|
||||
}
|
||||
if (skill.getIndex() == 2) {
|
||||
skill.setTriggerBattle(task.isTriggerBattle());
|
||||
}
|
||||
} else if (task.getType().contains("AdventureFireProjectile")) {
|
||||
if (task.getOnProjectileHit() != null) {
|
||||
for (TaskInfo t : task.getOnProjectileHit()) {
|
||||
parseTask(skill, skill.getAttackActions(), t);
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,12 @@ public class TaskInfo {
|
||||
@SerializedName(value = "ID", alternate = {"SummonUnitID"})
|
||||
private int ID;
|
||||
|
||||
private boolean TriggerBattle = true;
|
||||
private DynamicFloat LifeTime;
|
||||
|
||||
private List<TaskInfo> OnAttack;
|
||||
private List<TaskInfo> SuccessTaskList;
|
||||
private List<TaskInfo> OnProjectileHit;
|
||||
|
||||
public String getType() {
|
||||
return this.$type;
|
||||
|
@ -7,7 +7,7 @@ import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||
import emu.lunarcore.game.inventory.ItemRarity;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
|
@ -8,6 +8,7 @@ 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.battle.skills.MazeSkill;
|
||||
import emu.lunarcore.game.enums.StageType;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.game.scene.entity.EntityMonster;
|
||||
@ -29,7 +30,7 @@ public class BattleService extends BaseGameService {
|
||||
super(server);
|
||||
}
|
||||
|
||||
public void startBattle(Player player, int casterId, int attackedGroupId, boolean castedSkill, Set<Integer> targets) {
|
||||
public void startBattle(Player player, int casterId, int attackedGroupId, MazeSkill castedSkill, Set<Integer> targets) {
|
||||
// Setup variables
|
||||
List<GameEntity> targetEntities = new ArrayList<>();
|
||||
boolean isPlayerCaster = false; // Set true if the player is the one casting
|
||||
@ -115,16 +116,14 @@ public class BattleService extends BaseGameService {
|
||||
|
||||
if (avatar != null) {
|
||||
// Maze skill attack event
|
||||
if (castedSkill) { // Dont need to null check maze skill since we already did it in HandlerSceneCastSkillCsReq
|
||||
avatar.getExcel().getMazeSkill().onAttack(avatar, battle);
|
||||
} else if (avatar.getExcel().getMazeAttack() != null) {
|
||||
avatar.getExcel().getMazeAttack().onAttack(avatar, battle);
|
||||
if (castedSkill != null) {
|
||||
castedSkill.onAttack(avatar, battle);
|
||||
}
|
||||
// Add elemental weakness buff to enemies
|
||||
MazeBuff buff = battle.addBuff(avatar.getExcel().getDamageType().getEnterBattleBuff(), battle.getLineup().getLeader());
|
||||
if (buff != null) {
|
||||
buff.addTargetIndex(battle.getLineup().getLeader());
|
||||
buff.addDynamicValue("SkillIndex", castedSkill ? 2 : 1);
|
||||
buff.addDynamicValue("SkillIndex", castedSkill != null ? castedSkill.getIndex() : 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,15 +8,21 @@ import emu.lunarcore.game.avatar.GameAvatar;
|
||||
import emu.lunarcore.game.battle.Battle;
|
||||
import emu.lunarcore.proto.MotionInfoOuterClass.MotionInfo;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
public class MazeSkill {
|
||||
private int id;
|
||||
private int index;
|
||||
private List<MazeSkillAction> castActions;
|
||||
private List<MazeSkillAction> attackActions;
|
||||
|
||||
public MazeSkill(AvatarExcel excel) {
|
||||
@Setter private boolean triggerBattle;
|
||||
|
||||
public MazeSkill(AvatarExcel excel, int index) {
|
||||
this.id = excel.getAvatarID();
|
||||
this.index = index;
|
||||
this.triggerBattle = true;
|
||||
this.castActions = new ArrayList<>();
|
||||
this.attackActions = new ArrayList<>();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import java.util.Set;
|
||||
|
||||
import emu.lunarcore.game.avatar.GameAvatar;
|
||||
import emu.lunarcore.game.battle.skills.MazeSkill;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.proto.SceneCastSkillCsReqOuterClass.SceneCastSkillCsReq;
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
@ -20,20 +21,33 @@ public class HandlerSceneCastSkillCsReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
|
||||
var req = SceneCastSkillCsReq.parseFrom(data);
|
||||
|
||||
boolean castedSkill = false;
|
||||
// Setup variables
|
||||
Player player = session.getPlayer();
|
||||
MazeSkill skill = null;
|
||||
|
||||
// Check if player casted a maze skill
|
||||
if (req.getSkillIndex() > 0 && session.getPlayer().getScene().getAvatarEntityIds().contains(req.getCasterId())) {
|
||||
// Spend one skill point
|
||||
session.getPlayer().getCurrentLineup().removeMp(1);
|
||||
session.send(new PacketSceneCastSkillMpUpdateScNotify(req.getAttackedGroupId(), session.getPlayer().getLineupManager().getMp()));
|
||||
// Cast skill effects
|
||||
GameAvatar caster = session.getPlayer().getCurrentLeaderAvatar();
|
||||
if (caster != null && caster.getExcel().getMazeSkill() != null) {
|
||||
MazeSkill skill = caster.getExcel().getMazeSkill();
|
||||
skill.onCast(caster, req.getTargetMotion());
|
||||
// Set flag
|
||||
castedSkill = true;
|
||||
if (player.getScene().getAvatarEntityIds().contains(req.getCasterId())) {
|
||||
// Get casting avatar
|
||||
GameAvatar caster = player.getCurrentLeaderAvatar();
|
||||
|
||||
// Sanity check, but should never happen
|
||||
if (caster == null) {
|
||||
session.send(new PacketSceneCastSkillScRsp(req.getAttackedGroupId()));
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if normal attack or technique was used
|
||||
if (req.getSkillIndex() > 0) {
|
||||
// Spend one skill point
|
||||
player.getCurrentLineup().removeMp(1);
|
||||
session.send(new PacketSceneCastSkillMpUpdateScNotify(req.getAttackedGroupId(), player.getCurrentLineup().getMp()));
|
||||
// Cast skill effects
|
||||
if (caster.getExcel().getMazeSkill() != null) {
|
||||
skill = caster.getExcel().getMazeSkill();
|
||||
skill.onCast(caster, req.getTargetMotion());
|
||||
}
|
||||
} else {
|
||||
skill = caster.getExcel().getMazeAttack();
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,9 +57,16 @@ public class HandlerSceneCastSkillCsReq extends PacketHandler {
|
||||
req.getHitTargetIdList().forEach(targets::add);
|
||||
req.getAssistMonsterIdList().forEach(targets::add);
|
||||
|
||||
// Start battle
|
||||
session.getServer().getBattleService().startBattle(session.getPlayer(), req.getCasterId(), req.getAttackedGroupId(), castedSkill, targets);
|
||||
// Check if we can start a battle
|
||||
if (skill != null && !skill.isTriggerBattle()) {
|
||||
// Skip battle if our technique does not trigger a battle
|
||||
session.send(new PacketSceneCastSkillScRsp(req.getAttackedGroupId()));
|
||||
} else {
|
||||
// Start battle normally
|
||||
session.getServer().getBattleService().startBattle(player, req.getCasterId(), req.getAttackedGroupId(), skill, targets);
|
||||
}
|
||||
} else {
|
||||
// We had no targets for some reason
|
||||
session.send(new PacketSceneCastSkillScRsp(req.getAttackedGroupId()));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user