PDA

View Full Version : [JX] Hưỡng dẫn cơ bản làm hút hít từ source full JX



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ì

kelly
28-08-12, 01:13 PM
+m_CurrentManaStolen : Nội lực
+m_CurrentStaminaStolen : Sinh lực
+m_CurrentStaminaStolen : Thể lực

Mình đính chính chút cho thành viên mới hiểu
trện bạn ấy viết nhầm

Hàm sinh lực là này nhé (m_CurrentLifeStolen)

trananh88vt
28-08-12, 01:14 PM
+m_CurrentManaStolen : Nội lực
+m_CurrentStaminaStolen : Sinh lực
+m_CurrentStaminaStolen : Thể lực

Mình đính chính chút cho thành viên mới hiểu
trện bạn ấy viết nhầm

Hàm sinh lực là này nhé (m_CurrentLifeStolen)

Hi hi thanks bạn hì ! copy và paste thui mà cũng nhầm huhu

Learning
28-08-12, 01:18 PM
lớn rồi mà sao cứ xưng em thế anh :))

trananh88vt
28-08-12, 01:20 PM
lớn rồi mà sao cứ xưng em thế anh :))

Bít ai bao nhui tuổi đâu ! Xưng vậy cho chắc ăn ! không lại bị ăn gạch nữa :(

Learning
28-08-12, 01:25 PM
ném thì ném lại. họ ném gạch mình ném táp lô :))

assaa
28-08-12, 06:35 PM
Tks bạn nhiều lắm. Như thế này thì JX Offline ngày càng phát triển thêm

ferari
28-08-12, 06:41 PM
Nếu rảnh ngâm tiếp cái vụ rồng dí , bổng dí nhé bạn :D

trananh88vt
28-08-12, 06:45 PM
Nếu rảnh ngâm tiếp cái vụ rồng dí , bổng dí nhé bạn :D

Hì rồng dí bổng dí mình nghĩ mãi ko ra hướng giải quyết hì ! Đành phải ngâm tiếp hì

ferari
28-08-12, 06:47 PM
Hì rồng dí bổng dí mình nghĩ mãi ko ra hướng giải quyết hì ! Đành phải ngâm tiếp hì

BẠn có thể cho mình xin core hút hít này để test thử được không mình chứ có down source full ?

trananh88vt
28-08-12, 06:49 PM
BẠn có thể cho mình xin core hút hít này để test thử được không mình chứ có down source full ?

Hì core của mình còn gà lắm ko dám share hì !

kelly
28-08-12, 07:27 PM
BẠn có thể cho mình xin core hút hít này để test thử được không mình chứ có down source full ?

Để xem rảnh mình se share code full, bừa giờ bận quá :(

trananh88 bạn hướng dẫn kỹ thế còn gì bạn nghiên cưu là bạn có thể làm được