short CUser::GetMagicDamage(int damage, short tid) { short total_r = 0; short temp_damage = 0; CNpc* pNpc = nullptr; pNpc = g_pMain->m_arNpc.GetData(tid-NPC_BAND); if(!pNpc) return damage; if (m_bMagicTypeRightHand > 4 && m_bMagicTypeRightHand < 8) { temp_damage = damage * m_sMagicAmountRightHand / 100; } switch (m_bMagicTypeRightHand) { // RIGHT HAND!!! case 1 : // Fire Damage total_r = pNpc->m_byFireR ; break; case 2 : // Ice Damage total_r = pNpc->m_byColdR ; break; case 3 : // Lightning Damage total_r = pNpc->m_byLightningR ; break; case 4 : // Poison Damage total_r = pNpc->m_byPoisonR ; break; case 5 : // HP Drain break; case 6 : // MP Damage pNpc->MSpChange(2, -temp_damage); break; case 7 : // MP Drain break; case 0: break; } if (m_bMagicTypeRightHand > 0 && m_bMagicTypeRightHand < 5) { temp_damage = m_sMagicAmountRightHand - m_sMagicAmountRightHand * total_r / 200; damage = damage + temp_damage; } total_r = 0 ; // Reset all temporary data. temp_damage = 0 ; if (m_bMagicTypeLeftHand > 4 && m_bMagicTypeLeftHand < 8) { temp_damage = damage * m_sMagicAmountLeftHand / 100; } switch (m_bMagicTypeLeftHand) { // LEFT HAND!!! case 1 : // Fire Damage total_r = pNpc->m_byFireR; break; case 2 : // Ice Damage total_r = pNpc->m_byColdR; break; case 3 : // Lightning Damage total_r = pNpc->m_byLightningR; break; case 4 : // Poison Damage total_r = pNpc->m_byPoisonR; break; case 5 : // HP Drain break; case 6 : // MP Damage pNpc->MSpChange(2, -temp_damage); break; case 7 : // MP Drain break; case 0: break; } if (m_bMagicTypeLeftHand > 0 && m_bMagicTypeLeftHand < 5) { if (total_r > 200) total_r = 200; temp_damage = m_sMagicAmountLeftHand - m_sMagicAmountLeftHand * total_r / 200; damage = damage + temp_damage; } return damage; }
void CMagicProcess::ExecuteType3(int magicid, int tid, int data1, int data2, int data3, int moral, int dexpoint, int righthand_damage ) // Applied when a magical attack, healing, and mana restoration is done. { int damage = 0, result = 1, send_index=0, attack_type = 0; char send_buff[256]; _MAGIC_TYPE3* pType = NULL; CNpc* pNpc = NULL ; // Pointer initialization! _MAGIC_TABLE* pMagic = NULL; pMagic = g_pMain->m_MagictableArray.GetData( magicid ); // Get main magic table. if( !pMagic ) return; if(tid == -1) { // 지역 공격 result = AreaAttack(3, magicid, moral, data1, data2, data3, dexpoint, righthand_damage); //if(result == 0) goto packet_send; //else return; } pNpc = g_pMain->m_arNpc.GetData(tid-NPC_BAND); if(pNpc == NULL || pNpc->m_NpcState == NPC_DEAD || pNpc->m_iHP == 0) { result = 0; goto packet_send; } pType = g_pMain->m_Magictype3Array.GetData( magicid ); // Get magic skill table type 3. if( !pType ) return; // if (pType->sFirstDamage < 0) { if ((pType->sFirstDamage < 0) && (pType->bDirectType == 1) && (magicid < 400000)) { damage = GetMagicDamage(tid, pType->sFirstDamage, pType->bAttribute, dexpoint, righthand_damage) ; } else { damage = pType->sFirstDamage ; } //TRACE("magictype3 ,, magicid=%d, damage=%d\n", magicid, damage); if (pType->bDuration == 0) { // Non-Durational Spells. if (pType->bDirectType == 1) { // Health Point related ! //damage = pType->sFirstDamage; // Reduce target health point // if(damage >= 0) { if(damage > 0) { result = pNpc->SetHMagicDamage(damage); } else { damage = abs(damage); if(pType->bAttribute == 3) attack_type = 3; // 기절시키는 마법이라면..... else attack_type = magicid; if(pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND) == FALSE) { // Npc가 죽은 경우,, pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP, MAGIC_ATTACK); } else { // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP, MAGIC_ATTACK); } } } else if ( pType->bDirectType == 2 || pType->bDirectType == 3 ) // Magic or Skill Point related ! pNpc->MSpChange(pType->bDirectType, pType->sFirstDamage); // Change the SP or the MP of the target. else if( pType->bDirectType == 4 ) // Armor Durability related. pNpc->ItemWoreOut( DEFENCE, pType->sFirstDamage); // Reduce Slot Item Durability } else if (pType->bDuration != 0) { // Durational Spells! Remember, durational spells only involve HPs. if(damage >= 0) { } else { damage = abs(damage); if(pType->bAttribute == 3) attack_type = 3; // 기절시키는 마법이라면..... else attack_type = magicid; if(pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND) == FALSE) { // Npc가 죽은 경우,, pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); } else { // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP); } } damage = GetMagicDamage(tid, pType->sTimeDamage, pType->bAttribute, dexpoint, righthand_damage); // The duration magic routine. for(int i=0; i<MAX_MAGIC_TYPE3; i++) { if(pNpc->m_MagicType3[i].sHPAttackUserID == -1 && pNpc->m_MagicType3[i].byHPDuration == 0) { pNpc->m_MagicType3[i].sHPAttackUserID = m_pSrcUser->m_iUserId; pNpc->m_MagicType3[i].fStartTime = TimeGet(); pNpc->m_MagicType3[i].byHPDuration = pType->bDuration; pNpc->m_MagicType3[i].byHPInterval = 2; pNpc->m_MagicType3[i].sHPAmount = damage / (pType->bDuration / 2); break; } } } packet_send: //if ( pMagic->bType[1] == 0 || pMagic->bType[1] == 3 ) { SetByte( send_buff, AG_MAGIC_ATTACK_RESULT, send_index ); SetByte( send_buff, MAGIC_EFFECTING, send_index ); SetDWORD( send_buff, magicid, send_index ); SetShort( send_buff, m_pSrcUser->m_iUserId, send_index ); SetShort( send_buff, tid, send_index ); SetShort( send_buff, data1, send_index ); SetShort( send_buff, result, send_index ); SetShort( send_buff, data3, send_index ); SetShort( send_buff, moral, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); g_pMain->Send( send_buff, send_index ); } }
void CMagicProcess::ExecuteType3(int magicid, int tid, int data1, int data2, int data3, int moral, int dexpoint, int righthand_damage ) // Applied when a magical attack, healing, and mana restoration is done. { int damage = 0, attack_type = 0; bool bResult = true; _MAGIC_TYPE3* pType = nullptr; CNpc* pNpc = nullptr ; // Pointer initialization! _MAGIC_TABLE* pMagic = nullptr; pMagic = g_pMain->m_MagictableArray.GetData( magicid ); // Get main magic table. if( !pMagic ) return; if(tid == -1) { // 지역 공격 /*bResult =*/ AreaAttack(3, magicid, moral, data1, data2, data3, dexpoint, righthand_damage); //if(result == 0) goto packet_send; //else return; } pNpc = g_pMain->m_arNpc.GetData(tid); if(pNpc == nullptr || pNpc->m_NpcState == NPC_DEAD || pNpc->m_iHP == 0) { bResult = false; goto packet_send; } pType = g_pMain->m_Magictype3Array.GetData( magicid ); // Get magic skill table type 3. if( !pType ) return; // if (pType->sFirstDamage < 0) { if ((pType->sFirstDamage < 0) && (pType->bDirectType == 1) && (magicid < 400000)) { damage = GetMagicDamage(tid, pType->sFirstDamage, pType->bAttribute, dexpoint, righthand_damage) ; } else { damage = pType->sFirstDamage ; } //TRACE("magictype3 ,, magicid=%d, damage=%d\n", magicid, damage); if (pType->bDuration == 0) { // Non-Durational Spells. if (pType->bDirectType == 1) { // Health Point related ! //damage = pType->sFirstDamage; // Reduce target health point // if(damage >= 0) { if(damage > 0) { bResult = pNpc->SetHMagicDamage(damage); } else { damage = abs(damage); if(pType->bAttribute == 3) attack_type = 3; // 기절시키는 마법이라면..... else attack_type = magicid; if (!pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_iUserId + USER_BAND)) { m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP, MAGIC_ATTACK); } else { // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP, MAGIC_ATTACK); } } } else if ( pType->bDirectType == 2 || pType->bDirectType == 3 ) // Magic or Skill Point related ! pNpc->MSpChange(pType->bDirectType, pType->sFirstDamage); // Change the SP or the MP of the target. // else if( pType->bDirectType == 4 ) // Armor Durability related. // pNpc->ItemWoreOut( DEFENCE, pType->sFirstDamage); // Reduce Slot Item Durability } else if (pType->bDuration != 0) { // Durational Spells! Remember, durational spells only involve HPs. if(damage >= 0) { } else { damage = abs(damage); if(pType->bAttribute == 3) attack_type = 3; // 기절시키는 마법이라면..... else attack_type = magicid; if(pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_iUserId + USER_BAND) == false) { m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); } else { // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP); } } damage = GetMagicDamage(tid, pType->sTimeDamage, pType->bAttribute, dexpoint, righthand_damage); // The duration magic routine. for(int i=0; i<MAX_MAGIC_TYPE3; i++) { if(pNpc->m_MagicType3[i].sHPAttackUserID == -1 && pNpc->m_MagicType3[i].byHPDuration == 0) { pNpc->m_MagicType3[i].sHPAttackUserID = m_pSrcUser->m_iUserId; pNpc->m_MagicType3[i].tStartTime = UNIXTIME; pNpc->m_MagicType3[i].byHPDuration = pType->bDuration; pNpc->m_MagicType3[i].byHPInterval = 2; pNpc->m_MagicType3[i].sHPAmount = damage / (pType->bDuration / 2); break; } } } packet_send: //if ( pMagic->bType[1] == 0 || pMagic->bType[1] == 3 ) { Packet result(AG_MAGIC_ATTACK_RESULT, uint8(MAGIC_EFFECTING)); result << magicid << m_pSrcUser->m_iUserId << uint16(tid) << uint16(data1) << uint16(bResult) << uint16(data3) << uint16(moral) << uint16(0) << uint16(0); g_pMain->Send(&result); } }