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
8 changes: 7 additions & 1 deletion Maple2.Database/Storage/Game/GameStorage.User.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,15 @@ from outdoor in plot.DefaultIfEmpty()
return null;
}

Tuple<long, string> guild = Context.GuildMember
.Where(member => member.CharacterId == characterId)
.Join(Context.Guild, member => member.GuildId, guild => guild.Id,
(member, guild) => new Tuple<long, string>(guild.Id, guild.Name))
.FirstOrDefault() ?? new Tuple<long, string>(0, string.Empty);

AchievementInfo achievementInfo = GetAchievementInfo(result.character.AccountId, result.character.Id);
IList<long> clubs = ListClubs(result.character.Id);
return BuildPlayerInfo(result.character, result.indoor, result.outdoor, achievementInfo, result.PremiumTime, clubs);
return BuildPlayerInfo(result.character, result.indoor, result.outdoor, achievementInfo, guild.Item1, guild.Item2, result.PremiumTime, clubs);
}

public Home? GetHome(long ownerId) {
Expand Down
6 changes: 5 additions & 1 deletion Maple2.Database/Storage/Game/GameStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ public Request(GameStorage game, Ms2Context context, ILogger logger) : base(cont
this.game = game;
}

private static PlayerInfo BuildPlayerInfo(Model.Character character, UgcMap indoor, UgcMap? outdoor, AchievementInfo achievementInfo, long premiumTime, IList<long> clubs) {
private static PlayerInfo BuildPlayerInfo(Model.Character character, UgcMap indoor, UgcMap? outdoor, AchievementInfo achievementInfo, long guildId, string guildName, long premiumTime, IList<long> clubs) {
if (outdoor == null) {
return new PlayerInfo(character, indoor.Name, achievementInfo, clubs) {
PremiumTime = premiumTime,
LastOnlineTime = character.LastModified.ToEpochSeconds(),
GuildId = guildId,
GuildName = guildName,
};
}

Expand All @@ -61,6 +63,8 @@ private static PlayerInfo BuildPlayerInfo(Model.Character character, UgcMap indo
ApartmentNumber = outdoor.ApartmentNumber,
PlotExpiryTime = outdoor.ExpiryTime.ToUnixTimeSeconds(),
LastOnlineTime = character.LastModified.ToEpochSeconds(),
GuildId = guildId,
GuildName = guildName,
};
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class ServerTableMetadataStorage {
private readonly Lazy<UserStatTable> userStatTable;
private readonly Lazy<IndividualDropItemTable> individualDropItemTable;
private readonly Lazy<PrestigeExpTable> prestigeExpTable;
private readonly Lazy<PrestigeIdExpTable> prestigeIdExpTable;
private readonly Lazy<TimeEventTable> timeEventTable;
private readonly Lazy<GameEventTable> gameEventTable;
private readonly Lazy<OxQuizTable> oxQuizTable;
Expand All @@ -36,6 +37,7 @@ public class ServerTableMetadataStorage {
public UserStatTable UserStatTable => userStatTable.Value;
public IndividualDropItemTable IndividualDropItemTable => individualDropItemTable.Value;
public PrestigeExpTable PrestigeExpTable => prestigeExpTable.Value;
public PrestigeIdExpTable PrestigeIdExpTable => prestigeIdExpTable.Value;
public TimeEventTable TimeEventTable => timeEventTable.Value;
public GameEventTable GameEventTable => gameEventTable.Value;
public OxQuizTable OxQuizTable => oxQuizTable.Value;
Expand All @@ -57,6 +59,7 @@ public ServerTableMetadataStorage(MetadataContext context) {
userStatTable = Retrieve<UserStatTable>(context, "userStat*.xml");
individualDropItemTable = Retrieve<IndividualDropItemTable>(context, "individualItemDrop.xml");
prestigeExpTable = Retrieve<PrestigeExpTable>(context, "adventureExpTable.xml");
prestigeIdExpTable = Retrieve<PrestigeIdExpTable>(context, "adventureExpIdTable.xml");
timeEventTable = Retrieve<TimeEventTable>(context, "timeEventData.xml");
gameEventTable = Retrieve<GameEventTable>(context, "gameEvent.xml");
oxQuizTable = Retrieve<OxQuizTable>(context, "oxQuiz.xml");
Expand Down
3 changes: 3 additions & 0 deletions Maple2.Database/Storage/Metadata/TableMetadataStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public class TableMetadataStorage {
private readonly Lazy<SurvivalSkinInfoTable> survivalSkinInfoTable;
private readonly Lazy<BannerTable> bannerTable;
private readonly Lazy<WeddingTable> weddingTable;
private readonly Lazy<RewardContentTable> rewardContentTable;

private readonly Lazy<EnchantScrollTable> enchantScrollTable;
private readonly Lazy<ItemRemakeScrollTable> itemRemakeScrollTable;
Expand Down Expand Up @@ -105,6 +106,7 @@ public class TableMetadataStorage {
public SurvivalSkinInfoTable SurvivalSkinInfoTable => survivalSkinInfoTable.Value;
public BannerTable BannerTable => bannerTable.Value;
public WeddingTable WeddingTable => weddingTable.Value;
public RewardContentTable RewardContentTable => rewardContentTable.Value;

public EnchantScrollTable EnchantScrollTable => enchantScrollTable.Value;
public ItemRemakeScrollTable ItemRemakeScrollTable => itemRemakeScrollTable.Value;
Expand Down Expand Up @@ -166,6 +168,7 @@ public TableMetadataStorage(MetadataContext context) {
survivalSkinInfoTable = Retrieve<SurvivalSkinInfoTable>(context, "maplesurvivalskininfo.xml");
bannerTable = Retrieve<BannerTable>(context, "banner.xml");
weddingTable = Retrieve<WeddingTable>(context, "wedding*.xml");
rewardContentTable = Retrieve<RewardContentTable>(context, "rewardcontent*.xml");
enchantScrollTable = Retrieve<EnchantScrollTable>(context, "enchantscroll.xml");
itemRemakeScrollTable = Retrieve<ItemRemakeScrollTable>(context, "itemremakescroll.xml");
itemRepackingScrollTable = Retrieve<ItemRepackingScrollTable>(context, "itemrepackingscroll.xml");
Expand Down
15 changes: 14 additions & 1 deletion Maple2.File.Ingest/Mapper/ServerTableMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ protected override IEnumerable<ServerTableMetadata> Map() {
yield return new ServerTableMetadata { Name = "userStat*.xml", Table = ParseUserStat() };
yield return new ServerTableMetadata { Name = "individualItemDrop.xml", Table = ParseIndividualItemDropTable() };
yield return new ServerTableMetadata { Name = "adventureExpTable.xml", Table = ParsePrestigeExpTable() };
yield return new ServerTableMetadata { Name = "adventureIdExpTable.xml", Table = ParsePrestigeIdExpTable() };
yield return new ServerTableMetadata { Name = "timeEventData.xml", Table = ParseTimeEventTable() };
yield return new ServerTableMetadata { Name = "gameEvent.xml", Table = ParseGameEventTable() };
yield return new ServerTableMetadata { Name = "OxQuiz.xml", Table = ParseOxQuizTable() };
Expand All @@ -63,7 +64,7 @@ private InstanceFieldTable ParseInstanceField() {

InstanceFieldMetadata instanceFieldMetadata = new(
MapId: fieldId,
Type: (InstanceType) instanceField.instanceType,
Type: Enum.TryParse(instanceField.instanceType.ToString(), out InstanceType instanceType) ? instanceType : InstanceType.none,
InstanceId: instanceId,
BackupSourcePortal: instanceField.backupSourcePortal,
PoolCount: instanceField.poolCount,
Expand Down Expand Up @@ -642,6 +643,18 @@ private PrestigeExpTable ParsePrestigeExpTable() {
return new PrestigeExpTable(results);
}

private PrestigeIdExpTable ParsePrestigeIdExpTable() {
var results = new Dictionary<int, PrestigeIdExpTable.Entry>();
foreach ((int id, AdventureIdExpTable table) in parser.ParseAdventureIdExp()) {
results.Add(id, new PrestigeIdExpTable.Entry(
Id: id,
Value: table.value,
Type: ToExpType(table.expType)));
}

return new PrestigeIdExpTable(results);
}

private static ExpType ToExpType(AdventureExpType type) {
return type switch {
AdventureExpType.Exp_MapCommon => ExpType.mapCommon,
Expand Down
55 changes: 55 additions & 0 deletions Maple2.File.Ingest/Mapper/TableMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ protected override IEnumerable<TableMetadata> Map() {
yield return new TableMetadata { Name = "banner.xml", Table = ParseBanner() };
yield return new TableMetadata { Name = "masteryugchousing.xml", Table = ParseMasteryUgcHousingTable() };
yield return new TableMetadata { Name = "ugchousingpointreward.xml", Table = ParseUgcHousingPointRewardTable() };
yield return new TableMetadata { Name = "rewardcontent*.xml", Table = ParseRewardContentTable() };

// Marriage/Wedding
yield return new TableMetadata { Name = "wedding*.xml", Table = ParseWeddingTable() };
Expand Down Expand Up @@ -1629,4 +1630,58 @@ private DungeonRankRewardTable ParseDungeonRankReward() {

return new DungeonRankRewardTable(results);
}

private RewardContentTable ParseRewardContentTable() {
var baseResults = new Dictionary<int, RewardContentTable.Base>();
foreach ((int id, RewardContent rewardContent) in parser.ParseRewardContent()) {
baseResults.Add(id, new RewardContentTable.Base(
Id: id,
ExpTableId: rewardContent.expTableID,
MesoTableId: rewardContent.mesoTableID,
ExpFactor: rewardContent.expFactor,
MesoFactor: rewardContent.mesoFactor,
ItemTableId: rewardContent.itemTableID,
PrestigeExpTableId: rewardContent.adventureExpTableID));
}

var itemResults = new Dictionary<int, RewardContentTable.Item>();
foreach ((int id, RewardContentItem content) in parser.ParseRewardContentItem()) {
List<RewardContentTable.Item.Data> itemData = [];
foreach (RewardContentValue value in content.v) {
List<RewardItem> items = [];
foreach (RewardContentItemEntry item in value.item) {
items.Add(new RewardItem(item.itemID, (short) item.grade, item.count));
}
itemData.Add(new RewardContentTable.Item.Data(
MinLevel: value.minLevel,
MaxLevel: value.maxLevel,
RewardItems: items.ToArray()));
}
itemResults.Add(id, new RewardContentTable.Item(
Id: id,
ItemData: itemData.ToArray()));
}

var mesoStaticResults = new Dictionary<int, long>();
foreach ((int id, RewardContentMesoStatic reward) in parser.ParseRewardContentMesoStatic()) {
mesoStaticResults.Add(id, reward.v.FirstOrDefault()?.meso ?? 0);
}

var mesoResults = new Dictionary<int, Dictionary<int, long>>();
foreach ((int id, RewardContentMeso reward) in parser.ParseRewardContentMeso()) {
var entries = new Dictionary<int, long>();
foreach (RewardContentMesoValue value in reward.v) {
entries.Add(value.level, value.meso);
}

mesoResults.Add(id, entries);
}

var expStaticResults = new Dictionary<int, long>();
foreach ((int id, RewardContentExpStatic reward) in parser.ParseRewardContentExpStatic()) {
expStaticResults.Add(id, reward.@base.FirstOrDefault()?.exp ?? 0);
}

return new RewardContentTable(baseResults, itemResults, mesoStaticResults, mesoResults, expStaticResults);
}
}
2 changes: 1 addition & 1 deletion Maple2.File.Ingest/Utils/PyParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public string FormatValue(bool validate = true) {
//"2" => "",
"3" => "BannerType.Winner",
"4" => "BannerType.Lose",
"5" => "BannerType.Fail",
"5" => "BannerType.GameOver",
"6" => "BannerType.Bonus",
"7" => "BannerType.Success",
_ => throw new ArgumentException($"Unexpected BannerType: {value}"),
Expand Down
2 changes: 1 addition & 1 deletion Maple2.File.Ingest/Utils/TriggerDefinitionOverride.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ static TriggerDefinitionOverride() {
};
ActionOverride["dungeon_clear"] = new TriggerDefinitionOverride("dungeon_clear") {
Names = BuildNameOverride(),
Types = BuildTypeOverride(("uiType", Str, "None")),
Types = BuildTypeOverride(("uiType", Str, null)),
};
ActionOverride["dungeon_clear_round"] = new TriggerDefinitionOverride("dungeon_clear_round") {
Names = BuildNameOverride(),
Expand Down
66 changes: 66 additions & 0 deletions Maple2.Model/Enum/Dungeon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,69 @@ public enum DungeonRoomModify : byte {
[Description("s_room_dungeon_record_notify_change_expert - You're now a veteran in {0}. Collect Dungeon Helper rewards by clearing the dungeon with rookies!")]
ChangeToExpert = 4,
}

public enum DungeonAccumulationRecordType {
[Description("s_dungeon_record_accum_damage - Total Damage: {0}")]
TotalDamage = 0,
[Description("s_dungeon_record_accum_heal - Total Healing: {0}")]
TotalHealing = 1,
[Description("s_dungeon_record_accum_hit_count - Total Hit Count: {0}")]
TotalHitCount = 2,
[Description("s_dungeon_record_boss_last_hit - Boss Final Blows: {0}")]
BossFinalBlows = 3,
[Description("s_dungeon_record_accum_move_distance - Total Move Distance: {0}")]
TotalMoveDistance = 4,
[Description("s_dungeon_record_accum_critical_damage - Total Critical Damage: {0}")]
TotalCriticalDamage = 5,
[Description("s_dungeon_record_max_critial_damage - Maximum Critical Damage: {0}")]
MaximumCriticalDamage = 6,
[Description("s_dungeon_record_accum_monster_kill - Defeated Monsters: {0}")]
DefeatedMonsters = 7,
[Description("s_dungeon_record_accum_be_hit_count - Incoming Damage: {0}")]
IncomingDamage = 8,
[Description("s_dungeon_record_accum_default_skill_damage - Basic Attack Damage: {0}")]
BasicAttackDamage = 9,
}

public enum DungeonState : byte {
None = 0,
[Description("s_room_dungeon_clear - Dungeon Cleared.")]
Clear = 1,
[Description("s_room_dungeon_fail - Dungeon Failed.")]
Fail = 2,
}

public enum DungeonGrade {
None = -1,
F = 0,
C = 1,
B = 2,
A = 3,
S = 4,
SPlus = 5,
}

public enum DungeonRewardType : byte {
Meso = 1,
Exp = 2,
Prestige = 3,
}

[Flags]
public enum DungeonBonusFlag : byte {
None = 0,
Clears = 2,
Event = 4,
Rank = 8,
Helper = 16,
MutualHelp = 32,
Mentor = 64,
Returning = 128,
}

[Flags]
public enum DungeonBonusFlag2 : byte {
None = 0,
ReturningPlayerParty = 1,
NormalHardAdventure = 2,
}
7 changes: 7 additions & 0 deletions Maple2.Model/Enum/FieldType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Maple2.Model.Enum;

public enum FieldType : byte {
Default = 0,
Random = 1, // Random Rooms like Pocket Realms
Dungeon = 2
}
16 changes: 8 additions & 8 deletions Maple2.Model/Enum/InstanceType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ public enum InstanceType : byte {
channelScale = 2,
massiveEvent = 3,
ugcMap = 4,
GameMaker = 5,
GuildPvp = 6,
GuildEvent = 7,
RankingPvp = 8,
GameMaker = 5, //UGD
GuildEvent = 6,
GuildPvp = 7, // Not confirmed
DungeonLobby = 8,
GuildHouse = 9,
GuildVsGame = 10,
DungeonLobby = 11,
MapleSurvival = 12,
MapleSurvivalSquad = 13,
GuildVsGame = 10, // Not confirmed
RankingPvp = 11, // Not confirmed
MapleSurvival = 12, // Not confirmed
MapleSurvivalSquad = 13, // Not confirmed
FieldWar = 14,
WeddingHall = 15,
}
2 changes: 1 addition & 1 deletion Maple2.Model/Error/DungeonRoomError.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public enum DungeonRoomError {
s_room_dungeon_canEnterDayOfWeeks = 12,
[Description("You are already in the hall.")]
s_room_dungeon_AlreadyChaosHall = 13,
[Description("You are already $map:63000063$.")]
[Description("You are already Within the Anomaly.")]
s_room_dungeon_AlreadyLapentaHall = 14,
[Description("You are already in the Queen's Parlor.")]
s_room_dungeon_AlreadyColosseumHall = 15,
Expand Down
17 changes: 17 additions & 0 deletions Maple2.Model/Game/Dungeon/DungeonRoomRecord.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Concurrent;
using Maple2.Model.Enum;
using Maple2.Model.Metadata;

namespace Maple2.Model.Game.Dungeon;

public class DungeonRoomRecord {
public ConcurrentDictionary<long, DungeonUserRecord> UserResults = [];
public readonly DungeonRoomTable.DungeonRoomMetadata Metadata;
public long StartTick { get; set; }
public long EndTick { get; set; }
public DungeonState State { get; set; } = DungeonState.None;

public DungeonRoomRecord(DungeonRoomTable.DungeonRoomMetadata metadata) {
Metadata = metadata;
}
}
Loading