Ejemplo n.º 1
0
        private void ParseBuddyAdd(Internal.ByteArray message)
        {
            uint   creatureID  = message.ReadUnsignedInt();
            string name        = message.ReadString();
            string desc        = string.Empty;
            uint   icon        = 0;
            bool   notifyLogin = false;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameAdditionalVipInfo))
            {
                desc        = message.ReadString();
                icon        = message.ReadUnsignedInt();
                notifyLogin = message.ReadBoolean();
            }

            byte        status = message.ReadUnsignedByte();
            List <byte> groups;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameBuddyGroups))
            {
                int count = message.ReadUnsignedByte();
                groups = new List <byte>(count);
                for (int i = 0; i < count; i++)
                {
                    groups.Add(message.ReadUnsignedByte());
                }
            }
        }
Ejemplo n.º 2
0
        private void ParseNPCOffer(Internal.ByteArray message)
        {
            // todo, i believe tibia added extra data to detect currency

            string npcName = null;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNameOnNpcTrade))
            {
                npcName = message.ReadString();
            }

            var buyObjects  = new List <Trade.TradeObjectRef>();
            var sellObjects = new List <Trade.TradeObjectRef>();

            int listCount;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 900)
            {
                listCount = message.ReadUnsignedShort();
            }
            else
            {
                listCount = message.ReadUnsignedByte();
            }

            for (int i = 0; i < listCount; i++)
            {
                ushort objectID   = message.ReadUnsignedShort();
                ushort objectData = message.ReadUnsignedByte();

                string name      = message.ReadString();
                uint   weight    = message.ReadUnsignedInt();
                uint   buyPrice  = message.ReadUnsignedInt();
                uint   sellPrice = message.ReadUnsignedInt();

                if (buyPrice > 0)
                {
                    buyObjects.Add(new Trade.TradeObjectRef(objectID, objectData, name, buyPrice, weight));
                }

                if (sellPrice > 0)
                {
                    sellObjects.Add(new Trade.TradeObjectRef(objectID, objectData, name, sellPrice, weight));
                }
            }

            OpenTibiaUnity.GameManager.onRequestNPCTrade.Invoke(npcName, buyObjects, sellObjects);
        }
Ejemplo n.º 3
0
        private void ParseClientCheck(Internal.ByteArray message)
        {
            // TODO
            uint something = message.ReadUnsignedInt();

            message.Skip((int)something);
        }
Ejemplo n.º 4
0
        private void ParseBasicData(Internal.ByteArray message)
        {
            bool premium = message.ReadBoolean();

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePremiumExpiration))
            {
                uint premiumExpiration = message.ReadUnsignedInt();
            }

            byte vocation = message.ReadUnsignedByte();

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1100)
            {
                bool hasReachedMain = message.ReadBoolean();
            }

            List <byte> spells      = new List <byte>();
            ushort      spellsCount = message.ReadUnsignedShort();

            for (int i = 0; i < spellsCount; i++)
            {
                spells.Add(message.ReadUnsignedByte());
            }

            if (Player)
            {
                //_player.PremiumStatus = premium;
                //_player.PremiumExpiration = premiumExpiration;
                //_player.Vocation = vocation;
                //_player.ReachedMain = hasReachedMain;
            }
        }
Ejemplo n.º 5
0
        private void ParseCreatureMarks(Internal.ByteArray message)
        {
            int length;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1035)
            {
                length = 1;
            }
            else
            {
                length = message.ReadUnsignedByte();
            }

            for (int i = 0; i < length; i++)
            {
                uint creatureId = message.ReadUnsignedInt();
                bool permenant  = message.ReadUnsignedByte() != 1;
                byte mark       = message.ReadUnsignedByte();

                var creature = CreatureStorage.GetCreature(creatureId);
                if (!!creature)
                {
                    creature.Marks.SetMark(permenant ? MarkType.Permenant : MarkType.OneSecondTemp, mark);
                    CreatureStorage.InvalidateOpponents();
                }
                else
                {
                    throw new System.Exception("ProtocolGame.ParseCreatureMarks: Unknown creature id: " + creatureId);
                }
            }
        }
