PROGRESS LOG 4/17/2025
Poking at Character Creation right now.
Found these addresses change when selecting a class and match the class value (1 through 16) on the Character Creation screen. (Using CheatEngine)
The two addresses that I found seemed to be a "Selector" and "Final Value", however, they are inconsistent and random.
Digging further into it with Cheat Engine, point scanning the addresses, I can at least conclude two things.
There was a single result from the Selector pointmaps with the offset 0C, which is 011D43D4.
The offset for the Final Value is 00003374, however running scans on this didn't yield any results.
Not sure if coincidence, but the numbers 3374 also match up with 0x3374 DWORD for "Class" in EQData.h
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Experimental
Setting them to 17 has funny effects.
- Can't add or subtract any points.
- Right clicking any attribute buttons will subtract them to 0 and dump the points into "Points Left" - but I can't redistribute them.
Attempting to make a character shows "Missing Expansion" and "Select another Class"
Adding an entry to the Character Combination will validate the point allocation and allow us to redistribute them. (NICE)
Attempting to make a character shows "You cannot create this character because you have not unlocked this class."
So, now we have something in the backend blocking a class unlock. I'll need to dig further.
//eq_packet_structs.h
LINE 6079 - Membership_Entry_Struct membership_classes[16]; (( Setting this to 16 - arrays start at 0 position, so 16 = 17 ))
//rof2_structs.h
LINE 300 - Membership_Entry_Struct membership_classes[16]; (( Setting this to 16 - arrays start at 0 position, so 16 = 17 ))
//client.cpp
LINE 352 - class_entry_count = 16; (again, 16 = 17 because arrays)
LINE 357 - entry_id < 16 for classes (( Split the if statement checks here between race and class ))
Quote:
// RACIAL CHECKS
for (int entry_id=0; entry_id < 15; entry_id++)
{
if (entry_id == 0)
{
mds->membership_races[entry_id].purchase_id = 1;
mds->membership_races[entry_id].bitwise_entry = 0x1ffff;
}
else
{
mds->membership_races[entry_id].purchase_id = cur_purchase_id;
if (entry_id == 1)
{
mds->membership_races[entry_id].bitwise_entry = 4110;
}
else if (entry_id == 2)
{
mds->membership_races[entry_id].bitwise_entry = 4110;
}
else
{
if (entry_id == 12)
{
// Live Skips 4096
cur_bitwise_value *= 2;
}
mds->membership_races[entry_id].bitwise_entry = cur_bitwise_value;
}
cur_purchase_id++;
}
cur_bitwise_value *= 2;
}
// CLASS CHECKS
for (int entry_id = 0; entry_id < 16; entry_id++)
{
if (entry_id == 0)
{
mds->membership_classes[entry_id].purchase_id = 1;
mds->membership_classes[entry_id].bitwise_entry = 0x1ffff;
}
else
{
if (entry_id < 3)
{
mds->membership_classes[entry_id].purchase_id = cur_purchase_id;
}
else
{
mds->membership_classes[entry_id].purchase_id = cur_purchase_id2;
cur_purchase_id2++;
}
if (entry_id == 1)
{
mds->membership_classes[entry_id].bitwise_entry = 4614;
}
else if (entry_id == 2)
{
mds->membership_classes[entry_id].bitwise_entry = 4614;
}
else
{
if (entry_id == 12)
{
// Live Skips 4096
cur_bitwise_value *= 2;
}
mds->membership_classes[entry_id].bitwise_entry = cur_bitwise_value;
}
cur_purchase_id++;
}
cur_bitwise_value *= 2;
}
|
After recompiling, we are no longer crashing from the previous edits, but we're still met with the "Cannot create character because you have not unlocked this class." when setting the class to 17 with Cheat Engine.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Added Starting Items to Class 17