private MessageDataFiller DynelFiller(StaticDynel dynel)
        {
            return(x =>
            {
                try
                {
                    x.Coordinate = new Vector3(dynel.Coordinate.x, dynel.Coordinate.y, dynel.Coordinate.z);
                    x.Heading = new Quaternion()
                    {
                        X = dynel.Heading.X,
                        Y = dynel.Heading.Y,
                        Z = dynel.Heading.Z,
                        W = dynel.Heading.W
                    };

                    x.Identity = dynel.Identity;
                    x.Owner = Identity.None;
                    x.Playfield = dynel.Parent.Instance;
                    x.Unknown1 = new Identity()
                    {
                        Type = (IdentityType)1000015, Instance = 0
                    };
                    x.Unknown2 = 0;
                    x.Unknown3 = 111;
                    x.MsgVersion = 0xb;
                    x.Unknown = 0;
                    List <GameTuple <CharacterStat, UInt32> > temp = new List <GameTuple <CharacterStat, uint> >();
                    foreach (KeyValuePair <int, int> stat in dynel.Stats)
                    {
                        temp.Add(
                            new GameTuple <CharacterStat, uint>()
                        {
                            Value1 = (CharacterStat)stat.Key,
                            Value2 = (uint)stat.Value
                        });
                    }
                    x.Stats = temp.ToArray();
                    x.Name = "";
                }
                catch (Exception e)
                {
                    LogUtil.Debug(DebugInfoDetail.Error, e.Message + e.StackTrace);
                }
            });
        }
