2021-03-13 20:22:29 +00:00
|
|
|
#pragma once
|
|
|
|
|
2022-07-17 06:33:57 +00:00
|
|
|
#include "core/Core.hpp"
|
|
|
|
|
2022-07-16 23:19:40 +00:00
|
|
|
#include "Entities.hpp"
|
2022-07-17 06:33:57 +00:00
|
|
|
#include "Player.hpp"
|
2022-07-16 23:19:40 +00:00
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <vector>
|
2022-11-27 22:36:47 +00:00
|
|
|
#include <assert.h>
|
2021-03-13 20:22:29 +00:00
|
|
|
|
2023-09-09 18:59:13 +00:00
|
|
|
const int COMBAT_TICKS_PER_DRAIN_PROC = 2;
|
2022-07-17 06:33:57 +00:00
|
|
|
constexpr size_t MAX_SKILLRESULT_SIZE = sizeof(sSkillResult_BatteryDrain);
|
|
|
|
|
2022-11-27 22:36:47 +00:00
|
|
|
enum class SkillType {
|
|
|
|
DAMAGE = 1,
|
|
|
|
HEAL_HP = 2,
|
2023-09-13 01:01:18 +00:00
|
|
|
KNOCKDOWN = 3, // uses DamageNDebuff
|
|
|
|
SLEEP = 4, // uses DamageNDebuff
|
|
|
|
SNARE = 5, // uses DamageNDebuff
|
2022-11-27 22:36:47 +00:00
|
|
|
HEAL_STAMINA = 6,
|
|
|
|
STAMINA_SELF = 7,
|
2023-09-13 01:01:18 +00:00
|
|
|
STUN = 8, // uses DamageNDebuff
|
2022-11-27 22:36:47 +00:00
|
|
|
WEAPONSLOW = 9,
|
|
|
|
JUMP = 10,
|
|
|
|
RUN = 11,
|
|
|
|
STEALTH = 12,
|
|
|
|
SWIM = 13,
|
|
|
|
MINIMAPENEMY = 14,
|
|
|
|
MINIMAPTRESURE = 15,
|
|
|
|
PHOENIX = 16,
|
|
|
|
PROTECTBATTERY = 17,
|
|
|
|
PROTECTINFECTION = 18,
|
|
|
|
REWARDBLOB = 19,
|
|
|
|
REWARDCASH = 20,
|
|
|
|
BATTERYDRAIN = 21,
|
|
|
|
CORRUPTIONATTACK = 22,
|
|
|
|
INFECTIONDAMAGE = 23,
|
|
|
|
KNOCKBACK = 24,
|
|
|
|
FREEDOM = 25,
|
|
|
|
PHOENIX_GROUP = 26,
|
|
|
|
RECALL = 27,
|
|
|
|
RECALL_GROUP = 28,
|
|
|
|
RETROROCKET_SELF = 29,
|
|
|
|
BLOODSUCKING = 30,
|
|
|
|
BOUNDINGBALL = 31,
|
|
|
|
INVULNERABLE = 32,
|
|
|
|
NANOSTIMPAK = 33,
|
|
|
|
RETURNHOMEHEAL = 34,
|
|
|
|
BUFFHEAL = 35,
|
|
|
|
EXTRABANK = 36,
|
|
|
|
CORRUPTIONATTACKWIN = 38,
|
|
|
|
CORRUPTIONATTACKLOSE = 39,
|
|
|
|
};
|
|
|
|
|
2022-05-16 20:47:30 +00:00
|
|
|
enum class SkillEffectTarget {
|
|
|
|
POINT = 1,
|
|
|
|
SELF = 2,
|
|
|
|
CONE = 3,
|
|
|
|
WEAPON = 4,
|
|
|
|
AREA_SELF = 5,
|
|
|
|
AREA_TARGET = 6
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class SkillTargetType {
|
|
|
|
MOBS = 1,
|
2022-11-27 22:36:47 +00:00
|
|
|
PLAYERS = 2,
|
2022-05-16 20:47:30 +00:00
|
|
|
GROUP = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class SkillDrainType {
|
|
|
|
ACTIVE = 1,
|
|
|
|
PASSIVE = 2
|
|
|
|
};
|
|
|
|
|
2022-07-17 06:33:57 +00:00
|
|
|
struct SkillResult {
|
|
|
|
size_t size;
|
|
|
|
uint8_t payload[MAX_SKILLRESULT_SIZE];
|
|
|
|
SkillResult(size_t len, void* dat) {
|
2022-11-27 22:36:47 +00:00
|
|
|
assert(len <= MAX_SKILLRESULT_SIZE);
|
2022-07-17 06:33:57 +00:00
|
|
|
size = len;
|
|
|
|
memcpy(payload, dat, len);
|
|
|
|
}
|
|
|
|
SkillResult() {
|
|
|
|
size = 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-03-13 20:22:29 +00:00
|
|
|
struct SkillData {
|
2022-11-27 22:36:47 +00:00
|
|
|
SkillType skillType; // eST
|
2022-05-16 20:47:30 +00:00
|
|
|
SkillEffectTarget effectTarget;
|
|
|
|
int effectType; // always 1?
|
|
|
|
SkillTargetType targetType;
|
|
|
|
SkillDrainType drainType;
|
2021-03-13 20:22:29 +00:00
|
|
|
int effectArea;
|
2022-05-16 20:47:30 +00:00
|
|
|
|
2021-03-13 20:22:29 +00:00
|
|
|
int batteryUse[4];
|
|
|
|
int durationTime[4];
|
2022-05-16 20:47:30 +00:00
|
|
|
|
|
|
|
int valueTypes[3];
|
|
|
|
int values[3][4];
|
2021-03-13 20:22:29 +00:00
|
|
|
};
|
|
|
|
|
2021-06-20 15:02:16 +00:00
|
|
|
namespace Abilities {
|
2021-03-13 20:22:29 +00:00
|
|
|
extern std::map<int32_t, SkillData> SkillTable;
|
2022-05-16 20:47:30 +00:00
|
|
|
|
2022-11-27 22:36:47 +00:00
|
|
|
void useNanoSkill(CNSocket*, SkillData*, sNano&, std::vector<ICombatant*>);
|
2022-07-17 06:33:57 +00:00
|
|
|
void useNPCSkill(EntityRef, int skillID, std::vector<ICombatant*>);
|
2022-05-16 20:47:30 +00:00
|
|
|
|
2022-11-27 22:36:47 +00:00
|
|
|
std::vector<ICombatant*> matchTargets(ICombatant*, SkillData*, int, int32_t*);
|
|
|
|
int getCSTBFromST(SkillType skillType);
|
2021-03-13 20:22:29 +00:00
|
|
|
}
|