Exemplo n.º 1
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
            }
        }
Exemplo n.º 2
0
        private void ParseOpenOwnChannel(Internal.ByteArray message)
        {
            int    channelId   = message.ReadUnsignedShort();
            string channelName = message.ReadString();
            var    channel     = ChatStorage.AddChannel(channelId, channelName, MessageModeType.Channel);

            channel.CanModerate = true;

            if (channel.IsPrivate)
            {
                ChatStorage.OwnPrivateChannelId = channelId;
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameChannelPlayerList))
            {
                int joinedUsers = message.ReadUnsignedShort();
                for (int i = 0; i < joinedUsers; i++)
                {
                    channel.PlayerJoined(message.ReadString());
                }

                int invitedUsers = message.ReadUnsignedShort();
                for (int i = 0; i < invitedUsers; i++)
                {
                    channel.PlayerInvited(message.ReadString());
                }
            }
        }
Exemplo n.º 3
0
        private void ParseDeleteInContainer(Internal.ByteArray message)
        {
            byte   containerId = message.ReadUnsignedByte();
            ushort slot;

            Appearances.ObjectInstance appendObject = null;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination))
            {
                slot = message.ReadUnsignedShort();
                ushort itemId = message.ReadUnsignedShort();

                if (itemId != 0)
                {
                    appendObject = ReadObjectInstance(message, itemId);
                }
            }
            else
            {
                slot = message.ReadUnsignedByte();
            }

            var containerView = ContainerStorage.GetContainerView(containerId);

            if (!!containerView)
            {
                containerView.RemoveObject(slot, appendObject);
            }
        }
Exemplo n.º 4
0
        private void ParsePreyData(Internal.ByteArray message)
        {
            int slot  = message.ReadUnsignedByte();
            var state = message.ReadEnum <PreySlotStates>();

            switch (state)
            {
            case PreySlotStates.Locked: {
                message.ReadEnum <PreySlotUnlockType>();
                break;
            }

            case PreySlotStates.Inactive: {
                break;
            }

            case PreySlotStates.Active: {
                string monsterName   = message.ReadString();
                var    monsterOutfit = ReadCreatureOutfit(message);
                var    bonusType     = message.ReadEnum <PreyBonusTypes>();
                int    bonusValue    = message.ReadUnsignedShort();
                int    bonusGrade    = message.ReadUnsignedByte();
                int    timeLeft      = message.ReadUnsignedShort();
                break;
            }

            case PreySlotStates.Selection: {
                byte size = message.ReadUnsignedByte();
                for (int i = 0; i < size; i++)
                {
                    string monsterName   = message.ReadString();
                    var    monsterOutfit = ReadCreatureOutfit(message);
                }
                break;
            }

            case PreySlotStates.SelectionChangeMonster: {
                var  bonusType  = message.ReadEnum <PreyBonusTypes>();
                int  bonusValue = message.ReadUnsignedShort();
                int  bonusGrade = message.ReadUnsignedByte();
                byte size       = message.ReadUnsignedByte();
                for (int i = 0; i < size; i++)
                {
                    string monsterName   = message.ReadString();
                    var    monsterOutfit = ReadCreatureOutfit(message);
                }
                break;
            }

            default:
                break;
            }

            message.ReadUnsignedShort(); // timeUntilFreeListReroll
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1190)
            {
                message.ReadUnsignedByte(); // preyWildCards
            }
        }
Exemplo n.º 5
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();
            }
        }
Exemplo n.º 6
0
        private void ParsePlayerInventory(Internal.ByteArray message)
        {
            //List<KeyValuePair<ushort, ushort>> items = new List<KeyValuePair<ushort, ushort>>();
            ushort size = message.ReadUnsignedShort();

            for (int i = 0; i < size; i++)
            {
                ushort id      = message.ReadUnsignedShort();
                byte   subType = message.ReadUnsignedByte();
                ushort count   = message.ReadUnsignedShort();
            }
        }
