-
Member
Originally Posted by
Robske
GetPosition 5
GetFacing 6
GetName 28
Does anyone have any more virtual functions they know about?
-
Swim and Fish
Code:
0x00609DA4 //JMP 00609DE3 [0xEB, 0x3D]
Last edited by DarkLinux; 12-03-2016 at 12:40 AM.
-
Post Thanks / Like - 3 Thanks
-
-
Post Thanks / Like - 3 Thanks
-
-
I patched something but still cant get mining to work. I think its b/c its a spell and the server has a check.
Also cant get cast and moving to work, I patched one thing but it allows you to move a little b4 it stops you. Anyone have any tips?
Last edited by DarkLinux; 11-23-2016 at 01:09 AM.
-
Post Thanks / Like - 2 Thanks
-
Originally Posted by
DarkLinux
I patched something but still cant get mining to work. I think its b/c its a spell and the server has a check.
Also cant get cast and moving to work, I patched one thing but it allows you to move a little b4 it stops you. Anyone have any tips?
Before digging to far into the client, I would sniff incoming packets to make sure it's not the server cancelling the spell cast. If it is, no amount of client patching is likely to help.
-
Post Thanks / Like - 2 Thanks
-
Contributor
Originally Posted by
DarkLinux
Also cant get cast and moving to work, I patched one thing but it allows you to move a little b4 it stops you.
Maybe this server check is responsible
Code:
// check if the player caster has moved before the spell finished (exclude casting on vehicles)
if (!m_caster->GetVehicle() && (m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) &&
(m_castPositionX != m_caster->GetPositionX() || m_castPositionY != m_caster->GetPositionY() || m_castPositionZ != m_caster->GetPositionZ()) &&
(m_spellInfo->Effect[EFFECT_INDEX_0] != SPELL_EFFECT_STUCK || !((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLINGFAR)))
{
// always cancel for channeled spells
if( m_spellState == SPELL_STATE_CASTING )
cancel();
// don't cancel for melee, autorepeat, triggered and instant spells
else if(!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !m_IsTriggeredSpell && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT))
cancel();
}
Source
Edit: Oups, it seems i posted at the same time with Namreeb. I would stick with his advices, he is a way clever than me.
Last edited by tutrakan; 11-23-2016 at 02:36 AM.
-
Post Thanks / Like - 2 Thanks
-
Does anyone know how to get the last valid cast time? I found an address and traced it back down but I think its UI related and I cant work my way back up. Or is there a better way of checking if your cast has been interrupted / delayed.
Code:
struct size 0xA4
array size 0x4 ?
00BC83A8 [] -> 0x90 -> 0x140 -> 0x20 (last updated)
-> 0x004 -> string (Interface\Cooldown\star4.blp)
-> 0x124 -> vtable
-> 0x154 -> previous
-> 0x158 -> next
The timer is accessed by 00594D96.
edit---
odd b/c I dont see anything like "Interface\Cooldown\star4.blp"
dump 1 Textures\Minimap\19fef36b8911de4c2730865da81d9b54.blp 2 Textures\Minimap\aa0d - Pastebin.com
Code:
for (int i = 0; i < 4; i++)
{
DWORD _address = *(DWORD*)(0xBC83A8 + 0x90 + (i * 0xA4));
int counter = 0;
while (_address && (_address & 1) == 0)
{
counter++;
char _str[256] = { 0 };
memcpy(_str, (PVOID)(_address + 0xC), 250);
printf("%d %s\n", counter, _str);
_address = *(DWORD*)(_address + 0x158);
}
}
Last edited by DarkLinux; 11-30-2016 at 12:04 AM.
-
Originally Posted by
DarkLinux
Does anyone know how to get the last valid cast time? I found an address and traced it back down but I think its UI related and I cant work my way back up. Or is there a better way of checking if your cast has been interrupted / delayed.
Code:
struct size 0xA4
array size 0x4 ?
00BC83A8 [] -> 0x90 -> 0x140 -> 0x20 (last updated)
-> 0x158 -> next ?
Does "valid cast time" mean you want the time the current cast already took?
I should have something for this. I will post it later when at home.
Last edited by Corthezz; 11-29-2016 at 04:20 AM.
Check my blog: https://zzuks.blogspot.com
-
The value I am looking at updates when the cast is complete. I see one timer constantly updating, when a spell completes that timer updates the value. My idea was to read the 1 timer at the start of the cast and then compare until it was updated. I guess I could just check 0xCECA88 every frame and create my own timer. My problem is that I'm getting kicked, its not stopping my spell just setting the time back.
--edit
Using 0xCECA88 to solve my problem
Also found a fix for AttackTarget() as it was a toggle and I could not find that state.
Code:
void AutoAttackGUID(__int64 GUID)
{
*(__int64*)((DWORD)this + 0xC48) = GUID;
}
void StopAutoAttacking()
{
*(__int64*)((DWORD)this + 0xC48) = 0;
}
--edit
AutoAttackGUID does not look to work all the time but is a good state check
Code:
__int64 GetAutoAttackGUID()
{
return *(__int64*)((DWORD)this + 0xC48);
}
....
if (!m_LocalPlayer->GetAttackGUID())
{
WoWClass::DoString("AttackTarget()");
}
Last edited by DarkLinux; 12-01-2016 at 03:01 AM.
-
Contributor
Originally Posted by
DarkLinux
Does anyone know how to get the last valid cast time? I found an address and traced it back down but I think its UI related and I cant work my way back up. Or is there a better way of checking if your cast has been interrupted / delayed.
You can always detour these (see the SpellHandlersInitializer() at 006E7150 for the full list):
Code:
int __fastcall SMSG_SpellStartSpellGoHandler(int param, int opcode, int time, int dataStore) at 006E7640,
int __fastcall SMSG_SpellGoHandler(int pItemOrCasterGuid, int pCasterGuid, int spellid, int datastore) at 006E7A70,
int __fastcall SMSG_SPELL_DELAYEDHandler(int param, int opcode, int time, CDataStore *a2) at 006E74F0, ... etc.
Here is an example of implementation server side for spell handlers.
Last edited by tutrakan; 11-30-2016 at 12:41 PM.
-
Post Thanks / Like - 1 Thanks
DarkLinux (1 members gave Thanks to tutrakan for this useful post)
-
Member
Does anyone know how to set the namestring of a player?
I'd like to add a new line after the guild string. I was able to do it manually via a debugger, but I'd like to know if I can call a function to change it from my code.
-
Must be a better way of get cast time, spell rank and distance. Or am I missing something key to this madness? Or is this just display info, and the real info is stored in a different place?
Code:
class CSpellInfo
{
public:
__int32 m_SpellID; //0x0000
char m_0x0004[68];
__int32 m_CastTimeType; //0x0048
__int32 m_CoolDown; //0x004C
__int32 m_CoolDown1; //0x0050
char m_0x0054[44];
__int32 m_Cost; //0x0080
char m_0x0084[12];
__int32 m_DistnaceType; //0x0090
char m_0x0094[332];
char* m_SpellName; //0x01E0
char m_0x01E4[32];
char* m_SpellRank; //0x0204
char m_0x0208[172];
};//Size=0x02B4
static CSpellInfo* GetSpellObjectByIndex(int index, bool isPet = false)
{
DWORD spellID = *(DWORD*)(isPet ? 0x0B6F098 : 0x00B700F0 + (index * 4));
if (spellID)
{
DWORD SpellList = *(DWORD*)(0x00C0D788);
if (SpellList)
{
DWORD SpellObject = *(DWORD*)(SpellList + (spellID * 4));
if (SpellObject)
{
return (CSpellInfo*)SpellObject;
}
}
}
return NULL;
}
m_DistnaceType
2 = 5 yd range
3 = 20 yd range
4 = 30 yd range
5 = 40 yd range
6 = 100 yd range
7 = 10 yd range
8 = 10-20 yd range
9 = 10-30 yd range
10 = 10-40 yd range
11 = 15 yd range
12 = 5 yd range
13 = 50000 yd range
14 = 60 yd range
34 = 25 yd
35 = 35 yd
36 = 45 yd
37 = 50 yd
38 = 10-25 yd range
38 = 10-25 yd range
54 = 5-30 yd range
74 = 8-30 yd range
94 = 8-40 yd range
95 = 8-25 yd range
96 = 2 yd range
114 = 8-35 yd range
134 = 80 yd range
135 = 100 yd range
136 = 30-80 yd range
m_CastTimeType
0 = instant cast
1 = instant cast
2 = 0.25
3 = 0.50
4 = 1sec
5 = 2sec
6 = 5sec
7 = 10sec
8 = 20sec
9 = 30sec
10 = 7sec
11 = 8sec
12 = 11sec
13 = 1.5min
14 = 3sec
15 = 4sec
16 = 1.5sec
17 = instant cast
18 = instant cast
19 = 2.5sec
20 = 2.5sec
21 = 2.6sec
22 = 3.5sec
23 = 1.8sec
24 = 2.2sec
25 = 2.9sec
26 = 3.7sec
27 = 4.1sec
28 = 3.2sec
29 = 4.7sec
30 = 4.5sec
...
70 = 5min
90 = 1.7sec
91 = 2.8sec
Last edited by DarkLinux; 12-04-2016 at 05:27 AM.
-
Corporal
Originally Posted by
DarkLinux
Must be a better way of get cast time, spell rank and distance. Or am I missing something key to this madness? Or is this just display info, and the real info is stored in a different place?
Code:
class CSpellInfo
{
public:
__int32 m_SpellID; //0x0000
char m_0x0004[68];
__int32 m_CastTimeType; //0x0048
__int32 m_CoolDown; //0x004C
__int32 m_CoolDown1; //0x0050
char m_0x0054[44];
__int32 m_Cost; //0x0080
char m_0x0084[12];
__int32 m_DistnaceType; //0x0090
char m_0x0094[332];
char* m_SpellName; //0x01E0
char m_0x01E4[32];
char* m_SpellRank; //0x0204
char m_0x0208[172];
};//Size=0x02B4
static CSpellInfo* GetSpellObjectByIndex(int index, bool isPet = false)
{
DWORD spellID = *(DWORD*)(isPet ? 0x0B6F098 : 0x00B700F0 + (index * 4));
if (spellID)
{
DWORD SpellList = *(DWORD*)(0x00C0D788);
if (SpellList)
{
DWORD SpellObject = *(DWORD*)(SpellList + (spellID * 4));
if (SpellObject)
{
return (CSpellInfo*)SpellObject;
}
}
}
return NULL;
}
To me those simply looks like DBC row ?
-
Post Thanks / Like - 1 Thanks
DarkLinux (1 members gave Thanks to NotJuJuBoSc for this useful post)
-
Contributor
Originally Posted by
DarkLinux
Must be a better way of get cast time, spell rank and distance. Or am I missing something key to this madness? Or is this just display info, and the real info is stored in a different place?
The spell rank you get from the spellinfo structure, the cast time (i think this one was posted already) and range from here:
Code:
public delegate bool GetSpellCooldownDelegate(int spellId, bool isPet, ref int duration, ref int start, ref bool isEnabled) at 0x006E2EA0 (fastcall);
public delegate void GetSpellRangeDelegate(uint player_pointer, int spellid, ref float minrange, ref float maxrange, int zero = 0); at 0x006E3480(fastcall)
In fact the struct you posted is the spell info from the dbc:
Code:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct SpellRecord
{
public uint Id; //0
public uint School; //1
public uint Category; //2
public uint CastUI; //3 not used
public uint Dispel; //4
public uint Mechanic; //5
public uint Attributes; //6
public uint AttributesEx; //7
public uint AttributesEx2; //8
public uint AttributesEx3; //9
public uint AttributesEx4; //10
public uint Stances; //11
public uint StancesNot; //12
public uint Targets; //13
public uint TargetCreatureType; //14
public uint RequiresSpellFocus; //15
public uint CasterAuraState; //16
public uint TargetAuraState; //17
public uint CastingTimeIndex; //18
public uint RecoveryTime; //19
public uint CategoryRecoveryTime; //20
public uint InterruptFlags; //21
public uint AuraInterruptFlags; //22
public uint ChannelInterruptFlags; //23
public uint procFlags; //24
public uint procChance; //25
public uint procCharges; //26
public uint maxLevel; //27
public uint baseLevel; //28
public uint spellLevel; //29
public uint DurationIndex; //30
public int powerType; //31
public uint manaCost; //32
public uint manaCostPerlevel; //33
public uint manaPerSecond; //34
public uint manaPerSecondPerLevel; //35
public uint rangeIndex; //36
public float speed; //37
public uint modalNextSpell; //38
public uint StackAmount; //39
public fixed uint Totem[2]; //40-41
public fixed int Reagent[8]; //42-49
public fixed uint ReagentCount[8]; //50-57
public int EquippedItemClass; //58 (value)
public int EquippedItemSubClassMask; //59 (mask)
public int EquippedItemInventoryTypeMask; //60 (mask)
public fixed int Effect[3]; //61-63
public fixed uint EffectDieSides[3]; //64-66
public fixed int EffectBaceDice[3]; //67-69
public fixed float EffectDicePerLevel[3]; //70-72
public fixed float EffectRealPointsPerLevel[3]; //73-75
public fixed int EffectBasePoints[3]; //76-78
public fixed uint EffectMechanic[3]; //79-81
public fixed uint EffectImplicitTargetA[3]; //82-84
public fixed uint EffectImplicitTargetB[3]; //85-87
public fixed uint EffectRadiusIndex[3]; //88-90
public fixed uint EffectApplyAuraName[3]; //91-93
public fixed uint EffectAmplitude[3]; //94-96
public fixed float EffectMultipleValue[3]; //97-99
public fixed uint EffectChainTarget[3]; //100-102
public fixed uint EffectItemType[3]; //103-105
public fixed int EffectMiscValue[3]; //106-108
public fixed uint EffectTriggerSpell[3]; //109-111
public fixed float EffectPointsPerComboPoint[3]; //112-114
public uint SpellVisual; //115
public uint SpellVisual2; //116 not used
public uint SpellIconID; //117
public uint activeIconID; //118
public uint spellPriority; //119
[MarshalAs(UnmanagedType.LPStr)] public string SpellName; //120
public fixed uint SpellNameTrash[7]; //121-127
public uint SpellNameFlag; //128
[MarshalAs(UnmanagedType.LPStr)] public string Rank; //129
public fixed uint RankTrash[7]; //129-136
public uint RankFlags; //137
[MarshalAs(UnmanagedType.LPStr)] public string Description; //138
public fixed uint DescriptionTrash[7]; //139-145
public uint DescriptionFlags; //146
[MarshalAs(UnmanagedType.LPStr)] public string ToolTip; //147
public fixed uint ToolTipTrash[7]; //148-154
public uint ToolTipFlags; //155 not used
public uint ManaCostPercentage; // 156
public uint StartRecoveryCategory; // 157
public uint StartRecoveryTime; // 158
public uint MaxTargetLevel; // 159
public uint SpellFamilyName; // 160
public ulong SpellFamilyFlags; // 161+162
public uint MaxAffectedTargets; // 163
public uint DmgClass; // 164 defenseType
public uint PreventionType; // 165
public uint StanceBarOrder; // 166 not used
public fixed float DmgMultiplier[3]; // 167-169
public uint MinFactionId; // 170 not used, and 0 in 2.4.2
public uint MinReputation; // 171 not used, and 0 in 2.4.2
public uint RequiredAuraVision; // 172 not used
};
Last edited by tutrakan; 12-04-2016 at 03:52 PM.
-
Post Thanks / Like - 1 Thanks
DarkLinux (1 members gave Thanks to tutrakan for this useful post)