Skip to content

Commit

Permalink
Review comments; move legend pawns into their own asset, fix DB hang …
Browse files Browse the repository at this point in the history
…when using a master craft pawn, clean up skill assets, fix missing serializer from sebastian-heinz#671.
  • Loading branch information
RyanYappert committed Dec 28, 2024
1 parent 849e0bf commit 5cbe298
Show file tree
Hide file tree
Showing 13 changed files with 529 additions and 509 deletions.
195 changes: 1 addition & 194 deletions Arrowgene.Ddon.GameServer/Characters/CraftManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,199 +36,6 @@ public class CraftManager
{ 8, 16 }, { 16, 21 }, { 21, 26 }, { 26, 31 }, { 31, 36 }, { 36, 41 }, { 41, 46 }, { 46, 51 }, { 51, 56 }, { 56, 61 }, { 61, 66 }, { 66, 71 }
};

/// <summary>
/// TODO: Extract to asset
/// </summary>
public static readonly List<CDataRegisteredLegendPawnInfo> CraftMasterLegendPawnInfoList = new List<CDataRegisteredLegendPawnInfo>
{
new CDataRegisteredLegendPawnInfo
{
PawnId = 308,
PointType = WalletType.GoldenGemstones,
RentalCost = 1,
Unk3 = 10000004,
Name = "Many",
CraftRank = 100,
PawnCraftSkillList = new List<CDataPawnCraftSkill>
{
new CDataPawnCraftSkill
{
Type = CraftSkillType.ProductionSpeed,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentEnhancement,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentQuality,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableQuantity,
Level = 99
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformance,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableProductionIsAlwaysGreatSuccess,
Level = 1
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CreatingHighQualityEquipmentIsAlwaysGreatSuccess,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor1,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor2,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.UnknownEffect10,
Level = 0
}
}
},
new CDataRegisteredLegendPawnInfo
{
PawnId = 309,
PointType = WalletType.GoldenGemstones,
RentalCost = 1,
Unk3 = 10000006,
Name = "Qualio",
CraftRank = 100,
PawnCraftSkillList = new List<CDataPawnCraftSkill>
{
new CDataPawnCraftSkill
{
Type = CraftSkillType.ProductionSpeed,
Level = 99
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentEnhancement,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentQuality,
Level = 99
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableQuantity,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformance,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableProductionIsAlwaysGreatSuccess,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CreatingHighQualityEquipmentIsAlwaysGreatSuccess,
Level = 1
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor1,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor2,
Level = 1
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.UnknownEffect10,
Level = 0
}
}
},
new CDataRegisteredLegendPawnInfo
{
PawnId = 310,
PointType = WalletType.GoldenGemstones,
RentalCost = 1,
Unk3 = 10000002,
Name = "Arms",
CraftRank = 100,
PawnCraftSkillList = new List<CDataPawnCraftSkill>
{
new CDataPawnCraftSkill
{
Type = CraftSkillType.ProductionSpeed,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentEnhancement,
Level = 99
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.EquipmentQuality,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableQuantity,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformance,
Level = 99
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.ConsumableProductionIsAlwaysGreatSuccess,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CreatingHighQualityEquipmentIsAlwaysGreatSuccess,
Level = 0
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor1,
Level = 1
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.CostPerformanceEffectUpFactor2,
Level = 1
},
new CDataPawnCraftSkill
{
Type = CraftSkillType.UnknownEffect10,
Level = 0
}
}
}
};

private const int GreatSuccessOddsDefault = 10;
private const uint CraftSkillLevelMax = 70;
private const uint PawnCraftRankMaxLimit = 70;
Expand Down Expand Up @@ -352,7 +159,7 @@ public uint CalculateRecipeProductionSpeed(uint recipeTime, ClientItemInfo itemI
{
modifiedTime = 30;
}
modifiedTime = (int)(modifiedTime * _server.Setting.GameLogicSetting.AdditionalProductionSpeedFactor);
modifiedTime = (int)(modifiedTime * _server.GameLogicSettings.AdditionalProductionSpeedFactor);
return (uint)modifiedTime;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public override void Handle(GameClient client, StructurePacket<C2SCraftGetCraftS
ReasonableCraftLv = 5,
CraftItemLv = 15,
CreateCountMax = Server.GameLogicSettings.CraftConsumableProductionTimesMax,
CraftMasterLegendPawnInfoList = CraftManager.CraftMasterLegendPawnInfoList,
CraftMasterLegendPawnInfoList = Server.AssetRepository.PawnCraftMasterLegendAsset,
Unk1 = 49,
Unk2 = 30,
RefiningMaterialInfoList = RefiningMaterialInfoList
Expand Down
6 changes: 3 additions & 3 deletions Arrowgene.Ddon.GameServer/Handler/CraftStartCraftHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public override S2CCraftStartCraftRes Handle(GameClient client, C2SCraftStartCra
new CraftPawn(leadPawn, CraftPosition.Leader)
};
craftPawns.AddRange(request.CraftSupportPawnIDList.Select(p => new CraftPawn(Server.CraftManager.FindPawn(client, p.PawnId), CraftPosition.Assistant)));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId))));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId))));

