- Joined
- Oct 2, 2010
- Messages
- 1,758
- Reaction score
- 227
Code:
#define MAX_AFFECT 16 // limite de buffs, para usarem mais de 16 devem modificar o cliente tbm
//struct dos novos buffs
struct st_NewBuffs
{
struct
{
WORD Index;
WORD Master;
WORD Value;
WORD Time;
} Affects[MAX_AFFECT];
};
extern st_NewBuffs NewSkillBuffer[30000]; // Buffer para alocar as novas skills.
//zera o buffer, e altera os addrs necessarios.
void InitSkills()
{
// Zera Variaveis
for(int i = 0; i < 30000; i++)
{
for(int j = 0; j < MAX_AFFECT; j++)
{
NewSkillBuffer[i].Affects[j].Index = 0;
NewSkillBuffer[i].Affects[j].Master = 0;
NewSkillBuffer[i].Affects[j].Value = 0;
NewSkillBuffer[i].Affects[j].Time = 0;
}
}
// altera as checagens necessarias
*(BYTE*)0x0406FB6 = MAX_AFFECT; // BASE_GetCurrentScore
*(BYTE*)0x041AB1D = MAX_AFFECT; // GetEmptyAffect
*(BYTE*)0x041AB55 = MAX_AFFECT; // GetEmptyAffect
*(BYTE*)0x04260E6 = MAX_AFFECT;
*(BYTE*)0x04505EE = MAX_AFFECT; // ProcessAffect
*(BYTE*)0x0461CEB = MAX_AFFECT; // DoRemoveHide
*(BYTE*)0x0461FCA = MAX_AFFECT; // SetAffect
*(BYTE*)0x046226A = MAX_AFFECT; // SetTick
//Hooks Limite de Buffs
//0x41AB2C
*(DWORD*)0x41AB25 = 8 * MAX_AFFECT;
*(DWORD*)0x41AB30 = (int)NewSkillBuffer; // Index
*(DWORD*)0x41AB5D = 8 * MAX_AFFECT;
*(DWORD*)0x41AB68 = (int)NewSkillBuffer; // Index
//0x41C8B5
*(DWORD*)0x41C8B1 = 8 * MAX_AFFECT;
*(DWORD*)0x41C8B7 = (int)NewSkillBuffer; // Index
//0x41CDAE
*(DWORD*)0x41CDAA = 8 * MAX_AFFECT;
*(DWORD*)0x41CDB0 = (int)NewSkillBuffer; // Index
//0x4260FF
*(DWORD*)0x4260F5 = 8 * MAX_AFFECT;
*(DWORD*)0x426103 = (int)NewSkillBuffer; // Index
*(DWORD*)0x426154 = 8 * MAX_AFFECT;
*(DWORD*)0x426162 = (int)NewSkillBuffer; // Index
//0x426881
*(DWORD*)0x42687D = 8 * MAX_AFFECT;
*(DWORD*)0x426884 = (int)NewSkillBuffer; // Index
*(DWORD*)0x426892 = 8 * MAX_AFFECT;
*(DWORD*)0x426899 = (int)NewSkillBuffer + 2; // Master
*(DWORD*)0x4268A7 = 8 * MAX_AFFECT;
*(DWORD*)0x4268AE = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x4268BC = 8 * MAX_AFFECT;
*(DWORD*)0x4268C3 = (int)NewSkillBuffer + 6; // Time
//0x44141F
*(DWORD*)0x44141B = 8 * MAX_AFFECT;
*(DWORD*)0x441421 = (int)NewSkillBuffer; // Index
//0x44643B
*(DWORD*)0x446437 = 8 * MAX_AFFECT;
*(DWORD*)0x44643D = (int)NewSkillBuffer; // Index
//0x446A74
*(DWORD*)0x446A70 = 8 * MAX_AFFECT;
*(DWORD*)0x446A77 = (int)NewSkillBuffer; // Index
*(DWORD*)0x446A82 = 8 * MAX_AFFECT;
*(DWORD*)0x446A89 = (int)NewSkillBuffer + 2; // Master
*(DWORD*)0x446A94 = 8 * MAX_AFFECT;
*(DWORD*)0x446A9B = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x446AA6 = 8 * MAX_AFFECT;
*(DWORD*)0x446AAD = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x446AC4 = 8 * MAX_AFFECT;
*(DWORD*)0x446ACB = (int)NewSkillBuffer + 6; // Time
//0x447135
*(DWORD*)0x447131 = 8 * MAX_AFFECT;
*(DWORD*)0x447137 = (int)NewSkillBuffer; // Index
//0x447A06
*(DWORD*)0x447A02 = 8 * MAX_AFFECT;
*(DWORD*)0x447A07 = (int)NewSkillBuffer; // Index
//0x44826F
*(DWORD*)0x44826B = 8 * MAX_AFFECT;
*(DWORD*)0x448271 = (int)NewSkillBuffer; // Index
//0x44DAC5
*(DWORD*)0x44DAC1 = 8 * MAX_AFFECT;
*(DWORD*)0x44DAC7 = (int)NewSkillBuffer; // Index
//0x450601
*(DWORD*)0x4505FA = 8 * MAX_AFFECT;
*(DWORD*)0x450605 = (int)NewSkillBuffer; // Index
*(DWORD*)0x45063F = 8 * MAX_AFFECT;
*(DWORD*)0x45064A = (int)NewSkillBuffer + 2; // Master
*(DWORD*)0x450656 = 8 * MAX_AFFECT;
*(DWORD*)0x450661 = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x4523ED = 8 * MAX_AFFECT;
*(DWORD*)0x4523F8 = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x452408 = 8 * MAX_AFFECT;
*(DWORD*)0x452413 = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x452420 = 8 * MAX_AFFECT;
*(DWORD*)0x45242B = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x452434 = 8 * MAX_AFFECT;
*(DWORD*)0x45243F = (int)NewSkillBuffer + 6; // Time
//0x452453
*(DWORD*)0x45244C = 8 * MAX_AFFECT;
*(DWORD*)0x452457 = (int)NewSkillBuffer; // Index
//0x452473
*(DWORD*)0x45246C = 8 * MAX_AFFECT;
*(DWORD*)0x452477 = (int)NewSkillBuffer; // Index
*(DWORD*)0x452482 = 8 * MAX_AFFECT;
*(DWORD*)0x45248D = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x452498 = 8 * MAX_AFFECT;
*(DWORD*)0x4524A3 = (int)NewSkillBuffer + 2; // Master
//0x461CFA
*(DWORD*)0x461CF3 = 8 * MAX_AFFECT;
*(DWORD*)0x461CFE = (int)NewSkillBuffer; // Index
*(DWORD*)0x461D0C = 8 * MAX_AFFECT;
*(DWORD*)0x461D17 = (int)NewSkillBuffer; // Index
//0x461FDD
*(DWORD*)0x461FD6 = 8 * MAX_AFFECT;
*(DWORD*)0x461FE1 = (int)NewSkillBuffer; // Index
*(DWORD*)0x461FED = 8 * MAX_AFFECT;
*(DWORD*)0x461FFC = (int)NewSkillBuffer; // Index
*(DWORD*)0x46200B = 8 * MAX_AFFECT;
*(DWORD*)0x46201D = (int)NewSkillBuffer + 2; // Master
*(DWORD*)0x462049 = 8 * MAX_AFFECT;
*(DWORD*)0x462054 = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x462062 = 8 * MAX_AFFECT;
*(DWORD*)0x462071 = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x46207C = 8 * MAX_AFFECT;
*(DWORD*)0x46208B = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x46209C = 8 * MAX_AFFECT;
*(DWORD*)0x4620A7 = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x4620B5 = 8 * MAX_AFFECT;
*(DWORD*)0x4620C4 = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x4620CF = 8 * MAX_AFFECT;
*(DWORD*)0x4620DE = (int)NewSkillBuffer + 4; // Value
*(DWORD*)0x4620F0 = 8 * MAX_AFFECT;
*(DWORD*)0x4620FB = (int)NewSkillBuffer + 6; // Time
//0x462281
*(DWORD*)0x462276 = 8 * MAX_AFFECT;
*(DWORD*)0x462285 = (int)NewSkillBuffer; // Index
*(DWORD*)0x462294 = 8 * MAX_AFFECT;
*(DWORD*)0x4622A6 = (int)NewSkillBuffer + 2; // Master
*(DWORD*)0x4622C7 = 8 * MAX_AFFECT;
*(DWORD*)0x4622D2 = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x4622E4 = 8 * MAX_AFFECT;
*(DWORD*)0x4622EF = (int)NewSkillBuffer + 6; // Time
*(DWORD*)0x4622FA = 8 * MAX_AFFECT;
*(DWORD*)0x462309 = (int)NewSkillBuffer + 4; // Value
JMP_NEAR(0x41ABD8, NKD_Buff1, 4);
JMP_NEAR(0x44D8F8, NKD_Buff2, 4);
JMP_NEAR(0x410EF7, NKD_Buff3, 5);
JMP_NEAR(0x412543, NKD_Buff4, 4);
}
__declspec(naked) void NKD_Buff1() // 0x41ABD8 nop 4
{
static int clientid;
__asm MOV EAX, DWORD PTR SS:[EBP + 0x8]
__asm MOV clientid, EAX
for(int i = 0; i < MAX_AFFECT; i++)
{
static int SkillID;
SkillID = NewSkillBuffer[clientid].Affects[i].Index;
if(SkillID == 28)
{
__asm MOV EAX, 1
__asm MOV jmp_address, 0x41AC31
__asm JMP jmp_address
}
else
{
__asm XOR EAX, EAX
__asm MOV jmp_address, 0x41AC35
__asm JMP jmp_address
}
}
}
__declspec(naked) void NKD_Buff2() // 0x44D8F8 nop 4
{
static int clientid;
__asm MOV EAX, DWORD PTR SS:[EBP - 0xC]
__asm MOV clientid, EAX
for(int i = 0; i < MAX_AFFECT; i++)
{
static int SkillID;
SkillID = NewSkillBuffer[clientid].Affects[i].Index;
SkillID = 0;
__asm MOV jmp_address, 0x44D940
__asm JMP jmp_address
}
}
__declspec(naked) void NKD_Buff3() // 0x410EF7 nop 5
{
static char *name;
__asm MOV EAX, DWORD PTR SS:[EBP - 0x4]
__asm MOV name, EAX
static int clientid;
clientid = GetUserByName(name);
static int SkillID;
SkillID = NewSkillBuffer[clientid].Affects[0].Index;
__asm MOV ECX, SkillID
__asm MOV jmp_address, 0x410F01
__asm JMP jmp_address
}
__declspec(naked) void NKD_Buff4() // 0x412543 nop 4
{
static char *name;
__asm MOV EDX, DWORD PTR SS:[EBP - 0x4]
__asm MOV name, EDX
static int clientid;
clientid = GetUserByName(name);
static int SkillID;
SkillID = (int)NewSkillBuffer[clientid].Affects;
__asm MOV EDX, SkillID
__asm MOV jmp_address, 0x41254C
__asm JMP jmp_address
}
typedef struct
{
unsigned char Index;
unsigned char Master;
unsigned short Value;
int Time;
} p_Affect;
typedef struct
{
PacketHeader Header;
p_Affect Affect[16];
} pCL_3B9;
void SendAffect(int clientId)
{
pCL_3B9 pack_3B9 = *(pCL_3B9*)malloc(sizeof(pCL_3B9));
pack_3B9.Header.Code = 0x3B9;
pack_3B9.Header.Size = 140;
pack_3B9.Header.Index = clientId;
st_Mob *_mob = (st_Mob*)GetMobFromIndex(clientId);
memset(&pack_3B9.Affect[0], 0x0, 140 - 12);
for(short i = 0; i < MAX_AFFECT && _mob != NULL; i++)
{
if(NewSkillBuffer[clientId].Affects[i].Time != 0)
{
pack_3B9.Affect[i + 1].Index = (BYTE)NewSkillBuffer[clientId].Affects[i].Index;
pack_3B9.Affect[i + 1].Master = (BYTE)NewSkillBuffer[clientId].Affects[i].Master;
pack_3B9.Affect[i + 1].Value = NewSkillBuffer[clientId].Affects[i].Value;
pack_3B9.Affect[i + 1].Time = (DWORD)NewSkillBuffer[clientId].Affects[i].Time;
}
}
SendPacket((BYTE*)&pack_3B9, clientId, 140);
free(&pack_3B9);
}
Credits: nieen12
Last edited: