BOOL TMonsterAIElement::ApplyElementHealGroup(int iIndex, int iTargetIndex, TMonsterAIState * pAIState) { LPOBJ lpObj = &gObj[iIndex]; UTIL.SendCrywolfChattingMsg(iIndex, "Element-그룹치료"); TMonsterAIGroupMember * pMemb = TMonsterAIGroup::FindGroupMemberToHeal(lpObj->m_Index, lpObj->m_iGroupNumber, lpObj->m_iGroupMemberGuid, 6); if ( pMemb ) { LPOBJ lpTargetObj = &gObj[pMemb->m_iObjIndex]; if ( lpTargetObj->Live == 0 ) return FALSE; TMonsterSkillUnit * lpSkillUnit = TMonsterSkillManager::FindMonsterSkillUnit(lpObj->m_Index, 21); if ( lpSkillUnit ) { lpSkillUnit->RunSkill(iIndex, lpTargetObj->m_Index); } UTIL.SendCrywolfChattingMsg(iIndex, "그룹치료 HP : %d", (int)lpTargetObj->Life); UTIL.SendCrywolfChattingMsg(lpTargetObj->m_Index, "HP : %d", (int)lpTargetObj->Life); } return FALSE; }
BOOL TMonsterAIElement::ApplyElementSpecialSommon(int iIndex, int iTargetIndex, TMonsterAIState * pAIState) { LPOBJ lpObj = &gObj[iIndex]; UTIL.SendCrywolfChattingMsg(iIndex, "Element-특수소환"); TMonsterAIGroupMember * pMemb = TMonsterAIGroup::FindGroupMemberToSommon(lpObj->m_Index, lpObj->m_iGroupNumber, lpObj->m_iGroupMemberGuid); if ( pMemb ) { LPOBJ lpTargetObj = &gObj[pMemb->m_iObjIndex]; if ( lpTargetObj->Live != 0 ) return FALSE; TMonsterSkillUnit * lpSkillUnit = TMonsterSkillManager::FindMonsterSkillUnit(lpObj->m_Index, 30); if ( lpSkillUnit ) { lpSkillUnit->RunSkill(iIndex, lpTargetObj->m_Index); } } return FALSE; }
void TMonsterSkillManager::UseMonsterSkill(int iIndex, int iTargetIndex, int iMonsterSkillUnitType) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; TMonsterSkillInfo * lpMonsterSkillInfo = &TMonsterSkillManager::s_MonsterSkillInfoArray[lpObj->Class]; if ( lpMonsterSkillInfo->IsValid() == FALSE ) return; TMonsterSkillUnit * lpMonsterSkillUnit = TMonsterSkillManager::FindMonsterSkillUnit(iIndex, iMonsterSkillUnitType); if ( lpMonsterSkillUnit == NULL ) { LogAddC(2, "[Monster Skill Manager] SkillUnit is NULL "); return; } GCUseMonsterSkillSend(lpObj, lpTargetObj, lpMonsterSkillUnit->m_iUnitNumber); if ( lpMonsterSkillUnit->m_iUnitScopeType == -1 ) { lpMonsterSkillUnit->RunSkill(iIndex, iTargetIndex); } else { int iCount = 0; int iRangeTargetIndex = -1; int iAngle = gObjUseSkill.GetAngle(lpObj->X, lpObj->Y, lpTargetObj->X, lpTargetObj->Y); while ( true ) { if ( lpObj->VpPlayer2[iCount].state ) { iRangeTargetIndex = lpObj->VpPlayer2[iCount].number; if ( OBJMAX_RANGE(iRangeTargetIndex)) { if ( gObj[iRangeTargetIndex].Type == OBJ_USER ) { BOOL bTargetOK = FALSE; if ( lpMonsterSkillUnit->m_iUnitScopeType == 0 ) { if ( gObjCalDistance(lpObj, &gObj[iRangeTargetIndex]) < lpMonsterSkillUnit->m_iUnitScopeValue ) { bTargetOK = TRUE; } } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 1 ) { if ( SkillElectricSparkHitBox.HitCheck(iAngle, lpObj->X, lpObj->Y, gObj[iRangeTargetIndex].X, gObj[iRangeTargetIndex].Y) ) { bTargetOK = TRUE; } } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 2 ) { bTargetOK = TRUE; } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 3 ) { bTargetOK = TRUE; } if ( bTargetOK ) { lpMonsterSkillUnit->RunSkill(iIndex, iRangeTargetIndex); } } } } iCount++; if ( iCount > MAX_VIEWPORT_MONSTER-1) break; } } }
//good void TMonsterSkillManager::UseMonsterSkill(int iIndex, int iTargetIndex, int iMonsterSkillUnitType, int iMonsterSkillUnit,CMagicInf * lpMagic) { if (iIndex >= OBJ_MAXMONSTER || iIndex < 0) { LogAddC(2,"[TMonsterSkillManager][UserMonsterSkill] error: iIndex(%d)",iIndex); return; } if (iTargetIndex >= OBJMAX || iTargetIndex < 0) { LogAddC(2,"[TMonsterSkillManager][UserMonsterSkill] error: iTargetIndex(%d)",iTargetIndex); return; } LPOBJ lpObj = &gObj[iIndex]; //loc1 LPOBJ lpTargetObj = &gObj[iTargetIndex]; //loc2 TMonsterSkillInfo * lpMonsterSkillInfo = &TMonsterSkillManager::s_MonsterSkillInfoArray[lpObj->Class]; //loc3 if ( lpMonsterSkillInfo->IsValid() == FALSE ) return; TMonsterSkillUnit * lpMonsterSkillUnit = NULL; //loc4 if ( iMonsterSkillUnit > -1) //arg4 { int iMonsterSkill = iMonsterSkillUnit; //loc5 lpMonsterSkillUnit = lpMonsterSkillInfo->m_lpSkillUnitArray[iMonsterSkill]; } else { lpMonsterSkillUnit = TMonsterSkillManager::FindMonsterSkillUnit(iIndex, iMonsterSkillUnitType); } if ( lpMonsterSkillUnit == NULL ) { LogAddC(2, "[Monster Skill Manager] SkillUnit is NULL : ObjIndex[%d], SkillUnitType[%d] ",iIndex,iMonsterSkillUnitType); return; } GCUseMonsterSkillSend(lpObj, lpTargetObj, lpMonsterSkillUnit->m_iUnitNumber); //TEST //char szTemp[256]; //wsprintf(szTemp, "[USEMONSTERSKILL] %d", lpMonsterSkillUnit->m_iUnitNumber); //GCServerMsgStringSend(szTemp, lpTargetObj->m_Index, 1); if ( lpMonsterSkillUnit->m_iUnitScopeType == -1 ) { if ( lpObj->MapNumber == MAP_INDEX_RAKLION ) { gObjAttack(lpObj, lpTargetObj, NULL, FALSE, 0, 0, FALSE); } if ( lpObj->MapNumber == MAP_INDEX_RAKLION_BOSS ) { if ( lpObj->Class == 459 ) { if ( lpMonsterSkillUnit->m_iUnitNumber == 40 ) { gObjAttack(lpObj, lpTargetObj, NULL, FALSE, 0, 0, FALSE); } else { if ( lpMagic ) { gObjAttack(lpObj, lpTargetObj,lpMagic, 0, 0, 0, 0); } } } else { gObjAttack(lpObj, lpTargetObj, 0, 0, 0, 0, 0); } } lpMonsterSkillUnit->RunSkill(iIndex, iTargetIndex); } else { int iCount = 0; int iRangeTargetIndex = -1; int iAngle = gObjUseSkill.GetAngle(lpObj->X, lpObj->Y, lpTargetObj->X, lpTargetObj->Y); while ( true ) { if ( lpObj->VpPlayer2[iCount].state ) { iRangeTargetIndex = lpObj->VpPlayer2[iCount].number; if ( OBJMAX_RANGE(iRangeTargetIndex)) { if ( gObj[iRangeTargetIndex].Type == OBJ_USER ) { BOOL bTargetOK = FALSE; if ( lpMonsterSkillUnit->m_iUnitScopeType == 0 ) { if ( gObjCalDistance(lpObj, &gObj[iRangeTargetIndex]) < lpMonsterSkillUnit->m_iUnitScopeValue ) { bTargetOK = TRUE; } } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 1 ) { if ( SkillElectricSparkHitBox.HitCheck(iAngle, lpObj->X, lpObj->Y, gObj[iRangeTargetIndex].X, gObj[iRangeTargetIndex].Y) ) { bTargetOK = TRUE; } } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 2 ) { bTargetOK = TRUE; } else if ( lpMonsterSkillUnit->m_iUnitScopeType == 3 ) { bTargetOK = TRUE; } if ( bTargetOK ) { if ( lpObj->MapNumber == MAP_INDEX_RAKLION ) { gObjAttack(lpObj, lpTargetObj, NULL, FALSE, 0, 0, FALSE); } if ( lpObj->MapNumber == MAP_INDEX_RAKLION_BOSS ) { if ( lpObj->Class == 459 ) { if ( lpMonsterSkillUnit->m_iUnitNumber == 40 ) { gObjAttack(lpObj, lpTargetObj, NULL, FALSE, 0, 0, FALSE); } else { if ( lpMagic ) { gObjAttack(lpObj, lpTargetObj,lpMagic, 0, 0, 0, 0); } } } else { gObjAttack(lpObj, lpTargetObj, 0, 0, 0, 0, 0); } } lpMonsterSkillUnit->RunSkill(iIndex, iRangeTargetIndex); } } } } iCount++; if ( iCount > MAX_VIEWPORT_MONSTER-1) break; } } }