Help with gObjAddMonster & gObjSetMonster
Hey everybody, I'm trying to code BlueEvent in 1.00.18 GS but there's a problem with "gObjAddMonster" and "gObjSetMonster". When I use the function directly on protocol.cpp or in a in-game command just for test to create a monster everything goes fine and the mob appears in the right location.
But when I put this in a function (specially _beginthread) and call it anywhere (protocol, in-game command, or other place) GameServer crashes. Debug info always stop on gObjAddMonster or gObjSetMonster.
blueevent.h
Code:
#include "StdAfx.h"
struct BLUEMONSTER_EVENT_TIME
{
int m_iHour;
int m_iMinute;
};
struct BLUEMONSTER_MAP_DATA
{
int m_iType;
BYTE MapNumber;
int X1;
int Y1;
int X2;
int Y2;
};
class BlueEvent
{
public:
BlueEvent();
virtual ~BlueEvent();
//--
void Load();
BOOL Read(char* lpszFileName);
void StartEvent();
void SetMonsters();
void Clear();
//--
std::vector<BLUEMONSTER_EVENT_TIME> m_EventTime;
std::vector<BLUEMONSTER_MAP_DATA> m_EventMapData;
//--
BOOL m_bDoHasData;
int IsActive, ItemDropRate, Duration;
int MobPosition[255], MobCount;
};
extern BlueEvent cBlueEvent;
void BlueEvent__InsideTrigger(void * lpParam);
blueevent.cpp
Code:
#include "StdAfx.h"
#include "Readscript.h"
//--
BlueEvent cBlueEvent;
using namespace pugi;
using namespace std;
//--
BlueEvent::BlueEvent()
{
}
BlueEvent::~BlueEvent()
{
}
void BlueEvent::Load()
{
this->Read(pluginBlueEvent);
}
BOOL BlueEvent::Read(char* lpszFileName)
{
SMDFile = fopen(lpszFileName,"r");
if(SMDFile == NULL )
{
MessageBox(NULL, "[BlueEvent] Info Load Fail [%s]", GAlert, MB_OK);
return false;
}
//Clear();
this->m_bDoHasData = FALSE;
int Token,Index = -1;
while( TRUE )
{
Token = GetToken();
if( Token == END )
break;
Index = (int)TokenNumber;
while( TRUE )
{
if( Index == 0 ) // Timer
{
Token = GetToken();
if( strcmp("end",TokenString) == NULL )
break;
BLUEMONSTER_EVENT_TIME tmp;
tmp.m_iHour = (int)TokenNumber;
Token = GetToken();
tmp.m_iMinute = (int)TokenNumber;
//Token = GetToken();
//tmp.m_Duration = (int)TokenNumber;
m_EventTime.push_back( tmp );
}
else if( Index == 1 ) // Monsters
{
Token = GetToken();
if( strcmp("end",TokenString) == NULL )
break;
BLUEMONSTER_MAP_DATA tmp;
tmp.m_iType = (int)TokenNumber;
Token = GetToken();
tmp.MapNumber = (int)TokenNumber;
Token = GetToken();
tmp.X1 = (int)TokenNumber;
Token = GetToken();
tmp.Y1 = (int)TokenNumber;
//Token = GetToken();
//tmp.X2 = (int)TokenNumber;
//Token = GetToken();
//tmp.Y2 = (int)TokenNumber;
m_EventMapData.push_back( tmp );
}
}
}
fclose(SMDFile);
this->IsActive = GetPrivateProfileInt("BlueEvent", "IsActive", 1, pluginBlueEvent);
this->ItemDropRate = GetPrivateProfileInt("BlueEvent", "ItemDropRate", 30, pluginBlueEvent);
this->Duration = GetPrivateProfileInt("BlueEvent", "Duration", 10, pluginBlueEvent);
Log.LogADD("[Blue Event] Arquivo de configuração carregado com sucesso!\n");
this->m_bDoHasData = TRUE;
return true;
}
void BlueEvent::StartEvent()
{
if( this->IsActive == 0 )
return;
if( m_bDoHasData == FALSE )
return;
if( m_EventMapData.empty() )
return;
_beginthread( BlueEvent__InsideTrigger, 0, NULL );
}
void BlueEvent::SetMonsters()
{
for(DWORD n = 0; n < m_EventMapData.size(); n++)
{
BLUEMONSTER_MAP_DATA tmpMapData = m_EventMapData[n];
MonsterAddAndSpawn(m_EventMapData[n].m_iType, m_EventMapData[n].MapNumber, m_EventMapData[n].X1, m_EventMapData[n].Y1);
}
}
void BlueEvent::Clear()
{
for(DWORD n = 0; n < m_EventMapData.size(); n++)
{
gObjDel(m_EventMapData[n].m_iType);
}
}
void BlueEvent__InsideTrigger(void * lpParam)
{
// Send notice that the event has started
SendNoticeToAll("Os White Rabbits nos invadiram!");
Log.BlueEvent("Evento iniciado");
cBlueEvent.SetMonsters();
Sleep(1000*cBlueEvent.Duration);
cBlueEvent.Clear();
// Send notice that the event has finished
SendNoticeToAll("Os White Rabbits recuaram!");
Log.BlueEvent("Evento encerrado");
//--
_endthread();
}
eventmanager.h
Code:
#include "StdAfx.h"
struct EventInfo
{
int Event;
};
class cEventManager
{
public:
cEventManager();
virtual ~cEventManager();
//--
void Start();
//void Load();
//--
EventInfo pEventInfo;
};
extern cEventManager EventManager;
void EventManager___Thread(void * lpParam);
eventmanager.cpp
Code:
#include "StdAfx.h"
//--
cEventManager EventManager;
//--
cEventManager::cEventManager()
{
}
cEventManager::~cEventManager()
{
}
void cEventManager::Start()
{
_beginthread( EventManager___Thread, 0, NULL );
}
void EventManager___Thread(void * lpParam)
{
while(true)
{
//--
Sleep(60000);
//-- SystemTime
SYSTEMTIME t;
GetLocalTime(&t);
DWORD EventTime;
DWORD SystemTime = MAKELONG(t.wHour, t.wMinute);
//-- Blue Event
for(DWORD n = 0; n < cBlueEvent.m_EventTime.size(); n++)
{
EventTime = MAKELONG(cBlueEvent.m_EventTime[n].m_iHour, cBlueEvent.m_EventTime[n].m_iMinute);
if( EventTime == SystemTime )
{
cBlueEvent.StartEvent();
}
}
}
}
And this is my function to create the mob:
Code:
int MonsterAddAndSpawn(WORD Monster,BYTE Map,BYTE X, BYTE Y)
{
int MobID = gObjAddMonster(Map);
if(MobID>=0)
{
OBJECTSTRUCT *pObj = (OBJECTSTRUCT*)GS_GOBJPOINTER(MobID);
//gObjSetPosMonster(MobID, MobCount);
pObj->Class = Monster;
pObj->MapNumber = Map;
pObj->X = X;
pObj->Y = Y;
pObj->Dir = 2;
pObj->StartX = X;
pObj->StartY = Y;
gObjSetMonster(MobID, Monster);
}
return MobID;
}
Any tips will help me! Thank you all :)::):