Ejemplo n.º 6
0
        private void ParseOpenRewardWall(Internal.ByteArray message)
        {
            message.ReadBoolean();                                            // openedFromShrine
            message.ReadUnsignedInt();                                        // timestamp for the player to be able to take the reward (0 = able)
            message.ReadUnsignedByte();                                       // currentRewardIndex
            bool showWarningWhenCollecting = message.ReadUnsignedByte() != 0; // showWarningWhenCollecting

            if (showWarningWhenCollecting)
            {
                message.ReadString(); // warningMessage
            }

            message.ReadUnsignedInt();   // timestamp for the streak to expire (0 = won't expire until server save)
            message.ReadUnsignedShort(); // current streak
            message.ReadUnsignedShort(); // unknown
        }
Ejemplo n.º 7
0
        private void ParseMarketEnter(Internal.ByteArray message)
        {
            ulong balance;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 981)
            {
                balance = message.ReadUnsignedLong();
            }
            else
            {
                balance = message.ReadUnsignedInt();
            }

            int vocation = -1;

            if (OpenTibiaUnity.GameManager.ClientVersion < 950)
            {
                vocation = message.ReadUnsignedByte();
            }

            int offers     = message.ReadUnsignedByte();
            int depotCount = message.ReadUnsignedByte();

            for (int i = 0; i < depotCount; i++)
            {
                message.ReadUnsignedShort(); // objectId
                message.ReadUnsignedShort(); // objectCount
            }
        }
Ejemplo n.º 8
0
        private void ParseChallange(Internal.ByteArray message)
        {
            uint timestamp = message.ReadUnsignedInt();
            byte challange = message.ReadUnsignedByte();

            SendLogin(timestamp, challange);
            SetConnectionState(ConnectionState.ConnectingStage2, false);
        }
Ejemplo n.º 9
0
 private void ParsePreyPrices(Internal.ByteArray message)
 {
     message.ReadUnsignedInt(); // rerollPrice in gold
     if (OpenTibiaUnity.GameManager.ClientVersion >= 1190)
     {
         message.ReadUnsignedByte(); // unknown
         message.ReadUnsignedByte(); // selectCreatureDirectly in preyWildCards
     }
 }
Ejemplo n.º 10
0
        private void ParseMarketStatistics(Internal.ByteArray message)
        {
            int count = message.ReadUnsignedShort();

            for (int i = 0; i < count; i++)
            {
                ushort objectId    = message.ReadUnsignedShort();
                uint   objectPrice = message.ReadUnsignedInt();
            }
        }
Ejemplo n.º 11
0
        private void ParseMarketDetail(Internal.ByteArray message)
        {
            ushort objectId = message.ReadUnsignedShort();

            var last = MarketDetails.Weight;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameImbuing))
            {
                last = MarketDetails.ImbuementSlots;
            }

            Dictionary <MarketDetails, string> details = new Dictionary <MarketDetails, string>();

            for (var i = MarketDetails.First; i <= last; i++)
            {
                int strLen = message.ReadUnsignedShort();
                if (strLen == 0)
                {
                    continue;
                }

                details.Add(i, message.ReadString(strLen));
            }

            int time  = DateTime.Now.Second / 1000 * Constants.SecondsPerDay;
            int ctime = time;

            int count = message.ReadUnsignedByte();

            for (int i = 0; i < count; i++)
            {
                uint transactions = message.ReadUnsignedInt();
                uint totalPrice   = message.ReadUnsignedInt();
                uint maximumPrice = message.ReadUnsignedInt();
                uint minimumPrice = message.ReadUnsignedInt();

                ctime -= Constants.SecondsPerDay;
            }

            ctime = time;
            count = message.ReadUnsignedByte();
            for (int i = 0; i < count; i++)
            {
                uint transactions = message.ReadUnsignedInt();
                uint totalPrice   = message.ReadUnsignedInt();
                uint maximumPrice = message.ReadUnsignedInt();
                uint minimumPrice = message.ReadUnsignedInt();

                ctime -= Constants.SecondsPerDay;
            }
        }
