Пример #1
0
        /// <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));
                    }
                }
            }
        }
Пример #2
0
		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);
			}
		}
Пример #3
0
		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);
			}
		}
Пример #4
0
		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);
		}
Пример #5
0
 /// <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
 }
Пример #6
0
		/// <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
		}
Пример #7
0
		/// <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;
		}
Пример #8
0
		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);
			}
		}
Пример #9
0
		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++;
					}
				}
			}
		}
Пример #10
0
		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++;
				}
			}
		}
Пример #11
0
        /// <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);
            }
        }
Пример #12
0
        /// <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;
        }
Пример #13
0
		public void SendQuestUpdate(AbstractQuest quest) { }
Пример #14
0
		public void SendQuestUpdate(AbstractQuest quest)
		{
			if (SendQuestUpdateMethod != null) SendQuestUpdateMethod(this, quest);
		}