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; } }