コード例 #1
0
        private void ParsePlayerSkills(Internal.ByteArray message)
        {
            // magic level is being parsed
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1200)
            {
                var skillStruct = ReadSkill(message);
                Player.SetSkill(SkillType.MagLevel, skillStruct.Level, skillStruct.BaseLevel, skillStruct.Percentage);
            }

            var skills = new SkillType[] {
                SkillType.Fist,
                SkillType.Club,
                SkillType.Sword,
                SkillType.Axe,
                SkillType.Distance,
                SkillType.Shield,
                SkillType.Fishing
            };

            foreach (var skill in skills)
            {
                var skillStruct = ReadSkill(message);
                Player.SetSkill(skill, skillStruct.Level, skillStruct.BaseLevel, skillStruct.Percentage);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameAdditionalSkills))
            {
                SkillType[] specialSkills = new SkillType[] {
                    SkillType.CriticalHitChance,
                    SkillType.CriticalHitDamage,
                    SkillType.LifeLeechChance,
                    SkillType.LifeLeechAmount,
                    SkillType.ManaLeechChance,
                    SkillType.ManaLeechAmount
                };

                foreach (var skill in specialSkills)
                {
                    var skillStruct = ReadSkill(message, true);
                    Player.SetSkill(skill, skillStruct.Level, skillStruct.BaseLevel);
                }
            }

            // todo: find if this is capacity
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1150)
            {
                int totalCapacity = message.ReadInt();
                int baseCapacity  = message.ReadInt();

                Player.SetSkill(SkillType.Capacity, totalCapacity, baseCapacity);
            }
        }
コード例 #2
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;
        }
コード例 #3
0
        private void ParseTextMessage(Internal.ByteArray message)
        {
            var mode = TranslateMessageModeFromServer(message.ReadUnsignedByte());

            try {
                switch (mode)
                {
                case MessageModeType.ChannelManagement:
                    int    channelId = message.ReadUnsignedShort();
                    string text      = message.ReadString();
                    // TODO name filter
                    //var regex = new System.Text.RegularExpressions.Regex(@"^(.+?) invites you to |^You have been excluded from the channel ([^']+)'s Channel\.$");
                    //var match = regex.Match(text);
                    //string speaker = match != null && match.Success ? match.Value : null;

                    WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text);
                    break;

                case MessageModeType.Guild:
                case MessageModeType.PartyManagement:
                case MessageModeType.Party:
                    channelId = message.ReadUnsignedShort();
                    text      = message.ReadString();
                    WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text);
                    break;

                case MessageModeType.Login:
                case MessageModeType.Admin:
                case MessageModeType.Game:
                case MessageModeType.GameHighlight:
                case MessageModeType.Failure:
                case MessageModeType.Look:
                case MessageModeType.Status:
                case MessageModeType.Loot:
                case MessageModeType.TradeNpc:
                case MessageModeType.HotkeyUse:
                    channelId = -1;
                    text      = message.ReadString();
                    WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text);
                    break;

                case MessageModeType.Market:
                    text = message.ReadString();
                    // TODO: market
                    break;

                case MessageModeType.Report:
                    // TODO
                    //ReportWidget.s_ReportTimestampReset();
                    text = message.ReadString();
                    WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text);
                    ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                case MessageModeType.DamageDealed:
                case MessageModeType.DamageReceived:
                case MessageModeType.DamageOthers:
                    Vector3Int absolutePosition = message.ReadPosition();
                    int        value            = message.ReadInt();
                    int        color            = message.ReadUnsignedByte();
                    if (value > 0)
                    {
                        WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color);
                    }

                    value = message.ReadInt();
                    color = message.ReadUnsignedByte();
                    if (value > 0)
                    {
                        WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color);
                    }

                    text = message.ReadString();
                    ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                case MessageModeType.Heal:
                case MessageModeType.Mana:
                case MessageModeType.Exp:
                case MessageModeType.HealOthers:
                case MessageModeType.ExpOthers:
                    absolutePosition = message.ReadPosition();
                    value            = message.ReadInt();
                    color            = message.ReadUnsignedByte();
                    WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color);

                    text = message.ReadString();
                    ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;

                default:
                    text = message.ReadString();
                    ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text);
                    break;
                }
            } catch (System.Exception e) {
                throw new System.Exception("ProtocolGame.ParseTextMessage: Failed to add message of type " + mode + ": " + e.Message + "\n" + e.StackTrace);
            }
        }
コード例 #4
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);
                }
            }
        }