- Joined
- Aug 27, 2008
- Messages
- 183
- Reaction score
- 133
pls help me (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
Season 5 events isn't developed...
Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!
Join Today!pls help me (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
These source codes don't work, the community is in total decay.. increasingly knowledgeable people who are fully devoted to the development of MU Online there, I think at this point it is correct to say that: "Communities of development for Mu Online "and" Mu Online same, have died."
PS: Sad but true.
Cause you can't do anything by yourself doesn't mean other people can't
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "stdafx.h"
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "ChaosEvent.h"
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "log.h"
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "gameserver.h"
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "Readscript.h"
CChaosEvent g_ChaosEvent;
typedef void (*TAllSendServerMsg)(char* msg);
typedef void (*TgObjMonsterDieGiveItem)(OBJECTSTRUCT *lpObj, OBJECTSTRUCT *lpTargetObj);
typedef short (*TgObjAddMonster)(int MapID);
typedef BOOL (*TgObjSetMonster)(int aIndex, int MonsterClass);
TAllSendServerMsg AllSendServerMsg = (TAllSendServerMsg)(0x004041D3);
TgObjMonsterDieGiveItem gObjMonsterDieGiveItem = (TgObjMonsterDieGiveItem)(0x0041D9E0);
TgObjAddMonster gObjAddMonster = (TgObjAddMonster)(0x004044F3);
TgObjSetMonster gObjSetMonster = (TgObjSetMonster)(0x0040616D);
CChaosEvent::CChaosEvent() : m_bInstantSpawn(false), m_bEnableEvent(false)
{
InitializeCriticalSection(&m_critical);
ZeroMemory(eventArray,8000);
}
CChaosEvent::~CChaosEvent()
{
DeleteCriticalSection(&m_critical);
}
void CChaosEvent::Load()
{
EnterCriticalSection(&m_critical);
//Poner funcion para limpiar bichos existentes
Clear();
SMDFile = fopen("..\\Data\\WZTGroup_EMUEvents.dat", "r");
if(SMDFile == NULL)
{
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=if"]#if[/URL] 0
MsgBox("[Chaos Event]Cannot load settings file\nAutomatic disable event");
[URL="http://forum.ragezone.com/usertag.php?do=list&action=hash&hash=endif"]#endif[/URL]
m_bEnableEvent = false;
return;
}
SMDToken Token;
int iType = -1;
SPAWN_INFO SpawnInfo;
MONSTER_INFO MonsterInfo;
ITEM_INFO ItemInfo;
while(true)
{
Token = GetToken();
if(Token == END)
break;
iType = TokenNumber;
while(true)
{
if(iType == 0)
{
Token = GetToken();
if(Token == NAME && strcmp("end",TokenString) == 0)
break;
this->m_bEnableEvent = TokenNumber;
if(this->m_bEnableEvent == false)
break;
Token = GetToken();
this->m_bInstantSpawn = TokenNumber;
}
else if(iType == 1)
{
Token = GetToken();
if(Token == NAME && strcmp("end",TokenString) == 0)
break;
SpawnInfo.iCategory = TokenNumber;
Token = GetToken();
SpawnInfo.bStaticTime = TokenNumber;
SpawnInfo.wDay = 0;
Token = GetToken();
SpawnInfo.iHour = TokenNumber;
Token = GetToken();
SpawnInfo.iMinute = TokenNumber;
Token = GetToken();
SpawnInfo.bMessage = TokenNumber;
Token = GetToken();
if(Token == NAME)
strcpy(SpawnInfo.szMessage, TokenString);
if(this->m_bInstantSpawn == false)
{
SpawnInfo.dwLastTick = GetTickCount();
}
else
{
SpawnInfo.dwLastTick = 0;
}
this->m_Spawns.push_back(SpawnInfo);
}
else if(iType == 2)
{
Token = GetToken();
if(Token == NAME && strcmp("end",TokenString) == 0)
break;
MonsterInfo.iCategory = TokenNumber;
Token = GetToken();
MonsterInfo.iDropCategory = TokenNumber;
Token = GetToken();
MonsterInfo.iMonsterID = TokenNumber;
Token = GetToken();
MonsterInfo.iMapID = TokenNumber;
Token = GetToken();
MonsterInfo.iX1 = TokenNumber;
Token = GetToken();
MonsterInfo.iY1 = TokenNumber;
Token = GetToken();
MonsterInfo.iX2 = TokenNumber;
Token = GetToken();
MonsterInfo.iY2 = TokenNumber;
Token = GetToken();
MonsterInfo.iAddHP = TokenNumber;
Token = GetToken();
MonsterInfo.iAddDefense = TokenNumber;
Token = GetToken();
MonsterInfo.iAddAttack = TokenNumber;
Token = GetToken();
MonsterInfo.iDropRate = TokenNumber;
Token = GetToken();
MonsterInfo.iExcRate = TokenNumber;
Token = GetToken();
MonsterInfo.iAncRate = TokenNumber;
Token = GetToken();
MonsterInfo.iSpawnCount = TokenNumber;
Token = GetToken();
MonsterInfo.bShowMessage = TokenNumber;
Token = GetToken();
if(Token == NAME)
strcpy(MonsterInfo.szMessage,TokenString);
MonsterInfo.iCurSpawnCount = 0;
this->m_Monsters[MonsterInfo.iCategory].push_back(MonsterInfo);
}
else if(iType == 3)
{
Token = GetToken();
if(Token == NAME && strcmp("end",TokenString) == 0)
break;
ItemInfo.iCategory = TokenNumber;
Token = GetToken();
ItemInfo.iItemType = TokenNumber;
Token = GetToken();
ItemInfo.iItemType = ITEMGET(ItemInfo.iItemType,TokenNumber);
Token = GetToken();
ItemInfo.iLevel = TokenNumber;
Token = GetToken();
ItemInfo.bSkill = TokenNumber;
Token = GetToken();
ItemInfo.bLuck = TokenNumber;
Token = GetToken();
ItemInfo.iOption = TokenNumber;
Token = GetToken();
ItemInfo.iExcellent = TokenNumber;
Token = GetToken();
ItemInfo.bAncient = TokenNumber;
this->m_ItemInfo[ItemInfo.iCategory].push_back(ItemInfo);
}
}
};
fclose(SMDFile);
//if(m_bEnableEvent == true)
// Log.outInfo("[Chaos Event]Running Event Spawns(%d)", this->m_Spawns.size());
LeaveCriticalSection(&m_critical);
}
void CChaosEvent::Process()
{
EnterCriticalSection(&m_critical);
if(this->m_bEnableEvent == false)
{
LeaveCriticalSection(&m_critical);
return;
}
DWORD dwTickCount = GetTickCount();
for(LIST_SPAWN::iterator it = m_Spawns.begin();it != m_Spawns.end();it++)
{
LPSPAWN_INFO lpSpawnInfo = &(*it);
bool bRun = false;
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
if(lpSpawnInfo->bStaticTime == false)
{
bRun = ((dwTickCount - lpSpawnInfo->dwLastTick) > ((lpSpawnInfo->iHour*60)+(lpSpawnInfo->iMinute))*60*1000);
}
else
{
bRun = (sysTime.wHour == lpSpawnInfo->iHour && sysTime.wMinute == lpSpawnInfo->iMinute && sysTime.wDay != lpSpawnInfo->wDay);
}
if(bRun == true)
{
if(lpSpawnInfo->bStaticTime == true)
lpSpawnInfo->wDay = sysTime.wDay;
else
lpSpawnInfo->dwLastTick = dwTickCount;
for(LIST_MONSTER::iterator it = m_Monsters[lpSpawnInfo->iCategory].begin();it != m_Monsters[lpSpawnInfo->iCategory].end();it++)
{
LPMONSTER_INFO lpMonsterInfo = &(*it);
if(lpMonsterInfo->iCategory == lpSpawnInfo->iCategory)
{
while(lpMonsterInfo->iCurSpawnCount++ < lpMonsterInfo->iSpawnCount)
this->AddMonster(lpMonsterInfo);
}
}
if(lpSpawnInfo->bMessage == true)
{
AllSendServerMsg(lpSpawnInfo->szMessage);
}
}
}
LeaveCriticalSection(&m_critical);
}
void CChaosEvent::KillProcess(OBJECTSTRUCT *lpObj, OBJECTSTRUCT *lpTargetObj)
{
if(eventArray[lpObj->m_Index] == false)
{
gObjMonsterDieGiveItem(lpObj,lpTargetObj);
return;
}
EnterCriticalSection(&m_critical);
MONSTER_MAP::iterator it = m_MonsterMap.find(lpObj->m_Index);
if(it == m_MonsterMap.end())
{
LeaveCriticalSection(&m_critical);
return;
}
DWORD dwIndex = gObjMonsterTopHitDamageUser((LPBYTE)lpObj);
lpTargetObj = &ObjTab[dwIndex];
LPMONSTER_INFO lpMonsterInfo = it->second;
lpMonsterInfo->iCurSpawnCount--;
if(lpMonsterInfo->bShowMessage == true)
{
char szMessage[256] = {0};
sprintf(szMessage, lpMonsterInfo->szMessage, lpTargetObj->Name);
AllSendServerMsg(szMessage);
}
if(m_ItemInfo[lpMonsterInfo->iDropCategory].size() > 0 && rand()%100 < lpMonsterInfo->iDropRate)
{
int iSel = rand()%m_ItemInfo[lpMonsterInfo->iDropCategory].size();
LPITEM_INFO lpItemInfo = &m_ItemInfo[lpMonsterInfo->iDropCategory][iSel];
int iNewOption = 0, iSetOption = 0;
if(rand()%100 < lpMonsterInfo->iExcRate)
{
int iCount = rand()%(lpItemInfo->iExcellent+1);
if(iCount > 6)
iCount = 6;
for(int i = 0;i < iCount;i++)
iNewOption |= 1 << i;
}
if(rand()%100 < lpMonsterInfo->iAncRate && lpItemInfo->bAncient == true)
{
BOOL isSet = lpItemInfo->iItemType;
_asm
{
push isSet;
mov ecx,0x07AD9630;
mov eax, 0x00405551;
call eax;
mov isSet, eax;
sub esp,4;
};
if(isSet == TRUE)
{
_asm
{
mov ecx,0x07AD9630;
mov eax, 0x00404291;
call eax;
mov iSetOption, eax;
};
//iSetOption = gSetItemOption.GenSetOption(lpItemInfo->iItemType);
iNewOption = 0;
}
}
ItemSerialCreateSend(dwIndex, lpObj->MapNumber, lpObj->X, lpObj->Y, lpItemInfo->iItemType, rand()%(lpItemInfo->iLevel+1), 255, lpItemInfo->bSkill, lpItemInfo->bLuck, rand()%(lpItemInfo->iOption+1), dwIndex, iNewOption, iSetOption);
}
eventArray[lpObj->m_Index] = false;
gObjDel(lpObj->m_Index);
m_MonsterMap.erase(it);
LeaveCriticalSection(&m_critical);
}
void CChaosEvent::AddMonster(LPMONSTER_INFO lpMonsterInfo)
{
int iIndex = gObjAddMonster(lpMonsterInfo->iMapID);
if(iIndex == -1)
return;
OBJECTSTRUCT *lpObj = &ObjTab[iIndex];
lpObj->MapNumber = lpMonsterInfo->iMapID;
while(true)
{
int iPos;
int X1 = lpMonsterInfo->iX1, X2 = lpMonsterInfo->iX2, Y1 = lpMonsterInfo->iY1, Y2 = lpMonsterInfo->iY2;
BYTE MapNumber = lpObj->MapNumber;
_asm
{
mov edx, lpObj;
lea ecx, dword ptr ds:[edx+0x12E];
push ecx;
lea ecx, dword ptr ds:[edx+0x12C];
push ecx;
push Y2;
push X2;
push Y1;
push X1;
movzx eax, MapNumber;
push eax;
mov ecx, 0x07D800B0;
mov eax, 0x0040768F;
call eax;
mov iPos, eax;
};
if(iPos != 0)
break;
};
lpObj->TX = lpObj->X;
lpObj->TY = lpObj->Y;
lpObj->MTX = lpObj->X;
lpObj->MTY = lpObj->Y;
lpObj->StartX = lpObj->X;
lpObj->StartY = lpObj->Y;
lpObj->Dir = rand()%8;
lpObj->m_State = 1;
lpObj->PathCount = 0;
gObjSetMonster(iIndex,lpMonsterInfo->iMonsterID);
lpObj->Life = lpObj->MaxLife *= (1.0f+(lpMonsterInfo->iAddHP/100.0f));
lpObj->m_AttackDamageMin *= ((100.0f+lpMonsterInfo->iAddAttack)/100.0f);
lpObj->m_AttackDamageMax *= ((100.0f+lpMonsterInfo->iAddAttack)/100.0f);
lpObj->m_Defense *= ((100.0f+lpMonsterInfo->iAddDefense)/100.0f);
eventArray[iIndex] = true;
m_MonsterMap.insert(std::make_pair(iIndex,lpMonsterInfo));
}
void CChaosEvent::Clear()
{
m_Spawns.clear();
m_MonsterMap.clear();
for(int i = 0;i < MAX_CATEGORY;i++)
{
m_ItemInfo[i].clear();
m_Monsters[i].clear();
}
for(MONSTER_MAP::iterator it = m_MonsterMap.begin();it != m_MonsterMap.end();it++)
{
gObjDel(it->first);
eventArray[it->first] = false;
}
}
bool InitNPCTalk(int aIndex,int aTargetIndex){
OBJECTSTRUCT* gObj = (OBJECTSTRUCT*)(aIndex * OBJECT_SIZE + OBJECT_BASE);
OBJECTSTRUCT *gTargetObj = (OBJECTSTRUCT*) OBJECT_POINTER (aTargetIndex);
if(gTargetObj->Class == LUKE_THE_HELPER && gTargetObj->MapNumber == 0) {
if(DeleteItemFromPlayer(aIndex,ITEMGET(14,68),1) == 0)
{
GCServerMsgStringSend("You don't have the special item!",aIndex,1);
return true;
}
else
{
int Type = ITEMGET(14,41);//Gemstone
GCFireworkSend(aIndex,gObj->X,gObj->Y,1);
ItemSerialCreateSend(aIndex,gObj->MapNumber,gObj->X,gObj->Y,Type,0,0,0,0,0,0,0,0);
GCServerMsgStringSend("Thank you noble warrior.. You are worthy to receive the 'Gemstone'.",aIndex,1);
}
}
return false;
}
EPIC FAIL.. im not josep from stupid wzteam... idiot...
Sos mas lento de lo que pensaba.. anda a hastle quizas ahi seas bueno muchachito..
PD: Espero que hayas usado el dialogo del Helper...
Hahaha you say that you aren't Josep of wzteam??, you made me laugh... :laugh:
PD: y porque decis que esperas que halla usado el dialog del helper?, no entiendo que importa eso?, lo que use (por si no se nota en el código), es la función para mandar mensajes desde servidor...
el NPC es el del index: 258, que no tenia función alguna, por eso lo use.. si hubiera querido, podría haber agregado uno totalmente nuevo en el lado del servidor y también en el lado del cliente..
Luke The Helper tiene un dialogo como el NPC de Santa Town con un Si / No que se utiliza para recibir un Item si no mal recuerdo bue eso no importa... lo importante es recalcar que no no soy el pelotudo de William o will no se que (gracias a dios ese pibe es peor que vos)... es tu problema si te sentiste ofendido...
Laugh all the day if you want.. im not josep... see my nick? joseSp ... my old account was lost.. so i create this one...
Well, as you are no Josep of: wzteam, then I think it will not matter, that provides full source code of the latest revision of the files of: wzteam season 4.6 or not?
here WzTeam Season 4.6 Full Source for all:
You must be registered to see links
and here WzTam Season 4.6 Server Files (Files base + configs):
You must be registered to see links
PD: De esta forma, si sos Josep del wzteam, todos van a poder ver tu maravillosa forma de codificar. y sino, entonces no hay problema y todos felices (ami no me importa aportar este código, porque es horrible y ademas porque no es mio).