Exemplo n.º 7
0
        private void ParseOpenContainer(Internal.ByteArray message)
        {
            byte   containerId     = message.ReadUnsignedByte();
            var    objectIcon      = ReadObjectInstance(message);
            string name            = message.ReadString();
            byte   nOfSlotsPerPage = message.ReadUnsignedByte(); // capacity of shown view
            bool   isSubContainer  = message.ReadBoolean();

            bool isDragAndDropEnabled = true;
            bool isPaginationEnabled  = false;
            int  nOfTotalObjects      = 0;
            int  indexOfFirstObject   = 0;
            int  nOfContentObjects    = 0; // objects in the current shown view //

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination))
            {
                isDragAndDropEnabled = message.ReadBoolean();
                isPaginationEnabled  = message.ReadBoolean();
                nOfTotalObjects      = message.ReadUnsignedShort();
                indexOfFirstObject   = message.ReadUnsignedShort();
                nOfContentObjects    = message.ReadUnsignedByte();

                if (nOfContentObjects > nOfSlotsPerPage)
                {
                    throw new System.Exception("ProtocolGame.ParseOpenContainer: Number of content objects " + nOfContentObjects + " exceeds number of slots per page " + nOfSlotsPerPage);
                }

                if (nOfContentObjects > nOfTotalObjects)
                {
                    throw new System.Exception("Connection.readSCONTAINER: Number of content objects " + nOfContentObjects + " exceeds number of total objects " + nOfTotalObjects);
                }
            }
            else
            {
                nOfContentObjects = message.ReadUnsignedByte();
                nOfTotalObjects   = nOfContentObjects;

                if (nOfContentObjects > nOfSlotsPerPage)
                {
                    throw new System.Exception("ProtocolGame.ParseOpenContainer: Number of content objects " + nOfContentObjects + " exceeds the capaciy " + nOfSlotsPerPage);
                }
            }

            var containerView = ContainerStorage.CreateContainerView(containerId, objectIcon, name, isSubContainer,
                                                                     isDragAndDropEnabled, isPaginationEnabled, nOfSlotsPerPage,
                                                                     nOfTotalObjects - nOfContentObjects, indexOfFirstObject);

            for (int i = 0; i < nOfContentObjects; i++)
            {
                containerView.AddObject(indexOfFirstObject + i, ReadObjectInstance(message));
            }
        }
Exemplo n.º 8
0
        private Creatures.Skill ReadSkill(Internal.ByteArray message, bool special = false)
        {
            int level;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleSkills))
            {
                level = message.ReadUnsignedShort();
            }
            else
            {
                level = message.ReadUnsignedByte();
            }

            int baseLevel;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase))
            {
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameBaseSkillU16))
                {
                    baseLevel = message.ReadUnsignedShort();
                }
                else
                {
                    baseLevel = message.ReadUnsignedByte();
                }
            }
            else
            {
                baseLevel = level;
            }

            if (!special && OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePercentSkillU16))
            {
                ushort loyaltyBonus = message.ReadUnsignedShort();
            }

            float percentage = 0.0f;

            if (!special)
            {
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePercentSkillU16))
                {
                    percentage = message.ReadUnsignedShort() / 100f;
                }
                else
                {
                    percentage = message.ReadUnsignedByte();
                }
            }

            return(new Creatures.Skill(level, baseLevel, percentage));
        }
Exemplo n.º 9
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;
            }
        }
