rodecomp/Source/Contents/Skills/SkillTreeScript.cpp
ragnarok-clanker 83ea3de051 Decompile 18 functions in Source/Client/Session.h, Source/Contents/Messenger/MessengerMember.h, ...
Batch #13823 by eAthena: 17 byte-identical, 1 confirmed by peer review.

- fn_05622 EquipmentProperties::CEquipment::CallOnStartEquip: byte-identical
- fn_06190 EquipmentProperties::CEquipmentPropertiesMgr::HasUnknown0194: byte-identical
- fn_05925 CLuaInstance::GetFieldUIntArray: logic confirmed by peer review
- fn_23454 CSession::PartyByName: byte-identical
- fn_23452 CSession::PartyByAccount: byte-identical
- fn_23455 CSession::PartyAt: byte-identical
- fn_23372 CSession::FriendAt: byte-identical
- fn_23832 CSession::FindGroupedSkill: byte-identical
- fn_17262 UIWindowMgr::RetireTransientWindow: byte-identical
- fn_07695 MessengerMember::MessengerMember: byte-identical
- fn_07696 MessengerMember::MessengerMember: byte-identical
- fn_23835 CSession::InheritedJob: byte-identical
- fn_23803 CSession::GetWeaponName: byte-identical
- fn_23839 CSession::GetWeaponEffectSprName: byte-identical
- fn_23840 CSession::GetWeaponSprName: byte-identical
- fn_23339 CSession::RemoveItem1710: byte-identical
- fn_23300 CSession::GetEquipSlots: byte-identical
- fn_18348 AddNeededSkill: byte-identical

Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-11-06 22:19:59 +00:00

67 lines
2 KiB
C++

#include "Client/Session.h"
#include "Contents/Skills/PlayerSkillBundle.h"
#include "Contents/Skills/SkillTreeScript.h"
extern "C" {
#include <lauxlib.h>
}
#include <cstdint>
#include <cstring>
// OFFSET: 0x00AFEE00
// FUNCTION: fn_18349
int AddSkill(lua_State* state) {
CSkillInfo skill(0);
const double group = luaL_checknumber(state, 1);
const double id = luaL_checknumber(state, 2);
const char* name = luaL_checkstring(state, 3);
const int position = static_cast<int>(luaL_checknumber(state, 4));
const int value = static_cast<int>(luaL_checknumber(state, 5));
const double last = luaL_checknumber(state, 6);
if (std::strcmp(name, "") != 0 && position != -1 && value != -1) {
skill.level = 0;
skill.unknown_0014 = 0;
skill.unknown_001C = 0;
skill.unknown_0018 = 0;
skill.available = 1;
skill.name = name;
skill.unknown_0024 = position;
skill.unknown_0028 = value;
skill.id = static_cast<std::uint32_t>(static_cast<int>(id));
skill.unknown_0034 = 0;
skill.unknown_002C = static_cast<int>(last);
g_session.m_skillBundle.AddGrouped(static_cast<int>(group), skill);
}
return 1;
}
// OFFSET: 0x00AFED50
// FUNCTION: fn_18348
int AddNeededSkill(lua_State* state) {
const int id = static_cast<int>(luaL_checknumber(state, 1));
const int needed = static_cast<int>(luaL_checknumber(state, 2));
const int level = static_cast<int>(luaL_checknumber(state, 3));
if (id != -1 && needed != -1 && level != -1) {
CSkillInfo* skill = g_session.FindGroupedSkill(static_cast<std::uint32_t>(id));
if (skill && skill->available) {
skill->entries.push_back({static_cast<std::uint32_t>(needed), static_cast<std::uint32_t>(level)});
}
}
return 1;
}
// INLINED
void RegisterSkillTreeCallbacks(lua_State* state, CPlayerSkillBundle& bundle) {
lua_pushlightuserdata(state, &bundle);
lua_pushcclosure(state, AddSkill, 1);
lua_setglobal(state, "c_AddSkillList");
lua_pushlightuserdata(state, &bundle);
lua_pushcclosure(state, AddNeededSkill, 1);
lua_setglobal(state, "c_AddNeedSkillList");
}