Example #1
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;
            }
        }
Example #2
0
        private void ParseStoreButtonIndicators(Internal.ByteArray message)
        {
            message.ReadBoolean(); // sale on items?
            message.ReadBoolean(); // new items on store?

            // TODO
        }
Example #3
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));
            }
        }
Example #4
0
        private void ParseDeath(Internal.ByteArray message)
        {
            var deathType = DeathType.DeathTypeRegular;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDeathType))
            {
                deathType = (DeathType)message.ReadUnsignedByte();
            }

            int penalty = 100;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePenalityOnDeath) && deathType == DeathType.DeathTypeRegular)
            {
                penalty = message.ReadUnsignedByte();
            }

            bool useDeathRedemption = false;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1120)
            {
                useDeathRedemption = message.ReadBoolean();
            }

            // TODO death actions...
            //LocalPlayer.OnDeath(deathType, penalty);
        }
Example #5
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());
                }
            }
        }
Example #6
0
        private void ParseInspectionList(Internal.ByteArray message)
        {
            bool isPlayer = message.ReadBoolean();

            int size = message.ReadUnsignedByte();

            for (int i = 0; i < size; i++)
            {
                var @object = ReadObjectInstance(message);
                if (isPlayer)
                {
                    var slot = message.ReadEnum <ClothSlots>();
                }


                int imbuementSlots = message.ReadUnsignedByte();
                for (int j = 0; j < imbuementSlots; j++)
                {
                    int imbuementID = message.ReadUnsignedByte();
                }

                int details = message.ReadUnsignedByte();
                for (int j = 0; j < details; j++)
                {
                    string name        = message.ReadString();
                    string description = message.ReadString();
                }
            }
        }
Example #7
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();
            }
        }
Example #8
0
        private void ParseAutomapFlag(Internal.ByteArray message)
        {
            var absolutePosition = message.ReadPosition();
            int icon             = message.ReadUnsignedByte();
            var description      = message.ReadString();

            bool remove = false;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameMinimapRemove))
            {
                remove = message.ReadBoolean();
            }
        }
Example #9
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
        }
Example #10
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);
            }
        }
Example #11
0
 private void ParseRestingAreaState(Internal.ByteArray message)
 {
     message.ReadBoolean(); // unknown
     message.ReadBoolean(); // unknown
     message.ReadString();
 }
Example #12
0
 private void ParseDepotTileState(Internal.ByteArray message)
 {
     Player.IsInDepot = message.ReadBoolean();
 }
