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
blueevent.cppCode:#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);
eventmanager.hCode:#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.cppCode:#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);
And this is my function to create the mob: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(); } } } }
Any tips will help me! Thank you allCode: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; }![]()





