Help with gObjAddMonster & gObjSetMonster

Results 1 to 1 of 1
  1. #1
    Member gustavobm is offline
    MemberRank
    Oct 2010 Join Date
    58Posts

    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




Advertisement