Exemple #1
0
void QuestTeleport(int aIndex, int Type) 
{
	if(gObj[aIndex].Money < 20000)
	{
		LogAdd("[%s][%s] [QUEST] short of zen for teleport quest map.\n", gObj[aIndex].AccountID, gObj[aIndex].Name);
		return;
	}

	if(Type == 0)
	{
		gObjTeleport(aIndex, 41, 36, 90);
		LogAdd("[%s][%s] [QUEST] Teleport to Barracks.\n", gObj[aIndex].AccountID, gObj[aIndex].Name);
	}

	if(Type == 1)
	{
		gObjTeleport(aIndex, 42, 96, 187);
		LogAdd("[%s][%s] [QUEST] Teleport to Refuge.\n", gObj[aIndex].AccountID, gObj[aIndex].Name);
	}


	#if (WL_PROTECT==1)
		VM_START_WITHLEVEL(3)
		g_CashShop.SystemProcessesScan();
		VM_END
	#endif

	gObj[aIndex].Money -= 20000;
	GCMoneySend(aIndex, gObj[aIndex].Money);
}
void CHatcheryEvent::Npc(int aIndex,int Monster)
{
	if(!(this->m_HatcheryEvent.m_EventState == STATE_OPEN))
	{			
		if(this->m_HatcheryEvent.m_EventState == STATE_CLOSED) 
		{
			ChatTargetSend(&gObj[Monster], "Hatchery is closed now, try again later.", aIndex);
		} 
		else 
		{	
			ChatTargetSend(&gObj[Monster], "Hatchery is running now, try again later.", aIndex);
		}
	}
	else
	{	
		for (int i = 0; i < this->m_HatcheryEvent.m_UserCount; i++)
		{
			if(this->m_HatcheryEvent.m_UserIndex[i] == aIndex)
			{
				gObjTeleport(aIndex,5,160,25);
				return;
			}
		}

		if(this->m_HatcheryEvent.m_UserCount >= MAX_PLAYERCOUNT)
		{
			ChatTargetSend(&gObj[Monster], "Hatchery is already full!", aIndex);
			return;
		}

		if(AddTab[aIndex].m_Resets < MIN_RESET)
		{
			ChatTargetSend(&gObj[Monster], "You need minimum 1 reset to join!", aIndex);
			return;
		}

		if(this->CheckTicket(aIndex) == 0)
		{
			ChatTargetSend(&gObj[Monster],"You don't have Hatchery Key.",aIndex);
			return;
		}

		this->m_HatcheryEvent.m_UserIndex[this->m_HatcheryEvent.m_UserCount] = aIndex;
		this->m_HatcheryEvent.m_UserLevel[this->m_HatcheryEvent.m_UserCount] = gObj[aIndex].Level;
		this->m_HatcheryEvent.m_UserDefense[this->m_HatcheryEvent.m_UserCount] = gObj[aIndex].m_Defense;
		this->m_HatcheryEvent.m_UserDamageMin[this->m_HatcheryEvent.m_UserCount] = (gObj[aIndex].Dexterity + gObj[aIndex].Strength + gObj[aIndex].Vitality + gObj[aIndex].Energy) / 25; // NEW
		this->m_HatcheryEvent.m_UserDamageMax[this->m_HatcheryEvent.m_UserCount] = (gObj[aIndex].Dexterity + gObj[aIndex].Strength + gObj[aIndex].Vitality + gObj[aIndex].Energy) / 20; // NEW
		this->m_HatcheryEvent.m_UserCount++;

		gObjTeleport(aIndex,5,160,25);
		gObj[aIndex].MapNumber = 3;
		Log.Info("[HatcheryEvent] (%s)(%s) Registred User", gObj[aIndex].AccountID, gObj[aIndex].Name);
	}
}
void CPlayer::Teleport(int Map,int X, int Y)
{	
	char Nickn[11];
	gObjTeleport(this->aIndex,Map,X,Y);
	this->GetName(Nickn);
	Console.Write("[Teleport][Index: %d][Nick: %s] Map %d, X %d, Y %d",this->aIndex,Nickn,Map,X,Y);
}
Exemple #4
0
void cTvTEvent::DivisionTeam()
{
	int iTeam = 1;
	int Index = 0;
	for(int i=0;i<this->TotalPlayer;i++)
	{
		Index = this->ReturnMaxReset();
		this->Player[Index].Team = iTeam;
		if(iTeam == 1) iTeam = 2;
		else iTeam = 1;
	}
	for(int n=OBJ_STARTUSERINDEX;n<OBJMAX;n++)
	{
		LPOBJ sObj = &gObj[n];
		if(sObj->Connected != PLAYER_PLAYING) continue;
		if(this->Player[n].tEvent == false) continue;
		if(this->Player[n].Team == 1)
		{
			gObjTeleport(n,this->WaitingMap,this->BluTeamX,this->BluTeamY);
			if(this->DisplayCommands == 1)
			{
				gObj[n].m_Change = 405; //"MU Allies"	Blue
				gObjViewportListProtocolCreate(&gObj[n]);
			}
			MsgNormal(n,"[BlueTeam]: %d Vs [RedTeam]: %d",this->ScoreBlue,this->ScoreRed);
		}
		else if(this->Player[n].Team == 2)
		{
			gObjTeleport(n,this->WaitingMap,this->RedTeamX,this->RedTeamY);
			if(this->DisplayCommands == 1)
			{
				gObj[n].m_Change = 404; //"MU Allies"	Red
				gObjViewportListProtocolCreate(&gObj[n]);
			}
			MsgNormal(n,"[RedTeam]: %d Vs [BlueTeam]: %d",this->ScoreRed,this->ScoreBlue);
		}	
	}
}
bool cChat::SummonCommand(LPOBJ gObj, int Index)
{
	if(CheckCommand(gObj, 1, GmSystem.cTrace, 0, 0, 0, Index, "Track", "[Name] /track", ""))
		return true;

	OBJECTSTRUCT *tObj = (OBJECTSTRUCT*)OBJECT_POINTER(Index);

	gObjTeleport(tObj->m_Index, gObj->MapNumber, (int)gObj->X, (int)gObj->Y);	
	TNotice.SendNotice(Index,1,"[Track] You successfully summoned %s",tObj->Name);

	if(GmSystem.IsAdmin(gObj->Name) == 1)
		TNotice.SendNotice(Index,1,"[Track] You was summoned to [Admin] %s", gObj->Name);		
	else if(GmSystem.IsAdmin(gObj->Name) == 2)
		TNotice.SendNotice(Index,1,"[Track] You was summoned to [GM] %s", gObj->Name);	
	return true;
}		
Exemple #6
0
void cTvTEvent::NPCClick(LPOBJ lpNpc, LPOBJ lpObj)
{
	if(!this->Enable)return;
	if(lpNpc->Class == this->NPC)
	{
		if(!this->Waiting)
		{
			MsgNormal(lpObj->m_Index,"[TvT Event] Closed");
			return;
		}
		this->Player[lpObj->m_Index].tEvent = true;
		this->Player[lpObj->m_Index].Available = true;
		this->TotalPlayer++;
		gObjTeleport(lpObj->m_Index,this->WaitingMap,this->WaitingX,this->WaitingY);
	}
}
Exemple #7
0
int CGMMng::ManagementProc(LPOBJ lpObj, char* szCmd, int aIndex)
{
	char * szCmdToken;
	char string[256]={0};
	char szId[20]={0};
	char * pId = szId;
	int len = strlen(szCmd);
	int command_number;

	if ( len < 1 || len > 250 )
	{
		return 0;
	}

	strcpy_s(string, sizeof(string), szCmd);
	szCmdToken = InitTokenString(string);
	command_number = this->GetCmd(szCmdToken);

	switch ( command_number )
	{

        case 331:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 0, pId);
        }
        break;
        case 332:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 1, pId);
        }
        break;
        case 333:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 2, pId);
        }
        break;
        case 334:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 3, pId);
        }
        break;
        case 335:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 4, pId);
        }
        break;
        case 336:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 5, pId);
        }
        break;
        case 337:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 6, pId);
        }
        break;
        case 338:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 7, pId);
        }
        break;
        case 340:
        {
                pId = this->GetTokenString();

				if (pId == NULL)
					return 0;

                g_CastleSiege.OperateGmCommand(lpObj->m_Index, 8, pId);
        }
        break;

		case 217:	//116:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, "FIRECRACK.");
				int x = lpObj->X;
				int y = lpObj->Y;
				PMSG_SERVERCMD pMsg;

				PHeadSubSetB((LPBYTE)&pMsg,0xF3,0x40, sizeof(pMsg));
				pMsg.CmdType = 0;

				for ( int i=0;i<15;i++)
				{
					pMsg.X = x+Random(0,4)*2 - 4;
					pMsg.Y = y+Random(0,4)*2 - 4;
					MsgSendV2(lpObj,(UCHAR*)&pMsg, sizeof(pMsg));
					::DataSend(lpObj->m_Index ,(UCHAR*)&pMsg, sizeof(pMsg));
				}
			}
			break;

		case 216:	//115:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				LPOBJ lpTargetObj = gObjFind(pId);

				if ( lpTargetObj == NULL )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]	[ %s ]	[ %s ] / Target : [%s][%s] : %s ",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
					lpTargetObj->Name, "User Watching");

				char szTemp[256];

				if ( this->WatchTargetIndex == lpTargetObj->m_Index )
				{
					this->WatchTargetIndex = -1;
					
					wsprintf(szTemp, "%s : Off guard", lpTargetObj->Name);	
					GCServerMsgStringSend(szTemp, lpObj->m_Index, 1);
				}
				else
				{
					wsprintf(szTemp, "%s : Start monitoring", lpTargetObj->Name);	
					GCServerMsgStringSend(szTemp, lpObj->m_Index, 1);
					this->WatchTargetIndex = lpTargetObj->m_Index;
				}
			}
			break;

		case 215:	//114:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int map;
				int iX;
				int iY;
				LPOBJ lpTargetObj = gObjFind(pId);
				int iIndex;

				if ( lpTargetObj == NULL )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
					lpTargetObj->Name, "User Tracking");
				map = lpTargetObj->MapNumber;
				iX = lpTargetObj->X;
				iY = lpTargetObj->Y;
				iIndex = lpObj->m_Index;

				if ( iIndex >= 0 )
				{
					gObjTeleport(iIndex, map, iX, iY);
				}
			}
			break;

		case 214:	//113:
			{
				if ( (lpObj->Authority & 2) != 2 )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, 
					"User Stat (connection)");

				int lc151 = 0;
				int lc152 = 400;
				int iTokenNumber = this->GetTokenNumber();

				if ( iTokenNumber > 0 )
				{
					lc151 = iTokenNumber;
				}

				int iTokenNumber2 = this->GetTokenNumber();

				if ( iTokenNumber2 > 0 )
				{
					lc152 = iTokenNumber2;
				}

				gObjSendUserStatistic(lpObj->m_Index, lc151, lc152);
			}
			break;

		case 100:	//100:
			{
				if ( (lpObj->AuthorityCode &4) != 4 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int iTargetIndex = gObjGetIndex(pId);
				
				if ( iTargetIndex == -1)
					iTargetIndex=0;

				if ( iTargetIndex >= 0 )
				{
					LPOBJ lpTargetObj = gObjFind(pId);

					if ( lpTargetObj == NULL )
					{
						return 0;
					}

					LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
						lpTargetObj->Name, "User Disconnect");
					LogAdd("%s is forced to disconnect.", pId);
					CloseClient(iTargetIndex);
				}
			}
			break;

		case 112:	//108:
			{
				if ( (lpObj->AuthorityCode &4) != 4 )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
					"Guild Disconnect");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				_GUILD_INFO_STRUCT * lpGuild = Guild.SearchGuild(pId);
				int iIndex;

				if ( lpGuild != NULL )
				{
					for ( int i=0;i<MAX_USER_GUILD ; i++ )
					{
						if ( lpGuild->Index[i] >= 0 )
						{
							iIndex = lpGuild->Index[i];

							if ( iIndex >= 0 )
							{
								LogAdd("%s is forced to disconnect.", pId);
								CloseClient(iIndex);
							}
						}
					}
				}
			}
			break;

		case 101:	//101: /move
			{
				char* map_name=this->GetTokenString();

				if (map_name == NULL)
					return 0;

				int iTokenNumber1 = this->GetTokenNumber();

				if ( (lpObj->AuthorityCode &8) == 8 && iTokenNumber1 != -1)
				{

					int iTokenNumber2 = this->GetTokenNumber();
					int iTokenNumber3 = this->GetTokenNumber();

					if (iTokenNumber2 == -1)
						iTokenNumber2 = 0;

					if (iTokenNumber3 == -1)
						iTokenNumber3 = 0;

					int iIndex = gObjGetIndex(map_name);

					if ( iIndex >= 0 )
					{
						LPOBJ lpTargetObj = gObjFind(map_name);

						if ( lpTargetObj == NULL )
						{
							return 0;
						}

						LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
							lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
							lpTargetObj->Name, "User SetPosition");

						gObjTeleport(iIndex, iTokenNumber1, iTokenNumber2, iTokenNumber3);
					}
				}
				else
				{

					int lc165 = -1;
					int lc166 = 0;
					int lc167 = 0;

					if ( lpObj->Teleport != 0 )
					{
						GCServerMsgStringSend("You are currently not able to warp.", lpObj->m_Index, 1);
						return 0;
					}

					if ( (lpObj->m_IfState.use) != 0 )
					{
						if ( lpObj->m_IfState.type  == 3 )
						{
							lpObj->TargetShopNumber = -1;
							lpObj->m_IfState.type = 0;
							lpObj->m_IfState.use = 0;
						}
					}

					if ( lpObj->m_IfState.use > 0 )
					{
						GCServerMsgStringSend("You are currently not able to warp.", lpObj->m_Index, 1);
						return 0;
					}

					if ( gObj[aIndex].IsInBattleGround != false )
					{
						GCServerMsgStringSend("You are currently not able to warp.", lpObj->m_Index, 1);
						return 0;
					}

					if ( lpObj->m_PK_Level >= gPKLvlToCantWarp )
					{
						GCServerMsgStringSend("An outlaw cannot use the /warp command. ", lpObj->m_Index, 1);
						return 0;
					}

					gMoveCommand.Move(lpObj, map_name);
				}
			}
			break;

		case 108:	//104:
			{
				if ( (lpObj->AuthorityCode &8)!= 8 )
				{
					return 0;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, 
					"Guild SetPosition");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int iTokenNumber1 = this->GetTokenNumber();
				int iTokenNumber2 = this->GetTokenNumber();
				int iTokenNumber3 = this->GetTokenNumber();

				if (iTokenNumber1 == -1)
					iTokenNumber1 = 0;

				if (iTokenNumber2 == -1)
					iTokenNumber2 = 0;

				if (iTokenNumber3 == -1)
					iTokenNumber3 = 0;

				_GUILD_INFO_STRUCT* lpGuild = Guild.SearchGuild(pId);
				int iIndex;

				if ( lpGuild != NULL )
				{
					for ( int i=0;i<MAX_USER_GUILD;i++)
					{
						if (lpGuild->Index[i] >= 0 )
						{
							iIndex = lpGuild->Index[i];
							gObjTeleport(iIndex, iTokenNumber1, iTokenNumber2++, iTokenNumber3);
						}
					}
				}
			}
			break;

		case 109:	//105:
			{
				if ( (lpObj->Authority &2)== 2 )
				{
					LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
						"Start BattleSoccer");

					BattleSoccerGoalStart(0);
				}
			}
			break;

		case 110:	//106:
			{
				if ( (lpObj->Authority &2) == 2 )
				{
					LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
						"Stop BattleSoccer");

					BattleSoccerGoalEnd(0);
				}
				else
				{
					if ( gObj[aIndex].lpGuild != NULL )
					{
						if (gObj[aIndex].lpGuild->WarType == 1 )
						{
							strcmp(gObj[aIndex].Name, gObj[aIndex].lpGuild->Names[0] );
						}
					}
				}
			}

			break;

		case 111:	//107:
			{
				if ( (lpObj->Authority & 2) == 2 )
				{
					LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, "End GuildWar");

					char * szGuild = this->GetTokenString();

					if ( szGuild != NULL )
					{
						GCManagerGuildWarEnd(szGuild);
					}
				}
				else
				{
					if ( gObj[aIndex].lpGuild != NULL && gObj[aIndex].lpGuild->lpTargetGuildNode != NULL)
					{
						if ( strcmp( gObj[aIndex].Name, gObj[aIndex].lpGuild->Names[0] ) ==  0)
						{
							if ( gObj[aIndex].lpGuild->BattleGroundIndex >= 0 && gObj[aIndex].lpGuild->WarType == 1 )
							{
								::gObjAddMsgSendDelay(&gObj[aIndex], 7, aIndex, 10000, 0);

								char szTemp[100];

								wsprintf(szTemp, "Because of %s's request, the match will end automatically in 10 seconds", gObj[aIndex].lpGuild->Names[0] );
								::GCServerMsgStringSendGuild(gObj[aIndex].lpGuild, szTemp, 1);
								::GCServerMsgStringSendGuild(gObj[aIndex].lpGuild->lpTargetGuildNode, szTemp, 1);
							}
						}
					}
				}
			}
			break;

		case 104:	//102:
			{
				if ( (lpObj->AuthorityCode&0x20 ) != 0x20 )
				{
					return FALSE;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "Ban Chatting");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return FALSE;
				}

				int Index = ::gObjGetIndex(pId);

				if ( Index >= 0 )
				{
					gObj[Index].Penalty |= 2;
				}

			}
			break;

		case 106:	//103:
			{
				if ( (lpObj->AuthorityCode & 32 ) != 32 )
				{
					return FALSE;
				}

				LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "Free Ban-Chatting");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return FALSE;
				}

				int Index = ::gObjGetIndex(pId);

				if ( Index >= 0 )
				{
					gObj[Index].Penalty &= ~2;
				}
			}
			break;

		case 200:	//109:
			{
				pId = this->GetTokenString();

				if ( pId != NULL )
				{
					if ( strlen(pId) >= 1 )
					{
						::GCGuildWarRequestResult(pId, aIndex, 0);
					}
				}
			}

			break;

		case 202:	//111:
			{
				if ( (lpObj->Authority & 2 ) == 2 )
				{
					LogAdd("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
						lpObj->Name, "Set GuildWar");
		
					pId = this->GetTokenString();

					if ( pId != NULL )
					{
						char * Rival = this->GetTokenString();

						if ( Rival != NULL )
						{
							if ( strlen(pId) >= 1 )
							{
								if ( strlen(Rival) >= 1 )
								{
									::GCManagerGuildWarSet(pId, Rival, 1);
								}
							}
						}
					}
				}
				else
				{
					if ( gEnableBattleSoccer != FALSE )
					{
						pId = this->GetTokenString();

						if ( pId != NULL )
						{
							if ( strlen(pId) >= 1 )
							{
								::GCGuildWarRequestResult(pId, aIndex, 1);
							}
						}
					}
				}
			}

			break;

		case 201:	//110:
			{
				gObjBillRequest(&gObj[aIndex]);
			}
			break;

		case 203:	//112:
			{
				pId = this->GetTokenString();

				if ( pId != NULL )
				{
					BOOL bState;

					if ( strcmp(pId, "on" ) == 0 )
					{
						bState = TRUE;
					}
					else if ( strcmp(pId, "off") == 0 )
					{
						bState = FALSE;
					}

					if ( bState >= FALSE && bState <= TRUE )
					{
						::gObjSetTradeOption(aIndex, bState);
						::gObjSetDuelOption(aIndex, bState);
					}
				}
			}
			break;

		case 320:	//117:
			{
				if ( (lpObj->Authority &2) != 2 )
				{
					return FALSE;
				}

				LogAdd("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "View the status of kundun");	
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "View the status of kundun");	

				for ( int n=0;n<MAX_VIEWPORT;n++)
				{
					if ( lpObj->VpPlayer[n].state != 0 )
					{
						if ( lpObj->VpPlayer[n].type == OBJ_MONSTER )
						{
							if ( lpObj->VpPlayer[n].number >= 0 )
							{
								LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].number];

								if ( lpTarget->Class == 275 )
								{
									TNotice pNotice(1);

									pNotice.SendToUser(lpObj->m_Index, "Kundun HP = %7.0f / %7.0f", lpTarget->Life, lpTarget->MaxLife); 
									pNotice.SendToUser(lpObj->m_Index, "Kundun RefillHP/Sec = %d RefillHP = %d RefillHPTime = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation
								}
							}
						}
					}
				}

			}
			break;

		case 321:	//118:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAdd("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP설정");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP설정");	// Require Translation

				int iLife = this->GetTokenNumber();

				if (iLife == -1)
					iLife = 0;

				for ( int n=0;n<MAX_VIEWPORT;n++)
				{
					if ( lpObj->VpPlayer[n].state != FALSE )
					{
						if ( lpObj->VpPlayer[n].type == OBJ_MONSTER )
						{
							if ( lpObj->VpPlayer[n].number >= 0 )
							{
								LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].number];

								if ( lpTarget->Class == 275 )
								{
									if  ( iLife <= 5000 )
									{
										iLife = 5000 ;
									}

									if ( iLife > lpTarget->MaxLife )
									{
										iLife = (int)lpTarget->MaxLife;
									}

									lpTarget->Life = iLife;
								
									TNotice pNotice(1);

									pNotice.SendToUser(lpObj->m_Index, "쿤둔 HP = %7.0f / %7.0f", lpTarget->Life, lpTarget->MaxLife); //Require Translation
								}
							}
						}
					}
				}
			}
			break;

		case 322:	//119:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAdd("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP회복량설정");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP회복량설정");	// Require Translation

				int RefillHP = this->GetTokenNumber();

				if ( RefillHP <= 0 || RefillHP > 5000000 )
				{
					return 0;
				}

				giKundunRefillHP = RefillHP;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "쿤둔 HP 초당회복량 = %d 회복량 = %d 회복시간 = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}

			break;

		case 323:	//120:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAdd("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP초당회복량설정");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP초당회복량설정");	// Require Translation

				int RefillHPSec = this->GetTokenNumber();

				if ( RefillHPSec <= 0 || RefillHPSec > 10000 )
				{
					return 0;
				}

				giKundunRefillHPSec = RefillHPSec;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "쿤둔 HP 초당회복량 = %d 회복량 = %d 회복시간 = %d",
					giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}

			break;

		case 324:	//121:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAdd("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP회복시간설정");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "쿤둔HP회복시간설정");	// Require Translation

				int RefillHPTime = this->GetTokenNumber();

				if ( RefillHPTime < 0 || RefillHPTime > 60000 )
				{
					return 0;
				}

				giKundunRefillHPTime = RefillHPTime;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "쿤둔 HP 초당회복량 = %d 회복량 = %d 회복시간 = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}
			break;
 
		case 345:
			g_Crywolf.OperateGmCommand(lpObj->m_Index, 1);
			break;
		case 346:
			g_Crywolf.OperateGmCommand(lpObj->m_Index, 2);
			break;
		case 347:
			g_Crywolf.OperateGmCommand(lpObj->m_Index, 3);
			break;
		case 348:
			g_Crywolf.OperateGmCommand(lpObj->m_Index, 0);
			break;

		case 369:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 0);
			break;
		case 370:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 1);
			break;
		case 371:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 2);
			break;
		case 372:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 3);
			break;
		case 373:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 4);
			break;
		case 374:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 5);
			break;
		case 375:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 6);
			break;
		case 376:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 7);
			break;
		case 377:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 8);
			break;
		case 378:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 9);
			break;
		case 379:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 10);
			break;
		case 380:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 11);
			break;
		case 381:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 12);
			break;
		case 382:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 13);
			break;
		case 383:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 14);
			break;
		case 384:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 15);
			break;
		case 385:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 16);
			break;
		case 386:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 17);
			break;
		case 387:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 18);
			break;
		case 388:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 19);
			break;
		case 389:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 20);
			break;
	    case 390:
        {
                if ( (lpObj->Authority &2 ) != 2 )
                {
                        return FALSE;
                }

                int type, index,ItemLevel,ItemSkill,ItemLuck,ItemOpt,ItemExc,ItemAncient;
                type = GetTokenNumber();
                index = GetTokenNumber();
                ItemLevel = GetTokenNumber();
                ItemSkill = GetTokenNumber();
                ItemLuck = GetTokenNumber();
                ItemOpt = GetTokenNumber();
                ItemExc = GetTokenNumber();
                ItemAncient = GetTokenNumber();

				if (type == -1)
					type = 0;
                
				if (index == -1)
					index = 0;

				if (ItemLevel == -1)
					ItemLevel = 0;

				if (ItemSkill == -1)
					ItemSkill = 0;

				if (ItemLuck == -1)
					ItemLuck = 0;

				if (ItemOpt == -1)
					ItemOpt = 0;

				if (ItemExc == -1)
					ItemExc = 0;

				if (ItemAncient == -1)
					ItemAncient = 0;

                if( (type >= 0 && type <= 15) )
                {
					int Item = ItemGetNumberMake( type, index);
					ItemSerialCreateSend(aIndex, gObj[aIndex].MapNumber, (BYTE)gObj[aIndex].X, (BYTE)gObj[aIndex].Y, Item,ItemLevel,0,ItemSkill,ItemLuck,ItemOpt,-1,ItemExc,ItemAncient);
                }
                break;
        }
        case 391:
        {
                int value = GetTokenNumber();

				if (value == -1)
					value = 0;

                g_Crywolf.OperateGmCommand(lpObj->m_Index,value);
        }
        break;

	}
	return 0;
}
bool cChat::GmoveCommand(LPOBJ gObj, char *Msg, int Index)
{					
	if(CheckCommand(gObj, Configs.Commands.IsGmove, GmSystem.cGmove, 0, 0, 3, Index, "Gmove", "[Name] /gmove <map> <x> <y>", Msg))
		return true;

	char Map[250];
	int x,y;

	sscanf(Msg,"%s %d %d", &Map, &x, &y);
	LPOBJ tObj = (OBJECTSTRUCT*)OBJECT_POINTER(Index);

	int aIndex = User.GetPlayerIndex(gObj->Name);

	int RMap;
	if(_strcmpi(Map, "0") == 0 || _strcmpi(Map, "Lorencia") == 0) RMap = MAP_INDEX_RORENCIA;
	else if	(_strcmpi(Map, "1") == 0 || _strcmpi(Map, "Dungeon") == 0) RMap = MAP_INDEX_DUNGEON;
	else if	(_strcmpi(Map, "2") == 0 || _strcmpi(Map, "Devias") == 0) RMap = MAP_INDEX_DEVIAS;
	else if (_strcmpi(Map, "3") == 0 || _strcmpi(Map, "Noria") == 0) RMap = MAP_INDEX_NORIA;
	else if (_strcmpi(Map, "4") == 0 || _strcmpi(Map, "Losttower") == 0) RMap = MAP_INDEX_LOSTTOWER;
	else if (_strcmpi(Map, "6") == 0 || _strcmpi(Map, "Stadium") == 0 || _strcmpi(Map, "Arena") == 0) RMap = MAP_INDEX_BATTLESOCCER;
	else if (_strcmpi(Map, "7") == 0 || _strcmpi(Map, "Atlans") == 0) RMap = MAP_INDEX_ATHLANSE;
	else if (_strcmpi(Map, "8") == 0 || _strcmpi(Map, "Tarkan") == 0) RMap = MAP_INDEX_TARKAN;		
	else if (_strcmpi(Map, "10") == 0 || _strcmpi(Map, "Icarus") == 0) RMap = 10;			  
	else if (_strcmpi(Map, "24") == 0 || _strcmpi(Map, "kalima1") == 0) RMap = 24;
	else if (_strcmpi(Map, "25") == 0 || _strcmpi(Map, "kalima2") == 0) RMap = 25; 
	else if (_strcmpi(Map, "26") == 0 || _strcmpi(Map, "kalima3") == 0) RMap = 26;		
	else if (_strcmpi(Map, "27") == 0 || _strcmpi(Map, "kalima4") == 0) RMap = 27;   
	else if (_strcmpi(Map, "28") == 0 || _strcmpi(Map, "kalima5") == 0) RMap = 28;
	else if (_strcmpi(Map, "29") == 0 || _strcmpi(Map, "kalima6") == 0) RMap = 29;   
	else if (_strcmpi(Map, "30") == 0 || _strcmpi(Map, "valleyofloren") == 0) RMap = 30;
	else if (_strcmpi(Map, "31") == 0 || _strcmpi(Map, "landoftrial") == 0 || _strcmpi(Map, "landsoftrial") == 0) RMap = 31;		 
	else if (_strcmpi(Map, "11") == 0 || _strcmpi(Map, "bc1") == 0) RMap = 11;   
	else if (_strcmpi(Map, "12") == 0 || _strcmpi(Map, "bc2") == 0) RMap = 12;  
	else if (_strcmpi(Map, "13") == 0 || _strcmpi(Map, "bc3") == 0) RMap = 13;   
	else if (_strcmpi(Map, "14") == 0 || _strcmpi(Map, "bc4") == 0) RMap = 14;  
	else if (_strcmpi(Map, "15") == 0 || _strcmpi(Map, "bc5") == 0) RMap = 15;  
	else if (_strcmpi(Map, "16") == 0 || _strcmpi(Map, "bc6") == 0) RMap = 16;  
	else if (_strcmpi(Map, "17") == 0 || _strcmpi(Map, "bc7") == 0) RMap = 17;    
	else if (_strcmpi(Map, "52") == 0 || _strcmpi(Map, "bc8") == 0) RMap = 52; 
	else if (_strcmpi(Map, "18") == 0 || _strcmpi(Map, "cc1") == 0) RMap = 18;
	else if (_strcmpi(Map, "19") == 0 || _strcmpi(Map, "cc2") == 0) RMap = 19;
	else if (_strcmpi(Map, "20") == 0 || _strcmpi(Map, "cc3") == 0) RMap = 20;
	else if (_strcmpi(Map, "21") == 0 || _strcmpi(Map, "cc4") == 0) RMap = 21;
	else if (_strcmpi(Map, "22") == 0 || _strcmpi(Map, "cc5") == 0) RMap = 22; 
	else if (_strcmpi(Map, "23") == 0 || _strcmpi(Map, "cc6") == 0) RMap = 23;  
	else if (_strcmpi(Map, "53") == 0 || _strcmpi(Map, "cc7") == 0) RMap = 53;    
	else if (_strcmpi(Map, "33") == 0 || _strcmpi(Map, "aida") == 0) RMap = 33;			   
	else if (_strcmpi(Map, "34") == 0 || _strcmpi(Map, "crywolf") == 0) RMap = 34;			   
	else if (_strcmpi(Map, "36") == 0 || _strcmpi(Map, "kalima7") == 0) RMap = 36;			   
	else if (_strcmpi(Map, "37") == 0 || _strcmpi(Map, "kanturu") == 0) RMap = 37;			   
	else if (_strcmpi(Map, "38") == 0 || _strcmpi(Map, "kanturutruins") == 0 || _strcmpi(Map, "kantrutruins") == 0) RMap = 38;			   
	else if (_strcmpi(Map, "39") == 0 || _strcmpi(Map, "kantrutower") == 0 || _strcmpi(Map, "kanturutower") == 0) RMap = 39;			   
	else if (_strcmpi(Map, "40") == 0 || _strcmpi(Map, "silent") == 0) RMap = 40;			   
	else if (_strcmpi(Map, "41") == 0 || _strcmpi(Map, "balgasbarrack") == 0) RMap = 41;			   
	else if (_strcmpi(Map, "42") == 0 || _strcmpi(Map, "balgasrefuge") == 0) RMap = 42;			   
	else if (_strcmpi(Map, "51") == 0 || _strcmpi(Map, "elbeland") == 0) RMap = 51;			   
	else if (_strcmpi(Map, "56") == 0 || _strcmpi(Map, "swampofcalmness") == 0 || _strcmpi(Map, "calmness") == 0) RMap = 56;			   
	else if (_strcmpi(Map, "57") == 0 || _strcmpi(Map, "raklion") == 0) RMap = 57;			   
	else if (_strcmpi(Map, "58") == 0 || _strcmpi(Map, "raklionboss") == 0) RMap = 58;			   
	else if (_strcmpi(Map, "62") == 0 || _strcmpi(Map, "santatown") == 0 || _strcmpi(Map, "santa") == 0) RMap = 62;			   
	else if (_strcmpi(Map, "63") == 0 || _strcmpi(Map, "vulcanus") == 0) RMap = 63;
	else if (_strcmpi(Map, "64") == 0 || _strcmpi(Map, "doppel1") == 0) RMap = MAP_INDEX_DOPPELGANGER_1;
	else if (_strcmpi(Map, "65") == 0 || _strcmpi(Map, "doppel2") == 0) RMap = MAP_INDEX_DOPPELGANGER_2;
	else if (_strcmpi(Map, "66") == 0 || _strcmpi(Map, "doppel3") == 0) RMap = MAP_INDEX_DOPPELGANGER_3;
	else if (_strcmpi(Map, "67") == 0 || _strcmpi(Map, "doppel4") == 0) RMap = MAP_INDEX_DOPPELGANGER_4;
	else if (_strcmpi(Map, "69") == 0 || _strcmpi(Map, "imperialfort1") == 0) RMap = MAP_INDEX_PARTYDUNGEON_DAYOFWEEK1;
	else if (_strcmpi(Map, "70") == 0 || _strcmpi(Map, "imperialfort2") == 0) RMap = MAP_INDEX_PARTYDUNGEON_DAYOFWEEK2;
	else if (_strcmpi(Map, "71") == 0 || _strcmpi(Map, "imperialfort3") == 0) RMap = MAP_INDEX_PARTYDUNGEON_DAYOFWEEK3;
	else if (_strcmpi(Map, "79") == 0 || _strcmpi(Map, "lorem market") == 0) RMap = MAP_INDEX_ROREN_MARKET;
	else if (_strcmpi(Map, "80") == 0 || _strcmpi(Map, "karutan1") == 0) RMap = MAP_INDEX_KARUTAN_1;
	else if (_strcmpi(Map, "81") == 0 || _strcmpi(Map, "karutan2") == 0) RMap = MAP_INDEX_KARUTAN_2;
	else if (_strcmpi(Map, "91") == 0 || _strcmpi(Map, "acheron") == 0) RMap = MAP_INDEX_ACHERON;
	else if (_strcmpi(Map, "92") == 0 || _strcmpi(Map, "arca") == 0) RMap = MAP_INDEX_ARCABATTLE;
	else if (_strcmpi(Map, "95") == 0 || _strcmpi(Map, "deventer") == 0) RMap = MAP_INDEX_DEVENTER;
	else if (_strcmpi(Map, "96") == 0 || _strcmpi(Map, "arcadeventer") == 0) RMap = MAP_INDEX_ARCABATTLE_DEVENTER;
	else if (_strcmpi(Map, "72") == 0 || _strcmpi(Map, "ccf") == 0) RMap = MAP_INDEX_CCF;
	else if (_strcmpi(Map, "98") == 0 || _strcmpi(Map, "itl1") == 0) RMap = MAP_INDEX_ITL1;
	else if (_strcmpi(Map, "99") == 0 || _strcmpi(Map, "itl2") == 0) RMap = MAP_INDEX_ITL2;
	else if (_strcmpi(Map, "100") == 0 || _strcmpi(Map, "uruk1") == 0) RMap = MAP_INDEX_URUK_MOUNTAIN;
	else if (_strcmpi(Map, "101") == 0 || _strcmpi(Map, "uruk2") == 0) RMap = MAP_INDEX_URUK_MOUNTAIN2;
	else if (_strcmpi(Map, "102") == 0 || _strcmpi(Map, "dsf") == 0) RMap = MAP_INDEX_DSF;
	else
	{
		TNotice.MessageLog(1,gObj,"[GMove] Such map doesn't exist!");	
		return true;
	} 
	if(x > 255 || y > 255 || x < 0 || y < 0)
	{	 								   
		TNotice.MessageLog(1,gObj,"[GMove] Such coords doesn't exist!");	
		return true;
	}  			
	gObjTeleport(tObj->m_Index, RMap, x, y);		
	if(tObj == gObj)		 
		TNotice.MessageLog(1,gObj,"[GMove] You successfully moved to %s %d %d!", Map, x, y);
	else
	{	   
		TNotice.MessageLog(1,gObj,"[GMove] You successfully move %s to %s %d %d!", tObj->Name, Map, x, y);
		TNotice.MessageLog(1,tObj,"[GMove] You successfully moved to %s %d %d by %s!", Map , x, y, gObj->Name);
	}
	return true;
}
// ----------------------------------------------------------------------------------------
void CDoubleGoer::Teleport(int aIndex)
{
	LPOBJ lpObj = &gObj[aIndex];
	// ----
	gDoubleGoer.MapCheck();
	// ----
	if ( lpObj->PartyNumber == -1 )
	{
		gDoubleGoer.PartyActived = false;
		gDoubleGoer.UserCount = 1;
		gDoubleGoer.UserIndex[0] = aIndex;
		gObjTeleport(aIndex,gDoubleGoer.EventMap,gDoubleGoer.EventX,gDoubleGoer.EventY);
		SendDoubleGoerEntranceBlock(gDoubleGoer.EventMap,aIndex,1);
		// ----
		SendMsg.MessageOut(aIndex,  0x01, "[DoubleGoer]: Event will start in %d seconds",gDoubleGoer.StandByTimer);
	}
	else
	{
		for (int i=OBJMIN;i<OBJMAX+1;i++)
		{
			// ----
			if ( gObj[i].Type != OBJ_USER )
			{
				continue;
			}
			if ( gObj[i].PartyNumber == lpObj->PartyNumber )
			{
				gDoubleGoer.UserIndex[gDoubleGoer.UserCount] = i;
				gDoubleGoer.UserCount++;
				gObjTeleport(i,gDoubleGoer.EventMap,gDoubleGoer.EventX,gDoubleGoer.EventY);
				// ----
				SendMsg.MessageOut(i,  0x01, "[DoubleGoer]: Event will start in %d seconds",gDoubleGoer.StandByTimer);
				SendDoubleGoerEntranceBlock(gDoubleGoer.EventMap,i,1);
			}
		}
		gDoubleGoer.PartyActived = true;
		SendMsg.MessageOut(aIndex,  0x01, "[DoubleGoer]: Total User Count %d",gDoubleGoer.UserCount);
	}
	for (int i=0;i<5;i++)
	{
		if ( gDoubleGoer.UserIndex[i] != 0 )
		{
			if ( (gObj[gDoubleGoer.UserIndex[i]].Level+gObj[gDoubleGoer.UserIndex[i]].MasterLevel) > gDoubleGoer.EventMaxLevel )
			{
				gDoubleGoer.EventMaxLevel = gObj[gDoubleGoer.UserIndex[i]].Level+gObj[gDoubleGoer.UserIndex[i]].MasterLevel;
			}
		}
	}

	for (int i=0;i<50;i++)
	{
		if ( (gDoubleGoer.EventMaxLevel >= gDoubleGoer.PlayerMinLvl[i]) && (gDoubleGoer.EventMaxLevel <= gDoubleGoer.PlayerMaxLvl[i]) )
		{
			gDoubleGoer.EventLevel = i;
			break;
		}
	}

	CLog.LogAdd("[DoubleGoer]: Teleport -> User Count: %d, Max Event Level: %d",gDoubleGoer.UserCount, gDoubleGoer.EventMaxLevel);
	gDoubleGoer.Running = 1;
	gDoubleGoer.StandBy = 1;
	_beginthread( StandByStart, 0, NULL  );
}
void CHatcheryEvent::SetState(int iState)
{
	this->m_HatcheryEvent.m_EventState = iState;

	switch(iState)
	{
		case STATE_CLOSED:
			ServerMsgSendAll("The Hatchery Event Closed!");
			Log.Info("[HatcheryEvent] SetState -> CLOSED");
			break;

		case STATE_OPEN:
			this->m_HatcheryEvent.m_RemainTime = m_OpenTime * 60;
			Log.Info("[HatcheryEvent] SetState -> OPEN");
			break;

		case STATE_PREPARE:
			this->m_HatcheryEvent.m_RemainTime = m_PrepareTime * 60;
			this->Calculate(this->m_HatcheryEvent.m_UserCount);
			Log.Info("[HatcheryEvent] SetState -> PREPARE");
			break;

		case STATE_BATTLE:
			this->m_HatcheryEvent.m_RemainTime = m_BattleTime * 60;

			this->SetMonsters(1);
			Log.Info("[HatcheryEvent] SetState -> BATTLE");
			break;

		case STATE_BATTLE2:
			this->SetMonsters(2);
			Log.Info("[HatcheryEvent] SetState -> BATTLE 2");
			break;

		case STATE_BATTLE3:
			this->SetMonsters(3);
			Log.Info("[HatcheryEvent] SetState -> BATTLE 3");
			break;

		case STATE_BATTLE4:
			this->SetMonsters(4);
			Log.Info("[HatcheryEvent] SetState -> BATTLE 4");
			break;

		case STATE_END:
			for (int i = 0; i < this->m_HatcheryEvent.m_UserCount; i++)
			{
				if (this->m_HatcheryEvent.m_UserIndex[i] != 0)
				{
					if (OnlineStatus(gObj[this->m_HatcheryEvent.m_UserIndex[i]].m_Index) == true)
					{
						if (gObj[this->m_HatcheryEvent.m_UserIndex[i]].MapNumber == 5)
						{
							gObjTeleport(this->m_HatcheryEvent.m_UserIndex[i],3,20,243);
						}
					}
				}

				this->m_HatcheryEvent.m_UserIndex[i] = 0;
			}

			for (int i = 0; i < this->m_MonsterCount; i++)
			{
				if (this->m_HatcheryEvent.m_MonsterIndex[i] != -1)
				{
					gObjDel(this->m_HatcheryEvent.m_MonsterIndex[i]);
					this->m_HatcheryEvent.m_MonsterIndex[i] = -1;
				}	
			}

			this->m_HatcheryEvent.m_RemainTime = 0;
			this->m_HatcheryEvent.m_UserCount = 0;
			this->m_HatcheryEvent.m_SpawnedMonsters = 0;
			this->m_HatcheryEvent.m_EventState = STATE_CLOSED;
			Log.Info("[HatcheryEvent] SetState -> END");

			this->SetState(STATE_CLOSED);
			break;
	}
}
// -----------------------------------------------------------------------------------------------------------------------
void CIllusionTemple::UseSkillProc(OBJECTSTRUCT* lpObj, PMSG_ILLUSION_USESKILL* pMsg)
{
	LPOBJ lpTargetObj = &gObj[pMsg->m_TargetIndex];

	int TargePosx = lpTargetObj->X;
	int TargePosy = lpTargetObj->Y;

	int iangle = gObjUseSkill.GetAngle(lpObj->X,lpObj->Y,TargePosx,TargePosy);

	if(!(IT_FLOOR_RANGE(lpObj->m_IllusionIndex) && IT_MAP_RANGE(lpObj->MapNumber)))
	{
		GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1);
		return;
	}

	int SkillPoint = MagicDamageC.CheckKillCount(pMsg->m_SkillIndex, lpObj->m_IllusionKillCount);

	if(SkillPoint < 0)
	{
		GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1);
		CLog.LogAddC(2, "[IllusionTemple][%s] Use skill without enough points (%d)(%d)", lpObj->Name, lpObj->m_IllusionKillCount, pMsg->m_SkillIndex);
		return;
	}

	switch(pMsg->m_SkillIndex)
	{
		case IT_SKILL_SHIELD:
		{
			if(lpObj->m_IllusionShieldSkillTime > 0)
			{
				GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0);
				return;
			}

			if(lpObj->Mana < MagicDamageC.SkillGetMana(IT_SKILL_SHIELD))
			{
				GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0);
				return;
			}

			lpObj->Mana -= MagicDamageC.SkillGetMana(IT_SKILL_SHIELD);
			GCManaSend(lpObj->m_Index, (short)lpObj->Mana, 0xFF, 0, lpObj->BP);
			lpObj->m_IllusionShieldSkillTime = MagicDamageC.GetDelayTime(IT_SKILL_SHIELD);
			GCStateInfoSend(lpObj, 1, eVS_ILLUSION_PROTECTION);
			gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_SHIELD));
			GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 1);
		}break;

		case IT_SKILL_RESIST:
		{
			if(lpObj->Type != OBJ_USER )
			{
				CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex );
				return;
			}

			if(gObjCalDistance(lpObj,lpTargetObj) <= 4)
			{
				if(SkillElectricSparkHitBox.HitCheck(iangle,lpObj->X,lpObj->Y,lpObj->X,lpObj->Y))
				{
					lpTargetObj->m_btSkillRestraintOrder = TRUE;
					lpTargetObj->m_btSkillRestraintOrderTime = 15;
					//this->GCEffectSkillSend(aIndex,lpTargetObj->m_Index,lpMagic->m_Skill,btType);
					gObjSetPosition(lpObj->m_Index,lpObj->X,lpObj->Y);
				}
			}
		}break;

		case IT_SKILL_TRACK:
		{
			if(lpObj->m_Index != this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner)
			{
				if(OBJMAX_RANGE(this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner))
				{
					gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_TRACK));
					gObjTeleport(lpObj->m_Index, gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].MapNumber, 
						gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].X, 
						gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].Y); 
				}
			}
		}break;

		case IT_SKILL_FREEZE:
		{
			if(lpObj->Type != OBJ_USER )
			{
				CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex );
				return;
			}

			lpObj->iShield -= (lpObj->iMaxShield / 2);

			if( lpObj->iShield < 0 )
			{
				lpObj->iShield = 0;
			}

			GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield);
			GCSendEffectInfo(lpTargetObj->m_Index, 17);
		}break;
	}
}
void ImperialFort_StartStandBy(void * lpParam)
{
	while(true)
	{	
		Sleep(1000);
		if(Imperial.StandByRun == 0)
		{	
			_endthread();
		}

		if(Imperial.StartStandByTimer < 1)
		{	
			Imperial.StartStandByTimer = 0;
			ImperialMain.Status = 1;
			_beginthread( ImperialFort_StartStage1, 0, NULL  );

			_endthread();
		}

		Imperial.StartStandByTimer -= 4;

		PMSG_FORT_EVENT_TIMER pMsg;
		pMsg.h.c = 0xC1;
		pMsg.h.size = 0x0D;
		pMsg.h.headcode = 0xF7;
		pMsg.h.subcode = 0x04;
		pMsg.Status = 0x01;
		pMsg.Unk4 = 0x00;
		pMsg.TimerL = LOBYTE(Imperial.StartStandByTimer);
		pMsg.TimerH = HIBYTE(Imperial.StartStandByTimer);
		pMsg.Unk5 = 0x00;
		pMsg.Mob = 0;
		
		BYTE Packet[13] = {0xC1, 0x0D, 0xF7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{	
			GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);
				
			if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{	
				DataSend(i, (BYTE*)&pMsg, pMsg.h.size);
			}
			else if(gObj->Connected == 3 && gObj->MapNumber != Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{
				DataSend(i, &Packet[0], Packet[1]);
				Imperial.EventClearIndex(i);

				_endthread();
			}
			else if(UserCountInMap(Imperial.EventMap) == 0 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{	
				DataSend(i, &Packet[0], Packet[1]);
				Imperial.EventClear();
				_endthread();
			}
			else
			{	
				if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1)
				{
				gObjTeleport(i,0,125,125);
				}
			}
		}
	}
	_endthread();
}
Exemple #13
0
int CGMMng::ManagementProc(LPOBJ lpObj, char* szCmd, int aIndex)
{
	char * szCmdToken;
	char string[256];
	char szId[20];
	char * pId = szId;
	int len = strlen(szCmd);
	int command_number;

	if ( len < 1 || len > 250 )
	{
		return 0;
	}

	memset(szId, 0, sizeof(szId));
	strcpy(string, szCmd);
	szCmdToken = strtok(string, " ");
	command_number = this->GetCmd(szCmdToken);

	strcpy(Message, szCmd);

	if ( stricmp(szCmdToken, "/add0") == 0 )
	{
		int nAddStrength = 100;
		LevelUpPointAdd(0,nAddStrength,aIndex);
		GCSendEffectInfo(aIndex, 17);
	}
	if ( stricmp(szCmdToken, "/add1") == 0 )
	{
		int nAddStrength = 100;
		LevelUpPointAdd(1,nAddStrength,aIndex);
		GCSendEffectInfo(aIndex, 3);
	}
	if ( stricmp(szCmdToken, "/add2") == 0 )
	{
		int nAddStrength = 100;
		LevelUpPointAdd(2,nAddStrength,aIndex);
		GCSendEffectInfo(aIndex, 17);
	}
	if ( stricmp(szCmdToken, "/add3") == 0 )
	{
		int nAddStrength = 100;
		LevelUpPointAdd(3,nAddStrength,aIndex);
		GCSendEffectInfo(aIndex, 17);
	}
	switch ( command_number )
	{
		#if(GS_CASTLE == 1)
		case 331:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 0, pId);
		}
		break;
		case 332:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 1, pId);
		}
		break;
		case 333:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 2, pId);
		}
		break;
		case 334:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 3, pId);
		}
		break;
		case 335:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 4, pId);
		}
		break;
		case 336:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 5, pId);
		}
		break;
		case 337:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 6, pId);
		}
		break;
		case 338:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 7, pId);
		}
		break;
		case 340:
		{
			pId = this->GetTokenString();
			g_CastleSiege.OperateGmCommand(lpObj->m_Index, 8, pId);
		}
		break;
