void CCrywolfAltar::CrywolfAltarAct(int iIndex)
{
    if ( !gObjIsConnected(iIndex))
    {
        return;
    }

    if ( gObj[iIndex].Type != OBJ_NPC || CRYWOLF_ALTAR_CLASS_RANGE(gObj[iIndex].Class) == FALSE )
    {
        return;
    }

    int iUserIndex = this->GetAltarUserIndex(gObj[iIndex].Class);

    if ( gObjIsConnected(iUserIndex) == FALSE )
    {
        if ( iUserIndex != -1 )
        {
            this->ResetAltarUserIndex(iIndex, gObj[iIndex].Class);
        }

        return;
    }

    if ( gObjIsConnected(&gObj[iUserIndex]) == FALSE )
    {
        this->ResetAltarUserIndex(iIndex, gObj[iIndex].Class);
        return;
    }

    LPOBJ lpObj = &gObj[iIndex];
    LPOBJ lpUserObj = &gObj[iUserIndex];

    if ( lpUserObj->Live != FALSE && lpUserObj->MapNumber == MAP_INDEX_CRYWOLF_FIRSTZONE )
    {
        if ( abs(lpObj->Y-lpUserObj->Y) <= 0 && abs(lpObj->X - lpUserObj->X) <= 0 )
        {
            if ( this->CheckAltarValidContract(gObj[iIndex].Class) != FALSE )
            {
                //Empty ;D
            }
            else
            {
                this->SetAltarValidContract(iIndex, gObj[iIndex].Class);
            }
        }
        else
        {
            this->ResetAltarUserIndex(iIndex, gObj[iIndex].Class);
        }
    }
    else
    {
        this->ResetAltarUserIndex(iIndex, gObj[iIndex].Class);
    }
}
void CCrywolfAltar::SetAllAltarObjectIndex()
{
	for ( int i=0;i<OBJ_MAXMONSTER;i++)
	{
		if ( !gObjIsConnected(i) )
			continue;

		if ( gObj[i].MapNumber != MAP_INDEX_CRYWOLF_FIRSTZONE )
			continue;

		if ( CRYWOLF_ALTAR_CLASS_RANGE(gObj[i].Class ) != FALSE )
			g_CrywolfNPC_Altar.SetAltarObjIndex(gObj[i].Class, i);
	}
}
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;
}