Code:
#define NODE_NAMESTRUCT_POINTER_OFFSET 0x1BC
enum eNodeNameStructFields {
NAMESTRUCT_NAME_PTR = 0xB4,
NAMESTRUCT_ENTRY_ID = 0xC4,
NAMESTRUCT_LockIndex = 0x14, // 0x15C for mining objects!
};
// thanks @TOM_RUS for the below!
enum LockKeyType
{
LOCK_KEY_NONE = 0,
LOCK_KEY_ITEM = 1,
LOCK_KEY_SKILL = 2
};
enum LockType
{
LOCKTYPE_PICKLOCK = 1,
LOCKTYPE_HERBALISM = 2,
LOCKTYPE_MINING = 3,
LOCKTYPE_DISARM_TRAP = 4,
LOCKTYPE_OPEN = 5,
LOCKTYPE_TREASURE = 6,
LOCKTYPE_CALCIFIED_ELVEN_GEMS = 7,
LOCKTYPE_CLOSE = 8,
LOCKTYPE_ARM_TRAP = 9,
LOCKTYPE_QUICK_OPEN = 10,
LOCKTYPE_QUICK_CLOSE = 11,
LOCKTYPE_OPEN_TINKERING = 12,
LOCKTYPE_OPEN_KNEELING = 13,
LOCKTYPE_OPEN_ATTACKING = 14,
LOCKTYPE_GAHZRIDIAN = 15,
LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18,
LOCKTYPE_FISHING = 19,
LOCKTYPE_INSCRIPTION = 20,
LOCKTYPE_OPEN_FROM_VEHICLE = 21
};
#define MAX_LOCK_CASE 8
typedef struct LockEntry{
uint32 ID; // 0 m_ID
uint32 Type[MAX_LOCK_CASE]; // 1-8 m_Type see enum LockKeyType
uint32 Index[MAX_LOCK_CASE]; // 9-16 m_Index see enum LockType
uint32 Skill[MAX_LOCK_CASE]; // 17-24 m_Skill skill value/item id etc... depends on LockEntry::Type
//uint32 Action[MAX_LOCK_CASE]; // 25-32 m_Action
} LockEntry;
- (BOOL)isGatherable{
UInt32 cachePtr = 0;
if ( [_memory readMemoryAtAddress: ([self baseAddress] + NODE_NAMESTRUCT_POINTER_OFFSET) Buffer:(Byte *)&cachePtr BufLength:sizeof(cachePtr)] && cachePtr > 0x0 ){
UInt32 index = [_memory readUInt:cachePtr + NAMESTRUCT_LockIndex];
if ( index > 0 ){
LockEntry lock;
if ( [[ClientDBController sharedInstance] getObjectForRow:index withTable:LockDBTable withStruct:&lock withStructSize:sizeof(lock)] ){
// loop through all indexes!
int i = 0;
for ( ; i < MAX_LOCK_CASE; i++ ){
// herbalism
if ( lock.Type[i] == LOCKTYPE_HERBALISM && lock.Skill[i] > 0 ){
if ( [[[ObjController sharedInstance] currentPlayer] getHerbalismLevel] >= lock.Skill[i] ){
return YES;
}
}
// mining
else if ( lock.Type[i] == LOCKTYPE_MINING && lock.Skill[i] > 0 ){
if ( [[[ObjController sharedInstance] currentPlayer] getMiningLevel] >= lock.Skill[i] ){
return YES;
}
}
}
}
}
}
return NO;
}
Here is determining your skill level:
Code:
enum SkillLine{
Frost = 6,
Fire = 8,
Arms = 26,
Combat = 38,
Subtlety = 39,
Swords = 43,
Axes = 44,
Bows = 45,
Guns = 46,
BeastMastery = 50,
HunterSurvival = 51,
Maces = 54,
TwoHandedSwords = 55,
Holy = 56,
ShadowMagic = 78,
Defense = 95,
LanguageCommon = 98,
DwarvenRacial = 101,
LanguageOrcish = 109,
LanguageDwarven = 111,
LanguageDarnassian = 113,
LanguageTaurahe = 115,
DualWield = 118,
TaurenRacial = 124,
OrcRacial = 125,
NightElfRacial = 126,
FirstAid = 129,
FeralCombat = 134,
Staves = 136,
LanguageThalassian = 137,
LanguageDraconic = 138,
LanguageDemonTongue = 139,
LanguageTitan = 140,
LanguageOldTongue = 141,
Survival = 142,
HorseRiding = 148,
WolfRiding = 149,
TigerRiding = 150,
RamRiding = 152,
Swimming = 155,
TwoHandedMaces = 160,
Unarmed = 162,
Marksmanship = 163,
Blacksmithing = 164,
Leatherworking = 165,
Alchemy = 171,
TwoHandedAxes = 172,
Daggers = 173,
Thrown = 176,
Herbalism = 182,
Retribution = 184,
Cooking = 185,
Mining = 186,
PetImp = 188,
PetFelhunter = 189,
Tailoring = 197,
Engineering = 202,
PetSpider = 203,
PetVoidwalker = 204,
PetSuccubus = 205,
PetInfernal = 206,
PetDoomguard = 207,
PetWolf = 208,
PetCat = 209,
PetBear = 210,
PetBoar = 211,
PetCrocolisk = 212,
PetCarrionBird = 213,
PetCrab = 214,
PetGorilla = 215,
PetRaptor = 217,
PetTallstrider = 218,
RacialUndead = 220,
Crossbows = 226,
Wands = 228,
Polearms = 229,
PetScorpid = 236,
Arcane = 237,
PetTurtle = 251,
Assassination = 253,
Fury = 256,
Protection = 257,
Protection2 = 267,
PetGenericHunter = 270,
PlateMail = 293,
LanguageGnomish = 313,
LanguageTroll = 315,
Enchanting = 333,
Demonology = 354,
Affliction = 355,
Fishing = 356,
Enhancement = 373,
ShamanRestoration = 374,
ElementalCombat = 375,
Skinning = 393,
Mail = 413,
Leather = 414,
Cloth = 415,
Shield = 433,
FistWeapons = 473,
RaptorRiding = 533,
MechanostriderPiloting = 553,
UndeadHorsemanship = 554,
Restoration = 573,
Balance = 574,
Destruction = 593,
DruidHoly = 594,
Discipline = 613,
Lockpicking = 633,
PetBat = 653,
PetHyena = 654,
PetBirdofPrey = 655,
PetWindSerpent = 656,
LanguageGutterspeak = 673,
KodoRiding = 713,
RacialTroll = 733,
RacialGnome = 753,
RacialHuman = 754,
Jewelcrafting = 755,
BloodElfRacial = 756,
PetEventRemoteControl = 758,
LanguageDraenei = 759,
DraeneiRacial = 760,
PetFelguard = 761,
Riding = 762,
PetDragonhawk = 763,
PetNetherRay = 764,
PetSporebat = 765,
PetWarpStalker = 766,
PetRavager = 767,
PetSerpent = 768,
Internal = 769,
DkBlood = 770,
DkFrost = 771,
DkUnholy = 772,
Inscription = 773,
PetMoth = 775,
Runeforging = 776,
Mounts = 777,
Companions = 778,
PetExoticChimaera = 780,
PetExoticDevlisaur = 781,
PetGhoul = 782,
PetExoticSilithid = 783,
PetExoticWorm = 784,
PetWasp = 785,
PetExoticRhino = 786,
PetExoticCoreHound = 787,
};
typedef struct PlayerSkillInfo
{
int16_t Id;
int16_t SkillStep;
int16_t Value;
int16_t MaxValue;
int16_t Modifier;
int16_t Bonus;
} PlayerSkillInfo;
- (NSDictionary*)CGPlayer_C__GetSkillIndexById:(int)zeID{
UInt32 playerBase = [self baseAddress];
UInt32 skillPtrBase = 0x0;
[_memory readMemoryAtAddress:playerBase + [[OffsetController sharedInstance] offset:@"PlayerField_Pointer"] Buffer:(Byte *)&skillPtrBase BufLength:sizeof(skillPtrBase)];
int offset = 0, skillInfoOffset = [[OffsetController sharedInstance] offset:@"SkillLineOffset"];
PlayerSkillInfo skillInfo;
do{
// read the struct!
[_memory readMemoryAtAddress:skillPtrBase + offset + skillInfoOffset Buffer:(Byte *)&skillInfo BufLength:sizeof(skillInfo)];
// match? return it!
if ( zeID == skillInfo.Id ){
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:skillInfo.Value], @"Value",
[NSNumber numberWithInt:skillInfo.MaxValue], @"MaxValue", nil];
return [[dict retain] autorelease];
}
offset += 12;
} while ( offset < 0x600 );
return nil;
}