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