public override void OnPlayerEnter(GamePlayer player) { bool showText = false; if (m_dataQuest != null) { ChatUtil.SendDebugMessage(player, "Entered QuestSearchArea for DataQuest ID:" + m_dataQuest.ID + ", Step " + Step); // first check active data quests foreach (AbstractQuest quest in player.QuestList) { if (quest is DataQuest) { if ((quest as DataQuest).ID == m_dataQuest.ID && quest.Step == Step && m_popupText != string.Empty) { showText = true; } } } // next check for searches that start a dataquest if (Step == 0 && DataQuest.CheckQuestQualification(player)) { showText = true; } } else { ChatUtil.SendDebugMessage(player, "Entered QuestSearchArea for " + m_questType.Name + ", Step " + Step); // popup a dialog telling the player they should search here if (player.IsDoingQuest(m_questType) != null && player.IsDoingQuest(m_questType).Step == m_validStep && PopupText != string.Empty) { showText = true; } } if (showText) { player.Out.SendDialogBox(eDialogCode.SimpleWarning, 0, 0, 0, 0, eDialogType.Ok, true, m_popupText); } }
protected void CreateArea(DataQuest dataQuest, int validStep, int searchSeconds, string text, ushort regionId) { m_regionId = regionId; m_questType = typeof(DataQuest); m_dataQuest = dataQuest; m_validStep = validStep; m_searchSeconds = searchSeconds; m_popupText = text; DisplayMessage = false; if (WorldMgr.GetRegion(regionId) != null) { WorldMgr.GetRegion(regionId).AddArea(this); } else { string errorText = "Could not find region " + regionId + " when trying to create QuestSearchArea! "; dataQuest.LastErrorText += errorText; log.Error(errorText); } }
const ushort MAX_STORY_LENGTH = 1000; // Via trial and error, 1.108 client. // Often will cut off text around 990 but longer strings do not result in any errors. -Tolakram protected override void SendQuestWindow(GameNPC questNPC, GamePlayer player, DataQuest quest, bool offer) { using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.Dialog))) { ushort QuestID = quest.ClientQuestID; pak.WriteShort((offer) ? (byte)0x22 : (byte)0x21); // Dialog pak.WriteShort(QuestID); pak.WriteShort((ushort)questNPC.ObjectID); pak.WriteByte(0x00); // unknown pak.WriteByte(0x00); // unknown pak.WriteByte(0x00); // unknown pak.WriteByte(0x00); // unknown pak.WriteByte((offer) ? (byte)0x02 : (byte)0x01); // Accept/Decline or Finish/Not Yet pak.WriteByte(0x01); // Wrap pak.WritePascalString(quest.Name); String personalizedSummary = BehaviourUtils.GetPersonalizedMessage(quest.Description, player); if (personalizedSummary.Length > 255) { pak.WritePascalString(personalizedSummary.Substring(0, 255)); // Summary is max 255 bytes or client will crash ! } else { pak.WritePascalString(personalizedSummary); } if (offer) { String personalizedStory = BehaviourUtils.GetPersonalizedMessage(quest.Story, player); if (personalizedStory.Length > MAX_STORY_LENGTH) { pak.WriteShort(MAX_STORY_LENGTH); pak.WriteStringBytes(personalizedStory.Substring(0, MAX_STORY_LENGTH)); } else { pak.WriteShort((ushort)personalizedStory.Length); pak.WriteStringBytes(personalizedStory); } } else { if (quest.FinishText.Length > MAX_STORY_LENGTH) { pak.WriteShort(MAX_STORY_LENGTH); pak.WriteStringBytes(quest.FinishText.Substring(0, MAX_STORY_LENGTH)); } else { pak.WriteShort((ushort)quest.FinishText.Length); pak.WriteStringBytes(quest.FinishText); } } pak.WriteShort(QuestID); pak.WriteByte((byte)quest.StepTexts.Count); // #goals count foreach (string text in quest.StepTexts) { string t = text; // Need to protect for any text length > 255. It does not crash client but corrupts RewardQuest display -Tolakram if (text.Length > 253) { t = text.Substring(0, 253); } pak.WritePascalString(String.Format("{0}\r", t)); } pak.WriteInt((uint)(0)); pak.WriteByte((byte)0); pak.WriteByte((byte)quest.FinalRewards.Count); foreach (ItemTemplate reward in quest.FinalRewards) { WriteItemData(pak, GameInventoryItem.Create <ItemTemplate>(reward)); } pak.WriteByte((byte)quest.NumOptionalRewardsChoice); pak.WriteByte((byte)quest.OptionalRewards.Count); foreach (ItemTemplate reward in quest.OptionalRewards) { WriteItemData(pak, GameInventoryItem.Create <ItemTemplate>(reward)); } SendTCP(pak); } }
public override void SendQuestRewardWindow(GameNPC questNPC, GamePlayer player, DataQuest quest) { SendQuestWindow(questNPC, player, quest, false); }
public override void SendQuestOfferWindow(GameNPC questNPC, GamePlayer player, DataQuest quest) { SendQuestWindow(questNPC, player, quest, true); }
public void SendQuestRewardWindow(GameNPC questNPC, GamePlayer player, DataQuest quest) { }
public void SendQuestOfferWindow(GameNPC questNPC, GamePlayer player, DataQuest quest) { }
public override void Initialize() { base.Initialize(); master_quest = new MasterQuest(); master_quest.Load(m_taMasterQuest); master_item = new MasterItem(); master_item.Load(m_taMasterItem); master_chara = new MasterChara(); master_chara.Load(m_taMasterChara); data_quest = new DataQuest(); data_quest.SetSaveFilename("data/data_quest"); if (data_quest.Load() == false) { Debug.Log("loaderror.data_quest"); } data_item_consume = new DataItem(); data_item_consume.SetSaveFilename("data/data_item_consume"); if (data_item_consume.Load() == false) { DataItemParam item = new DataItemParam { item_id = 1 }; data_item_consume.AddItem(item); DataItemParam item2 = new DataItemParam { item_id = 1 }; data_item_consume.AddItem(item2); Debug.Log("loaderror.data_item_consume"); } data_item_equip = new DataItem(); data_item_equip.SetSaveFilename("data/data_item_equip"); if (data_item_equip.Load() == false) { Debug.Log("loaderror.data_item_equip"); } data_chara = new DataChara(); data_chara.SetSaveFilename("data/data_chara"); if (data_chara.Load() == false) { DataCharaParam slime = new DataCharaParam { chara_id = 1, position = 1 }; slime.Build(1, master_chara.list.Find(p => p.chara_id == 1)); data_chara.list.Add(slime); DataCharaParam fairy = new DataCharaParam { chara_id = 3, position = 2 }; fairy.Build(1, master_chara.list.Find(p => p.chara_id == 3)); data_chara.list.Add(fairy); } gold = 100; Initialized = true; }
/// <summary> /// Search area for data quests. Z is not checked, user must specify radius and time in data quest /// </summary> /// <param name="dataQuest"></param> /// <param name="validStep"></param> /// <param name="text"></param> /// <param name="regionId"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="radius"></param> /// <param name="searchSeconds"></param> public QuestSearchArea(DataQuest dataQuest, int validStep, string text, ushort regionId, int x, int y, int radius = DEFAULT_SEARCH_RADIUS, int searchSeconds = DEFAULT_SEARCH_SECONDS) : base(text, x, y, 0, radius) { CreateArea(dataQuest, validStep, searchSeconds, text, regionId); }
/// <summary> /// Search area for data quests. Z is not checked, user must specify radius and time in data quest /// </summary> /// <param name="dataQuest"></param> /// <param name="validStep"></param> /// <param name="text"></param> /// <param name="regionId"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="radius"></param> /// <param name="searchSeconds"></param> public QuestSearchArea(DataQuest dataQuest, int validStep, string text, ushort regionId, int x, int y, int radius = DefaultSearchRadius, int searchSeconds = DefaultSearchSeconds) : base(text, x, y, 0, radius) { CreateArea(dataQuest, validStep, searchSeconds, text, regionId); }