Czesc pisze sobie mały event i napotkałem sie na problem

0

Witam, pisze sobie program który ma działac non stop bez przerwy.

O to on.
Jest 10 zone, kazde jest otwarte, gdy gracz wchodzi do zone[1].status = 0 i sie zamyka i chce zeby teraz gdy nastepny gracz uzyje jakis tam item.
uzyło zone[2].status = 0 czyli zeby przechodziło do nastepnych zone. I gdy juz po 10 minutach gracz wyjdzie, albo po prostu nie ukonczy zadania status sie zmieni na 1 i znow nastepny moze wejsc w zone[1] lub [0].

#include "../../Includes/definitions.h"
#include "../../Includes/main.h"
#include "../../Includes/ConsoleHandler.h"
#include "../../Includes/SQLApi.h"
#if defined( SOACSADDONS ) && (SOACSADDONS > 0)
#include "../../Includes/AddonSettings.h"
#if defined( MONSTERSTONE ) && (MONSTERSTONE > 0)
	cMonsterStone MonsterStoneSettings;
	ThreadGuard::Synchronize MonsterStone;
	CMonsterMainThread m_MonsterStoneMainThread;
	_MS_USER_DATA MonsterStoneUser[MAXUSERS];
	CMonsterStoneDetails MonsterStoneDetails[10];
	MTMutex MonsterMutex;
	MTMutex MonsterInstance;
	//ThreadGuard::SafeLock guard(MonsterStone);
	unsigned long MonsterStone_tid;
	int m_MonsterStoneStatus;
	SQLApi::dbprocess MonsterStoneDB;
	int c_MonsterStoneZones[MAXINSTANCE_MS] = { 160,161,162,163,164,165,166,167,168,169};

	void ms_Load() {
		//ThreadGuard::SafeLock guard(MonsterStone);
		int i;
		for (i = 0; i < MAXUSERS; i++) {
			MonsterStone_SOACSInitialize(i);
			MonsterStoneUser[i].reset();
		}
		for (i = 0; i < 10; i++) {
			MonsterStone_MapInitialize(i);
		}
		
		CreateThread(nullptr, NULL, reinterpret_cast<LPTHREAD_START_ROUTINE>(MS_MainThread), reinterpret_cast<LPVOID>(0x1337C0D5), 0, &MonsterStone_tid);
		InsertLog("Addon System: Monster Stone loaded.");
		ConsoleOutput("Addon System: Monster stone loaded.", White);
		return;
	}
	void MonsterStone_SOACSInitialize(int x) {
		if (x < 0 || x >= MAXUSERS) {
			return;
		}
		MonsterStoneUser[x].InstanceID = -1;
		MonsterStoneUser[x].InstanceZone = -1;
		MonsterStoneUser[x].JoinedInstance = false;
		return;
	}
	void MonsterStone_MapInitialize(int x) {
		if (x < 0 || x >= MAXINSTANCE_MS) {
			return;
		}
		MonsterStoneDetails[x].Activated = false;
		MonsterStoneDetails[x].Available = true;
		MonsterStoneDetails[x].Closed = false;
		MonsterStoneDetails[x].Started = false;
		time_t now;
		time(&now);
		MonsterStoneDetails[x].StartTime = now;
		return;
	}

	void MonsterStone_SendInfo(int UserID, int Type) {
		if (IsUserConnected(UserID)) {
			_USER_INFO* pUserInfo;
			pUserInfo = reinterpret_cast<_USER_INFO*>(GetUserInfoPointer(UserID));
			if (Type == 1) {
				SendNotice(UserID, "All rooms are full now, please try later...", 39, pUserInfo->Nation);
				SendNotice(UserID, "Suanda butun odalar dolu durumda...", 39, pUserInfo->Nation);
				SendNotice(UserID, "Wszystkie pokoje sa zajete, prosze sprobowac pozniej...", 39, pUserInfo->Nation);
				return;
			}
			if (Type == 2) {
				SendNotice(UserID, "It is not possible to use a Monster Stone as you are already in it...", 39, pUserInfo->Nation);
				SendNotice(UserID, "Icinde bulundugunuz gibi bir Canavar Tasi kullanmak mumkun degil...", 39, pUserInfo->Nation);
				SendNotice(UserID, "Nie mozna uzywac monster stone kiedy aktualnie juz w nim sie znajdujesz ...", 39, pUserInfo->Nation);
				return;
			}
			if (Type == 3) {
				SendNotice(UserID, "Monster stone is started, you have to complete it in 10 minutes.", 39, pUserInfo->Nation);
				return;
			}
			if (Type == 4) {
				SendNotice(UserID, "[Monster Stone] You probably not finish your monster stone, you have to wait 1-10 minutes for join next one...", 39, pUserInfo->Nation);
				return;
			}
			return;
		}
	}
	void MS_MainThread(DWORD lpParameters) {
		ConsoleOutput("Monster Stone: Mainworker started", LightCyan);
		if (lpParameters == 0x1337C0D5) {
			//Start Notice with RemainTime
			short RemainTime = 0;
			while (true) {
				for (int xt = 0; xt < MAXUSERS; xt++) {
					if (IsUserConnected(xt)) {

						if (MonsterStoneUser[xt].ActiveState == 0)
						{
							goto _EventStarted;
						}
						else {
							if (MonsterStoneUser[xt].ActiveState == 1 && MonsterStoneUser[xt].IsInZone == true) {
								RemainTime = MonsterStoneSettings.EventTime - GetTimeDiff(MonsterStoneUser[xt].StartTime);
								if (RemainTime > 0) {
									ms_SendRemainingTime(RemainTime);
								}
								else if (RemainTime <= 0)
								{
									MonsterStone_CloseEvent();
								}
							}
							if (MonsterStoneUser[xt].ActiveState == 2 && MonsterStoneUser[xt].BossKilled == true && MonsterStoneUser[xt].IsInZone == true) {
								RemainTime = MonsterStoneSettings.TimeToOutAfterKillBoss - GetTimeDiff(MonsterStoneUser[xt].BossKillTime);
								if (RemainTime > 0) {
									ms_SendRemainingTime(RemainTime);
								}
								else if (RemainTime <= 0)
								{
									MonsterStone_CloseEvent();
								}
							}
						}
					}
				}
			_EventStarted:
				Sleep(1000);
			}
			
		}
		return;
	}
	void ms_StartMonsterStone(int UserID) {
		_USER_INFO* MpUserInfo;
		MpUserInfo = reinterpret_cast<_USER_INFO*>(GetUserInfoPointer(UserID));
		/*
		if (MonsterStoneDetails[0].Available == false && MonsterStoneDetails[1].Available == false && MonsterStoneDetails[2].Available == false &&
			MonsterStoneDetails[3].Available == false && MonsterStoneDetails[4].Available == false && MonsterStoneDetails[5].Available == false &&
			MonsterStoneDetails[6].Available == false && MonsterStoneDetails[7].Available == false && MonsterStoneDetails[8].Available == false &&
			MonsterStoneDetails[9].Available == false) {
			goto _NoRooms;
		}
		*/
		MonsterStoneSettings.EventTime = 600;
		MonsterStoneSettings.TimeToOutAfterKillBoss = 30;//After killing the boss you have 30 sec to pick up drop and it automatic tp you out.
		time_t now;
		time(&now);
		//TpUserMs(UserID, 160);
		int InstanceID = 0;
		for (InstanceID = 0; InstanceID < MAXINSTANCE_MS; InstanceID++)
		{
			if (MonsterStoneDetails[InstanceID].Available == true)
			{
				//TpUserMs(int UserID, int ZoneID)
				MonsterStoneDetails[InstanceID].Available = false;
				MonsterStoneDetails[InstanceID].Activated = true;
				MonsterStoneDetails[InstanceID].Started = true;
				//MonsterStoneUser[UserID].InstanceID = x;
				TpUserMs(UserID, MonsterStoneUser[UserID].InstanceZone = ms_GetZoneNo(InstanceID));
				MonsterStoneDetails[InstanceID].StartTime = now;
				goto _StartEvent;
			}
			return;
		}
	_StartEvent:
		time_t now1;
		time(&now1);
		MonsterStone_SendInfo(UserID, 3);
		MonsterStoneUser[UserID].ActiveState = 1;
		MonsterStoneUser[UserID].StartTime = now1;
		MonsterStoneUser[UserID].IsInZone = true;
		MonsterStoneUser[UserID].InstanceZone = (ms_GetInstanceIDFromZone(MpUserInfo->Zone));
		ms_SpawnMobsAndBoss(ms_GetZoneNo(InstanceID));
		MonsterStoneUser[UserID].BossKillTime = time(nullptr);
		MonsterStoneUser[UserID].BossKilled = false;
		//RobItem(UserID, 900500000, 1); Rob the item 
	_NoRooms:
		MonsterStone_SendInfo(UserID, 1);
	_YouProbablySpamMS:
		MonsterStone_SendInfo(UserID, 4);


		return; 
	}
	void MonsterStone_CloseEvent() {
		for (int xt = 0; xt < MAXUSERS; xt++) {
			if (IsUserConnected(xt)) {
				_USER_INFO* pUserInfo;
				pUserInfo = reinterpret_cast<_USER_INFO*>(GetUserInfoPointer(xt));
				if (MonsterStoneUser[xt].ActiveState > 0) {
					//To do MonsterStoneDetails - available true etc...
					MonsterStone_SendInstanceOpen(MonsterStoneUser[xt].InstanceZone);
					MonsterStoneUser[xt].InstanceZone = 0;
					MonsterStoneUser[xt].ActiveState = 0;
					MonsterStoneUser[xt].BossKillTime = time(nullptr);
					MonsterStoneUser[xt].StartTime = time(nullptr);
					KickAllUsers(160);
					char text[1024]; memset(text, NULL, 1024);
					sprintf(text, "Monster Stone event room has ended");
					NPCHandler_SendNotice(text, 0x7);
					ConsoleOutput("Monster Stone event room has ended", LightCyan);
					MainLog.Output("MonsterStone", "Monster Stone event room has ended");
					int  send_index = 0;
					char send_data[128]; memset(send_data, NULL, 128);
					SetByte(send_data, 0x1B, send_index);
					SetByte(send_data, 0x00, send_index);
					SendAiServerData(1000, send_data, send_index);
				}
			}
		}
		return;
	}
	void MonsterStone_SendInstanceOpen(int DetectInstance) {
		if (DetectInstance < 0 || DetectInstance >= 10) {
			return;
		}
		MonsterStoneDetails[DetectInstance].Available = true;
		MonsterStoneDetails[DetectInstance].Started = false;
		return;
	}
	void MonsterStone_Execute(unsigned long NPCPointer, int UserID, int ZoneNo)
	{
		if (MonsterStoneUser[UserID].ActiveState != 1) {
			return;
		}
		if (UserID < 0 || UserID >= MAXUSERS) {
			return;
		}
		_NPC_INFO* pNpcID;
		pNpcID = reinterpret_cast<_NPC_INFO*>(NPCPointer);
		if (!pNpcID) {
			return;
		}
		_USER_INFO* pUserID = reinterpret_cast<_USER_INFO*>(GetUserInfoPointer(UserID));
		if (!pUserID) {
			return;
		}
		char text[1024]; memset(text, NULL, 1024);
		time_t now;
		time(&now);
		MonsterStoneUser[UserID].ActiveState = 2;
		MonsterStoneUser[UserID].BossKilled = true;
		MonsterStoneUser[UserID].BossKillTime = now;
		SendNotice(UserID, "Congratulations you killed the boss of Monster Stone... Hope you will back...", 18, 1);
		return;
	}
	void TpUserMs(int UserID, int ZoneID) {
		if (IsUserConnected(UserID)) {
			ChangeZone(UserID, ZoneID, 200, 200);
			MonsterStoneUser[UserID].IsInZone = true;
		}
		return;
	}
	void ms_SpawnMobsAndBoss(int InstanceID) {
		//int InstanceZone = ms_GetZoneNo(160);
		int InstanceZone = 160;
		KillAllNpcs(0,InstanceZone,true); // Kill all mobs avoid to have multiple mobs in one place.
		int Summoner;
		for (Summoner = 0; Summoner<MAXUSERS; Summoner++) {
			if (IsUserConnected(Summoner)) {
				SummonNPC(Summoner, 16020, InstanceZone, 185, 220);
				SummonNPC(Summoner, 16020, InstanceZone, 177, 194);
				SummonNPC(Summoner, 16020, InstanceZone, 146, 205);
				SummonNPC(Summoner, 16020, InstanceZone, 115, 206);
				SummonNPC(Summoner, 16020, InstanceZone, 92, 209);// finish hungry dog
				SummonNPC(Summoner, 16022, InstanceZone, 66, 207);
				SummonNPC(Summoner, 16022, InstanceZone, 47, 178);
				SummonNPC(Summoner, 16022, InstanceZone, 72, 169);
				SummonNPC(Summoner, 16022, InstanceZone, 52, 144);
				SummonNPC(Summoner, 16022, InstanceZone, 89, 130);//finish Apsik
				SummonNPC(Summoner, 16023, InstanceZone, 183, 119);
				SummonNPC(Summoner, 16023, InstanceZone, 205, 99);
				SummonNPC(Summoner, 16023, InstanceZone, 193, 69);
				SummonNPC(Summoner, 16023, InstanceZone, 209, 43);
				SummonNPC(Summoner, 16023, InstanceZone, 172, 74);
				SummonNPC(Summoner, 16023, InstanceZone, 139, 44);//finish blind archer
				SummonNPC(Summoner, 16024, InstanceZone, 157, 56);
				SummonNPC(Summoner, 16024, InstanceZone, 170, 90);
				SummonNPC(Summoner, 16024, InstanceZone, 209, 57);
				SummonNPC(Summoner, 16024, InstanceZone, 103, 46);
				SummonNPC(Summoner, 16024, InstanceZone, 48, 67);
				SummonNPC(Summoner, 16024, InstanceZone, 46, 37);//finish blade master
				SummonNPC(Summoner, 16025, InstanceZone, 33, 51);
				SummonNPC(Summoner, 16025, InstanceZone, 73, 51);
				SummonNPC(Summoner, 16025, InstanceZone, 43, 73);
				SummonNPC(Summoner, 16025, InstanceZone, 36, 35);//finish manticore
				SummonNPC(Summoner, 606, InstanceZone, 50, 50);//boss
				return;
			}
		}
		return;
	}
	int ms_GetZoneNo(int InstanceID) {
		return c_MonsterStoneZones[InstanceID];
	}
	bool MonsterStone_IsEventZone(int ZoneID) {
		for (int i = 0; i<MAXINSTANCE_MS; i++) {
			if (ZoneID == c_MonsterStoneZones[i]) {
				return true;
			}
		}
		return false;
	}
	int ms_GetInstanceIDFromZone(int ZoneNO) {
		for (int i = 0; i<MAXINSTANCE_MS; i++) {
			if (c_MonsterStoneZones[i] == ZoneNO) {
				return i;
			}
		}
		return -1;
	}
	void ms_SendRemainingTime(short RemainTime) {
		char text[1024]; memset(text, NULL, 1024);
		for (int xt = 0; xt < MAXUSERS; xt++) {
			if (IsUserConnected(xt)) {
				if (MonsterStoneUser[xt].ActiveState == 1) {
					sprintf(text, "Monster Stone remaining time: %i seconds", RemainTime);
				}
				if (MonsterStoneUser[xt].ActiveState >= 2) {
					sprintf(text, "Monster Stone will be closed in: %i seconds", RemainTime);
				}
			}
		}
		_USER_INFO* pUserInfo;
		for (int uid = 0; uid < MAXUSERS; uid++) {
			if (IsUserConnected(uid)) {
				pUserInfo = reinterpret_cast<_USER_INFO*>(GetUserInfoPointer(uid));
				if (pUserInfo->Zone == 160) {
					SendNotice(uid, text, 19, 1);
				}
			}
		}
		return;
	}

	/*
	void ms_LogExecute(LPCSTR message) {
		char text[1024]; memset(text, NULL, 1024);
		time_t rawtime;
		struct tm *ptm;
		time(&rawtime);
		ptm = localtime(&rawtime);
		sprintf(text, "-- %04d/%02d/%02d %02d:%02d:%02d %s\n", TM_YEAR_BASE + ptm->tm_year, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, message);
		MainLog.Output("MonsterStone", text, 0);
		return;
	}
	*/
#endif	
#endif

6

event może mały, ale kod duży. Zarazem niepodatny na uruchomienie bez reszty. Oczekujesz, że ktoś z forum ma w tym ryć?
Uzyj debugera.

BTW styl tego kodu jest mocno dziwny *). To Twój dorobek, czy "pożyczony" z neta?

*) Globalsy, magiczne stałe, zabezpieczenie na #define jakby struktura projektu była nie-bardzo

1

Witam, pisze sobie program który ma działac non stop bez przerwy.

O to on.
Jest 10 zone, kazde jest otwarte, gdy gracz wchodzi do zone[1].status = 0 i sie zamyka i chce zeby teraz gdy nastepny gracz uzyje jakis tam item.
uzyło zone[2].status = 0 czyli zeby przechodziło do nastepnych zone. I gdy juz po 10 minutach gracz wyjdzie, albo po prostu nie ukonczy zadania status sie zmieni na 1 i znow nastepny moze wejsc w zone[1] >lub [0].

Super, a jaki masz problem?

1 użytkowników online, w tym zalogowanych: 0, gości: 1