示例#1
0
        /// <summary>Handles option selecting in gossip menu</summary>
        /// <param name="client">realm client</param>
        /// <param name="packet">packet incoming</param>
        public static void HandleGossipSelectOption(IRealmClient client, RealmPacketIn packet)
        {
            EntityId id     = packet.ReadEntityId();
            int      num    = (int)packet.ReadUInt32();
            uint     itemID = packet.ReadUInt32();
            string   extra  = string.Empty;

            if (packet.Position < packet.Length)
            {
                extra = packet.ReadCString();
            }
            Character   activeCharacter = client.ActiveCharacter;
            WorldObject worldObject     = activeCharacter.Map.GetObject(id);

            if (worldObject == null)
            {
                return;
            }
            GossipConversation gossipConversation = activeCharacter.GossipConversation;

            if (gossipConversation == null || gossipConversation.Speaker != worldObject)
            {
                return;
            }
            gossipConversation.HandleSelectedItem(itemID, extra);
        }
示例#2
0
        /// <summary>Generate the menu's text dynamically</summary>
        public override string GetText(GossipConversation convo)
        {
            string str =
                RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuText,
                                                  new object[0]) + GossipTextHelper.Newline;

            if (!GOMgr.Loaded || !NPCMgr.Loaded)
            {
                str =
                    convo.Speaker.HasUpdateAction(
                        (Func <ObjectUpdateTimer, bool>)(action => action is MapEditorMenu.PeriodicLoadMapTimer))
                        ? str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                                  RealmLangKey.EditorMapMenuStatusDataLoading, new object[0])
                        : str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                                  RealmLangKey.EditorMapMenuStatusNoData, new object[0]);
            }
            else if (!this.Editor.Map.IsSpawned)
            {
                str = !this.Editor.Map.IsSpawning
                    ? str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                              RealmLangKey.EditorMapMenuStatusNotSpawned, new object[0])
                    : str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                              RealmLangKey.EditorMapMenuStatusSpawning, new object[0]);
            }
            return(str);
        }
示例#3
0
 private static void OnLoadClicked(GossipConversation convo)
 {
     GOMgr.LoadAllLater();
     NPCMgr.LoadAllLater();
     convo.Character.SendSystemMessage(RealmLangKey.PleaseWait);
     convo.Character.AddUpdateAction(new PeriodicLoadMapTimer(convo));
 }
示例#4
0
 private static void OnLoadClicked(GossipConversation convo)
 {
     GOMgr.LoadAllLater();
     NPCMgr.LoadAllLater();
     convo.Character.SendSystemMessage(RealmLangKey.PleaseWait, new object[0]);
     convo.Character.AddUpdateAction((ObjectUpdateTimer) new MapEditorMenu.PeriodicLoadMapTimer(convo));
 }
示例#5
0
        /// <summary>
        /// Generate the menu's text dynamically
        /// </summary>
        public override string GetText(GossipConversation convo)
        {
            var text = RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuText) + GossipTextHelper.Newline;

            if (!GOMgr.Loaded || !NPCMgr.Loaded)
            {
                if (!convo.Speaker.HasUpdateAction(action => action is PeriodicLoadMapTimer))
                {
                    // already loading
                    text += RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuStatusNoData);
                }
                else
                {
                    // not loading yet
                    text += RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuStatusDataLoading);
                }
            }
            else if (!Editor.Map.IsSpawned)
            {
                if (Editor.Map.IsSpawning)
                {
                    // already spawning
                    text += RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuStatusSpawning);
                }
                else
                {
                    // not spawning yet
                    text += RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuStatusNotSpawned);
                }
            }
            return(text);
        }
示例#6
0
        /// <summary>Generate the menu's text dynamically</summary>
        public override string GetText(GossipConversation convo)
        {
            string str =
                RealmLocalizer.Instance.Translate(convo.Character.Locale, RealmLangKey.EditorMapMenuText) +
                GossipTextHelper.Newline;

            if (!GOMgr.Loaded || !NPCMgr.Loaded)
            {
                str =
                    convo.Speaker.HasUpdateAction(
                        action => action is PeriodicLoadMapTimer)
            ? str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                      RealmLangKey.EditorMapMenuStatusDataLoading)
            : str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                      RealmLangKey.EditorMapMenuStatusNoData);
            }
            else if (!Editor.Map.IsSpawned)
            {
                str = !Editor.Map.IsSpawning
          ? str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                    RealmLangKey.EditorMapMenuStatusNotSpawned)
          : str + RealmLocalizer.Instance.Translate(convo.Character.Locale,
                                                    RealmLangKey.EditorMapMenuStatusSpawning);
            }
            return(str);
        }