Server.Database.ExecuteInTransaction(connection =>
{
Expand Down Expand Up @@ -173,8 +173,8 @@ public override S2CCraftStartCraftRes Handle(GameClient client, C2SCraftStartCra

if (request.CraftMasterLegendPawnIDList.Count > 0)
{
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId).RentalCost);
CDataUpdateWalletPoint updateGP = Server.WalletManager.RemoveFromWallet(client.Character, WalletType.GoldenGemstones, totalGPcost)
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId).RentalCost);
CDataUpdateWalletPoint updateGP = Server.WalletManager.RemoveFromWallet(client.Character, WalletType.GoldenGemstones, totalGPcost, connection)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_GP_LACK_GP);
updateCharacterItemNtc.UpdateWalletList.Add(updateGP);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public override S2CCraftStartEquipGradeUpRes Handle(GameClient client, C2SCraftS
new CraftPawn(leadPawn, CraftPosition.Leader)
};
craftPawns.AddRange(request.CraftSupportPawnIDList.Select(p => new CraftPawn(Server.CraftManager.FindPawn(client, p.PawnId), CraftPosition.Assistant)));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId))));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId))));

double calculatedOdds = CraftManager.CalculateEquipmentQualityIncreaseRate(craftPawns);
CraftCalculationResult enhnacementResult = _craftManager.CalculateEquipmentEnhancement(craftPawns, (uint)calculatedOdds);
Expand All @@ -103,7 +103,7 @@ public override S2CCraftStartEquipGradeUpRes Handle(GameClient client, C2SCraftS

if (request.CraftMasterLegendPawnIDList.Count > 0)
{
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId).RentalCost);
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId).RentalCost);
CDataUpdateWalletPoint updateGP = Server.WalletManager.RemoveFromWallet(client.Character, WalletType.GoldenGemstones, totalGPcost)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_GP_LACK_GP);
updateCharacterItemNtc.UpdateWalletList.Add(updateGP);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public override S2CCraftStartQualityUpRes Handle(GameClient client, C2SCraftStar
new CraftPawn(leadPawn, CraftPosition.Leader)
};
craftPawns.AddRange(request.CraftSupportPawnIDList.Select(p => new CraftPawn(Server.CraftManager.FindPawn(client, p.PawnId), CraftPosition.Assistant)));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId))));
craftPawns.AddRange(request.CraftMasterLegendPawnIDList.Select(p => new CraftPawn(Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId))));

double calculatedOdds = CraftManager.CalculateEquipmentQualityIncreaseRate(craftPawns);

