public void OnPartyInvite(ActorPC sActor)
 {
 }
Exemple #2
0
 public override void OnClicked(ActorPC pc)
 {
     OpenMailBox(pc);
 }
Exemple #3
0
 public override void OnQuest(ActorPC pc, ushort questID, byte step, Quest quest)
 {
 }
Exemple #4
0
        public void SkillActivate(SkillArg arg)
        {
            ActorPC pc = arg.Caster as ActorPC;

            arg.Caster.Status.CastingSkill = false;
            if (pc != null && arg.Skill.BaseData.MovementLockOnAction > 0)
            {
                SkillHandlers.Common.Additions.MovementLock mLock = new SkillHandlers.Common.Additions.MovementLock(pc.Client(), arg.Skill.BaseData.MovementLockOnAction);
                mLock.Activate();
            }
            if (arg.Caster.Status.Dead)
            {
                return;
            }

            arg.Caster.Status.LastSkillID = arg.Skill.ID;
            if (!arg.Caster.Status.Dead && !arg.Caster.Status.Down)
            {
                HandleSkillCastFinish(arg);
                BroadcastSkillCast(arg, SkillMode.Activate);
                HandleSkillActivate(arg);
            }

            if (pc != null)
            {
                int duration = arg.AffectedActors.Count > 0 ? 30000 : 5000;
                if (pc.Tasks.TryGetValue("CombatStatusTask", out Task task))
                {
                    if (task.DueTime < duration)
                    {
                        task.DueTime = duration;
                    }
                    task.Activate();
                }
                else
                {
                    Tasks.Player.CombatStatusTask ct = new Tasks.Player.CombatStatusTask(duration, pc);
                    pc.Tasks["CombatStatusTask"] = ct;
                    ct.Activate();
                }
            }
            arg.ActivationIndex++;
            if (arg.Skill.BaseData.Duration <= 0)
            {
                BroadcastSkillCast(arg, SkillMode.End);
            }

            if (arg.ActivationIndex < arg.Skill.BaseData.ActivationTimes.Count)
            {
                arg.Caster.Status.CastingSkill = true;
                SkillCastTask task = new SkillCastTask(arg.Skill.BaseData.ActivationTimes[arg.ActivationIndex - 1], arg.Caster, arg);
                arg.Caster.Tasks["SkillCast"] = task;
                task.Activate();
            }
            else
            {
                if (arg.Skill.BaseData.CoolDown != 0)
                {
                    arg.Skill.CoolDownEndTime = DateTime.Now.AddMilliseconds(arg.Skill.BaseData.CoolDown);
                }

                //if (arg.Skill.BaseData.ActivationTimes.Count < arg.ActivationIndex)
                //{
                //    Logger.Log.Debug($"ActivationTimes for skill:{arg.Skill.ID} is smaller than index:{arg.ActivationIndex}");
                //}
                if (arg.Caster.ActorType == ActorType.NPC)
                {
                    arg.Caster.Status.SkillCooldownEnd = DateTime.Now.AddMilliseconds(arg.Skill.BaseData.ActivationTimes.Count > 0 && arg.Skill.BaseData.ActivationTimes.Count > (arg.ActivationIndex - 1) ? arg.Skill.BaseData.ActivationTimes[arg.ActivationIndex - 1] : 500);
                }
                else
                {
                    arg.Caster.Status.SkillCooldownEnd = DateTime.Now.AddMilliseconds(100);//TODO: Use real data
                }
            }
        }
 public override void OnOperate(ActorPC pc, Map map)
 {
     Utils.SpawnNPC(map, 256, 0, -7838, -7859, -280, 270, 0);
     Utils.SpawnNPC(map, 256, 0, -7015, -7475, -264, 111, 0);
     Utils.SpawnNPC(map, 256, 0, -7514, -8704, -298, 223, 0);
 }
 public virtual void OnQuest(ActorPC pc, ushort questID, byte step, Quest quest)
 {
 }
Exemple #7
0
 public override void OnClicked(ActorPC pc)
 {
     SendQuestList(pc);
 }
