public bool isAttackable(Npc pTarget) { return(true); }
public void Attack(Packet pkt) { byte bType = pkt, bResult = pkt; short tid = pkt, sid = -1, damage, delaytime = pkt, distance = pkt; RemoveStealth(); if (tid >= Headers.GameDefine.NPC_BAND) { Npc pTarget = g_pMain.m_NpcList.Where(i => i.Key == tid).Select(i => i.Value).FirstOrDefault(); if (pTarget == null) { return; } if (isAttackable(pTarget) && CanCastRHit()) { /* * if (isInTempleEventZone() && * (!isSameEventRoom(pTarget) || !g_pMain->pTempleEvent.isAttackable[GetEventRoom()] || && isEventUser())) || return; || || if (isInTempleQuestEventZone() && || (!isSameEventRoom(pTarget) || !g_pMain->pQuestEvent.isAttackable || && isQuestEventUser())) || return; || || if (pTarget->isPlayer() && pTarget->hasBuff(BUFF_TYPE_FREEZE)) || return;*/ damage = GetDamage(pTarget); if (GetZoneID() == ZONE_SNOW_BATTLE /*&& g_pMain->m_byBattleOpen == SNOW_BATTLE*/) { damage = 0; } else if (GetZoneID() == ZONE_PRISON) { if (m_sMp < (m_iMaxMp / 5)) { return; } damage = 1; MSpChange(-(m_iMaxMp / 5)); } switch (pTarget.m_tNpcType) { case NPC_FOSIL: damage = 1; break; case NPC_TREE: damage = 20; break; case NPC_REFUGEE: damage = 10; break; case NPC_PARTNER_TYPE: return; } if (damage > 0) { pTarget.HpChange(-damage, this); if (pTarget.isDead()) { bResult = ATTACK_TARGET_DEAD; } else { bResult = ATTACK_SUCCESS; } // Every attack takes a little of your weapon's durability. //ItemWoreOut(ATTACK, damage); // Every hit takes a little of the defender's armour durability. //if (pTarget->isPlayer()) // TO_USER(pTarget)->ItemWoreOut(DEFENCE, damage); } } } Packet result = new Packet(WIZ.ATTACK, bType); result = result + bResult + GetSocketID() + tid; SendToRegion(result); }
public short GetDamage(Npc pTarget /* , _MAGIC_TABLE *pSkill = nullptr, bool bPreviewOnly = false*/) { if (pTarget == null) { return(-1); } int damage = 0; int random = 0; int temp_hit = 0, temp_ac = 0, temp_ap = 0, temp_hit_B = 0; byte result; if (pTarget == null || pTarget.isDead()) { return(-1); } temp_ac = pTarget.m_sTotalAc; // A unit's total AC shouldn't ever go below 0. if ((pTarget.m_sACAmount) <= 0) { pTarget.m_sACAmount = 0; } else { temp_ac += pTarget.m_sACAmount; } if (pTarget.m_sACPercent > 0 && pTarget.m_sACPercent < 100) { temp_ac -= temp_ac * (100 - pTarget.m_sACPercent) / 100; } temp_ap = m_sTotalHit * m_bAttackAmount; temp_hit_B = (int)((temp_ap * 200 / 100) / (temp_ac + 240)); temp_hit = temp_ap / 100; result = GetHitRate(m_fTotalHitrate / pTarget.m_fTotalEvasionrate); short Hit = (short)m_sTotalHit, Ac = pTarget.m_sTotalAc; result = GetHitRate(m_fTotalHitrate / pTarget.m_fTotalEvasionrate); switch (result) { case GREAT_SUCCESS: case SUCCESS: case NORMAL: /* * if (pSkill != nullptr) * { * // Skill Hit. * damage = temp_hit; * random = myrand(0, damage); * if (pSkill->bType[0] == 1) * damage = (short)((temp_hit + 0.3f * random) + 0.99f); * else * damage = (short)(((temp_hit * 0.6f) + 1.0f * random) + 0.99f); * } * else * { // Normal Hit. */ if (isGM()) //&& !pTarget->isPlayer()/) { //if (g_pMain->m_nGameMasterRHitDamage != 0) // { damage = MAX_DAMAGE; return((short)damage); // } } damage = temp_hit_B; random = myrand(0, damage); damage = (short)((0.85f * temp_hit_B) + 0.3f * random); break; case FAIL: //if (pSkill != nullptr) //{ // Skill Hit. // //} //else //{ // Normal Hit. if (isGM()) { damage = MAX_DAMAGE; return((short)damage); } // } break; } // damage = GetMagicDamage(damage, pTarget, bPreviewOnly); if (damage > MAX_DAMAGE) { damage = MAX_DAMAGE; } return((short)damage); }
private void ClientEvent(short sNpcID) { int iEventID = 0; Npc pNpc = g_pMain.GetNpcPtr(sNpcID); if (pNpc == null) { return; } m_sEventNid = sNpcID; m_sEventSid = pNpc.m_sSid; // For convenience purposes with Lua scripts. if (pNpc.GetProtoID() == SAW_BLADE_SSID) { if (GetZoneID() == ZONE_CHAOS_DUNGEON) { HpChange(-5000 / 10); } else if (GetZoneID() == ZONE_KROWAZ_DOMINION) { HpChange(-370, pNpc.GetID()); } return; } else if (pNpc.GetType() == NPC_KISS) { KissUser(); return; } else if (pNpc.GetType() == NPC_ROLLINGSTONE) { HpChange(-3000, pNpc.GetID()); return; } var helpers = g_pMain.m_HelperList.Where(i => i.sNpcId == pNpc.GetProtoID()).ToList(); Database.ServerManager.QUEST_HELPER pHelper = null; foreach (var itr in helpers) { if (itr == null || itr.sEventDataIndex > 0 || itr.bEventStatus > 0 || (itr.bNation != 3 && itr.bNation != m_bNation) || (itr.bClass != 5 && itr.bClass != m_sClass)) { continue; } pHelper = itr; break; } if (pHelper == null) { return; } QuestV2RunEvent(pHelper, pHelper.nEventTriggerIndex); }