Código:
DWORD IsBowItem = 0;
DWORD IsCrossItem = 0;
DWORD BowValue = 0x09C;
DWORD MaxBoneCount = 0x108;
DWORD WorldPosition = 0x0FC;
DWORD oCreateEffect = 0x00650FF0;
DWORD ReturnBowCode = 0x00699416;
DWORD BowPosition = 0x0059F77C;
DWORD NextBowPosition = 0x0059F7BB;
DWORD ReturnCrossCode = 0x006990E3;
void __declspec(naked) cBowAddSkillEffect()
{
_asm
{
mov edx,dword ptr ss:[ebp-0x8]
mov dword ptr ss:[ebp-0x14],edx
mov IsBowItem,edx
}
// ---
if( IsBowItem == ObjectId(4, 25) ) // Lightning Bow
{
_asm
{
push -1
push 0
push 0
mov dx,word ptr ss:[ebp+0x18]
push edx
mov ax,word ptr ss:[ebp+0x14]
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
mov dx,word ptr ds:[ecx+0x2C]
push edx
mov eax,dword ptr ss:[ebp+0x0C]
push eax
mov ecx,dword ptr ss:[ebp-0x0C]
push ecx
mov edx,dword ptr ss:[ebp+0x0C]
add edx, BowValue
push edx
mov eax,dword ptr ss:[ebp+0x0C]
add eax, MaxBoneCount
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
add ecx, WorldPosition
push ecx
push 324
call oCreateEffect
}
}
else if( IsBowItem == ObjectId(4, 26) ) // Divinity Bow
{
_asm
{
push -1
push 0
push 0
mov dx,word ptr ss:[ebp+0x18]
push edx
mov ax,word ptr ss:[ebp+0x14]
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
mov dx,word ptr ds:[ecx+0x2C]
push edx
mov eax,dword ptr ss:[ebp+0x0C]
push eax
mov ecx,dword ptr ss:[ebp-0x0C]
push ecx
mov edx,dword ptr ss:[ebp+0x0C]
add edx, BowValue
push edx
mov eax,dword ptr ss:[ebp+0x0C]
add eax, MaxBoneCount
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
add ecx, WorldPosition
push ecx
push 321
call oCreateEffect
}
}
else if( IsBowItem == ObjectId(4, 27) ) // Angelic Bow
{
_asm
{
push -1
push 0
push 0
mov dx,word ptr ss:[ebp+0x18]
push edx
mov ax,word ptr ss:[ebp+0x14]
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
mov dx,word ptr ds:[ecx+0x2C]
push edx
mov eax,dword ptr ss:[ebp+0x0C]
push eax
mov ecx,dword ptr ss:[ebp-0x0C]
push ecx
mov edx,dword ptr ss:[ebp+0x0C]
add edx, BowValue
push edx
mov eax,dword ptr ss:[ebp+0x0C]
add eax, MaxBoneCount
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
add ecx, WorldPosition
push ecx
push 297
call oCreateEffect
}
}
else if( IsBowItem == ObjectId(4, 28) ) // Thunder Bow
{
_asm
{
push -1
push 0
push 0
mov dx,word ptr ss:[ebp+0x18]
push edx
mov ax,word ptr ss:[ebp+0x14]
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
mov dx,word ptr ds:[ecx+0x2C]
push edx
mov eax,dword ptr ss:[ebp+0x0C]
push eax
mov ecx,dword ptr ss:[ebp-0x0C]
push ecx
mov edx,dword ptr ss:[ebp+0x0C]
add edx, BowValue
push edx
mov eax,dword ptr ss:[ebp+0x0C]
add eax, MaxBoneCount
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
add ecx, WorldPosition
push ecx
push 266
call oCreateEffect
}
}
_asm
{
jmp ReturnBowCode
}
}
void __declspec(naked) cCrossAddSkillEffect()
{
_asm
{
mov edx,dword ptr ss:[ebp-0x4]
mov dword ptr ss:[ebp-0x10],edx
mov IsCrossItem,edx
}
// ---
if(IsCrossItem == ObjectId(4,129)) // Devil Crossbow
{
_asm
{
push -1
push 0
push 0
mov ax,word ptr ss:[ebp+0x18]
push eax
mov cx,word ptr ss:[ebp+0x14]
push ecx
mov edx,dword ptr ss:[ebp+0x0C]
mov ax,word ptr ds:[edx+0x2C]
push eax
mov ecx,dword ptr ss:[ebp+0x10]
push ecx
push 0
mov edx,dword ptr ss:[ebp+0x0C]
add edx,BowValue
push edx
mov eax,dword ptr ss:[ebp+0x0C]
add eax,MaxBoneCount
push eax
mov ecx,dword ptr ss:[ebp+0x0C]
add ecx,WorldPosition
push ecx
push 321
call oCreateEffect
}
}
// ---
_asm
{
jmp ReturnCrossCode
}
}
void __declspec(naked) cBowAddInventoryPos()
{
_asm
{
mov IsBowItem, esi
}
// ---
if(IsBowItem == 0x0B5A)
{
_asm{jmp BowPosition}
}
else if(IsBowItem == ObjectId(4,25))
{
_asm{jmp BowPosition}
}
else if(IsBowItem == ObjectId(4,26))
{
_asm{jmp BowPosition}
}
else if(IsBowItem == ObjectId(4,27))
{
_asm{jmp BowPosition}
}
else if(IsBowItem == ObjectId(4,28))
{
_asm{jmp BowPosition}
}
else
{
_asm{jmp NextBowPosition}
}
}
DWORD BowAddPlayerDimension_Offset = 0x004E9A12;
void __declspec(naked) cBowAddPlayerDimension()
{
_asm
{
CMP DWORD PTR SS:[EBP+0x1C],0x0B56
JE ReturnLoad
CMP DWORD PTR SS:[EBP+0x1C],ObjectId(4,24)
JE ReturnLoad
CMP DWORD PTR SS:[EBP+0x1C],ObjectId(4,25)
JE ReturnLoad
CMP DWORD PTR SS:[EBP+0x1C],ObjectId(4,26)
JE ReturnLoad
CMP DWORD PTR SS:[EBP+0x1C],ObjectId(4,27)
JE ReturnLoad
CMP DWORD PTR SS:[EBP+0x1C],ObjectId(4,28)
JE ReturnLoad
// ---
ReturnLoad:
// ---
JMP BowAddPlayerDimension_Offset
}
}
void InitBows()
{
Utils.SetRange((LPVOID)iBowAddSkillEffect, 6, ASM::NOP);
Utils.SetJmp((LPVOID)iBowAddSkillEffect, cBowAddSkillEffect);
// ----
Utils.SetRange((LPVOID)iBowAddInventoryPos, 6, ASM::NOP);
Utils.SetJmp((LPVOID)iBowAddInventoryPos, cBowAddInventoryPos);
// ----
Utils.SetRange((LPVOID)iBowAddPlayerDimension, 7, ASM::NOP);
Utils.SetJmp((LPVOID)iBowAddPlayerDimension, cBowAddPlayerDimension);
// ----
Utils.SetRange((LPVOID)iCrossAddSkillEffect, 6, ASM::NOP);
Utils.SetJmp((LPVOID)iCrossAddSkillEffect, cCrossAddSkillEffect);
}