BOOL TMonsterSkillElement::ApplyElementStun(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];
	lpTargetObj->m_iSkillStunTime = this->m_iContinuanceTime;

	lpTargetObj->m_ViewSkillState[eVS_STUN] = 1;
	GCStateInfoSend(lpTargetObj, 1, eVS_STUN);

	gObjSetPosition(iTargetIndex, lpTargetObj->X, lpTargetObj->Y);

	return FALSE;
}
예제 #2
0
BOOL TMonsterSkillElement::ApplyElementStun(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];

	int StunTime = 0;

	if( m_iContinuanceTime == -1 )
	{
		StunTime = -10;
	}
	else
	{
		StunTime = m_iContinuanceTime;
	}

	gObjAddBuffEffect(lpTargetObj,BUFF_STUN,0,0,0,0,StunTime);
	gObjSetPosition(iTargetIndex, lpTargetObj->X, lpTargetObj->Y);

	return FALSE;
}
예제 #3
0
BOOL CObjBaseAttack::ResistanceCheck(LPOBJ lpObj, LPOBJ lpTargetObj, int skill)
{
	//missing objects? maybe from _CS side or deleted in 1.01.00
	if( lpTargetObj->Type != OBJ_USER)	
	{
		if(lpTargetObj->Class == 277 || lpTargetObj->Class == 283 || lpTargetObj->Class == 288 || lpTargetObj->Class == 278 || lpTargetObj->Class == 215 || lpTargetObj->Class == 216 || lpTargetObj->Class == 217 || lpTargetObj->Class == 218 || lpTargetObj->Class == 219)
		{
			return FALSE;
		}
	}

	if( lpTargetObj->Type != OBJ_USER)
	{
		if( CRYWOLF_ALTAR_CLASS_RANGE(lpTargetObj->Class) != FALSE || CRYWOLF_STATUE_CHECK(lpTargetObj->Class) != FALSE ) //HermeX Fix @28/01/2010
		{
			return FALSE;
		}
	}

	if ( skill == 62 )
	{
		gObjBackSpring2(lpTargetObj, lpObj, 3);
	}

	if(g_MasterSkillSystem.GetBaseMasterLevelSkill(skill) == 512) //Earth Quake Master
	{
		gObjBackSpring2(lpTargetObj, lpObj, 3);
	}

	if( skill == 516)
	{
		gObjBackSpring2(lpTargetObj, lpObj, 3);
	}

	if ( skill == 19
		|| skill == 20
		|| skill == 21
		|| skill == 22
		|| skill == 23
		|| skill == 260
		|| skill == 261
		|| skill == 262
		|| skill == 270
		|| skill == 326
		|| skill == 327
		|| skill == 328
		|| skill == 329
		|| skill == 479 )
	{
		gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0);
	}
	else if ( skill == 3 || skill == 379 || skill == 480 )	// Poison
	{
		if ( retResistance(lpTargetObj, 2) == 0 )
		{
			gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0);
			return TRUE;
		}
		return FALSE;
	}
	else if ( skill == 1 || skill == 384 )
	{
		if(gObjCheckUsedBuffEffect(lpObj, AT_POISON) == 0)
		{
			if ( retResistance(lpTargetObj, 1) == 0 )
			{
				lpTargetObj->lpAttackObj = lpObj;
				gObjAddBuffEffect(lpTargetObj, AT_POISON, 19, 3, 0, 0, 20);
				return TRUE;
			}
			else
			{
				return FALSE;
			}	
		}
		else
		{
			return FALSE;
		}
	}
	else if ( skill == 38 || skill == 387 ) // Death Poison
	{
		if(gObjCheckUsedBuffEffect(lpTargetObj, AT_POISON) == 0)
		{
			if ( retResistance(lpTargetObj, 1) == 0 )
			{
				lpTargetObj->lpAttackObj = lpObj;
				gObjAddBuffEffect(lpTargetObj, AT_POISON, 19, 3, 0, 0, 10);
				return TRUE;
			}
			else
			{
				return FALSE;
			}
		}
		else
		{
			return FALSE;
		}

		return TRUE;
	}
	else if ( skill == 7 || skill == 39 || 
		g_MasterSkillSystem.GetBaseMasterLevelSkill(skill) == 450 || skill == 389 || skill == 489 ) //Season4 add-on
	{
		if(gObjCheckUsedBuffEffect(lpTargetObj, AT_ICE) == 0)
		{
			if ( retResistance(lpTargetObj, 0) == 0 )
			{
				lpTargetObj->lpAttackObj = lpObj;
				lpTargetObj->DelayActionTime = 800;
				lpTargetObj->DelayLevel = 1;
				gObjAddBuffEffect(lpTargetObj, AT_ICE, 20, 0, 0, 0, 10);
			}
			else
			{
				return FALSE;
			}
		}
		else
		{
			return FALSE;
		}
	}
	else if ( skill == 51 || skill == 424 ) // Ice Arrow
	{
		if(gObjCheckUsedBuffEffect(lpTargetObj, AT_ICE_ARROW) == 0)
		{
			if ( retResistance(lpTargetObj, 0) == 0 )
			{
				gObjAddBuffEffect(lpTargetObj, AT_ICE_ARROW, 0, 0, 0, 0, 7);
				lpTargetObj->PathCount = 0;
				lpTargetObj->PathStartEnd = 0; //Season3 add-on
				gObjSetPosition(lpTargetObj->m_Index, lpTargetObj->X, lpTargetObj->Y);
			}
			else
			{
				return FALSE;
			}
		}
		else
		{
			return FALSE;
		}
	}

	return TRUE;
}
예제 #4
0
// --------------------------------------------------------------------------------------------------------------------------------------------------
void PMoveProc(PMSG_MOVE* lpMove, int aIndex)
{
	LPOBJ lpObj = &gObj[aIndex];
	// -----
	PMSG_RECVMOVE pMove;
	// -----
	unsigned char	ax;
	unsigned char	ay;
	unsigned char	sx;
	unsigned char	sy;
	unsigned char	pathtable;
	// -----
	if( !OBJMAX_RANGE(aIndex) )
	{
		CLog.LogAddC(TColor.Red(), "Error: Protocol Index wrong!", lpObj->AccountID, lpObj->Name);
		return;
	}
	// -----
	if( lpObj->RegenOk > NULL ) return;
	// -----
	if( lpObj->SkillRecallParty_Time > NULL )
	{
		lpObj->SkillRecallParty_Time = 0;
		SendMsg.MessageOut(aIndex, 0x01, "Summoning cancelled.");
	}
	// -----
	if( (GetTickCount()-lpObj->m_LastMoveTime) < 100 ) return;
	// -----
	if( lpObj->Teleport ) return;
	// -----
	if( lpObj->m_SkillHarden )
	{
		gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y);
		return;
	}
	// -----
	if ( lpObj->m_iSkillStunTime > 0 )
	{
		gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y);
		return;
	}
	// -----
	lpObj->m_LastMoveTime	= GetTickCount();
	lpObj->m_Rest			= 0;
	lpObj->PathCur			= 0;
	lpObj->Dir				= lpMove->Path[0] >> 4;
	lpObj->PathCount		= lpMove->Path[0] & 0x0F;
	// -----
	if ( lpObj->PathCount > 15 )
	{
		CLog.LogAddC(TColor.Red(), "Error: [%s][%s] Path Count (%d)", lpObj->AccountID, lpObj->Name, lpObj->PathCount);
		return;
	}
	// -----
	for( int n=0; n<15; n++)
	{
		lpObj->PathX[n]		= 0;
		lpObj->PathY[n]		= 0;
		lpObj->PathOri[n]	= 0;
	}
	// -----
	sx = lpMove->X;
	sy = lpMove->Y;
	// -----
	if( gObjCheckXYMapTile(lpObj, 1) == TRUE )
	{
		lpObj->PathCount	= 0;
		lpObj->PathCur		= 0;
		lpObj->PathStartEnd = 0;
		// -----
		gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y);
		return;
	}
	// -----
	lpObj->PathX[0]			= lpMove->X;
	ax						= lpObj->PathX[0];
	lpObj->PathY[0]			= lpMove->Y;
	ay						= lpObj->PathY[0];
	lpObj->PathDir[0]		= lpObj->Dir;
	lpObj->PathStartEnd		= 1;
	// -----
	if( lpObj->PathCount > 0 )
	{
		lpObj->PathCur = 1;
		lpObj->PathCount++;
	}
	// -----
	for(int n=1; n<lpObj->PathCount; n++)
	{
		if( (n%2) == 1 )
		{
			pathtable = lpMove->Path[(n+1) / 2] >> 4;
		}
		else
		{
예제 #5
0
// -----------------------------------------------------------------------------------------------------------------------
void CIllusionTemple::UseSkillProc(OBJECTSTRUCT* lpObj, PMSG_ILLUSION_USESKILL* pMsg)
{
	LPOBJ lpTargetObj = &gObj[pMsg->m_TargetIndex];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

			GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield);
			GCSendEffectInfo(lpTargetObj->m_Index, 17);
		}break;
	}
}