public void OnPartyInvite(ActorPC sActor) { }
public override void OnClicked(ActorPC pc) { OpenMailBox(pc); }
public override void OnQuest(ActorPC pc, ushort questID, byte step, Quest quest) { }
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) { }
public override void OnClicked(ActorPC pc) { SendQuestList(pc); }
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++; } } } }
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++; } } } } } }
public void OnSelectButton(ActorPC sActor, int button) { }
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); }
public void OnActorSelection(ActorPC sActor, MapEventArgs args) { }
public void OnTradeStart(ActorPC sActor) { }
public void OnPartyAccept(ActorPC sActor) { }
protected void ProcessQuest(ActorPC pc, byte step, Quest q) { Quests.QuestManager.Instance.ProcessQuest(pc, q.QuestID, step, q, NPC); }
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); }
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); }
protected void FinishQuest(ActorPC pc, Quest quest) { Network.Client.GameSession client = pc.Client(); client?.FinishQuest(quest); }
public void OnButton(ActorPC pc) { Warp(pc, 20, -14231.8f, -18221.53f, 9549.206f); }
protected void NextQuest(ActorPC pc, ushort next) { Network.Client.GameSession client = pc.Client(); client?.SendNextQuest(next); }
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); } }
protected void HoldItemCancel(ActorPC pc, uint item) { Network.Client.GameSession client = pc.Client(); client?.SendHoldItemCancel(item); }
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); }
public void OnButton(ActorPC pc) { NPCChat(pc, 2375); }
public void CharacterSave(ActorPC chara) { CharacterSave(chara, true); }
public void OnButton(ActorPC pc) { NPCChat(pc, 823); }
/// <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); }