/// <summary> /// This method is called by the BaseQuest whenever a event associated with the Quest accurs /// or a automatically added eventhandler for the trigers fires /// </summary> /// <param name="e">DolEvent of notify call</param> /// <param name="sender">Sender of notify call</param> /// <param name="args">EventArgs of notify call</param> public override void Notify(DOLEvent e, object sender, EventArgs args) { GamePlayer player = BehaviourUtils.GuessGamePlayerFromNotify(e, sender, args); if (player == null) { //if (Log.IsDebugEnabled) // Log.Debug("Couldn't guess player for EventArgs " + args + ". Triggers with this eventargs type won't work within quests."); return; } AbstractQuest quest = player.IsDoingQuest(QuestType); int executions = 0; if (quest != null && quest.GetCustomProperty(this.ID + "_" + NUMBER_OF_EXECUTIONS) != null) { executions = Convert.ToInt32(quest.GetCustomProperty(ID + "_" + NUMBER_OF_EXECUTIONS)); } if (MaxNumberOfExecutions < 0 || executions < this.MaxNumberOfExecutions) { if (CheckTriggers(e, sender, args) && CheckRequirements(e, sender, args) && Actions != null) { foreach (IBehaviourAction action in Actions) { action.Perform(e, sender, args); } if (quest != null) { quest.SetCustomProperty(this.ID + "_" + NUMBER_OF_EXECUTIONS, Convert.ToString(executions + 1)); } } } }
protected override void SendQuestPacket(AbstractQuest quest, int index) { using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.QuestEntry))) { pak.WriteByte((byte) index); if (quest.Step <= 0) { pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); } else { string name = quest.Name; string desc = quest.Description; if (name.Length > byte.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": name is too long for 1.71 clients ("+name.Length+") '"+name+"'"); name = name.Substring(0, byte.MaxValue); } if (desc.Length > ushort.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": description is too long for 1.71 clients ("+desc.Length+") '"+desc+"'"); desc = desc.Substring(0, ushort.MaxValue); } if (name.Length + desc.Length > 2048-10) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": name + description length is too long and would have crashed the client.\nName ("+name.Length+"): '"+name+"'\nDesc ("+desc.Length+"): '"+desc+"'"); name = name.Substring(0, 32); desc = desc.Substring(0, 2048-10 - name.Length); // all that's left } pak.WriteByte((byte)name.Length); pak.WriteShortLowEndian((ushort)desc.Length); pak.WriteByte(0); pak.WriteStringBytes(name); //Write Quest Name without trailing 0 pak.WriteStringBytes(desc); //Write Quest Description without trailing 0 } SendTCP(pak); } }
protected override void SendQuestPacket(AbstractQuest quest, int index) { using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.QuestEntry))) { pak.WriteByte((byte) index); if (quest == null) { pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); } else { string name = string.Format("{0} (Level {1})", quest.Name, quest.Level); string desc = string.Format("[Step #{0}]: {1}", quest.Step, quest.Description); if (name.Length > byte.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": name is too long for 1.68+ clients (" + name.Length + ") '" + name + "'"); name = name.Substring(0, byte.MaxValue); } if (desc.Length > byte.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": description is too long for 1.68+ clients (" + desc.Length + ") '" + desc + "'"); desc = desc.Substring(0, byte.MaxValue); } pak.WriteByte((byte)name.Length); pak.WriteShortLowEndian((ushort)desc.Length); pak.WriteByte(0); // Quest Zone ID ? pak.WriteByte(0); pak.WriteStringBytes(name); //Write Quest Name without trailing 0 pak.WriteStringBytes(desc); //Write Quest Description without trailing 0 } SendTCP(pak); } }
protected override void SendQuestPacket(AbstractQuest q, int index) { if (q == null || !(q is RewardQuest)) { base.SendQuestPacket(q, index); return; } RewardQuest quest = q as RewardQuest; GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.QuestEntry)); pak.WriteByte((byte)index); pak.WriteByte((byte)quest.Name.Length); pak.WriteShort(0x00); // unknown pak.WriteByte((byte)quest.Goals.Count); pak.WriteByte((byte)quest.Level); pak.WriteStringBytes(quest.Name); pak.WritePascalString(quest.Description); foreach (RewardQuest.QuestGoal goal in quest.Goals) { String goalDesc = String.Format("{0}\r", goal.Description); pak.WriteShortLowEndian((ushort)goalDesc.Length); pak.WriteStringBytes(goalDesc); pak.WriteShortLowEndian((ushort)goal.ZoneID2); pak.WriteShortLowEndian((ushort)goal.XOffset2); pak.WriteShortLowEndian((ushort)goal.YOffset2); pak.WriteShortLowEndian(0x00); // unknown pak.WriteShortLowEndian((ushort)goal.Type); pak.WriteShortLowEndian(0x00); // unknown pak.WriteShortLowEndian((ushort)goal.ZoneID1); pak.WriteShortLowEndian((ushort)goal.XOffset1); pak.WriteShortLowEndian((ushort)goal.YOffset1); pak.WriteByte((byte)((goal.IsAchieved) ? 0x01 : 0x00)); if (goal.QuestItem == null) pak.WriteByte(0x00); else { pak.WriteByte(0x01); WriteTemplateData(pak, goal.QuestItem, 1); } } SendTCP(pak); }
/// <summary> /// Is this player doing this quest /// </summary> /// <param name="p"></param> /// <returns></returns> public virtual bool IsDoingQuest(AbstractQuest checkQuest) { return(Step != -1); // by default a simple check of this quest step }
/// <summary> /// Is this player doing this quest /// </summary> /// <param name="p"></param> /// <returns></returns> public virtual bool IsDoingQuest(AbstractQuest checkQuest) { return Step != -1; // by default a simple check of this quest step }
/// <summary> /// Is the player currently doing this quest /// </summary> /// <param name="p"></param> /// <returns></returns> public override bool IsDoingQuest(AbstractQuest checkQuest) { if (checkQuest is DataQuest && (checkQuest as DataQuest).ID == ID) { return Step > 0; } return false; }
protected override void SendQuestPacket(AbstractQuest quest, int index) { using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.QuestEntry))) { pak.WriteByte((byte)index); if (quest.Step <= 0) { pak.WriteByte(0); pak.WriteByte(0); pak.WriteByte(0); } else { string name = quest.Name; string desc = quest.Description; if (name.Length > byte.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": name is too long for 1.68+ clients (" + name.Length + ") '" + name + "'"); name = name.Substring(0, byte.MaxValue); } if (desc.Length > ushort.MaxValue) { if (log.IsWarnEnabled) log.Warn(quest.GetType().ToString() + ": description is too long for 1.68+ clients (" + desc.Length + ") '" + desc + "'"); desc = desc.Substring(0, ushort.MaxValue); } pak.WriteByte((byte)name.Length); pak.WriteShort((ushort)desc.Length); pak.WriteStringBytes(name); //Write Quest Name without trailing 0 pak.WriteStringBytes(desc); //Write Quest Description without trailing 0 } SendTCP(pak); } }
public override void SendQuestUpdate(AbstractQuest quest) { int questIndex = 1; // add check for null due to LD if (m_gameClient != null && m_gameClient.Player != null && m_gameClient.Player.QuestList != null) { lock (m_gameClient.Player.QuestList) { foreach (AbstractQuest q in m_gameClient.Player.QuestList) { if (q == quest) { SendQuestPacket(q, questIndex); break; } if (q.Step != -1) questIndex++; } } } }
public virtual void SendQuestUpdate(AbstractQuest quest) { int questIndex = 0; lock (m_gameClient.Player.QuestList) { foreach (AbstractQuest q in m_gameClient.Player.QuestList) { if (q == quest) { SendQuestPacket(q, questIndex); break; } if (q.Step != -1) questIndex++; } } }
/// <summary> /// A quest command like /search is completed, so do something /// </summary> /// <param name="command"></param> protected override void QuestCommandCompleted(AbstractQuest.eQuestCommand command, GamePlayer player) { if (command == eQuestCommand.Search && QuestPlayer == player) { if (StepType == eStepType.Search) { if (AdvanceQuestStep() == false) { SendMessage(QuestPlayer, "You fail to find anything!", 0, eChatType.CT_System, eChatLoc.CL_SystemWindow); } } else if (StepType == eStepType.SearchFinish) { FinishQuest(); } } if (command == eQuestCommand.SearchStart) { CheckOfferQuest(player, null); } }
/// <summary> /// Triggered from quest commands like /search /// </summary> /// <param name="player"></param> /// <param name="command"></param> /// <param name="area"></param> /// <returns></returns> public override bool Command(GamePlayer player, AbstractQuest.eQuestCommand command, AbstractArea area) { if (player == null || command == eQuestCommand.None) return false; if (command == eQuestCommand.Search) { // every active quest in the players quest list is sent this command. Respond if we have an active search if (m_numSearchAreas > 0 && player == QuestPlayer) { // see if the player is in our search area foreach (AbstractArea playerArea in player.CurrentAreas) { if (playerArea is QuestSearchArea && (playerArea as QuestSearchArea).DataQuest != null && (playerArea as QuestSearchArea).DataQuest.ID == ID) { if ((playerArea as QuestSearchArea).Step == Step) { StartQuestActionTimer(player, command, (playerArea as QuestSearchArea).SearchSeconds, "Searching ..."); return true; // only allow one active search at a time } } } } } if (command == eQuestCommand.SearchStart && area != null) { // If player can start this quest then do search action if (CheckQuestQualification(player)) { StartQuestActionTimer(player, command, (area as QuestSearchArea).SearchSeconds, "Searching ..."); return true; } } return false; }
public void SendQuestUpdate(AbstractQuest quest) { }
public void SendQuestUpdate(AbstractQuest quest) { if (SendQuestUpdateMethod != null) SendQuestUpdateMethod(this, quest); }