本文整理汇总了C++中CNpc::MSpChange方法的典型用法代码示例。如果您正苦于以下问题:C++ CNpc::MSpChange方法的具体用法?C++ CNpc::MSpChange怎么用?C++ CNpc::MSpChange使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CNpc
的用法示例。
在下文中一共展示了CNpc::MSpChange方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetMagicDamage
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;
}
示例2: if
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;
}
}
}
//.........这里部分代码省略.........
示例3: if
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)
//.........这里部分代码省略.........