コード例 #1
0
BOOL CRaklionBattleUserMng::MoveAllUser(int iGateNumber) //00644EB0 (identical)
{
	BOOL bMoveGateSuccess = FALSE; //loc2

	for ( int iCount=0; iCount < this->m_vtUserInfo.size(); iCount++)
	{
		bMoveGateSuccess = gObjMoveGate(this->m_vtUserInfo[iCount], iGateNumber);

		if ( bMoveGateSuccess == TRUE )
		{
			LogAddTD("[ RAKLION ][ BattleUser ] [%s][%s] MoveGate(%d)",
				gObj[this->m_vtUserInfo[iCount]].AccountID, 
				gObj[this->m_vtUserInfo[iCount]].Name, iGateNumber);
		}
		else
		{
			this->DeleteUserData(this->m_vtUserInfo[iCount]);

			LogAddTD( "[ RAKLION ][ BattleUser ] [%s][%s] MoveGate Fail (%d)",
				gObj[this->m_vtUserInfo[iCount]].AccountID, 
				gObj[this->m_vtUserInfo[iCount]].Name, iGateNumber);

			gObjMoveGate(this->m_vtUserInfo[iCount], 286); //Raklion Entrance
		}
	}

	return TRUE;
}
コード例 #2
0
BOOL CKanturuBattleUserMng::MoveAllUser(int iGateNumber)
{
	int iIndex;
	BOOL bMoveGateSuccess = FALSE;

	for ( int iCount=0;iCount<MAX_KANTURU_BATTLE_USER;iCount++)
	{
		iIndex = this->m_BattleUser[iCount].GetIndex();

		if ( this->m_BattleUser[iCount].IsUseData()  )
		{
			bMoveGateSuccess = gObjMoveGate(iIndex, iGateNumber);

			if ( bMoveGateSuccess == TRUE )
			{
				LogAddTD("[ KANTURU ][ BattleUser ] [%s][%s] MoveGate(%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iGateNumber);
			}
			else
			{
				this->DeleteUserData(iIndex);

				LogAddTD( "[ KANTURU ][ BattleUser ] [%s][%s] MoveGate Fail (%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iGateNumber);

				gObjMoveGate(iIndex, 137);
			}
		}
	}

	return TRUE;
}
コード例 #3
0
// -----------------------------------------------------------------------------------------------------------------------
bool CIllusionTemple::SetProc_Prepare(int iTempleIndex)
{
	ILLUSION_TEMPLE_DATA* lpTemple = &this->m_IllusionTemple[iTempleIndex];

	int iUserCount = 0;

	for(int i = OBJ_STARTUSERINDEX; i < OBJMAX; i++)
	{
		if((gObj[i].MapNumber == MAP_INDEX_ILLUSION1 + iTempleIndex) && (gObjIsConnected(i) == TRUE))
		{
			ILLUSION_OBJ obj;
			int iTeamIndex = iUserCount % 2;

			obj.m_BonusCount = 0;
			obj.m_Index = i;
			obj.m_TeamIndex = iTeamIndex;
			obj.m_TempleIndex = iTempleIndex;

			lpTemple->m_Teams[iTeamIndex].m_Members.push_back(obj);

			switch(iTeamIndex)
			{
			case IT_TEAM_RED:
				gObj[i].m_Change = IT_MASK_RED;
				gObjMoveGate(i, 154 + iTempleIndex);
				break;
			case IT_TEAM_BLUE:
				gObj[i].m_Change = IT_MASK_BLUE;
				gObjMoveGate(i, 148 + iTempleIndex);
				break;
			}

			gObj[i].m_IllusionTeam = iTeamIndex;

			iUserCount++;
		}
	}

	if(iUserCount < MIN_ILLUSION_PLAYERCOUNT)
	{
		this->SetTempleState(iTempleIndex, IT_STATE_CLOSED);
		CLog.LogAdd("[IllusionTemple] Event Closed - Min Users Not Reached (%d)", iTempleIndex + 1);
		return FALSE;
	}

	lpTemple->m_TickCount = GetTickCount() + (IT_PREPARE_TIME * 60000);

	this->SendMsgTemple(iTempleIndex, 1, "Prepare-se, o evento comecara em %d minuto(s).", IT_PREPARE_TIME);

	return TRUE;
}
コード例 #4
0
// ----------------------------------------------------------------------------------------------------------------
//## функция сепаратора для протокола
void DuelSystem::RecvWatchRequest(LPOBJ lpObj, PMSG_DUEL_REQUEST_WATCH* lpMsg)
{
	if(lpObj->m_IfState.use == 0 || lpObj->m_IfState.type != 20) 
	{
		return;
	}
	// ----
	lpObj->m_IfState.use  = 0;
	lpObj->m_IfState.type = 0;
	// ----
	if(lpMsg->btRoomIndex >= 0 && lpMsg->btRoomIndex < MAX_DUEL_ROOMS)
	{
		if(this->g_DuelRooms[lpMsg->btRoomIndex].RoomFree == TRUE) 
		{
			GCServerMsgStringSend("Sorry, but this room is free!", lpObj->m_Index, 1);
			return;
		}
		// ----
		for(short i = 0; i < MAX_DUEL_SEPARATORS; ++i)
		{
			if(this->g_DuelRooms[lpMsg->btRoomIndex].szSeparators[i] == NULL)
			{
				if(gObjMoveGate(lpObj->m_Index, g_DuelGates[lpMsg->btRoomIndex].SeparatorGate))
				{
					this->g_DuelRooms[lpMsg->btRoomIndex].szSeparators[i] = lpObj;
					// ----
					this->SendSpectatorList(lpObj, lpMsg->btRoomIndex);
					// ----
					this->SendSpectatorList(lpMsg->btRoomIndex);
					// ----
					this->SendSpectatorAdd(i, lpMsg->btRoomIndex);
					// ----
					GCServerMsgStringSend("Please sit down and watch this duel. Have fun.", lpObj->m_Index, 1);
					// ----
							if(Config.Duel.Logging)
		{
					Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System][%s][%s] Spectator join to room: [%d]", 
									lpObj->AccountID, lpObj->Name, lpMsg->btRoomIndex + 1);
							}
					// ----
					GCStateInfoSendg(lpObj, 1, 98);
					// ----
					this->SendLifebarInit(lpObj, lpMsg->btRoomIndex);
					// ----
					this->SendLifebarStatus(lpObj, lpMsg->btRoomIndex);
					// ----
					this->UpdateDuelScore(lpMsg->btRoomIndex);
					// ----
					AddTab[lpObj->m_Index].DUEL_SpecVisible = 1;
					// ----
					return;
				}
				GCServerMsgStringSend("Failed to move to Duel Room!", lpObj->m_Index, 1);
				return;
			}
		}
		GCServerMsgStringSend("Sorry, but this room is full!", lpObj->m_Index, 1);
		return;
	}
}
コード例 #5
0
ファイル: Kanturu.cpp プロジェクト: Hagaib/p4f-free-emu
void CKanturu::CheckUserOnKanturuBossMap()
{
	for ( int iCount=OBJ_STARTUSERINDEX;iCount<OBJMAX;iCount++)
	{
		if ( gObj[iCount].Connected == PLAYER_PLAYING &&
			 gObj[iCount].Type == OBJ_USER &&
			 gObj[iCount].MapNumber == MAP_INDEX_KANTURU_BOSS)
		{
 
			if ( gObj[iCount].m_bKanturuEntranceByNPC == FALSE )
			{

				if ( (gObj[iCount].Authority&2) != 2 )
				{
					if ( gObj[iCount].RegenOk == 0 &&
						 gObj[iCount].m_State == 2 &&
						 gObj[iCount].Live == TRUE)
					{
						gObjMoveGate(iCount, 17);

						LogAdd( "[ KANTURU ][ Invalid User ] Invalid Kanturu Boss Map User[%s][%s]",
							gObj[iCount].AccountID, gObj[iCount].Name);
					}
				}
 
			}
		}
	}
}
コード例 #6
0
void CDoppelganger::State_STANDBY(){

	this->StandbyTimer -= 1;

	if(this->StandbyTimer == ((this->StandByTime*60)-30)){ //30 Seconds to Move when Finish
		for(int X=0; X < 5;X++){
			
			if(this->Player[X] >= OBJ_STARTUSERINDEX && gObjIsConnected(this->Player[X])){

				if(gObj[this->Player[X]].MapNumber == this->EventMap){
					gObjMoveGate(this->Player[X],267);
				}

				this->Player[X] = -1;
			}

		}

		LogAddTD("[Doppelganger] Remove Players from Event Map");

		///Set Variables
		this->Timer = 0;
		this->PlayersCount = 0;
		this->MonsterPassed = 0;
	}

	if(this->StandbyTimer == 0){
		this->State = NONE;
		LogAddTD("[Doppelganger] SetState->NONE");
	}
}
コード例 #7
0
// -----------------------------------------------------------------------------------------------------------------------
void CIllusionTemple::NpcRegister(OBJECTSTRUCT* lpObj, PMSG_IT_REGISTER* pMsg)
{
	if(lpObj->m_IfState.use > 0)
	{
		CLog.LogAdd("[IllusionTemple] Interface State Error (%d)(%d)(%s)", lpObj->m_IfState.use, lpObj->m_IfState.type, lpObj->Name); 
		return;
	}

	if(lpObj->pInventory[pMsg->TicketPosition].m_Type != ITEMGET(13, 51) || 
		lpObj->pInventory[pMsg->TicketPosition].m_Level != pMsg->TargetTemple )
	{
		GCServerMsgStringSend("You missed Illusion Temple Ticket.", lpObj->m_Index, 1);
		return;
	}

	pMsg->TargetTemple--;

	if(IT_FLOOR_RANGE(pMsg->TargetTemple) == FALSE)
	{
		CLog.LogAdd("[IllusionTemple] Index out of range (%d)(%s)", pMsg->TargetTemple, &lpObj->Name[0]);
		return;
	}

	if(this->m_IllusionTemple[pMsg->TargetTemple].m_iUserCount >= 10)
	{
		GCServerMsgStringSend("[IllusionTemple] Event is already Full!", lpObj->m_Index, 1);
		return;
	}

	ILLUSION_OBJ obj;
	obj.m_Index = lpObj->m_Index;
	obj.m_TeamIndex = -1;
	obj.m_BonusCount = 0;
	obj.m_TempleIndex = pMsg->TargetTemple;

	gObjInventoryDeleteItem(lpObj->m_Index, pMsg->TicketPosition);
	GCInventoryItemDeleteSend(lpObj->m_Index, pMsg->TicketPosition, 1);

	if ( lpObj->PartyNumber >= 0 )
	{
		PMSG_PARTYDELUSER pMsg;
		int iPartyIndex = gParty.GetIndex(lpObj->PartyNumber, lpObj->m_Index, lpObj->DBNumber);
		if ( iPartyIndex >= 0 )
		{
			pMsg.Number = iPartyIndex;
			CGPartyDelUser(&pMsg, lpObj->m_Index);
		}
	}

	lpObj->m_IllusionIndex = pMsg->TargetTemple;
	gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_RESET, 0);

	gObjMoveGate(lpObj->m_Index, 142 + pMsg->TargetTemple);
}
コード例 #8
0
bool CIllusionTemple::SetProc_Closed(int iTempleIndex)
{
	this->SynchronizeTemple(iTempleIndex);

	for(int i = OBJ_STARTUSERINDEX; i < OBJMAX; i++)
	{

		if(gObj[i].MapNumber == MAP_INDEX_ILLUSION1 + iTempleIndex)
		{

			for(int it = 0; it < INVENTORY_SIZE; it++)
			{
				if(gObj[i].pInventory[it].IsItem())
				{
					if(gObj[i].pInventory[it].m_Type == ITEMGET(14, 64))
					{
						gObjInventoryDeleteItem(gObj[i].m_Index, it);
						GCInventoryItemDeleteSend(gObj[i].m_Index, it, 1);
					}
				}
			}

			gObj[i].m_Change = -1;
			gObjViewportListProtocolCreate(&gObj[i]);

			gObj[i].m_IllusionIndex = -1;
			gObj[i].m_IllusionTeam = -1;
			gObj[i].m_IllusionKillCount = 0;

			gObjMoveGate(i, 257);
		}
	}

	this->m_IllusionTemple[iTempleIndex].m_Statues[IT_STATUE_UP] = -1;
	this->m_IllusionTemple[iTempleIndex].m_Statues[IT_STATUE_DOWN] = -1;
	this->m_IllusionTemple[iTempleIndex].m_BallOwner = -1;
	this->m_IllusionTemple[iTempleIndex].m_iUserCount = 0;
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_RED].m_Members.clear();
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_RED].m_BallOwner = -1;
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_RED].m_Score = 0;
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_BLUE].m_Members.clear();
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_BLUE].m_BallOwner = -1;
	this->m_IllusionTemple[iTempleIndex].m_Teams[IT_TEAM_BLUE].m_Score = 0;

	return TRUE;
}
コード例 #9
0
ファイル: MoveCommand.cpp プロジェクト: Natzugen/server-xmtur
BOOL CMoveCommand::MoveFree2Kalima(LPOBJ lpObj)
{
	int iIdx = GetKalimaGateLevel(lpObj);

	if ( iIdx >= 6 )
	{
		iIdx = 5;
	}

	if ( iIdx < 0 )
	{
		return FALSE;
	}

	int iGateNumber = iIdx + 88;

	return gObjMoveGate(lpObj->m_Index, iGateNumber);
}
コード例 #10
0
// -----------------------------------------------------------------------------------------------------------------------
bool CIllusionTemple::SetProc_End(int iTempleIndex)
{
	PMSG_ILLUSION_STATE pMsg;
	C1SubHeadSet((BYTE*)&pMsg, 0xBF, 0x09, sizeof(pMsg));
	pMsg.Unknow = 0;

	pMsg.State = 3;
	this->SendDataTemple(iTempleIndex, (BYTE*)&pMsg, pMsg.h.size);

	for(int i = OBJ_STARTUSERINDEX; i < OBJMAX; i++)
	{
		if(IT_MAP_RANGE(gObj[i].MapNumber) == TRUE)
		{
			for(int it = 0; it < INVENTORY_SIZE; it++)
			{
				if(gObj[i].pInventory[it].IsItem())
				{
					if(gObj[i].pInventory[it].m_Type == ITEMGET(14, 64))
					{
						gObjInventoryDeleteItem(gObj[i].m_Index, i);
						GCInventoryItemDeleteSend(gObj[i].m_Index, i, 1);
					}
				}
			}
			if(iTempleIndex == (gObj[i].MapNumber - MAP_INDEX_ILLUSION1))
			{
				gObj[i].m_Change = -1;
				gObjViewportListProtocolCreate(&gObj[i]);
				gObjMoveGate(i, 142 + iTempleIndex);
			}
		}
	}

	this->UnSetTempleMonsters(iTempleIndex);

	// Send Items!
	// Give Bonus!

	this->m_IllusionTemple[iTempleIndex].m_TickCount = GetTickCount() + 60000;

	return TRUE;
}
コード例 #11
0
void CKanturuTowerOfRefinement::SetState_END()
{
	LogAddC(5, "[ KANTURU ][ TowerOfRefinement ] State(%d) -> END",
		this->m_iTowerOfRefinementState);

	this->SetTowerOfRefinementState(KANTURU_TOWER_OF_REFINEMENT_END);
	this->SetEntrancePermit(FALSE);
	this->SetUseTowerOfRefinement(FALSE);

	for ( int iCount=0;iCount<OBJMAX;iCount++)
	{
		if ( gObj[iCount].Type == OBJ_USER &&
			 gObj[iCount].MapNumber == MAP_INDEX_KANTURU_BOSS )
		{
			gObjMoveGate(iCount, 136);

			LogAddTD("[ KANTURU ][ TowerOfRefinement ] State End:Kick Out [%s][%s]",
				gObj[iCount].AccountID, gObj[iCount].Name);
		}
	}
}
コード例 #12
0
void CDoppelganger::CheckPartyStatus(){
	
	for(int X=0; X < 5;X++){
		if(this->Player[X] >= OBJ_STARTUSERINDEX && gObj[this->Player[X]].MapNumber == this->EventMap && gObjIsConnected(this->Player[X])){

			LPOBJ gTargetObj = &gObj[this->Player[X]];
	
			if(gTargetObj->PartyNumber != this->PartyNumber){	
				gObjMoveGate(this->Player[X],267);
				this->Player[X] = -1;

				if(X==0){
					LogAddTD("[Doppelganger] Party Leader has not in Party or Party was Disolved - EVENT FINISH FAILED");
					this->Status = FAILED; //Success
					this->State = FINISHED;
					return;
				}
			}
		}
	}
}
コード例 #13
0
void cDuelSystem::DuelProtocolCore(LPOBJ lpObj, unsigned char * lpPacket)
{
    PMSG_DEFAULT2* pMsg = (PMSG_DEFAULT2*)lpPacket;

    switch(pMsg->subcode)
    {
    case 0x01:
    {
        this->RecvDuelRequest(lpObj, (PMSG_DUEL_REQUEST_START*)lpPacket);

        break;
    }
    case 0x02:
    {
        this->RecvDuelAnswer(lpObj, (PMSG_DUEL_ANSWER_START*)lpPacket);

        break;
    }
    case 0x07:
    {
        this->RecvWatchRequest(lpObj, (PMSG_DUEL_REQUEST_WATCH*)lpPacket);

        break;
    }
    case 0x09:
    {
        if(lpObj->MapNumber == 0x40)
        {
            gObjMoveGate(lpObj->m_Index, DuelSystem.Config.DuelGate);
        }

        break;
    }

    Run();
    }
}
コード例 #14
0
void cProtoFunc::PlayerConnect(LPOBJ gObj)
{	
	LoginMsg(gObj);
	RingSkin(gObj);
	PCPoint.InitPCPointForPlayer(gObj); 
	MySQL.Execute("SELECT %s FROM Character WHERE Name = '%s'", Config.ResetColumn, gObj->Name);	 
	AddTab[gObj->m_Index].Resets = MySQL.GetInt();
	#ifdef _GS 
	if(Config.Duel.Enabled)
	{
		if(Config.Duel.Ranking)
		{
			g_DuelSystem.DuelSetInfo(gObj->m_Index);
		}
				
	if((!g_DuelSystem.IsOnDuel(gObj->m_Index)) && gObj->MapNumber == 64)
		{
			gObjMoveGate(gObj->m_Index, 294);
			Log.ConsoleOutPut(1, c_Blue ,t_Duel, "[Duel System][%s][%s] Spawn on duel map after duel is not allowed", gObj->AccountID, gObj->Name);
		}
		g_DuelSystem.UserDuelInfoReset(gObj);
	}
	#endif
}
コード例 #15
0
ファイル: KalimaGate.cpp プロジェクト: 331515194/zTeamS6.3
//00415910 - identical
void CKalimaGate::KalimaGateAct(int iIndex)
{
	LPOBJ lpObj=NULL;
	LPOBJ lpObjCallOwner=NULL;

	if ( OBJMAX_RANGE(iIndex ) == FALSE)
	{
		return;
	}

	if ( gObj[iIndex].Live == FALSE )
	{
		return;
	}

	if ( gObjIsConnected( gObj[iIndex].m_RecallMon ) == PLAYER_EMPTY )
	{
		LogAddTD("[Kalima] Kalima Gate Vanished - Summoner Vanished (SummonIndex:%d, EnterCount:%d)",
			iIndex, gObj[iIndex].m_cKalimaGateEnterCount );
		GCDiePlayerSend( &gObj[iIndex], iIndex, 0, 0);
		gObjDel(iIndex);
		gObjCharZeroSet(iIndex);
		return;
	}

	lpObj = &gObj[iIndex];
	lpObjCallOwner = &gObj[lpObj->m_RecallMon];

	if ( gObj[gObj[iIndex].m_RecallMon].DieRegen > 0 )
	{
		lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0;
		lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0;

		LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Summoner Died (SummonIndex:%d, EnterCount:%d)",
			lpObjCallOwner->AccountID, lpObjCallOwner->Name,
			iIndex, gObj[iIndex].m_cKalimaGateEnterCount );
		this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon);
		return;
	}

	if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER )
	{
		lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0;
		lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0;
		
		LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Enter Count Over (SummonIndex:%d, EnterCount:%d)",
			lpObjCallOwner->AccountID, lpObjCallOwner->Name,
			iIndex, gObj[iIndex].m_cKalimaGateEnterCount );
		this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon);
		return;
	}
		
	DWORD dwTickCount = GetTickCount();

	if ( dwTickCount > lpObj->RegenTime + KALIMA_GATE_TIMEOUT )
	{
		lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0;
		lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0;
		
		LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Time Out (SummonIndex:%d, EnterCount:%d)",
			lpObjCallOwner->AccountID, lpObjCallOwner->Name,
			iIndex, gObj[iIndex].m_cKalimaGateEnterCount );
		this->DeleteKalimaGate(lpObj->m_Index, lpObjCallOwner->m_Index);
		return;
	}

	if ( lpObj->VPCount < 1 )
	{
		return;
	}

	int tObjNum=-1;

	for ( int i=0;i<MAX_VIEWPORT_MONSTER;i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if ( tObjNum >= 0 )
		{
			if ( gObj[tObjNum].Type == OBJ_USER )
			{
				if ( gObj[tObjNum].Live != FALSE )
				{
					if ( abs(lpObj->Y - gObj[tObjNum].Y) < 2 )
					{
						if ( abs(lpObj->X - gObj[tObjNum].X) < 2 )
						{
							if ( lpObj->m_RecallMon == tObjNum || (gObj[tObjNum].PartyNumber != -1 && lpObjCallOwner->PartyNumber == gObj[tObjNum].PartyNumber ))
							{
								int iMoveMapLevel = lpObj->m_Attribute -51;
								int iMapNumber = iMoveMapLevel + 24;
								int iGateNumber = g_iKalimaGateGateIndex[iMoveMapLevel];
								int iOverLevel = this->GetKalimaGateLevel(tObjNum);

								if ( iOverLevel >= iMoveMapLevel )
								{
									if ( gObjMoveGate(tObjNum, iGateNumber) == FALSE )
									{
										LogAddTD("[Kalima] [%s][%s] - [%s][%s] move fail (MapNumber:%d)", 
											lpObjCallOwner->AccountID, lpObjCallOwner->Name,
											gObj[tObjNum].AccountID, gObj[tObjNum].Name, iMapNumber);
									}
									else
									{
										LogAddTD("[Kalima] [%s][%s] - [%s][%s] Transported by Kalima Gate (SummonIndex:%d, GateNo.:%d, MapNumber:%d)",
											lpObjCallOwner->AccountID, lpObjCallOwner->Name, 
											gObj[tObjNum].AccountID, gObj[tObjNum].Name, iIndex, iMoveMapLevel + 1, iMapNumber);
										gObj[iIndex].m_cKalimaGateEnterCount ++;

										if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER )
										{
											return;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
コード例 #16
0
int CIllusionTempleEvent::Enter(int aIndex,BYTE Temple,BYTE Pos)
{
	if( g_bIllusionTemple == FALSE )
	{
		return FALSE;
	}

	if( IT_TEMPLE_RANGE(Temple) == FALSE )
	{
		return FALSE;
	}

	LPOBJ lpObj = &gObj[aIndex];

	PMSG_ILLUSIONTEMPLE_ENTER_RESULT pMsg;

	PHeadSubSetB((LPBYTE)&pMsg,0xBF,0,sizeof( pMsg ));
	pMsg.result = 0;

	if( lpObj->Type != OBJ_USER || lpObj->Connected <= PLAYER_LOGGED )
	{
		return FALSE;
	}

	if ( lpObj->m_IfState.use != 0 && lpObj->m_IfState.type != 12 )
	{
		return FALSE;
	}

	if ( lpObj->m_bPShopOpen == TRUE )
	{
		CGPShopReqClose(lpObj->m_Index);
	}

	int bFail = FALSE;
	int iLevel;
	int iSerial;

#if (ENABLE_FIX_PARTYPK == 0)

	if ( lpObj->PartyNumber >= 0 )
	{
		if( gParty.GetPartyPkLevel(lpObj->PartyNumber) >= 5 )
		{
			bFail = TRUE;
		}
	}
	else if( lpObj->m_PK_Level >= 4 )
	{
		bFail = TRUE;
	}

	if( bFail == TRUE )
	{
		pMsg.result = 7;
		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		return FALSE;
	}

#endif

	if( IsTransformEquipment(aIndex) )
	{
		pMsg.result = 8;
		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		return FALSE;
	}

	if( m_TempleData[Temple].GetState() != IT_STATE_CLOSED ||
		m_TempleData[Temple].OpenState() == FALSE )
	{
		pMsg.result = 2;
		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		return FALSE;
	}

	if( gObj[aIndex].pInventory[Pos].IsItem() == TRUE )
	{
		if( gObj[aIndex].pInventory[Pos].m_Type == ITEMGET(13,51) )
		{
			iLevel = gObj[aIndex].pInventory[Pos].m_Level;
			iSerial = gObj[aIndex].pInventory[Pos].m_Number;

			if( IT_TEMPLE_RANGE(iLevel-1) == FALSE && gObj[aIndex].pInventory[Pos].m_Durability != 1.0f )
			{
				pMsg.result = 1;
				DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
				return FALSE;
			}
		}
		else if( gObj[aIndex].pInventory[Pos].m_Type == ITEMGET(13,61) )
		{
			iSerial = gObj[aIndex].pInventory[Pos].m_Number;
			iLevel = GetEnterLevel(aIndex);

			if( iLevel <= 0 )
			{
				pMsg.result = 1;
				DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
				return FALSE;
			}
		}
		else
		{
			pMsg.result = 1;
			DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
			return FALSE;
		}
	}
	else
	{
		pMsg.result = 1;
		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		return FALSE;
	}

	if( RankingCheck(aIndex,Temple,Pos,iLevel) != FALSE )
	{
		return TRUE;
	}

	if( CheckCanEnter(aIndex,iLevel) == FALSE )
	{
		pMsg.result = 3;
		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		return FALSE;
	}

	m_TempleData[iLevel-1].CheckUsers();

	int bResult = m_TempleData[iLevel-1].EnterUser(aIndex,Temple,Pos);

	if( bResult == TRUE )
	{
		if( lpObj->PartyNumber >= 0 )
		{
			PMSG_PARTYDELUSER pMsg;
			int PartyIndex;
			PartyIndex = gParty.GetIndex(lpObj->PartyNumber,lpObj->m_Index,lpObj->DBNumber);

			if( PartyIndex >= 0 )
			{
				
				pMsg.Number = PartyIndex;

				CGPartyDelUser(&pMsg,lpObj->m_Index);
			}
		}

		if( lpObj->pInventory[Pos].m_Type == ITEMGET(13,51) )
		{
			lpObj->pInventory[Pos].m_Durability = 0;
			GCItemDurSend(lpObj->m_Index,Pos,(BYTE)lpObj->pInventory[Pos].m_Durability,0);
		}
		else if( lpObj->pInventory[Pos].m_Type == ITEMGET(13,61) )
		{
			if( lpObj->pInventory[Pos].m_Durability > 0.0f )
			{
				lpObj->pInventory[Pos].m_Durability -= 1.0f;
				GCItemDurSend(lpObj->m_Index,Pos,(BYTE)lpObj->pInventory[Pos].m_Durability,0);
			}
		}

		LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u).",
			iLevel,lpObj->AccountID,lpObj->Name,lpObj->DbClass,lpObj->pInventory[Pos].m_Number);

		DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size);
		gObjMoveGate(lpObj->m_Index,141 + iLevel);
	}

	m_TempleData[Temple].SendState(0,lpObj->m_Index);
	SendInfo();
return TRUE;
}
コード例 #17
0
void CDoppelganger::EnterDoppelganger(int aIndex,int Invitation)
{
	if(aIndex < (OBJMAX-OBJMAXUSER) || aIndex > (OBJMAX-1)) return;
	if(!gObjIsConnected(aIndex)) return;

	LPOBJ lpObj = &gObj[aIndex];
	
	if(this->State != NONE) return;
	
	//Get Map Number
	this->EventMap += 1;
	if(this->EventMap > 68) this->EventMap = 65;

	int Gate = 264 + this->EventMap;

	if(this->OnlyInParty == 1 && lpObj->PartyNumber == -1){
		GCServerMsgStringSend("[Doppelganger] Event only for Party.",aIndex,1);
		return;
	}

	this->EventLevel = lpObj->Level / 10;

	//Set Player who Give the Ticket as Principal Player
	this->Player[0] = aIndex;
	LogAddTD("[Doppelganger][%d] Add Player: %d %s",this->PlayersCount,lpObj->m_Index,lpObj->Name);
	this->PlayersCount += 1;

	this->PartyNumber = lpObj->PartyNumber;

	if(lpObj->PartyNumber != -1)
	{	
		for(int i=OBJ_STARTUSERINDEX; i < OBJMAX;i++){	
			if(this->PlayersCount < 5 && gObjIsConnected(i)){
				
				LPOBJ gTargetObj = &gObj[i];
	
				if(gTargetObj->PartyNumber == lpObj->PartyNumber && gTargetObj->m_Index != aIndex && gTargetObj->PartyNumber >= 0){	

					this->Player[this->PlayersCount] = gTargetObj->m_Index;
					
					if(this->EventLevel < (gTargetObj->Level / 10)) this->EventLevel = gTargetObj->Level / 10;
	
					LogAddTD("[Doppelganger][%d] Add Player: %d %s",this->PlayersCount,gTargetObj->m_Index,gTargetObj->Name);
					gObjMoveGate(i,Gate);
					this->PlayersCount++;
				}
			}
		}
	}

	//Ticket
	if(lpObj->pInventory[Invitation].m_Type != ITEMGET(14,111) 
	&& (lpObj->pInventory[Invitation].m_Type != ITEMGET(13,125) 
	|| lpObj->pInventory[Invitation].m_Durability <= 0.0f)){
		return;
	}

	if(lpObj->pInventory[Invitation].m_Type == ITEMGET(13,125) && lpObj->pInventory[Invitation].m_Durability >= 1.0f){
		lpObj->pInventory[Invitation].m_Durability -= 1.0f;
		GCItemDurSend2(lpObj->m_Index, Invitation,lpObj->pInventory[Invitation].m_Durability,0);
	} else {
		//Delete Mirror
		gObjInventoryDeleteItem(aIndex,Invitation);
		GCInventoryItemDeleteSend(aIndex,Invitation,1);
	}
	
	gObjMoveGate(aIndex,Gate);

	for(int X=0; X < 5;X++){
		if(this->Player[X] >= OBJ_STARTUSERINDEX){
			this->ChangeMapAttr(TRUE,Doppelganger.Player[X]); //Block Map Entrance
			this->SendTimeInfo(17,Doppelganger.Player[X]); //Send 30 Seconds to Start
		}
	}

	this->dwTickCount = GetTickCount(); //Set Start Time
	this->State = PREPARING;
	
	LogAddTD("[Doppelganger] SetState->PREPARING");
	LogAddTD("[Doppelganger] Players: %d/5, Event Map: %d, Level: %d",this->PlayersCount,this->EventMap,this->EventLevel);
}
コード例 #18
0
void CDevilSquare::ProcClose()
{
    if ( this->m_iremainTimeSec != -1 )
    {
        int lc2 = (GetTickCount() - this->m_iTime)/1000;

        if ( lc2 != 0 )
        {
            this->m_iremainTimeSec -= lc2;
            this->m_iTime += lc2 * 1000;

            if ( this->m_iremainTimeSec <= 30 && this->m_bSendTimeCount == FALSE )
            {
                PMSG_SET_DEVILSQUARE pMsg;

                PHeadSetB((LPBYTE)&pMsg, 0x92, sizeof(pMsg));
                pMsg.Type = DevilSquare_CLOSE;

                for ( int i=OBJ_STARTUSERINDEX; i<OBJMAX; i++)
                {
                    if ( gObj[i].Connected == PLAYER_PLAYING && gObj[i].Type == OBJ_USER)
                    {
                        if ( BC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                        {
                            if ( CC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                            {
                                DataSend(i, (BYTE *)&pMsg, pMsg.h.size);
                            }
                        }
                    }
                }


                this->m_bSendTimeCount = TRUE;
            }

            if (this->m_iremainTimeSec < 1 )
            {
                PMSG_NOTICE pNotice;

                TNotice::MakeNoticeMsg((TNotice *)&pNotice, 0, lMsg.Get(MSGGET(2, 191)));

                for ( int i=OBJ_STARTUSERINDEX; i<OBJMAX; i++)
                {
                    if ( gObj[i].Connected == PLAYER_PLAYING && gObj[i].Type == OBJ_USER)
                    {
                        if ( BC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                        {
                            if ( CC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                            {
                                DataSend(i, (BYTE *)&pNotice, pNotice.h.size);
                            }
                        }
                    }
                }

                LogAddTD(pNotice.Notice);
                this->SetState(DevilSquare_OPEN);
            }

        }
    }
    else if ( this->m_iTime < GetTickCount() )
    {
        this->ClearMonstr();
        this->m_iRemainTime--;

        if ( this->m_bFlag == 0 )
        {
            for ( int i=OBJ_STARTUSERINDEX; i<OBJMAX; i++)
            {
                if ( gObj[i].Connected == PLAYER_PLAYING )
                {
                    if ( DS_MAP_RANGE(gObj[i].MapNumber) != FALSE )
                    {
                        gObjMoveGate(i, 27);
                    }
                }
            }

            this->ItemClear();
        }
        else
        {
            this->CheckInvalidUser();
        }

        if ( this->m_iRemainTime <= 15 )
        {
            if ( (this->m_iRemainTime%5)== 0 )
            {
                PMSG_NOTICE pNotice;

                TNotice::MakeNoticeMsgEx((TNotice *)&pNotice, 0, lMsg.Get(MSGGET(2, 192)), this->m_iRemainTime);

                for ( int i=OBJ_STARTUSERINDEX; i<OBJMAX; i++)
                {
                    if ( gObj[i].Connected == PLAYER_PLAYING && gObj[i].Type == OBJ_USER)
                    {
                        if ( BC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                        {
                            if ( CC_MAP_RANGE(gObj[i].MapNumber) == FALSE )
                            {
                                DataSend(i, (BYTE *)&pNotice, pNotice.h.size);
                            }
                        }
                    }
                }

                LogAddTD((char*)pNotice.Notice);
            }
        }

        if ( this->m_iRemainTime == 1 && this->m_iremainTimeSec == -1 )
        {
            this->m_iremainTimeSec = 60;
            this->m_iTime = GetTickCount();
        }
        else
        {
            this->m_iTime = GetTickCount() + 60000;
        }
    }
}
コード例 #19
0
void cProtoFunc::PlayerConnect(LPOBJ gObj)
{	    										
	AddTab[gObj->m_Index].AddValue = 0;	 
	AddTab[gObj->m_Index].ArcherObj = NULL;		 
	AddTab[gObj->m_Index].AFK_MapNumber = 0;  
	AddTab[gObj->m_Index].AFK_Timer = 0;
	AddTab[gObj->m_Index].AFK_X = 0;
	AddTab[gObj->m_Index].AFK_Y = 0;		
	AddTab[gObj->m_Index].PostDelay = 0;  
	AddTab[gObj->m_Index].ExType = -1;
	AddTab[gObj->m_Index].AddType = -1;		  
	AddTab[gObj->m_Index].MarryType = -1;	   	
	AddTab[gObj->m_Index].ResType = -1;		 

	MySQL.Execute("SELECT IsMarried FROM Character WHERE Name = '%s'", gObj->Name);	
	AddTab[gObj->m_Index].IsMarried = MySQL.GetInt();

	MySQL.Execute("SELECT MarryName FROM Character WHERE Name = '%s'", gObj->Name);
	MySQL.GetString(AddTab[gObj->m_Index].MarryName);	  										   

	MySQL.Execute("SELECT %s FROM Character WHERE Name = '%s'", Config.ResetColumn, gObj->Name);	 
	AddTab[gObj->m_Index].Resets = MySQL.GetInt();
	 
	LoginMsg(gObj);
	RingSkin(gObj);	
	g_PointShop.GetInfo(gObj->m_Index); 

	if(cProtection.CheckFeature(cProtection.VIPSystem))
	{ 			
	    if(Config.VIPServ.Enabled)
		{												 
			MySQL.Execute("SELECT %s FROM [%s].[dbo].[MEMB_INFO] WHERE memb___id='%s'",Config.VIPServ.Column,MySQL.szDatabase2,gObj->AccountID);
			AddTab[gObj->m_Index].IsVipServer = MySQL.GetInt();

			MySQL.Execute("SELECT %s FROM [%s].[dbo].[MEMB_INFO] WHERE memb___id='%s'",Config.VIPServ.ColumnDate,MySQL.szDatabase2,gObj->AccountID);
			AddTab[gObj->m_Index].VipMinutesServer = MySQL.GetInt();

			if(AddTab[gObj->m_Index].IsVipServer > 0)
			{											 
				DWORD ThreadID;
				HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VipTickServer, (void*)gObj->m_Index, 0, &ThreadID);

				if ( hThread == 0 )
				{
					cLog.ConsoleOutPut(0, cLog.c_Red,cLog.t_NULL,"CreateThread() failed with error %d", GetLastError());
					return;
				}

				CloseHandle(hThread);
				Chat.MessageLog(1, cLog.c_Red, cLog.t_VIP, gObj, "[VIP] Left %d minutes of VIP Server.", AddTab[gObj->m_Index].VipMinutesServer);
			}
			else
			{
				Chat.MessageLog(1, cLog.c_Red, cLog.t_VIP, gObj, "[VIP] You are not vip user! Disconnected from the server.");
				CloseClient(gObj->m_Index);
			} 
		}

		if(!Config.VIPServ.Enabled && VIP.Enabled)
		{
			MySQL.Execute("SELECT %s FROM [%s].[dbo].[Character] WHERE Name='%s'",VIP.Column,MySQL.szDatabase,gObj->Name);
			AddTab[gObj->m_Index].IsVipInGame = MySQL.GetInt();

			MySQL.Execute("SELECT %s FROM [%s].[dbo].[Character] WHERE Name='%s'",VIP.ColumnDate,MySQL.szDatabase,gObj->Name);
			AddTab[gObj->m_Index].IsInGameVipMinutes = MySQL.GetInt();

			if(AddTab[gObj->m_Index].IsVipInGame > 0)
			{											 
				DWORD ThreadID;
				HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VipInGameServer, (void*)gObj->m_Index, 0, &ThreadID);

				if ( hThread == 0 )
				{
					cLog.ConsoleOutPut(0, cLog.c_Red,cLog.t_NULL,"CreateThread() failed with error %d", GetLastError());
					return;
				}

				CloseHandle(hThread);
				Chat.MessageLog(1, cLog.c_Red, cLog.t_VIP, gObj, "[VIP] Left %d minutes of VIP.", AddTab[gObj->m_Index].IsInGameVipMinutes );
			}
		}
	
	}
	
	
#ifdef _GameServer_
	
	if(Config.Duel.Enabled)
	{
		if(Config.Duel.Ranking)
		{
			DuelSetInfo(gObj->m_Index);
		}
				
	if((!g_DuelSystem.IsOnDuel(gObj->m_Index)) && gObj->MapNumber == 64)
		{
			gObjMoveGate(gObj->m_Index, 294);
			cLog.ConsoleOutPut(1, cLog.c_Blue ,cLog.t_Duel, "[Duel System][%s][%s] Spawn on duel map after duel is not allowed", gObj->AccountID, gObj->Name);
		}
		g_DuelSystem.UserDuelInfoReset(gObj);
	}
#endif

} 
コード例 #20
0
// ----------------------------------------------------------------------------------------
void CDoubleGoer::Clear()
{
	for (int i=0;i<5+1;i++)
	{
		LPOBJ lpObj = &gObj[gDoubleGoer.UserIndex[i]];
		// ----
		if ( gObjIsConnected(lpObj) == true && lpObj->MapNumber == gDoubleGoer.EventMap )
		{
			gObjMoveGate(gDoubleGoer.UserIndex[i],267);
			// ----
			if ( gDoubleGoer.Success == 0 )
			{
				gDoubleGoer.EventEnd(gDoubleGoer.UserIndex[i],0x01);
			}
		}
	}
	gDoubleGoer.BossStage = 0;
	gDoubleGoer.Running = 0;
	gDoubleGoer.EventMap = 0;
	gDoubleGoer.EventGate = 0;
	gDoubleGoer.EventX = 0;
	gDoubleGoer.EventY = 0;
	gDoubleGoer.UserCount = 0;
	gDoubleGoer.PartyActived = false;
	gDoubleGoer.UserIndexMaxHit[0] = 0;
	gDoubleGoer.UserIndexMaxHit[1] = 0;
	gDoubleGoer.UserIndexMaxHit[2] = 0;
	gDoubleGoer.BossStage = 0;
	gDoubleGoer.BossMonsterIndex[0] = -1;
	gDoubleGoer.BossMonsterIndex[1] = -1;
	gDoubleGoer.BossMonsterIndex[2] = -1;
	gDoubleGoer.BossMonsterPoss = 0;
	gDoubleGoer.MonsterPos = 0;
	gDoubleGoer.Success = 0;
	gDoubleGoer.MobNearY = 255;
	gDoubleGoer.MonsterPosIndex = -1;
	gDoubleGoer.GoldenChestIndex = -1;

	gDoubleGoer.BlockDoubleGoerEntrance(65);
	gDoubleGoer.BlockDoubleGoerEntrance(66);
	gDoubleGoer.BlockDoubleGoerEntrance(67);
	gDoubleGoer.BlockDoubleGoerEntrance(68);

	for (int i=0;i<3;i++)
	{
		if ( gDoubleGoer.BossMonsterIndex[i] != -1 )
		{
			gObjDel(gDoubleGoer.BossMonsterIndex[i]);
			gDoubleGoer.BossMonsterIndex[i] = -1;
		}
	}

	gDoubleGoer.ChestIndex[0][0] = -1;
	gDoubleGoer.ChestIndex[0][1] = -1;
	gDoubleGoer.ChestIndex[0][2] = -1;
	gDoubleGoer.ChestIndex[1][0] = -1;
	gDoubleGoer.ChestIndex[1][1] = -1;
	gDoubleGoer.ChestIndex[1][2] = -1;
	gDoubleGoer.ChestIndex[2][0] = -1;
	gDoubleGoer.ChestIndex[2][1] = -1;
	gDoubleGoer.ChestIndex[2][2] = -1;

	gDoubleGoer.Timer = gDoubleGoer.OriginalTimer*60;
	gDoubleGoer.StandBy = 0;
	gDoubleGoer.StandByTimer = gDoubleGoer.OriginalStandByTimer*10;
	// ----
	for (int i=0;i<5;i++)
	{
		gDoubleGoer.UserIndex[i] = 0;
	}
	// ----
	gDoubleGoer.DeleteMonsters();
	gDoubleGoer.DeleteChests(0,0);
	gDoubleGoer.DeleteChests(0,1);
	gDoubleGoer.DeleteChests(0,2);
	gDoubleGoer.DeleteChests(1,0);
}
コード例 #21
0
ファイル: MoveCommand.cpp プロジェクト: Natzugen/server-xmtur
BOOL CMoveCommand::Move(LPOBJ lpObj, LPSTR mapname)
{
	int m_number = -1;
	int overlevel = 0;
	int subMoney = 2000;

	int index = this->FindIndex(mapname);

	if ( g_bUseMoveMapBound == TRUE )
	{
		//Cash shop
		//if ( g_CashItemPeriodSystem.CheckHaveItemPeriodSealEffect(lpObj) == FALSE )
		//{
			if ( !this->CheckMoveMapBound(index))
			{
				return FALSE;
			}
		//}
	}

	int loc6 = this->m_MoveCommandData[index].Index; //season 3.0 add-on

	if ( loc6 == 24 ) //season 3.0 changed
	{
		if ( g_CastleSiegeSync.GetCastleState() == 7 )
		{
			return FALSE;
		}

		if ( g_CastleSiegeSync.CheckCastleOwnerMember(lpObj->m_Index) == FALSE && g_CastleSiegeSync.CheckCastleOwnerUnionMember(lpObj->m_Index) == FALSE)
		{
			return FALSE;
		}
	}

	if(IT_MAP_RANGE(lpObj->MapNumber) != FALSE) //season 3.0 add-on
	{
		if(loc6 == 11 || loc6 == 12 || loc6 == 13 || loc6 == 23)
		{
			return FALSE;
		}
	}

	if ( index == -1 )
	{
		return FALSE;
	}

	int NeedLevel = this->m_MoveCommandData[index].NeedLevel;
	int NeedZen   = this->m_MoveCommandData[index].NeedZen;
	int GateNumber= this->m_MoveCommandData[index].GateNumber;

	if ( lpObj->Class == CLASS_DARKLORD || lpObj->Class == CLASS_MAGUMSA )
	{
		if ( NeedLevel > 0 )
		{
			if (GateNumber != 273) //season 3.0 add-on (Swamp of Calmmness)
			{
				NeedLevel = NeedLevel *2 / 3;
			}
		}
	}

	if ( GateNumber >= 0 )
	{
		if ( NeedLevel <= lpObj->Level )
		{
			if ( (lpObj->Money - NeedZen ) >= 0 )
			{
				if ( gObjMoveGate(lpObj->m_Index, GateNumber ) != FALSE )
				{
					lpObj->m_bPShopRedrawAbs = true;
					lpObj->Money -= NeedZen;

					LogAddTD("[%s][%s] Use [%s %s] Success : reduces money %d - %d", lpObj->AccountID, lpObj->Name, lMsg.Get(MSGGET(11, 185)), mapname, lpObj->Money, NeedLevel);

					GCMoneySend(lpObj->m_Index, lpObj->Money );

					if(lpObj->MapNumber == MAP_INDEX_RAKLION_BOSS)//Season 4.5 addon
					{
						g_RaklionBattleUserMng.DeleteUserData(lpObj->m_Index);
					}
					return TRUE;
				}
			}
			else
			{
				::GCServerMsgStringSend(lMsg.Get(MSGGET(4, 102)), lpObj->m_Index, 1);
			}
		}
		else
		{
			char szTemp[256];
			wsprintf(szTemp, lMsg.Get(MSGGET(4, 93)), NeedLevel);
			::GCServerMsgStringSend(szTemp, lpObj->m_Index, 1);
		}
	}

	LogAddTD("[%s][%s] Use [%s %s] Fail GateNumber = %d", lpObj->AccountID, lpObj->Name, lMsg.Get(MSGGET(11, 185)), mapname, GateNumber);
	return FALSE;

}
コード例 #22
0
// ----------------------------------------------------------------------------------------
void CDoubleGoer::Run()
{
	if ( gDoubleGoer.Enabled == 0 )
	{
		return;
	}
	// ----
	if ( gDoubleGoer.Running == 0 )
	{
		return;
	}
	// ----
	for (int i=0;i<5;i++)
	{
		if ( gDoubleGoer.UserIndex[i] != 0 )
		{
			LPOBJ lpObj = &gObj[gDoubleGoer.UserIndex[i]];
			if ( gObjIsConnected(lpObj) == false )
			{
				gDoubleGoer.UserIndex[i] = 0;
				gDoubleGoer.UserCount--;
			}
			// ----
			else if ( gObjIsConnected(lpObj) == true && lpObj->MapNumber != gDoubleGoer.EventMap && gDoubleGoer.StandBy == 0 )
			{
				if ( gDoubleGoer.Success == 1 )
				{
					gDoubleGoer.UserIndex[i] = 0;
					gDoubleGoer.UserCount--;
				}
				else
				{
					gDoubleGoer.EventEnd(gDoubleGoer.UserIndex[i],0x01);
					gDoubleGoer.UserIndex[i] = 0;
					gDoubleGoer.UserCount--;
				}
			}
			else if ( gDoubleGoer.PartyActived == true && lpObj->PartyNumber == -1 )
			{
				gObjMoveGate(gDoubleGoer.UserIndex[i],267);
				gDoubleGoer.UserIndex[i] = 0;
				gDoubleGoer.UserCount--;
				if ( gDoubleGoer.Success == 0 )
				{
					gDoubleGoer.EventEnd(gDoubleGoer.UserIndex[i],0x01);
				}
			}
		}
	}
	if ( gDoubleGoer.Running == 1 && gDoubleGoer.UserCount == 0 )
	{
		gDoubleGoer.Clear();
		return;
	}
	// ----
	
	for(int n=0;n<23;n++)
	{
		for (int i=0;i<5;i++)
		{
			if ( gDoubleGoer.UserIndex[i] != 0 )
			{
				if ( (gObj[gDoubleGoer.UserIndex[i]].Y > gDoubleGoer.BossStartY-(n*gDoubleGoer.CalcDistanceY) ) && 
					 (gObj[gDoubleGoer.UserIndex[i]].Y <= (gDoubleGoer.BossStartY+gDoubleGoer.CalcDistanceY)-(n*gDoubleGoer.CalcDistanceY) ) )
				{
					gDoubleGoer.UserPos[i] = n;
				}
			}
		}
		if ( gDoubleGoer.BossMonsterIndex[2] != -1 )
		{
			if ( (gObj[gDoubleGoer.BossMonsterIndex[2]].Y >= gDoubleGoer.BossStartY-(n*gDoubleGoer.CalcDistanceY) ) &&
				 (gObj[gDoubleGoer.BossMonsterIndex[2]].Y < (gDoubleGoer.BossStartY+gDoubleGoer.CalcDistanceY)-(n*gDoubleGoer.CalcDistanceY) ) )
			{
				gDoubleGoer.BossMonsterPoss = n;
			}
		}
		else
		{
			gDoubleGoer.BossMonsterPoss = 0;
		}
		for (int i=0;i<255;i++)
		{
			if ( gDoubleGoer.MonstersAddIndex[i] != -1 )
			{
				if ( (gObj[gDoubleGoer.MonstersAddIndex[i]].Y <= ::DoublePortalCoords[gDoubleGoer.EventMap-65].btEndY && gObj[gDoubleGoer.MonstersAddIndex[i]].Y >= ::DoublePortalCoords[gDoubleGoer.EventMap-65].btStartY) && 
					 (gObj[gDoubleGoer.MonstersAddIndex[i]].X <= ::DoublePortalCoords[gDoubleGoer.EventMap-65].btEndX && gObj[gDoubleGoer.MonstersAddIndex[i]].X >= ::DoublePortalCoords[gDoubleGoer.EventMap-65].btStartX))
				{
					gDoubleGoer.MonsterCount++;
					gObjDel(gDoubleGoer.MonstersAddIndex[i]);
					gDoubleGoer.MonstersAddIndex[i] = -1;
					continue;
				}
				// ----
				if ( gObj[gDoubleGoer.MonstersAddIndex[i]].Life > 0.0f )
				{
					if ( ( gObj[gDoubleGoer.MonstersAddIndex[i]].Y > gDoubleGoer.BossStartY-(n*gDoubleGoer.CalcDistanceY) ) &&
						(gObj[gDoubleGoer.MonstersAddIndex[i]].Y <= (gDoubleGoer.BossStartY+gDoubleGoer.CalcDistanceY)-(n*gDoubleGoer.CalcDistanceY) ) )
					{

					}
				}
				else if ( gDoubleGoer.MonstersAddIndex[i] == gDoubleGoer.MonsterPosIndex )
				{
					
				}
			}
		}
	}
}
コード例 #23
0
BOOL CIllusionTempleEvent::EnterIllusionTemple(int aIndex, BYTE btTempleIndex, BYTE btItemPos)
{
	if( !g_bIllusionTempleEvent )	
	{
		return FALSE;
	}
	// ----
	if(!CHECK_LIMIT(btTempleIndex, MAX_ILLUSIONTEMPLE_TEMPLE_COUNT)) 
	{
		return FALSE;
	}
	LPOBJECTSTRUCT lpObj = (LPOBJECTSTRUCT)&gObj[aIndex];

	PMSG_RESULT_ENTER_ILLUSION_TEMPLE pResult;
	PHeadSubSetB((LPBYTE)&pResult, 0xBF, 0x00, sizeof(pResult));
	pResult.Result = 0;

	if( lpObj->Type != OBJ_USER || lpObj->Connected <= 2 )
	{
		return FALSE;
	}

	if( lpObj->m_IfState.use && lpObj->m_IfState.type != 12 )
	{
		return FALSE;
	}

	if( lpObj->m_bPShopOpen == true )
	{
		CGPShopReqClose(lpObj->m_Index);
	}

	BOOL PKFlag = FALSE;

	if(lpObj->PartyNumber >= 0)
	{
		if( (gParty.GetPKPartyPenalty(lpObj->PartyNumber)) >= 5)
		{
			PKFlag = TRUE;
		}
	}
	else if( lpObj->m_PK_Level >= 4 )
	{
		PKFlag = TRUE;
	}

	if( PKFlag == TRUE )
	{
		pResult.Result = 7;
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
		return FALSE;
	}

	if( CheckWearingMOPH(aIndex) )
	{
		pResult.Result = 8;
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
		return FALSE;
	}

	if( m_cIllusionTempleProc[btTempleIndex].GetIllusionTempleState() != 0 
		|| !m_cIllusionTempleProc[btTempleIndex].GetEntrance() )
	{
		pResult.Result = 2;
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
		return FALSE;
	}

	int iITEM_LEVEL;
	DWORD dwITEM_SERIAL;

	if(gObj[aIndex].pInventory[btItemPos].IsItem() == TRUE)
	{
		if(gObj[aIndex].pInventory[btItemPos].m_Type == (ITEM_HELPER+51))
		{
			iITEM_LEVEL = gObj[aIndex].pInventory[btItemPos].m_Level;
			dwITEM_SERIAL = gObj[aIndex].pInventory[btItemPos].m_Number;

			if( !CHECK_LIMIT( iITEM_LEVEL-1, MAX_ILLUSIONTEMPLE_TEMPLE_COUNT ) && gObj[aIndex].pInventory[btItemPos].m_Durability != 1.0f)
			{
				pResult.Result = 1;
				DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
				return FALSE;
			}
		}
		else if(gObj[aIndex].pInventory[btItemPos].m_Type == (ITEM_HELPER+61))
		{
			dwITEM_SERIAL = gObj[aIndex].pInventory[btItemPos].m_Number;
			iITEM_LEVEL = CheckCanEnterLevel(aIndex);
			
			if(iITEM_LEVEL <= 0)
			{
				pResult.Result = 1;
				DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
				return FALSE;
			}
		}
		else
		{
			pResult.Result = 1;
			DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
			return FALSE;
		}
	}
	else
	{
		pResult.Result = 1;
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
		return FALSE;
	}

#pragma message("#### Enable me after time ####")
	//if( GEReqIllusionTempleEnterCountCheck(aIndex, btTempleIndex, btItemPos, iITEM_LEVEL) )
	//{
	//	LogAddC(2, "[DEBUG] [IT] Enter R12");
	//	return TRUE;
	//}
	if( !CheckEnterLevel(aIndex, iITEM_LEVEL) )
	{
		pResult.Result = 3;
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);
		return FALSE;
	}

	m_cIllusionTempleProc[iITEM_LEVEL-1].CheckUsersOnConnect();

	BOOL bRet = m_cIllusionTempleProc[iITEM_LEVEL-1].EnterUserIllusionTemple(aIndex, btTempleIndex, btItemPos);

	if(bRet == TRUE)
	{
		if(lpObj->PartyNumber >= 0)
		{
			PMSG_PARTYDELUSER pMsg;

			int pindex = gParty.GetIndex(lpObj->PartyNumber, lpObj->m_Index, lpObj->DBNumber);
			if(pindex >= 0)
			{
				pMsg.Number = pindex;
				CGPartyDelUser(&pMsg, lpObj->m_Index);
			}
		}

		if( lpObj->pInventory[btItemPos].m_Type == (ITEM_HELPER+51) )
		{
			lpObj->pInventory[btItemPos].m_Durability = 0;
			GCItemDurSend(lpObj->m_Index, btItemPos, lpObj->pInventory[btItemPos].m_Durability, 0);
		}
		else if(lpObj->pInventory[btItemPos].m_Type == (ITEM_HELPER+61) && lpObj->pInventory[btItemPos].m_Durability > 0.0f)
		{
			lpObj->pInventory[btItemPos].m_Durability -= 1.0f;
			GCItemDurSend(lpObj->m_Index, btItemPos, lpObj->pInventory[btItemPos].m_Durability, 0);
		}

#ifdef OPT
		LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u). PCRoom:%d", iITEM_LEVEL, lpObj->AccountID, lpObj->Name, lpObj->DbClass, lpObj->pInventory[btItemPos].m_Number, lpObj->m_iPcBangRoom);
#else
		LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u)", iITEM_LEVEL, lpObj->AccountID, lpObj->Name, lpObj->DbClass, lpObj->pInventory[btItemPos].m_Number);
#endif
		DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size);

		gObjMoveGate(lpObj->m_Index, iITEM_LEVEL+141);
	}

	m_cIllusionTempleProc[btTempleIndex].SendIllusionTempleState(0, lpObj->m_Index);
	SendIllusionTempleUserCount();

#if(TESTSERVER==1)
	GCServerMsgStringSend("CIllusionTempleEvent::EnterIllusionTemple", lpObj->m_Index, 0);
#endif
	return FALSE;
}
コード例 #24
0
void CHacktoolBlockEx::SetUseForceMove2Town(LPOBJ lpObj)
{
	if( BC_MAP_RANGE(lpObj->MapNumber) )
	{
		int iBridgeIndex = g_BloodCastle.GetBridgeIndexByMapNum(lpObj->MapNumber);
		// ----
		if( g_BloodCastle.GetCurrentState(iBridgeIndex) == BC_STATE_PLAYING )
		{
			g_BloodCastle.SearchUserDropQuestItem(lpObj->m_Index);
		}
		else
		{
			g_BloodCastle.SearchUserDeleteQuestItem(lpObj->m_Index);
		}
	}
	// ----
	if( IT_MAP_RANGE(lpObj->MapNumber) )
	{
		g_IllusionTempleEvent.DropRelicsItem(lpObj->MapNumber, lpObj->m_Index);
	}
	// ----
	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->MapNumber == MAP_INDEX_DEVIAS )
	{
		gObjMoveGate(lpObj->m_Index, 22);
	}
	else if( lpObj->MapNumber == MAP_INDEX_NORIA )
	{
		gObjMoveGate(lpObj->m_Index, 27);
	}
	else if( lpObj->MapNumber == MAP_INDEX_LOSTTOWER )
	{
		gObjMoveGate(lpObj->m_Index, 42);
	}
	else if( lpObj->MapNumber == MAP_INDEX_ATHLANSE )
	{
		gObjMoveGate(lpObj->m_Index, 49);
	}
	else if( lpObj->MapNumber == MAP_INDEX_TARKAN )
	{
		gObjMoveGate(lpObj->m_Index, 57);
	}
	else if( BC_MAP_RANGE(lpObj->MapNumber) )
	{
		gObjMoveGate(lpObj->m_Index, 22);
	}
	else if( CC_MAP_RANGE(lpObj->MapNumber) )
	{
		gObjMoveGate(lpObj->m_Index, 22);
	}
	else if( KALIMA_MAP_RANGE(lpObj->MapNumber) )
	{
		gObjMoveGate(lpObj->m_Index, 22);
	}
	else if( CC_MAP_RANGE(lpObj->MapNumber) )
	{
		gObjMoveGate(lpObj->m_Index, 22);
	}
	else if( lpObj->MapNumber == MAP_INDEX_AIDA )
	{
		gObjMoveGate(lpObj->m_Index, 27);
	}
	else if( lpObj->MapNumber == MAP_INDEX_CRYWOLF_FIRSTZONE )
	{
		gObjMoveGate(lpObj->m_Index, 27);
	}
	else if( lpObj->MapNumber == MAP_INDEX_ELBELAND )
	{
		gObjMoveGate(lpObj->m_Index, 267);
	}
	else if( lpObj->MapNumber == MAP_INDEX_SWAMP_OF_CALMNESS )
	{
		gObjMoveGate(lpObj->m_Index, 273);
	}
	else if( lpObj->MapNumber == MAP_INDEX_RAKLION_FIELD )
	{
		gObjMoveGate(lpObj->m_Index, 286);
	}
	else if( g_NewPVP.IsVulcanusMap(lpObj->MapNumber) )
	{
		gObjMoveGate(lpObj->m_Index, 294);
	}
	else if( g_NewPVP.IsPKFieldMap(lpObj->MapNumber) )
	{
		g_NewPVP.Reset(*lpObj);
		gObjMoveGate(lpObj->m_Index, 294);
	}
	else
	{
		gObjMoveGate(lpObj->m_Index, 17);
	}
}
コード例 #25
0
ファイル: TvTEvent.cpp プロジェクト: 331515194/zTeamS6.3
void cTvTEvent::TickTime()
{
	if(!this->Enable)return;
	SYSTEMTIME t;
	GetLocalTime(&t);

	if(this->Waiting == true)
	{
		this->WaitingTick++;
		if(this->WaitingTick == this->WaitingTime)
		{
			if(this->TotalPlayer >= 2)
			{
				this->DivisionTeam();
				MessaageAllGlobal("[TvT Event] Start");
				MessaageAllGlobal("[TvT Event] Total Player: %d",this->TotalPlayer);
				this->Start = true;
			}
			else
			{
				MessaageAllGlobal("[TvT Event] End");
				for(int n=OBJ_STARTUSERINDEX;n<OBJMAX;n++)
				{
					LPOBJ sObj = &gObj[n];
					if(sObj->Connected != PLAYER_PLAYING) continue;
					if(this->Player[n].tEvent == true)
					{
						this->Player[n].tEvent = false;
						gObjMoveGate(n,17);	//Lorencia
						if(this->DisplayCommands == 1)
						{
							gObj[n].m_Change = -1;
							gObjViewportListProtocolCreate(&gObj[n]);
						}
						this->Reward(n);
						this->RestoreUser(n);
					}
				}
				this->Start = false;
				this->TotalPlayer = 0;
				this->ScoreBlue = 0;
				this->ScoreRed = 0;
			}
			this->Waiting = false;
			this->WaitingTick = 0;
		}
		return;
	}

	if(this->Start == true)
	{
		this->StartTick++;
		if(this->StartTick == this->EventTime)
		{
			MessaageAllGlobal("[TvT Event] End");

			if(this->ScoreBlue > this->ScoreRed) 
			{
				MessaageAllGlobal("[TvT Event] Win Blue Team");
				MessaageAllGlobal("[TvT Event] Blue: %d Vs Red: %d",this->ScoreBlue,this->ScoreRed);
			}
			else if(this->ScoreRed > ScoreBlue) 
			{
				MessaageAllGlobal("[TvT Event] Win Red Team");
				MessaageAllGlobal("[TvT Event] Red: %d Vs Blue: %d",this->ScoreRed,this->ScoreBlue);
			}
			else 
			{
				MessaageAllGlobal("[TvT Event] Dead heat");
			}

			for(int n=OBJ_STARTUSERINDEX;n<OBJMAX;n++)
			{
				LPOBJ sObj = &gObj[n];
				if(sObj->Connected != PLAYER_PLAYING) continue;
				if(this->Player[n].tEvent == true)
				{
					this->Player[n].tEvent = false;
					gObjMoveGate(n,17);	//Lorencia
					if(this->DisplayCommands == 1)
					{
						gObj[n].m_Change = -1;
						gObjViewportListProtocolCreate(&gObj[n]);
					}
					this->Reward(n);
					this->RestoreUser(n);
				}
			}
			this->Start = false;
			this->TotalPlayer = 0;
			this->ScoreBlue = 0;
			this->ScoreRed = 0;
			this->StartTick = 0;
		}
		return;
	}

	if(t.wSecond == 00)
	{
		for(int i=0;i<this->Count;i++)
		{
			if(t.wHour == this->T[i].H && t.wMinute == this->T[i].M)
			{
				MessaageAllGlobal("[TvT Event] Starts in %d minute",(this->WaitingTime/60));
				this->Waiting = true;
				return;
			}
		}
	}
}
コード例 #26
0
void cDuelSystem::RoomReset(short iRoom, bool dontMove, bool dontSendEnd)
{
    if(this->g_DuelRooms[iRoom].szlpObjOne != NULL) // Player 1
    {
        if(Utilits.gObjIsConnected(this->g_DuelRooms[iRoom].szlpObjOne->m_Index))
        {
            if(dontSendEnd == false)
            {
                this->SendEndDuel(this->g_DuelRooms[iRoom].szlpObjOne);
            }

            if(this->g_DuelRooms[iRoom].szlpObjOne->MapNumber == 0x40)
            {
                if(dontMove == false)
                {
                    gObjMoveGate(this->g_DuelRooms[iRoom].szlpObjOne->m_Index, DuelSystem.Config.DuelGate);
                }
            }
        }

        this->UserDuelInfoReset(this->g_DuelRooms[iRoom].szlpObjOne);
    }

    if(this->g_DuelRooms[iRoom].szlpObjTy != NULL)  // Player 2
    {
        if(Utilits.gObjIsConnected(this->g_DuelRooms[iRoom].szlpObjTy->m_Index))
        {
            if(dontSendEnd == false)
            {
                this->SendEndDuel(this->g_DuelRooms[iRoom].szlpObjTy);
            }

            if(this->g_DuelRooms[iRoom].szlpObjTy->MapNumber == 0x40)
            {
                if(dontMove == false)
                {
                    gObjMoveGate(this->g_DuelRooms[iRoom].szlpObjTy->m_Index, DuelSystem.Config.DuelGate);
                }
            }
        }

        this->UserDuelInfoReset(this->g_DuelRooms[iRoom].szlpObjTy);
    }

    for(short i = 0; i < MAX_DUEL_SEPARATORS; ++i)
    {
        if(this->g_DuelRooms[iRoom].szSeparators[i] != NULL)
        {
            this->SendEndDuel(this->g_DuelRooms[iRoom].szSeparators[i]);

            AddBuff(this->g_DuelRooms[iRoom].szSeparators[i], 18, 0, 0, 0, 0, 1);

            gObjViewportListProtocolCreate(this->g_DuelRooms[iRoom].szSeparators[i]);

            GCStateInfoSendg(this->g_DuelRooms[iRoom].szSeparators[i], 0, 98);

            gObjMoveGate(this->g_DuelRooms[iRoom].szSeparators[i]->m_Index, DuelSystem.Config.DuelGate);
        }

        this->g_DuelRooms[iRoom].szSeparators[i] = NULL;
    }

    this->g_DuelRooms[iRoom].szlpObjOne   = NULL;
    this->g_DuelRooms[iRoom].szPointsOne  = 0;

    this->g_DuelRooms[iRoom].szlpObjTy    = NULL;
    this->g_DuelRooms[iRoom].szPointsTy   = 0;

    this->g_DuelRooms[iRoom].RoomFree	  = TRUE;
    this->g_DuelRooms[iRoom].DuelWaiting  = FALSE;
    this->g_DuelRooms[iRoom].szWinner	  = FALSE;

    this->g_DuelRooms[iRoom].dwTicketCount= 0;
    this->g_DuelRooms[iRoom].dwStartTime  = 0;

    if(Config.Logging)
    {
        Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System] Room [%d] Has Restarted", iRoom +1);
    }
}
コード例 #27
0
ファイル: KalimaGate.cpp プロジェクト: 331515194/zTeamS6.3
//00416F70 - identical
void CKalimaGate::KalimaGateAct2(int iIndex)
{
	LPOBJ lpObj = NULL;
	LPOBJ lpObjCallOwner = NULL;

	if ( OBJMAX_RANGE(iIndex) == FALSE )
		return;

	if ( gObj[iIndex].Live == 0 )
		return;

	if ( !gObjIsConnected(gObj[iIndex].m_RecallMon ) )
	{
		LogAddTD("[Kalima] Kalima Gate Vanished (NextMap) - Summoner Vanished (SummonIndex:%d, EnterCount:%d)",
			iIndex, gObj[iIndex].m_cKalimaGateEnterCount);

		GCDiePlayerSend(&gObj[iIndex], iIndex, 0, 0);
		gObjDel(iIndex);
		gObjCharZeroSet(iIndex);

		return;
	}

	lpObj = &gObj[iIndex];
	lpObjCallOwner = &gObj[lpObj->m_RecallMon];

	if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER )
	{
		lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0;
		lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0;

		LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Enter Count Over (SummonIndex:%d, EnterCount:%d)",
			lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount);

		this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon);

		return;
	}

	DWORD dwTickCount = GetTickCount();

	if ( dwTickCount > (lpObj->RegenTime+60000) )
	{
		lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0;
		lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0;

		LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished (NextMap) - Time Out (SummonIndex:%d, EnterCount:%d)",
			lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount);

		this->DeleteKalimaGate(lpObj->m_Index, lpObjCallOwner->m_Index);

		return;
	}

	if ( lpObj->VPCount < 1 )
		return;

	if ( lpObj->MapNumber < MAP_INDEX_KALIMA1 || lpObj->MapNumber > MAP_INDEX_KALIMA6-1 )
		return;

	int tObjNum = -1;

	for ( int i=0;i<MAX_VIEWPORT_MONSTER;i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if ( tObjNum >= 0 )
		{
			if ( gObj[tObjNum].Type == OBJ_USER )
			{
				if ( gObj[tObjNum].Live )
				{
					if ( abs(lpObj->Y - gObj[tObjNum].Y) < 2 )
					{
						if ( abs(lpObj->X - gObj[tObjNum].X) < 2 )
						{
							if ( lpObj->m_RecallMon == tObjNum || (gObj[tObjNum].PartyNumber != -1 && lpObjCallOwner->PartyNumber == gObj[tObjNum].PartyNumber ))
							{
								int iMoveMapLevel = lpObj->MapNumber - MAP_INDEX_KALIMA1+1;	// #error "Deatwway - remove the -1
								int iGateNumber = g_iKalimaGateGateIndex[iMoveMapLevel];

								if ( !gObjMoveGate(tObjNum, iGateNumber))
								{
									LogAddTD("[Kalima] [%s][%s] - [%s][%s] move fail (MapNumber:%d)",
										lpObjCallOwner->AccountID, lpObjCallOwner->Name,
										gObj[tObjNum].AccountID, gObj[tObjNum].Name,
										lpObj->MapNumber);
								}
								else
								{
									LogAddTD("[Kalima] [%s][%s] - [%s][%s] Transported by Kalima Gate (NextMap) (SummonIndex:%d, GateNo.:%d, MapNumber:%d)",
										lpObjCallOwner->AccountID, lpObjCallOwner->Name,
										gObj[tObjNum].AccountID, gObj[tObjNum].Name,
										iIndex, iMoveMapLevel+1, lpObj->MapNumber);

									gObj[iIndex].m_cKalimaGateEnterCount++;

									if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER )
										break;
								}
							}
						}
					}
				}
			}
		}
	}
}
コード例 #28
0
void CKanturuEntranceNPC::NotifyResultEnterKanturuBossMap(int iIndex)
{
	if ( !gObjIsConnected(iIndex))
	{
		return;
	}

	LPOBJ lpObj = &gObj[iIndex];
	BOOL bMoveGateSuccess = FALSE;
	int iResult = g_Kanturu.CheckEnterKanturu(iIndex);

	if ( iResult == 0 )
	{
		int iCurrentState = g_Kanturu.GetKanturuState();

		if ( iCurrentState == KANTURU_STATE_BATTLE_OF_MAYA )
		{
			bMoveGateSuccess = gObjMoveGate(iIndex, 133);

			if ( bMoveGateSuccess ==TRUE )
			{
				g_KanturuBattleUserMng.AddUserData(iIndex);

				LogAddTD("[Kanturu][BattleUser] Add User [%s][%s] Current Battle User:%d State:[%d-%d] (CharInfoSave : Class=%d, Level=%d, LvPoint=%d, Exp=%u, Str=%d, Dex=%d, Vit=%d, Energy=%d, LeaderShip=%d, Map=%d, Pk=%d",
					gObj[iIndex].AccountID, gObj[iIndex].Name,
					g_KanturuBattleUserMng.GetUserCount(), g_Kanturu.GetKanturuState(),
					g_Kanturu.GetKanturuDetailState(),
					gObj[iIndex].Class, gObj[iIndex].Level, gObj[iIndex].LevelUpPoint,
					gObj[iIndex].Experience, gObj[iIndex].Strength, gObj[iIndex].Dexterity,
					gObj[iIndex].Vitality, gObj[iIndex].Energy, gObj[iIndex].Leadership, 
					gObj[iIndex].MapNumber, gObj[iIndex].m_PK_Level);

				KANTURU_UTIL.NotifyKanturuCurrentState(iIndex, 
					g_Kanturu.GetKanturuState(),g_Kanturu.GetKanturuDetailState());

				gObj[iIndex].m_bKanturuEntranceByNPC = 1;
			}
		}
		else if ( iCurrentState == KANTURU_STATE_TOWER_OF_REFINEMENT )
		{
			bMoveGateSuccess = gObjMoveGate(iIndex, 135);

			KANTURU_UTIL.NotifyKanturuCurrentState(iIndex, 
				g_Kanturu.GetKanturuState(),g_Kanturu.GetKanturuDetailState());

			gObj[iIndex].m_bKanturuEntranceByNPC = 1;
		}
		else
		{
			LogAddTD("[Kanturu][BossMapMove] Error - State(%d) Character[%s][%s]",
				iCurrentState, lpObj->AccountID, lpObj->Name);
		}
	}
	else
	{
		KANTURU_UTIL.NotifyKanturuEntranceReqResult(iIndex, iResult);

		LogAddTD("[Kanturu][BossMapMove] Fail - Result(%d) Character[%s][%s]",
			iResult, lpObj->AccountID, lpObj->Name);

		gObj[iIndex].m_bKanturuEntranceByNPC = 0;
	}
}
コード例 #29
0
void cDuelSystem::RecvDuelAnswer(LPOBJ lpObj, PMSG_DUEL_ANSWER_START* lpMsg)
{
    int iDuelIndex = -1;

    int aIndex = lpObj->m_Index;

    int iDuelRoom = AddTab[aIndex].DUEL_Room;

    PMSG_DUEL_START pMsgSend;

    pMsgSend.h.c		= 0xC1;
    pMsgSend.h.headcode = 0xAA;
    pMsgSend.h.subcode  = 0x01;
    pMsgSend.bDuelStart = 0;
    pMsgSend.h.size		= sizeof(pMsgSend);

    LPOBJ gObjg    = (LPOBJ)OBJECT_POINTER(aIndex);

    if(iDuelRoom < 0 || iDuelRoom > MAX_DUEL_ROOMS - 1)
    {
        return;
    }

    if(gObjg->CloseType != -1)
    {
        return;
    }

    iDuelIndex = MAKE_NUMBERW(lpMsg->NumberH, lpMsg->NumberL); // aIndex Packet C1 XX AA

    OBJECTSTRUCT *gObjs = (OBJECTSTRUCT*)OBJECT_POINTER(iDuelIndex);

    if(iDuelIndex <= 7999 || lpObj->m_Index <= 7999)
    {
        return;
    }

    if(OBJECT_MAXRANGE(iDuelIndex))
    {
        if(!Utilits.gObjIsConnected(iDuelIndex))
        {
            return;
        }

        if(gObjs->Type == OBJECT_MONSTER)
        {
            return;
        }

        if(gObjs->CloseCount >= 0)
        {
            return;
        }

        if(lpMsg->bDuelOK)
        {
            if
            (
                (gObjs->MapNumber >= 11 && gObjs->MapNumber <= 17) || gObjs->MapNumber == 52  ||
                (gObjs->MapNumber >= 18 && gObjs->MapNumber <= 23) || gObjs->MapNumber == 53 ||
                gObjs->MapNumber == 9 || gObjs->MapNumber == 32 ||
                (gObjs->MapNumber >= 45 && gObjs->MapNumber <= 50)
            )
            {
                GCServerMsgStringSend("Duels are not allowed in event maps.", lpObj->m_Index, 1);

                this->RoomReset(iDuelRoom, true, true);

                memcpy(pMsgSend.szName, lpObj->Name, sizeof(pMsgSend.szName));

                DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

                return;
            }
        }

        if(OBJECT_MAXRANGE(lpObj->m_iDuelUser))
        {
            GCServerMsgStringSend("You are already in a Duel.", lpObj->m_Index, 1);
            GCServerMsgStringSend("In order to issue a Duel, cancel the previous request.", lpObj->m_Index, 1);

            this->RoomReset(iDuelRoom, true, true);

            memcpy(pMsgSend.szName, lpObj->Name, sizeof(pMsgSend.szName));

            DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

            return;
        }

        if(OBJECT_MAXRANGE(lpObj->m_iDuelUserReserved))
        {
            GCServerMsgStringSend("You are already issuing a Duel challenge.", lpObj->m_Index, 1);

            this->RoomReset(iDuelRoom, true, true);

            memcpy(pMsgSend.szName, lpObj->Name, sizeof(pMsgSend.szName));

            DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

            return;
        }
        if(gObjs->m_iDuelUserReserved == lpObj->m_Index)
        {
            char szDuelName[MAX_ACCOUNT_LEN + 1]  = {0};
            char szDuelName2[MAX_ACCOUNT_LEN + 1] = {0};

            memcpy(szDuelName, gObjs->Name, MAX_ACCOUNT_LEN);

            szDuelName[MAX_ACCOUNT_LEN] = 0;

            memcpy(szDuelName2, lpMsg->szName, MAX_ACCOUNT_LEN);

            szDuelName2[MAX_ACCOUNT_LEN] = 0;

            if(!strcmp(szDuelName, szDuelName2))
            {
                if(lpMsg->bDuelOK == false)
                {
                    this->RoomReset(iDuelRoom, true, true);

                    pMsgSend.bDuelStart = 0x0F;

                    memcpy(pMsgSend.szName, lpObj->Name, sizeof(pMsgSend.szName));

                    DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);
                }

                else if (lpMsg->bDuelOK == true)
                {
                    if(gObjMoveGate(lpObj->m_Index, g_DuelGates[iDuelRoom].Gate01) == false)
                    {
                        this->RoomReset(iDuelRoom, true, true);

                        return;
                    }

                    if(gObjMoveGate(iDuelIndex, g_DuelGates[iDuelRoom].Gate02) == false)
                    {
                        this->RoomReset(iDuelRoom, true, true);

                        return;
                    }

                    gObjs->m_iDuelUserReserved	= -1;
                    gObjs->m_btDuelScore		= 0;
                    gObjs->m_iDuelUser			= lpObj->m_Index;
                    gObjs->m_iDuelTickCount		= GetTickCount();

                    this->g_DuelRooms[iDuelRoom].dwStartTime	= GetTickCount();
                    this->g_DuelRooms[iDuelRoom].dwTicketCount  = GetTickCount() + (MAX_DUEL_TIME * 60000);

                    lpObj->m_iDuelUserRequested = -1;
                    lpObj->m_iDuelUserReserved  = -1;
                    lpObj->m_btDuelScore		= 0;
                    lpObj->m_iDuelUser			= iDuelIndex;
                    lpObj->m_iDuelTickCount		= GetTickCount();

                    this->g_DuelRooms[iDuelRoom].RoomFree		= FALSE;
                    this->g_DuelRooms[iDuelRoom].DuelWaiting	= FALSE;
                    this->g_DuelRooms[iDuelRoom].szWinner		= FALSE;

                    pMsgSend.bDuelStart		= 0;
                    pMsgSend.NumberH		= SET_NUMBERH(iDuelIndex);
                    pMsgSend.NumberL		= SET_NUMBERL(iDuelIndex);

                    memcpy(pMsgSend.szName, szDuelName, sizeof(pMsgSend.szName));

                    DataSend(lpObj->m_Index, (LPBYTE)&pMsgSend, pMsgSend.h.size);

                    pMsgSend.NumberH		= SET_NUMBERH(lpObj->m_Index);
                    pMsgSend.NumberL		= SET_NUMBERL(lpObj->m_Index);

                    memcpy(pMsgSend.szName, lpObj->Name, sizeof(pMsgSend.szName));

                    DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

                    this->UpdateDuelScore(iDuelRoom);

                    Chat.MessageAllLog(0, 0, c_Cyan, t_Duel, lpObj, "Duelo %s VS %s na sala %d!", lpObj->Name, gObjs->Name, iDuelRoom + 1);

                    Log.ConsoleOutPut(1, c_Blue,t_Duel,"[Duel System] Duel Started [%s][%s] VS [%s][%s] on Room[%d]",lpObj->AccountID, lpObj->Name, gObjs->AccountID, gObjs->Name, iDuelRoom + 1);
                }
            }
            else
            {
                this->RoomReset(iDuelRoom);
                DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

                return;
            }
        }
        else
        {
            this->RoomReset(iDuelRoom);
            DataSend(iDuelIndex, (LPBYTE)&pMsgSend, pMsgSend.h.size);

            return;
        }
    }
}