Ejemplo n.º 12
0
        private Market.Offer ReadMarketOffer(Internal.ByteArray message, MarketOfferTypes offerType, ushort var)
        {
            uint   timestamp = message.ReadUnsignedInt();
            ushort counter   = message.ReadUnsignedShort();

            ushort objectId;

            switch (var)
            {
            case Constants.MarketRequestOwnOffers:
            case Constants.MarketRequestOwnHistory:
                objectId = message.ReadUnsignedShort();
                break;

            default:
                objectId = var;
                break;
            }

            ushort amount     = message.ReadUnsignedShort();
            uint   piecePrice = message.ReadUnsignedInt();

            MarketOfferStates state     = MarketOfferStates.Active;
            string            character = null;

            switch (var)
            {
            case Constants.MarketRequestOwnOffers:
                break;

            case Constants.MarketRequestOwnHistory:
                state = (MarketOfferStates)message.ReadUnsignedByte();
                break;

            default:
                character = message.ReadString();
                break;
            }

            return(new Market.Offer(new Market.OfferId(counter, timestamp), offerType, objectId, amount, piecePrice, character, state));
        }
Ejemplo n.º 13
0
        private void ParseDailyRewardHistory(Internal.ByteArray message)
        {
            int count = message.ReadUnsignedByte();

            for (int i = 0; i < count; i++)
            {
                var timestamp = message.ReadUnsignedInt(); // timestamp
                message.ReadUnsignedByte();                // some state (0: none, 1: active[green])
                message.ReadString();                      // description
                message.ReadUnsignedShort();               // streak
            }
        }
Ejemplo n.º 14
0
        public int Encrypt(Internal.ByteArray message, int offset = 0, int length = int.MaxValue)
        {
            length           = Math.Min(length, message.Length - offset);
            message.Position = offset + length;

            int encryptedLength = (int)(Math.Floor((length + BlockSize - 1) / (double)BlockSize) * BlockSize);

            if (encryptedLength > length)
            {
                byte[] tmp = new byte[encryptedLength - length];
                _random.NextBytes(tmp);
                message.WriteBytes(tmp);
                length = encryptedLength;
            }

            int i = offset;

            while (i < offset + length)
            {
                message.Position = i;
                uint v0    = message.ReadUnsignedInt();
                uint v1    = message.ReadUnsignedInt();
                uint delta = 0x61C88647;
                uint sum   = 0;
                for (int r = 0; r < 32; r++)
                {
                    v0  += (v1 << 4 ^ v1 >> 5) + v1 ^ sum + _key[sum & 3];
                    sum -= delta;
                    v1  += (v0 << 4 ^ v0 >> 5) + v0 ^ sum + _key[sum >> 11 & 3];
                }

                message.Position -= BlockSize;
                message.WriteUnsignedInt(v0);
                message.WriteUnsignedInt(v1);

                i += BlockSize;
            }

            return(length);
        }
Ejemplo n.º 15
0
        public int Decrypt(Internal.ByteArray message, int offset = 0, int length = int.MaxValue)
        {
            length  = Math.Min(length, message.Length - offset);
            length -= length % BlockSize;
            int i = offset;

            while (i < offset + length)
            {
                message.Position = i;
                uint v0    = message.ReadUnsignedInt();
                uint v1    = message.ReadUnsignedInt();
                uint delta = 0x61C88647;
                uint sum   = 0xC6EF3720;
                for (int r = 0; r < 32; r++)
                {
                    v1  -= (v0 << 4 ^ v0 >> 5) + v0 ^ sum + _key[sum >> 11 & 3];
                    sum += delta;
                    v0  -= (v1 << 4 ^ v1 >> 5) + v1 ^ sum + _key[sum & 3];
                }
                message.Position -= BlockSize;
                message.WriteUnsignedInt(v0);
                message.WriteUnsignedInt(v1);
                i += BlockSize;
            }

            message.Position = offset;
            int payloadLength = message.ReadUnsignedShort();
            int messageLength = payloadLength + Internal.Connection.PacketLengthSize;

            int lengthDelta = messageLength - length;

            if (lengthDelta > 0 || -lengthDelta > length)
            {
                return(0);
            }

            message.Length += lengthDelta;
            return(length);
        }
