TMonsterSkillUnit * TMonsterSkillManager::FindMonsterSkillUnit(int iIndex, int iMonsterSkillUnitType) { LPOBJ lpObj = &gObj[iIndex]; TMonsterSkillInfo * lpMonsterSkillInfo = &TMonsterSkillManager::s_MonsterSkillInfoArray[lpObj->Class]; if ( lpMonsterSkillInfo->IsValid() == FALSE ) return NULL; int iFoundSkillArray[5] = {-1}; int iFoundSkillCount = 0; for(int i=0;i<5;i++) { if ( iMonsterSkillUnitType == lpMonsterSkillInfo->m_iSkillUnitTypeArray[i] ) { iFoundSkillArray[iFoundSkillCount] = i; iFoundSkillCount++; } } if ( iFoundSkillCount > 0 ) { int iSlot = iFoundSkillArray[rand() % iFoundSkillCount]; if ( iSlot == -1 ) return NULL; TMonsterSkillUnit * lpMonsterSkillUnit = lpMonsterSkillInfo->m_lpSkillUnitArray[iSlot]; return lpMonsterSkillUnit; } return NULL; }
BOOL TMonsterSkillManager::CheckMonsterSkill(int iMonsterClass) { if ( iMonsterClass < 0 || iMonsterClass > MAX_MONSTER_SKILL_INFO_ARRAY ) // #error Change to MAX_MONSTER_SKILL_INFO_ARRAY-1 return FALSE; TMonsterSkillInfo * lpMonsterSkillInfo = &TMonsterSkillManager::s_MonsterSkillInfoArray[iMonsterClass]; if ( lpMonsterSkillInfo->IsValid() == FALSE ) return FALSE; return TRUE; }
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; } } }