예제 #1
0
        public override BuildUrlData GetBuildData()
        {
            PoeplannerData data = DecodePoeplannerUrl();

            BuildUrlData buildData = ParsePoeplannerData(data);

            return(buildData);
        }
        private BuildUrlData ParsePoeplannerData(PoeplannerData data)
        {
            var result = new BuildUrlData(BanditConverter.PoEPlanner);

            result.Version = data.Version;

            // There is a small bug in poeplanner, where class and ascendancy bytes are missing, when no one node was selected.
            // Need to check length
            if (data.NodesData.Length == 0)
            {
                return(result);
            }

            result.CharacterClassId  = data.NodesData[0] & 15;
            result.AscendancyClassId = data.NodesData[0] >> 4 & 15;

            if (data.NodesData.Length < 2)
            {
                return(result);
            }

            result.SetBanditNormal(data.NodesData[1] & 3);
            result.SetBanditCruel(data.NodesData[1] >> 2 & 3);
            result.SetBanditMerciless(data.NodesData[1] >> 4 & 3);

            if (data.NodesData.Length < 4)
            {
                return(result);
            }

            var skilledNodesCount = data.NodesData[2] << 8 | data.NodesData[3];
            int i = 4;

            while (i < 2 * skilledNodesCount + 4)
            {
                result.SkilledNodesIds.Add((ushort)(data.NodesData[i++] << 8 | data.NodesData[i++]));
            }

            var jeweledNodesCount = data.NodesData[i++];

            for (var j = 0; j < jeweledNodesCount; j++)
            {
                var nodeId             = data.NodesData[i++] << 8 | data.NodesData[i++];
                var jewelsDataBuffSize = data.NodesData[i++];

                var rawJewelData = data.NodesData.Skip(i++).Take(jewelsDataBuffSize).ToList();
                i = i + (jewelsDataBuffSize - 1);
                result.Jewels[nodeId] = rawJewelData;
            }

            return(result);
        }
예제 #3
0
        private static BuildUrlData ParsePoeplannerData(PoeplannerData data)
        {
            var result = new BuildUrlData {
                Version = data.Version
            };

            // There is a small bug in poeplanner, where class and ascendancy bytes are missing, when no one node was selected.
            // Need to check length
            if (data.NodesData.Length == 0)
            {
                return(result);
            }

            result.CharacterClass    = (CharacterClass)(data.NodesData[2] & 15);
            result.AscendancyClassId = data.NodesData[2] >> 4 & 15;

            if (data.NodesData.Length < 4)
            {
                return(result);
            }

            result.Bandit = ConvertBanditId(data.NodesData[3] & 3);

            if (data.NodesData.Length < 6)
            {
                return(result);
            }

            var skilledNodesCount = data.NodesData[4] << 8 | data.NodesData[5];
            int i = 6;

            while (i < 2 * skilledNodesCount + 6)
            {
                result.SkilledNodesIds.Add((ushort)(data.NodesData[i++] << 8 | data.NodesData[i++]));
            }

            var jeweledNodesCount = data.NodesData[i++];

            for (var j = 0; j < jeweledNodesCount; j++)
            {
                var nodeId             = data.NodesData[i++] << 8 | data.NodesData[i++];
                var jewelsDataBuffSize = data.NodesData[i++];

                var rawJewelData = data.NodesData.Skip(i++).Take(jewelsDataBuffSize).ToList();
                i = i + (jewelsDataBuffSize - 1);
                result.Jewels[nodeId] = rawJewelData;
            }

            return(result);
        }
예제 #4
0
        private PoeplannerData DecodePoeplannerUrl()
        {
            byte[] rawBytes = GetRawData();

            var skillsBuffSize = rawBytes[3] << 8 | rawBytes[4];
            var aurasBuffSize  = rawBytes[5 + skillsBuffSize] << 8 | rawBytes[6 + skillsBuffSize];
            var equipBuffSize  = rawBytes[7 + skillsBuffSize + aurasBuffSize] << 8 | rawBytes[8 + skillsBuffSize + aurasBuffSize];

            var data = new PoeplannerData
            {
                Version           = rawBytes[0] << 8 | rawBytes[1],
                    ActiveTab     = rawBytes[2],
                    NodesData     = new byte[skillsBuffSize],
                    AurasData     = new byte[aurasBuffSize],
                    EquipmentData = new byte[equipBuffSize]
            };

            Array.Copy(rawBytes, 5, data.NodesData, 0, skillsBuffSize);
            Array.Copy(rawBytes, 7 + skillsBuffSize, data.AurasData, 0, aurasBuffSize);
            Array.Copy(rawBytes, 9 + skillsBuffSize + aurasBuffSize, data.EquipmentData, 0, equipBuffSize);

            return(data);
        }