Ejemplo n.º 16
0
        private void ParseCreatureType(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            byte type       = message.ReadUnsignedByte();
            uint master     = 0;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1120 && type == (int)CreatureType.Summon)
            {
                master = message.ReadUnsignedInt();
            }

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.Type = (CreatureType)type;
                creature.SetSummonerId(master);
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureType: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 17
0
 private void ParsePlayerStates(Internal.ByteArray message)
 {
     if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStateU32))
     {
         Player.StateFlags = message.ReadUnsignedInt();
     }
     else if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStateU16))
     {
         Player.StateFlags = message.ReadUnsignedShort();
     }
     else
     {
         Player.StateFlags = message.ReadUnsignedByte();
     }
 }
Ejemplo n.º 18
0
        private void ParseCreatureUnpass(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            bool unpass     = message.ReadBoolean();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.Unpassable = unpass;
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureUnpass: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 19
0
        private void ParsePlayerHelpers(Internal.ByteArray message)
        {
            uint   creatureId = message.ReadUnsignedInt();
            ushort helpers    = message.ReadUnsignedShort();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.NumberOfPvPHelpers = helpers;
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParsePlayerHelpers: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 20
0
        private void ParseCreatureShield(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            byte partyFlag  = message.ReadUnsignedByte();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.SetPartyFlag((PartyFlag)partyFlag);
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureShield: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 21
0
        private void ParseTrappers(Internal.ByteArray message)
        {
            int n = message.ReadUnsignedByte();
            List <Creatures.Creature> trappers = new List <Creatures.Creature>();

            for (int i = 0; i < n; i++)
            {
                var creatureId = message.ReadUnsignedInt();
                var creature   = CreatureStorage.GetCreature(creatureId);
                if (creature)
                {
                    trappers.Add(creature);
                }
            }

            CreatureStorage.SetTrappers(trappers);
        }
Ejemplo n.º 22
0
        private void ParseCreatureHealth(Internal.ByteArray message)
        {
            uint creatureId    = message.ReadUnsignedInt();
            byte healthPercent = message.ReadUnsignedByte();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.SetSkill(SkillType.HealthPercent, healthPercent);
                CreatureStorage.InvalidateOpponents();
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureHealth: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 23
0
        private void ParseCreatureMark(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            byte mark       = message.ReadUnsignedByte();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.Marks.SetMark(MarkType.OneSecondTemp, mark);
                CreatureStorage.InvalidateOpponents();
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureMarks: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 24
0
        private void ParseClearTarget(Internal.ByteArray message)
        {
            uint creatureId = 0;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameAttackSeq))
            {
                creatureId = message.ReadUnsignedInt();
            }

            Creatures.Creature creature;
            if (!!(creature = CreatureStorage.AttackTarget) && (creature.Id == creatureId || creatureId == 0))
            {
                CreatureStorage.SetAttackTarget(null, false);
            }
            else if (!!(creature = CreatureStorage.FollowTarget) && (creature.Id == creatureId || creatureId == 0))
            {
                CreatureStorage.SetFollowTarget(null, false);
            }
        }
Ejemplo n.º 25
0
        private void ParseCreatureLight(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();

            byte intensity = message.ReadUnsignedByte();
            byte color     = message.ReadUnsignedByte();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.Brightness = intensity;
                creature.LightColor = Colors.ColorFrom8Bit(color);
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureLight: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 26
0
        private void ParseLoginSuccess(Internal.ByteArray message)
        {
            Player.ID = message.ReadUnsignedInt();
#if !UNITY_EDITOR
            string title = string.Format("{0} - {1}", Application.productName, Player.Name);
            OpenTibiaUnity.GameManager.SetApplicationTitle(title);
#endif

            BeatDuration = message.ReadUnsignedShort();
            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNewSpeedLaw))
            {
                Creatures.Creature.SpeedA = message.ReadDouble();
                Creatures.Creature.SpeedB = message.ReadDouble();
                Creatures.Creature.SpeedC = message.ReadDouble();
            }

            BugReportsAllowed = message.ReadBoolean();
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1054)
            {
                bool canChangePvPFrameRate = message.ReadBoolean();
            }

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1058)
            {
                bool exportPvPEnabled = message.ReadBoolean();
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameIngameStore))
            {
                string storeLink        = message.ReadString();
                ushort storePackageSize = message.ReadUnsignedShort();
            }

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1149 && OpenTibiaUnity.GameManager.BuildVersion >= 6018)
            {
                bool exivaRestrictions = message.ReadBoolean();
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameTournament))
            {
                bool tournamentActivated = message.ReadBoolean();
            }
        }