Exemple #8
0
        public void ProcessQuest(ActorPC pc, ushort questID, byte step, Quest quest, ActorNPC npc, bool isLoot = false, bool isHunt = false, int selection = 0, bool party = false)
        {
            if (pc.Party != null && (isLoot || isHunt) && !party)
            {
                foreach (ActorPC i in pc.Party.Members)
                {
                    if (i != pc && !i.Offline && pc.MapInstanceID == i.MapInstanceID && pc.DistanceToActor(pc) < 200)
                    {
                        if (i.Quests.TryGetValue(questID, out Quest q))
                        {
                            ProcessQuest(i, questID, step, q, npc, isLoot, isHunt, selection, true);
                        }
                    }
                }
            }
            if (items.ContainsKey(questID))
            {
                QuestDetail detail = items[questID];
                if (pc.Quests.ContainsKey(questID) && detail.Steps.ContainsKey(pc.Quests[questID].NextStep))
                {
                    QuestStep s     = detail.Steps[pc.Quests[questID].NextStep];
                    byte      index = 0;
                    foreach (QuestTarget t in s.Targets)
                    {
                        if (((t.TargetType == StepTargetType.NPC && !isLoot) || (isLoot && t.TargetType == StepTargetType.Loot)) && t.TargetIDs.Contains(npc.NpcID))
                        {
                            if (s.DropItem > 0 && !isHunt && !isLoot)
                            {
                                if (pc.HoldingItem != null && s.DropItem == pc.HoldingItem.ObjectID)
                                {
                                    HoldItemCancel(pc, s.DropItem);
                                }
                                else
                                {
                                    continue;
                                }
                            }
                            if (quest == null)
                            {
                                quest = new Quest()
                                {
                                    QuestID = questID
                                };
                                if (pc.Quests.ContainsKey(questID))
                                {
                                    return;
                                }
                                else
                                {
                                    pc.Quests[questID] = quest;
                                }
                            }
                            bool finished = ProcessTarget(pc, quest, s, t, t.SpecifyIndex >= 0 ? t.SpecifyIndex : index);

                            if (finished)
                            {
                                ProcessQuestSub(pc, quest, s, detail, selection);
                            }
                            else
                            {
                                UpdateQuest(pc, quest);
                            }

                            QuestArgument arg = new QuestArgument()
                            {
                                Player    = pc,
                                OriginNPC = npc.NpcID,
                                Quest     = quest,
                                Step      = quest.Step
                            };
                            pc.Client().Map.SendEventToAllActorsWhoCanSeeActor(MapEvents.QUEST_UPDATE, arg, pc, false);
                        }
                        index++;
                    }
                }
            }
        }
Exemple #9
0
        public void ProcessQuest(ActorPC pc, ActorMapObj obj)
        {
            ulong objID = obj.ToULong();

            if (mapObjectMapping.ContainsKey(objID))
            {
                foreach (uint questID in mapObjectMapping[objID].Keys)
                {
                    if (items.ContainsKey(questID))
                    {
                        QuestDetail detail = items[questID];
                        byte        step   = mapObjectMapping[objID][questID];
                        Quest       quest;
                        if (detail.Steps.ContainsKey(step))
                        {
                            QuestStep s     = detail.Steps[step];
                            byte      index = 0;
                            foreach (QuestTarget t in s.Targets)
                            {
                                if (t.TargetType == StepTargetType.MapObject && t.TargetIDs.Contains(obj.ObjectID) && t.TargetMapID == obj.MapID)
                                {
                                    if (s.DropItem > 0)
                                    {
                                        if (pc.HoldingItem != null && s.DropItem == pc.HoldingItem.ObjectID)
                                        {
                                            HoldItemCancel(pc, s.DropItem);
                                        }
                                        else
                                        {
                                            continue;
                                        }
                                    }

                                    if (pc.Quests.ContainsKey((ushort)questID))
                                    {
                                        quest = pc.Quests[(ushort)questID];
                                    }
                                    else
                                    {
                                        continue;
                                    }

                                    bool finished = ProcessTarget(pc, quest, s, t, t.SpecifyIndex >= 0 ? t.SpecifyIndex : index);
                                    if (finished)
                                    {
                                        ProcessQuestSub(pc, quest, s, detail, 0);
                                    }
                                    else
                                    {
                                        UpdateQuest(pc, quest);
                                    }

                                    QuestArgument arg = new QuestArgument()
                                    {
                                        Player = pc,
                                        Quest  = quest,
                                        Step   = quest.Step
                                    };
                                    pc.Client().Map.SendEventToAllActorsWhoCanSeeActor(MapEvents.QUEST_UPDATE, arg, pc, false);
                                }
                                index++;
                            }
                        }
                    }
                }
            }
        }