Example #13
0
        private void ParseOutfitDialog(Internal.ByteArray message)
        {
            var outfit = ReadCreatureOutfit(message);

            Appearances.AppearanceInstance mountOutfit = null;
            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts))
            {
                mountOutfit = ReadMountOutfit(message);
            }

            var outfitList = new List <ProtocolOutfit>();

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNewOutfitProtocol))
            {
                int count;
                if (OpenTibiaUnity.GameManager.ClientVersion >= 1185)
                {
                    count = message.ReadUnsignedShort();
                }
                else
                {
                    count = message.ReadUnsignedByte();
                }

                for (int i = 0; i < count; i++)
                {
                    ushort outfitId   = message.ReadUnsignedShort();
                    var    outfitName = message.ReadString();
                    int    addOns     = message.ReadUnsignedByte();
                    bool   locked     = true;
                    uint   offerId    = 0;

                    if (OpenTibiaUnity.GameManager.ClientVersion >= 1185)
                    {
                        locked = message.ReadBoolean();
                        if (locked)
                        {
                            offerId = message.ReadUnsignedInt();
                        }
                    }

                    outfitList.Add(new ProtocolOutfit()
                    {
                        _id          = outfitId,
                        Name         = outfitName,
                        AddOns       = addOns,
                        Locked       = locked,
                        StoreOfferId = offerId,
                    });
                }
            }
            else
            {
                ushort outfitStart, outfitEnd;
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOutfitIdU16))
                {
                    outfitStart = message.ReadUnsignedShort();
                    outfitEnd   = message.ReadUnsignedShort();
                }
                else
                {
                    outfitStart = message.ReadUnsignedByte();
                    outfitEnd   = message.ReadUnsignedByte();
                }

                for (ushort i = outfitStart; i <= outfitEnd; i++)
                {
                    outfitList.Add(new ProtocolOutfit()
                    {
                        _id = i
                    });
                }
            }

            List <ProtocolMount> mountList = null;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts))
            {
                mountList = new List <ProtocolMount>();
                int count;
                if (OpenTibiaUnity.GameManager.ClientVersion >= 1185)
                {
                    count = message.ReadUnsignedShort();
                }
                else
                {
                    count = message.ReadUnsignedByte();
                }

                for (int i = 0; i < count; i++)
                {
                    ushort mountId   = message.ReadUnsignedShort();
                    var    mountName = message.ReadString();
                    bool   locked    = true;
                    uint   offerId   = 0;

                    if (OpenTibiaUnity.GameManager.ClientVersion >= 1185)
                    {
                        locked = message.ReadBoolean();
                        if (locked)
                        {
                            offerId = message.ReadUnsignedInt();
                        }
                    }

                    mountList.Add(new ProtocolMount()
                    {
                        _id          = mountId,
                        Name         = mountName,
                        Locked       = locked,
                        StoreOfferId = offerId,
                    });
                }
            }

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1185)
            {
                bool tryOutfit = message.ReadBoolean();
                bool mounted   = message.ReadBoolean();
            }

            OpenTibiaUnity.GameManager.onRequestOutfitDialog.Invoke(outfit, mountOutfit, outfitList, mountList);
        }
Example #14
0
        private void ParsePlayerStats(Internal.ByteArray message)
        {
            int ticks = OpenTibiaUnity.TicksMillis;

            int health, maxHealth;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleHealth))
            {
                health    = message.ReadInt();
                maxHealth = message.ReadInt();
            }
            else
            {
                health    = message.ReadUnsignedShort();
                maxHealth = message.ReadUnsignedShort();
            }

            Player.SetSkill(SkillType.Health, health, maxHealth, 0);

            int freeCapacity;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleFreeCapacity))
            {
                freeCapacity = message.ReadInt();
            }
            else
            {
                freeCapacity = message.ReadShort();
            }

            Player.FreeCapacity = freeCapacity;

            int totalCapacity = 0;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameTotalCapacity))
            {
                totalCapacity = message.ReadInt();
            }


            Player.SetSkill(SkillType.Capacity, freeCapacity, totalCapacity, 0);

            long experience;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleExperience))
            {
                experience = message.ReadLong();
            }
            else
            {
                experience = message.ReadInt();
            }

            Player.SetSkill(SkillType.Experience, experience, 1, 0);

            ushort level        = message.ReadUnsignedShort();
            byte   levelPercent = message.ReadUnsignedByte();

            Player.SetSkill(SkillType.Level, level, 1, levelPercent);

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceGain))
            {
                float baseXpGain    = message.ReadUnsignedShort() / 100f;
                float voucherAddend = 0;
                if (OpenTibiaUnity.GameManager.ClientVersion < 1150)
                {
                    voucherAddend = message.ReadUnsignedShort() / 100f;
                }
                float grindingAddend     = message.ReadUnsignedShort() / 100f;
                float storeBoostAddend   = message.ReadUnsignedShort() / 100f;
                float huntingBoostFactor = message.ReadUnsignedShort() / 100f;

                Player.ExperienceGainInfo.UpdateGainInfo(baseXpGain, voucherAddend, grindingAddend, storeBoostAddend, huntingBoostFactor);
            }
            else if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceBonus))
            {
                double experienceBonus = message.ReadDouble();
                Player.ExperienceBonus = experienceBonus;
            }

            int mana, maxMana;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleHealth))
            {
                mana    = message.ReadInt();
                maxMana = message.ReadInt();
            }
            else
            {
                mana    = message.ReadUnsignedShort();
                maxMana = message.ReadUnsignedShort();
            }

            Player.SetSkill(SkillType.Mana, mana, maxMana, 0);

            if (OpenTibiaUnity.GameManager.ClientVersion < 1200)
            {
                byte magicLevel        = message.ReadUnsignedByte();
                byte baseMagicLevel    = OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase) ? message.ReadUnsignedByte() : magicLevel;
                byte magicLevelPercent = message.ReadUnsignedByte();

                Player.SetSkill(SkillType.MagLevel, magicLevel, baseMagicLevel, magicLevelPercent);
            }

            int soul = message.ReadUnsignedByte();

            Player.SetSkill(SkillType.SoulPoints, soul, 1, 0);

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStamina))
            {
                int stamina = ticks + 60000 * message.ReadUnsignedShort();
                Player.SetSkill(SkillType.Stamina, stamina, ticks, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase))
            {
                ushort baseSpeed = message.ReadUnsignedShort();
                Player.SetSkill(SkillType.Speed, Player.GetSkillValue(SkillType.Speed), baseSpeed, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerRegenerationTime))
            {
                int regeneration = ticks + 1000 * message.ReadUnsignedShort();
                Player.SetSkill(SkillType.Food, regeneration, ticks, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOfflineTrainingTime))
            {
                int training = ticks + 60000 * message.ReadUnsignedShort();
                Player.SetSkill(SkillType.OfflineTraining, training, ticks, 0);

                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceGain))
                {
                    uint remainingSeconds   = message.ReadUnsignedShort();
                    bool canBuyMoreXpBoosts = message.ReadBoolean();
                    Player.ExperienceGainInfo.UpdateStoreXpBoost(remainingSeconds, canBuyMoreXpBoosts);
                }
            }
        }
