diff --git a/Source/Client/Session.h b/Source/Client/Session.h index c4962d5..95d488c 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -17,6 +17,7 @@ #include class CActRes; +class CRenderObject; class LuaScript; struct ActionFrame; struct WindowDialogs; @@ -291,6 +292,7 @@ public: char* ConvertTooltipText(const char* source, char* output) const; int MercSkillLevel(int skillId) const; int HomunSkillLevel(int skillId) const; + CRenderObject* FindGameActor(std::uint32_t aid) const; int SyncUnknown0E98(); void LoadXmlTables(); std::string GetAccessoryName(int id); diff --git a/Source/Contents/Skills/ClientSkills.cpp b/Source/Contents/Skills/ClientSkills.cpp index 9459ab1..a9f1e7f 100644 --- a/Source/Contents/Skills/ClientSkills.cpp +++ b/Source/Contents/Skills/ClientSkills.cpp @@ -1,9 +1,14 @@ #include "Contents/Skills/ClientSkills.h" +#include "Client/Mode/ActiveGameMode.h" +#include "Client/Mode/CGameMode.h" #include "Client/Session.h" #include "Contents/ClientState.h" #include "Contents/Jobs/JobId.h" #include "Contents/Jobs/JobInheritance.h" +#include "Contents/UserData/CharacterConfigSave.h" +#include "Contents/World/WorldScene.h" #include "Script/LuaScript.h" +#include "UI/Shortcuts/ShortcutBindings.h" #include "UI/Window/UIWindow.h" #include "UI/Window/UIWindowMgr.h" #include "UI/Window/WindowDialogs.h" @@ -667,3 +672,46 @@ float GetSkillFactor(int job) { return 0.82f; } + +// OFFSET: 0x00E084B0 +// FUNCTION: fn_23761 +void ShortcutBindings::ClearAdditionalSkills(const unsigned char& currentRow, LuaScript& script, ModeEvents& modeEvents) { + for (int slot = 0; slot < 36; ++slot) { + const NormalItemSlot& value = this->banks[0][slot]; + if (value.itemId != 0 && value.unknown_0000 != 0 && value.itemId >= 10000 && value.itemId < 10020) { + this->Assign(1, 0, 0, slot, 0, currentRow, script, modeEvents); + } + } + + for (int slot = 0; slot < 36; ++slot) { + const NormalItemSlot& value = this->banks[1][slot]; + if (value.itemId != 0 && value.unknown_0000 != 0 && value.itemId >= 10000 && value.itemId < 10020) { + this->Assign(1, 0, 0, slot, 1, currentRow, script, modeEvents); + } + } +} + +// OFFSET: 0x00E089A0 +// FUNCTION: fn_23768 +int CharacterConfigSave::SkillLevel(int id) const { + if (id - 8000u <= 60u) { + return g_session.HomunSkillLevel(id); + } + + if (id - 8200u <= 41u || id - 8400u <= 57u) { + return g_session.MercSkillLevel(id); + } + + return this->UseLevel(id); +} + +// OFFSET: 0x00E094E0 +// FUNCTION: fn_23778 +CRenderObject* CSession::FindGameActor(std::uint32_t aid) const { + CGameMode* mode = static_cast(g_world.ActiveGameMode()); + if (mode == nullptr) { + return nullptr; + } + + return mode->scene->GetGameActorByAID(aid); +} diff --git a/Source/Contents/UserData/CharacterConfigSave.h b/Source/Contents/UserData/CharacterConfigSave.h index 3303c35..73124ad 100644 --- a/Source/Contents/UserData/CharacterConfigSave.h +++ b/Source/Contents/UserData/CharacterConfigSave.h @@ -23,6 +23,7 @@ struct CharacterConfigSave { const bool& itemSlotActive; int UseLevel(int id) const; + int SkillLevel(int id) const; }; #endif diff --git a/Source/UI/Shortcuts/ShortcutBindings.h b/Source/UI/Shortcuts/ShortcutBindings.h index b3790ea..b9e4ce0 100644 --- a/Source/UI/Shortcuts/ShortcutBindings.h +++ b/Source/UI/Shortcuts/ShortcutBindings.h @@ -23,6 +23,7 @@ struct ShortcutBindings { void Refresh(NormalItemSlot** slots, NormalItemSlot** itemSlots); void Assign(unsigned char type, std::uint32_t id, int level, int slot, int bank, const unsigned char& currentRow, LuaScript& script, ModeEvents& modeEvents); void AssignItem(std::uint32_t id, int slot); + void ClearAdditionalSkills(const unsigned char& currentRow, LuaScript& script, ModeEvents& modeEvents); }; #endif