示例#7
0
        /// <summary>
        /// Is called whenever an object leaves this Character's sight
        /// </summary>
        public void OnOutOfRange(WorldObject obj)
        {
            obj.AreaCharCount--;
            if (obj == Asda2DuelingOponent)
            {
                if (Asda2Duel != null)
                {
                    Asda2Duel.StopPvp();
                }
            }
            if (obj == m_target)
            {
                // unset current Target
                ClearTarget();
            }

            if (obj == m_activePet)
            {
                ActivePet = null;
            }

            if (GossipConversation != null && obj == GossipConversation.Speaker && GossipConversation.Character == this)
            {
                // stop conversation with a vanished object
                GossipConversation.Dispose();
            }

            if (!(obj is Transport))
            {
                KnownObjects.Remove(obj);
            }
            var chr = obj as Character;

            if (chr != null)
            {
                if (EnemyCharacters.Contains(chr))
                {
                    EnemyCharacters.Remove(chr);
                    CheckEnemysCount();
                }
                GlobalHandler.SendCharacterDeleteResponse(chr, Client);
            }
            else
            {
                var loot = obj as Asda2Loot;
                if (loot != null)
                {
                    GlobalHandler.SendRemoveLootResponse(this, loot);
                }
            }
        }
示例#8
0
        /// <summary>
        /// Is called whenever an object leaves this Character's sight
        /// </summary>
        public void OnOutOfRange(WorldObject obj)
        {
            obj.AreaCharCount--;
            if (obj is Character && m_observers != null)
            {
                if (m_observers.Remove((Character)obj))
                {
                    // Character was observing: Now destroy items for him
                    for (var i = (InventorySlot)0; i < InventorySlot.Bag1; i++)
                    {
                        var item = m_inventory[i];
                        if (item != null)
                        {
                            item.SendDestroyToPlayer((Character)obj);
                        }
                    }
                }
            }

            if (obj == DuelOpponent && !Duel.IsActive)
            {
                // opponent vanished before Duel started: Cancel duel
                Duel.Dispose();
            }

            if (obj == m_target)
            {
                // unset current Target
                ClearTarget();
            }

            if (obj == m_activePet)
            {
                ActivePet = null;
            }

            if (GossipConversation != null && obj == GossipConversation.Speaker && GossipConversation.Character == this)
            {
                // stop conversation with a vanished object
                GossipConversation.Dispose();
            }

            if (!(obj is Transport))
            {
                KnownObjects.Remove(obj);

                // send the destroy packet
                //obj.SendDestroyToPlayer(this);
            }
        }
示例#9
0
 public override string GetText(GossipConversation convo)
 {
     return(this.SpawnPoint.ToString());
 }
示例#10
0
 public PeriodicLoadMapTimer(GossipConversation convo)
 {
     this.m_Convo  = convo;
     this.Delay    = 1000;
     this.Callback = new Action <WorldObject>(this.OnTick);
 }
示例#11
0
 public override string GetConfirmText(GossipConversation convo)
 {
     return(this.GetConfirmTextCallback(convo, (M)convo.CurrentMenu));
 }
示例#12
0
        /// <summary>Sends a page to the character</summary>
        /// <param name="chr">recieving character</param>
        /// <param name="owner">EntityID of sender</param>
        public static void SendPageToCharacter(GossipConversation convo, IList <QuestMenuItem> questItems)
        {
            WorldObject speaker     = convo.Speaker;
            Character   character   = convo.Character;
            GossipMenu  currentMenu = convo.CurrentMenu;
            IList <GossipMenuItemBase> gossipItems = currentMenu.GossipItems;
            IGossipEntry gossipEntry = currentMenu.GossipEntry;

            if (gossipEntry.IsDynamic)
            {
                QueryHandler.SendNPCTextUpdate(character, gossipEntry);
            }
            using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_GOSSIP_MESSAGE))
            {
                packet.Write(speaker.EntityId);
                packet.Write(0);
                packet.Write(gossipEntry.GossipId);
                long position = packet.Position;
                packet.Position += 4L;
                int num = 0;
                if (gossipItems != null)
                {
                    for (int index = 0; index < gossipItems.Count; ++index)
                    {
                        GossipMenuItemBase gossipMenuItemBase = gossipItems[index];
                        if (gossipMenuItemBase.Action == null || gossipMenuItemBase.Action.CanUse(convo))
                        {
                            packet.Write(index);
                            packet.Write((byte)gossipMenuItemBase.Icon);
                            packet.Write(gossipMenuItemBase.Input);
                            packet.Write((uint)gossipMenuItemBase.RequiredMoney);
                            packet.WriteCString(gossipMenuItemBase.GetText(convo));
                            packet.WriteCString(gossipMenuItemBase.GetConfirmText(convo));
                            ++num;
                        }
                    }
                }

                if (questItems != null)
                {
                    packet.WriteUInt(questItems.Count);
                    for (int index = 0; index < questItems.Count; ++index)
                    {
                        QuestMenuItem questItem = questItems[index];
                        packet.Write(questItem.ID);
                        packet.Write(questItem.Status);
                        packet.Write(questItem.Level);
                        packet.Write(0);
                        packet.Write((byte)0);
                        packet.WriteCString(questItem.Text);
                    }
                }
                else
                {
                    packet.Write(0);
                }

                packet.Position = position;
                packet.Write(num);
                character.Client.Send(packet, false);
            }
        }
