Пример #1
0
BOOL NpcShadowPhantom(LPOBJ lpNpc, LPOBJ lpObj)
{
	if ( gObjIsConnected(lpObj->m_Index) == FALSE )
	{
		return TRUE;
	}

	if ( lpObj->Level > MAX_NPC_PHANTOM_BUFFER )
	{
		GCServerCmd(lpObj->m_Index, 0x0D, 0, 0);
		
		return TRUE;
	}

	lpObj->m_iSkillNPCHelpTime = GetTickCount();
	lpObj->m_iSkillNPCDefense = lpObj->Level / 5 + 50;	// FORMULA
	lpObj->m_iSkillNPCAttack = lpObj->Level / 3 + 45;	// FORMULA

	lpObj->m_ViewSkillState[eVS_NPC_HELP] = 1;
	GCStateInfoSend(lpObj, 1, eVS_NPC_HELP);

	return TRUE;
}
Пример #2
0
int CIllusionTempleEvent::TeleportLock(int iIndex)
{
	if( gObjIsConnected(iIndex) == FALSE )
	{
		return FALSE;
	}

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

	if( IT_MAP_RANGE( gObj[iIndex].MapNumber ) == FALSE || m_TempleData[ gObj[iIndex].MapNumber - MAP_INDEX_ILLUSIONTEMPLE1 ].GetState() != 2)
	{
		return FALSE;
	}

	if( iIndex == m_TempleData[ gObj[iIndex].MapNumber - MAP_INDEX_ILLUSIONTEMPLE1 ].GetRelicPlayer() )
	{
		return TRUE;
	}
return FALSE;
}
int gObjAddBuffEffectWideArea(LPOBJ lpTargetObj,int nDistance,int & nAffectedCount,int iBuffIndex,BYTE EffectType1,int EffectValue1,BYTE EffectType2,int EffectValue2,int Duration)
{
	if(lpTargetObj == NULL)
		return FALSE;

	for(int iIndex = OBJ_STARTUSERINDEX; iIndex < OBJMAX; iIndex++)
	{
		LPOBJ lpObj = &gObj[iIndex];

		if(lpObj->Type == OBJ_USER && gObjIsConnected(iIndex) != FALSE)
		{
			if(lpObj->MapNumber == lpTargetObj->MapNumber)
			{
				if(gObjCalDistance(lpTargetObj,lpObj) < nDistance)
				{
					gObjAddBuffEffect(lpObj, iBuffIndex, EffectType1, EffectValue1, EffectType2, EffectValue2, Duration);
					nAffectedCount+= 1;
				}
			}
		}
	}
	return TRUE;
}
Пример #4
0
void CGReqQuestExp(PMSG_REQ_NPC_QUESTEXP *pMsg, int aIndex)
{
    if( !OBJMAX_RANGE(aIndex) )
        return;

    OBJECTSTRUCT* lpObj = &gObj[aIndex];

    if( !gObjIsConnected(aIndex) )
        return;

    if( lpObj->m_bUserQuestInfoSent == 1 )
    {
        lua_State* L = g_MuLuaQuestExp.GetLua();

        if( !L )
        {
            LogAddTD("[QuestExp] - Error - [%s] [%d]", __FILE__, __LINE__);
            return;
        }

        g_Generic_Call(L, "NpcTalkClick", "ii>", lpObj->TargetShopNumber, lpObj->m_Index);
    }
}
Пример #5
0
void CCrywolf::SetCrywolfCommonNPC(int iOccupationState)
{
	for ( int i=0;i<this->m_ObjCommonNPC.m_iObjCount ; i++)
	{
		if ( !gObjIsConnected(this->m_ObjCommonNPC.m_iObjIndex[i]) )
			break;

		LPOBJ lpObj = &gObj[this->m_ObjCommonNPC.m_iObjIndex[i]];

		if ( iOccupationState == 2 )
		{
			BuffEffectC.EnableBuff(this->m_ObjCommonNPC.m_iObjIndex[i], 27, -1, 0, 0, 0);
		}
		else if ( iOccupationState == 0 )
		{
			BuffEffectC.DelEffect(&gObj[this->m_ObjCommonNPC.m_iObjIndex[i]], 27);
		}
		else if ( iOccupationState == 1 )
		{
			BuffEffectC.EnableBuff(this->m_ObjCommonNPC.m_iObjIndex[i], 27, -1, 0, 0, 0);
		}
	}
}
Пример #6
0
BOOL CCastleSiegeSync::CheckCastleOwnerMember(int iIndex)
{
	if ( gObjIsConnected(iIndex) == FALSE )
	{
		//DebugLog("%s Not Connected",__FUNCTION__);
		return FALSE;
	}

	if ( strcmp(this->m_szCastleOwnerGuild, "") == 0 )
	{
		//DebugLog("%s Empty Guild Name",__FUNCTION__);
		return FALSE;
	}

	if ( strcmp(gObj[iIndex].GuildName, this->m_szCastleOwnerGuild) != 0 )
	{
		//DebugLog("%s Guild Name [%s] vs [%s]",__FUNCTION__,gObj[iIndex].GuildName,this->m_szCastleOwnerGuild);
		return FALSE;
	}

	//DebugLog("%s OK",__FUNCTION__);
	return TRUE;
}
Пример #7
0
BOOL NpcDuprianSteward(LPOBJ lpNpc,LPOBJ lpObj)
{
#if (__GENS_SYSTEM__ == 1)
	if ( gObjIsConnected(lpObj->m_Index) == FALSE )
	{
		return TRUE;
	}

	PMSG_TALKRESULT_EX pMsg = {0};
	pMsg.h.c = 0xC3;
	pMsg.h.headcode = 0xF9;
	pMsg.h.size = sizeof(pMsg);

	pMsg.btResult = TRUE;
	pMsg.wNpcId = lpNpc->Class;

	pMsg.Info = lpObj->m_GensInfo.iContribution;

	lpObj->TargetShopNumber = 543;
	DataSend(lpObj->m_Index,(LPBYTE)&pMsg,pMsg.h.size);
#endif
	return TRUE;
}
BOOL CImperialBattleUserMng::AddUserData(int iIndex)
{
	if ( !gObjIsConnected(iIndex))
	{
		LogAddTD("[Imperial][User Mng] Add User Fail - Disconnect User [%s][%s]",
			gObj[iIndex].AccountID, gObj[iIndex].Name);

		return FALSE;
	}

	for ( int iCount=0;iCount<MAX_IMPERIAL_BATTLE_USER;iCount++)
	{
		if ( this->m_BattleUser[iCount].IsUseData() == FALSE )
		{
			this->m_BattleUser[iCount].SetIndex(iIndex);
			this->m_iBattleUserCount++;
			
			return TRUE;
		}
	}

	return FALSE;
}
Пример #9
0
void CKanturuMaya::KanturuMayaAct_IceStorm(int iSkillUsingRate)
{
	if ( (rand()%10000) > iSkillUsingRate )
		return;

	if ( this->m_iMayaObjIndex < 0 || this->m_iMayaObjIndex >= OBJMAX )	// #errot change to OBJMAX-1
		return;

	for ( int iCount=OBJ_STARTUSERINDEX;iCount < OBJMAX;iCount++)
	{
		if ( gObj[iCount].Type == OBJ_USER &&
			 gObjIsConnected(iCount) &&
			 gObj[iCount].MapNumber == MAP_INDEX_KANTURU_BOSS )
		{
			KANTURU_UTIL.NotifyKanturuWideAreaAttack(this->m_iMayaObjIndex, iCount, 0);
			TMonsterSkillManager::UseMonsterSkill(this->m_iMayaObjIndex, iCount, 31,-1,0);
			this->m_iIceStormCount++;
		}
	}

	LogAddTD("[ KANTURU ][ IceStorm ] Skill Using(%d) : Index(%d) %s",
		this->m_iIceStormCount, this->m_iMayaObjIndex, gObj[this->m_iMayaObjIndex].Name);
}
Пример #10
0
void CCrywolf::OperateGmCommand(int iUserIndex, int iCommand)
{
	if ( !gObjIsConnected(iUserIndex))
		return;

	if ( (gObj[iUserIndex].Authority & 0x02) != 0x02 )
		return;

	LogAddTD("[ Crywolf ][Use GM Command] [%s][%s] Command : %d",
		gObj[iUserIndex].AccountID, gObj[iUserIndex].Name, iCommand);

	switch ( iCommand )
	{
		case 0:
			this->SetState(CRYWOLF_STATE_NOTIFY_2);
			break;

		case 1:
			this->SetState(CRYWOLF_STATE_READY);
			break;

		case 2:
			if ( this->GetCrywolfState() == CRYWOLF_STATE_READY )
			{
				this->SetState(CRYWOLF_STATE_START);
			}
			else
			{
				MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 246)));
			}
			break;

		case 3:
			this->SetState(CRYWOLF_STATE_END);
			break;
	}
}
Пример #11
0
void CCrywolf::OperateGmCommand(int iUserIndex, int iCommand)
{
	if ( !gObjIsConnected(iUserIndex))
		return;

	if ( (gObj[iUserIndex].Authority & 0x02) != 0x02 )
		return;

	LogAdd("[ Crywolf ][Use GM Command] [%s][%s] Command : %d",
		gObj[iUserIndex].AccountID, gObj[iUserIndex].Name, iCommand);

	switch ( iCommand )
	{
		case 0:
			this->SetState(CRYWOLF_STATE_NOTIFY_2);
			break;

		case 1:
			this->SetState(CRYWOLF_STATE_READY);
			break;

		case 2:
			if ( this->GetCrywolfState() == CRYWOLF_STATE_READY )
			{
				this->SetState(CRYWOLF_STATE_START);
			}
			else
			{
				MsgOutput(iUserIndex, "Prepare for the attack of Balgass's army on Crywolf Fortress");
			}
			break;

		case 3:
			this->SetState(CRYWOLF_STATE_END);
			break;
	}
}
Пример #12
0
BOOL CCustomOlymp::NpcTalk(LPOBJ lpNpc,LPOBJ lpObj)
{
	if( !this->m_bOlympEnable )
		return true;

	if( !gObjIsConnected(lpObj->m_Index) )
		return true;

	lpObj->m_IfState.use = 1;
	lpObj->m_IfState.type = 21;

	PSMG_OLP_NPCTALK pMsg;
	PHeadSubSetB((LPBYTE)&pMsg,0xFE,0x00,sizeof(PSMG_OLP_NPCTALK));

	pMsg.btOpen = m_bOPEN;

	if( m_bFIGHT_START || m_dwFIGHT_START > 0 )
		pMsg.btOpen = FALSE;

	pMsg.btRegistered = IsRegistered(lpObj->m_Index);

	DataSend(lpObj->m_Index,(LPBYTE)&pMsg,pMsg.h.size);
	return true;
}
BOOL CIllusionTempleEvent::CheckRelics(int nIndex)
{
	if (  gObjIsConnected(nIndex) == FALSE )
	{
		return FALSE;
	}

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

	if(IT_MAP_RANGE(gObj[nIndex].MapNumber) == FALSE || this->m_cIllusionTempleProc[gObj[nIndex].MapNumber - 45].GetIllusionTempleState() != 2)
	{
		return FALSE;
	}

	if(nIndex == this->m_cIllusionTempleProc[gObj[nIndex].MapNumber - 45].GetRelicsUserIndex())
	{
		return TRUE;
	}

	return FALSE;
}
Пример #14
0
// -----------------------------------------------------------------------------------------------------------------------------------------------------
void CPersonalShop::ClosePersonalShop(int aIndex)
{
	LPOBJ lpObj = &gObj[aIndex];
	// ------
	if( !gObjIsConnected(aIndex) )
	{
		CLog.LogAddC(TColor.Red(), PShopModule, "(Error): [%s][%s] is Offline Player.", lpObj->AccountID, lpObj->Name);
		return;
	}
	// ------
	if( lpObj->Type != OBJ_USER )
	{
		CLog.LogAddC(TColor.Red(), PShopModule, "(Error): [%s] isn't an Object User.", lpObj->m_Index);
		return;
	}
	// ------
	CLog.LogAddC(TColor.Blue(), PShopModule, "[%s][%s] Requested to Close PShop", lpObj->AccountID, lpObj->Name);
	// ------
	lpObj->m_bPShopOpen = false;
	// ------
	memset(lpObj->m_szPShopText, 0, sizeof(lpObj->m_szPShopText));
	// ------
	SendPShopCloseResult(aIndex, 1);
}
Пример #15
0
int CLifeStone::SetReSpawnUserXY(int iUserIndex)
{
	if(gObjIsConnected(iUserIndex) == FALSE)
		return false;

	LPOBJ lpUser = &gObj[iUserIndex];

	if(lpUser->MapNumber != MAP_INDEX_CASTLESIEGE)
		return false;

	if(lpUser->lpGuild == NULL)
		return false;

	BYTE btCsJoinSide = lpUser->m_btCsJoinSide;

	if(lpUser->lpGuild->lpLifeStone == NULL)
		return false;

	LPOBJ lpLifeStone = lpUser->lpGuild->lpLifeStone;
	lpUser->MapNumber = MAP_INDEX_CASTLESIEGE;
	lpUser->X = lpLifeStone->X;
	lpUser->Y = lpLifeStone->Y;
	return true;
}
Пример #16
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;
	}
}
Пример #17
0
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void CGPartyRequestRecv(PMSG_PARTYREQUEST * lpMsg, int aIndex)
{
	int number =  MAKE_NUMBERW(lpMsg->NumberH, lpMsg->NumberL);
	PMSG_PARTYREQUESTSEND pMsg;

	if ( number < 0 || number > OBJMAX-1)
		return;

	if (!PacketCheckTime(&gObj[aIndex]))
		return;

	if ( !gObjIsConnected(&gObj[number]))
	{
		::GCResultSend(aIndex, 0x41, 0x03);
		return;
	}

	if ( gObj[aIndex].CloseCount >= 0 || gObj[number].CloseCount >= 0 )
	{
		::GCResultSend(aIndex, 0x41, 0x00);
		return;
	}

	if ( gObj[number].GenFamily != gObj[aIndex].GenFamily )
	{
		::GCServerMsgStringSend("Can't make party with different gen member", aIndex, 1);
		return;
	}

	if ( gUser.ChaosCastleMapRange(gObj[aIndex].MapNumber) == true )
	{
		::GCServerMsgStringSend(lMsg.Get(MSGGET(4, 198)), aIndex, 1);
		return;
	}

	if ( IT_MAP_RANGE(gObj[aIndex].MapNumber) )
	{
		::GCServerMsgStringSend("Can't make party in Illusion Temple", aIndex, 1);
		return;
	}

#if (FOREIGN_GAMESERVER==1)
	if ( szAuthKey[4] != AUTHKEY4 )
		DestroyGIocp();
#endif

	//LogAddL("Party result : %d %d %d %d", gObj[aIndex].CloseCount, gObj[number].CloseCount, gObj[aIndex].Connected, gObj[number].Connected);
	//LogAddL("%s %s", gObj[aIndex].Name, gObj[number].Name);

	if ( gObj[aIndex].m_IfState.use > 0 )
	{
		::GCResultSend(aIndex, 0x41, 0x00);
		return;
	}
		
	if ( gObj[number].m_IfState.use > 0 )
	{
		::GCResultSend(aIndex, 0x41, 0x00);
		return;
	}

	if ( (gObj[number].m_Option &1) != TRUE )
	{
		::GCResultSend(aIndex, 0x41, 0x01);
		return;
	}

	if ( gObj[aIndex].PartyNumber >= 0 )
	{
		int iUserIndex;
		int iDbNumber;
		gParty.GetIndexUser(gObj[aIndex].PartyNumber, 0, iUserIndex, iDbNumber);
		
		if ( iUserIndex < 0 || ( iUserIndex != aIndex && gObj[aIndex].DBNumber != iDbNumber )  )
		{
			::GCResultSend(aIndex, 0x41, 0x00);
			return;

		}
	}

	if ( gObj[aIndex].PartyTargetUser >= 0 )
		return;

	if ( gObj[number].PartyNumber >= 0 )
	{
		::GCResultSend(aIndex, 0x41, 0x04);
		return;
	}

	if ( gObj[number].PartyTargetUser >= 0 )
	{
		::GCResultSend(aIndex, 0x41, 0x00);
		return;
	}

	int maxlevel = 0;
	int minlevel = 0;

	/*if ( gObj[number].PartyNumber >= 0 )
	{
		if ( gParty.GetLevel( gObj[number].PartyNumber, maxlevel, minlevel) == TRUE )
		{
			int limmaxlevel;
			int limmaxlevel2;

			if ( maxlevel > gObj[number].Level )
				limmaxlevel = maxlevel;
			else
				limmaxlevel = gObj[number].Level;

			if ( maxlevel < gObj[number].Level )
				limmaxlevel2 = maxlevel;
			else
				limmaxlevel2 = gObj[number].Level;

			if ( (limmaxlevel - limmaxlevel2) > MAX_PARTY_LEVEL_DIFFERENCE )
			{
				::GCResultSend(aIndex, 0x41, 0x05);
				// Restricted level for the party is %d
				// DEATHWAY FIX HERE
				LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level);
				return;
			}

			int limminlevel;
			int limminlevel2;

			if ( maxlevel > gObj[number].Level )
				limminlevel = minlevel;
			else
				limminlevel = gObj[number].Level;

			if ( maxlevel < gObj[number].Level )
				limminlevel2 = minlevel;
			else
				limminlevel2 = gObj[number].Level;

			if ( (limminlevel - limminlevel2) > MAX_PARTY_LEVEL_DIFFERENCE )
			{
				::GCResultSend(aIndex, 0x41, 0x05);
				// Restricted level for the party is %d
				// DEATHWAY FIX HERE
				LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level);
				return;
			}
		}
	}
	else
	{
		short sMaxMinLevel[2];

		if ( gObj[aIndex].Level > gObj[number].Level )
			sMaxMinLevel[1] = gObj[aIndex].Level;
		else
			sMaxMinLevel[1] = gObj[number].Level;
		
		if ( gObj[aIndex].Level < gObj[number].Level )
			sMaxMinLevel[0] = gObj[aIndex].Level;
		else
			sMaxMinLevel[0] = gObj[number].Level;
		
		if ( (sMaxMinLevel[1]- sMaxMinLevel[0]) >MAX_PARTY_LEVEL_DIFFERENCE)
		{
			::GCResultSend(aIndex, 0x41, 0x05);
			// Restricted level for the party is %d
			// DEATHWAY FIX HERE
			LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level);
			return;
		}
	}*/

	gObj[aIndex].m_IfState.use = TRUE;
	gObj[aIndex].m_IfState.type = 2;
	gObj[aIndex].m_IfState.state = 0;
	gObj[number].m_IfState.use = TRUE;
	gObj[number].m_IfState.type = 2;
	gObj[number].m_IfState.state = 0;
	gObj[aIndex].TargetNumber = number;
	gObj[number].TargetNumber = aIndex;
	gObj[aIndex].m_InterfaceTime = GetTickCount();
	gObj[number].m_InterfaceTime = GetTickCount();
	gObj[aIndex].PartyTargetUser = number;
	
	C1HeadSet((LPBYTE)&pMsg, 0x40, sizeof(pMsg));
	pMsg.NumberH = SET_NUMBERH(aIndex);
	pMsg.NumberL = SET_NUMBERL(aIndex);

	gSendProto.DataSend(number, (LPBYTE)&pMsg, pMsg.h.size);
}
Пример #18
0
//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;
								}
							}
						}
					}
				}
			}
		}
	}
}
Пример #19
0
void CLifeStone::LifeStoneAct(int iIndex) //Identical
{
	if(!gObjIsConnected(iIndex))
	{
		return;
	}

	LPOBJ lpObj = &gObj[iIndex];

	lpObj->m_iCreatedActivationTime++;
	BYTE btCreationState = lpObj->m_btCreationState; //HermeX Fix

	if(lpObj->m_iCreatedActivationTime < 60 )
	{
		lpObj->m_btCreationState = (lpObj->m_iCreatedActivationTime / 12);
	}
	else //HermeX Fix
	{
		lpObj->m_btCreationState = 5;
	}

	if(btCreationState != lpObj->m_btCreationState) //HermeX Fix
	{
		::GCSendObjectCreationState(iIndex);
	}

	if(lpObj->m_btCreationState < 5)
	{
		return;
	}

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

		int tObjNum = -1;

		for(int i = 0; i < MAX_VIEWPORT; i++) //HermeX Fix
		{
			BOOL iRecoverLife,iRecoverMana,iRecoverBP;

			tObjNum = lpObj->VpPlayer[i].number;
				
			if(tObjNum >= 0)
			{
				if(gObj[tObjNum].Type == OBJ_USER)
				{
					if(gObj[tObjNum].Live != FALSE)
					{
						if(gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide)
						{
							if(abs(lpObj->Y - gObj[tObjNum].Y) <= 3)
							{
								if(abs(lpObj->X - gObj[tObjNum].X) <= 3) //fix
								{
									iRecoverLife = FALSE;
									iRecoverMana = FALSE;
									iRecoverBP = FALSE;

									if(gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) //SirMaster Fix
									{
										gObj[tObjNum].Life += ((gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) / 100 ); //SirMaster Fix
										
										if(gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) //SirMaster Fix
										{
											gObj[tObjNum].Life = (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife); //SirMaster Fix
										}
										iRecoverLife = TRUE;
									}

									if(gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) ) //SirMaster Fix
									{
										gObj[tObjNum].Mana += ((gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) / 100 ); //SirMaster Fix
	
										if(gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) //SirMaster Fix
										{
											gObj[tObjNum].Mana = (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana); //SirMaster Fix
										}
										iRecoverMana = TRUE;
									}

									if(gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
									{
										gObj[tObjNum].BP += ((gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) / 100);

										if(gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
										{
											gObj[tObjNum].BP = (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP);
										}
										iRecoverBP = TRUE;
									}

									if(iRecoverLife != FALSE)
									{
										::GCReFillSend(tObjNum,gObj[tObjNum].Life,0xFF,1,gObj[tObjNum].iShield);
									}

									if( (iRecoverMana != FALSE) || (iRecoverBP != FALSE) )
									{
										::GCManaSend(tObjNum,gObj[tObjNum].Mana,0xFF,0,gObj[tObjNum].BP);
									}
								}
							}
						}
					}
				}
			}
			continue;
		}
}
Пример #20
0
//00414B10 - identical
BOOL CKalimaGate::CreateKalimaGate(int iIndex, BYTE btLevel, BYTE cTX, BYTE cTY)
{
	BOOL bKalimaGateCreateSucceed=FALSE;
	int iMonsterIndex=-1;

	
	EnterCriticalSection(&this->m_critKalimaGate );
	
	__try
	{
		int iKalimaGateLevel;
		int iMapNumber;
		BYTE btMapAttr;
		int iMonsterType;
		BYTE cX;
		BYTE cY;

		
		if ( gObjIsConnected(iIndex) == PLAYER_EMPTY )
		{
			return false;
		}

		LogAddTD("[Kalima] [%s][%s] Try to Create Kalima Gate", gObj[iIndex].AccountID, gObj[iIndex].Name);
		iKalimaGateLevel = this->GetKalimaGateLevel(iIndex);

		if ( iKalimaGateLevel < btLevel-1 )
		{
			return false;
		}

		iKalimaGateLevel = btLevel-1;

		if (  DS_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( BC_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( CC_MAP_RANGE(gObj[iIndex].MapNumber) )
		{
			return false;
		}

		if ( CHECK_ILLUSIONTEMPLE(gObj[iIndex].MapNumber) )//NEW
		{
			return false;
		}

#ifdef IMPERIAL
		if( CImperialGuardian::IsEventMap(gObj[iIndex].MapNumber) )
		{
			return false;
		}
#endif

		if ( KALIMA_FLOOR_RANGE(iKalimaGateLevel)== FALSE )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Gate Level Check Error : %d",
				gObj[iIndex].AccountID, gObj[iIndex].Name, iKalimaGateLevel+1);
			return false;
		}

		iMapNumber = gObj[iIndex].MapNumber;

		btMapAttr = MapC[iMapNumber].GetAttr(gObj[iIndex].X, gObj[iIndex].Y);

		if ( btMapAttr &1 != 0 )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Called in Saftey Area (Map:%d, X:%d, Y:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber,
				gObj[iIndex].X, gObj[iIndex].Y);
			return false;
		}

		if ( gObj[iIndex].m_cKalimaGateExist == TRUE )
		{
			GCServerMsgStringSend(lMsg.Get( MSGGET( 4, 224)), iIndex, 1);
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Already Have Gate (SummonIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex);
			return false;
		}

		iMonsterType = iKalimaGateLevel+152;
		cX = cTX;
		cY = cTY;

		btMapAttr = MapC[iMapNumber].GetAttr(cX, cY);

		if ( btMapAttr != 0 )
		{
			if (this->GetRandomLocation(iMapNumber, cX, cY) == 0)
			{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Failed to get Location (MapNumber:%d, X:%d, Y:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber, cX, cY);
			return false;
			}
		}

		if ( gObj[iIndex].MapNumber == 10 )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Uable to Summon in this Map (MapNumber:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber);
			return false;
		}

		iMonsterIndex = gObjAddMonster(iMapNumber);

		if ( iMonsterIndex >= 0 )
		{
			LPMONSTER_ATTRIBUTE lpMATTR = gMAttr.GetAttr(iMonsterType);
			
			if ( lpMATTR == NULL )
			{
				gObjDel(iMonsterIndex);
				LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - lpMATTR == NULL (SummonIndex:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex);
				return false;
			}

			gObjSetMonster(iMonsterIndex, iMonsterType);
			gObj[iMonsterIndex].Live = TRUE;
			gObj[iMonsterIndex].Life = 1000.0;
			gObj[iMonsterIndex].MaxLife = 1000.0;
			gObj[iMonsterIndex].m_PosNum = -1;
			gObj[iMonsterIndex].X = cX;
			gObj[iMonsterIndex].Y = cY;
			gObj[iMonsterIndex].MTX = cX;
			gObj[iMonsterIndex].MTY = cY;
			gObj[iMonsterIndex].TX = cX;
			gObj[iMonsterIndex].TY = cY;
			gObj[iMonsterIndex].m_OldX = cX;
			gObj[iMonsterIndex].m_OldY = cY;
			gObj[iMonsterIndex].StartX = cX;
			gObj[iMonsterIndex].StartY = cY;
			gObj[iMonsterIndex].MapNumber = iMapNumber;
			gObj[iMonsterIndex].m_MoveRange = 0;
			gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0;

			gObj[iIndex].m_cKalimaGateExist = TRUE;
			gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex;

			gObj[iMonsterIndex].Level = lpMATTR->m_Level;
			gObj[iMonsterIndex].Type = OBJ_MONSTER;
			gObj[iMonsterIndex].MaxRegenTime = 1000;
			gObj[iMonsterIndex].Dir = 1;

			gObj[iMonsterIndex].m_RecallMon = iIndex;
			gObj[iMonsterIndex].RegenTime = GetTickCount();
			gObj[iMonsterIndex].m_Attribute = iKalimaGateLevel + 51;
			gObj[iMonsterIndex].DieRegen = FALSE;
			
			LogAddTD("[Kalima] [%s][%s] Create Kalima Gate Successfuly (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d, GateNo.:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime,
				gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X,
				gObj[iMonsterIndex].Y, iMonsterIndex, iIndex, iKalimaGateLevel+1);
			bKalimaGateCreateSucceed = TRUE;
		}
	}
	__finally
	{
		LeaveCriticalSection(&this->m_critKalimaGate);
	}

	return true;
}
Пример #21
0
//004166C0 - identical
BOOL CKalimaGate::CreateKalimaGate2(int iIndex, int iMonMapNumber, BYTE cTX, BYTE cTY)
{	
	BOOL bKalimaGateCreateSucceed = FALSE;
	int iMonsterIndex = -1;

	EnterCriticalSection(&this->m_critKalimaGate);

	__try
	{
		if ( !gObjIsConnected(iIndex))
			return FALSE;

		LogAddTD("[Kalima] [%s][%s] Try to Create Kalima Gate (NextMap)",
			gObj[iIndex].AccountID, gObj[iIndex].Name);

		if ( iMonMapNumber < MAP_INDEX_KALIMA1 || iMonMapNumber > MAP_INDEX_KALIMA6-1 )
		{
			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - MapNumber Error : %d",
				gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber);

			return FALSE;
		}

		if ( gObj[iIndex].m_cKalimaGateExist == TRUE )
		{
			GCServerMsgStringSend(lMsg.Get(MSGGET(4, 224)), iIndex, 1);

			LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Already Have Gate (SummonIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex);
	
			return FALSE;
		}

		int iMonsterType = iMonMapNumber + 129;
		BYTE cX = cTX;
		BYTE cY = cTY;
		BYTE btMapAttr = MapC[iMonMapNumber].GetAttr(cX, cY);

		if ( btMapAttr != 0 )
		{
			if ( this->GetRandomLocation(iMonMapNumber, cX, cY) == FALSE )
			{
				LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Failed to get Location (MapNumber:%d, X:%d, Y:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber, cX, cY);

				return FALSE;
			}
		}

		iMonsterIndex = gObjAddMonster(iMonMapNumber);

		if ( iMonsterIndex >= 0 )
		{
			MONSTER_ATTRIBUTE * lpMATTR = gMAttr.GetAttr(iMonsterType);

			if ( !lpMATTR )
			{
				gObjDel(iMonsterIndex);

				LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished (NextMap) - lpMATTR == NULL (SummonIndex:%d)",
					gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex);

				return FALSE;
			}

			gObjSetMonster(iMonsterIndex, iMonsterType);
			gObj[iMonsterIndex].Live = TRUE;
			gObj[iMonsterIndex].Life = 1000.0;
			gObj[iMonsterIndex].MaxLife = 1000.0;
			gObj[iMonsterIndex].m_PosNum = -1;
			gObj[iMonsterIndex].X = cX;
			gObj[iMonsterIndex].Y = cY;
			gObj[iMonsterIndex].MTX = cX;
			gObj[iMonsterIndex].MTY = cY;
			gObj[iMonsterIndex].TX = cX;
			gObj[iMonsterIndex].TY = cY;
			gObj[iMonsterIndex].m_OldX = cX;
			gObj[iMonsterIndex].m_OldY = cY;
			gObj[iMonsterIndex].StartX = cX;
			gObj[iMonsterIndex].StartY = cY;
			gObj[iMonsterIndex].MapNumber = iMonMapNumber;
			gObj[iMonsterIndex].m_MoveRange = 0;
			gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0;

			gObj[iIndex].m_cKalimaGateExist = TRUE;
			gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex;

			gObj[iMonsterIndex].Level = lpMATTR->m_Level;
			gObj[iMonsterIndex].Type = OBJ_MONSTER;
			gObj[iMonsterIndex].MaxRegenTime = 1000;
			gObj[iMonsterIndex].Dir = 1;

			gObj[iMonsterIndex].m_RecallMon = iIndex;
			gObj[iMonsterIndex].RegenTime = GetTickCount();
			gObj[iMonsterIndex].m_Attribute = 58;
			gObj[iMonsterIndex].DieRegen = FALSE;
			
			LogAddTD("[Kalima] [%s][%s] Create Kalima Gate Successfuly (NextMap) (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d)",
				gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime,
				gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X,
				gObj[iMonsterIndex].Y, iMonsterIndex, iIndex);
			bKalimaGateCreateSucceed = TRUE;


		}
	}
	__finally
	{
		LeaveCriticalSection(&this->m_critKalimaGate);
	}

	return TRUE;
}
Пример #22
0
//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;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
Пример #23
0
BOOL CWeapon::Attack(LPOBJ lpObj, LPOBJ lpTargetObj, CMagicInf * lpMagic, int iCriticalDamage, int iActionType)
{
	int iSkill = 0;
	int iSkillSuccess = TRUE;
	BYTE MsgDamage = 0;
	int ManaChange = 0;

	if ( lpMagic != NULL )
	{
		iSkill = lpMagic->m_Skill;
	}

	if ( (lpTargetObj->Authority & 2) == 2 )
	{
		return FALSE;
	}

	if ( lpObj->MapNumber != lpTargetObj->MapNumber )
	{
		return FALSE;
	}

#if (__GENS_SYSTEM__ == 1)
	if (gGensSystem.GetFriendlyFire() && gGensSystem.GensMap(lpObj->MapNumber)) {
		if (lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER
			&& lpObj->m_GensInfo.btFamily == lpTargetObj->m_GensInfo.btFamily) {
			return false;
		}
	}
#endif
	
	if ( lpObj->MapNumber == MAP_INDEX_PKFIELD && lpObj->m_iDuelUser == -1)
	{
		return FALSE;
	}

	if ( lpTargetObj->Type == OBJ_USER )
	{
		if ( gObjIsConnected(lpTargetObj) == FALSE )
		{
			return FALSE;
		}
	}

	if ( gObjAttackQ(lpTargetObj) == 0 )
	{
		return FALSE;
	}

	int MSBFlag = 0;

	if ( iCriticalDamage != 0 )
	{
		MsgDamage = 3;
	}
	else
	{
		MsgDamage = 0;
	}

	int iAttackDamage = this->GetAttackDamage(lpObj->Class);
	int iTargetDefense = lpTargetObj->m_Defense;
	int iDefenseDown = gObjGetTotalValueOfEffect(lpObj,ADD_OPTION_DEFENSEDOWN);
	iTargetDefense -= (iTargetDefense * iDefenseDown)/100;

	BOOL bAllMiss = FALSE;
	
	if ( this->MissCheck(lpObj, lpTargetObj, iSkill, iSkillSuccess, bAllMiss) == FALSE )
	{
		return FALSE;
	}

	if ( bAllMiss != FALSE )
	{
		iAttackDamage = (iAttackDamage * 30)/100;
	}

	if ( lpTargetObj->DamageMinus != 0 )
	{
		int lc11 = iAttackDamage;
		iAttackDamage -= (iAttackDamage * lpTargetObj->DamageMinus)/100;
	}

	int iTargetLevel = lpObj->Level / 10;

	if ( iAttackDamage < iTargetLevel )
	{
		if ( iTargetLevel < 1 )
		{
			iTargetLevel = 1;
		}

		iAttackDamage = iTargetLevel;
	}

	if ( lpTargetObj->m_SkillNumber == 18 )
	{
		if ( iAttackDamage > 1 )
		{
			iAttackDamage = iAttackDamage >> 1;
		}
	}
Пример #24
0
void CCastleCrownSwitch::CastleCrownSwitchAct(int iIndex)
{
	if ( !gObjIsConnected(iIndex))
		return;

	if ( gObj[iIndex].Type != OBJ_NPC ||
		((gObj[iIndex].Class < 217 )?FALSE:(gObj[iIndex].Class > 219-1 )?FALSE:TRUE)==FALSE )
		return;

	if ( !gObjIsConnected(g_CastleSiege.GetCrownSwitchUserIndex(gObj[iIndex].Class)) )
	{
		g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class);

		if ( g_CastleSiege.GetRegCrownAvailable() == 1 )
		{
			g_CastleSiege.SetRegCrownAvailable(FALSE);
			g_CastleSiege.NotifyCrownState(1);
		}

		return;
	}
	
	LPOBJ lpObj= &gObj[iIndex];
	LPOBJ lpUserObj = &gObj[g_CastleSiege.GetCrownSwitchUserIndex(gObj[iIndex].Class)];
	g_CastleSiege.NotifyCrownSwitchInfo(iIndex);

	if ( lpUserObj->MapNumber == MAP_INDEX_CASTLESIEGE &&
		 lpUserObj->m_btCsJoinSide >= 2 )
	{
		if ( abs(lpObj->Y - lpUserObj->Y) <= 3 &&
			 abs(lpObj->X - lpUserObj->X) <= 3 )
		{
			int iCrownIndex1 = g_CastleSiege.GetCrownSwitchUserIndex(217);
			int iCrownIndex2 = g_CastleSiege.GetCrownSwitchUserIndex(218);

			if (gObjIsConnected(iCrownIndex1) && gObjIsConnected(iCrownIndex2) )
			{
				if ( gObj[iCrownIndex1].m_btCsJoinSide == gObj[iCrownIndex2].m_btCsJoinSide )
				{
					if ( g_CastleSiege.GetRegCrownAvailable() == 0 )
					{
						g_CastleSiege.SetRegCrownAvailable(TRUE);
						g_CastleSiege.NotifyCrownState(0);
					}
				}
			}
		}
		else
		{
			GCAnsCsAccessSwitchState(lpUserObj->m_Index, lpObj->m_Index, -1, 0);
			g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class);

			if ( g_CastleSiege.GetRegCrownAvailable() == 1 )
			{
				g_CastleSiege.SetRegCrownAvailable(FALSE);
				g_CastleSiege.NotifyCrownState(1);
			}

			LogAddTD("[CastleSiege] [%s][%s] Push Castle Crown Switch Canceled (GUILD:%s) - CS X:%d/Y:%d",
				lpUserObj->AccountID, lpUserObj->Name, lpUserObj->GuildName, lpObj->X, lpObj->Y);
		}
	}
	else
	{
		GCAnsCsAccessSwitchState(lpUserObj->m_Index, lpObj->m_Index, -1, 0);

		g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class);

		if ( g_CastleSiege.GetRegCrownAvailable() == 1 )
		{
			g_CastleSiege.SetRegCrownAvailable(FALSE);
			g_CastleSiege.NotifyCrownState(1);
		}
	}
}
Пример #25
0
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void CGPartyRequestResultRecv(PMSG_PARTYREQUESTRESULT * lpMsg, int aIndex)
{
	int number;
	BYTE result = false;
	char szTemp[256];
	int pnumber = -1;

	if( !PacketCheckTime(&gObj[aIndex]))
		return;

	number = MAKE_NUMBERW(lpMsg->NumberH, lpMsg->NumberL);

	if( number < 0 || number > OBJMAX-1)
		return;

	if( !gObjIsConnected(&gObj[aIndex]))
		return;

	if( !gObjIsConnected(&gObj[number]))
	{
		GCResultSend(aIndex, 0x41, 0x04);
	}
	else
	{
		result = true;
	}

	if( gObj[number].MapNumber != gObj[aIndex].MapNumber )
	{
		result = false;
		GCResultSend(number, 0x41, 0x00);
	}

	if( gUser.ChaosCastleMapRange(gObj[aIndex].MapNumber) == true )
	{
		GCServerMsgStringSend(lMsg.Get(MSGGET(4, 198)), aIndex, 1);
		result = false;
		::GCResultSend(number, 0x41, 0x00);
	}

	if( lpMsg->Result == 0 )
	{
		result = false;
		::GCResultSend(number, 0x41, 0x01);
	}

	if( gObj[number].m_IfState.use == 0 || gObj[number].m_IfState.type != 2)
	{
		result = false;
		::GCResultSend(number, 0x41, 0x00);
	}	
	
	if( gObj[aIndex].m_IfState.use == 0 || gObj[aIndex].m_IfState.type != 2)
	{
		result = false;
		::GCResultSend(number, 0x41, 0x00);
	}

	if( result == 1 )
	{
		if( gObj[number].PartyNumber < 0 )
		{
			gObj[number].PartyNumber = gParty.Create(number, gObj[number].DBNumber, gObj[number].Level);
		}

		if( gObj[number].PartyNumber >= 0  )
		{
			pnumber = gObj[number].PartyNumber;
			int iPartyPos = gParty.AddMember(gObj[number].PartyNumber, aIndex, gObj[aIndex].DBNumber, gObj[aIndex].Level);

			if( iPartyPos >= 0 )
			{
				gObj[aIndex].PartyNumber = gObj[number].PartyNumber;
				result = true;
				wsprintf(szTemp, lMsg.Get(MSGGET(4, 83)), gObj[aIndex].Name);
				::GCServerMsgStringSend(szTemp, number, 1);
				wsprintf(szTemp, lMsg.Get(MSGGET(4, 83)), gObj[number].Name);
				::GCServerMsgStringSend(szTemp, aIndex, 1);

				gParty.Paint(pnumber);
			}
			else if( iPartyPos == -1 )
			{
				GCResultSend(number, 0x41, 2);
				GCResultSend(aIndex, 0x41, 2);
			}
			else if( iPartyPos == -2 )
			{
				result = 2;
				wsprintf(szTemp, lMsg.Get(MSGGET(4, 84)), gObj[aIndex].Name);
				GCServerMsgStringSend(szTemp, aIndex, 1);
			}
		}
	}

	if( gObj[aIndex].m_IfState.use !=  0 && gObj[aIndex].m_IfState.type == 2)
	{
		gObj[aIndex].m_IfState.use = 0;
		gObj[aIndex].PartyTargetUser = -1;
	}

	if( gObj[number].m_IfState.use !=  0 && gObj[number].m_IfState.type == 2)
	{
		gObj[number].m_IfState.use = 0;
		gObj[number].PartyTargetUser = -1;
	}

	if( pnumber >= 0 )
	{
		CGPartyListAll(pnumber);
	}
}
Пример #26
0
bool GameShop::RequestPackageBuy(int aIndex, GAMESHOP_REQ_BUY * lpRequest)
{
#if( GAMESHOP_DEBUG == 1 )
	LogAddC(3, "[DEBUG] [%s] %d %d %d [%d %d]", __FUNCTION__, 
		lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, lpRequest->IBSPackageID, lpRequest->Unknown18);
#endif
	// ----
	LPOBJ lpUser = &gObj[aIndex];
	// ----
	if( !gObjIsConnected(aIndex) || lpUser->Connected != PLAYER_PLAYING )
	{
		return false;
	}
	// ----
	GAMESHOP_PACKAGE_DATA * lpPackage = this->GetPackage(lpRequest->IBSPackageID);
	// ----
	if( !lpPackage )
	{
#if( GAMESHOP_DEBUG == 1 )
	LogAddC(2, "[DEBUG] [%s] Invalid package", __FUNCTION__);
#endif
		return false;
	}
	// ----
	GAMESHOP_ANS_BUY pBuy;
	PHeadSubSetB((LPBYTE)&pBuy, 0xD2, cBuy, sizeof(pBuy));
	// ----
	pBuy.Result = true;
	// ----
	switch(lpPackage->PointType)
	{
	case 0:	//-> WCoinC
		{
			if( lpUser->GameShop.WCoinC >= lpPackage->Price )
			{
				lpUser->GameShop.WCoinC	-= lpPackage->Price;
				pBuy.Result = false;
			}
		}
		break;
		// --
	case 1:	//-> WCoinP
		{
			if( lpUser->GameShop.WCoinP >= lpPackage->Price )
			{
				lpUser->GameShop.WCoinP	-= lpPackage->Price;
				pBuy.Result = false;
			}
		}
		break;
		// --
	case 2:	//-> GoblinPoint
		{
			if( lpUser->GameShop.GoblinPoint >= lpPackage->Price )
			{
				lpUser->GameShop.GoblinPoint -= lpPackage->Price;
				pBuy.Result = false;
			}
		}
		break;
	}
	// ----
	if( !pBuy.Result )
	{
		for( int i = 0; i < lpPackage->ItemCount; i++ )
		{
			this->AddPackageInStorage(aIndex, &lpPackage->Item[i], 0);
		}
		// ----
		if( lpPackage->GPBonus )
		{
			lpUser->GameShop.GoblinPoint += lpPackage->GPBonus;
		}
		else if( this->OptionData.AddGPBonus )
		{
			lpUser->GameShop.GoblinPoint += this->OptionData.AddGPBonus;
		}
		// ----
		GAMESHOP_REQ_STORAGE pUpdate;
		pUpdate.StorageType = 0x53;
		// ----
		this->GDSaveUserInfo(aIndex);
		this->RequestStorage(aIndex, &pUpdate);
		this->RequestPoint(aIndex);
	}
	// ----
	DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size);
	return true;
}
Пример #27
0
void GameShop::RequestItemBuy(int aIndex, GAMESHOP_REQ_BUY * lpRequest)
{
#if( GAMESHOP_DEBUG == 1 )
	LogAddC(3, "[DEBUG] [%s] %d %d %d [%d %d]", __FUNCTION__, 
		lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, lpRequest->IBSPackageID, lpRequest->Unknown18);
#endif
	// ----
	LPOBJ lpUser = &gObj[aIndex];
	// ----
	GAMESHOP_ANS_BUY pBuy;
	PHeadSubSetB((LPBYTE)&pBuy, 0xD2, cBuy, sizeof(pBuy));
	// ----
	if( !gObjIsConnected(aIndex) || lpUser->Connected != PLAYER_PLAYING )
	{
		return;
	}
	// ----
	LogAddTD("[GameShop] [RequestItemBuy] [%s] %d %d %d [%d %d]",
		&gObj[aIndex].AccountID, lpRequest->ItemID, 
		lpRequest->IBSCategory, lpRequest->IBSIndex, 
		lpRequest->IBSPackageID, lpRequest->Unknown18);
	// ----
	if( !CanBeBuy(aIndex, lpRequest->ItemID) )
	{
		LogAddTD("[GameShop] [RequestItemBuy] [%s] !CanBeBuy", &gObj[aIndex].AccountID);
		pBuy.Result = true;
		DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size);
		return;
	}
	// ----
	if( this->RequestPackageBuy(aIndex, lpRequest) )
	{
		return;
	}
	// ----
	GAMESHOP_ITEM_DATA * lpItem = this->GetItem(lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, 0);
	// ----
	if( !lpItem )
	{
		return;
	}
	// ----
	pBuy.Result = true;
	// ----
	switch(lpItem->PointType)
	{
	case 0:	//-> WCoinC
		{
			if( lpUser->GameShop.WCoinC >= lpItem->Price )
			{
				lpUser->GameShop.WCoinC	-= lpItem->Price;
				pBuy.Result = false;
			}
		}
		break;
		// --
	case 1:	//-> WCoinP
		{
			if( lpUser->GameShop.WCoinP >= lpItem->Price )
			{
				lpUser->GameShop.WCoinP	-= lpItem->Price;
				pBuy.Result = false;
			}
		}
		break;
		// --
	case 2:	//-> GoblinPoint
		{
			if( lpUser->GameShop.GoblinPoint >= lpItem->Price )
			{
				lpUser->GameShop.GoblinPoint -= lpItem->Price;
				pBuy.Result = false;
			}
		}
		break;
	}
	// ----
	if( !pBuy.Result )
	{
		if( this->AddItemInStorage(aIndex, lpItem, 0) )
		{
			LogAddTD("[GameShop] [RequestItemBuy] [ADD] [%s] (%d) %d %d %d",
				&gObj[aIndex].AccountID, lpItem->ItemID, 
				lpItem->IBSCategory, lpItem->IBSIndex, 
				lpItem->IBSID);
		}
		// ----
		if( lpItem->GPBonus )
		{
			lpUser->GameShop.GoblinPoint += lpItem->GPBonus;
		}
		else if( this->OptionData.AddGPBonus )
		{
			lpUser->GameShop.GoblinPoint += this->OptionData.AddGPBonus;
		}
		// ----
		GAMESHOP_REQ_STORAGE pUpdate;
		pUpdate.StorageType = 0x53;
		// ----
		this->GDSaveUserInfo(aIndex);
		this->RequestStorage(aIndex, &pUpdate);
		this->RequestPoint(aIndex);
	}
	// ----
	DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size);
}
// ----------------------------------------------------------------------------------------------------------------------
BOOL CDarkSpirit::Attack(LPOBJ lpObj, LPOBJ lpTargetObj, CMagicInf * lpMagic, int criticaldamage, int iActionType)
{
	int skillSuccess = 0;
	LPOBJ lpCallObj;
	LPOBJ lpCallTargetObj;
	unsigned char MsgDamage = 0;
	int ManaChange = 0;
	int iTempShieldDamage = 0;
	int iTotalShieldDamage = 0;

	if ( (lpTargetObj->Authority&2) == 2 )
		return FALSE;

	if ( lpObj->MapNumber != lpTargetObj->MapNumber )
		return FALSE;

#if(GS_CASTLE)
	if( g_Crywolf.GetCrywolfState() == 3 || g_Crywolf.GetCrywolfState() == 5 )
	{
		if(CRYWOLF_MAP_RANGE(lpTargetObj->MapNumber))
		{
			if(lpTargetObj->Type == OBJ_MONSTER)
				return FALSE;
		}
	}
#endif

	int skill = 0;
	
	if ( lpMagic )
		skill = lpMagic->m_Skill;

	skillSuccess = TRUE;

	if ( lpObj->GuildNumber > 0 )
	{
		if ( lpObj->lpGuild )
		{
			if ( lpObj->lpGuild->WarState )
			{
				if ( lpObj->lpGuild->WarType == 1 )
				{
					if ( !GetBattleSoccerGoalMove(0) )
					{
						return TRUE;
					}
				}
			}
		}
	}

	if ( lpTargetObj->Type == OBJ_MONSTER )
	{
		if ( lpTargetObj->Class == 200 )
		{
			if ( skill )
			{
				gObjMonsterStateProc(lpTargetObj, 7, lpObj->m_Index, 0);
			}
			else
			{
				gObjMonsterStateProc(lpTargetObj, 6, lpObj->m_Index, 0);
			}

			return TRUE;
		}
	}

	if ( lpObj->Type == OBJ_USER )
	{
		if ( !gObjIsConnected(lpObj))
		{
			return FALSE;
		}
	}

	if ( lpTargetObj->Type == OBJ_USER )
	{
		if ( !gObjIsConnected(lpTargetObj))
		{
			return FALSE;
		}
	}

	if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_MONSTER )	// PLAYER VS MONSTER
	{
		if ( lpObj->m_RecallMon >= 0 )
		{
			if ( lpObj->m_RecallMon == lpTargetObj->m_Index )
			{
				return FALSE;
			}
		}
	}

	if ( !gObjAttackQ(lpTargetObj))
		return FALSE;

	lpObj->m_TotalAttackCount++;

	if ( this->CheckAttackArea(lpObj, lpTargetObj) == FALSE )
		return FALSE;

	lpCallObj = lpObj;
	lpCallTargetObj = lpTargetObj;

	if ( lpTargetObj->Type == OBJ_MONSTER )
	{
		if ( lpTargetObj->m_RecallMon >= 0 )
		{
			lpCallTargetObj = &gObj[lpTargetObj->m_RecallMon];
		}
	}

	if ( this->PkCheck(lpCallObj, lpTargetObj) == FALSE )
		return FALSE;

	int Strength = lpObj->Strength + lpObj->AddStrength;
	int Dexterity = lpObj->Dexterity + lpObj->AddDexterity;
	int Vitality = lpObj->Vitality + lpObj->AddVitality;
	int Energy = lpObj->Energy + lpObj->AddEnergy;

	int MSBFlag = 0;
	
	if ( criticaldamage )
	{
		MsgDamage = 3;
	}
	else
	{
		MsgDamage = 0;
	}

	BOOL bAllMiss = FALSE;
	int AttackDamage = 0;

	if ( g_ShieldSystemOn == TRUE )
	{
		if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER )
		{
			if ( !this->MissCheckPvP(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) )
			{
				return FALSE;
			}
		}
		else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) )
		{
			return FALSE;
		}

	}
	else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) )
	{
		return FALSE;
	}

	int targetdefense = this->GetTargetDefense(lpObj, lpTargetObj, MsgDamage);
	//AttackDamage = this->GetAttackDamage(lpObj, targetdefense, bIsOnDuel, criticaldamage);
	AttackDamage = this->GetAttackDamage(lpObj, targetdefense, 0, criticaldamage);

	if ( criticaldamage == 0 && iActionType == 0 )
	{
		AttackDamage /= 1.5;
	}

	if ( bAllMiss )
	{
		AttackDamage = ( AttackDamage * 30 ) / 100;
	}

	if ( lpTargetObj->DamageMinus )
	{
		int beforeDamage = AttackDamage;
		AttackDamage -= ( ( AttackDamage * (int)lpTargetObj->DamageMinus) / 100 );
	}

	int tlevel = lpObj->Level / 10;

	if ( AttackDamage < tlevel )
	{
		if ( tlevel < 1 )
		{
			tlevel = 1;
		}

		AttackDamage = tlevel;
	}

	if ( lpTargetObj->m_SkillNumber == 18 )
	{
		if ( AttackDamage > 1 )
		{
			AttackDamage >>= 1;
		}
	}
