trananh88vt
28-08-12, 01:00 PM
Tự nhiên mất chùm chìa khóa làm hôm nay đi làm không đc! Thấy rảnh nên vô tìm hiểm về hút hít share cho những bạn cần
Đừng ném gạch em nha huhu
Vào vấn đề chính thui
------------------
Về căn bản thì các option hút hít đã đc Add sẵn h ta chỉ cần gọi tới và sử dụng
Các biến liên quan tới hút hít
+m_CurrentManaStolen : Nội lực
+m_CurrentLifeStolen : Sinh lực
+m_CurrentStaminaStolen : Thể lực
------------------
Mình chỉ làm hút máu thôi còn các cái khác các bạn tự làm nha
Đầu tiên các bạn vào lớp KNpc (.h) làm thêm 1 hàm hồi máu như sau
void DeathPunish(int nMode, int nBelongPlayer);
void RestoreLiveData(int nDamage);
void RestoreDamage2Life(int nDamage); //Hàm mình add để làm hút máu
Giờ các bạn viết hàm đó như sau trong file KNpc.cpp
void KNpc::RestoreLiveData(int nDamage)
{
}
//Đây là hàm mình mới add theo định nghĩ ở trên
void KNpc::RestoreDamage2Life(int nDamage)
{
m_CurrentLife = m_CurrentLife + (nDamage*m_CurrentLifeStolen/100);
if (m_CurrentLife >= m_CurrentLifeMax)
m_CurrentLife = m_CurrentLifeMax;
}
Bây h ta làm hút hít thui để cho rõ ràng mình xin post toàn bộ hàm lên [Thực sự mình chỉ thêm 1 chút trong hàm này thui]
void KNpc::CalcDamage(int nAttacker, int nMin, int nMax, DAMAGE_TYPE nType, BOOL bIsMelee, BOOL bDoHurt /* TRUE */, BOOL bReturn /* = FALSE */)
{
if (m_Doing == do_death || m_RegionIndex < 0)
return;
if (nMin + nMax <= 0)
return;
int nRes = 0;
int nDamageRange = nMax - nMin;
int nDamage = 0;
if (nDamageRange < 0)
{
nDamage = nMax + g_Random(-nDamageRange);
}
else
nDamage = nMin + g_Random(nMax - nMin);
// µÚÒ»²½£¬Í³¼Æ¿¹ÐÔ£¬²¢¼ÆËãÎ üÊÕÉ˺¦
switch(nType)
{
case damage_physics:
nRes = m_CurrentPhysicsResist;
if (nRes > m_CurrentPhysicsResistMax)
{
nRes = m_CurrentPhysicsResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼÎïÀíÉ˺¦£¬ÎïÀ í¿¹ÐÔ%d£¬ÎïÀí¶Ü%d", Name, nDamage, nRes, m_PhysicsArmor.nValue[0]);
m_PhysicsArmor.nValue[0] -= nDamage;
if (m_PhysicsArmor.nValue[0] < 0)
{
nDamage = -m_PhysicsArmor.nValue[0];
m_PhysicsArmor.nValue[0] = 0;
m_PhysicsArmor.nTime = 0;
}
else
{
nDamage = 0;
}
if (bIsMelee)
{
nMax = m_CurrentMeleeDmgRetPercent;
}
else
{
nMax = m_CurrentRangeDmgRetPercent;
}
break;
case damage_cold:
nRes = m_CurrentColdResist;
if (nRes > m_CurrentColdResistMax)
{
nRes = m_CurrentColdResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ±ùÉ˺¦£¬±ù¿¹Ð Ô%d£¬±ù¶Ü%d", Name, nDamage, nRes, m_ColdArmor.nValue[0]);
m_ColdArmor.nValue[0] -= nDamage;
if (m_ColdArmor.nValue[0] < 0)
{
nDamage = -m_ColdArmor.nValue[0];
m_ColdArmor.nValue[0] = 0;
m_ColdArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_fire:
nRes = m_CurrentFireResist;
if (nRes > m_CurrentFireResistMax)
{
nRes = m_CurrentFireResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ»ðÉ˺¦£¬»ð¿¹Ð Ô%d£¬»ð¶Ü%d", Name, nDamage, nRes, m_FireArmor.nValue[0]);
m_FireArmor.nValue[0] -= nDamage;
if (m_FireArmor.nValue[0] < 0)
{
nDamage = -m_FireArmor.nValue[0];
m_FireArmor.nValue[0] = 0;
m_FireArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_light:
nRes = m_CurrentLightResist;
if (nRes > m_CurrentLightResistMax)
{
nRes = m_CurrentLightResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼµçÉ˺¦£¬µç¿¹Ð Ô%d£¬µç¶Ü%d", Name, nDamage, nRes, m_LightArmor.nValue[0]);
m_LightArmor.nValue[0] -= nDamage;
if (m_LightArmor.nValue[0] < 0)
{
nDamage = -m_LightArmor.nValue[0];
m_LightArmor.nValue[0] = 0;
m_LightArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_poison:
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ¶¾É˺¦", Name, nDamage);
nRes = m_CurrentPoisonResist;
if (nRes > m_CurrentPoisonResistMax)
{
nRes = m_CurrentPoisonResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ¶¾É˺¦£¬¶¾¿¹Ð Ô%d£¬¶¾¶Ü%d", Name, nDamage, nRes, m_PoisonArmor.nValue[0]);
m_PoisonArmor.nValue[0] -= nDamage;
if (m_PoisonArmor.nValue[0] < 0)
{
nDamage = -m_PoisonArmor.nValue[0];
m_PoisonArmor.nValue[0] = 0;
m_PoisonArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
m_nLastPoisonDamageIdx = nAttacker;
break;
case damage_magic:
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼħ·¨É˺¦", Name, nDamage);
nRes = 0;
break;
default:
nRes = 0;
break;
}
if (!nDamage)
return;
// µÚ¶þ²½ÅжÏÊÇ·ñÓÐħ·¨¶Ü´æÔ Ú
g_DebugLog("[ÊýÖµ]%sħ·¨¶ÜÎüÊÕ±ÈÀý£º%d", Name, m_ManaShield.nValue[0]);
if (m_ManaShield.nValue[0])
{
int nManaDamage = nDamage * m_ManaShield.nValue[0] / 100;
m_CurrentMana -= nManaDamage;
if (m_CurrentMana < 0)
{
nDamage -= m_CurrentMana;
m_CurrentMana = 0;
m_ManaShield.nValue[0] = 0;
m_ManaShield.nTime = 0;
}
else
{
nDamage -= nManaDamage;
}
}
nDamage = nDamage * (100 - nRes) / 100;
g_DebugLog("[ÊýÖµ]%sʵ¼ÊÉ˺¦£º%d", Name, nDamage);
// ·´µ¯É˺¦
if (nAttacker > 0 && bReturn == FALSE)
{
if (bIsMelee)
{
nMin = m_CurrentMeleeDmgRet;
nMin += nDamage * nMax / 100;
Npc[nAttacker].CalcDamage(m_Index, nMin, nMin, damage_magic, FALSE, FALSE, TRUE);
}
else
{
nMin = m_CurrentRangeDmgRet;
nMin += nDamage * nMax / 100;
Npc[nAttacker].CalcDamage(m_Index, nMin, nMin, damage_magic, FALSE, FALSE, TRUE);
}
g_DebugLog("[ÊýÖµ]%s·µ»ØÉ˺¦%d", Name, nMin);
}
// PK´¦Àí£¬É˺¦³ËÒ»¸öϵÊý
if (this->m_Kind == kind_player && Npc[nAttacker].m_Kind == kind_player)
nDamage = nDamage * NpcSet.m_nPKDamageRate / 100;
m_nLastDamageIdx = nAttacker;
if (m_Kind != kind_player && Npc[nAttacker].m_Kind == kind_player && Npc[nAttacker].m_nPlayerIdx > 0)
m_cDeathCalcExp.AddDamage(Npc[nAttacker].m_nPlayerIdx, (m_CurrentLife - nDamage > 0 ? nDamage : m_CurrentLife));
m_CurrentLife -= nDamage;
if (nDamage > 0)
{
//Đây là đoạn mình thêm vô
//Tại đây các bạn có thể xét xem skill là nội công hay ngoại công để cho phép tăng máu
if (m_CurrentLife > 0)
Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].RestoreDamage2Life(nDamage);
else
Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].RestoreDamage2Life(nDamage + m_CurrentLife);
//End add
m_CurrentMana += m_CurrentDamage2Mana * nDamage / 100;
if (m_CurrentMana > m_CurrentManaMax)
{
m_CurrentMana = m_CurrentManaMax;
}
if (bDoHurt)
DoHurt();
}
if (m_CurrentLife < 0)
{
int nMode = DeathCalcPKValue(nAttacker);
DoDeath(nMode);
// if ËÀµÄÊÇÍæ¼Ò£¬¹Ø±ÕËûµÄ³ðɱº ÍÇдè״̬
if (m_Kind == kind_player)
Player[m_nPlayerIdx].m_cPK.CloseAll();
}
}
H bạn build lại core và test thử hihi ! và làm các option khác tương tự hì
Đừng ném gạch em nha huhu
Vào vấn đề chính thui
------------------
Về căn bản thì các option hút hít đã đc Add sẵn h ta chỉ cần gọi tới và sử dụng
Các biến liên quan tới hút hít
+m_CurrentManaStolen : Nội lực
+m_CurrentLifeStolen : Sinh lực
+m_CurrentStaminaStolen : Thể lực
------------------
Mình chỉ làm hút máu thôi còn các cái khác các bạn tự làm nha
Đầu tiên các bạn vào lớp KNpc (.h) làm thêm 1 hàm hồi máu như sau
void DeathPunish(int nMode, int nBelongPlayer);
void RestoreLiveData(int nDamage);
void RestoreDamage2Life(int nDamage); //Hàm mình add để làm hút máu
Giờ các bạn viết hàm đó như sau trong file KNpc.cpp
void KNpc::RestoreLiveData(int nDamage)
{
}
//Đây là hàm mình mới add theo định nghĩ ở trên
void KNpc::RestoreDamage2Life(int nDamage)
{
m_CurrentLife = m_CurrentLife + (nDamage*m_CurrentLifeStolen/100);
if (m_CurrentLife >= m_CurrentLifeMax)
m_CurrentLife = m_CurrentLifeMax;
}
Bây h ta làm hút hít thui để cho rõ ràng mình xin post toàn bộ hàm lên [Thực sự mình chỉ thêm 1 chút trong hàm này thui]
void KNpc::CalcDamage(int nAttacker, int nMin, int nMax, DAMAGE_TYPE nType, BOOL bIsMelee, BOOL bDoHurt /* TRUE */, BOOL bReturn /* = FALSE */)
{
if (m_Doing == do_death || m_RegionIndex < 0)
return;
if (nMin + nMax <= 0)
return;
int nRes = 0;
int nDamageRange = nMax - nMin;
int nDamage = 0;
if (nDamageRange < 0)
{
nDamage = nMax + g_Random(-nDamageRange);
}
else
nDamage = nMin + g_Random(nMax - nMin);
// µÚÒ»²½£¬Í³¼Æ¿¹ÐÔ£¬²¢¼ÆËãÎ üÊÕÉ˺¦
switch(nType)
{
case damage_physics:
nRes = m_CurrentPhysicsResist;
if (nRes > m_CurrentPhysicsResistMax)
{
nRes = m_CurrentPhysicsResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼÎïÀíÉ˺¦£¬ÎïÀ í¿¹ÐÔ%d£¬ÎïÀí¶Ü%d", Name, nDamage, nRes, m_PhysicsArmor.nValue[0]);
m_PhysicsArmor.nValue[0] -= nDamage;
if (m_PhysicsArmor.nValue[0] < 0)
{
nDamage = -m_PhysicsArmor.nValue[0];
m_PhysicsArmor.nValue[0] = 0;
m_PhysicsArmor.nTime = 0;
}
else
{
nDamage = 0;
}
if (bIsMelee)
{
nMax = m_CurrentMeleeDmgRetPercent;
}
else
{
nMax = m_CurrentRangeDmgRetPercent;
}
break;
case damage_cold:
nRes = m_CurrentColdResist;
if (nRes > m_CurrentColdResistMax)
{
nRes = m_CurrentColdResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ±ùÉ˺¦£¬±ù¿¹Ð Ô%d£¬±ù¶Ü%d", Name, nDamage, nRes, m_ColdArmor.nValue[0]);
m_ColdArmor.nValue[0] -= nDamage;
if (m_ColdArmor.nValue[0] < 0)
{
nDamage = -m_ColdArmor.nValue[0];
m_ColdArmor.nValue[0] = 0;
m_ColdArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_fire:
nRes = m_CurrentFireResist;
if (nRes > m_CurrentFireResistMax)
{
nRes = m_CurrentFireResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ»ðÉ˺¦£¬»ð¿¹Ð Ô%d£¬»ð¶Ü%d", Name, nDamage, nRes, m_FireArmor.nValue[0]);
m_FireArmor.nValue[0] -= nDamage;
if (m_FireArmor.nValue[0] < 0)
{
nDamage = -m_FireArmor.nValue[0];
m_FireArmor.nValue[0] = 0;
m_FireArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_light:
nRes = m_CurrentLightResist;
if (nRes > m_CurrentLightResistMax)
{
nRes = m_CurrentLightResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼµçÉ˺¦£¬µç¿¹Ð Ô%d£¬µç¶Ü%d", Name, nDamage, nRes, m_LightArmor.nValue[0]);
m_LightArmor.nValue[0] -= nDamage;
if (m_LightArmor.nValue[0] < 0)
{
nDamage = -m_LightArmor.nValue[0];
m_LightArmor.nValue[0] = 0;
m_LightArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
break;
case damage_poison:
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ¶¾É˺¦", Name, nDamage);
nRes = m_CurrentPoisonResist;
if (nRes > m_CurrentPoisonResistMax)
{
nRes = m_CurrentPoisonResistMax;
}
if (nRes > MAX_RESIST)
{
nRes = MAX_RESIST;
}
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼ¶¾É˺¦£¬¶¾¿¹Ð Ô%d£¬¶¾¶Ü%d", Name, nDamage, nRes, m_PoisonArmor.nValue[0]);
m_PoisonArmor.nValue[0] -= nDamage;
if (m_PoisonArmor.nValue[0] < 0)
{
nDamage = -m_PoisonArmor.nValue[0];
m_PoisonArmor.nValue[0] = 0;
m_PoisonArmor.nTime = 0;
}
else
{
nDamage = 0;
}
nMax = m_CurrentRangeDmgRetPercent;
m_nLastPoisonDamageIdx = nAttacker;
break;
case damage_magic:
g_DebugLog("[ÊýÖµ]%sÊܵ½%dµãÔʼħ·¨É˺¦", Name, nDamage);
nRes = 0;
break;
default:
nRes = 0;
break;
}
if (!nDamage)
return;
// µÚ¶þ²½ÅжÏÊÇ·ñÓÐħ·¨¶Ü´æÔ Ú
g_DebugLog("[ÊýÖµ]%sħ·¨¶ÜÎüÊÕ±ÈÀý£º%d", Name, m_ManaShield.nValue[0]);
if (m_ManaShield.nValue[0])
{
int nManaDamage = nDamage * m_ManaShield.nValue[0] / 100;
m_CurrentMana -= nManaDamage;
if (m_CurrentMana < 0)
{
nDamage -= m_CurrentMana;
m_CurrentMana = 0;
m_ManaShield.nValue[0] = 0;
m_ManaShield.nTime = 0;
}
else
{
nDamage -= nManaDamage;
}
}
nDamage = nDamage * (100 - nRes) / 100;
g_DebugLog("[ÊýÖµ]%sʵ¼ÊÉ˺¦£º%d", Name, nDamage);
// ·´µ¯É˺¦
if (nAttacker > 0 && bReturn == FALSE)
{
if (bIsMelee)
{
nMin = m_CurrentMeleeDmgRet;
nMin += nDamage * nMax / 100;
Npc[nAttacker].CalcDamage(m_Index, nMin, nMin, damage_magic, FALSE, FALSE, TRUE);
}
else
{
nMin = m_CurrentRangeDmgRet;
nMin += nDamage * nMax / 100;
Npc[nAttacker].CalcDamage(m_Index, nMin, nMin, damage_magic, FALSE, FALSE, TRUE);
}
g_DebugLog("[ÊýÖµ]%s·µ»ØÉ˺¦%d", Name, nMin);
}
// PK´¦Àí£¬É˺¦³ËÒ»¸öϵÊý
if (this->m_Kind == kind_player && Npc[nAttacker].m_Kind == kind_player)
nDamage = nDamage * NpcSet.m_nPKDamageRate / 100;
m_nLastDamageIdx = nAttacker;
if (m_Kind != kind_player && Npc[nAttacker].m_Kind == kind_player && Npc[nAttacker].m_nPlayerIdx > 0)
m_cDeathCalcExp.AddDamage(Npc[nAttacker].m_nPlayerIdx, (m_CurrentLife - nDamage > 0 ? nDamage : m_CurrentLife));
m_CurrentLife -= nDamage;
if (nDamage > 0)
{
//Đây là đoạn mình thêm vô
//Tại đây các bạn có thể xét xem skill là nội công hay ngoại công để cho phép tăng máu
if (m_CurrentLife > 0)
Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].RestoreDamage2Life(nDamage);
else
Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].RestoreDamage2Life(nDamage + m_CurrentLife);
//End add
m_CurrentMana += m_CurrentDamage2Mana * nDamage / 100;
if (m_CurrentMana > m_CurrentManaMax)
{
m_CurrentMana = m_CurrentManaMax;
}
if (bDoHurt)
DoHurt();
}
if (m_CurrentLife < 0)
{
int nMode = DeathCalcPKValue(nAttacker);
DoDeath(nMode);
// if ËÀµÄÊÇÍæ¼Ò£¬¹Ø±ÕËûµÄ³ðɱº ÍÇдè״̬
if (m_Kind == kind_player)
Player[m_nPlayerIdx].m_cPK.CloseAll();
}
}
H bạn build lại core và test thử hihi ! và làm các option khác tương tự hì