Exemple #10
0
 public void OnSelectButton(ActorPC sActor, int button)
 {
 }
Exemple #11
0
        private bool ProcessTarget(ActorPC pc, Quest quest, QuestStep s, QuestTarget t, int index)
        {
            bool finished = false;

            if (t.TargetFlagIncrement > 0)
            {
                quest.Step = (byte)(quest.NextStep + index);
                bool shoudUpdate = true;

                quest.Count[index]++;
                if (quest.Count[index] >= t.TargetCount)
                {
                    if (quest.Count[index] == t.TargetCount)
                    {
                        switch (t.TargetFinishFlagIndex)
                        {
                        case 1:
                            quest.Flag1 += t.TargetFinishFlagIncrement;
                            break;

                        case 2:
                            quest.Flag2 += t.TargetFinishFlagIncrement;
                            break;

                        case 3:
                            quest.Flag3 += t.TargetFinishFlagIncrement;
                            break;
                        }
                    }
                    else
                    {
                        quest.Count[index]--;
                        shoudUpdate = false;
                    }
                }
                if (shoudUpdate)
                {
                    switch (t.TargetFlagIndex)
                    {
                    case 1:
                        quest.Flag1 += t.TargetFlagIncrement;
                        if (quest.Flag1 == s.Flag1)
                        {
                            finished = true;
                        }

                        break;

                    case 2:
                        quest.Flag2 += t.TargetFlagIncrement;
                        if (quest.Flag2 == s.Flag2)
                        {
                            finished = true;
                        }

                        break;

                    case 3:
                        quest.Flag3 += t.TargetFlagIncrement;
                        if (quest.Flag3 == s.Flag3)
                        {
                            finished = true;
                        }

                        break;
                    }
                }
            }
            else
            {
                finished = true;
            }

            return(finished);
        }
Exemple #12
0
 public void OnActorSelection(ActorPC sActor, MapEventArgs args)
 {
 }
Exemple #13
0
 public void OnTradeStart(ActorPC sActor)
 {
 }
Exemple #14
0
 public void OnPartyAccept(ActorPC sActor)
 {
 }
 protected void ProcessQuest(ActorPC pc, byte step, Quest q)
 {
     Quests.QuestManager.Instance.ProcessQuest(pc, q.QuestID, step, q, NPC);
 }