Ejemplo n.º 27
0
        private void ParseCreatureOutfit(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            var  outfit     = ReadCreatureOutfit(message);

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.Outfit = outfit;
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts))
                {
                    creature.MountOutfit = ReadMountOutfit(message, creature.MountOutfit);
                }
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureOutfit: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 28
0
        private void ParseCreatureSpeed(Internal.ByteArray message)
        {
            uint creatureId = message.ReadUnsignedInt();
            int  baseSpeed  = -1;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1059)
            {
                baseSpeed = message.ReadUnsignedShort();
            }

            int speed = message.ReadUnsignedShort();

            var creature = CreatureStorage.GetCreature(creatureId);

            if (!!creature)
            {
                creature.SetSkill(SkillType.Speed, speed, baseSpeed);
            }
            else
            {
                throw new System.Exception("ProtocolGame.ParseCreatureSpeed: Unknown creature id: " + creatureId);
            }
        }
Ejemplo n.º 29
0
        private Creatures.Creature ReadCreatureInstance(Internal.ByteArray message, int type    = -1,
                                                        UnityEngine.Vector3Int?absolutePosition = null)
        {
            if (type == -1)
            {
                type = message.ReadUnsignedShort();
            }

            if (type != AppearanceInstance.Creature && type != AppearanceInstance.OutdatedCreature && type != AppearanceInstance.UnknownCreature)
            {
                throw new System.Exception("ProtocolGame.ReadCreatureInstance: Invalid creature type");
            }

            var gameManager = OpenTibiaUnity.GameManager;

            Creatures.Creature creature;
            switch (type)
            {
            case AppearanceInstance.UnknownCreature:
            case AppearanceInstance.OutdatedCreature: {
                if (type == AppearanceInstance.UnknownCreature)
                {
                    uint         removeID = message.ReadUnsignedInt();
                    uint         newID    = message.ReadUnsignedInt();
                    CreatureType creatureType;

                    if (gameManager.ClientVersion >= 910)
                    {
                        creatureType = message.ReadEnum <CreatureType>();
                    }
                    else
                    {
                        if (newID >= Constants.PlayerStartID && newID < Constants.PlayerEndID)
                        {
                            creatureType = CreatureType.Player;
                        }
                        else if (newID >= Constants.MonsterStartID && newID < Constants.MonsterEndID)
                        {
                            creatureType = CreatureType.Monster;
                        }
                        else
                        {
                            creatureType = CreatureType.NPC;
                        }
                    }

                    if (newID == Player.ID)
                    {
                        creature = Player;
                    }
                    else
                    {
                        creature = new Creatures.Creature(newID);
                    }

                    creature = CreatureStorage.ReplaceCreature(creature, removeID);
                    if (!creature)
                    {
                        throw new System.Exception("ProtocolGame.ReadCreatureInstance: Failed to append creature.");
                    }

                    creature.Type = creatureType;
                    if (gameManager.ClientVersion >= 1120)
                    {
                        creature.SetSummonerID(creature.IsSummon ? message.ReadUnsignedInt() : 0);
                    }

                    creature.Name = message.ReadString();
                }
                else
                {
                    uint creatureId = message.ReadUnsignedInt();
                    creature = CreatureStorage.GetCreature(creatureId);
                    if (!creature)
                    {
                        throw new System.Exception("ProtocolGame.ReadCreatureInstance: Outdated creature not found.");
                    }
                }

                creature.SetSkill(SkillType.HealthPercent, message.ReadUnsignedByte());
                creature.Direction = message.ReadEnum <Direction>();
                creature.Outfit    = ReadCreatureOutfit(message, creature.Outfit);
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts))
                {
                    creature.MountOutfit = ReadMountOutfit(message, creature.MountOutfit);
                }
                creature.Brightness = message.ReadUnsignedByte();
                creature.LightColor = Colors.ColorFrom8Bit(message.ReadUnsignedByte());
                creature.SetSkill(SkillType.Speed, message.ReadUnsignedShort());
                creature.SetPKFlag(message.ReadEnum <PKFlag>());
                creature.SetPartyFlag(message.ReadEnum <PartyFlag>());

                if (gameManager.GetFeature(GameFeature.GameCreatureEmblems) && type == AppearanceInstance.UnknownCreature)
                {
                    creature.SetGuildFlag(message.ReadEnum <GuildFlag>());
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureMarks))
                {
                    creature.Type = message.ReadEnum <CreatureType>();
                    if (gameManager.ClientVersion >= 1120)
                    {
                        creature.SetSummonerID(creature.IsSummon ? message.ReadUnsignedInt() : 0);
                    }
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureIcons))
                {
                    creature.SetSpeechCategory(message.ReadEnum <SpeechCategory>());
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureMarks))
                {
                    creature.Marks.SetMark(MarkType.Permenant, message.ReadUnsignedByte());

                    if (gameManager.GetFeature(GameFeature.GameInspectionWindow))
                    {
                        message.ReadUnsignedByte();     // inspection state
                    }
                    if (gameManager.ClientVersion < 1185)
                    {
                        creature.NumberOfPvPHelpers = message.ReadUnsignedShort();
                    }
                }

                if (gameManager.ClientVersion >= 854)
                {
                    creature.Unpassable = message.ReadUnsignedByte() != 0;
                }
                else
                {
                    creature.Unpassable = true;
                }
                break;
            }

            case AppearanceInstance.Creature: {
                uint creatureId = message.ReadUnsignedInt();
                creature = CreatureStorage.GetCreature(creatureId);
                if (!creature)
                {
                    throw new System.Exception(string.Format("ProtocolGame.ReadCreatureInstance: Known creature not found ({0}).", creatureId));
                }

                creature.Direction = message.ReadEnum <Direction>();

                if (gameManager.ClientVersion >= 953)
                {
                    creature.Unpassable = message.ReadUnsignedByte() != 0;
                }
                break;
            }

            default:
                throw new System.Exception("ProtocolGame.ReadCreatureInstance: unknown creature identity type.");
            }

            if (absolutePosition.HasValue)
            {
                creature.Position = absolutePosition.Value;
            }

            CreatureStorage.MarkOpponentVisible(creature, true);
            CreatureStorage.InvalidateOpponents();
            return(creature);
        }
Ejemplo n.º 30
0
 private void ParseGameNews(Internal.ByteArray message)
 {
     // TODO (suggested structure; timestamp, boolean)
     message.ReadUnsignedInt();
     message.ReadUnsignedByte();
 }