Пример #29
0
void GameShop::RequestStorage(int aIndex, GAMESHOP_REQ_STORAGE * lpRequest)
{
#if( GAMESHOP_DEBUG == 1 )
	LogAddC(2, "[DEBUG] [%s] [%s] [%s]", __FUNCTION__, &gObj[aIndex].AccountID, &gObj[aIndex].Name);
#endif
	// ----
	LPOBJ lpUser = &gObj[aIndex];
	// ----
	if( !gObjIsConnected(aIndex) )
	{
		return;
	}
	// ----
	GAMESHOP_ANS_STORAGE_COUNT	pStorageCount = { 0 };
	GAMESHOP_ANS_STORAGE_ITEM	pStorageItem;
	// ----
	PHeadSubSetB((LPBYTE)&pStorageCount, 0xD2, cStorageCount, sizeof(pStorageCount));
	PHeadSubSetB((LPBYTE)&pStorageItem, 0xD2, cStorageItem, sizeof(pStorageItem));
	// ----
	int ItemCount = this->GetItemCountInStorage(aIndex, lpRequest->StorageType);
	// ----
	if( ItemCount )
	{
		pStorageCount.MainStorage[0] = ItemCount+1;
		pStorageCount.MainStorage[1] = ItemCount+1;
		pStorageCount.GiftStorage[0] = 1;
		pStorageCount.GiftStorage[1] = 1;
	}
	// ----
	DataSend(aIndex, (LPBYTE)&pStorageCount, pStorageCount.h.size);
	// ----
	pStorageItem.Unk3		= 0x50;
	pStorageItem.IBSUnknown	= 673;
	// ----
	int Counter = 0;
	// ----
	for( int i = 0; i < MAX_STORAGE_ITEM; i++ )
	{
		if( lpRequest->StorageType == 0x53 && lpUser->GameShop.MainStorage[i].AuthIndex != 0 && lpUser->GameShop.MainStorage[i].AuthID != 0 )
		{
			pStorageItem.AuthIndex	= lpUser->GameShop.MainStorage[i].AuthIndex;
			pStorageItem.AuthID		= lpUser->GameShop.MainStorage[i].AuthID;
			pStorageItem.IBSID		= lpUser->GameShop.MainStorage[i].IBSID;
			pStorageItem.IBSIndex	= lpUser->GameShop.MainStorage[i].IBSIndex;
			Counter++;
		}
		/*else if( lpRequest->StorageType == 0x47 && lpUser->GameShop.GiftStorage[i].AuthIndex != 0 && lpUser->GameShop.GiftStorage[i].AuthID != 0 )
		{
			pStorageItem.AuthIndex	= lpUser->GameShop.GiftStorage[i].AuthIndex;
			pStorageItem.AuthID		= lpUser->GameShop.GiftStorage[i].AuthID;
			pStorageItem.IBSID		= lpUser->GameShop.GiftStorage[i].IBSID;
			pStorageItem.IBSIndex	= lpUser->GameShop.GiftStorage[i].IBSIndex;
			Counter++;
		}*/
		else
		{
			continue;
		}
		// ----
		DataSend(aIndex, (LPBYTE)&pStorageItem, pStorageItem.h.size);
		// ----
		if( Counter >= ItemCount )
		{
			break;
		}
	}
}
Пример #30
0
BOOL NpcCastleCrown(LPOBJ lpNpc, LPOBJ lpObj) //GS-CS Decompiled 100%
{
	#if(GS_CASTLE==1)
	if ( gObjIsConnected(lpObj->m_Index) == FALSE ) //Good
	{
		return TRUE;
	}

	if(g_CastleSiege.GetCastleState() != 7) //Good
	{
		return TRUE;
	}
	
	if(lpObj->m_btCsJoinSide < 2 || lpObj->m_bCsGuildInvolved == FALSE )
	{
		return TRUE;
	}

	if(g_CastleSiege.CheckUnionGuildMaster(lpObj->m_Index) == FALSE )
	{
		return TRUE;
	}

	if((lpObj->Y - lpNpc->Y) > 3 || (lpObj->X - lpNpc->X) > 3)
	{
		return TRUE;
	}

	if(g_CastleSiege.GetRegCrownAvailable() == FALSE )
	{
		return TRUE;
	}

	int iUserIndex = g_CastleSiege.GetCrownUserIndex();

	if(gObjIsConnected(iUserIndex) == FALSE )
	{
		int iSwitchIndex1 = g_CastleSiege.GetCrownSwitchUserIndex(217);
		int iSwitchIndex2 = g_CastleSiege.GetCrownSwitchUserIndex(218);

		if(gObjIsConnected(iSwitchIndex1) == FALSE || gObjIsConnected(iSwitchIndex2) == FALSE )
		{
			LogAddTD("[CastleSiege] [%s][%s] Failed to Register Castle Crown (GUILD:%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName);
			return TRUE;
		}

		if(lpObj->m_btCsJoinSide != gObj[iSwitchIndex1].m_btCsJoinSide || lpObj->m_btCsJoinSide != gObj[iSwitchIndex2].m_btCsJoinSide)
		{
			GCAnsCsAccessCrownState(lpObj->m_Index,4);
			LogAddTD("[CastleSiege] [%s][%s] Failed to Register Castle Crown (GUILD:%s) (S1:%s/%s)(S2:%s/%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName,gObj[iSwitchIndex1].Name,gObj[iSwitchIndex1].GuildName,gObj[iSwitchIndex2].Name,gObj[iSwitchIndex2].GuildName);
			return TRUE;
		}
		else
		{
			GCAnsCsAccessCrownState(lpObj->m_Index,0);
			g_CastleSiege.SetCrownUserIndex(lpObj->m_Index);
			g_CastleSiege.SetCrownAccessUserX(lpObj->X);
			g_CastleSiege.SetCrownAccessUserY(lpObj->Y);
			g_CastleSiege.SetCrownAccessTickCount();
			g_CastleSiege.NotifyAllUserCsProgState(0,lpObj->GuildName);
			LogAddTD("[CastleSiege] [%s][%s] Start to Register Castle Crown (GUILD:%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName);
		}
	}
	else if(lpObj->m_Index != iUserIndex)
	{
		GCAnsCsAccessCrownState(lpObj->m_Index,3);
	}

	return TRUE;

	#else
	return TRUE;
	#endif
}