void Boss::Attack() { mEnemy->Attack(); AreaAttack(); }
void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int data2, int data3, int moral ) { int damage = 0, send_index = 0, result = 1; // Variable initialization. result == 1 : success, 0 : fail char send_buff[128]; _MAGIC_TYPE4* pType = NULL; CNpc* pNpc = NULL ; // Pointer initialization! if(tid == -1) { // 지역 공격 result = AreaAttack(4, magicid, moral, data1, data2, data3, 0, 0); if(result == 0) goto fail_return; 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 fail_return; } pType = g_pMain->m_Magictype4Array.GetData( magicid ); // Get magic skill table type 4. if( !pType ) return; //TRACE("magictype4 ,, magicid=%d\n", magicid); switch (pType->bBuffType) { // Depending on which buff-type it is..... case 1 : // HP 올리기.. break; case 2 : // 방어력 올리기.. break; case 4 : // 공격력 올리기.. break; case 5 : // 공격 속도 올리기.. break; case 6 : // 이동 속도 올리기.. // if (pNpc->m_MagicType4[pType->bBuffType-1].sDurationTime > 0) { // result = 0 ; // goto fail_return ; // } // else { pNpc->m_MagicType4[pType->bBuffType-1].byAmount = pType->bSpeed; pNpc->m_MagicType4[pType->bBuffType-1].sDurationTime = pType->sDuration; pNpc->m_MagicType4[pType->bBuffType-1].fStartTime = TimeGet(); pNpc->m_fSpeed_1 = (float)(pNpc->m_fOldSpeed_1 * ((double)pType->bSpeed / 100)); pNpc->m_fSpeed_2 = (float)(pNpc->m_fOldSpeed_2 * ((double)pType->bSpeed / 100)); //TRACE("executeType4 ,, speed1=%.2f, %.2f,, type=%d, cur=%.2f, %.2f\n", pNpc->m_fOldSpeed_1, pNpc->m_fOldSpeed_2, pType->bSpeed, pNpc->m_fSpeed_1, pNpc->m_fSpeed_2); // } break; case 7 : // 능력치 올리기... break; case 8 : // 저항력 올리기... break; case 9 : // 공격 성공율 및 회피 성공율 올리기.. break; default : result = 0 ; goto fail_return; } 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, sid, 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, 0, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); g_pMain->Send( send_buff, send_index ); return; fail_return: SetByte( send_buff, AG_MAGIC_ATTACK_RESULT, send_index ); SetByte( send_buff, MAGIC_FAIL, send_index ); SetDWORD( send_buff, magicid, send_index ); SetShort( send_buff, sid, send_index ); SetShort( send_buff, tid, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); SetShort( send_buff, 0, send_index ); g_pMain->Send( send_buff, send_index ); }
void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int data2, int data3, int moral ) { Packet result(AG_MAGIC_ATTACK_RESULT); int damage = 0; uint16 sResult = 1; _MAGIC_TYPE4* pType = nullptr; CNpc* pNpc = nullptr ; // Pointer initialization! if(tid == -1) { // 지역 공격 sResult = AreaAttack(4, magicid, moral, data1, data2, data3, 0, 0); if (sResult) return; goto fail_return; } pNpc = g_pMain->m_arNpc.GetData(tid); if(pNpc == nullptr || pNpc->m_NpcState == NPC_DEAD || pNpc->m_iHP == 0) { sResult = 0; goto fail_return; } pType = g_pMain->m_Magictype4Array.GetData( magicid ); // Get magic skill table type 4. if( !pType ) return; //TRACE("magictype4 ,, magicid=%d\n", magicid); switch (pType->bBuffType) { // Depending on which buff-type it is..... case 1 : // HP 올리기.. break; case 2 : // 방어력 올리기.. break; case 4 : // 공격력 올리기.. break; case 5 : // 공격 속도 올리기.. break; case 6 : // 이동 속도 올리기.. // if (pNpc->m_MagicType4[pType->bBuffType-1].sDurationTime > 0) { // result = 0 ; // goto fail_return ; // } // else { pNpc->m_MagicType4[pType->bBuffType-1].byAmount = pType->bSpeed; pNpc->m_MagicType4[pType->bBuffType-1].sDurationTime = pType->sDuration; pNpc->m_MagicType4[pType->bBuffType-1].tStartTime = UNIXTIME; pNpc->m_fSpeed_1 = (float)(pNpc->m_fOldSpeed_1 * ((double)pType->bSpeed / 100)); pNpc->m_fSpeed_2 = (float)(pNpc->m_fOldSpeed_2 * ((double)pType->bSpeed / 100)); //TRACE("executeType4 ,, speed1=%.2f, %.2f,, type=%d, cur=%.2f, %.2f\n", pNpc->m_fOldSpeed_1, pNpc->m_fOldSpeed_2, pType->bSpeed, pNpc->m_fSpeed_1, pNpc->m_fSpeed_2); // } break; case 7 : // 능력치 올리기... break; case 8 : // 저항력 올리기... break; case 9 : // 공격 성공율 및 회피 성공율 올리기.. break; default : sResult = 0; goto fail_return; } result << uint8(MAGIC_EFFECTING) << magicid << uint16(sid) << uint16(tid) << uint16(data1) << uint16(sResult) << uint16(data3) << uint16(0) << uint16(0) << uint16(0); g_pMain->Send(&result); return; fail_return: result << uint8(MAGIC_FAIL) << magicid << uint16(sid) << uint16(tid) << uint16(0) << uint16(0) << uint16(0) << uint16(0) << uint16(0) << uint16(0); g_pMain->Send(&result); }
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); } }