Exemplo n.º 10
0
        private AppearanceInstance ReadCreatureOutfit(Internal.ByteArray message, AppearanceInstance instance = null)
        {
            int outfitID;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOutfitIDU16))
            {
                outfitID = message.ReadUnsignedShort();
            }
            else
            {
                outfitID = message.ReadUnsignedByte();
            }

            if (outfitID != 0)
            {
                int headColor   = message.ReadUnsignedByte();
                int torsoColor  = message.ReadUnsignedByte();
                int legsColor   = message.ReadUnsignedByte();
                int detailColor = message.ReadUnsignedByte();

                int addonsFlags = 0;
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerAddons))
                {
                    addonsFlags = message.ReadUnsignedByte();
                }

                OutfitInstance outfitInstance = instance as OutfitInstance;
                if (!!outfitInstance)
                {
                    outfitInstance.UpdateProperties(headColor, torsoColor, legsColor, detailColor, addonsFlags);
                    return(instance);
                }

                return(AppearanceStorage.CreateOutfitInstance((uint)outfitID, headColor, torsoColor, legsColor, detailColor, addonsFlags));
            }

            uint           objectID       = message.ReadUnsignedShort();
            ObjectInstance objectInstance = instance as ObjectInstance;

            if (!!objectInstance && objectInstance.ID == objectID)
            {
                return(objectInstance);
            }

            if (objectID == 0)
            {
                return(AppearanceStorage.CreateOutfitInstance(OutfitInstance.InvisibleOutfitID, 0, 0, 0, 0, 0));
            }

            return(AppearanceStorage.CreateObjectInstance(objectID, 0));
        }
Exemplo n.º 11
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);
        }
Exemplo n.º 12
0
        private void ParsePlayerGoods(Internal.ByteArray message)
        {
            long money;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 973)
            {
                money = message.ReadLong();
            }
            else
            {
                money = message.ReadInt();
            }

            var goods = new List <Container.InventoryTypeInfo>();

            int size = message.ReadUnsignedByte();

            for (int i = 0; i < size; i++)
            {
                ushort objectId = message.ReadUnsignedShort();
                int    amount   = message.ReadUnsignedByte();

                goods.Add(new Container.InventoryTypeInfo(objectId, 0, amount));
            }

            OpenTibiaUnity.ContainerStorage.PlayerGoods = goods;
            OpenTibiaUnity.ContainerStorage.PlayerMoney = money;
        }
Exemplo n.º 13
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;
            }
        }
Exemplo n.º 14
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
        }
Exemplo n.º 15
0
        private void ParseChannelEvent(Internal.ByteArray message)
        {
            int    channelId  = message.ReadUnsignedShort();
            var    channel    = ChatStorage.GetChannel(channelId);
            string playerName = message.ReadString();
            var    eventType  = message.ReadEnum <ChannelEvent>();

            switch (eventType)
            {
            case ChannelEvent.PlayerJoined:
                channel.PlayerJoined(playerName);
                break;

            case ChannelEvent.PlayerLeft:
                channel.PlayerLeft(playerName);
                break;

            case ChannelEvent.PlayerInvited:
                channel.PlayerInvited(playerName);
                break;

            case ChannelEvent.PlayerExcluded:
                channel.PlayerExcluded(playerName);
                break;

            case ChannelEvent.PlayerPending:
                channel.PlayerPending(playerName);
                break;
            }
        }
