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); }
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); }
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); }