#endif
		case 502:
			{
				MMSG->Msg(lpObj->m_Index,"@@God of MuGlobal is Wolf");
				break;
			}
		case 501:
			{
				int OnlineCount = 0;
				for (int n=OBJ_STARTUSERINDEX;n<OBJMAX;n++)
				{
					if(gObjIsConnected(n))
						OnlineCount++;
				}
				MMSG->Msg(lpObj->m_Index,"[%d] Online Players",OnlineCount);
				break;
			}
		case 500:
			{
				char* szuText = this->GetTokenString();
				if(szuText != NULL)
				{
					int uTick = GetTickCount();
					//if(lpObj->Money < 299999);
					//{
					//	MMSG->Msg(lpObj->m_Index,"@[POST] Eww ti co - bisplatnij sir toka v mi6elovki");
					//	return 0;
					//}
					//{
					//	MMSG->Msg(lpObj->m_Index,"@[POST] Eww ti co - level netu :(");
					//	return 0;
					//}
					if(lpObj->Money < 500000)
					{
						MMSG->Msg(lpObj->m_Index,"@[POST] You need 500k Zen to POST");
						return 0;
					}
					if(lpObj->Level < 50)
					{
						MMSG->Msg(lpObj->m_Index,"@[POST] You need 50 Level to POST");
						return 0;
					}
					else
					{
						char *Content = (char*) Message;
						GetLongParam(Message, Content);
						lpObj->Money -= 500000;
						GCMoneySend(lpObj->m_Index , lpObj->Money);
						wsprintf(szuTemp,"[POST] %s: %s",lpObj->Name,Message);
						MMSG->PMAll(szuTemp);
						return 0;
					}
				}
				else
				{
					MMSG->Msg(lpObj->m_Index,"@[POST] The Correct Syntax is: /post message");
					return 0;
				}
				break;
			}
			case 503:	// MakeSet CMD
			{
								if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}
				if (!strcmpi(Message, "/MakeSet"))
				{
					MMSG->Msg(aIndex, "Useage: /Make <Name> <Index> <Level> <Option> <Skill> <Luck> <Exc> <Ancient> <Amount> <Dur>");
					return 0;
				}
				//Name Index Level Option Skill Luck Exc Ancient Amount Dur
				char Name[100];
				memset(Name, 0, 100);
				int Index, Level, Option, Luck, Skill, Exc, Ancient, Amount, Dur; 
				char ParamBuff[100];
				memset(ParamBuff, 0, 100);
				GetParam(1, Message, ParamBuff);
				strcpy(Name, ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(2, Message, ParamBuff)) strcpy(ParamBuff, "0");
				Index = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(3, Message, ParamBuff)) strcpy(ParamBuff, "13");
				Level = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(4, Message, ParamBuff)) strcpy(ParamBuff, "4");
				Option = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(5, Message, ParamBuff)) strcpy(ParamBuff, "1");
				Luck = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(6, Message, ParamBuff)) strcpy(ParamBuff, "1");
				Skill = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(7, Message, ParamBuff)) strcpy(ParamBuff, "127");
				Exc = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(8, Message, ParamBuff)) strcpy(ParamBuff, "0");
				Ancient = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(9, Message, ParamBuff)) strcpy(ParamBuff, "1");
				Amount = atoi(ParamBuff);
				memset(ParamBuff, 0, 100);
				if (!GetParam(10, Message, ParamBuff)) strcpy(ParamBuff, "255");
				Dur = atoi(ParamBuff);
				int tIndex = gObjGetIndexByName(Name);
				if (!tIndex) return 0;
				for (int i=0; i<Amount; i++)
				{
					for (int type=7; type<12; type++)
						ItemSerialCreateSend(tIndex, lpObj->MapNumber, lpObj->X, lpObj->Y, type*512 + Index, Level, Dur, Skill, Luck, Option, tIndex, Exc, Ancient);
				}
				break;
			}
		case 218:
			{
				AllSendServerMsg("[MU GLOBAL ADMINISTRATORS]");
				AllSendServerMsg("Sacred & Wolf");
				AllSendServerMsg("www.muglobal.ru");
				break;
			}
		case 217:	//116:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, "FIRECRACK.");
				int x = lpObj->X;
				int y = lpObj->Y;
				PMSG_SERVERCMD pMsg;

				PHeadSubSetB((LPBYTE)&pMsg,0xF3,0x40, sizeof(pMsg));
				pMsg.CmdType = 0;

				for ( int i=0;i<15;i++)
				{
					pMsg.X = x+(rand() % 5)*2 - 4;
					pMsg.Y = y+(rand() % 5)*2 - 4;
					MsgSendV2(lpObj,(UCHAR*)&pMsg, sizeof(pMsg));
					::DataSend(lpObj->m_Index ,(UCHAR*)&pMsg, sizeof(pMsg));
				}
			}
			break;

		case 216:	//115:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				LPOBJ lpTargetObj = gObjFind(pId);

				if ( lpTargetObj == NULL )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]	[ %s ]	[ %s ] / Target : [%s][%s] : %s ",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
					lpTargetObj->Name, "User Watching");

				char szTemp[256];

				if ( this->WatchTargetIndex == lpTargetObj->m_Index )
				{
					this->WatchTargetIndex = -1;
					
					wsprintf(szTemp, "%s : °¨½ÃÇØÁ¦", lpTargetObj->Name);	// #translation
					GCServerMsgStringSend(szTemp, lpObj->m_Index, 1);
				}
				else
				{
					wsprintf(szTemp, "%s : °¨½Ã½ÃÀÛ", lpTargetObj->Name);	// #translation
					GCServerMsgStringSend(szTemp, lpObj->m_Index, 1);
					this->WatchTargetIndex = lpTargetObj->m_Index;
				}
			}
			break;

		case 215:	//114:
			{
				if ( (lpObj->Authority & 2) != 2 && (lpObj->Authority & 0x20) != 0x20 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int map;
				int iX;
				int iY;
				LPOBJ lpTargetObj = gObjFind(pId);
				int iIndex;

				if ( lpTargetObj == NULL )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
					lpTargetObj->Name, "User Tracking");
				map = lpTargetObj->MapNumber;
				iX = lpTargetObj->X;
				iY = lpTargetObj->Y;
				iIndex = lpObj->m_Index;

				if ( iIndex >= 0 )
				{
					gObjTeleport(iIndex, map, iX, iY);
				}
			}
			break;

		case 214:	//113:
			{
				if ( (lpObj->Authority & 2) != 2 )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, 
					"User Stat (connection)");

				int lc151 = 0;
				int lc152 = 400;
				int iTokenNumber = this->GetTokenNumber();

				if ( iTokenNumber > 0 )
				{
					lc151 = iTokenNumber;
				}

				int iTokenNumber2 = this->GetTokenNumber();

				if ( iTokenNumber2 > 0 )
				{
					lc152 = iTokenNumber2;
				}

				gObjSendUserStatistic(lpObj->m_Index, lc151, lc152);
			}
			break;

		case 100:	//100:
			{
				if ( (lpObj->AuthorityCode &4) != 4 )
				{
					return 0;
				}

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int iTargetIndex = gObjGetIndex(pId);
				

				if ( iTargetIndex >= 0 )
				{
					LPOBJ lpTargetObj = gObjFind(pId);

					if ( lpTargetObj == NULL )
					{
						return 0;
					}

					LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
						lpTargetObj->Name, "User Disconnect");
					LogAdd(lMsg.Get(MSGGET(1, 191)), pId);
					CloseClient(iTargetIndex);
				}
			}
			break;

		case 112:	//108:
			{
				if ( (lpObj->AuthorityCode &4) != 4 )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
					"Guild Disconnect");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				_GUILD_INFO_STRUCT * lpGuild = Guild.SearchGuild(pId);
				int iIndex;

				if ( lpGuild != NULL )
				{
					for ( int i=0;i<MAX_USER_GUILD ; i++ )
					{
						if ( lpGuild->Index[i] >= 0 )
						{
							iIndex = lpGuild->Index[i];

							if ( iIndex >= 0 )
							{
								LogAdd(lMsg.Get(MSGGET(1, 191)), pId);
								CloseClient(iIndex);
							}
						}
					}
				}
			}
			break;

		case 101:	//101:
			{
				if ( (lpObj->AuthorityCode &8) == 8 )
				{
					pId = this->GetTokenString();

					if ( pId == NULL )
					{
						return 0;
					}

					int iTokenNumber1 = this->GetTokenNumber();
					int iTokenNumber2 = this->GetTokenNumber();
					int iTokenNumber3 = this->GetTokenNumber();
					int iIndex = gObjGetIndex(pId);
					LPOBJ lpTargetObj;

					if ( iIndex >= 0 )
					{
						lpTargetObj = gObjFind(pId);

						if ( lpTargetObj == NULL )
						{
							return 0;
						}

						LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] / Target : [%s][%s] : %s",
							lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, lpTargetObj->AccountID,
							lpTargetObj->Name, "User SetPosition");

						gObjTeleport(iIndex, iTokenNumber1, iTokenNumber2, iTokenNumber3);
					}
				}
				else
				{
					pId = this->GetTokenString();

					if ( pId != NULL )
					{
						int lc165 = -1;
						int lc166 = 0;
						int lc167 = 0;

						if ( lpObj->Teleport != 0 )
						{
							GCServerMsgStringSend(lMsg.Get(MSGGET(6, 68)), lpObj->m_Index, 1);
							return 0;
						}

						if ( (lpObj->m_IfState.use) != 0 )
						{
							if ( lpObj->m_IfState.type  == 3 )
							{
								lpObj->TargetShopNumber = -1;
								lpObj->m_IfState.type = 0;
								lpObj->m_IfState.use = 0;
							}
						}

						if ( lpObj->m_IfState.use > 0 )
						{
							GCServerMsgStringSend(lMsg.Get(MSGGET(6, 68)), lpObj->m_Index, 1);
							return 0;
						}

						if ( gObj[aIndex].IsInBattleGround != false )
						{
							GCServerMsgStringSend(lMsg.Get(MSGGET(6, 68)), lpObj->m_Index, 1);
							return 0;
						}

						if ( lpObj->m_PK_Level >= 6 )
						{
							GCServerMsgStringSend(lMsg.Get(MSGGET(4, 101)), lpObj->m_Index, 1);
							return 0;
						}

						gMoveCommand.Move(lpObj, pId);
					}
				}
			}
			break;

		case 108:	//104:
			{
				if ( (lpObj->AuthorityCode &8)!= 8 )
				{
					return 0;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
					lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, 
					"Guild SetPosition");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return 0;
				}

				int iTokenNumber1 = this->GetTokenNumber();
				int iTokenNumber2 = this->GetTokenNumber();
				int iTokenNumber3 = this->GetTokenNumber();
				_GUILD_INFO_STRUCT* lpGuild = Guild.SearchGuild(pId);
				int iIndex;

				if ( lpGuild != NULL )
				{
					for ( int i=0;i<MAX_USER_GUILD;i++)
					{
						if (lpGuild->Index[i] >= 0 )
						{
							iIndex = lpGuild->Index[i];
							gObjTeleport(iIndex, iTokenNumber1, iTokenNumber2++, iTokenNumber3);
						}
					}
				}
			}
			break;

		case 109:	//105:
			{
				if ( (lpObj->Authority &2)== 2 )
				{
					LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
						"Start BattleSoccer");

					BattleSoccerGoalStart(0);
				}
			}
			break;

		case 110:	//106:
			{
				if ( (lpObj->Authority &2) == 2 )
				{
					LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name,
						"Stop BattleSoccer");

					BattleSoccerGoalEnd(0);
				}
				else
				{
					if ( gObj[aIndex].lpGuild != NULL )
					{
						if (gObj[aIndex].lpGuild->WarType == 1 )
						{
							strcmp(gObj[aIndex].Name, gObj[aIndex].lpGuild->Names[0] );
						}
					}
				}
			}

			break;

		case 111:	//107:
			{
				if ( (lpObj->Authority & 2) == 2 )
				{
					LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s",
						lpObj->Ip_addr, lpObj->AccountID, lpObj->Name, "End GuildWar");

					char * szGuild = this->GetTokenString();

					if ( szGuild != NULL )
					{
						GCManagerGuildWarEnd(szGuild);
					}
				}
				else
				{
					if ( gObj[aIndex].lpGuild != NULL && gObj[aIndex].lpGuild->lpTargetGuildNode != NULL)
					{
						if ( strcmp( gObj[aIndex].Name, gObj[aIndex].lpGuild->Names[0] ) ==  0)
						{
							if ( gObj[aIndex].lpGuild->BattleGroundIndex >= 0 && gObj[aIndex].lpGuild->WarType == 1 )
							{
								::gObjAddMsgSendDelay(&gObj[aIndex], 7, aIndex, 10000, 0);

								char szTemp[100];

								wsprintf(szTemp, lMsg.Get(MSGGET(4, 129)), gObj[aIndex].lpGuild->Names[0] );
								::GCServerMsgStringSendGuild(gObj[aIndex].lpGuild, szTemp, 1);
								::GCServerMsgStringSendGuild(gObj[aIndex].lpGuild->lpTargetGuildNode, szTemp, 1);
							}
						}
					}
				}
			}
			break;

		case 104:	//102:
			{
				if ( (lpObj->AuthorityCode&0x20 ) != 0x20 )
				{
					return FALSE;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "Ban Chatting");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return FALSE;
				}

				int Index = ::gObjGetIndex(pId);

				if ( Index >= 0 )
				{
					gObj[Index].Penalty |= 2;
				}

			}
			break;

		case 106:	//103:
			{
				if ( (lpObj->AuthorityCode & 32 ) != 32 )
				{
					return FALSE;
				}

				LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "Free Ban-Chatting");

				pId = this->GetTokenString();

				if ( pId == NULL )
				{
					return FALSE;
				}

				int Index = ::gObjGetIndex(pId);

				if ( Index >= 0 )
				{
					gObj[Index].Penalty &= ~2;
				}
			}
			break;

		case 200:	//109:
			{
				pId = this->GetTokenString();

				if ( pId != NULL )
				{
					if ( strlen(pId) >= 1 )
					{
						::GCGuildWarRequestResult(pId, aIndex, 0);
					}
				}
			}

			break;

		case 202:	//111:
			{
				if ( (lpObj->Authority & 2 ) == 2 )
				{
					LogAddTD("Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
						lpObj->Name, "Set GuildWar");
		
					pId = this->GetTokenString();

					if ( pId != NULL )
					{
						char * Rival = this->GetTokenString();

						if ( Rival != NULL )
						{
							if ( strlen(pId) >= 1 )
							{
								if ( strlen(Rival) >= 1 )
								{
									::GCManagerGuildWarSet(pId, Rival, 1);
								}
							}
						}
					}
				}
				else
				{
					if ( gEnableBattleSoccer != FALSE )
					{
						pId = this->GetTokenString();

						if ( pId != NULL )
						{
							if ( strlen(pId) >= 1 )
							{
								::GCGuildWarRequestResult(pId, aIndex, 1);
							}
						}
					}
				}
			}

			break;

		case 201:	//110:
			{
				gObjBillRequest(&gObj[aIndex]);
			}
			break;

		case 203:	//112:
			{
				pId = this->GetTokenString();

				if ( pId != NULL )
				{
					BOOL bState;

					if ( strcmp(pId, "on" ) == 0 )
					{
						bState = TRUE;
					}
					else if ( strcmp(pId, "off") == 0 )
					{
						bState = FALSE;
					}

					if ( bState >= FALSE && bState <= TRUE )
					{
						::gObjSetTradeOption(aIndex, bState);
						::gObjSetDuelOption(aIndex, bState);
					}
				}
			}
			break;

		case 320:	//117:
			{
				if ( (lpObj->Authority &2) != 2 )
				{
					return FALSE;
				}

				LogAddTD("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐ»óź¸±â");	// #translation Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐ»óź¸±â");	// #translation  Require Translation

				for ( int n=0;n<MAX_VIEWPORT;n++)
				{
					if ( lpObj->VpPlayer[n].state != 0 )
					{
						if ( lpObj->VpPlayer[n].type == OBJ_MONSTER )
						{
							if ( lpObj->VpPlayer[n].number >= 0 )
							{
								LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].number];

								if ( lpTarget->Class == 275 )
								{
									TNotice pNotice(1);

									pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP = %7.0f / %7.0f", lpTarget->Life, lpTarget->MaxLife); //Require Translation
									pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP ÃÊ´çȸº¹·® = %d ȸº¹·® = %d ȸº¹½Ã°£ = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation
								}
							}
						}
					}
				}

			}
			break;

		case 321:	//118:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAddTD("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHP¼³Á¤");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHP¼³Á¤");	// Require Translation

				int iLife = this->GetTokenNumber();

				for ( int n=0;n<MAX_VIEWPORT;n++)
				{
					if ( lpObj->VpPlayer[n].state != FALSE )
					{
						if ( lpObj->VpPlayer[n].type == OBJ_MONSTER )
						{
							if ( lpObj->VpPlayer[n].number >= 0 )
							{
								LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].number];

								if ( lpTarget->Class == 275 )
								{
									if  ( iLife <= 5000 )
									{
										iLife = 5000 ;
									}

									if ( iLife > lpTarget->MaxLife )
									{
										iLife = lpTarget->MaxLife;
									}

									lpTarget->Life = iLife;
								
									TNotice pNotice(1);

									pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP = %7.0f / %7.0f", lpTarget->Life, lpTarget->MaxLife); //Require Translation
								}
							}
						}
					}
				}
			}
			break;

		case 322:	//119:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAddTD("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPȸº¹·®¼³Á¤");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPȸº¹·®¼³Á¤");	// Require Translation

				int RefillHP = this->GetTokenNumber();

				if ( RefillHP <= 0 || RefillHP > 5000000 )
				{
					return 0;
				}

				giKundunRefillHP = RefillHP;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP ÃÊ´çȸº¹·® = %d ȸº¹·® = %d ȸº¹½Ã°£ = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}

			break;

		case 323:	//120:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAddTD("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPÃÊ´çȸº¹·®¼³Á¤");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPÃÊ´çȸº¹·®¼³Á¤");	// Require Translation

				int RefillHPSec = this->GetTokenNumber();

				if ( RefillHPSec <= 0 || RefillHPSec > 10000 )
				{
					return 0;
				}

				giKundunRefillHPSec = RefillHPSec;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP ÃÊ´çȸº¹·® = %d ȸº¹·® = %d ȸº¹½Ã°£ = %d",
					giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}

			break;

		case 324:	//121:
			{
				if ( (lpObj->Authority &2 ) != 2 )
				{
					return FALSE;
				}

				LogAddTD("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPȸº¹½Ã°£¼³Á¤");	// Require Translation
				KUNDUN_GM_LOG.Output("[KUNDUN] Use GM Command -> [ %s ]\t[ %s ]\t[ %s ] : %s", lpObj->Ip_addr, lpObj->AccountID,
					lpObj->Name, "ÄïµÐHPȸº¹½Ã°£¼³Á¤");	// Require Translation

				int RefillHPTime = this->GetTokenNumber();

				if ( RefillHPTime < 0 || RefillHPTime > 60000 )
				{
					return 0;
				}

				giKundunRefillHPTime = RefillHPTime;

				TNotice pNotice(0);

				pNotice.SendToUser(lpObj->m_Index, "ÄïµÐ HP ÃÊ´çȸº¹·® = %d ȸº¹·® = %d ȸº¹½Ã°£ = %d", giKundunRefillHPSec, giKundunRefillHP, giKundunRefillHPTime);	// Require Translation

			}
			break;
		case 369:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 0);
			break;
		case 370:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 1);
			break;
		case 371:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 2);
			break;
		case 372:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 3);
			break;
		case 373:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 4);
			break;
		case 374:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 5);
			break;
		case 375:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 6);
			break;
		case 376:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 7);
			break;
		case 377:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 8);
			break;
		case 378:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 9);
			break;
		case 379:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 10);
			break;
		case 380:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 11);
			break;
		case 381:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 12);
			break;
		case 382:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 13);
			break;
		case 383:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 14);
			break;
		case 384:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 15);
			break;
		case 385:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 16);
			break;
		case 386:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 17);
			break;
		case 387:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 18);
			break;
		case 388:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 19);
			break;
		case 389:
			g_Kanturu.OperateGmCommand(lpObj->m_Index, 20);
			break;
	}
	return 0;
}
void ImperialFort_StartStage2(void * lpParam)
{
	while(true)
	{	
		BYTE Packet[13] = {0xC1, 0x0D, 0xF7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
		
		if(ImperialMobCfg.nMonsterOfEvent <= 0)
		{	
			//Prepare to Stage 3 (kill gates)(move to position)
			ImperialMain.Status = 3;
			ImperialMain.Stage = 2;

			Imperial.CanUseTwisting = 1;

			PMSG_FORT_EVENT_TIMER pMsg;
			pMsg.h.c = 0xC1;
			pMsg.h.size = 0x0D;
			pMsg.h.headcode = 0xF7;
			pMsg.h.subcode = 0x04;
			pMsg.Status = 0x01;
			pMsg.Unk4 = 0x00;
			pMsg.TimerL = 0;
			pMsg.TimerH = 0;
			pMsg.Unk5 = 0x00;
			pMsg.Mob = 0;
			
			for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
			{	
				GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);

				if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 2 && (ImperialMain.Status == 3 || ImperialMain.Status == 0))
				{	
					DataSend(i, (BYTE*)&pMsg, pMsg.h.size);
				}
			}
			Imperial.StandByTimer = 144;
			_beginthread( ImperialFort_StandBy2, 0, NULL  );

			_endthread();
		}

		if(Imperial.Stage2Timer <= 0)
		{	
			for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
			{	
				GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);

				if(gObj->Connected == 3)
				{	
					if(ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
					{	
						DataSend(i, &Packet[0], Packet[1]); //Send Fail Message
						gObjTeleport(i,0,125,124);
							
						//Clear Event 2
						Imperial.EventClearIndex(i);
					}
				}
			}
			_endthread();
		}

		Imperial.Stage2Timer -= 4;

		PMSG_FORT_EVENT_TIMER pMsg;
		pMsg.h.c = 0xC1;
		pMsg.h.size = 0x0D;
		pMsg.h.headcode = 0xF7;
		pMsg.h.subcode = 0x04;
		pMsg.Status = 0x02;
		pMsg.Unk4 = 0x00;
		pMsg.TimerL = LOBYTE(Imperial.Stage2Timer);
		pMsg.TimerH = HIBYTE(Imperial.Stage2Timer);
		pMsg.Unk5 = 0x00;
		pMsg.Mob = ImperialMobCfg.nMonsterOfEvent;

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{	
			GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);		
			if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 2 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3) )
			{	
				DataSend(i, (BYTE*)&pMsg, pMsg.h.size);
			}
			else if(gObj->Connected == 3 && gObj->MapNumber != Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 2 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
			{	
				DataSend(i, &Packet[0], Packet[1]);

				Imperial.EventClear();
				_endthread();
			}
			else if(UserCountInMap(Imperial.EventMap) == 0 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 2 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
			{	
				DataSend(i, &Packet[0], Packet[1]);

				Imperial.EventClear();
				_endthread();
			}
			else
			{	
				if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1 && ImperialMain.Stage == 2 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
				{
				gObjTeleport(i,0,125,125);
				//Imperial.EventClear();

				//_endthread();
				}
			}
		}
		Sleep(1000);
	}
	_endthread();
}
void ImperialFort_StandBy2(void * lpParam)
{
	while(true)
	{	
		if(Imperial.StandByTimer < 1)
		{	
			Imperial.StandByTimer = 0;
			ImperialMain.Status = 3;
			ImperialMain.Stage = 3;

			Imperial.CanUseTwisting = 1;

			MonstersDelete();
			if(Imperial.EventDay == 1)
			{
			SetMobs(1,1,"ImperialMobs.dat",2);
			}
			else if(Imperial.EventDay == 2)
			{
			SetMobs(2,2,"ImperialMobs.dat",2);
			}
			else if(Imperial.EventDay == 3)
			{
			SetMobs(3,3,"ImperialMobs.dat",2);
			}
			else if(Imperial.EventDay == 4)
			{
			SetMobs(4,4,"ImperialMobs.dat",2);
			}

			_beginthread( ImperialFort_StartStage3, 0, NULL  );

			_endthread();
		}

		Imperial.StandByTimer -= 4;

		PMSG_FORT_EVENT_TIMER pMsg;
		pMsg.h.c = 0xC1;
		pMsg.h.size = 0x0D;
		pMsg.h.headcode = 0xF7;
		pMsg.h.subcode = 0x04;
		pMsg.Status = 0x01;
		pMsg.Unk4 = 0x00;
		pMsg.TimerL = LOBYTE(Imperial.StandByTimer);
		pMsg.TimerH = HIBYTE(Imperial.StandByTimer);
		pMsg.Unk5 = 0x00;
		pMsg.Mob = 0;
		
		BYTE Packet[13] = {0xC1, 0x0D, 0xF7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{	
			GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);
				
			if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{	
				DataSend(i, (BYTE*)&pMsg, pMsg.h.size);
			}
			else if(gObj->Connected == 3 && gObj->MapNumber != Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{
				DataSend(i, &Packet[0], Packet[1]);
				Imperial.EventClear();
				_endthread();
			}
			else if(UserCountInMap(Imperial.EventMap) == 0 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
			{	
				DataSend(i, &Packet[0], Packet[1]);
				Imperial.EventClear();
				_endthread();
			}
			else
			{	
				if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1)
				{
				gObjTeleport(i,0,125,125);
				//Imperial.EventClear();
				//_endthread();
				}
			}
		}
		Sleep(1000);
	}
	_endthread();
}
void ImperialFort_StartStage4(void * lpParam)
{
	while(true)
	{	
		BYTE Packet[13] = {0xC1, 0x0D, 0xF7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
		
		if(ImperialMobCfg.nMonsterOfEvent <= 0)
		{	
			if(Imperial.EventDay != 4)
			{
				//End Event Succes
				ImperialMain.Status = 0;

				PMSG_FORT_EVENT_TIMER pMsg;
				pMsg.h.c = 0xC1;
				pMsg.h.size = 0x0D;
				pMsg.h.headcode = 0xF7;
				pMsg.h.subcode = 0x04;
				pMsg.Status = 0x01;
				pMsg.Unk4 = 0x00;
				pMsg.TimerL = 0;
				pMsg.TimerH = 0;
				pMsg.Unk5 = 0x00;
				pMsg.Mob = 0;
				
				for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
				{	
					GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);

					if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 4 && (ImperialMain.Status == 3 || ImperialMain.Status == 0))
					{	
						int Experience = 1234567890;
			
						PMSG_FOR_END_MESSAGE pMsg;
						pMsg.h.c = 0xC1;
						pMsg.h.size = 0x0D;
						pMsg.h.headcode = 0xF7;
						pMsg.h.subcode = 0x06;
						pMsg.Type = 0x02;
						pMsg.Experience = Experience;
						DataSend(i, (BYTE*)&pMsg, pMsg.h.size);

						gObj->Experience += Experience;
						GCLevelUpMsgSend(i,0);

						gObjTeleport(i,0,125,124);

						//Clear Event 2
						//Imperial.EventClearIndex(i);

						ImperialMain.UserIsInFort[GET_USER_INDEX(i)] = 0;

						_beginthread( ImperialFort_EndEvent, 0, NULL  );

					}
				}

			}
			else
			{	
				Imperial.CanUseTwisting = 1;
				Imperial.StandByTimer = 144;
				_beginthread( ImperialFort_StandBy3, 0, NULL  );
			}

			_endthread();
		}

		if(Imperial.Stage4Timer <= 0)
		{	
			for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
			{	
				GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);

				if(gObj->Connected == 3)
				{	
					if(ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
					{	
						DataSend(i, &Packet[0], Packet[1]); //Send Fail Message
						gObjTeleport(i,0,125,124);
							
						//Clear Event 2
						Imperial.EventClearIndex(i);
					}
				}
			}
			_endthread();
		}

		Imperial.Stage4Timer -= 4;

		PMSG_FORT_EVENT_TIMER pMsg;
		pMsg.h.c = 0xC1;
		pMsg.h.size = 0x0D;
		pMsg.h.headcode = 0xF7;
		pMsg.h.subcode = 0x04;
		pMsg.Status = 0x02;
		pMsg.Unk4 = 0x00;
		pMsg.TimerL = LOBYTE(Imperial.Stage4Timer);
		pMsg.TimerH = HIBYTE(Imperial.Stage4Timer);
		pMsg.Unk5 = 0x00;
		pMsg.Mob = ImperialMobCfg.nMonsterOfEvent;

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{	
			GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);		
			if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 4 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3) )
			{	
				DataSend(i, (BYTE*)&pMsg, pMsg.h.size);
			}
			else if(gObj->Connected == 3 && gObj->MapNumber != Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 4 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
			{	
				DataSend(i, &Packet[0], Packet[1]);

				Imperial.EventClear();
				_endthread();
			}
			else if(UserCountInMap(Imperial.EventMap) == 0 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1 && ImperialMain.Stage == 4 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
			{	
				DataSend(i, &Packet[0], Packet[1]);

				Imperial.EventClear();
				_endthread();
			}
			else
			{	
				if(gObj->Connected == 3 && gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1 && ImperialMain.Stage == 4 && ( ImperialMain.Status == 1 || ImperialMain.Status == 3))
				{
				gObjTeleport(i,0,125,125);
				}
			}
		}
		Sleep(1000);
	}
	_endthread();
}
void ImperialFort_CheckState(void * lpParam)
{
	while(true)
	{	
		BYTE Packet[13] = {0xC1, 0x0D, 0xF7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{		
			GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(i);
			
			if(gObj->Connected == 3)
			{	
				gObjCheckPaperCountInInventory(i);

				if(gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 0)
				{
				gObjTeleport(i,0,125,124);
				//Imperial.EventClear();
				//Messages.outNormal(i,"Map Imperial.EventMap, In Fort 0");

				//Clear Event 2
				Imperial.EventClearIndex(i);
				}
			}
			
			if(gObj->Connected == 3)
			{	
				if(gObj->MapNumber != Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
				{
				//Imperial.EventClear();
				//gObjTeleport(i,0,125,124);
				DataSend(i, &Packet[0], Packet[1]);
				//Messages.outNormal(i,"Map != Imperial.EventMap, In Fort 1");

				//Clear Event 2
				Imperial.EventClearIndex(i);
				}
			}		
			
			if(Imperial.ImperialIsRun == 1)
			{
				if(gObj->Connected == 3)
				{
					if(gObj->MapNumber == Imperial.EventMap && gObj->PartyNumber == -1 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
					{
					DataSend(i, &Packet[0], Packet[1]);
					//Messages.outNormal(i,"Map = Imperial.EventMap, Party -1, In Fort 1");
					Imperial.EventClearIndex(i);
					}
					
					if(gObj->MapNumber == Imperial.EventMap && gObj->PartyNumber == -1 && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1)
					{
					Imperial.EventClearIndex(i);
					//Messages.outNormal(i,"Map = Imperial.EventMap, Party -1, In Fort != 1");
					}

					if(UserCountInMap(Imperial.EventMap) == 0)
					{
					Imperial.EventClear();
					//Messages.outNormal(i,"Map = Imperial.EventMap users 0");
					}
				}
			}

			if(Imperial.ImperialIsRun == 0)
			{
				if(gObj->Connected == 3)
				{
					if(gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] == 1)
					{
					//Clear Event 2
					Imperial.EventClearIndex(i);
					DataSend(i, &Packet[0], Packet[1]);
					//Messages.outNormal(i,"Map = Imperial.EventMap, In Fort 1");
					}

					if(gObj->MapNumber == Imperial.EventMap && ImperialMain.UserIsInFort[GET_USER_INDEX(i)] != 1)
					{
					Imperial.EventClearIndex(i);
					//DataSend(i, &Packet[0], Packet[1]);
					//Messages.outNormal(i,"Map = Imperial.EventMap, In Fort !=1");
					}
				}
			}
		}
		//Log.outError("Imperial Status %d",ImperialMain.Status);
		Sleep(1000);
	}
	_endthread();
}
void ImperialEvent::ImperialEnter(int aIndex)
{	
	GOBJSTRUCT *gObj = (GOBJSTRUCT*)OBJECT_POINTER(aIndex);
	
	SYSTEMTIME t;
	GetLocalTime(&t);
	
	/*char DayName[10];
	
	if(t.wDayOfWeek == 1){ sprintf_s(DayName,"Monday"); }
	else if(t.wDayOfWeek == 2){ sprintf_s(DayName,"Tuesday"); }
	else if(t.wDayOfWeek == 3){ sprintf_s(DayName,"Wednesday");	}
	else if(t.wDayOfWeek == 4){ sprintf_s(DayName,"Thursday"); }
	else if(t.wDayOfWeek == 5){ sprintf_s(DayName,"Friday"); }
	else if(t.wDayOfWeek == 6){ sprintf_s(DayName,"Saturday"); }
	else if(t.wDayOfWeek == 0){ sprintf_s(DayName,"Sunday"); }*/
	
	if(t.wDayOfWeek == 1 || t.wDayOfWeek == 4){ Imperial.EventDay = 1; }
	else if(t.wDayOfWeek == 2 || t.wDayOfWeek == 5){ Imperial.EventDay = 2; }
	else if(t.wDayOfWeek == 3 || t.wDayOfWeek == 6){ Imperial.EventDay = 3; }
	else if(t.wDayOfWeek == 0){ Imperial.EventDay = 4; }


	if(gObj->PartyNumber != -1)
	{	
		EventClear();

		if(Imperial.EventDay == 1)
		{
		SetMobs(1,1,"ImperialMobs.dat",0);
		SetGates(1,1,"ImperialGates.dat");
		}
		else if(Imperial.EventDay == 2)
		{
		SetMobs(2,2,"ImperialMobs.dat",0);
		SetGates(2,2,"ImperialGates.dat");
		}
		else if(Imperial.EventDay == 3)
		{
		SetMobs(3,3,"ImperialMobs.dat",0);
		SetGates(3,3,"ImperialGates.dat");
		}
		else if(Imperial.EventDay == 4)
		{
		SetMobs(4,4,"ImperialMobs.dat",0);
		SetGates(4,4,"ImperialGates.dat");
		}

		for(int i=MIN_PLAYERID;i<MAX_PLAYERID;i++)
		{	
			GOBJSTRUCT *gObjOther = (GOBJSTRUCT*)OBJECT_POINTER(i);
			
			if(gObj->Connected == 3 && gObjOther->PartyNumber == gObj->PartyNumber)
			{	
				if(Imperial.EventDay == 1)
				{
				gObjTeleport(i,69,231,14);
				Imperial.EventMap = 69;
				}
				else if(Imperial.EventDay == 2)
				{
				gObjTeleport(i,70,86,66);
				Imperial.EventMap = 70;
				}
				else if(Imperial.EventDay == 3)
				{
				gObjTeleport(i,71,154,186);
				Imperial.EventMap = 71;
				}
				else if(Imperial.EventDay == 4)
				{
				gObjTeleport(i,72,93,68);
				Imperial.EventMap = 72;
				}
				Messages.outNormal(i,"[Imperial Fort] Teleporting to Event Map.");

				PMSG_FORT_EVENT_TIMER pMsg;
				//0xC1, 0x0D, 0xF7, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28
				pMsg.h.c = 0xC1;
				pMsg.h.size = 0x0D;
				pMsg.h.headcode = 0xF7;
				pMsg.h.subcode = 0x04;
				pMsg.Status = 0x01;
				pMsg.Unk4 = 0x00;
				pMsg.TimerL = LOBYTE(Imperial.StartStandByTimer);
				pMsg.TimerH = HIBYTE(Imperial.StartStandByTimer);
				pMsg.Unk5 = 0x00;
				pMsg.Mob = 0;

				DataSend(i, (BYTE*)&pMsg, pMsg.h.size);

				ImperialMain.UserIsInFort[GET_USER_INDEX(i)] = 1;
				ImperialMain.Status = 0;
				ImperialMain.Stage = 1;
				Imperial.ImperialIsRun = 1;
				ImperialUserCount++;

				if(Imperial.StandByRun == 0)
				{
				Imperial.StandByRun = 1;
				_beginthread( ImperialFort_StartStandBy, 0, NULL  );
				}

				Messages.outNormal(i,"[Imperial Fort] Event will start in 1 minute.");
			}
		}
	}
	else
	{
				Messages.outNormal(aIndex,"[Imperial Fort] Event only for party.");
	}
}