Exemplo n.º 16
0
        private void ParseCreateOnMap(Internal.ByteArray message)
        {
            var absolutePosition = message.ReadPosition();

            if (!WorldMapStorage.IsVisible(absolutePosition, true))
            {
                throw new System.Exception("ProtocolGame.ParseCreateOnMap: Co-ordinate " + absolutePosition + " is out of range.");
            }

            var mapPosition = WorldMapStorage.ToMap(absolutePosition);
            int stackPos    = 255;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 841)
            {
                stackPos = message.ReadUnsignedByte();
            }

            int typeOrId = message.ReadUnsignedShort();

            Appearances.ObjectInstance @object;
            if (typeOrId == Appearances.AppearanceInstance.Creature || typeOrId == Appearances.AppearanceInstance.OutdatedCreature || typeOrId == Appearances.AppearanceInstance.UnknownCreature)
            {
                var creature = ReadCreatureInstance(message, typeOrId, absolutePosition);
                if (creature.Id == Player.Id)
                {
                    Player.StopAutowalk(true);
                }

                @object = AppearanceStorage.CreateObjectInstance(Appearances.AppearanceInstance.Creature, creature.Id);
            }
            else
            {
                @object = ReadObjectInstance(message, typeOrId);
            }

            if (stackPos == 255)
            {
                WorldMapStorage.PutObject(mapPosition, @object);
            }
            else
            {
                if (stackPos > Constants.MapSizeW)
                {
                    throw new System.Exception("ProtocolGame.ParseCreateOnMap: Invalid stack position (" + stackPos + ").");
                }

                WorldMapStorage.InsertObject(mapPosition, stackPos, @object);
            }

            if (absolutePosition.z == MiniMapStorage.PositionZ)
            {
                WorldMapStorage.UpdateMiniMap(mapPosition);
                uint color = WorldMapStorage.GetMiniMapColour(mapPosition);
                int  cost  = WorldMapStorage.GetMiniMapCost(mapPosition);
                MiniMapStorage.UpdateField(absolutePosition, color, cost, false);
            }
        }
Exemplo n.º 17
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();
            }
        }
Exemplo n.º 18
0
        private int ReadField(Internal.ByteArray message, int x, int y, int z)
        {
            var mapPosition      = new UnityEngine.Vector3Int(x, y, z);
            var absolutePosition = WorldMapStorage.ToAbsolute(mapPosition);

            int  typeOrId;
            int  stackPos  = 0;
            bool gotEffect = false;

            while (true)
            {
                typeOrId = message.ReadUnsignedShort();
                if (typeOrId >= 65280)
                {
                    break;
                }

                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameEnvironmentEffect) && !gotEffect)
                {
                    var effectObject = AppearanceStorage.CreateEnvironmentalEffect((uint)typeOrId);
                    WorldMapStorage.SetEnvironmentalEffect(mapPosition, effectObject);
                    gotEffect = true;
                    continue;
                }

                if (typeOrId == AppearanceInstance.UnknownCreature || typeOrId == AppearanceInstance.OutdatedCreature ||
                    typeOrId == AppearanceInstance.Creature)
                {
                    var creature = ReadCreatureInstance(message, typeOrId, absolutePosition);

                    var @object = AppearanceStorage.CreateObjectInstance(AppearanceInstance.Creature, creature.ID);
                    if (stackPos < Constants.MapSizeW)
                    {
                        WorldMapStorage.AppendObject(mapPosition, @object);
                    }
                }
                else
                {
                    var @object = ReadObjectInstance(message, typeOrId);
                    if (stackPos < Constants.MapSizeW)
                    {
                        WorldMapStorage.AppendObject(mapPosition, @object);
                    }
                    else
                    {
                        throw new System.Exception("ProtocolGameUtility.ReadField: Expected creatures but received regular object.");
                    }
                }

                stackPos++;
            }

            return(typeOrId - 65280);
        }
Exemplo n.º 19
0
        private void ParseUpdateLootContainers(Internal.ByteArray message)
        {
            byte unknown = message.ReadUnsignedByte();
            int  count   = message.ReadUnsignedByte();

            for (int i = 0; i < count; i++)
            {
                var    type     = message.ReadEnum <ObjectCategory>();
                ushort objectId = message.ReadUnsignedShort();
            }
        }
Exemplo n.º 20
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));
        }
Exemplo n.º 21
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
            }
        }
Exemplo n.º 22
0
        private void ParseChannels(Internal.ByteArray message)
        {
            int count = message.ReadUnsignedByte();
            List <Chat.Channel> channels = new List <Chat.Channel>();

            for (int i = 0; i < count; i++)
            {
                int    id   = message.ReadUnsignedShort();
                string name = message.ReadString();
                channels.Add(new Chat.Channel(id, name, MessageModeType.None));
            }
        }
