Ejemplo n.º 1
0
        /// <summary>
        /// </summary>
        /// <param name="buffer">
        /// </param>
        /// <returns>
        /// </returns>
        public static List <StatelData> ParseStatels(byte[] buffer)
        {
            List <StatelData> statels = new List <StatelData>(500);
            MemoryStream      ms      = new MemoryStream(buffer);
            BinaryReader      br      = new BinaryReader(ms);
            int count = br.ReadInt32();

            while (count > 0)
            {
                int          bufLen = br.ReadInt32();
                byte[]       buf2   = br.ReadBytes(bufLen);
                MemoryStream ms2    = new MemoryStream(buf2);
                StatelData   sd     = StatelDataExtractor.ReadFromStream(ms2);
                ms2.Close();
                if (sd.Events.Count == 0)
                {
                    // Getting the events from the template item if no events are provided in the RDB record
                    if (ItemLoader.ItemList.ContainsKey(sd.TemplateId))
                    {
                        ItemTemplate template = ItemLoader.ItemList[sd.TemplateId];
                        if (template.Events.Count > 0)
                        {
                            sd.Events = template.Events;
                        }
                    }
                }

                statels.Add(sd);
                count--;
            }

            return(statels);
        }
Ejemplo n.º 2
0
        public static void SpawnEmptyVendorFromTemplate(StatelData statelData, IPlayfield playfield, int instance)
        {
            Identity pfIdentity = new Identity()
            {
                Type = IdentityType.Playfield, Instance = statelData.PlayfieldId
            };
            Identity freeIdentity = new Identity()
            {
                Type     = IdentityType.VendingMachine,
                Instance =
                    Pool.Instance.GetFreeInstance <Vendor>(
                        0x70000000,
                        IdentityType.VendingMachine)
            };
            Vendor v = new Vendor(pfIdentity, freeIdentity, statelData.TemplateId);

            v.OriginalIdentity = statelData.Identity;
            v.RawCoordinates   = new Vector3(statelData.X, statelData.Y, statelData.Z);
            v.Heading          = new Quaternion(
                statelData.HeadingX,
                statelData.HeadingY,
                statelData.HeadingZ,
                statelData.HeadingW);
            v.Playfield = playfield;
        }
Ejemplo n.º 3
0
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            Vendor v = Pool.Instance.GetObject <Vendor>(character.Playfield.Identity, target);

            if (v != null)
            {
                int        pfid = character.Playfield.Identity.Instance;
                StatelData sd   =
                    PlayfieldLoader.PFData[pfid].Statels.FirstOrDefault(x => x.Identity.Equals(v.OriginalIdentity));
                if (sd != null)
                {
                    int instance = (((sd.Identity.Instance) >> 16) & 0xff
                                    | (character.Playfield.Identity.Instance << 16));
                    DBVendor dbv = new DBVendor();
                    dbv.Id         = instance;
                    dbv.Playfield  = pfid;
                    dbv.X          = sd.X;
                    dbv.Y          = sd.Y;
                    dbv.Z          = sd.Z;
                    dbv.HeadingX   = sd.HeadingX;
                    dbv.HeadingY   = sd.HeadingY;
                    dbv.HeadingZ   = sd.HeadingZ;
                    dbv.HeadingW   = sd.HeadingW;
                    dbv.Name       = "New shop, please fill me";
                    dbv.TemplateId = sd.TemplateId;
                    dbv.Hash       = "";
                    VendorDao.Instance.Delete(dbv.Id);
                    VendorDao.Instance.Add(dbv, dontUseId: false);
                }
            }
        }
Ejemplo n.º 4
0
        public override bool Execute(
            INamedEntity self,
            IEntity caller,
            IInstancedEntity target,
            MessagePackObject[] arguments)
        {
            ICharacter character = (ICharacter)self;

            int statelId = (int)((uint)0xC0000000 | arguments[1].AsInt32() | (arguments[2].AsInt32() << 16));

            character.Stats[StatIds.externaldoorinstance].BaseValue      = 0;
            character.Stats[StatIds.externalplayfieldinstance].BaseValue = 0;

            if (arguments[1].AsInt32() > 0)
            {
                StatelData sd = PlayfieldLoader.PFData[arguments[1].AsInt32()].GetDoor(statelId);
                if (sd == null)
                {
                    throw new Exception(
                              "Statel " + arguments[3].AsInt32().ToString("X") + " not found? Check the rdb dammit");
                }

                Vector3 v = new Vector3(sd.X, sd.Y, sd.Z);

                Quaternion q = new Quaternion(sd.HeadingX, sd.HeadingY, sd.HeadingZ, sd.HeadingW);

                Quaternion.Normalize(q);
                Vector3 n = (Vector3)q.RotateVector3(Vector3.AxisZ);

                v.x += n.x * 2.5;
                v.z += n.z * 2.5;
                character.Playfield.Teleport(
                    (Dynel)character,
                    new Coordinate(v),
                    q,
                    new Identity()
                {
                    Type = (IdentityType)arguments[0].AsInt32(), Instance = arguments[1].AsInt32()
                });
            }

            return(true);

            self.Stats[StatIds.externalplayfieldinstance].Value = 0;
            self.Stats[StatIds.externaldoorinstance].Value      = 0;
            self.Playfield.Teleport(
                (Dynel)self,
                new Coordinate(100, 10, 100),
                ((ICharacter)self).Heading,
                new Identity()
            {
                Type = (IdentityType)arguments[0].AsInt32(), Instance = arguments[1].AsInt32()
            });
            return(true);
        }
Ejemplo n.º 5
0
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            if ((character.Stats[StatIds.externaldoorinstance].Value == 0) ||
                (character.Stats[StatIds.externalplayfieldinstance].Value == 0))
            {
                ChatTextMessageHandler.Default.Create(character, "Please enter a proxyfied playfield first.");
            }

            Coordinate    tempCoordinate = character.Coordinates();
            PlayfieldData pfData         = PlayfieldLoader.PFData[character.Playfield.Identity.Instance];
            StatelData    o = null;

            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;
                    }
                }
            }
            if (o == null)
            {
                ChatTextMessageHandler.Default.Create(
                    character,
                    "No statel on this playfield... Very odd, where exactly are you???");
            }
            else
            {
                DBTeleport tel = new DBTeleport();
                tel.playfield            = character.Stats[StatIds.externalplayfieldinstance].Value;
                tel.statelType           = 0xc748; // Door only for now
                tel.statelInstance       = character.Stats[StatIds.externaldoorinstance].BaseValue;
                tel.destinationPlayfield = o.PlayfieldId;
                tel.destinationType      = (int)o.Identity.Type;
                tel.destinationInstance  = BitConverter.ToUInt32(BitConverter.GetBytes(o.Identity.Instance), 0);

                var temp = TeleportDao.Instance.GetWhere(new { tel.playfield, tel.statelType, tel.statelInstance });
                foreach (var t in temp)
                {
                    TeleportDao.Instance.Delete(t.Id);
                }
                TeleportDao.Instance.Add(tel);
                character.Playfield.Publish(
                    ChatTextMessageHandler.Default.CreateIM(character, "Proxy saved"));
            }
        }
        public bool UseStatel(Identity identity, EventType eventType = EventType.OnUse)
        {
            if (PlayfieldLoader.PFData.ContainsKey(this.Character.Playfield.Identity.Instance))
            {
                StatelData sd =
                    PlayfieldLoader.PFData[this.Character.Playfield.Identity.Instance].Statels.FirstOrDefault(
                        x => (x.Identity.Type == identity.Type) && (x.Identity.Instance == identity.Instance));

                if (sd != null)
                {
                    this.SendChatText("Found Statel with " + sd.Events.Count + " events");
                    Event onUse = sd.Events.FirstOrDefault(x => x.EventType == eventType);
                    if (onUse != null)
                    {
                        onUse.Perform(this.Character, sd);
                    }
                }
            }
            return(true);
        }
Ejemplo n.º 7
0
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            uint       upfId = character.Stats[StatIds.externalplayfieldinstance].BaseValue;
            uint       udoor = character.Stats[StatIds.externaldoorinstance].BaseValue;
            int        pfId  = (int)upfId;
            int        door  = BitConverter.ToInt32(BitConverter.GetBytes(udoor), 0);
            StatelData sd    = PlayfieldLoader.PFData[pfId].GetDoor(door);

            if (sd == null)
            {
                LogUtil.Debug(DebugInfoDetail.Error, "No statel found");
                return;
            }
            character.Playfield.Teleport(
                (Dynel)character,
                new Coordinate(sd.X, sd.Y, sd.Z),
                character.Heading,
                new Identity()
            {
                Type = IdentityType.Playfield, Instance = pfId
            });
        }
        public override bool Execute(
            INamedEntity self,
            IEntity caller,
            IInstancedEntity target,
            MessagePackObject[] arguments)
        {
            uint externalDoorInstance = self.Stats[StatIds.externaldoorinstance].BaseValue;
            int  externalPlayfieldId  = self.Stats[StatIds.externalplayfieldinstance].Value;

            StatelData door =
                PlayfieldLoader.PFData[externalPlayfieldId].Statels.FirstOrDefault(
                    x =>
                    (uint)x.Identity.Instance == externalDoorInstance &&
                    (x.Identity.Type == IdentityType.Door /*|| x.Identity.Type==IdentityType.MissionEntrance*/));

            if (door != null)
            {
                Vector3 v = new Vector3(door.X, door.Y, door.Z);

                Quaternion q = new Quaternion(door.HeadingX, door.HeadingY, door.HeadingZ, door.HeadingW);

                Quaternion.Normalize(q);
                Vector3 n = (Vector3)q.RotateVector3(Vector3.AxisZ);

                v.x += n.x * 2.5;
                v.z += n.z * 2.5;
                self.Playfield.Teleport(
                    (Dynel)self,
                    new Coordinate(v),
                    q,
                    new Identity()
                {
                    Type = IdentityType.Playfield, Instance = externalPlayfieldId
                });
            }
            return(door != null);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// </summary>
        /// <param name="stream">
        /// </param>
        /// <returns>
        /// </returns>
        public static StatelData ReadFromStream(Stream stream)
        {
            StatelData   statel = new StatelData();
            FlatIdentity fi     = new FlatIdentity();

            fi.ReadFromStream(stream);
            statel.Identity = fi.Id;

            // Skip 4, is always 1?
            stream.ReadByte();
            stream.ReadByte();
            stream.ReadByte();
            stream.ReadByte();
            PFCoordHeading pfc = new PFCoordHeading();

            pfc.ReadFromStream(stream);

            statel.X = pfc.Coordinate.X;
            statel.Y = pfc.Coordinate.Y;
            statel.Z = pfc.Coordinate.Z;

            statel.HeadingX = pfc.Heading.X;
            statel.HeadingY = pfc.Heading.Y;
            statel.HeadingZ = pfc.Heading.Z;
            statel.HeadingW = pfc.Heading.W;

            statel.PlayfieldId = pfc.PlayfieldIdentity;

            BinaryReader br = new BinaryReader(stream);

            br.ReadInt32();
            statel.TemplateId = br.ReadInt32();
            int len2 = br.ReadInt32();

            byte[]       HighLow = br.ReadBytes(len2);
            MemoryStream ms      = new MemoryStream(HighLow);

            BinaryReader br2 = new BinaryReader(ms);

            br2.ReadBytes(8);
            int C1 = IPAddress.NetworkToHostOrder(br2.ReadInt32());

            Debug.Assert(C1 % 0x3f1 == 0, "Wrong 3f1 encountered... stop please");

            int evcount = IPAddress.NetworkToHostOrder(br2.ReadInt32());

            while (evcount > 0)
            {
                int dataType = IPAddress.NetworkToHostOrder(br2.ReadInt32());
                switch (dataType)
                {
                case 2:
                    HLFlatEvent flatEvent = new HLFlatEvent();
                    flatEvent.ReadFromStream(ms);
                    statel.Events.Add(flatEvent.ToEvents());
                    break;

                default:

                    // Console.WriteLine("DataType " + dataType + " found... stop please");
                    break;
                }

                evcount--;
            }

            return(statel);
        }
        /// <summary>
        /// </summary>
        /// <param name="fname">
        /// </param>
        /// <returns>
        /// </returns>
        public static int CacheAllPlayfieldData(string fname)
        {
            PFData = new Dictionary <int, PlayfieldData>();

            MessagePackZip.UncompressData <PlayfieldData>(fname).ForEach(x => PFData.Add(x.PlayfieldId, x));

            Console.WriteLine("Tweaking in some Statel functions");

            // Now lets do some tweaking

            foreach (PlayfieldData pfd in PFData.Values)
            {
                foreach (StatelData sd in pfd.Statels)
                {
                    bool foundproxyteleport = false;
                    int  playfieldid        = 0;
                    int  doorinstance       = 0;
                    foreach (Event ev in sd.Events)
                    {
                        foreach (Function f in ev.Functions)
                        {
                            if (f.FunctionType == (int)FunctionType.TeleportProxy)
                            {
                                foundproxyteleport = true;
                                playfieldid        = f.Arguments.Values[1].AsInt32();
                                doorinstance       =
                                    (int)
                                    ((uint)0xC0000000 | f.Arguments.Values[1].AsInt32()
                                     | (f.Arguments.Values[2].AsInt32() << 16));
                                DBTeleport teleporter =
                                    TeleportDao.Instance.GetWhere(new { statelInstance = (uint)sd.Identity.Instance })
                                    .FirstOrDefault();
                                if (teleporter != null)
                                {
                                    doorinstance          = (int)teleporter.destinationInstance;
                                    f.Arguments.Values[2] = new MessagePackObject(((doorinstance >> 16) & 0xff));
                                }
                                break;
                            }
                            if (f.FunctionType == (int)FunctionType.TeleportProxy2)
                            {
                                playfieldid  = f.Arguments.Values[1].AsInt32();
                                doorinstance =
                                    (int)
                                    ((uint)0xC0000000 | f.Arguments.Values[1].AsInt32()
                                     | (f.Arguments.Values[2].AsInt32() << 16));
                                DBTeleport teleporter =
                                    TeleportDao.Instance.GetWhere(new { statelInstance = (uint)sd.Identity.Instance })
                                    .FirstOrDefault();
                                if (teleporter != null)
                                {
                                    doorinstance          = (int)teleporter.destinationInstance;
                                    f.Arguments.Values[2] = new MessagePackObject(((doorinstance >> 16) & 0xff));
                                }
                            }
                        }
                        if (foundproxyteleport)
                        {
                            break;
                        }
                    }

                    if (ItemLoader.ItemList.ContainsKey(sd.TemplateId))
                    {
                        if (ItemLoader.ItemList[sd.TemplateId].WantsCollision() &&
                            !ItemLoader.ItemList[sd.TemplateId].StatelCollisionDisabled() &&
                            (sd.Events.All(x => x.EventType != EventType.OnCollide)) &&
                            sd.Events.Any(x => x.EventType == EventType.OnUse))
                        {
                            Event ev = sd.Events.First(x => x.EventType == EventType.OnUse).Copy();
                            ev.EventType = EventType.OnCollide;
                            sd.Events.Add(ev);
                        }
                    }

                    if (foundproxyteleport)
                    {
                        if (PFData.ContainsKey(playfieldid))
                        {
                            StatelData internalDoor = PFData[playfieldid].GetDoor(doorinstance);
                            if (internalDoor != null)
                            {
                                if (internalDoor.Events.All(x => x.EventType != EventType.OnEnter))
                                {
                                    Event ev = new Event();
                                    ev.EventType = EventType.OnEnter;
                                    ev.Functions.Add(
                                        new Function()
                                    {
                                        FunctionType = (int)FunctionType.ExitProxyPlayfield
                                    });
                                    internalDoor.Events.Add(ev);
                                }
                            }
                        }
                    }
                }
            }

            return(PFData.Count);
        }
        /// <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()));
        }
Ejemplo n.º 12
0
        /// <summary>
        /// </summary>
        /// <param name="message">
        /// </param>
        /// <param name="client">
        /// </param>
        /// <exception cref="NullReferenceException">
        /// </exception>
        public static void Read(GenericCmdMessage message, ZoneClient client)
        {
            switch (message.Action)
            {
            case GenericCmdAction.Get:
                break;

            case GenericCmdAction.Drop:
                break;

            case GenericCmdAction.Use:
                if (message.Target.Type == IdentityType.Inventory)
                {
                    Item item = null;
                    try
                    {
                        item = client.Character.BaseInventory.GetItemInContainer(
                            (int)message.Target.Type,
                            message.Target.Instance);
                    }
                    catch (Exception)
                    {
                    }

                    if (item == null)
                    {
                        throw new NullReferenceException(
                                  "No item found at " + message.Target.Type + "/" + message.Target.Instance);
                    }

                    TemplateAction.Send(client, item, (int)message.Target.Type, message.Target.Instance);

                    if (ItemLoader.ItemList[item.HighID].IsConsumable())
                    {
                        item.MultipleCount--;
                        if (item.MultipleCount == 0)
                        {
                            client.Character.BaseInventory.RemoveItem(
                                (int)message.Target.Type,
                                message.Target.Instance);

                            DeleteItem.Send(client, (int)message.Target.Type, message.Target.Instance);
                        }
                    }

                    item.PerformAction(client.Character, EventType.OnUse, message.Target.Instance);
                    Reply(message, client);
                }
                else
                {
                    string s = "Generic Command received:\r\nAction: " + message.Action.ToString() + "("
                               + ((int)message.Action).ToString() + ")\r\nTarget: " + message.Target.Type + " "
                               + ((int)message.Target.Type).ToString("X8") + ":"
                               + message.Target.Instance.ToString("X8");
                    if (PlayfieldLoader.PFData.ContainsKey(client.Character.Playfield.Identity.Instance))
                    {
                        StatelData sd =
                            PlayfieldLoader.PFData[client.Playfield.Identity.Instance].Statels.FirstOrDefault(
                                x =>
                                (x.StatelIdentity.Type == message.Target.Type) &&
                                (x.StatelIdentity.Instance == message.Target.Instance));

                        if (sd != null)
                        {
                            s = s + "\r\nFound Statel with " + sd.Events.Count + " events";
                            Events onUse = sd.Events.FirstOrDefault(x => x.EventType == (int)EventType.OnUse);
                            if (onUse != null)
                            {
                                onUse.Perform(client.Character, client.Character);
                            }
                        }
                    }

                    client.Character.Send(new ChatTextMessage()
                    {
                        Identity = client.Character.Identity, Text = s
                    });
                }

                break;
            }
        }
Ejemplo n.º 13
0
        /// <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(ChatText.Create(character, reply));
            StatelData o = null;

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

                if (o == null)
                {
                    replies.Add(
                        ChatText.Create(character, "No statel on this playfield... Very odd, where exactly are you???"));
                }
                else
                {
                    replies.Add(
                        ChatText.Create(
                            character,
                            o.StatelIdentity.Type.ToString() + " " + ((int)o.StatelIdentity.Type).ToString("X8") + ":"
                            + o.StatelIdentity.Instance.ToString("X8")));
                    replies.Add(ChatText.Create(character, "Item Template Id: " + o.TemplateId));
                    foreach (Events se in o.Events)
                    {
                        replies.Add(
                            ChatText.Create(
                                character,
                                "Event: " + se.EventType.ToString() + " # of Functions: "
                                + se.Functions.Count.ToString()));

                        foreach (Functions sf in se.Functions)
                        {
                            string Fargs = string.Empty;
                            foreach (MessagePackObject obj in sf.Arguments.Values)
                            {
                                if (Fargs.Length > 0)
                                {
                                    Fargs = Fargs + ", ";
                                }

                                Fargs = Fargs + obj.ToString();
                            }

                            replies.Add(
                                ChatText.Create(
                                    character,
                                    "    Fn: " + ((FunctionType)sf.FunctionType).ToString() + "("
                                    + sf.FunctionType.ToString() + "), # of Args: "
                                    + sf.Arguments.Values.Count.ToString()));
                            replies.Add(ChatText.Create(character, "    Args: " + Fargs));

                            foreach (Requirements sfr in sf.Requirements)
                            {
                                string req;
                                req = "Attr: " + sfr.Statnumber.ToString() + " Value: " + sfr.Value.ToString()
                                      + " Target: " + sfr.Target.ToString() + " Op: " + sfr.Operator.ToString();
                                replies.Add(ChatText.Create(character, req));
                            }
                        }
                    }
                }
            }

            character.Playfield.Publish(Bulk.CreateIM(character.Client, replies.ToArray()));
        }