Expand Down Expand Up @@ -150,7 +150,7 @@ public override S2CCraftStartQualityUpRes Handle(GameClient client, C2SCraftStar

if (request.CraftMasterLegendPawnIDList.Count > 0)
{
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => CraftManager.CraftMasterLegendPawnInfoList.Single(m => m.PawnId == p.PawnId).RentalCost);
uint totalGPcost = (uint)request.CraftMasterLegendPawnIDList.Sum(p => Server.AssetRepository.PawnCraftMasterLegendAsset.Single(m => m.PawnId == p.PawnId).RentalCost);
CDataUpdateWalletPoint updateGP = Server.WalletManager.RemoveFromWallet(client.Character, WalletType.GoldenGemstones, totalGPcost)
?? throw new ResponseErrorException(ErrorCode.ERROR_CODE_GP_LACK_GP);
updateCharacterItemNtc.UpdateWalletList.Add(updateGP);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using Arrowgene.Ddon.Shared.Asset;
using Arrowgene.Ddon.Shared.Entity.Structure;
using Arrowgene.Ddon.Shared.Model;
using Arrowgene.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace Arrowgene.Ddon.Shared.AssetReader
{
public class PawnCraftMasterLegendDeserializer : IAssetDeserializer<List<CDataRegisteredLegendPawnInfo>>
{
private static readonly ILogger Logger = LogProvider.Logger(typeof(PawnCraftMasterLegendDeserializer));

public List<CDataRegisteredLegendPawnInfo> ReadPath(string path)
{
Logger.Info($"Reading {path}");

List<CDataRegisteredLegendPawnInfo> asset = new();

string json = Util.ReadAllText(path);
JsonDocument document = JsonDocument.Parse(json);

var pawnElements = document.RootElement.EnumerateArray().ToList();
foreach (var pawn in pawnElements)
{
var skillList = new List<CDataPawnCraftSkill>();
foreach (var skill in pawn.GetProperty("PawnCraftSkillList").EnumerateArray())
{
skillList.Add(new()
{
Level = skill.GetProperty("Level").GetUInt32(),
Type = (CraftSkillType)skill.GetProperty("Type").GetByte()
});
}

asset.Add(new CDataRegisteredLegendPawnInfo()
{
PawnId = pawn.GetProperty("PawnId").GetUInt32(),
PointType = (WalletType)pawn.GetProperty("PointType").GetByte(),
RentalCost = pawn.GetProperty("RentalCost").GetUInt32(),
Unk3 = pawn.GetProperty("Unk3").GetUInt32(),
Name = pawn.GetProperty("Name").GetString(),
CraftRank = pawn.GetProperty("CraftRank").GetUInt32(),
PawnCraftSkillList = skillList
});
}

return asset;
}
}
}
4 changes: 4 additions & 0 deletions Arrowgene.Ddon.Shared/AssetRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public class AssetRepository
public const string PawnCostReductionKey = "PawnCostReduction.json";
public const string PawnCraftSkillCostRateKey = "PawnCraftSkillCostRate.csv";
public const string PawnCraftSkillSpeedRateKey = "PawnCraftSkillSpeedRate.csv";
public const string PawnCraftMasterLegendKey = "CraftingLegendPawns.json";
public const string BitterblackMazeKey = "BitterblackMaze.json";
public const string QuestDropItemsKey = "QuestEnemyDrops.json";
public const string RecruitmentBoardCategoryKey = "RecruitmentGroups.json";
Expand Down Expand Up @@ -111,6 +112,7 @@ public AssetRepository(string folder)
EpitaphTrialAssets = new EpitaphTrialAsset();
PawnCraftSkillCostRateAsset = new();
PawnCraftSkillSpeedRateAsset = new();
PawnCraftMasterLegendAsset = new();
}

public List<CDataErrorMessage> ClientErrorCodes { get; private set; }
Expand Down Expand Up @@ -139,6 +141,7 @@ public AssetRepository(string folder)
public SpecialShopAsset SpecialShopAsset { get; private set; }
public List<PawnCraftSkillCostRate> PawnCraftSkillCostRateAsset { get; private set; }
public List<PawnCraftSkillSpeedRate> PawnCraftSkillSpeedRateAsset { get; private set; }
public List<CDataRegisteredLegendPawnInfo> PawnCraftMasterLegendAsset { get; private set; }
public BitterblackMazeAsset BitterblackMazeAsset { get; private set; }
public QuestDropItemAsset QuestDropItemAsset { get; private set; }
public RecruitmentBoardCategoryAsset RecruitmentBoardCategoryAsset { get; private set; }
Expand Down Expand Up @@ -182,6 +185,7 @@ public void Initialize()
RegisterAsset(value => EpitaphRoadAssets = value, EpitaphRoadKey, new EpitaphRoadAssertDeserializer());
RegisterAsset(value => PawnCraftSkillCostRateAsset = value, PawnCraftSkillCostRateKey, new PawnCraftSkillCostRateCsv());
RegisterAsset(value => PawnCraftSkillSpeedRateAsset = value, PawnCraftSkillSpeedRateKey, new PawnCraftSkillSpeedRateCsv());
RegisterAsset(value => PawnCraftMasterLegendAsset = value, PawnCraftMasterLegendKey, new PawnCraftMasterLegendDeserializer());

// This must be set before calling QuestAssertDeserializer and EpitaphTrialAssertDeserializer
var commonEnemyDeserializer = new AssetCommonDeserializer(this.NamedParamAsset);
Expand Down
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.Shared/Csv/PawnCraftSkillSpeedRateCsv.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Arrowgene.Ddon.Shared.Csv
{
internal class PawnCraftSkillSpeedRateCsv : CsvReaderWriter<PawnCraftSkillSpeedRate>
{
protected override int NumExpectedItems => 5;
protected override int NumExpectedItems => 3;

protected override PawnCraftSkillSpeedRate CreateInstance(string[] properties)
{
Expand Down
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ static EntitySerializer()
Create(new CDataQuestOrderList.Serializer());
Create(new CDataQuestOrderListUnk8.Serializer());
Create(new CDataQuestProcessState.Serializer());
Create(new CDataQuestProcessState.Serializer());
Create(new CDataQuestProcessState.MtTypedArrayCDataQuestCommand.Serializer());
Create(new CDataQuestProgressWork.Serializer());
Create(new CDataQuestRecruitListItem.Serializer());
Create(new CDataQuestSetInfo.Serializer());
Expand Down
Loading

0 comments on commit 5cbe298

Please sign in to comment.