Exemplo n.º 23
0
        private void ParseTrackedQuestFlags(Internal.ByteArray message)
        {
            bool full = message.ReadUnsignedByte() == 1;

            if (full)
            {
                int unknown2 = message.ReadUnsignedByte();
                int size     = message.ReadUnsignedByte();
                for (int i = 0; i < size; i++)
                {
                    int    missionId          = message.ReadUnsignedShort();
                    string questName          = message.ReadString();
                    string missionName        = message.ReadString();
                    string missionDescription = message.ReadString();
                }
            }
            else
            {
                int    missionId   = message.ReadUnsignedShort();
                string questName   = message.ReadString();
                string missionName = message.ReadString();
            }
        }
Exemplo n.º 24
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);
            }
        }
Exemplo n.º 25
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();
     }
 }
Exemplo n.º 26
0
        private ObjectInstance ReadObjectInstance(Internal.ByteArray message, int id = -1)
        {
            if (id == -1)
            {
                id = message.ReadUnsignedShort();
            }

            if (id == 0)
            {
                return(null);
            }
            else if (id <= AppearanceInstance.Creature)
            {
                throw new System.Exception("ProtocolGameUtility.ReadObjectInstance: Invalid type (id = " + id + ")");
            }

            var @object = AppearanceStorage.CreateObjectInstance((uint)id, 0);

            if (!@object)
            {
                throw new System.Exception("ProtocolGameUtility.ReadObjectInstance: Invalid instance with id " + id);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameObjectMarks))
            {
                @object.Marks.SetMark(MarkType.Permenant, message.ReadUnsignedByte());
            }

            if (@object.Type.IsStackable || @object.Type.IsFluidContainer || @object.Type.IsSplash)
            {
                @object.Data = message.ReadUnsignedByte();
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameItemAnimationPhase))
            {
                if (@object.Type.FrameGroups[(int)Protobuf.Shared.FrameGroupType.Idle].SpriteInfo.IsAnimation)
                {
                    int phase = message.ReadUnsignedByte();
                    @object.Phase = phase == 0 ? Constants.PhaseAutomatic : phase;
                }
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameQuickLoot) && @object.Type.IsContainer)
            {
                message.ReadUnsignedByte(); // autolootIndex
            }
            return(@object);
        }
Exemplo n.º 27
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);
            }
        }
Exemplo n.º 28
0
        private void ParseMarketBrowse(Internal.ByteArray message)
        {
            ushort var = message.ReadUnsignedShort(); // this must match the current object id

            int count = message.ReadUnsignedByte();

            for (int i = 0; i < count; i++)
            {
                ReadMarketOffer(message, MarketOfferTypes.Buy, var);
            }

            count = message.ReadUnsignedByte();
            for (int i = 0; i < count; i++)
            {
                ReadMarketOffer(message, MarketOfferTypes.Sell, var);
            }
        }
Exemplo n.º 29
0
        private void ParseCreateInContainer(Internal.ByteArray message)
        {
            byte   containerId = message.ReadUnsignedByte();
            ushort slot        = 0;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination))
            {
                slot = message.ReadUnsignedShort();
            }
            var @object = ReadObjectInstance(message);

            var containerView = ContainerStorage.GetContainerView(containerId);

            if (!!containerView)
            {
                containerView.AddObject(slot, @object);
            }
        }
Exemplo n.º 30
0
        private AppearanceInstance ReadMountOutfit(Internal.ByteArray message, AppearanceInstance instance = null)
        {
            uint outfitID = message.ReadUnsignedShort();

            OutfitInstance outfitInstance = instance as OutfitInstance;

            if (!!outfitInstance && outfitInstance.ID == outfitID)
            {
                return(outfitInstance);
            }

            if (outfitID != 0)
            {
                return(AppearanceStorage.CreateOutfitInstance(outfitID, 0, 0, 0, 0, 0));
            }

            return(null);
        }