BOOL TMonsterSkillElement::ApplyElementSummon(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; if( lpObj->Class == 459 && lpObj->Connected == PLAYER_PLAYING && lpObj->MapNumber == MAP_INDEX_RAKLIONBOSS && iIndex == iTargetIndex) { LogAddTD("[TMonsterSkillElement][ApplyElementSummon] Selupan use summon."); return FALSE; } if ( lpTargetObj->Connected < PLAYER_PLAYING || lpTargetObj->Type != OBJ_MONSTER ) return FALSE; lpTargetObj->Life = lpTargetObj->MaxLife + lpTargetObj->AddLife; lpTargetObj->Mana = lpTargetObj->MaxMana + lpTargetObj->AddMana; lpTargetObj->Live = TRUE; gObjRemoveBuffEffect(lpTargetObj,BUFF_POISON); gObjRemoveBuffEffect(lpTargetObj,BUFF_ICE); gObjRemoveBuffEffect(lpTargetObj,BUFF_ICEARROW); lpTargetObj->m_ViewState = 0; lpTargetObj->Teleport = 0; gObjClearBuffEffect(lpTargetObj,CLEAR_TYPE_LOGOUT); for ( int i=0;i<MAX_SELF_DEFENSE;i++) lpTargetObj->SelfDefenseTime[i] = 0; gObjTimeCheckSelfDefense(lpTargetObj); gObjViewportListProtocolDestroy(lpTargetObj); gObjViewportClose(lpTargetObj); lpTargetObj->m_ActState.Attack = 0; lpTargetObj->m_ActState.EmotionCount = 0; lpTargetObj->m_ActState.Escape = 0; lpTargetObj->m_ActState.Move = 0; lpTargetObj->m_ActState.Rest = 0; lpTargetObj->m_ActState.Emotion = 0; lpTargetObj->TargetNumber = -1; lpTargetObj->NextActionTime = 5000; if ( this->m_iIncAndDecValue < 0 ) this->m_iIncAndDecValue = 10; BYTE cX; BYTE cY; BOOL bGetPosition = FALSE; int iCount = 100; while ( iCount-- != 0 ) { cX = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->X; cY = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->Y; BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX, cY); if ( btMapAttr == 0 ) { bGetPosition = TRUE; break; } } if ( bGetPosition == FALSE ) { lpObj->Live = FALSE; lpObj->m_State = 4; lpObj->RegenTime = GetTickCount(); lpObj->DieRegen = 1; return FALSE; } lpTargetObj->X = cX; lpTargetObj->Y = cY; lpTargetObj->MTX = lpTargetObj->X; lpTargetObj->MTY = lpTargetObj->Y; lpTargetObj->TX = lpTargetObj->X; lpTargetObj->TY = lpTargetObj->Y; lpTargetObj->StartX = lpTargetObj->X; lpTargetObj->StartY = lpTargetObj->Y; gObjMonsterHitDamageInit(lpTargetObj); CreateFrustrum(lpTargetObj->X, lpTargetObj->Y, lpTargetObj->m_Index); lpTargetObj->DieRegen = 0; lpTargetObj->m_State = 1; lpTargetObj->m_Agro.ResetAll(); gObjViewportListCreate(lpTargetObj->m_Index); return FALSE; }
BOOL TMonsterSkillElement::ApplyElementSummon(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; if ( lpTargetObj->Connected < PLAYER_PLAYING || lpTargetObj->Type != OBJ_MONSTER ) return FALSE; lpTargetObj->Life = lpTargetObj->MaxLife + lpTargetObj->AddLife; lpTargetObj->Mana = lpTargetObj->MaxMana + lpTargetObj->AddMana; lpTargetObj->Live = TRUE; lpTargetObj->m_PoisonBeattackCount = 0; lpTargetObj->m_ColdBeattackCount = 0; lpTargetObj->m_ViewState = 0; lpTargetObj->Teleport = 0; memset(lpTargetObj->m_ViewSkillState,0,sizeof(lpTargetObj->m_ViewSkillState)); for ( int i=0;i<MAX_SELF_DEFENSE;i++) lpTargetObj->SelfDefenseTime[i] = 0; gObjTimeCheckSelfDefense(lpTargetObj); gObjViewportListProtocolDestroy(lpTargetObj); gObjViewportClose(lpTargetObj); lpTargetObj->m_ActState.Attack = 0; lpTargetObj->m_ActState.EmotionCount = 0; lpTargetObj->m_ActState.Escape = 0; lpTargetObj->m_ActState.Move = 0; lpTargetObj->m_ActState.Rest = 0; lpTargetObj->m_ActState.Emotion = 0; lpTargetObj->TargetNumber = -1; lpTargetObj->NextActionTime = 5000; if ( this->m_iIncAndDecValue < 0 ) this->m_iIncAndDecValue = 10; BYTE cX; BYTE cY; BOOL bGetPosition = FALSE; int iCount = 100; while ( iCount-- != 0 ) { cX = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->X; cY = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->Y; BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX, cY); if ( btMapAttr == 0 ) { bGetPosition = TRUE; break; } } if ( bGetPosition == FALSE ) { lpObj->Live = FALSE; lpObj->m_State = 4; lpObj->RegenTime = GetTickCount(); lpObj->DieRegen = 1; return FALSE; } lpTargetObj->X = cX; lpTargetObj->Y = cY; lpTargetObj->MTX = lpTargetObj->X; lpTargetObj->MTY = lpTargetObj->Y; lpTargetObj->TX = lpTargetObj->X; lpTargetObj->TY = lpTargetObj->Y; lpTargetObj->StartX = (BYTE)lpTargetObj->X; lpTargetObj->StartY = (BYTE)lpTargetObj->Y; gObjMonsterHitDamageInit(lpTargetObj); CreateFrustrum(lpTargetObj->X, lpTargetObj->Y, lpTargetObj->m_Index); lpTargetObj->DieRegen = 0; lpTargetObj->m_State = 1; lpTargetObj->m_Agro.ResetAll(); gObjViewportListCreate(lpTargetObj->m_Index); return FALSE; }
BOOL MonsterHerd::MonsterRegenAction(LPOBJ lpObj) { if ( lpObj == NULL ) { return FALSE; } if ( lpObj->Connected < PLAYER_PLAYING || lpObj->Type != OBJ_MONSTER ) { return FALSE; } MonsterHerd * lpMH = (MonsterHerd *)lpObj->m_lpMonsterHerd; if ( lpMH == NULL ) { return FALSE; } _MONSTER_HERD_DATA * lpMHD = lpMH->GetMonsterData(lpObj->m_Index); if ( lpMHD == NULL || lpMHD->m_bRegen == FALSE ) { return FALSE; } lpObj->Life = lpObj->AddLife + lpObj->MaxLife; lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; lpObj->Live = TRUE; lpObj->m_PoisonBeattackCount = 0; lpObj->m_ColdBeattackCount = 0; lpObj->m_ViewState = 0; lpObj->Teleport = 0; for ( int i=0;i<MAX_SELF_DEFENSE;i++) { lpObj->SelfDefenseTime[i] = 0; } gObjTimeCheckSelfDefense(lpObj); lpObj->m_ViewSkillState[eVS_POISON] = 0; lpObj->m_ViewSkillState[eVS_ICE] = 0; gObjClearViewport(lpObj); gObjViewportListProtocolDestroy(lpObj); gObjViewportClose(lpObj); lpObj->m_ActState.Attack = 0; lpObj->m_ActState.EmotionCount = 0; lpObj->m_ActState.Escape = 0; lpObj->m_ActState.Move = 0; lpObj->m_ActState.Rest = 0; lpObj->m_ActState.Emotion = 0; lpObj->TargetNumber = -1; lpObj->NextActionTime = 5000; BYTE cX; BYTE cY; int iCount = 100; BOOL bGetPosition = FALSE; while ( iCount-- != 0 ) { if ( lpMH->GetRandomLocation(cX, cY) != FALSE ) { bGetPosition = TRUE; break; } } if ( bGetPosition == FALSE ) { lpObj->Live = FALSE; lpObj->m_State = 4; lpObj->RegenTime = GetTickCount(); lpObj->DieRegen = TRUE; return FALSE; } lpObj->X = cX; lpObj->Y = cY; lpObj->MTX = lpObj->X; lpObj->MTY = lpObj->Y; lpObj->TX = lpObj->X; lpObj->TY = lpObj->Y; lpObj->StartX = lpObj->X; lpObj->StartY = lpObj->Y; gObjMonsterHitDamageInit(lpObj); CreateFrustrum(lpObj->X, lpObj->Y, lpObj->m_Index); lpObj->DieRegen = FALSE; lpObj->m_State = 1; return TRUE; }