Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
vestside

ICE mage EFFECT problemi

Önerilen Mesajlar

Herkese iyi forumlar arkadaşlar; başlıkta belirttiğim gibi ICE magenin 72 STAFF 70 skili ve tekli skillerin çoğusunu karşı ırka vurduğumuz zaman SKILL hem onde hem bizim üzerimizde patlıyor.

hepinize şimdiden teşekkürler.

MaO39g.jpg

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
aynı sorun bendede var nova atıyorum hem bana hem attığım yere düşüyor bana düşen sadece görüntü işlevi yok ama incelemedim müsat zamanımda bakıcam çözersem yazarım


dostum ben biraz soruşturdum sorunun " executetype3() " den kaynaklandığı söyleniyor. tam olarak ne yapmak gerektiğini bende bilmiyorum test ediyorum birşeyler ekleyip çözüm bulursam konu altına yazacağım.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
bool MagicInstance::ExecuteType3() paketini at bakayim..


TXT olarak ekledim, oradan bakabilirsin EMRE ben ne yaptıysam olmadı sorunun kaynağını bir türlü bulamadım.

İletiyi paylaş


Link to post
Sitelerde Paylaş

Soruyu çözüldü. bunu şekilde değiştirebilirsi.


// Applied when a magical attack, healing, and mana restoration is done.
bool MagicInstance::ExecuteType3()
{
if (pSkill == nullptr)
return false;

_MAGIC_TYPE3* pType = g_pMain->m_Magictype3Array.GetData(nSkillID);
if (pType == nullptr)
return false;

int damage = 0, duration_damage = 0;
vector casted_member;

// If the target's a group of people...
if (sTargetID == -1)
{
std::vector unitList;
g_pMain->GetUnitListFromSurroundingRegions(pSkillCaster, &unitList);
if(pType->sFirstDamage > 0 || pType->sTimeDamage > 0)
casted_member.push_back(pSkillCaster);
BOOST_FOREACH (auto itr, unitList)
{

Unit * pTarget = g_pMain->GetUnitPtr(itr);

if(pTarget == nullptr)
continue;


if (pTarget->isNPC()
&& pTarget->GetNation() == pSkillCaster->GetNation()
&& pType->sFirstDamage && !TO_NPC(pTarget)->isMonster())
continue;

if(pTarget->GetEventRoom() != pSkillCaster->GetEventRoom())
continue;


if (pSkillCaster != pTarget
&& !pTarget->isDead()
&& pTarget->isAttackable()
&& CMagicProcess::UserRegionCheck(pSkillCaster, pTarget, pSkill, pType->bRadius, sData[0], sData[2]))
casted_member.push_back(pTarget);
}

// If you managed to not hit anything with your AoE, you're still gonna have a cooldown (You should l2aim)
if (casted_member.empty() || (sTargetID == -1 && casted_member.empty()))
{
SendSkill();
return true;
}
}
else
{ // If the target was a single unit.
if (pSkillTarget == nullptr
|| pSkillTarget->isDead()
|| (pSkillTarget->isPlayer()
&& (TO_USER(pSkillTarget)->isBlinking() || TO_USER(pSkillTarget)->isInSafetyArea())))
return false;

if (pSkill->sRange > 0
&& (pSkillCaster->GetDistanceSqrt(pSkillTarget) > float(pSkill->sRange * 2)))
return false;

casted_member.push_back(pSkillTarget);
}

// Anger explosion requires the caster be a player
// and a full anger gauge (which will be reset after use).
if (pType->bDirectType == 18)
{
// Only players can cast this skill.
if (!pSkillCaster->isPlayer()
|| !TO_USER(pSkillCaster)->hasFullAngerGauge())
return false;

// Reset the anger gauge
TO_USER(pSkillCaster)->UpdateAngerGauge(0);
}

sData[1] = 1;
BOOST_FOREACH (auto itr, casted_member)
{
Unit * pTarget = itr; // it's checked above, not much need to check it again

if(pTarget == nullptr)
continue;

if (pSkill->sRange > 0
&& (pSkillCaster->GetDistanceSqrt(pTarget) >= (float)pSkill->sRange))
continue;

// If you are casting an attack spell.
if ((pType->sFirstDamage bDirectType == 1 || pType->bDirectType == 8)
&& (nSkillID && (pType->bDirectType != 11 && pType->bDirectType != 13))
damage = GetMagicDamage(pTarget, pType->sFirstDamage, pType->bAttribute);
else
damage = pType->sFirstDamage;

// Allow for complete magic damage blocks.
if (damage m_bBlockMagic)
continue;

if (pSkillCaster->isPlayer())
{
if (pSkillCaster->GetZoneID() == ZONE_SNOW_BATTLE && g_pMain->m_byBattleOpen == SNOW_BATTLE)
damage = -10;
}

bool bSendLightningStunSkill = true;

if (pType->bDirectType && pType->bAttribute == AttributeLightning
|| pType->bAttribute == AttributeIce
&& pTarget->isPlayer())
{
// Success rate...
if (pSkill->bSuccessRate bSuccessRate bSendLightningStunSkill = false;
// Calculate user ressistance...
else
{
uint16 nMaxRessitance = 250; // Monster Lighting Fix
uint16 nTargetResistance = pType->bAttribute == AttributeIce ? pTarget->m_sColdR : pTarget->m_sLightningR;

if (nTargetResistance > nMaxRessitance)
nMaxRessitance = nTargetResistance;

if (nTargetResistance >= myrand(0, nMaxRessitance - nTargetResistance) || myrand(0,3))
bSendLightningStunSkill = false;
}
if (nSkillID == 115810 || nSkillID == 215810)
bSendLightningStunSkill = true;
}

// Non-durational spells.
if (pType->bDuration == 0)
{
switch (pType->bDirectType)
{
// Affects target's HP
case 1:
// Disable to heal or minor NPC.
if ((pTarget->isNPC() && pType->sTimeDamage > 0) || (pTarget->isNPC() && pType->sFirstDamage > 0))
return false;


// "Critical Point" buff gives a chance to double HP from pots or the rogue skill "Minor heal".
if (damage > 0 && pSkillCaster->hasBuff(BUFF_TYPE_DAMAGE_DOUBLE)
&& CheckPercent(500))
damage *= 2;

/*if (damage > 0 && pTarget->isDevil()) //Created by Terry
damage *= 2;
//Kurian HP POT x2*/


pTarget->HpChangeMagic(damage, pSkillCaster, (AttributeType) pType->bAttribute);

if (pTarget->m_bReflectArmorType != 0 && pTarget != pSkillCaster && damage ReflectDamage(damage, pTarget);

break;
case 2:
if (!pTarget->isDead() && pTarget->isPlayer())
pTarget->MSpChange(pType->sFirstDamage);
else if (!pTarget->isDead())
pTarget->HpChange(pType->sFirstDamage,pSkillCaster);
break;
case 3:
pTarget->MSpChange(damage);
break;

// "Magic Hammer" repairs equipped items.
case 4:
if (pTarget->isPlayer())
{
if (damage > 0)
{
// Power Up Store ( Talia, Armor Destruction ve Tamamını )
if (pSkill->iNum == SPECIAL_MAGIC_HAMMER_SKILL_1
|| pSkill->iNum == SPECIAL_MAGIC_HAMMER_SKILL_2
|| pSkill->iNum == SPECIAL_MAGIC_HAMMER_SKILL_3)
TO_USER(pTarget)->ItemWoreOut(ACID_ALL, damage);
else
TO_USER(pTarget)->ItemWoreOut(REPAIR_ALL, damage);
}
else
TO_USER(pTarget)->ItemWoreOut(DEFENCE, -damage);
}
break;

// Increases/decreases target's HP by a percentage
case 5:
if (pType->sFirstDamage damage = (pType->sFirstDamage * pTarget->GetHealth()) / -100;
else
damage = (pTarget->GetMaxHealth() * (pType->sFirstDamage - 100)) / 100;

pTarget->HpChangeMagic(damage, pSkillCaster);
break;

// Caster absorbs damage based on percentage of target's HP. Players only.
case 8:
if (pType->sFirstDamage > 0)
{
if (pType->sFirstDamage damage = (pTarget->GetHealth() * 100) / pType->sFirstDamage;
else
damage = (pTarget->GetMaxHealth() - 100 * 100) / pType->sFirstDamage;
}

if (!pTarget->isDead() && pTarget->isPlayer())
{
pTarget->HpChangeMagic(damage, pSkillCaster);
pSkillCaster->HpChangeMagic(-(damage));
}
else
pTarget->HpChange(damage,pSkillCaster);

break;

// Caster absorbs damage based on percentage of target's max HP
case 9:
if (pType->sFirstDamage damage = (pType->sFirstDamage * pTarget->GetHealth()) / -100;
else
damage = (pTarget->GetMaxHealth() * (pType->sFirstDamage - 100)) / 100;

pTarget->HpChangeMagic(damage, pSkillCaster);
if (pTarget->isPlayer())
pSkillCaster->HpChangeMagic(-(damage));
break;

// Inflicts true damage (i.e. disregards Ac/resistances/buffs, etc).
case 11:
pTarget->HpChange(damage, pSkillCaster);
break;

// Used by "Destination scroll" (whatever that is)
case 12:
continue;

// Chance (how often?) to reduce the opponent's armor and weapon durability by sFirstDamage
case 13:
if (pTarget->isPlayer() && CheckPercent(500)) // using 50% for now.
{
TO_USER(pTarget)->ItemWoreOut(ATTACK, damage);
TO_USER(pTarget)->ItemWoreOut(DEFENCE, damage);
}
break;

// Drains target's MP, gives half of it to the caster as HP. Players only.
// NOTE: Non-durational form (as in 1.8xx). This was made durational later (database configured).
case 16:
if (pTarget->isPlayer())
{
pTarget->MSpChange(pType->sFirstDamage);
pSkillCaster->HpChangeMagic(-(pType->sFirstDamage) / 2);
}
break;
case 17:
if (!pTarget->isNPC() && !pTarget->isDead() && pSkillCaster->GetZoneID() == ZONE_DELOS && !pSkillCaster->isDead())
{
pTarget->HpChangeMagic(pType->sFirstDamage,pSkillCaster, (AttributeType) pType->bAttribute);
}
break;
case 19: // Chaos Dungeon Skills
if (pTarget->isPlayer())
{
pTarget->HpChangeMagic(damage / 10, pSkillCaster, (AttributeType) pType->bAttribute);

if (pTarget != pSkillCaster)
ReflectDamage(damage, pTarget);
}
break;
// Stat Scroll - MagicNum = 501011
case 255:
if (TO_USER(pSkillCaster)->isPlayer())
{

}
break;
}
}
// Durational spells! Durational spells only involve HP.
else if (pType->bDuration != 0)
{
if (pType->bDirectType == 18)
damage = -(int)(pSkillCaster->GetLevel() * 12.5);

if (damage != 0) // In case there was first damage......
pTarget->HpChangeMagic(damage, pSkillCaster); // Initial damage!!!

if (pTarget == nullptr)
return false;
if (pTarget->isAlive())
{
CUser *pUser = TO_USER(pSkillCaster);
// HP booster (should this actually just be using sFirstDamage as the percent of max HP, i.e. 105 being 5% of max HP each increment?)
if (!pTarget->isNPC())
{
if (pType->bDirectType == 14)
duration_damage = (int)(pSkillCaster->GetLevel() * (10 + pSkillCaster->GetLevel() / 2.6)) + 3;
else if (pType->bDirectType == 19)
duration_damage = (pType->sTimeDamage / 10);
/*else if (pSkillCaster->isPlayer() && pUser->isKurianPortu())
duration_damage = (pType->sTimeDamage * 2);*/
else if (pType->sTimeDamage bAttribute != 4)
duration_damage = GetMagicDamage(pTarget, pType->sTimeDamage, pType->bAttribute);
else
duration_damage = pType->sTimeDamage;

// Allow for complete magic damage blocks.
if (duration_damage m_bBlockMagic)
continue;

if (pType->bDirectType == 18)
duration_damage = -(int)((pSkillCaster->GetLevel() * 12.5) * (pType->bDuration / 2));

// Setup DOT (damage over time)
for (int k = 0; k {
Unit::MagicType3 * pEffect = &pTarget->m_durationalSkills[k];

if(pEffect == nullptr)
continue;

if (pEffect->m_byUsed)
continue;

pEffect->m_byUsed = true;
pEffect->m_tHPLastTime = 0;
if (pType->bDirectType == 14) // HP Booster pot basamama sorunu
pEffect->m_bHPInterval = 4; // interval of 4s between each damage loss/HP gain
else
pEffect->m_bHPInterval = 2; // interval of 2s between each damage loss/HP gain

// number of ticks required at a rate of 2s per tick over the total duration of the skill
float tickCount = (float)pType->bDuration / (float)pEffect->m_bHPInterval;


// amount of HP to be given/taken every tick at a rate of 2s per tick
pEffect->m_sHPAmount = (int16)(duration_damage / tickCount);

pEffect->m_bTickCount = 0;
pEffect->m_bTickLimit = (uint8) tickCount;
pEffect->m_sSourceID = sCasterID;
pEffect->m_byAttribute = pType->bAttribute;
pEffect->m_sTo = false;
break;
}

pTarget->m_bType3Flag = true;
}else{


if (pType->sTimeDamage bAttribute != 4)
duration_damage = GetMagicDamage(pTarget, pType->sTimeDamage, pType->bAttribute);
else
duration_damage = pType->sTimeDamage;


for (int k = 0; k {
Unit::MagicType3 * pEffect = &pSkillCaster->m_durationalSkills[k];

if(pEffect == nullptr)
continue;

if (pEffect->m_byUsed)
continue;

pEffect->m_byUsed = true;
pEffect->m_tHPLastTime = 0;
pEffect->m_bHPInterval = 2; // interval of 2s between each damage loss/HP gain

// number of ticks required at a rate of 2s per tick over the total duration of the skill
float tickCount = (float)pType->bDuration / (float)pEffect->m_bHPInterval;


// amount of HP to be given/taken every tick at a rate of 2s per tick
pEffect->m_sHPAmount = (int16)(duration_damage / tickCount);
pEffect->m_bTickCount = 0;
pEffect->m_bTickLimit = (uint8) tickCount;
pEffect->m_sSourceID = pTarget->GetID();
pEffect->m_byAttribute = pType->bAttribute;
pEffect->m_sTo = true;
break;
}

pSkillCaster->m_bType3Flag = true;

}

}

// Send the status updates (i.e. DOT or position indicators) to the party/user
if (pTarget->isPlayer()
// Ignore healing spells, not sure if this will break any skills.
&& pType->sTimeDamage {
if (bSendLightningStunSkill)
TO_USER(pTarget)->SendUserStatusUpdate(pType->bAttribute == POISON_R ? USER_STATUS_POISON : USER_STATUS_DOT, USER_STATUS_INFLICT);
}
}

if (!bSendLightningStunSkill)
{
if (pSkillCaster->isNPC())
{
sData[1] = 0;
BuildAndSendSkillPacket(pSkillCaster, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sData);
TO_USER(pTarget)->ShowEffect(nSkillID);
}
else
{
if (pSkill->bMoral == MORAL_ENEMY)
{
sData[1] = 0;
BuildAndSendSkillPacket(pSkillCaster, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sData);
TO_USER(pTarget)->ShowEffect(nSkillID);
}
else if (pSkill->bMoral != MORAL_ENEMY)
{
sData[1] = 0;
BuildAndSendSkillPacket(pSkillCaster, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sData);

}
}
}
else
{
if (bSendLightningStunSkill && LightStunSkills() && pTarget->isPlayer()
|| bSendLightningStunSkill && ColdSkills() && pTarget->isPlayer())
{
MagicInstance instance;
nSkillID += 80000;
instance.nSkillID = nSkillID;
if (LightStunSkillsNot() && pTarget->isPlayer())
{
TO_USER(pTarget)->SendUserStatusUpdate(USER_STATUS_POISON, USER_STATUS_INFLICT);
ExecuteType4();
}
if(ColdSkillsNot() && pTarget->isPlayer())
{
if (pTarget->isPlayer() && ColdSkillsNot())
{
TO_USER(pTarget)->SendUserStatusUpdate(USER_STATUS_SPEED, USER_STATUS_INFLICT);
ExecuteType4();
}
_MAGIC_TYPE4* pType2 = g_pMain->m_Magictype4Array.GetData(nSkillID);

if (pType2 == nullptr)
return false;

uint8 nTargetSpeedAmount = pType2->bSpeed;

uint8 bResult = 1;
uint16 sDuration = pType2->sDuration;

Unit *pTmp = (pSkillCaster->isPlayer() ? pSkillCaster : pTarget);
int16 sDataCopy[] =
{
sData[0], bResult, sData[2], sDuration,
sData[4], pType2->bSpeed, sData[6]
};

sDataCopy[5] = nTargetSpeedAmount;
BuildAndSendSkillPacket(pTmp, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sDataCopy);
}
else
BuildAndSendSkillPacket(pSkillCaster, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sData);
TO_USER(pTarget)->ShowEffect(nSkillID);
}
else

// Send the skill data in the current context to the caster's region, with the target explicitly set.
// In the case of AOEs, this will mean the AOE will show the AOE's effect on the user (not show the AOE itself again).
if (pSkill->bType[1] == 0 || pSkill->bType[1] == 3)
BuildAndSendSkillPacket(pSkillCaster, true, sCasterID, pTarget->GetID(), bOpcode, nSkillID, sData);

}
// Tell the AI server we're healing someone (so that they can choose to pick on the healer!)
if (pType->bDirectType == 1 && damage > 0
&& sCasterID != sTargetID)
{
Packet result(AG_HEAL_MAGIC);
result g_pMain->Send_AIServer(&result);
}
}

// Allow for AOE effects.
if (sTargetID == -1 && pSkill->bType[0] == 3)
SendSkill();

return true;
}


İletiyi paylaş


Link to post
Sitelerde Paylaş
Misafir
Bu konu kapalıdır ama konuya cevap yazmaya yetkiniz var görünüyor.

×
×
  • Yeni Oluştur...