vipnetpro
19-03-08, 12:05 PM
/add command source code
Credits go consept
Code:
void AddStats(int aIndex)
{
if (!IsAddCmd) return;
cObj->Init(aIndex);
if (!strcmpi(Message, "/add"))
{
MessageOutput(aIndex, "Useage: /add <Type> <Amount>");
MessageOutput(aIndex, "The price for Add is: %d, Maximum stats: %d", AddPrice, AddMax);
return;
}
if (cObj->Money < AddPrice)
{
MessageOutput(aIndex, "You are lacking zen! %d", AddPrice - cObj->Money);
return;
}
char Param1[100];
memset(Param1, 0x00, 100);
GetParam(1, Message, Param1);
int AddType = 0;
if (!strcmpi(Param1, "str")) AddType = 0xB8;
if (!strcmpi(Param1, "agi")) AddType = 0xBA;
if (!strcmpi(Param1, "vit")) AddType = 0xBC;
if (!strcmpi(Param1, "eng")) AddType = 0xBE;
if (!strcmpi(Param1, "cmd")) AddType = 0xD8;
if (!AddType)
{
MessageOutput(aIndex, "You have selected wrong type! The types are: str, agi, vit, eng, cmd");
return;
}
if (cObj->Class != 4 && AddType == 0xD8)
{
MessageOutput(aIndex, "Only Dark Lords can use the add cmd type.");
return;
}
char Param2[100];
memset(Param2, 0x00, 100);
GetParam(2, Message, Param2);
int StatsToAdd = atoi(Param2);
if (cObj->LvlUpPoints < StatsToAdd)
{
MessageOutput(aIndex, "You are lacking level up points! %d", StatsToAdd - cObj->LvlUpPoints);
return;
}
int NowStats = cObj->GetWord(AddType);
if ((StatsToAdd + NowStats) > AddMax)
{
MessageOutput(aIndex, "You are not allowed to add more than %d points!", AddMax);
return;
}
BYTE Packet[5] = {0xC1, 0x05, 0x0F3, 0x06};
Packet[4] = ((AddType % 16) ^ 8) / 2; // Nice algorithm by coNsept to convert from gObj Offsets to the add types :P
if (AddType == 0xD8) Packet[4] = 0x04;
if (StatsToAdd <= 100)
for (int i=0; i<StatsToAdd; i++)
CGLevelUpPointAdd(Packet, aIndex);
else
{
int Amount = (cObj->LvlUpPoints - StatsToAdd - 1);
cObj->SetInt(0xA4, Amount);
cObj->AddInt(AddType, StatsToAdd - 1);
CGLevelUpPointAdd(Packet, aIndex);
}
cObj->SetInt(0xB4, cObj->Money - AddPrice);
CGMoneySend(aIndex, cObj->Money - AddPrice);
cObj->Init(aIndex);
MessageOutput(aIndex, "You've added %d points. You have now %d points left.", StatsToAdd, cObj->LvlUpPoints);
if (StatsToAdd > 100)
MessageOutput(aIndex, "Please relog and your stats will be updated.");
/post source code by consept
/post source code by consept
Code:
void DataSendAll(unsigned char* Packet, int Length)
{
for (int i=6400; i<7400; i++)
if(gObjIsConnected(i))
DataSend(i, Packet, Length);
}
void SendPost(int wId, LPCSTR Command, LPCSTR Text)
{
if (!IsPost) return;
if (!gObjIsConnected(wId)) return;
if (!strcmpi(Command, "/Post"))
{
MessageOutput(wId, "[%s] Useage: /Post <Msg>.", szPrefix);
MessageOutput(wId, "[%s] Price for post: %d, Minimun Level: %d", szPrefix, PostCost, PostLevel);
return;
}
gObj_SetInfo(wId);
if (gObj.Level < PostLevel)
{
MessageOutput(wId, "[%s] You're level is too low to post!", szPrefix);
return;
}
if (gObj.Money < PostCost)
{
MessageOutput(wId, "[%s] You don't have enough money to post!", szPrefix);
return;
}
BYTE *Packet;
char Message[100];
Packet = (BYTE*) malloc(200);
memset(Packet, 0x00, 200);
*Packet = 0xC1;
*(Packet+2) = 0x00;
memcpy((Packet+3), gObj.Nick, strlen(gObj.Nick));
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
memcpy((Packet+13), Message, strlen(Message));
int Len = (strlen(Message) + 0x13);
*(Packet+1) = Len;
DataSendAll(Packet, Len);
int Amount = (gObj.Money - PostCost);
gObj_Write(wId, gObj_Money, Amount);
MoneySend(wId, Amount);
free (Packet);
PK Clear Guard source code
Credits to consept
Code:
void PKClearGuard(int aIndex)
{
if (!PKClear_Active) return;
if (!gObjIsConnected(aIndex)) return;
lpObj->Init(aIndex);
int Price = PKClear_Price * (lpObj->PKLevel - 3);
if (lpObj->PKLevel < 4)
{
Send->PM(aIndex, "[PK Clear] You are already a commoner!");
return;
}
if (lpObj->Money < Price)
{
Send->PM(aIndex, "[PK Clear] You don't have enough money! Lacking %d.", Price - lpObj->Money);
return;
}
int Amount = lpObj->Money - Price;
lpObj->SetInt(0xB4, Amount);
GCMoneySend(aIndex, Amount);
lpObj->SetInt(0x101, 3);
GCPKLevelSend(aIndex, 3);
Send->PM(aIndex, "[PK Clear] You are a commoner again! %d Zen left.", Amount);
GCFireWorkSend(aIndex, lpObj->PosX, lpObj->PosY, 1);
Part of Protocol Core hook:
Code:
switch (mobObj->Class)
{
case 249:
PKClearGuard(aIndex);
break;
/make command source code
By Cahir
Code:
void UseMakeCommand(DWORD gObjId, char * msg)
{
if(strlen(msg) < 18)
{
return;
}
int spaces = 0;
for(int i=0; i < strlen(msg); i++)
{
if(msg[i] == ' ')
spaces++;
}
if(spaces < 7)
return;
if(IsObjectGM(gObjId) == false)
{
return;
}
char * PosA;
PosA = strchr( msg , ' ' );
char * PosB;
PosB = strchr( PosA+1 , ' ' );
char * PosC;
PosC = strchr( PosB+1 , ' ' );
char * PosD;
PosD = strchr( PosC+1 , ' ' );
int ItemType, ItemNr, ItemLevel;
if(*(PosA+2) != ' ')
{
ItemType = (int)(*(PosA+1) - 48) * 10 + (int)(*(PosA+2) - 48);
}
else
{
ItemType = (*(PosA+1)) - 48;
}
if(*(PosB+2) != ' ')
{
ItemNr = (int)(*(PosB+1) - 48) * 10 + (int)(*(PosB+2) - 48);
}
else
{
ItemNr = (*(PosB+1)) - 48;
}
if(*(PosC+2) != ' ')
{
ItemLevel = (int)(*(PosC+1) - 48) * 10 + (int)(*(PosC+2) - 48);
}
else
{
ItemLevel = (*(PosC+1)) - 48;
}
int ItemSkill = (*(PosD+1)) - 48;
int ItemLuck = (*(PosD+3)) - 48;
int ItemOpt = (*(PosD+5)) - 48;
int ItemExc = (*(PosD+7)) - 48;
DWORD Item = ItemType * 512 + ItemNr;
InvItemCreate ( gObjId , GetObjectMap(gObjId) , GetObjectPosX(gObjId) , GetObjectPosY(gObjId) , Item , ItemLevel , 0 ,ItemSkill , ItemLuck, ItemOpt , -1 , ItemExc , 0 );
GCServerMsgStringSend("[Make]: You have made an item.", gObjId, 1);
Sky Event Source code by Holy
.386
.Model flat, StdCall
Option CaseMap:none
Include \masm32\include\windows.inc
Include \masm32\include\user32.inc
Include \masm32\include\kernel32.inc
Include \masm32\include\masm32.inc
IncludeLib \masm32\lib\user32.lib
IncludeLib \masm32\lib\kernel32.lib
IncludeLib \masm32\lib\masm32.lib
TimePassed Proto :DWord, :DWord, :DWord, :DWord
StartEvent Proto :DWord, :DWord, :DWord, :DWord
Monster Proto :DWord, :DWord, :DWord, :DWord
Monster2 Proto :DWord, :DWord, :DWord, :DWord
Monster3 Proto :DWord, :DWord, :DWord, :DWord
EventOff Proto :DWord, :DWord, :DWord, :DWord
MensajeEvento Proto :DWord, :DWord, :DWord, :DWord
.Const
gObj Equ 658ACA8H
IDC_TIMER Equ 3
IDC_TIMER2 Equ 4
IDC_TIMER3 Equ 5
IDC_TIMER4 Equ 6
IDC_TIMER5 Equ 7
IDC_TIMER6 Equ 8
IDC_TIMER7 Equ 9
AllocSpace Equ 65000H
Buffer Equ 65000H
Buffer2 Equ 65000H
.Data
hMemory HANDLE ?
pMemory DWord ?
DataSend DD 0047DD20H
gObjTeleport DD 004E5E90H
GCServerCMD DD 00448F00H
MessageOutPut DD 004F0A80H
AllUserMsgS DD 00497C70H
MoneySend DD 0042F710H
gObjUserDie DD 004CA64BH
gObjAddMonster DD 004C4850H
gObjSetPosMonster DD 004C2E90H
gObjSetMonster DD 004C32E0H
ItemSerialCreate DD 004245A0H
PlayerIDBuf DB Buffer Dup(0)
PlayerDWSM DB Buffer2 Dup(0)
MensajeBievenida DB "Welcome to Sky Event", 0
TodaviaNoHora DB "Come back at 17:00 for enter Sky Event", 0
MensajeEventito DB "Sky Event has been Opened, you have 10 minutes for enter", 0
LimitePlayers DB "You can´t enter the event is full of players", 0
MensajeEventito1 DB "Sky Event Will Start in 5 Minutes", 0
MensajeEventito2 DB "Sky Event Will Start in 2 Minutes", 0
MensajeEventito3 DB "Sky Event Has Started!! Survive during 30 minutes!!", 0
NivelInsuficiente DB "You need to be at least lvl 50 for enter", 0
NoMoney DB "You need at least 25.000.000 zen for enter", 0
EventoCerrado DB "The event is closed, you can´t enter now.", 0
EventFinish DB "You have survive during 30 minutes! Congratulations!", 0
.Data?
lpLocalTime SYSTEMTIME <>
.Code
DllEntry Proc hInstDLL:HINSTANCE, reason:DWord, reserved1:DWord
Mov Eax, TRUE
Ret
DllEntry EndP
NPCEvent Proc
Local PlayerID:DWord
Local Map:DWord
Local X:DWord
Local Y:DWord
Local lpObj:DWord
Local Counter:DWord
Local MobID:DWord
Local MobLpObj:DWord
Push Ebx
Push Esi
Push Edi
Mov Eax, DWord Ptr Ss:[Ebp + 0CH] ; el lpObj que pusheamos en pChatProc
Mov lpObj, Eax
Mov Edx, DWord Ptr Ds:[Eax]
Mov PlayerID, Edx
Mov Cl, Byte Ptr Ds:[624521H]
Cmp Cl, 1
Je EventClosed
Mov Eax, lpObj
Mov Edx, DWord Ptr Ds:[Eax + 0A0H]
Cmp Edx, 50H
Jge RestarDinero
Lea Ecx, NivelInsuficiente
Push Ecx
Mov Edx, PlayerID
Push Edx
Call MessageOutPut
Jmp Finalizar
EventClosed:
Lea Eax, EventoCerrado
Push Eax
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Jmp Finalizar
NoTienesDinero:
Lea Eax, NoMoney
Push Eax
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Jmp Finalizar
RestarDinero:
Mov Eax, lpObj
Mov Ecx, DWord Ptr Ds:[Eax + 0B4H]
Cmp Ecx, 17D7840H
Jle NoTienesDinero
Sub Ecx, 17D7840H ;;Se le Resta el Dinero 25.000.000
Mov DWord Ptr Ds:[Eax + 0B4H], Ecx
Push Ecx
Mov Eax, PlayerID
Push Eax
Call MoneySend
Mov Map, 0AH ;Lorencia Map
Mov X, 0C8H ; Cord X
Mov Y, 0C8H ; Cord y
Mov Eax, Y
Push Eax
Mov Ecx, X
Push Ecx
Mov Edx, Map
Push Edx
Mov Eax, PlayerID
Push Eax
Call gObjTeleport
Add Esp, 8
Lea Eax, MensajeBievenida ;; Se le da la Bienvenida al Jugador al Entrar
Push Eax
Mov Edx, PlayerID
Push Edx
Call MessageOutPut
Mov Edx, PlayerID
IMul Edx, Edx, 10
Add Edx, pMemory
Mov Byte Ptr Ds:[Edx + 1], 1
Finalizar:
Ret
NPCEvent EndP
Eventime Proc
Mov Eax, DWord Ptr Ds:[0B679164H]
Mov Byte Ptr Ds:[624521H], 1
Invoke SetTimer, Eax, IDC_TIMER, 18000000, Addr TimePassed ;;5 horas
Ret
Eventime EndP
TimePassed Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Lea Eax, MensajeEventito1
Push Eax
Call AllUserMsgS
Invoke KillTimer, NULL, IDC_TIMER
Mov Byte Ptr Ds:[624521H], 0
Invoke SetTimer, NULL, IDC_TIMER6, 300000, Addr MensajeEvento
Ret
TimePassed EndP
MensajeEvento Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Mov Cl, Byte Ptr Ds:[6244D9H]
Cmp Ecx, 1
Je SaltaElMensaje
Lea Eax, MensajeEventito3
Push Eax
Call AllUserMsgS
Mov Byte Ptr Ds:[6244D9H], 1
SaltaElMensaje:
Invoke KillTimer, NULL, IDC_TIMER6
Mov Byte Ptr Ds:[624521H], 1
Call EventMessage
Ret
MensajeEvento EndP
StartEvent Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Edx, DWord Ptr Ds:[0B679164H]
Invoke KillTimer, Edx, IDC_TIMER2
Lea Eax, MensajeEventito3
Push Eax
Call AllUserMsgS
Mov Byte Ptr Ds:[624521H], 1
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 154H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
StartEvent EndP
CheckIds Proc
Local PlayerBaseID:DWord
Mov PlayerBaseID, 1900H
Jmp ComparePlayerBase
PlayerLooper:
Add PlayerBaseID, 1
ComparePlayerBase:
Cmp PlayerBaseID, 1CE8H
Jge EndSending
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Cmp DWord Ptr Ds:[Eax + 658ACACH], 3
Jnz PlayerLooper
Mov Edx, PlayerBaseID
IMul Edx, Edx, 10
Add Edx, pMemory
Mov Cl, Byte Ptr Ds:[Edx + 1]
Cmp Ecx, 1
Jnz PlayerLooper
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Add Eax, gObj
Movsx Edx, Word Ptr Ds:[Eax + 10DH]
Cmp Edx, 0AH
Jnz PlayerLooper
Push 0
Push 0
Mov Edx, PlayerBaseID
Push Edx
Push 0
Push 0
Push 0
Push 0
Push 0
Push 180FH
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Mov Dl, Byte Ptr Ds:[Eax + 658ADAEH]
Push Edx
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Cl, Byte Ptr Ds:[Ecx + 658ADACH]
Push Ecx
Mov Edx, PlayerBaseID
IMul Edx, Edx, 1938H
Xor Eax, Eax
Mov Al, Byte Ptr Ds:[Edx + 658ADB1H]
Push Eax
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Edx, DWord Ptr Ds:[Ecx + 658ACA8H]
Push Edx
Call ItemSerialCreate
Add Esp, 34H
Push 0
Push 0
Mov Edx, PlayerBaseID
Push Edx
Push 0
Push 0
Push 0
Push 0
Push 0
Push 1C0BH
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Mov Dl, Byte Ptr Ds:[Eax + 658ADAEH]
Push Edx
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Cl, Byte Ptr Ds:[Ecx + 658ADACH]
Push Ecx
Mov Edx, PlayerBaseID
IMul Edx, Edx, 1938H
Xor Eax, Eax
Mov Al, Byte Ptr Ds:[Edx + 658ADB1H]
Push Eax
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Edx, DWord Ptr Ds:[Ecx + 658ACA8H]
Push Edx
Call ItemSerialCreate
Add Esp, 34H
Jmp PlayerLooper
EndSending:
Ret
CheckIds EndP
EventOff Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Invoke KillTimer, NULL, IDC_TIMER4
Invoke KillTimer, NULL, IDC_TIMER7
Lea Eax, EventFinish
Push Eax
Call AllUserMsgS
Call CheckIds
Invoke SetTimer, NULL, IDC_TIMER, 18000000, Addr TimePassed
Ret
EventOff EndP
EventMessage Proc
Invoke SetTimer, NULL, IDC_TIMER2, 30000, Addr Monster
Invoke SetTimer, NULL, IDC_TIMER5, 600000, Addr Monster2 ;;Despues de 10 minutos, cambiar monstruos
Invoke SetTimer, NULL, IDC_TIMER4, 1800000, Addr EventOff
Ret
EventMessage EndP
Monster Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 161H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 15EH
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 161H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 15EH
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
Monster EndP
Monster2 Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Invoke KillTimer, NULL, IDC_TIMER2
Invoke KillTimer, NULL, IDC_TIMER5
Invoke SetTimer, NULL, IDC_TIMER7, 30000, Addr Monster3
Ret
Monster2 EndP
Monster3 Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 167H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 169H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 167H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 169H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
Monster3 EndP
NewGObj Proc
Invoke GlobalAlloc, GMEM_MOVEABLE Or GMEM_ZEROINIT, AllocSpace
Mov hMemory, Eax
Invoke GlobalLock, hMemory
Mov pMemory, Eax
Ret
NewGObj EndP
Cái này mình tìm thấy bên RZ thấy hay lên release ko biêt anh em thấy sao ai chua biết thì cùng nghien cứu cho vui
Credits go consept
Code:
void AddStats(int aIndex)
{
if (!IsAddCmd) return;
cObj->Init(aIndex);
if (!strcmpi(Message, "/add"))
{
MessageOutput(aIndex, "Useage: /add <Type> <Amount>");
MessageOutput(aIndex, "The price for Add is: %d, Maximum stats: %d", AddPrice, AddMax);
return;
}
if (cObj->Money < AddPrice)
{
MessageOutput(aIndex, "You are lacking zen! %d", AddPrice - cObj->Money);
return;
}
char Param1[100];
memset(Param1, 0x00, 100);
GetParam(1, Message, Param1);
int AddType = 0;
if (!strcmpi(Param1, "str")) AddType = 0xB8;
if (!strcmpi(Param1, "agi")) AddType = 0xBA;
if (!strcmpi(Param1, "vit")) AddType = 0xBC;
if (!strcmpi(Param1, "eng")) AddType = 0xBE;
if (!strcmpi(Param1, "cmd")) AddType = 0xD8;
if (!AddType)
{
MessageOutput(aIndex, "You have selected wrong type! The types are: str, agi, vit, eng, cmd");
return;
}
if (cObj->Class != 4 && AddType == 0xD8)
{
MessageOutput(aIndex, "Only Dark Lords can use the add cmd type.");
return;
}
char Param2[100];
memset(Param2, 0x00, 100);
GetParam(2, Message, Param2);
int StatsToAdd = atoi(Param2);
if (cObj->LvlUpPoints < StatsToAdd)
{
MessageOutput(aIndex, "You are lacking level up points! %d", StatsToAdd - cObj->LvlUpPoints);
return;
}
int NowStats = cObj->GetWord(AddType);
if ((StatsToAdd + NowStats) > AddMax)
{
MessageOutput(aIndex, "You are not allowed to add more than %d points!", AddMax);
return;
}
BYTE Packet[5] = {0xC1, 0x05, 0x0F3, 0x06};
Packet[4] = ((AddType % 16) ^ 8) / 2; // Nice algorithm by coNsept to convert from gObj Offsets to the add types :P
if (AddType == 0xD8) Packet[4] = 0x04;
if (StatsToAdd <= 100)
for (int i=0; i<StatsToAdd; i++)
CGLevelUpPointAdd(Packet, aIndex);
else
{
int Amount = (cObj->LvlUpPoints - StatsToAdd - 1);
cObj->SetInt(0xA4, Amount);
cObj->AddInt(AddType, StatsToAdd - 1);
CGLevelUpPointAdd(Packet, aIndex);
}
cObj->SetInt(0xB4, cObj->Money - AddPrice);
CGMoneySend(aIndex, cObj->Money - AddPrice);
cObj->Init(aIndex);
MessageOutput(aIndex, "You've added %d points. You have now %d points left.", StatsToAdd, cObj->LvlUpPoints);
if (StatsToAdd > 100)
MessageOutput(aIndex, "Please relog and your stats will be updated.");
/post source code by consept
/post source code by consept
Code:
void DataSendAll(unsigned char* Packet, int Length)
{
for (int i=6400; i<7400; i++)
if(gObjIsConnected(i))
DataSend(i, Packet, Length);
}
void SendPost(int wId, LPCSTR Command, LPCSTR Text)
{
if (!IsPost) return;
if (!gObjIsConnected(wId)) return;
if (!strcmpi(Command, "/Post"))
{
MessageOutput(wId, "[%s] Useage: /Post <Msg>.", szPrefix);
MessageOutput(wId, "[%s] Price for post: %d, Minimun Level: %d", szPrefix, PostCost, PostLevel);
return;
}
gObj_SetInfo(wId);
if (gObj.Level < PostLevel)
{
MessageOutput(wId, "[%s] You're level is too low to post!", szPrefix);
return;
}
if (gObj.Money < PostCost)
{
MessageOutput(wId, "[%s] You don't have enough money to post!", szPrefix);
return;
}
BYTE *Packet;
char Message[100];
Packet = (BYTE*) malloc(200);
memset(Packet, 0x00, 200);
*Packet = 0xC1;
*(Packet+2) = 0x00;
memcpy((Packet+3), gObj.Nick, strlen(gObj.Nick));
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
memcpy((Packet+13), Message, strlen(Message));
int Len = (strlen(Message) + 0x13);
*(Packet+1) = Len;
DataSendAll(Packet, Len);
int Amount = (gObj.Money - PostCost);
gObj_Write(wId, gObj_Money, Amount);
MoneySend(wId, Amount);
free (Packet);
PK Clear Guard source code
Credits to consept
Code:
void PKClearGuard(int aIndex)
{
if (!PKClear_Active) return;
if (!gObjIsConnected(aIndex)) return;
lpObj->Init(aIndex);
int Price = PKClear_Price * (lpObj->PKLevel - 3);
if (lpObj->PKLevel < 4)
{
Send->PM(aIndex, "[PK Clear] You are already a commoner!");
return;
}
if (lpObj->Money < Price)
{
Send->PM(aIndex, "[PK Clear] You don't have enough money! Lacking %d.", Price - lpObj->Money);
return;
}
int Amount = lpObj->Money - Price;
lpObj->SetInt(0xB4, Amount);
GCMoneySend(aIndex, Amount);
lpObj->SetInt(0x101, 3);
GCPKLevelSend(aIndex, 3);
Send->PM(aIndex, "[PK Clear] You are a commoner again! %d Zen left.", Amount);
GCFireWorkSend(aIndex, lpObj->PosX, lpObj->PosY, 1);
Part of Protocol Core hook:
Code:
switch (mobObj->Class)
{
case 249:
PKClearGuard(aIndex);
break;
/make command source code
By Cahir
Code:
void UseMakeCommand(DWORD gObjId, char * msg)
{
if(strlen(msg) < 18)
{
return;
}
int spaces = 0;
for(int i=0; i < strlen(msg); i++)
{
if(msg[i] == ' ')
spaces++;
}
if(spaces < 7)
return;
if(IsObjectGM(gObjId) == false)
{
return;
}
char * PosA;
PosA = strchr( msg , ' ' );
char * PosB;
PosB = strchr( PosA+1 , ' ' );
char * PosC;
PosC = strchr( PosB+1 , ' ' );
char * PosD;
PosD = strchr( PosC+1 , ' ' );
int ItemType, ItemNr, ItemLevel;
if(*(PosA+2) != ' ')
{
ItemType = (int)(*(PosA+1) - 48) * 10 + (int)(*(PosA+2) - 48);
}
else
{
ItemType = (*(PosA+1)) - 48;
}
if(*(PosB+2) != ' ')
{
ItemNr = (int)(*(PosB+1) - 48) * 10 + (int)(*(PosB+2) - 48);
}
else
{
ItemNr = (*(PosB+1)) - 48;
}
if(*(PosC+2) != ' ')
{
ItemLevel = (int)(*(PosC+1) - 48) * 10 + (int)(*(PosC+2) - 48);
}
else
{
ItemLevel = (*(PosC+1)) - 48;
}
int ItemSkill = (*(PosD+1)) - 48;
int ItemLuck = (*(PosD+3)) - 48;
int ItemOpt = (*(PosD+5)) - 48;
int ItemExc = (*(PosD+7)) - 48;
DWORD Item = ItemType * 512 + ItemNr;
InvItemCreate ( gObjId , GetObjectMap(gObjId) , GetObjectPosX(gObjId) , GetObjectPosY(gObjId) , Item , ItemLevel , 0 ,ItemSkill , ItemLuck, ItemOpt , -1 , ItemExc , 0 );
GCServerMsgStringSend("[Make]: You have made an item.", gObjId, 1);
Sky Event Source code by Holy
.386
.Model flat, StdCall
Option CaseMap:none
Include \masm32\include\windows.inc
Include \masm32\include\user32.inc
Include \masm32\include\kernel32.inc
Include \masm32\include\masm32.inc
IncludeLib \masm32\lib\user32.lib
IncludeLib \masm32\lib\kernel32.lib
IncludeLib \masm32\lib\masm32.lib
TimePassed Proto :DWord, :DWord, :DWord, :DWord
StartEvent Proto :DWord, :DWord, :DWord, :DWord
Monster Proto :DWord, :DWord, :DWord, :DWord
Monster2 Proto :DWord, :DWord, :DWord, :DWord
Monster3 Proto :DWord, :DWord, :DWord, :DWord
EventOff Proto :DWord, :DWord, :DWord, :DWord
MensajeEvento Proto :DWord, :DWord, :DWord, :DWord
.Const
gObj Equ 658ACA8H
IDC_TIMER Equ 3
IDC_TIMER2 Equ 4
IDC_TIMER3 Equ 5
IDC_TIMER4 Equ 6
IDC_TIMER5 Equ 7
IDC_TIMER6 Equ 8
IDC_TIMER7 Equ 9
AllocSpace Equ 65000H
Buffer Equ 65000H
Buffer2 Equ 65000H
.Data
hMemory HANDLE ?
pMemory DWord ?
DataSend DD 0047DD20H
gObjTeleport DD 004E5E90H
GCServerCMD DD 00448F00H
MessageOutPut DD 004F0A80H
AllUserMsgS DD 00497C70H
MoneySend DD 0042F710H
gObjUserDie DD 004CA64BH
gObjAddMonster DD 004C4850H
gObjSetPosMonster DD 004C2E90H
gObjSetMonster DD 004C32E0H
ItemSerialCreate DD 004245A0H
PlayerIDBuf DB Buffer Dup(0)
PlayerDWSM DB Buffer2 Dup(0)
MensajeBievenida DB "Welcome to Sky Event", 0
TodaviaNoHora DB "Come back at 17:00 for enter Sky Event", 0
MensajeEventito DB "Sky Event has been Opened, you have 10 minutes for enter", 0
LimitePlayers DB "You can´t enter the event is full of players", 0
MensajeEventito1 DB "Sky Event Will Start in 5 Minutes", 0
MensajeEventito2 DB "Sky Event Will Start in 2 Minutes", 0
MensajeEventito3 DB "Sky Event Has Started!! Survive during 30 minutes!!", 0
NivelInsuficiente DB "You need to be at least lvl 50 for enter", 0
NoMoney DB "You need at least 25.000.000 zen for enter", 0
EventoCerrado DB "The event is closed, you can´t enter now.", 0
EventFinish DB "You have survive during 30 minutes! Congratulations!", 0
.Data?
lpLocalTime SYSTEMTIME <>
.Code
DllEntry Proc hInstDLL:HINSTANCE, reason:DWord, reserved1:DWord
Mov Eax, TRUE
Ret
DllEntry EndP
NPCEvent Proc
Local PlayerID:DWord
Local Map:DWord
Local X:DWord
Local Y:DWord
Local lpObj:DWord
Local Counter:DWord
Local MobID:DWord
Local MobLpObj:DWord
Push Ebx
Push Esi
Push Edi
Mov Eax, DWord Ptr Ss:[Ebp + 0CH] ; el lpObj que pusheamos en pChatProc
Mov lpObj, Eax
Mov Edx, DWord Ptr Ds:[Eax]
Mov PlayerID, Edx
Mov Cl, Byte Ptr Ds:[624521H]
Cmp Cl, 1
Je EventClosed
Mov Eax, lpObj
Mov Edx, DWord Ptr Ds:[Eax + 0A0H]
Cmp Edx, 50H
Jge RestarDinero
Lea Ecx, NivelInsuficiente
Push Ecx
Mov Edx, PlayerID
Push Edx
Call MessageOutPut
Jmp Finalizar
EventClosed:
Lea Eax, EventoCerrado
Push Eax
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Jmp Finalizar
NoTienesDinero:
Lea Eax, NoMoney
Push Eax
Mov Ecx, PlayerID
Push Ecx
Call MessageOutPut
Jmp Finalizar
RestarDinero:
Mov Eax, lpObj
Mov Ecx, DWord Ptr Ds:[Eax + 0B4H]
Cmp Ecx, 17D7840H
Jle NoTienesDinero
Sub Ecx, 17D7840H ;;Se le Resta el Dinero 25.000.000
Mov DWord Ptr Ds:[Eax + 0B4H], Ecx
Push Ecx
Mov Eax, PlayerID
Push Eax
Call MoneySend
Mov Map, 0AH ;Lorencia Map
Mov X, 0C8H ; Cord X
Mov Y, 0C8H ; Cord y
Mov Eax, Y
Push Eax
Mov Ecx, X
Push Ecx
Mov Edx, Map
Push Edx
Mov Eax, PlayerID
Push Eax
Call gObjTeleport
Add Esp, 8
Lea Eax, MensajeBievenida ;; Se le da la Bienvenida al Jugador al Entrar
Push Eax
Mov Edx, PlayerID
Push Edx
Call MessageOutPut
Mov Edx, PlayerID
IMul Edx, Edx, 10
Add Edx, pMemory
Mov Byte Ptr Ds:[Edx + 1], 1
Finalizar:
Ret
NPCEvent EndP
Eventime Proc
Mov Eax, DWord Ptr Ds:[0B679164H]
Mov Byte Ptr Ds:[624521H], 1
Invoke SetTimer, Eax, IDC_TIMER, 18000000, Addr TimePassed ;;5 horas
Ret
Eventime EndP
TimePassed Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Lea Eax, MensajeEventito1
Push Eax
Call AllUserMsgS
Invoke KillTimer, NULL, IDC_TIMER
Mov Byte Ptr Ds:[624521H], 0
Invoke SetTimer, NULL, IDC_TIMER6, 300000, Addr MensajeEvento
Ret
TimePassed EndP
MensajeEvento Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Mov Cl, Byte Ptr Ds:[6244D9H]
Cmp Ecx, 1
Je SaltaElMensaje
Lea Eax, MensajeEventito3
Push Eax
Call AllUserMsgS
Mov Byte Ptr Ds:[6244D9H], 1
SaltaElMensaje:
Invoke KillTimer, NULL, IDC_TIMER6
Mov Byte Ptr Ds:[624521H], 1
Call EventMessage
Ret
MensajeEvento EndP
StartEvent Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Edx, DWord Ptr Ds:[0B679164H]
Invoke KillTimer, Edx, IDC_TIMER2
Lea Eax, MensajeEventito3
Push Eax
Call AllUserMsgS
Mov Byte Ptr Ds:[624521H], 1
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 154H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
StartEvent EndP
CheckIds Proc
Local PlayerBaseID:DWord
Mov PlayerBaseID, 1900H
Jmp ComparePlayerBase
PlayerLooper:
Add PlayerBaseID, 1
ComparePlayerBase:
Cmp PlayerBaseID, 1CE8H
Jge EndSending
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Cmp DWord Ptr Ds:[Eax + 658ACACH], 3
Jnz PlayerLooper
Mov Edx, PlayerBaseID
IMul Edx, Edx, 10
Add Edx, pMemory
Mov Cl, Byte Ptr Ds:[Edx + 1]
Cmp Ecx, 1
Jnz PlayerLooper
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Add Eax, gObj
Movsx Edx, Word Ptr Ds:[Eax + 10DH]
Cmp Edx, 0AH
Jnz PlayerLooper
Push 0
Push 0
Mov Edx, PlayerBaseID
Push Edx
Push 0
Push 0
Push 0
Push 0
Push 0
Push 180FH
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Mov Dl, Byte Ptr Ds:[Eax + 658ADAEH]
Push Edx
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Cl, Byte Ptr Ds:[Ecx + 658ADACH]
Push Ecx
Mov Edx, PlayerBaseID
IMul Edx, Edx, 1938H
Xor Eax, Eax
Mov Al, Byte Ptr Ds:[Edx + 658ADB1H]
Push Eax
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Edx, DWord Ptr Ds:[Ecx + 658ACA8H]
Push Edx
Call ItemSerialCreate
Add Esp, 34H
Push 0
Push 0
Mov Edx, PlayerBaseID
Push Edx
Push 0
Push 0
Push 0
Push 0
Push 0
Push 1C0BH
Mov Eax, PlayerBaseID
IMul Eax, Eax, 1938H
Mov Dl, Byte Ptr Ds:[Eax + 658ADAEH]
Push Edx
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Cl, Byte Ptr Ds:[Ecx + 658ADACH]
Push Ecx
Mov Edx, PlayerBaseID
IMul Edx, Edx, 1938H
Xor Eax, Eax
Mov Al, Byte Ptr Ds:[Edx + 658ADB1H]
Push Eax
Mov Ecx, PlayerBaseID
IMul Ecx, Ecx, 1938H
Mov Edx, DWord Ptr Ds:[Ecx + 658ACA8H]
Push Edx
Call ItemSerialCreate
Add Esp, 34H
Jmp PlayerLooper
EndSending:
Ret
CheckIds EndP
EventOff Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Invoke KillTimer, NULL, IDC_TIMER4
Invoke KillTimer, NULL, IDC_TIMER7
Lea Eax, EventFinish
Push Eax
Call AllUserMsgS
Call CheckIds
Invoke SetTimer, NULL, IDC_TIMER, 18000000, Addr TimePassed
Ret
EventOff EndP
EventMessage Proc
Invoke SetTimer, NULL, IDC_TIMER2, 30000, Addr Monster
Invoke SetTimer, NULL, IDC_TIMER5, 600000, Addr Monster2 ;;Despues de 10 minutos, cambiar monstruos
Invoke SetTimer, NULL, IDC_TIMER4, 1800000, Addr EventOff
Ret
EventMessage EndP
Monster Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 161H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 15EH
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 161H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 15EH
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
Monster EndP
Monster2 Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Invoke KillTimer, NULL, IDC_TIMER2
Invoke KillTimer, NULL, IDC_TIMER5
Invoke SetTimer, NULL, IDC_TIMER7, 30000, Addr Monster3
Ret
Monster2 EndP
Monster3 Proc hwnd:DWord, uMsg:DWord, idEvent:DWord, dwTime:DWord
Local MobID:DWord
Local MobLpObj:DWord
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 167H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C7H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C7H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 169H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 167H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Mov Ecx, 0AH
Push Ecx
Call gObjAddMonster
Add Esp, 4
Movsx Eax, Ax
Mov MobID, Eax
Mov Eax, MobID
IMul Eax, Eax, 1938H
Add Eax, gObj
Mov MobLpObj, Eax
Mov DWord Ptr Ds:[Eax + 104H], 0C9H
Mov Eax, MobLpObj
Mov DWord Ptr Ds:[Eax + 106H], 0C9H
Mov DWord Ptr Ds:[Eax + 109H], 0AH
Push 169H
Mov Eax, MobID
Push Eax
Call gObjSetMonster
Add Esp, 8
Ret
Monster3 EndP
NewGObj Proc
Invoke GlobalAlloc, GMEM_MOVEABLE Or GMEM_ZEROINIT, AllocSpace
Mov hMemory, Eax
Invoke GlobalLock, hMemory
Mov pMemory, Eax
Ret
NewGObj EndP
Cái này mình tìm thấy bên RZ thấy hay lên release ko biêt anh em thấy sao ai chua biết thì cùng nghien cứu cho vui