예제 #2
0
        private void LoadStaticDynels(Identity playfieldIdentity)
        {
            IEnumerable <DBStaticDynel> dynels =
                StaticDynelDao.Instance.GetWhere(new { Playfield = playfieldIdentity.Instance });

            foreach (DBStaticDynel sd in dynels)
            {
                List <GameTuple <CharacterStat, uint> > tempStats =
                    MessagePackZip.DeserializeData <GameTuple <CharacterStat, uint> >(sd.stats.ToArray());

                if (tempStats.Any(x => x.Value1 == (CharacterStat)StatIds.acgitemtemplateid))
                {
                    int         id  = (int)tempStats.First(x => x.Value1 == (CharacterStat)StatIds.acgitemtemplateid).Value2;
                    StaticDynel sdy = new StaticDynel(
                        this.Identity,
                        new Identity()
                    {
                        Type = (IdentityType)sd.Type, Instance = sd.Instance
                    },
                        ItemLoader.ItemList[id]);

                    foreach (GameTuple <CharacterStat, uint> stat in tempStats)
                    {
                        if (sdy.Stats.ContainsKey((int)stat.Value1))
                        {
                            sdy.Stats[(int)stat.Value1] = (int)stat.Value2;
                            continue;
                        }
                        sdy.Stats.Add((int)stat.Value1, (int)stat.Value2);
                    }

                    sdy.Coordinate = new Coordinate(sd.X, sd.Y, sd.Z);
                    sdy.Heading    = new Quaternion()
                    {
                        X = sd.HeadingX,
                        Y = sd.HeadingY,
                        Z = sd.HeadingZ,
                        W = sd.HeadingW
                    };
                }
            }
        }
        /// <summary>
        /// </summary>
        /// <param name="character">
        /// </param>
        /// <param name="target">
        /// </param>
        /// <param name="args">
        /// </param>
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            List <MessageBody> replies = new List <MessageBody>();
            string             reply   = "Looking up for statel in playfield " + character.Playfield.Identity.Instance;

            replies.Add(ChatTextMessageHandler.Default.Create(character, reply));
            StatelData  o              = null;
            StaticDynel o2             = null;
            Vendor      o3             = null;
            Coordinate  tempCoordinate = character.Coordinates();

            if (!PlayfieldLoader.PFData.ContainsKey(character.Playfield.Identity.Instance))
            {
                reply = "Could not find data for playfield " + character.Playfield.Identity.Instance;
                replies.Add(ChatTextMessageHandler.Default.Create(character, reply));
            }
            else
            {
                if (target.Equals(Identity.None))
                {
                    PlayfieldData pfData = PlayfieldLoader.PFData[character.Playfield.Identity.Instance];
                    foreach (StatelData s in pfData.Statels)
                    {
                        if (o == null)
                        {
                            o = s;
                        }
                        else
                        {
                            if (Coordinate.Distance2D(tempCoordinate, s.Coord())
                                < Coordinate.Distance2D(tempCoordinate, o.Coord()))
                            {
                                o = s;
                            }
                        }
                    }

                    foreach (StaticDynel sd in Pool.Instance.GetAll <StaticDynel>(character.Playfield.Identity))
                    {
                        if (o2 == null)
                        {
                            o2 = sd;
                        }
                        else
                        {
                            if (Coordinate.Distance2D(tempCoordinate, sd.Coordinate)
                                < Coordinate.Distance2D(tempCoordinate, o2.Coordinate))
                            {
                                o2 = sd;
                            }
                        }
                    }
                }
                else
                {
                    o =
                        PlayfieldLoader.PFData[character.Playfield.Identity.Instance].Statels.FirstOrDefault(
                            x => x.Identity == target);
                    o2 =
                        Pool.Instance.GetAll <StaticDynel>(character.Playfield.Identity)
                        .FirstOrDefault(x => x.Identity == target);
                    o3 =
                        Pool.Instance.GetAll <Vendor>(character.Playfield.Identity)
                        .FirstOrDefault(x => x.Identity == target);
                }

                if ((o == null) && (o2 == null) && (o3 == null))
                {
                    replies.Add(
                        ChatTextMessageHandler.Default.Create(
                            character,
                            "No statel/static dynel on this playfield... Very odd, where exactly are you???"));
                }
                else
                {
                    if (o3 != null)
                    {
                        replies.Add(
                            ChatTextMessageHandler.Default.Create(
                                character,
                                o3.Identity.Type.ToString() + " " + ((int)o3.Identity.Type).ToString("X8") + ":"
                                + o3.Identity.Instance.ToString("X8")));
                        replies.Add(
                            ChatTextMessageHandler.Default.Create(character, "Item Template Id: " + o3.Template.ID));
                        foreach (Event se in o3.Events)
                        {
                            replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString()));
                        }
                    }
                    else if (((o != null) && (o2 == null)) ||
                             ((o != null) && (Coordinate.Distance2D(tempCoordinate, o.Coord())
                                              < Coordinate.Distance2D(tempCoordinate, o2.Coordinate))))
                    {
                        replies.Add(
                            ChatTextMessageHandler.Default.Create(
                                character,
                                o.Identity.Type.ToString() + " " + ((int)o.Identity.Type).ToString("X8") + ":"
                                + o.Identity.Instance.ToString("X8")));
                        replies.Add(
                            ChatTextMessageHandler.Default.Create(character, "Item Template Id: " + o.TemplateId));
                        foreach (Event se in o.Events)
                        {
                            replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString()));
                        }
                    }
                    else
                    {
                        replies.Add(ChatTextMessageHandler.Default.Create(character, o2.Identity.ToString() + " " + o2.Identity.ToString()));
                        replies.Add(ChatTextMessageHandler.Default.Create(character, "Item template Id: " + o2.Stats[(int)StatIds.acgitemtemplateid].ToString()));
                        foreach (Event se in o2.Events)
                        {
                            replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString()));
                        }
                    }
                }
            }

            character.Playfield.Publish(Bulk.CreateIM(character.Controller.Client, replies.ToArray()));
        }
        /// <summary>
        /// </summary>
        /// <param name="message">
        /// </param>
        /// <param name="client">
        /// </param>
        /// <exception cref="NullReferenceException">
        /// </exception>
        protected override void Read(GenericCmdMessage message, IZoneClient client)
        {
            switch (message.Action)
            {
            case GenericCmdAction.Get:
                break;

            case GenericCmdAction.Drop:
                break;

            case GenericCmdAction.Use:
                if (message.Target[0].Type == IdentityType.Inventory)
                {
                    client.Controller.UseItem(message.Target[0]);

                    // Acknowledge action
                    this.Acknowledge(client.Controller.Character, message);
                }
                else
                {
                    if (Pool.Instance.Contains(message.Target[0]))
                    {
                        // TODO: Call OnUse of the targets controller
                        // Static dynels first
                        IEventHolder temp = null;
                        try
                        {
                            temp =
                                Pool.Instance.GetObject <IEventHolder>(
                                    client.Controller.Character.Playfield.Identity,
                                    message.Target[0]);
                        }
                        catch (Exception)
                        {
                        }
                        if (temp != null)
                        {
                            var entity = temp as IEntity;
                            if (entity != null)
                            {
                                Event ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnUse);
                                if (ev != null)
                                {
                                    ev.Perform(client.Controller.Character, entity);
                                    this.Acknowledge(client.Controller.Character, message);
                                }
                                else
                                {
                                    ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnTrade);
                                    if (ev != null)
                                    {
                                        ev.Perform(client.Controller.Character, entity);

                                        TemporaryBag tempBag = new TemporaryBag(
                                            client.Controller.Character.Identity,
                                            new Identity()
                                        {
                                            Type     = IdentityType.TempBag,
                                            Instance =
                                                Pool.Instance.GetFreeInstance <TemporaryBag>(
                                                    0,
                                                    IdentityType.TempBag)
                                        },
                                            client.Controller.Character.Identity,
                                            message.Target[0]);
                                        client.Controller.Character.ShoppingBag = tempBag;
                                        TradeMessageHandler.Default.Send(client.Controller.Character, tempBag);
                                        this.Acknowledge(client.Controller.Character, message);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        // Use statel (doors, grid terminals etc)
#if DEBUG
                        string s = string.Format(
                            "Generic Command received:\r\nAction: {0} ({1}){2}Target: {3} {4}",
                            message.Action,
                            (int)message.Action,
                            Environment.NewLine,
                            message.Target[0].Type,
                            message.Target[0].ToString(true));
                        ChatTextMessageHandler.Default.Send(client.Controller.Character, s);
#endif
                        client.Controller.UseStatel(message.Target[0]);
                    }
                }

                break;

            case GenericCmdAction.UseItemOnItem:
                IItem item =
                    Pool.Instance.GetObject <IInventoryPage>(
                        new Identity()
                {
                    Type     = (IdentityType)client.Controller.Character.Identity.Instance,
                    Instance = (int)message.Target[0].Type
                })[message.Target[0].Instance];
                client.Controller.Character.Stats[StatIds.secondaryitemtemplate].Value = item.LowID;
                //client.Controller.Character.Stats[StatIds.secondaryitemtype]
                if (Pool.Instance.Contains(message.Target[1]))
                {
                    StaticDynel temp =
                        Pool.Instance.GetObject <StaticDynel>(
                            client.Controller.Character.Playfield.Identity,
                            message.Target[1]);
                    if (temp != null)
                    {
                        Event ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnUseItemOn);
                        if (ev != null)
                        {
                            ev.Perform(client.Controller.Character, temp);
                        }
                    }
                }
                else
                {
                    client.Controller.UseStatel(message.Target[1], EventType.OnUseItemOn);
                }
                break;
            }
        }
 public void Send(ICharacter character, StaticDynel dynel)
 {
     this.Send(character, this.DynelFiller(dynel));
 }