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
1 change: 1 addition & 0 deletions Maple2.Database/Context/MetadataContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ private static void ConfigureAdditionalEffectMetadata(EntityTypeBuilder<Addition
builder.Property(effect => effect.Shield).HasJsonConversion();
builder.Property(effect => effect.InvokeEffect).HasJsonConversion();
builder.Property(effect => effect.Skills).HasJsonConversion();
builder.Property(effect => effect.ModifyOverlapCount).HasJsonConversion();
}

private static void ConfigureAnimationMetadata(EntityTypeBuilder<AnimationMetadata> builder) {
Expand Down
8 changes: 8 additions & 0 deletions Maple2.File.Ingest/Mapper/AdditionalEffectMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ protected override IEnumerable<AdditionalEffectMetadata> Map() {
KeepOnEnterPvpZone: data.BasicProperty.doNotClearEffectFromEnterPVPZone,
CasterIndividualBuff: data.BasicProperty.casterIndividualEffect,
Exp: data.ExpProperty.value,
CooldownTime: (int) TimeSpan.FromSeconds(float.TryParse(data.BasicProperty.coolDownTime, out float cooldown) ? cooldown : 0).TotalMilliseconds,
RideId: data.RideeProperty == null! ? 0 : data.RideeProperty.rideeID,
KeepCondition: (BuffKeepCondition) data.BasicProperty.keepCondition,
ResetCondition: (BuffResetCondition) data.BasicProperty.resetCondition,
DotCondition: (BuffDotCondition) data.BasicProperty.dotCondition),
Expand All @@ -56,6 +58,12 @@ protected override IEnumerable<AdditionalEffectMetadata> Map() {
Buff: Convert(data.DotBuffProperty)),
Shield: Convert(data.ShieldProperty),
InvokeEffect: Convert(data.InvokeEffectProperty),
ModifyOverlapCount: data.ModifyOverlapCountProperty == null! ? [] : data.ModifyOverlapCountProperty.effectCodes
.Zip(data.ModifyOverlapCountProperty.offsetCounts)
.Select(tuple => new AdditionalEffectMetadataModifyOverlapCount(
Id: tuple.First,
OffsetCount: tuple.Second))
.ToArray(),
Skills: data.conditionSkill.Concat(data.splashSkill).Select(skill => skill.Convert()).ToArray());
}
}
Expand Down
3 changes: 0 additions & 3 deletions Maple2.File.Ingest/Mapper/FunctionCubeMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ protected override IEnumerable<FunctionCubeMetadata> Map() {
foreach ((int id, FunctionCubeRoot functionCubeRoot) in parser.Parse()) {
FunctionCube functionCube = functionCubeRoot.FunctionCube;

if (!Enum.TryParse(functionCube.ControlType, out InteractCubeControlType controlTypet)) {
Console.WriteLine($"Unknown control type: {functionCube.ControlType}");
}
ConfigurableCube? configurableCube = functionCubeRoot.ConfigurableCube;
yield return new FunctionCubeMetadata(
Id: id,
Expand Down
3 changes: 2 additions & 1 deletion Maple2.File.Ingest/Mapper/RideMapper.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Maple2.File.IO;
using Maple2.File.Parser;
using Maple2.File.Parser.Xml.Riding;
using Maple2.Model.Enum;
using Maple2.Model.Metadata;

namespace Maple2.File.Ingest.Mapper;
Expand All @@ -23,7 +24,7 @@ protected override IEnumerable<RideMetadata> Map() {
Id: id,
Model: data.basic.kfm,
Basic: new RideMetadataBasic(
Type: (int) data.basic.type, // default=0,battle=1,object=2
Type: Enum.TryParse(data.basic.type.ToString(), true, out RideOnType type) ? type : RideOnType.Default,
SkillSetId: data.basic.skillSetID,
SummonTime: data.basic.rideSummonCastTime,
RunXStamina: data.basic.runXConsumeEp,
Expand Down
4 changes: 2 additions & 2 deletions Maple2.File.Ingest/Mapper/TableMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ private Dictionary<int, InteractObjectMetadata> MergeInteractObjectTable(Diction

InteractObjectMetadataEffect.ConditionEffect[] ParseConditional(InteractObject.ConditionAdditionalEffect additionalEffect) {
if (additionalEffect.id.Length == 0 || additionalEffect.id[0] == 0) {
return Array.Empty<InteractObjectMetadataEffect.ConditionEffect>();
return [];
}

return additionalEffect.id.Zip(additionalEffect.level, (effectId, level) =>
Expand All @@ -356,7 +356,7 @@ InteractObjectMetadataEffect.ConditionEffect[] ParseConditional(InteractObject.C

InteractObjectMetadataEffect.InvokeEffect[] ParseInvoke(InteractObject.AdditionalEffect additionalEffect) {
if (additionalEffect.invoke.code.Length == 0 || additionalEffect.invoke.code[0] == 0) {
return Array.Empty<InteractObjectMetadataEffect.InvokeEffect>();
return [];
}

return additionalEffect.invoke.code
Expand Down
10 changes: 3 additions & 7 deletions Maple2.File.Ingest/MapperExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ public static SkillEffectMetadata Convert(this TriggerSkill trigger) {
Independent: trigger.independent,
Chain: trigger.chain ? new SkillEffectMetadataChain(trigger.chainDistance) : null);
} else {
var owner = SkillEntity.Target;
var owner = SkillEntity.Owner;
if (trigger.skillOwner > 0 && Enum.IsDefined<SkillEntity>((SkillEntity) trigger.skillOwner)) {
owner = (SkillEntity) trigger.skillOwner;
}
Expand Down Expand Up @@ -352,7 +352,7 @@ public static BeginCondition Convert(this Maple2.File.Parser.Xml.Skill.BeginCond
}

// We use this default to avoid writing useless checks
private static readonly BeginConditionTarget DefaultBeginConditionTarget = new([], null, [], [], [], new Dictionary<MasteryType, int>(), [], []);
private static readonly BeginConditionTarget DefaultBeginConditionTarget = new([], new BeginConditionTarget.EventCondition(EventConditionType.Activate, false, [], []), [], [], [], new Dictionary<MasteryType, int>(), [], []);
private static BeginConditionTarget? Convert(SubConditionTarget? target) {
if (target == null) {
return null;
Expand Down Expand Up @@ -413,11 +413,7 @@ BeginConditionTarget.HasBuff[] ParseBuffs(SubConditionTarget data) {
// return data.hasSkillID > 0 ? new BeginConditionTarget.HasSkill(data.hasSkillID, data.hasSkillLevel) : null;
// }

BeginConditionTarget.EventCondition? ParseEvent(SubConditionTarget data) {
if (data.eventCondition == 0) {
return null;
}

BeginConditionTarget.EventCondition ParseEvent(SubConditionTarget data) {
return new BeginConditionTarget.EventCondition(
Type: (EventConditionType) data.eventCondition,
IgnoreOwner: data.ignoreOwnerEvent != 0,
Expand Down
22 changes: 20 additions & 2 deletions Maple2.Model/Enum/Buff.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ public enum BuffKeepCondition {
}

public enum BuffResetCondition {
Reset = 0,
ResetEndTick = 0,
PersistEndTick = 1, // end tick does not reset
Reset2 = 2, // behaves the same as Reset ??
Reset3 = 3, // also behaves like Reset ??
Replace = 3, // Removes old buff and adds a new
}

public enum BuffDotCondition {
Expand All @@ -73,3 +73,21 @@ public enum BuffFlag {
UpdateBuff = 1,
UpdateShield = 2,
}

public enum InvokeEffectType : byte {
ReduceCooldown = 1,
IncreaseSkillDamage = 2,
IncreaseEffectDuration = 3,
IncreaseDotDamage = 5,
// 20 (90050324)
// 21 (90050324)
IncreaseEvasionDebuff = 23,
IncreaseCritEvasionDebuff = 26,
// 34 (90050853)
// 35 (90050854)
// 38 (90050806)
// 40 (90050827)
ReduceSpiritCost = 56, // flame wave 0 spirit cost? value=0, rate=2 on 10300250. subtract rate from cost (10500201, rate=20%)
// 57 (90050351)
IncreaseHealing = 58,
}
19 changes: 0 additions & 19 deletions Maple2.Model/Enum/InvokeEffectType.cs

This file was deleted.

8 changes: 4 additions & 4 deletions Maple2.Model/Enum/RideType.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
namespace Maple2.Model.Enum;

public enum RideOnType : byte {
Default = 0,
UseItem = 1,
AdditionalEffect = 2,
HideAndSeek = 3,
None = 0,
Default = 1,
Battle = 2,
Object = 3,
}

public enum RideOffType : byte {
Expand Down
9 changes: 7 additions & 2 deletions Maple2.Model/Enum/Skill.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ public enum SkillRegion {

public enum SkillEntity {
None = 0,
Target = 1,
Owner = 2,
Owner = 1,
Target = 2,
Caster = 3,
PetOwner = 4,
Attacker = 5,
Expand Down Expand Up @@ -131,6 +131,11 @@ public enum SkillEntity {
// 20:
// 102: Frost Inflicted (10300271)
// 103: Target Hit All 9x (11000266)
// -----
// All: 1,2,4,5,6,7,10,11,13,14,16,17,18,19,20,102,103
// IgnoreOwner => 1,2,4,5,6,7,10,16,17,18
// SkillIds => 4,6,7,14,20
// BuffIds => 16,17,102
public enum EventConditionType {
Activate = 0, // always 0 in skills
Tick = 0,
Expand Down
10 changes: 5 additions & 5 deletions Maple2.Model/Game/Ride/RideOnAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ public virtual void WriteTo(IByteWriter writer) {
}
}

public class RideOnActionUseItem : RideOnAction {
public class RideOnActionDefault : RideOnAction {
private readonly Item item;
public int ItemId => item.Id;
public long ItemUid => item.Uid;

public RideOnActionUseItem(int rideId, int objectId, Item item) : base(RideOnType.UseItem, rideId, objectId) {
public RideOnActionDefault(int rideId, int objectId, Item item) : base(RideOnType.Default, rideId, objectId) {
this.item = item;
}

Expand All @@ -42,11 +42,11 @@ public override void WriteTo(IByteWriter writer) {
}
}

public class RideOnActionAdditionalEffect : RideOnAction {
public class RideOnActionBattle : RideOnAction {
public readonly int SkillId;
public readonly short SkillLevel;

public RideOnActionAdditionalEffect(int rideId, int objectId, int skillId, short skillLevel) : base(RideOnType.AdditionalEffect, rideId, objectId) {
public RideOnActionBattle(int rideId, int objectId, int skillId, short skillLevel) : base(RideOnType.Battle, rideId, objectId) {
SkillId = skillId;
SkillLevel = skillLevel;
}
Expand All @@ -58,4 +58,4 @@ public override void WriteTo(IByteWriter writer) {
}
}

public class RideOnActionHideAndSeek(int rideId, int objectId) : RideOnAction(RideOnType.HideAndSeek, rideId, objectId);
public class RideOnActionObject(int rideId, int objectId) : RideOnAction(RideOnType.Object, rideId, objectId);
7 changes: 7 additions & 0 deletions Maple2.Model/Metadata/AdditionalEffectMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public record AdditionalEffectMetadata(
AdditionalEffectMetadataDot Dot,
AdditionalEffectMetadataShield? Shield,
AdditionalEffectMetadataInvokeEffect? InvokeEffect,
AdditionalEffectMetadataModifyOverlapCount[] ModifyOverlapCount,
SkillEffectMetadata[] Skills);

public record AdditionalEffectMetadataProperty(
Expand All @@ -36,6 +37,8 @@ public record AdditionalEffectMetadataProperty(
bool KeepOnEnterPvpZone,
bool CasterIndividualBuff,
int Exp,
int CooldownTime,
int RideId,
BuffKeepCondition KeepCondition,
BuffResetCondition ResetCondition,
BuffDotCondition DotCondition);
Expand Down Expand Up @@ -130,3 +133,7 @@ public record AdditionalEffectMetadataInvokeEffect(
int EffectGroupId,
int SkillId,
int SkillGroupId);

public record AdditionalEffectMetadataModifyOverlapCount(
int Id,
int OffsetCount);
6 changes: 1 addition & 5 deletions Maple2.Model/Metadata/BeginCondition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public record BeginConditionWeapon(

public record BeginConditionTarget(
BeginConditionTarget.HasBuff[] Buff,
BeginConditionTarget.EventCondition? Event,
BeginConditionTarget.EventCondition Event,
BeginConditionTarget.BeginConditionStat[] Stat,
ActorState[] States,
ActorSubState[] SubStates,
Expand All @@ -47,10 +47,6 @@ int[] HasNotBuffIds
) {
public record HasBuff(int Id, short Level, bool Owned, int Count, CompareType Compare);

// All: 1,2,4,5,6,7,10,11,13,14,16,17,18,19,20,102,103
// IgnoreOwner => 1,2,4,5,6,7,10,16,17,18
// SkillIds => 4,6,7,14,20
// BuffIds => 16,17,102
public record EventCondition(EventConditionType Type, bool IgnoreOwner, int[] SkillIds, int[] BuffIds);
public record BeginConditionStat(BasicAttribute Attribute, float Value, CompareType Compare, CompareStatValueType ValueType);
}
Expand Down
5 changes: 5 additions & 0 deletions Maple2.Model/Metadata/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -936,6 +936,11 @@ public static class Constant {
public const float NpcLastSightRadius = 1800;
public const float NpcLastSightHeightUp = 525;
public const float NpcLastSightHeightDown = 225;

public const int RecoveryHPWaitTick = 1000;
public const int RecoverySPWaitTick = 1000;
public const int RecoveryEPWaitTick = 1000;
public const float FallBoundingAddedDistance = 750f;
#endregion
}

Expand Down
2 changes: 1 addition & 1 deletion Maple2.Model/Metadata/RideMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public record RideMetadata(
IReadOnlyDictionary<BasicAttribute, long> Stats);

public record RideMetadataBasic(
int Type,
RideOnType Type,
int SkillSetId,
float SummonTime,
long RunXStamina,
Expand Down
30 changes: 21 additions & 9 deletions Maple2.Server.Game/Commands/BuffCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,17 @@ private void Handle(InvocationContext ctx, int buffId, int level, int stack, int
if (all) {
foreach (FieldPlayer player in session.Field.Players.Values) {
if (remove) {
player.Buffs.Remove(buffId);
player.Buffs.Remove(buffId, session.Player.ObjectId);
} else {
player.Buffs.AddBuff(session.Player, player, buffId, (short) level, startTick, duration);
if (stack > 1) {
player.Buffs.Buffs[buffId].Stack(player.Field.FieldTick, stack);
session.Field?.Broadcast(BuffPacket.Update(player.Buffs.Buffs[buffId]));
List<Buff> buffs = player.Buffs.EnumerateBuffs(buffId);
foreach (Buff buff in buffs) {
if (buff.Stack(stack)) {
session.Field?.Broadcast(BuffPacket.Update(buff));
}
}

}
}

Expand All @@ -74,23 +79,30 @@ private void Handle(InvocationContext ctx, int buffId, int level, int stack, int
}

if (remove) {
player.Buffs.Remove(buffId);
player.Buffs.Remove(buffId, session.Player.ObjectId);
return;
}
player.Buffs.AddBuff(session.Player, player, buffId, (short) level, startTick, duration);
if (stack > 1) {
player.Buffs.Buffs[buffId].Stack(player.Field.FieldTick, stack);
session.Field.Broadcast(BuffPacket.Update(player.Buffs.Buffs[buffId]));
List<Buff> buffs = player.Buffs.EnumerateBuffs(buffId);
foreach (Buff buff in buffs) {
if (buff.Stack(stack)) {
session.Field?.Broadcast(BuffPacket.Update(buff));
}
}
}
} else {
if (remove) {
session.Player.Buffs.Remove(buffId);
session.Player.Buffs.Remove(buffId, session.Player.ObjectId);
return;
}
session.Player.Buffs.AddBuff(session.Player, session.Player, buffId, (short) level, startTick, duration);
if (stack > 1) {
session.Player.Buffs.Buffs[buffId].Stack(session.Field.FieldTick, stack);
session.Field?.Broadcast(BuffPacket.Update(session.Player.Buffs.Buffs[buffId]));
foreach (Buff buff in session.Player.Buffs.EnumerateBuffs(buffId)) {
if (buff.Stack(stack)) {
session.Field.Broadcast(BuffPacket.Update(buff));
}
}
}
}

Expand Down
3 changes: 1 addition & 2 deletions Maple2.Server.Game/Commands/KillCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,7 @@ private static void Kill(GameSession session, FieldNpc npc, SkillMetadata skill)
Position = npc.Position,
Direction = session.Player.Rotation,
};
var target = new DamageRecordTarget() {
ObjectId = npc.ObjectId,
var target = new DamageRecordTarget(npc) {
Position = session.Player.Position,
Direction = session.Player.Rotation,
};
Expand Down
2 changes: 1 addition & 1 deletion Maple2.Server.Game/Commands/PlayerCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ private void Handle(InvocationContext ctx, JobCode jobCode, bool awakening) {
session.Player.Value.Character.Job = job;
session.Config.Skill.SkillInfo.SetJob(job);

session.Player.Buffs.Buffs.Clear();
session.Player.Buffs.Clear();
session.Player.Buffs.Initialize();
session.Player.Buffs.LoadFieldBuffs();
session.Stats.Refresh();
Expand Down
Loading