Exemple #16
0
        private void ProcessQuestSub(ActorPC pc, Quest quest, QuestStep s, QuestDetail detail, int selection = 0)
        {
            if (pc.EventHandler == null)
            {
                return;
            }

            if (s.NextStep > 0 || s.Finish)
            {
                quest.Step = s.StepID;
                if (!s.Finish)
                {
                    quest.StepStatus = s.StepStatus;
                    quest.NextStep   = s.NextStep;
                    quest.Flag1      = s.Flag1;
                    quest.Flag2      = s.Flag2;
                    quest.Flag3      = s.Flag3;
                    UpdateQuest(pc, quest);
                }
                else
                {
                    FinishQuest(pc, quest);
                }
            }
            for (int i = 0; i < quest.Count.Length; i++)
            {
                quest.Count[i] = 0;
            }
            if (s.HoldItem != 0)
            {
                HoldItem(pc, s.HoldItem);
            }

            foreach (uint i in s.TakeItems[pc.Job].Keys)
            {
                ushort count = s.TakeItems[pc.Job][i];
                pc.Client().RemoveItem(i, count);
            }
            foreach (uint i in s.TakeItems[Job.None].Keys)
            {
                ushort count = s.TakeItems[Job.None][i];
                pc.Client().RemoveItem(i, count);
            }
            foreach (uint i in s.GiveItems[pc.Job].Keys)
            {
                ((ActorEventHandlers.PCEventHandler)pc.EventHandler).Client.AddItem(i, s.GiveItems[pc.Job][i]);
            }
            foreach (uint i in s.GiveItems[Job.None].Keys)
            {
                ((ActorEventHandlers.PCEventHandler)pc.EventHandler).Client.AddItem(i, s.GiveItems[Job.None][i]);
            }
            foreach (uint i in s.LearnSkills[pc.Job])
            {
                SkillManager.Instance.PlayerAddSkill(pc, i, true);
            }
            foreach (uint i in s.LearnSkills[Job.None])
            {
                ((ActorEventHandlers.PCEventHandler)pc.EventHandler).Client.SendSkillAdd(i);
                pc.Skills[i] = new Skill(SkillFactory.Instance[i]);
            }
            Map.Map map = MapManager.Instance.GetMap(pc.MapInstanceID);
            foreach (NPC.SpawnData i in s.Spawns)
            {
                Scripting.Utils.SpawnNPC(map, i.NpcID, i.AppearEffect, i.X, i.Y, i.Z, i.Dir, i.Motion);
            }
            {
                Dictionary <uint, int> rewardOptions = new Dictionary <uint, int>();

                if (s.RewardOptions[pc.Job].Count > 0)
                {
                    rewardOptions = s.RewardOptions[pc.Job];
                }
                else
                {
                    rewardOptions = s.RewardOptions[Job.None];
                }

                if (rewardOptions.Count > 0)
                {
                    if (selection < rewardOptions.Count)
                    {
                        KeyValuePair <uint, int> pair = rewardOptions.ToList()[selection];
                        pc.Client().AddItem(pair.Key, (ushort)pair.Value);
                    }
                }
            }
            if (s.Exp > 0)
            {
                ExperienceManager.Instance.ApplyExp(pc, s.Exp);
            }
            if (s.Gold > 0)
            {
                Interlocked.Add(ref pc.Gold, s.Gold);
                pc.Client().SendPlayerGold();
            }
            if (s.CutScene > 0)
            {
                pc.Client().SendQuestCutScene(s.CutScene);
            }
            if (s.TeleportMapID > 0)
            {
                map = MapManager.Instance.GetMap(s.TeleportMapID, pc.CharID, pc.PartyID);
                pc.MapChangeCutScene   = s.TeleportCutscene;
                pc.MapChangeCutSceneU1 = s.TeleportU1;
                pc.MapChangeCutSceneU2 = s.TeleportU2;
                if (s.X != 0 && s.Y != 0 && s.Z != 0)
                {
                    pc.Client().Map.SendActorToMap(pc, map, s.X, s.Y, s.Z);
                }
                else
                {
                    pc.Client().Map.SendActorToMap(pc, map, pc.X, pc.Y, pc.Z);
                }
            }
            if (s.Finish)
            {
                if (detail.NextQuest[pc.Job] != 0)
                {
                    NextQuest(pc, (ushort)detail.NextQuest[pc.Job]);
                }
                else if (detail.NextQuest[Job.None] != 0)
                {
                    NextQuest(pc, (ushort)detail.NextQuest[Job.None]);
                }
            }
        }
 protected void UpdateQuest(ActorPC pc, Quest quest)
 {
     ((PCEventHandler)pc.EventHandler).Client.SendQuestUpdate(quest);
 }
Exemple #18
0
 protected void UpdateQuest(ActorPC pc, Quest quest)
 {
     Network.Client.GameSession client = pc.Client();
     client?.SendQuestUpdate(quest);
 }
 protected void CutScene(ActorPC pc, uint cutscene)
 {
     ((PCEventHandler)pc.EventHandler).Client.SendQuestCutScene(cutscene);
 }
Exemple #20
0
 protected void FinishQuest(ActorPC pc, Quest quest)
 {
     Network.Client.GameSession client = pc.Client();
     client?.FinishQuest(quest);
 }
Exemple #21
0
 public void OnButton(ActorPC pc)
 {
     Warp(pc, 20, -14231.8f, -18221.53f, 9549.206f);
 }
Exemple #22
0
 protected void NextQuest(ActorPC pc, ushort next)
 {
     Network.Client.GameSession client = pc.Client();
     client?.SendNextQuest(next);
 }
