Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Maple2.Database/Storage/Metadata/TableMetadataStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class TableMetadataStorage {
private readonly Lazy<MagicPathTable> magicPathTable;
private readonly Lazy<MasteryRecipeTable> masteryRecipeTable;
private readonly Lazy<MasteryRewardTable> masteryRewardTable;
private readonly Lazy<MasteryDifferentialFactorTable> masteryDifferentialFactorTable;
private readonly Lazy<FishingRodTable> fishingRodTable;
private readonly Lazy<InstrumentTable> instrumentTable;
private readonly Lazy<InteractObjectTable> interactObjectTable;
Expand Down Expand Up @@ -80,6 +81,7 @@ public class TableMetadataStorage {
public MagicPathTable MagicPathTable => magicPathTable.Value;
public MasteryRecipeTable MasteryRecipeTable => masteryRecipeTable.Value;
public MasteryRewardTable MasteryRewardTable => masteryRewardTable.Value;
public MasteryDifferentialFactorTable MasteryDifferentialFactorTable => masteryDifferentialFactorTable.Value;
public FishingRodTable FishingRodTable => fishingRodTable.Value;
public InstrumentTable InstrumentTable => instrumentTable.Value;
public InteractObjectTable InteractObjectTable => interactObjectTable.Value;
Expand Down Expand Up @@ -147,6 +149,7 @@ public TableMetadataStorage(MetadataContext context) {
magicPathTable = Retrieve<MagicPathTable>(context, TableNames.MAGIC_PATH);
masteryRecipeTable = Retrieve<MasteryRecipeTable>(context, TableNames.MASTERY_RECIPE);
masteryRewardTable = Retrieve<MasteryRewardTable>(context, TableNames.MASTERY);
masteryDifferentialFactorTable = Retrieve<MasteryDifferentialFactorTable>(context, TableNames.MASTERYT_DIFFERENTIAL_FACTOR);
fishingRodTable = Retrieve<FishingRodTable>(context, TableNames.FISHING_ROD);
instrumentTable = Retrieve<InstrumentTable>(context, TableNames.INSTRUMENT_CATEGORY_INFO);
interactObjectTable = Retrieve<InteractObjectTable>(context, TableNames.INTERACT_OBJECT);
Expand Down
11 changes: 11 additions & 0 deletions Maple2.File.Ingest/Mapper/TableMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ protected override IEnumerable<TableMetadata> Map() {
yield return new TableMetadata { Name = TableNames.ITEM_SOCKET, Table = ParseItemSocketTable() };
yield return new TableMetadata { Name = TableNames.MASTERY_RECIPE, Table = ParseMasteryRecipe() };
yield return new TableMetadata { Name = TableNames.MASTERY, Table = ParseMasteryReward() };
yield return new TableMetadata { Name = TableNames.MASTERYT_DIFFERENTIAL_FACTOR, Table = ParseMasteryDifferentialFactor() };
yield return new TableMetadata { Name = TableNames.GUILD, Table = ParseGuildTable() };
yield return new TableMetadata { Name = TableNames.VIP, Table = ParsePremiumClubTable() };
yield return new TableMetadata { Name = TableNames.INDIVIDUAL_ITEM_DROP, Table = ParseIndividualItemDropTable() };
Expand Down Expand Up @@ -776,6 +777,16 @@ private MasteryRewardTable ParseMasteryReward() {
return new MasteryRewardTable(results);
}

private MasteryDifferentialFactorTable ParseMasteryDifferentialFactor() {
var results = new Dictionary<int, MasteryDifferentialFactorTable.Entry>();
foreach ((int id, MasteryDifferentialFactor factor) in parser.ParseMasteryDifferentialFactor()) {
results.Add(id, new MasteryDifferentialFactorTable.Entry(
Differential: factor.differential,
Factor: factor.factor));
}
return new MasteryDifferentialFactorTable(results);
}

private GuildTable ParseGuildTable() {
// Dictionary<short, int> expTable = parser.ParseGuildExp()
// .ToDictionary(entry => (short) entry.Id, entry => entry.Item.value);
Expand Down
1 change: 1 addition & 0 deletions Maple2.Model/Common/TableNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public static class TableNames {
public const string ITEM_SOCKET = "itemsocket.xml";
public const string MASTERY_RECIPE = "masteryreceipe.xml";
public const string MASTERY = "mastery.xml";
public const string MASTERYT_DIFFERENTIAL_FACTOR = "masterydifferentialfactor.xml";
public const string GUILD = "guild*.xml";
public const string VIP = "vip*.xml";
public const string INDIVIDUAL_ITEM_DROP = "individualitemdrop*.xml";
Expand Down
9 changes: 9 additions & 0 deletions Maple2.Model/Metadata/Table/MasteryDifferentialFactorTable.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Maple2.Model.Metadata;

public record MasteryDifferentialFactorTable(IReadOnlyDictionary<int, MasteryDifferentialFactorTable.Entry> Entries) : Table {
public record Entry(
int Differential,
int Factor);
}


1 change: 1 addition & 0 deletions Maple2.Model/Metadata/TableMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public override int GetHashCode() {
[JsonDerivedType(typeof(ChatStickerTable), typeDiscriminator: "chatsticker")]
[JsonDerivedType(typeof(MasteryRecipeTable), typeDiscriminator: "masteryrecipe")]
[JsonDerivedType(typeof(MasteryRewardTable), typeDiscriminator: "masteryreward")]
[JsonDerivedType(typeof(MasteryDifferentialFactorTable), typeDiscriminator: "masterydifferentialfactor")]
[JsonDerivedType(typeof(FishingRodTable), typeDiscriminator: "fishingrod")]
[JsonDerivedType(typeof(GuildTable), typeDiscriminator: "guild")]
[JsonDerivedType(typeof(PremiumClubTable), typeDiscriminator: "vip")]
Expand Down
17 changes: 16 additions & 1 deletion Maple2.Server.Game/Manager/MasteryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,25 @@ private bool GatherCommon(int recipeId, Vector3 position, Vector3 rotation) {
}

Gather(recipeMetadata, position, rotation);
this[recipeMetadata.Type] += recipeMetadata.RewardMastery;
if (!recipeMetadata.NoRewardExp) {
session.Exp.AddExp(ExpType.gathering);
}
switch (recipeMetadata.Type) {
case MasteryType.Farming:
case MasteryType.Mining:
case MasteryType.Gathering:
case MasteryType.Breeding:
short playerLevel = GetLevel(recipeMetadata.Type);
// no mastery given - recipe level is more than 3 levels below player's mastery level
int masteryFactorCount = session.TableMetadata.MasteryDifferentialFactorTable.Entries.Values.Count(m => m.Factor > 0);
if (playerLevel - recipeMetadata.RewardMastery >= masteryFactorCount) {
return true;
}
break;
default:
break;
}
this[recipeMetadata.Type] += recipeMetadata.RewardMastery;
return true;
}

Expand Down
Loading