Example #15
0
        public void Parse(Internal.ByteArray message)
        {
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1010)
            {
                byte worlds = message.ReadUnsignedByte();
                for (int i = 0; i < worlds; i++)
                {
                    var world = new World {
                        _id      = message.ReadUnsignedByte(),
                        Name     = message.ReadString(),
                        HostName = message.ReadString(),
                        Port     = message.ReadUnsignedShort(),
                        Preview  = message.ReadBoolean()
                    };
                    Worlds.Add(world);
                }

                byte characters = message.ReadUnsignedByte();
                for (int i = 0; i < characters; i++)
                {
                    Character character = new Character {
                        WorldId = message.ReadUnsignedByte(),
                        Name    = message.ReadString()
                    };
                    Characters.Add(character);
                }
            }
            else
            {
                byte characters = message.ReadUnsignedByte();
                for (int i = 0; i < characters; i++)
                {
                    var characterName = message.ReadString();
                    var worldName     = message.ReadString();
                    var worldIpLong   = message.ReadUnsignedInt();
                    var worldPort     = message.ReadUnsignedShort();

                    var world     = GetOrCreateWorld(worldName, worldIpLong, worldPort);
                    var character = new Character {
                        Name    = characterName,
                        WorldId = world._id
                    };
                    Characters.Add(character);
                }
            }

            uint now = (uint)System.DateTime.Now.Second;

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1077)
            {
                AccountState     = message.ReadUnsignedByte();
                IsPremium        = message.ReadBoolean();
                PremiumTimeStamp = message.ReadUnsignedInt();
                if (PremiumTimeStamp > now)
                {
                    PremiumDays = (ushort)((PremiumTimeStamp - now) / 86400U);
                }
                else
                {
                    PremiumDays = 0;
                }

                InfinitePremium = (IsPremium && PremiumTimeStamp == 0);
            }
            else
            {
                AccountState = 0;
                PremiumDays  = message.ReadUnsignedShort();
                if (PremiumDays > 0)
                {
                    PremiumTimeStamp = now + PremiumDays * 86400U;
                }
                else
                {
                    PremiumTimeStamp = 0;
                }

                IsPremium       = PremiumDays > 0;
                InfinitePremium = PremiumDays == 65535;
            }
        }