Exemple #23
0
        public void OnQuest(ActorPC pc)
        {
            if (GetQuestStepStatus(pc, 276, 27601) == StepStatus.Active)
            {
                UpdateQuest(pc, 276, 27601, StepStatus.Completed);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 276);
                AddNavPoint(276, 27603, 5, 1007, 22528f, 88672f, 5120f);                 //Magnet
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }

            if (GetQuestStepStatus(pc, 276, 27603) == StepStatus.Active && CountItem(pc, 4042) > 4)
            {
                UpdateQuest(pc, 276, 27603, StepStatus.Completed);
                TakeItem(pc, 4042, 5);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 276);
                QuestCompleted(pc, 276);
                NPCSpeech(pc, 823);
                NPCChat(pc, 0);
                SetReward(pc, new rewardfunc(OnReward));
            }

            if (GetQuestStepStatus(pc, 277, 27701) == StepStatus.Active)
            {
                UpdateQuest(pc, 277, 27701, StepStatus.Completed);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 277);
                AddNavPoint(277, 27703, 5, 1007, 22528f, 88672f, 5120f);                 //Magnet
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }

            if (GetQuestStepStatus(pc, 277, 27703) == StepStatus.Active && CountItem(pc, 4043) > 3)
            {
                UpdateQuest(pc, 277, 27703, StepStatus.Completed);
                TakeItem(pc, 4043, 4);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 277);
                QuestCompleted(pc, 277);
                NPCSpeech(pc, 823);
                NPCChat(pc, 0);
                SetReward(pc, new rewardfunc(OnReward));
            }

            if (GetQuestStepStatus(pc, 278, 27801) == StepStatus.Active)
            {
                UpdateQuest(pc, 278, 27801, StepStatus.Completed);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 278);
                AddNavPoint(278, 27803, 5, 1007, 22528f, 88672f, 5120f);                 //Magnet
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }

            if (GetQuestStepStatus(pc, 278, 27803) == StepStatus.Active && CountItem(pc, 4044) > 7)
            {
                UpdateQuest(pc, 278, 27803, StepStatus.Completed);
                TakeItem(pc, 4044, 8);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 278);
                QuestCompleted(pc, 278);
                NPCSpeech(pc, 823);
                NPCChat(pc, 0);
                SetReward(pc, new rewardfunc(OnReward));
            }

            if (GetQuestStepStatus(pc, 302, 30201) == StepStatus.Active)
            {
                UpdateQuest(pc, 302, 30201, StepStatus.Completed);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 302);
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }

            if (GetQuestStepStatus(pc, 303, 30301) == StepStatus.Active)
            {
                UpdateQuest(pc, 303, 30301, StepStatus.Completed);
                GiveItem(pc, 4052, 1);
                RemoveNavPoint(pc, 303);
                SendNavPoint(pc, 303, 1008, 16287f, 94272f, 4192f);
                UpdateIcon(pc);
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }

            if (GetQuestStepStatus(pc, 305, 30502) == StepStatus.Active)
            {
                UpdateQuest(pc, 305, 30502, StepStatus.Completed);
                UpdateIcon(pc);
                RemoveNavPoint(pc, 305);
                QuestCompleted(pc, 305);
                NPCSpeech(pc, 823);
                NPCChat(pc, 0);
                SetReward(pc, new rewardfunc(OnReward));
            }

            if (GetQuestStepStatus(pc, 306, 30601) == StepStatus.Active)
            {
                UpdateQuest(pc, 306, 30601, StepStatus.Completed);
                GiveItem(pc, 4054, 1);
                SendNavPoint(pc, 306, 1008, 16287f, 94272f, 4192f);
                UpdateIcon(pc);
                NPCSpeech(pc, 232);
                NPCChat(pc, 0);
            }
        }
Exemple #24
0
 protected void HoldItemCancel(ActorPC pc, uint item)
 {
     Network.Client.GameSession client = pc.Client();
     client?.SendHoldItemCancel(item);
 }
Exemple #25
0
 public void OnButton(ActorPC pc)
 {
     NPCChat(pc, 3994);
 }
 public void OnCharCreate(SagaBNS.LobbyServer.Packets.Client.CM_CHAR_CREATE p)
 {
     createdPC           = p.Character;
     createdPC.AccountID = acc.AccountID;
     CharacterSession.Instance.CreateChar(p.Character, this);
 }
