Mostly working ability exporter, still need some advanced properties
This commit is contained in:
parent
78d44b4260
commit
fc914c8191
@ -1,6 +1,9 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
cmake_minimum_required(VERSION 3.27)
|
||||
project(ISXMr VERSION 1.0.0 LANGUAGES CXX)
|
||||
|
||||
# Include the FetchContent module
|
||||
include(FetchContent)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
@ -74,14 +77,17 @@ add_library(ISXMr SHARED ${SOURCE_DIR}/ISXMr.cpp
|
||||
src/isxeq2/AbilityInfo.h
|
||||
src/isxeq2/CharacterClass.h
|
||||
src/isxeq2/AbilityEffect.h
|
||||
libs/json/json.h
|
||||
src/Logger.h
|
||||
src/Commands/ExecutableCommand.h
|
||||
src/Commands/ExportCommand.cpp
|
||||
src/Commands/ExportCommand.h
|
||||
src/isxeq2/ExtensionTLOs.h
|
||||
src/Commands/CommandExecutor.cpp
|
||||
src/Commands/CommandExecutor.h)
|
||||
src/Commands/CommandExecutor.h
|
||||
src/BotSettings/ExportedAbility.h
|
||||
includes/argh/argh.h
|
||||
includes/picojson/picojson.h
|
||||
src/isxeq2/EQ2.h)
|
||||
|
||||
IF (WIN32)
|
||||
cmake_host_system_information(
|
||||
@ -104,6 +110,7 @@ endif ()
|
||||
|
||||
# Set the path to additional libraries
|
||||
set(LIBS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/)
|
||||
set(INCLUDES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/includes/)
|
||||
|
||||
# Find isxdk library
|
||||
find_library(ISXDK_LIBRARY ISXDK HINTS ${LIBS_DIR}/isxdk/lib64/vs16)
|
||||
@ -119,6 +126,8 @@ endif ()
|
||||
# Set include directories for isxdk
|
||||
include_directories(${LIBS_DIR}/isxdk/include)
|
||||
include_directories(${LIBS_DIR}/argh)
|
||||
include_directories(${INCLUDES_DIR})
|
||||
|
||||
|
||||
# Link ISXMr with isxdk library
|
||||
target_link_libraries(ISXMr PRIVATE ${ISUI_LIBRARY} ${ISXDK_LIBRARY})
|
||||
|
||||
1200
includes/picojson/picojson.h
Normal file
1200
includes/picojson/picojson.h
Normal file
File diff suppressed because it is too large
Load Diff
24766
libs/json/json.h
24766
libs/json/json.h
File diff suppressed because it is too large
Load Diff
177
src/BotSettings/ExportedAbility.h
Normal file
177
src/BotSettings/ExportedAbility.h
Normal file
@ -0,0 +1,177 @@
|
||||
#ifndef ABILITYEXPORT_H
|
||||
#define ABILITYEXPORT_H
|
||||
#include <regex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
//#include <nlohmann/json.hpp>
|
||||
#include <picojson/picojson.h>
|
||||
|
||||
using namespace std;
|
||||
//using json = nlohmann::json;
|
||||
|
||||
enum AbilityTypeFlags {
|
||||
Debuff = 1,
|
||||
Buff = 2,
|
||||
AE = 4,
|
||||
AEEncounterHostile,
|
||||
SingleTargetBeneficial = 16,
|
||||
SingleTargetHostile = 32,
|
||||
Daze = 64,
|
||||
Stun = 128,
|
||||
Fear = 256,
|
||||
Root = 512,
|
||||
Snare = 1024,
|
||||
Interrupt = 2048,
|
||||
Cure = 4096,
|
||||
GroupBeneficial = 8192,
|
||||
RaidBeneficial = 16384,
|
||||
SelfBeneficial = 32768,
|
||||
Damage = 65536,
|
||||
Self = 131072,
|
||||
};
|
||||
|
||||
enum AbilityRequirementsFlags {
|
||||
NoEpic = 1,
|
||||
Flanking = 2,
|
||||
Stealth = 4,
|
||||
Ranged = 8,
|
||||
};
|
||||
|
||||
struct ExportedAbility {
|
||||
unsigned long Id;
|
||||
string Name;
|
||||
string Description;
|
||||
string Tier;
|
||||
unsigned int Level;
|
||||
int HealthCost;
|
||||
int PowerCost;
|
||||
int DissonanceCost;
|
||||
int SavageryCost;
|
||||
int ConcentrationCost;
|
||||
int MainIconID;
|
||||
int HOIconID;
|
||||
float CastingTime;
|
||||
float RecoveryTime;
|
||||
float RecastTime;
|
||||
float MaxDuration;
|
||||
int NumClasses;
|
||||
int NumEffects;
|
||||
int BackdropIconID;
|
||||
int HealthCostPerTick;
|
||||
int PowerCostPerTick;
|
||||
int DissonanceCostPerTick;
|
||||
int SavageryCostPerTick;
|
||||
int MaxAOETargets;
|
||||
int DoesNotExpire;
|
||||
int GroupRestricted;
|
||||
int AllowRaid;
|
||||
int IsBeneficial;
|
||||
float EffectRadius;
|
||||
int TargetType;
|
||||
int SpellBookType;
|
||||
float MinRange;
|
||||
float MaxRange;
|
||||
unsigned int Damage;
|
||||
vector<string> Effects;
|
||||
unsigned long TypeFlags;
|
||||
unsigned short RequirementsFlags;
|
||||
|
||||
picojson::value ToJson() const {
|
||||
picojson::object jsonValue;
|
||||
|
||||
jsonValue["Id"] = picojson::value(static_cast<double>(Id));
|
||||
jsonValue["Name"] = picojson::value(Name);
|
||||
jsonValue["Description"] = picojson::value(Description);
|
||||
jsonValue["Tier"] = picojson::value(Tier);
|
||||
jsonValue["Level"] = picojson::value(static_cast<double>(Level));
|
||||
jsonValue["HealthCost"] = picojson::value(static_cast<double>(HealthCost));
|
||||
jsonValue["PowerCost"] = picojson::value(static_cast<double>(PowerCost));
|
||||
jsonValue["DissonanceCost"] = picojson::value(static_cast<double>(DissonanceCost));
|
||||
jsonValue["SavageryCost"] = picojson::value(static_cast<double>(SavageryCost));
|
||||
jsonValue["ConcentrationCost"] = picojson::value(static_cast<double>(ConcentrationCost));
|
||||
jsonValue["MainIconID"] = picojson::value(static_cast<double>(MainIconID));
|
||||
jsonValue["HOIconID"] = picojson::value(static_cast<double>(HOIconID));
|
||||
jsonValue["CastingTime"] = picojson::value(static_cast<double>(CastingTime));
|
||||
jsonValue["RecoveryTime"] = picojson::value(static_cast<double>(RecoveryTime));
|
||||
jsonValue["RecastTime"] = picojson::value(static_cast<double>(RecastTime));
|
||||
jsonValue["MaxDuration"] = picojson::value(static_cast<double>(MaxDuration));
|
||||
jsonValue["NumClasses"] = picojson::value(static_cast<double>(NumClasses));
|
||||
jsonValue["NumEffects"] = picojson::value(static_cast<double>(NumEffects));
|
||||
jsonValue["BackdropIconID"] = picojson::value(static_cast<double>(BackdropIconID));
|
||||
jsonValue["HealthCostPerTick"] = picojson::value(static_cast<double>(HealthCostPerTick));
|
||||
jsonValue["PowerCostPerTick"] = picojson::value(static_cast<double>(PowerCostPerTick));
|
||||
jsonValue["DissonanceCostPerTick"] = picojson::value(static_cast<double>(DissonanceCostPerTick));
|
||||
jsonValue["SavageryCostPerTick"] = picojson::value(static_cast<double>(SavageryCostPerTick));
|
||||
jsonValue["MaxAOETargets"] = picojson::value(static_cast<double>(MaxAOETargets));
|
||||
jsonValue["DoesNotExpire"] = picojson::value(static_cast<bool>(DoesNotExpire));
|
||||
jsonValue["GroupRestricted"] = picojson::value(static_cast<bool>(GroupRestricted));
|
||||
jsonValue["AllowRaid"] = picojson::value(static_cast<bool>(AllowRaid));
|
||||
jsonValue["IsBeneficial"] = picojson::value(static_cast<bool>(IsBeneficial));
|
||||
jsonValue["EffectRadius"] = picojson::value(EffectRadius);
|
||||
jsonValue["TargetType"] = picojson::value(static_cast<double>(TargetType));
|
||||
jsonValue["SpellBookType"] = picojson::value(static_cast<double>(SpellBookType));
|
||||
jsonValue["MinRange"] = picojson::value(MinRange);
|
||||
jsonValue["MaxRange"] = picojson::value(MaxRange);
|
||||
|
||||
|
||||
//jsonValue
|
||||
// j["Id"] = Id;
|
||||
// j["Name"] = Name;
|
||||
// j["Description"] = Description;
|
||||
// j["Tier"] = Tier;
|
||||
// j["Level"] = Level;
|
||||
// j["HealthCost"] = HealthCost;
|
||||
// j["PowerCost"] = PowerCost;
|
||||
// j["DissonanceCost"] = DissonanceCost;
|
||||
// j["SavageryCost"] = SavageryCost;
|
||||
// j["ConcentrationCost"] = ConcentrationCost;
|
||||
// j["MainIconID"] = MainIconID;
|
||||
// j["HOIconID"] = HOIconID;
|
||||
// j["CastingTime"] = CastingTime;
|
||||
// j["RecoveryTime"] = RecoveryTime;
|
||||
// j["RecastTime"] = RecastTime;
|
||||
// j["MaxDuration"] = MaxDuration;
|
||||
// j["NumClasses"] = NumClasses;
|
||||
// j["NumEffects"] = NumEffects;
|
||||
// j["BackdropIconID"] = BackdropIconID;
|
||||
// j["HealthCostPerTick"] = HealthCostPerTick;
|
||||
// j["PowerCostPerTick"] = PowerCostPerTick;
|
||||
// j["DissonanceCostPerTick"] = DissonanceCostPerTick;
|
||||
// j["SavageryCostPerTick"] = SavageryCostPerTick;
|
||||
// j["MaxAOETargets"] = MaxAOETargets;
|
||||
// j["DoesNotExpire"] = DoesNotExpire;
|
||||
// j["GroupRestricted"] = GroupRestricted;
|
||||
// j["AllowRaid"] = AllowRaid;
|
||||
// j["IsBeneficial"] = IsBeneficial;
|
||||
// j["EffectRadius"] = EffectRadius;
|
||||
// j["TargetType"] = TargetType;
|
||||
// j["SpellBookType"] = SpellBookType;
|
||||
// j["MinRange"] = MinRange;
|
||||
// j["MaxRange"] = MaxRange;
|
||||
// j["Damage"] = Damage;
|
||||
// j["Effects"] = Effects;
|
||||
// j["TypeFlags"] = TypeFlags;
|
||||
// j["RequirementsFlags"] = RequirementsFlags;
|
||||
|
||||
|
||||
return picojson::value(jsonValue);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// \brief Strips trailing roman numerals from a string
|
||||
/// \details This function is used to strip trailing roman numerals from a string. For example, "Ability I" would be
|
||||
/// returned as "Ability". "Ability II" would be returned as "Ability".
|
||||
/// \param name The name to strip trailing roman numerals from
|
||||
/// \return The name with trailing roman numerals stripped
|
||||
inline string StripTrailingRomanNumerals(const string &name) {
|
||||
// Regex to match trailing Roman numerals and whitespace
|
||||
const std::regex romanNumeralRegex(R"(\s*(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))\s*$)");
|
||||
|
||||
// Replace the matched trailing Roman numerals and whitespace with an empty string
|
||||
return std::regex_replace(name, romanNumeralRegex, "");
|
||||
}
|
||||
|
||||
|
||||
#endif //ABILITYEXPORT_H
|
||||
@ -1,6 +1,6 @@
|
||||
#include <argh.h>
|
||||
#include <ISXDK.h>
|
||||
#include <thread>
|
||||
#include <argh/argh.h>
|
||||
|
||||
#include "ISXMr.h"
|
||||
#include "Logger.h"
|
||||
|
||||
@ -1,13 +1,20 @@
|
||||
#include <chrono>
|
||||
#include <fstream>
|
||||
#include <future>
|
||||
#include <thread>
|
||||
#include <picojson/picojson.h>
|
||||
|
||||
#include "ISXMr.h"
|
||||
#include "ExportCommand.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <future>
|
||||
#include <thread>
|
||||
#include <filesystem>
|
||||
|
||||
#include "Logger.h"
|
||||
#include "isxeq2/ExtensionTLOs.h"
|
||||
|
||||
using namespace std;
|
||||
//using json = nlohmann::json;
|
||||
|
||||
AbilityInfo GetAbilityInfo(const int idx) {
|
||||
const auto ability = ExtensionTLOs::Me().Ability(idx);
|
||||
while (!ability.IsAbilityInfoAvailable()) {
|
||||
@ -21,8 +28,9 @@ void ExportCommand::Execute() {
|
||||
try {
|
||||
log << "Exporting abilities" << endl;
|
||||
const auto numAbilities = ExtensionTLOs::Me().NumAbilities();
|
||||
auto abilityList = map<string, picojson::value>{};
|
||||
for (int i = 1; i <= numAbilities && !IsStopRequested(); ++i) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
while (!ExtensionTLOs::Me().Ability(i).IsAbilityInfoAvailable() && !IsStopRequested()) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
}
|
||||
@ -31,9 +39,42 @@ void ExportCommand::Execute() {
|
||||
log << "Exporting abilities cancelled" << endl;
|
||||
return;
|
||||
}
|
||||
const auto exportedAbility = ExtensionTLOs::Me().Ability(i).ToExportedAbility();
|
||||
log << "Exporting " << exportedAbility.Name << " (" << i << "/" << numAbilities << ")" << endl;
|
||||
const auto abilityLineName = StripTrailingRomanNumerals(exportedAbility.Name);
|
||||
if (const auto abilityLine = abilityList[abilityLineName]; !abilityLine.is<picojson::array>()) {
|
||||
picojson::array entry({exportedAbility.ToJson()});
|
||||
abilityList[abilityLineName] = picojson::value(picojson::array({exportedAbility.ToJson()}));
|
||||
} else {
|
||||
abilityList[abilityLineName].get<picojson::array>().push_back(exportedAbility.ToJson());
|
||||
}
|
||||
}
|
||||
|
||||
const auto abilityInfo = ExtensionTLOs::Me().Ability(i).GetAbilityInfo();
|
||||
log << "Exporting " << abilityInfo.Name() << "(" << i << "/" << numAbilities << ")" << endl;
|
||||
constexpr size_t innerspacePathBufferLength = 255;
|
||||
char innerspacePathBuffer[innerspacePathBufferLength];
|
||||
const filesystem::path innerspacePath = pISInterface->GetInnerSpacePath(
|
||||
innerspacePathBuffer, innerspacePathBufferLength);
|
||||
ostringstream filename;
|
||||
filename <<
|
||||
ExtensionTLOs::Me().Name() <<
|
||||
"_" <<
|
||||
ExtensionTLOs::Me().SubClass() <<
|
||||
"_" <<
|
||||
ExtensionTLOs::EQ2().ServerName()
|
||||
<< ".json";
|
||||
filesystem::path fullPath = innerspacePath /
|
||||
R"(scripts\mr\bot\ability_exports)" /
|
||||
filename.str();
|
||||
|
||||
if (fullPath.has_parent_path() && !exists(fullPath.parent_path())) {
|
||||
create_directories(fullPath.parent_path());
|
||||
}
|
||||
|
||||
if (std::ofstream file(fullPath); file) {
|
||||
picojson::value abilities(abilityList);
|
||||
file << abilities << endl;
|
||||
} else {
|
||||
loge << "Unknown error writing export to disk" << endl;
|
||||
}
|
||||
} catch (const std::exception &e) {
|
||||
loge << "Error exporting abilities: " << e.what() << endl;
|
||||
|
||||
@ -31,6 +31,47 @@ AbilityInfo Ability::GetAbilityInfo() const {
|
||||
return AbilityInfo(make_shared<LSObject>(this->lsObject->GetMember("ToAbilityInfo")));
|
||||
}
|
||||
|
||||
ExportedAbility Ability::ToExportedAbility() const {
|
||||
auto exportedAbility = ExportedAbility();
|
||||
exportedAbility.Id = this->Id();
|
||||
exportedAbility.Name = this->GetAbilityInfo().Name();
|
||||
exportedAbility.Description = this->GetAbilityInfo().Description();
|
||||
exportedAbility.Tier = this->GetAbilityInfo().Tier();
|
||||
//exportedAbility.Level = this->GetAbilityInfo().Level();
|
||||
exportedAbility.HealthCost = this->GetAbilityInfo().HealthCost();
|
||||
exportedAbility.PowerCost = this->GetAbilityInfo().PowerCost();
|
||||
exportedAbility.DissonanceCost = this->GetAbilityInfo().DissonanceCost();
|
||||
exportedAbility.SavageryCost = this->GetAbilityInfo().SavageryCost();
|
||||
exportedAbility.ConcentrationCost = this->GetAbilityInfo().ConcentrationCost();
|
||||
exportedAbility.MainIconID = this->GetAbilityInfo().MainIconID();
|
||||
exportedAbility.HOIconID = this->GetAbilityInfo().HOIconID();
|
||||
exportedAbility.CastingTime = this->GetAbilityInfo().CastingTime();
|
||||
exportedAbility.RecoveryTime = this->GetAbilityInfo().RecoveryTime();
|
||||
exportedAbility.RecastTime = this->GetAbilityInfo().RecastTime();
|
||||
exportedAbility.MaxDuration = this->GetAbilityInfo().MaxDuration();
|
||||
exportedAbility.NumClasses = this->GetAbilityInfo().NumClasses();
|
||||
exportedAbility.NumEffects = this->GetAbilityInfo().NumEffects();
|
||||
exportedAbility.BackdropIconID = this->GetAbilityInfo().BackDropIconID();
|
||||
exportedAbility.HealthCostPerTick = this->GetAbilityInfo().HealthCostPerTick();
|
||||
exportedAbility.PowerCostPerTick = this->GetAbilityInfo().PowerCostPerTick();
|
||||
exportedAbility.DissonanceCostPerTick = this->GetAbilityInfo().DissonanceCostPerTick();
|
||||
exportedAbility.SavageryCostPerTick = this->GetAbilityInfo().SavageryCostPerTick();
|
||||
exportedAbility.MaxAOETargets = this->GetAbilityInfo().MaxAOETargets();
|
||||
exportedAbility.DoesNotExpire = this->GetAbilityInfo().DoesNotExpire();
|
||||
exportedAbility.GroupRestricted = this->GetAbilityInfo().GroupRestricted();
|
||||
exportedAbility.AllowRaid = this->GetAbilityInfo().AllowRaid();
|
||||
exportedAbility.IsBeneficial = this->GetAbilityInfo().IsBeneficial();
|
||||
exportedAbility.EffectRadius = this->GetAbilityInfo().EffectRadius();
|
||||
exportedAbility.TargetType = this->GetAbilityInfo().TargetType();
|
||||
exportedAbility.SpellBookType = this->GetAbilityInfo().SpellBookType();
|
||||
exportedAbility.MinRange = this->GetAbilityInfo().MinRange();
|
||||
exportedAbility.MaxRange = this->GetAbilityInfo().MaxRange();
|
||||
|
||||
|
||||
return exportedAbility;
|
||||
|
||||
}
|
||||
|
||||
void Ability::Use() const {
|
||||
this->lsObject->CallMethod("Use");
|
||||
}
|
||||
|
||||
@ -12,11 +12,15 @@
|
||||
|
||||
class Ability {
|
||||
public:
|
||||
explicit Ability(const shared_ptr<LSObject> &obj) : lsObject(obj) {}
|
||||
explicit Ability(const shared_ptr<LSObject> &obj) : lsObject(obj) {
|
||||
}
|
||||
|
||||
u_long Id() const;
|
||||
|
||||
bool IsReady() const;
|
||||
|
||||
float TimeUntilReady() const;
|
||||
|
||||
bool IsQueued() const;
|
||||
|
||||
// ABility Details
|
||||
@ -30,13 +34,17 @@ public:
|
||||
/// until it's TRUE before using ToAbilityInfo (as opposed to checking ToAbilityInfo until it's not NULL.) This methodology will avoid spamming the server with requests.
|
||||
AbilityInfo GetAbilityInfo() const;
|
||||
|
||||
ExportedAbility ToExportedAbility() const;
|
||||
|
||||
|
||||
// Methods
|
||||
void Use() const;
|
||||
|
||||
void Examine() const;
|
||||
|
||||
private:
|
||||
const shared_ptr<LSObject> lsObject;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //ABILITY_H
|
||||
|
||||
@ -1,140 +1,139 @@
|
||||
#include "AbilityInfo.h"
|
||||
|
||||
[[nodiscard]]
|
||||
|
||||
string AbilityInfo::Name() const {
|
||||
return this->name;
|
||||
return this->lsObject->GetMember("Name").CharPtr;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
string AbilityInfo::Description() const {
|
||||
return this->description;;
|
||||
return this->lsObject->GetMember("Description").CharPtr;
|
||||
}
|
||||
|
||||
string AbilityInfo::Tier() const {
|
||||
return this->lsObject->GetMember("Tier").CharPtr;
|
||||
}
|
||||
|
||||
int AbilityInfo::HealthCost() const {
|
||||
return this->lsObject->GetMember("HealthCost").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::PowerCost() const {
|
||||
return this->lsObject->GetMember("PowerCost").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::DissonanceCost() const {
|
||||
return this->lsObject->GetMember("DissonanceCost").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::SavageryCost() const {
|
||||
return this->lsObject->GetMember("SavageryCost").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::ConcentrationCost() const {
|
||||
return this->lsObject->GetMember("ConcentrationCost").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::MainIconID() const {
|
||||
return this->lsObject->GetMember("MainIconID").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::HOIconID() const {
|
||||
return this->lsObject->GetMember("HOIconID").Int;
|
||||
}
|
||||
|
||||
float AbilityInfo::CastingTime() const {
|
||||
return this->lsObject->GetMember("CastingTime").Float;
|
||||
}
|
||||
|
||||
float AbilityInfo::RecoveryTime() const {
|
||||
return this->lsObject->GetMember("RecoveryTime").Float;
|
||||
}
|
||||
|
||||
float AbilityInfo::RecastTime() const {
|
||||
return this->lsObject->GetMember("RecastTime").Float;
|
||||
}
|
||||
|
||||
float AbilityInfo::MaxDuration() const {
|
||||
return this->lsObject->GetMember("MaxDuration").Float;
|
||||
}
|
||||
|
||||
int AbilityInfo::NumClasses() const {
|
||||
return this->lsObject->GetMember("NumClasses").Int;
|
||||
}
|
||||
|
||||
CharacterClass AbilityInfo::ClassByIndex(const int num) const {
|
||||
return CharacterClass(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Class", num))));
|
||||
}
|
||||
|
||||
CharacterClass AbilityInfo::ClassByName(const string &name) const {
|
||||
return CharacterClass(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Class", name))));
|
||||
}
|
||||
|
||||
int AbilityInfo::NumEffects() const {
|
||||
return this->lsObject->GetMember("NumEffects").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::BackDropIconID() const {
|
||||
return this->lsObject->GetMember("BackDropIconID").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::HealthCostPerTick() const {
|
||||
return this->lsObject->GetMember("HealthCostPerTick").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::PowerCostPerTick() const {
|
||||
return this->lsObject->GetMember("PowerCostPerTick").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::DissonanceCostPerTick() const {
|
||||
return this->lsObject->GetMember("DissonanceCostPerTick").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::SavageryCostPerTick() const {
|
||||
return this->lsObject->GetMember("SavageryCostPerTick").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::MaxAOETargets() const {
|
||||
return this->lsObject->GetMember("MaxAOETargets").Int;
|
||||
}
|
||||
|
||||
bool AbilityInfo::DoesNotExpire() const {
|
||||
return this->lsObject->GetMember("DoesNotExpire").Int;
|
||||
}
|
||||
|
||||
bool AbilityInfo::GroupRestricted() const {
|
||||
return this->lsObject->GetMember("GroupRestricted").Int;
|
||||
}
|
||||
|
||||
bool AbilityInfo::AllowRaid() const {
|
||||
return this->lsObject->GetMember("AllowRaid").Int;
|
||||
}
|
||||
|
||||
bool AbilityInfo::IsBeneficial() const {
|
||||
return this->lsObject->GetMember("IsBeneficial").Int;
|
||||
}
|
||||
|
||||
float AbilityInfo::EffectRadius() const {
|
||||
return this->lsObject->GetMember("EffectRadius").Float;
|
||||
}
|
||||
|
||||
int AbilityInfo::TargetType() const {
|
||||
return this->lsObject->GetMember("TargetType").Int;
|
||||
}
|
||||
|
||||
int AbilityInfo::SpellBookType() const {
|
||||
return this->lsObject->GetMember("SpellBookType").Int;
|
||||
}
|
||||
|
||||
float AbilityInfo::MinRange() const {
|
||||
return this->lsObject->GetMember("MinRange").Float;
|
||||
}
|
||||
|
||||
float AbilityInfo::MaxRange() const {
|
||||
return this->lsObject->GetMember("MaxRange").Float;
|
||||
}
|
||||
|
||||
string AbilityInfo::ToLink() const {
|
||||
return this->lsObject->GetMember("ToLink").CharPtr;
|
||||
}
|
||||
|
||||
//
|
||||
// string AbilityInfo::Tier() const {
|
||||
// return this->lsObject->GetMember("Tier").CharPtr;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::HealthCost() const {
|
||||
// return this->lsObject->GetMember("HealthCost").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::PowerCost() const {
|
||||
// return this->lsObject->GetMember("PowerCost").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::DissonanceCost() const {
|
||||
// return this->lsObject->GetMember("DissonanceCost").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::SavageryCost() const {
|
||||
// return this->lsObject->GetMember("SavageryCost").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::ConcentrationCost() const {
|
||||
// return this->lsObject->GetMember("ConcentrationCost").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::MainIconID() const {
|
||||
// return this->lsObject->GetMember("MainIconID").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::HOIconID() const {
|
||||
// return this->lsObject->GetMember("HOIconID").Int;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::CastingTime() const {
|
||||
// return this->lsObject->GetMember("CastingTime").Float;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::RecoveryTime() const {
|
||||
// return this->lsObject->GetMember("RecoveryTime").Float;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::RecastTime() const {
|
||||
// return this->lsObject->GetMember("RecastTime").Float;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::MaxDuration() const {
|
||||
// return this->lsObject->GetMember("MaxDuration").Float;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::NumClasses() const {
|
||||
// return this->lsObject->GetMember("NumClasses").Int;
|
||||
// }
|
||||
//
|
||||
// CharacterClass AbilityInfo::ClassByIndex(const int num) const {
|
||||
// return CharacterClass(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Class", num))));
|
||||
// }
|
||||
//
|
||||
// CharacterClass AbilityInfo::ClassByName(const string &name) const {
|
||||
// return CharacterClass(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Class", name))));
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::NumEffects() const {
|
||||
// return this->lsObject->GetMember("NumEffects").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::BackDropIconID() const {
|
||||
// return this->lsObject->GetMember("BackDropIconID").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::HealthCostPerTick() const {
|
||||
// return this->lsObject->GetMember("HealthCostPerTick").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::PowerCostPerTick() const {
|
||||
// return this->lsObject->GetMember("PowerCostPerTick").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::DissonanceCostPerTick() const {
|
||||
// return this->lsObject->GetMember("DissonanceCostPerTick").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::SavageryCostPerTick() const {
|
||||
// return this->lsObject->GetMember("SavageryCostPerTick").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::MaxAOETargets() const {
|
||||
// return this->lsObject->GetMember("MaxAOETargets").Int;
|
||||
// }
|
||||
//
|
||||
// bool AbilityInfo::DoesNotExpire() const {
|
||||
// return this->lsObject->GetMember("DoesNotExpire").Int;
|
||||
// }
|
||||
//
|
||||
// bool AbilityInfo::GroupRestricted() const {
|
||||
// return this->lsObject->GetMember("GroupRestricted").Int;
|
||||
// }
|
||||
//
|
||||
// bool AbilityInfo::AllowRaid() const {
|
||||
// return this->lsObject->GetMember("AllowRaid").Int;
|
||||
// }
|
||||
//
|
||||
// bool AbilityInfo::IsBeneficial() const {
|
||||
// return this->lsObject->GetMember("IsBeneficial").Int;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::EffectRadius() const {
|
||||
// return this->lsObject->GetMember("EffectRadius").Float;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::TargetType() const {
|
||||
// return this->lsObject->GetMember("TargetType").Int;
|
||||
// }
|
||||
//
|
||||
// int AbilityInfo::SpellBookType() const {
|
||||
// return this->lsObject->GetMember("SpellBookType").Int;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::MinRange() const {
|
||||
// return this->lsObject->GetMember("MinRange").Float;
|
||||
// }
|
||||
//
|
||||
// float AbilityInfo::MaxRange() const {
|
||||
// return this->lsObject->GetMember("MaxRange").Float;
|
||||
// }
|
||||
//
|
||||
// string AbilityInfo::ToLink() const {
|
||||
// return this->lsObject->GetMember("ToLink").CharPtr;
|
||||
// }
|
||||
|
||||
@ -4,212 +4,83 @@
|
||||
|
||||
#include "CharacterClass.h"
|
||||
#include "LSObject.h"
|
||||
#include "BotSettings/ExportedAbility.h"
|
||||
|
||||
|
||||
class AbilityInfo {
|
||||
public:
|
||||
explicit AbilityInfo(const std::shared_ptr<LSObject> &obj) : lsObject(obj) {
|
||||
this->name = this->lsObject->GetMember("Name").CharPtr;
|
||||
this->description = this->lsObject->GetMember("Description").CharPtr;
|
||||
this->tier = this->lsObject->GetMember("Tier").CharPtr;
|
||||
this->healthCost = this->lsObject->GetMember("HealthCost").Int;
|
||||
this->powerCost = this->lsObject->GetMember("PowerCost").Int;
|
||||
this->dissonanceCost = this->lsObject->GetMember("DissonanceCost").Int;
|
||||
this->savageryCost = this->lsObject->GetMember("SavageryCost").Int;
|
||||
this->concentrationCost = this->lsObject->GetMember("ConcentrationCost").Int;
|
||||
this->mainIconID = this->lsObject->GetMember("MainIconID").Int;
|
||||
this->hOIconID = this->lsObject->GetMember("HOIconID").Int;
|
||||
this->castingTime = this->lsObject->GetMember("CastingTime").Float;
|
||||
this->recoveryTime = this->lsObject->GetMember("RecoveryTime").Float;
|
||||
this->recastTime = this->lsObject->GetMember("RecastTime").Float;
|
||||
this->maxDuration = this->lsObject->GetMember("MaxDuration").Float;
|
||||
this->numClasses = this->lsObject->GetMember("NumClasses").Int;
|
||||
this->numEffects = this->lsObject->GetMember("NumEffects").Int;
|
||||
this->backDropIconID = this->lsObject->GetMember("BackdropIconID").Int;
|
||||
this->healthCostPerTick = this->lsObject->GetMember("HealthCostPerTick").Int;
|
||||
this->powerCostPerTick = this->lsObject->GetMember("PowerCostPerTick").Int;
|
||||
this->dissonanceCostPerTick = this->lsObject->GetMember("DissonanceCostPerTick").Int;
|
||||
this->savageryCostPerTick = this->lsObject->GetMember("SavageryCostPerTick").Int;
|
||||
this->maxAOETargets = this->lsObject->GetMember("MaxAOETargets").Int;
|
||||
this->doesNotExpire = this->lsObject->GetMember("DoesNotExpire").Int;
|
||||
this->groupRestricted = this->lsObject->GetMember("GroupRestricted").Int;
|
||||
this->allowRaid = this->lsObject->GetMember("AllowRaid").Int;
|
||||
this->isBeneficial = this->lsObject->GetMember("IsBeneficial").Int;
|
||||
this->effectRadius = this->lsObject->GetMember("EffectRadius").Float;
|
||||
this->targetType = this->lsObject->GetMember("TargetType").Int;
|
||||
this->spellBookType = this->lsObject->GetMember("SpellBookType").Int;
|
||||
this->minRange = this->lsObject->GetMember("MinRange").Float;
|
||||
this->maxRange = this->lsObject->GetMember("MaxRange").Float;
|
||||
this->toLink = this->lsObject->GetMember("ToLink").CharPtr;
|
||||
}
|
||||
|
||||
// CharacterClass classByIndex(const int num);
|
||||
//
|
||||
// CharacterClass classByName(const string &name);
|
||||
|
||||
string Name() const;
|
||||
|
||||
string Description() const;
|
||||
|
||||
[[nodiscard]] string tier1() const {
|
||||
return tier;
|
||||
}
|
||||
string Tier() const;
|
||||
|
||||
[[nodiscard]] int health_cost() const {
|
||||
return healthCost;
|
||||
}
|
||||
int HealthCost() const;
|
||||
|
||||
[[nodiscard]] int power_cost() const {
|
||||
return powerCost;
|
||||
}
|
||||
int PowerCost() const;
|
||||
|
||||
[[nodiscard]] int dissonance_cost() const {
|
||||
return dissonanceCost;
|
||||
}
|
||||
int DissonanceCost() const;
|
||||
|
||||
[[nodiscard]] int savagery_cost() const {
|
||||
return savageryCost;
|
||||
}
|
||||
int SavageryCost() const;
|
||||
|
||||
[[nodiscard]] int concentration_cost() const {
|
||||
return concentrationCost;
|
||||
}
|
||||
int ConcentrationCost() const;
|
||||
|
||||
[[nodiscard]] int main_icon_id() const {
|
||||
return mainIconID;
|
||||
}
|
||||
int MainIconID() const;
|
||||
|
||||
[[nodiscard]] int h_o_icon_id() const {
|
||||
return hOIconID;
|
||||
}
|
||||
int HOIconID() const;
|
||||
|
||||
[[nodiscard]] float casting_time() const {
|
||||
return castingTime;
|
||||
}
|
||||
float CastingTime() const;
|
||||
|
||||
[[nodiscard]] float recovery_time() const {
|
||||
return recoveryTime;
|
||||
}
|
||||
float RecoveryTime() const;
|
||||
|
||||
[[nodiscard]] float recast_time() const {
|
||||
return recastTime;
|
||||
}
|
||||
float RecastTime() const;
|
||||
|
||||
[[nodiscard]] float max_duration() const {
|
||||
return maxDuration;
|
||||
}
|
||||
float MaxDuration() const;
|
||||
|
||||
[[nodiscard]] int num_classes() const {
|
||||
return numClasses;
|
||||
}
|
||||
int NumClasses() const;
|
||||
|
||||
[[nodiscard]] int num_effects() const {
|
||||
return numEffects;
|
||||
}
|
||||
CharacterClass ClassByIndex(int num) const;
|
||||
|
||||
[[nodiscard]] int back_drop_icon_id() const {
|
||||
return backDropIconID;
|
||||
}
|
||||
CharacterClass ClassByName(const string &name) const;
|
||||
|
||||
[[nodiscard]] int health_cost_per_tick() const {
|
||||
return healthCostPerTick;
|
||||
}
|
||||
int NumEffects() const;
|
||||
|
||||
[[nodiscard]] int power_cost_per_tick() const {
|
||||
return powerCostPerTick;
|
||||
}
|
||||
int BackDropIconID() const;
|
||||
|
||||
[[nodiscard]] int dissonance_cost_per_tick() const {
|
||||
return dissonanceCostPerTick;
|
||||
}
|
||||
int HealthCostPerTick() const;
|
||||
|
||||
[[nodiscard]] int savagery_cost_per_tick() const {
|
||||
return savageryCostPerTick;
|
||||
}
|
||||
int PowerCostPerTick() const;
|
||||
|
||||
[[nodiscard]] int max_aoe_targets() const {
|
||||
return maxAOETargets;
|
||||
}
|
||||
int DissonanceCostPerTick() const;
|
||||
|
||||
[[nodiscard]] bool does_not_expire() const {
|
||||
return doesNotExpire;
|
||||
}
|
||||
int SavageryCostPerTick() const;
|
||||
|
||||
[[nodiscard]] bool group_restricted() const {
|
||||
return groupRestricted;
|
||||
}
|
||||
int MaxAOETargets() const;
|
||||
|
||||
[[nodiscard]] bool allow_raid() const {
|
||||
return allowRaid;
|
||||
}
|
||||
bool DoesNotExpire() const;
|
||||
|
||||
[[nodiscard]] bool is_beneficial() const {
|
||||
return isBeneficial;
|
||||
}
|
||||
bool GroupRestricted() const;
|
||||
|
||||
[[nodiscard]] float effect_radius() const {
|
||||
return effectRadius;
|
||||
}
|
||||
bool AllowRaid() const;
|
||||
|
||||
[[nodiscard]] int target_type() const {
|
||||
return targetType;
|
||||
}
|
||||
bool IsBeneficial() const;
|
||||
|
||||
[[nodiscard]] int spell_book_type() const {
|
||||
return spellBookType;
|
||||
}
|
||||
float EffectRadius() const;
|
||||
|
||||
[[nodiscard]] float min_range() const {
|
||||
return minRange;
|
||||
}
|
||||
int TargetType() const;
|
||||
|
||||
[[nodiscard]] float max_range() const {
|
||||
return maxRange;
|
||||
}
|
||||
int SpellBookType() const;
|
||||
|
||||
[[nodiscard]] string to_link() const {
|
||||
return toLink;
|
||||
}
|
||||
float MinRange() const;
|
||||
|
||||
[[nodiscard]] std::shared_ptr<LSObject> ls_object() const {
|
||||
return lsObject;
|
||||
}
|
||||
float MaxRange() const;
|
||||
|
||||
string ToLink() const;
|
||||
|
||||
private:
|
||||
string name;
|
||||
string description;
|
||||
string tier;
|
||||
int healthCost;
|
||||
int powerCost;
|
||||
int dissonanceCost;
|
||||
int savageryCost;
|
||||
int concentrationCost;
|
||||
int mainIconID;
|
||||
int hOIconID;
|
||||
float castingTime;
|
||||
float recoveryTime;
|
||||
float recastTime;
|
||||
float maxDuration;
|
||||
int numClasses;
|
||||
int numEffects;
|
||||
//AbilityEffect Effect[#]
|
||||
int backDropIconID;
|
||||
int healthCostPerTick;
|
||||
int powerCostPerTick;
|
||||
int dissonanceCostPerTick;
|
||||
int savageryCostPerTick;
|
||||
int maxAOETargets;
|
||||
bool doesNotExpire;
|
||||
bool groupRestricted;
|
||||
bool allowRaid;
|
||||
bool isBeneficial;
|
||||
float effectRadius;
|
||||
int targetType;
|
||||
int spellBookType;
|
||||
float minRange;
|
||||
float maxRange;
|
||||
string toLink;
|
||||
|
||||
const std::shared_ptr<LSObject> lsObject;
|
||||
};
|
||||
|
||||
|
||||
29
src/isxeq2/EQ2.h
Normal file
29
src/isxeq2/EQ2.h
Normal file
@ -0,0 +1,29 @@
|
||||
//
|
||||
// Created by marob on 12/28/2023.
|
||||
//
|
||||
|
||||
#ifndef EQ2_H
|
||||
#define EQ2_H
|
||||
#include <memory>
|
||||
|
||||
#include "LSObject.h"
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
class EQ2 {
|
||||
public:
|
||||
EQ2(const shared_ptr<LSObject> &obj) : lsObject(obj) {
|
||||
}
|
||||
|
||||
string ServerName() const {
|
||||
return this->lsObject->GetMember("ServerName").CharPtr;
|
||||
}
|
||||
|
||||
private:
|
||||
const shared_ptr<LSObject> lsObject;
|
||||
};
|
||||
|
||||
|
||||
#endif //EQ2_H
|
||||
@ -1,18 +1,28 @@
|
||||
#ifndef EXTENSIONTLOS_H
|
||||
#define EXTENSIONTLOS_H
|
||||
#include <optional>
|
||||
|
||||
#include "Actor.h"
|
||||
#include "Character.h"
|
||||
#include "EQ2.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class ExtensionTLOs {
|
||||
public:
|
||||
static Character Me() {
|
||||
const auto me = pISInterface->IsTopLevelObject("Me");
|
||||
return Character(GetTopLevelObject("Me"));
|
||||
}
|
||||
|
||||
static EQ2 EQ2() {
|
||||
return EQ2::EQ2(GetTopLevelObject("EQ2"));
|
||||
}
|
||||
|
||||
private:
|
||||
static shared_ptr<LSObject> GetTopLevelObject(const string &name) {
|
||||
const auto topLevelObject = pISInterface->IsTopLevelObject(name.c_str());
|
||||
LSOBJECT response;
|
||||
me(0, nullptr, response);
|
||||
const auto characterObject = make_shared<LSObject>(LSObject(response));
|
||||
return Character(characterObject);
|
||||
topLevelObject(0, nullptr, response);
|
||||
return make_shared<LSObject>(LSObject(response));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user