Exemple #1
0
        private static void SkillAttack(ref Actor sActor, ref Actor dActor, uint damage, ref Map.SkillArgs args)
        {
            ActorPC  targetPC;
            ActorNPC targetNPC;

            if (dActor.stance == SagaLib.Global.STANCE.DIE)
            {
                return;
            }
            switch (dActor.type)
            {
            case ActorType.NPC:
                targetNPC = (ActorNPC)dActor;
                if (targetNPC.HP > damage)
                {
                    targetNPC.HP -= (ushort)damage;
                }
                else
                {
                    targetNPC.HP = 0;
                }
                Mob mob = (Mob)targetNPC.e;
                mob.BeenAttacked(sActor, args);
                TimeSpan tmp = mob.timeSignature.time - DateTime.Now;
                if (tmp.Minutes > 5 || tmp.Minutes < 0 || mob.timeSignature.actorID == 0 || mob.timeSignature.actorID == sActor.id)
                {
                    mob.timeSignature.actorID = sActor.id;
                    mob.timeSignature.time    = DateTime.Now;
                }
                if (targetNPC.HP == 0)
                {
                    targetNPC.e.OnDie();
                    if (sActor.type == ActorType.PC)
                    {
                        targetPC = (ActorPC)sActor;
                        Quest.QuestsManager.UpdateEnemyInfo(targetPC, targetNPC.npcType);
                    }
                    mob.Map.SendEventToAllActorsWhoCanSeeActor(Map.EVENT_TYPE.CHANGE_STATE, null, targetNPC, true);

                    //EXP calculation
                    foreach (uint i in mob.Damage.Keys)
                    {
                        targetPC = (ActorPC)mob.Map.GetActor(i);
                        if (targetPC == null)
                        {
                            continue;
                        }

                        ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)targetPC.e;

                        // Apply player's part of the experience (determined by the percentage of HP deducted)
                        ExperienceManager.Instance.ApplyExp(targetPC, targetNPC, (float)mob.Damage[i] / (float)targetNPC.maxHP);

                        eh.C.SendCharStatus(36);

                        // Check experience (will send level up if relevant)
                        ExperienceManager.Instance.CheckExp(eh.C, ExperienceManager.LevelType.CLEVEL);
                        ExperienceManager.Instance.CheckExp(eh.C, ExperienceManager.LevelType.JLEVEL);
                        ExperienceManager.Instance.CheckExp(eh.C, ExperienceManager.LevelType.WLEVEL);

                        eh.C.UpdateWeaponInfo(SagaMap.Packets.Server.WeaponAdjust.Function.EXP,
                                              SagaDB.Items.WeaponFactory.GetActiveWeapon(eh.C.Char).exp);
                    }
                    mob.Damage.Clear();
                }
                break;

            case ActorType.PC:
                targetPC = (ActorPC)dActor;
                if (targetPC.HP > damage)
                {
                    targetPC.HP -= (ushort)damage;
                }
                else
                {
                    targetPC.HP = 0;
                }
                EquiptLoseDurability(targetPC);
                if (targetPC.HP == 0)
                {
                    ActorEventHandlers.PC_EventHandler eh = (SagaMap.ActorEventHandlers.PC_EventHandler)targetPC.e;
                    targetPC.e.OnDie();
                    eh.C.map.SendEventToAllActorsWhoCanSeeActor(Map.EVENT_TYPE.CHANGE_STATE, null, targetPC, true);
                }

                break;
            }
        }