示例#13
0
 public override bool CanUse(GossipConversation convo)
 {
     return(!convo.Character.Role.IsStaff);
 }
示例#14
0
 public override bool CanUse(GossipConversation convo)
 {
     return(Decider(convo));
 }
示例#15
0
        /// <summary>
        /// Sends a page to the character
        /// </summary>
        /// <param name="chr">recieving character</param>
        /// <param name="owner">EntityID of sender</param>
        public static void SendPageToCharacter(GossipConversation convo,
                                               IList <QuestMenuItem> questItems)
        {
            var speaker = convo.Speaker;
            var chr     = convo.Character;

            var menu        = convo.CurrentMenu;
            var gossipItems = menu.GossipItems;
            var gossipEntry = menu.GossipEntry;

            if (gossipEntry.IsDynamic)
            {
                // not cached
                QueryHandler.SendNPCTextUpdate(chr, gossipEntry);
            }

            using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_GOSSIP_MESSAGE))
            {
                packet.Write(speaker.EntityId);
                packet.Write(0);                                                // new Flag field since 2.4.0 - menu id
                packet.Write(gossipEntry.GossipId);

                var countPos = packet.Position;
                packet.Position += 4;
                var count = 0;
                if (gossipItems != null)
                {
                    for (var i = 0; i < gossipItems.Count; i++)
                    {
                        var item = gossipItems[i];
                        if (item.Action != null && !item.Action.CanUse(convo))
                        {
                            continue;
                        }

                        packet.Write(i);
                        packet.Write((byte)item.Icon);
                        packet.Write(item.Input);
                        packet.Write((uint)item.RequiredMoney);
                        packet.WriteCString(item.GetText(convo));
                        packet.WriteCString(item.GetConfirmText(convo));
                        count++;
                    }
                }

                if (questItems != null)
                {
                    packet.WriteUInt(questItems.Count);
                    for (int i = 0; i < questItems.Count; i++)
                    {
                        var item = questItems[i];
                        packet.Write(item.ID);
                        packet.Write(item.Status);
                        packet.Write(item.Level);
                        packet.Write(0);                     // quest flags
                        packet.Write((byte)0);               // 3.3.3 flag (blue question or yelloe exclamation mark)
                        packet.WriteCString(item.Text);
                    }
                }
                else
                {
                    packet.Write(0);
                }

                packet.Position = countPos;
                packet.Write(count);

                chr.Client.Send(packet);
            }
        }
示例#16
0
 public override bool CanUse(GossipConversation convo)
 {
     return convo.Character.Level >= m_level;
 }
示例#17
0
 public override sealed string GetText(GossipConversation convo)
 {
     return(GetTextCallback(convo, (M)convo.CurrentMenu));
 }
示例#18
0
 public override bool CanUse(GossipConversation convo)
 {
     return((long)convo.Character.Level >= (long)this.m_level);
 }
 public virtual bool CanUse(GossipConversation convo)
 {
     return(true);
 }
示例#20
0
 public override bool CanUse(GossipConversation convo)
 {
     return Decider(convo);
 }
示例#21
0
 public override bool CanUse(GossipConversation convo)
 {
     return !convo.Character.Role.IsStaff;
 }
示例#22
0
 public PeriodicLoadMapTimer(GossipConversation convo)
 {
     m_Convo  = convo;
     Delay    = 1000;
     Callback = OnTick;
 }
示例#23
0
 public override bool CanUse(GossipConversation convo)
 {
     return(convo.Character.Level >= m_level);
 }
示例#24
0
 public virtual bool CanUse(GossipConversation convo)
 {
     return true;
 }
示例#25
0
 public override string GetText(GossipConversation convo)
 {
     return("");
 }
 public void OnSelect(GossipConversation convo)
 {
     m_Handler(convo);
 }
示例#27
0
 public void OnSelect(GossipConversation convo)
 {
     m_Handler(convo);
 }