예제 #1
0
 public bool isAttackable(Npc pTarget)
 {
     return(true);
 }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }