public NpcInfo(Creature creature, OtItems items)
        {
            this.name = creature.Name;
            this.outfit = creature.Outfit;

            this.statements = new Dictionary<string, string>();
            this.triedWords = new HashSet<string>();
            this.voices = new HashSet<NpcVoice>();

            NpcWordList.Words.Add(creature.Name.ToLower());
        }
        public void AddCreature(Creature creature)
        {
            creatures[creature.Id] = creature;

            CreatureAdded.Raise(this, new CreatureAddedEventArgs { Creature = creature });
        }
        private void ParseInitialize(InMessage message)
        {
            if (minorVersion >= 10)
                message.ReadByte(); //?

            int count = message.ReadUShort();
            for (int i = 0; i < count; i++)
            {
                var creature = new Creature(message.ReadUInt());
                creature.Type = (CreatureType)message.ReadByte();
                creature.Name = message.ReadString();

                //Trace.WriteLine(String.Format("Creature[{0}]: {1}", i, creature.Name));

                creature.Health = message.ReadByte();
                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                //Outfit
                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();
                creature.Emblem = message.ReadByte();
                creature.IsImpassable = message.ReadByte() == 0x01;

                //10.20+ includes an extra 4 bytes per creature
                //These bytes could alter the read order, but since I don't know what they are for yet, I'll read them out of the way.
                message.ReadUInt();

                //speech category?
                if (client.Version.Number >= ClientVersion.Version1036.Number)
                    message.ReadByte();

                client.BattleList.AddCreature(creature);
            }

            ParseTibiaPackets(message);
        }
        private void ParseInitialize(InMessage message)
        {
            int count = message.ReadUShort();
            for (int i = 0; i < count; i++)
            {
                var creature = new Creature(message.ReadUInt());
                creature.Type = (CreatureType)message.ReadByte();
                creature.Name = message.ReadString();

                //Trace.WriteLine(String.Format("Creature[{0}]: {1}", i, creature.Name));

                creature.Health = message.ReadByte();
                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                //Outfit
                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();
                creature.Emblem = message.ReadByte();
                creature.IsImpassable = message.ReadByte() == 0x01;

                client.BattleList.AddCreature(creature);
            }

            ParseTibiaPackets(message);
        }
        private Thing GetThing(InMessage message)
        {
            //get thing type
            var thingId = message.ReadUShort();

            if (thingId == 0x0061 || thingId == 0x0062)
            {
                //creatures
                Creature creature = null;
                if (thingId == 0x0062)
                {
                    creature = client.BattleList.GetCreature(message.ReadUInt());

                    if (creature == null)
                        throw new Exception("[GetThing] (0x0062) Can't find the creature in the battle list.");

                    creature.Health = message.ReadByte();
                }
                else if (thingId == 0x0061)
                { //creature is not known
                    client.BattleList.RemoveCreature(message.ReadUInt());

                    creature = new Creature(message.ReadUInt());
                    client.BattleList.AddCreature(creature);

                    creature.Type = (CreatureType)message.ReadByte();
                    creature.Name = message.ReadString();
                    creature.Health = message.ReadByte();
                }

                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();

                if (thingId == 0x0061) // emblem is sent only in packet type 0x61
                    creature.Emblem = message.ReadByte();

                creature.IsImpassable = message.ReadBool();

                return creature;
            }
            else if (thingId == 0x0063)
            {
                Creature creature = client.BattleList.GetCreature(message.ReadUInt());
                if (creature == null)
                    throw new Exception("[GetThing] (0x0063)  Can't find the creature in the battle list.");

                creature.TurnDirection = (Direction)message.ReadByte();
                creature.IsImpassable = message.ReadBool();

                return creature;
            }
            else
                return GetItem(message, thingId);
        }
        private Thing GetThing(InMessage message)
        {
            //get thing type
            var thingId = message.ReadUShort();

            if (thingId == 0x0061 || thingId == 0x0062)
            {
                //creatures
                Creature creature = null;
                if (thingId == 0x0062)
                {
                    creature = client.BattleList.GetCreature(message.ReadUInt());

                    if (creature == null)
                        throw new Exception("[GetThing] (0x0062) Can't find the creature in the battle list.");

                    creature.Health = message.ReadByte();
                }
                else if (thingId == 0x0061)
                { //creature is not known
                    client.BattleList.RemoveCreature(message.ReadUInt());

                    creature = new Creature(message.ReadUInt());
                    client.BattleList.AddCreature(creature);

                    creature.Type = (CreatureType)message.ReadByte();
                    creature.Name = message.ReadString();
                    creature.Health = message.ReadByte();
                }

                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();

                if (thingId == 0x0061) // emblem/guildflag is sent only in packet type 0x61
                {
                    if (client.Version.Number <= ClientVersion.Version986.Number)
                    {
                        creature.Emblem = message.ReadByte();
                    }
                    if (client.Version.Number >= ClientVersion.Version1010.Number)
                    {
                        var GuildFlag = message.ReadByte();
                    }
                }

                if (client.Version.Number >= ClientVersion.Version1010.Number)
                {
                    creature.Type = (CreatureType)message.ReadByte();
                    if (client.Version.Number >= ClientVersion.Version1036.Number)
                        message.ReadByte(); //Speech Category
                    var Mark = message.ReadByte();
                    var NumberOfPVPHelpers = message.ReadUShort();
                }

                creature.IsImpassable = message.ReadBool();

                return creature;
            }
            else if (thingId == 0x0063)
            {
                Creature creature = client.BattleList.GetCreature(message.ReadUInt());
                if (creature == null)
                    throw new Exception("[GetThing] (0x0063)  Can't find the creature in the battle list.");

                creature.TurnDirection = (Direction)message.ReadByte();
                creature.IsImpassable = message.ReadBool();

                return creature;
            }
            else
                return GetItem(message, thingId);
        }