Ejemplo n.º 14
0
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            var proxies = TeleportDao.Instance.GetAll();
            List <StatelData> statels   = new List <StatelData>();
            Function          lastFound = null;

            foreach (PlayfieldData pf in PlayfieldLoader.PFData.Values)
            {
                bool isProxy = false;
                foreach (StatelData sd in pf.Statels)
                {
                    lastFound = null;
                    isProxy   = false;
                    if (sd.Events.Count > 0)
                    {
                        foreach (Event e in sd.Events)
                        {
                            foreach (Function f in e.Functions)
                            {
                                if (f.FunctionType == (int)FunctionType.TeleportProxy)
                                {
                                    isProxy   = true;
                                    lastFound = f;
                                    if (f.Arguments.Values[1].AsInt32() < 0)
                                    {
                                        lastFound = null;
                                        isProxy   = false;
                                    }
                                    break;
                                }
                            }
                            if (isProxy)
                            {
                                break;
                            }
                        }
                    }
                    if (isProxy)
                    {
                        if (
                            !proxies.Any(
                                x =>
                                (x.statelType == (int)sd.Identity.Type) &&
                                (x.statelInstance == (uint)sd.Identity.Instance) &&
                                (x.playfield == sd.PlayfieldId)))
                        {
                            PlayfieldData dest = PlayfieldLoader.PFData[lastFound.Arguments.Values[1].AsInt32()];
                            if (dest.Statels.Count(x => x.Identity.Type == IdentityType.Door) == 1)
                            {
                                StatelData sddest = dest.Statels.First(x => x.Identity.Type == IdentityType.Door);
                                DBTeleport tel    = new DBTeleport();
                                tel.playfield            = sd.PlayfieldId;
                                tel.statelType           = 0xc748; // Door only for now
                                tel.statelInstance       = (uint)sd.Identity.Instance;
                                tel.destinationPlayfield = sddest.PlayfieldId;
                                tel.destinationType      = (int)sddest.Identity.Type;
                                tel.destinationInstance  = BitConverter.ToUInt32(BitConverter.GetBytes(sddest.Identity.Instance), 0);
                                var temp = TeleportDao.Instance.GetWhere(new { tel.playfield, tel.statelType, tel.statelInstance });
                                foreach (var t in temp)
                                {
                                    TeleportDao.Instance.Delete(t.Id);
                                }
                                TeleportDao.Instance.Add(tel);
                                isProxy = false;
                            }
                        }
                    }


                    if (isProxy)
                    {
                        // Check against proxies already found
                        if (
                            !proxies.Any(
                                x =>
                                (x.statelType == (int)sd.Identity.Type) &&
                                (x.statelInstance == (uint)sd.Identity.Instance) && (x.playfield == sd.PlayfieldId)))
                        {
                            PlayfieldData dest  = PlayfieldLoader.PFData[lastFound.Arguments.Values[1].AsInt32()];
                            StatelData    door1 = null;
                            if (dest.Statels.Count(x => x.Identity.Type == IdentityType.Door) > 0)
                            {
                                door1 = dest.Statels.First(x => x.Identity.Type == IdentityType.Door);
                                LogUtil.Debug(DebugInfoDetail.Error, sd.PlayfieldId + " " + sd.Identity.ToString(true));
                                character.Stats[StatIds.externaldoorinstance].BaseValue      = (uint)sd.Identity.Instance;
                                character.Stats[StatIds.externalplayfieldinstance].BaseValue = (uint)sd.PlayfieldId;
                                character.Playfield.Teleport(
                                    (Dynel)character,
                                    new Coordinate(door1.X, door1.Y + 1.0f, door1.Z),
                                    character.Heading,
                                    new Identity()
                                {
                                    Type = (IdentityType)lastFound.Arguments.Values[0].AsInt32(), Instance = door1.PlayfieldId
                                });
                                return;
                            }
                            LogUtil.Debug(DebugInfoDetail.Error, sd.PlayfieldId + " " + sd.Identity.ToString(true));
                            character.Stats[StatIds.externaldoorinstance].BaseValue      = 0;
                            character.Stats[StatIds.externalplayfieldinstance].BaseValue = 0;
                            character.Playfield.Teleport(
                                (Dynel)character,
                                new Coordinate(sd.X, sd.Y, sd.Z),
                                character.Heading,
                                new Identity()
                            {
                                Type = IdentityType.Playfield, Instance = sd.PlayfieldId
                            });
                            return;
                        }
                    }
                }
            }
        }