Exemple #27
0
 public void OnButton(ActorPC pc)
 {
     NPCChat(pc, 2375);
 }
 public void CharacterSave(ActorPC chara)
 {
     CharacterSave(chara, true);
 }
Exemple #29
0
 public void OnButton(ActorPC pc)
 {
     NPCChat(pc, 823);
 }
Exemple #30
0
        /// <summary>
        /// Reset skills of a PC on job change.
        /// Move all skills into Inactive Skill table and get all skills in inactive skill table for current job
        /// </summary>
        /// <param name="pc">target PC</param>
        public static void SkillResetOnJobChange(ActorPC pc)
        {
            List <uint> tmptable = new List <uint>();
            byte        job      = (byte)(pc.job - 1);

            foreach (uint i in pc.BattleSkills.Keys)
            {
                if (SkillFactory.GetSkill(i).reqjob[job] == 255 || SkillFactory.GetSkill(i).reqjob[job] == 0)
                {
                    tmptable.Add(i);
                }
            }
            foreach (uint i in tmptable)
            {
                if (!pc.InactiveSkills.ContainsKey(i))
                {
                    pc.InactiveSkills.Add(i, pc.BattleSkills[i]);
                }
                MapServer.charDB.UpdateSkill(pc, SkillType.Inactive, pc.BattleSkills[i]);
                SendDeleteSkill(pc, i);
                pc.BattleSkills.Remove(i);
            }
            tmptable.Clear();
            foreach (uint i in pc.SpecialSkills.Keys)
            {
                tmptable.Add(i);
            }
            foreach (uint i in tmptable)
            {
                if (!pc.InactiveSkills.ContainsKey(i))
                {
                    pc.InactiveSkills.Add(i, pc.SpecialSkills[i]);
                }
                MapServer.charDB.UpdateSkill(pc, SkillType.Inactive, pc.SpecialSkills[i]);
                SendDeleteSpecial(pc, i);
                SendDeleteSkill(pc, i);
                pc.SpecialSkills.Remove(i);
            }
            tmptable.Clear();
            foreach (uint i in pc.InactiveSkills.Keys)
            {
                if (SkillFactory.GetSkill(i).reqjob[job] != 255 && SkillFactory.GetSkill(i).reqjob[job] != 0)
                {
                    tmptable.Add(i);
                }
            }
            foreach (uint i in tmptable)
            {
                if (!pc.BattleSkills.ContainsKey(i))
                {
                    pc.BattleSkills.Add(i, pc.InactiveSkills[i]);
                }
                MapServer.charDB.UpdateSkill(pc, SkillType.Battle, pc.InactiveSkills[i]);
                SendAddSkill(pc, i, 0);
                pc.InactiveSkills.Remove(i);
            }
            SkillInfo info = new SkillInfo();

            switch (pc.job)
            {
            case JobType.NOVICE:
                if (!CheckSkill(pc, 1406901, 11))
                {
                    info.ID = 1406901;
                    pc.BattleSkills.Add(1406901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1406901, 0);
                }
                break;

            case JobType.SWORDMAN:
                if (!CheckSkill(pc, 1416901, 11))
                {
                    info.ID = 1416901;
                    pc.BattleSkills.Add(1416901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1416901, 0);
                }
                break;

            case JobType.RECRUIT:
                if (!CheckSkill(pc, 1426901, 11))
                {
                    info.ID = 1426901;
                    pc.BattleSkills.Add(1426901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1426901, 0);
                }
                break;

            case JobType.THIEF:
                if (!CheckSkill(pc, 1406901, 11))
                {
                    info.ID = 1406901;
                    pc.BattleSkills.Add(1406901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1406901, 0);
                }
                break;

            case JobType.ENCHANTER:
                if (!CheckSkill(pc, 1446901, 11))
                {
                    info.ID = 1446901;
                    pc.BattleSkills.Add(1446901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1446901, 0);
                }
                break;

            case JobType.CLOWN:
                if (!CheckSkill(pc, 1406901, 11))
                {
                    info.ID = 1406901;
                    pc.BattleSkills.Add(1406901, info);
                    MapServer.charDB.NewSkill(pc, SkillType.Battle, info);
                    SendAddSkill(pc, 1406901, 0);
                }
                break;
            }
            CastPassivSkill(ref pc);
        }