Skip to content
Closed
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
4 changes: 2 additions & 2 deletions Maple2.File.Ingest/Mapper/ServerTableMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1647,8 +1647,8 @@ private ShopItemTable ParseShopItems() {
restrictedBuyData = new RestrictedBuyData {
Days = item.dayOfWeek.Length == 0 ? [] : Array.ConvertAll(item.dayOfWeek, day => (ShopBuyDay) day),
TimeRanges = buyTimeOfDays,
StartTime = string.IsNullOrEmpty(item.startDate) ? 0 : DateTime.ParseExact(item.startDate, "yyyy-MM-dd-HH-mm", CultureInfo.InvariantCulture).ToEpochSeconds(),
EndTime = string.IsNullOrEmpty(item.endDate) ? 0 : DateTime.ParseExact(item.endDate, "yyyy-MM-dd-HH-mm-ss", CultureInfo.InvariantCulture).ToEpochSeconds(),
StartTime = string.IsNullOrEmpty(item.startDate) ? 0 : DateTime.ParseExact(item.startDate, "yyyy-MM-dd-HH-mm-ss", CultureInfo.InvariantCulture).ToEpochSeconds(),
EndTime = string.IsNullOrEmpty(item.endDate) ? 0 : DateTime.ParseExact(item.endDate, "yyyy-MM-dd-HH-mm-ss", CultureInfo.InvariantCulture).ToEpochSeconds()
};
}

Expand Down
5 changes: 4 additions & 1 deletion Maple2.Model/Game/Emote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

namespace Maple2.Model.Game;

[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 16)]
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 26)]
public readonly struct Emote {
public readonly int Id;
public readonly int Level = 1;
public readonly bool Unknown1;
public readonly long ExpiryTime;
public readonly long UnknownTime;
public readonly bool Unknown2;

public Emote(int id, long expiryTime = 0) {
Id = id;
Expand Down
6 changes: 2 additions & 4 deletions Maple2.Model/Game/Item/Item.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,6 @@ private long GetExpiryTime() {

public void WriteTo(IByteWriter writer) {
writer.WriteInt(Amount);
writer.WriteInt();
writer.WriteInt(-1);
writer.WriteLong(CreationTime);
writer.WriteLong(ExpiryTime);
Expand All @@ -221,19 +220,18 @@ public void WriteTo(IByteWriter writer) {
} else if (Music != null) {
writer.WriteClass<ItemCustomMusicScore>(Music);
} else if (Badge != null) {
writer.WriteClass<ItemBadge>(Badge);
writer.WriteClass<ItemBadge>(Badge); // TODO
}

writer.WriteClass<ItemTransfer>(Transfer ?? ItemTransfer.Default);
writer.WriteClass<ItemSocket>(Socket ?? ItemSocket.Default);
writer.WriteClass<ItemCoupleInfo>(CoupleInfo ?? ItemCoupleInfo.Default);
writer.WriteClass<ItemBinding>(Binding ?? ItemBinding.Default);
writer.WriteClass<ItemBinding>(Transfer?.Binding ?? ItemBinding.Default);
}

public void ReadFrom(IByteReader reader) {
Amount = reader.ReadInt();
reader.ReadInt();
reader.ReadInt();
CreationTime = reader.ReadLong();
ExpiryTime = reader.ReadLong();
reader.ReadLong();
Expand Down
4 changes: 3 additions & 1 deletion Maple2.Model/Game/Item/ItemEnchant.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ public void WriteTo(IByteWriter writer) {
writer.WriteInt(Enchants);
writer.WriteInt(EnchantExp);
writer.WriteByte(EnchantCharges);
writer.WriteLong(); // Destabilized timestamp

writer.WriteLong();
writer.WriteInt();
writer.WriteInt();
writer.WriteInt();// Enchantment attempts
writer.WriteBool(Tradeable);
Expand Down
18 changes: 9 additions & 9 deletions Maple2.Model/Game/Item/ItemOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,27 @@

namespace Maple2.Model.Game;

[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 8)]
public readonly record struct BasicOption(int Value, float Rate = 0) {
public BasicOption(float percent) : this(0, percent) { }
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 4)]
public readonly record struct BasicOption(int Value) {
public BasicOption(float percent) : this((int) percent * 100) { }

public static BasicOption operator +(BasicOption self, BasicOption other) {
return new BasicOption(self.Value + other.Value, self.Rate + other.Rate);
return new BasicOption(self.Value + other.Value);
}

public static BasicOption operator -(BasicOption self, BasicOption other) {
return new BasicOption(Math.Max(self.Value - other.Value, 0), Math.Max(self.Rate - other.Rate, 0));
return new BasicOption(Math.Max(self.Value - other.Value, 0));
}
}

[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 8)]
public readonly record struct SpecialOption(float Rate, float Value = 0) {
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 4)]
public readonly record struct SpecialOption(float Rate) {
public static SpecialOption operator +(SpecialOption self, SpecialOption other) {
return new SpecialOption(self.Rate + other.Rate, self.Value + other.Value);
return new SpecialOption(self.Rate + other.Rate);
}

public static SpecialOption operator -(SpecialOption self, SpecialOption other) {
return new SpecialOption(Math.Max(self.Rate - other.Rate, 0), Math.Max(self.Value - other.Value, 0));
return new SpecialOption(Math.Max(self.Rate - other.Rate, 0));
}
}

Expand Down
16 changes: 5 additions & 11 deletions Maple2.Model/Game/Item/ItemStats.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,14 @@ namespace Maple2.Model.Game;
public sealed class ItemStats : IByteSerializable, IByteDeserializable {
public static readonly ItemStats Default = new ItemStats();

public const int TYPE_COUNT = 9;
public const int TYPE_COUNT = 5;

public enum Type {
Constant = 0,
Static = 1,
Random = 2,
Title = 3,
Empowerment1 = 4,
Empowerment2 = 5,
Empowerment3 = 6,
Empowerment4 = 7,
Empowerment5 = 8,
Empowerment = 4,
}

private readonly Option[] options;
Expand Down Expand Up @@ -58,7 +54,6 @@ public Option this[Type type] {
}

public void WriteTo(IByteWriter writer) {
writer.WriteByte();
for (int i = 0; i < TYPE_COUNT; i++) {
Option option = options[i];
writer.WriteShort((short) option.Basic.Count);
Expand All @@ -71,13 +66,12 @@ public void WriteTo(IByteWriter writer) {
writer.WriteShort((short) type);
writer.Write<SpecialOption>(specialOption);
}

writer.WriteInt();
}

// writer.WriteInt(); // this version of kms2 does not have this?
}

public void ReadFrom(IByteReader reader) {
reader.ReadByte();
for (int i = 0; i < TYPE_COUNT; i++) {
Option option = options[i];
short basicCount = reader.ReadShort();
Expand All @@ -91,7 +85,7 @@ public void ReadFrom(IByteReader reader) {
option.Special[type] = reader.Read<SpecialOption>();
}

reader.ReadInt();
// reader.ReadInt(); // this version of kms2 does not have this?
}
}

Expand Down
4 changes: 2 additions & 2 deletions Maple2.Model/Game/Item/ItemTransfer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public void WriteTo(IByteWriter writer) {
writer.WriteBool(false); // CItemTransfer[9] *bit-1*
writer.WriteInt(RemainTrades); // CItemTransfer[10]
writer.WriteInt(RepackageCount); // CItemTransfer[11]
writer.WriteByte(); // CItemTransfer[12]
writer.WriteBool(false); // CItemTransfer[12]
writer.WriteBool(true); // CItemTransfer[9] *bit-10* (socketTransfer?)

// CharBound means untradable, unsellable, bound to char (ignores TransferFlag)
Expand All @@ -60,7 +60,7 @@ public void ReadFrom(IByteReader reader) {
reader.ReadByte();
RemainTrades = reader.ReadInt();
RepackageCount = reader.ReadInt();
reader.ReadByte();
reader.ReadBool();
reader.ReadBool();
bool isBound = reader.ReadBool();
if (isBound) {
Expand Down
78 changes: 28 additions & 50 deletions Maple2.Model/Game/Sync/StateSync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,52 +35,39 @@ public enum Flag : byte {
public int SyncNumber;

#region Flag1
public int EmotionId; // Skill ID for emotes + flying mounts (not ground)
public short Flag1Unknown2; // Goes to 1 for flying mounts
public int Flag1Unknown;
#endregion

#region Flag2
public Vector3 Flag2Unknown1;
public string? Flag2Unknown2;
public int Flag2Unknown;
#endregion

#region Flag3
public int Flag3Unknown1;
public string? Flag3Unknown2;
public short Flag3Unknown;
#endregion

#region AnimationFlag
public string? AnimationName;
#endregion

#region Flag5
public int Flag5Unknown1;
public Vector3 Flag5Unknown1;
public string? Flag5Unknown2;
#endregion

#region Flag6
public int Flag6Unknown1;
public int Flag6Unknown2;
public byte Flag6Unknown3;
public Vector3 Flag6Position;
public Vector3 Flag6Rotation;
public string? Flag6Unknown2;
#endregion

public virtual void WriteTo(IByteWriter writer) {
writer.Write<ActorState>(State);
writer.Write<ActorSubState>(SubState);
writer.Write<Flag>(Flags);

if (Flags.HasFlag(Flag.Flag1)) {
writer.WriteInt(EmotionId);
writer.WriteShort(Flag1Unknown2);
}

writer.Write<Vector3S>(Position);
writer.WriteShort(Rotation);
writer.WriteByte(Animation);

if (Animation > 127) {
if (Animation == 128) {
writer.WriteFloat(UnknownFloat1);
writer.WriteFloat(UnknownFloat2);
}
Expand All @@ -89,46 +76,39 @@ public virtual void WriteTo(IByteWriter writer) {
writer.WriteByte(Unknown1);
writer.WriteShort(Rotation2);
writer.WriteShort(Unknown3);

writer.Write<Flag>(Flags);
if (Flags.HasFlag(Flag.Flag1)) {
writer.WriteInt(Flag1Unknown);
}
if (Flags.HasFlag(Flag.Flag2)) {
writer.Write<Vector3>(Flag2Unknown1);
writer.WriteUnicodeString(Flag2Unknown2 ?? "");
writer.WriteInt(Flag2Unknown);
}
if (Flags.HasFlag(Flag.Flag3)) {
writer.WriteInt(Flag3Unknown1);
writer.WriteUnicodeString(Flag3Unknown2 ?? "");
writer.WriteShort(Flag3Unknown);
}
if (Flags.HasFlag(Flag.Animation)) {
writer.WriteUnicodeString(AnimationName ?? "");
}
if (Flags.HasFlag(Flag.Flag5)) {
writer.WriteInt(Flag5Unknown1);
writer.Write<Vector3>(Flag5Unknown1);
writer.WriteUnicodeString(Flag5Unknown2 ?? "");
}
if (Flags.HasFlag(Flag.Flag6)) {
writer.WriteInt(Flag6Unknown1);
writer.WriteInt(Flag6Unknown2);
writer.WriteByte(Flag6Unknown3);
writer.Write<Vector3>(Flag6Position);
writer.Write<Vector3>(Flag6Rotation);
writer.WriteUnicodeString(Flag6Unknown2 ?? "");
}

writer.WriteInt(SyncNumber);
}

public virtual void ReadFrom(IByteReader reader) {
State = reader.Read<ActorState>();
SubState = reader.Read<ActorSubState>();
Flags = reader.Read<Flag>();

if (Flags.HasFlag(Flag.Flag1)) {
EmotionId = reader.ReadInt();
Flag1Unknown2 = reader.ReadShort();
}

Position = reader.Read<Vector3S>();
Rotation = reader.ReadShort(); // CoordS / 10 (Rotation?)
Animation = reader.ReadByte();
if (Animation > 127) { // if animation < 0 (signed)
if (Animation == 128) {
UnknownFloat1 = reader.ReadFloat();
UnknownFloat2 = reader.ReadFloat();
}
Expand All @@ -137,27 +117,26 @@ public virtual void ReadFrom(IByteReader reader) {
Rotation2 = reader.ReadShort(); // CoordS / 10
Unknown3 = reader.ReadShort(); // CoordS / 1000

Flags = reader.Read<Flag>();
if (Flags.HasFlag(Flag.Flag1)) {
Flag1Unknown = reader.ReadInt();
}
if (Flags.HasFlag(Flag.Flag2)) {
Flag2Unknown1 = reader.Read<Vector3>();
Flag2Unknown2 = reader.ReadUnicodeString();
Flag2Unknown = reader.ReadInt();
}
if (Flags.HasFlag(Flag.Flag3)) {
Flag3Unknown1 = reader.ReadInt();
Flag3Unknown2 = reader.ReadUnicodeString();
Flag3Unknown = reader.ReadShort();
}
if (Flags.HasFlag(Flag.Animation)) {
AnimationName = reader.ReadUnicodeString();
}
if (Flags.HasFlag(Flag.Flag5)) {
Flag5Unknown1 = reader.ReadInt();
Flag5Unknown1 = reader.Read<Vector3>();
Flag5Unknown2 = reader.ReadUnicodeString();
}
if (Flags.HasFlag(Flag.Flag6)) {
Flag6Unknown1 = reader.ReadInt();
Flag6Unknown2 = reader.ReadInt();
Flag6Unknown3 = reader.ReadByte();
Flag6Position = reader.Read<Vector3>();
Flag6Rotation = reader.Read<Vector3>();
Flag6Unknown2 = reader.ReadUnicodeString();
}

SyncNumber = reader.ReadInt();
Expand All @@ -169,13 +148,13 @@ public override string ToString() {
builder.AppendLine($" Position:{Position}, Rotation:{Rotation}, Speed:{Speed}");
builder.AppendLine($" Animation:{Animation} ({UnknownFloat1}, {UnknownFloat2}), Unknown1:{Unknown1}, Rotation2:{Rotation2}, Unknown3:{Unknown3}");
if (Flags.HasFlag(Flag.Flag1)) {
builder.Append($"Flag1: {EmotionId}, {Flag1Unknown2}");
builder.Append($"Flag1: {Flag1Unknown}");
}
if (Flags.HasFlag(Flag.Flag2)) {
builder.Append($"Flag2: {Flag2Unknown1}, {Flag2Unknown2}");
builder.Append($"Flag2: {Flag2Unknown}");
}
if (Flags.HasFlag(Flag.Flag3)) {
builder.Append($"Flag3: {Flag3Unknown1}, {Flag3Unknown2}");
builder.Append($"Flag3: {Flag3Unknown}");
}
if (Flags.HasFlag(Flag.Animation)) {
builder.Append($"Animation: {AnimationName}");
Expand All @@ -184,8 +163,7 @@ public override string ToString() {
builder.Append($"Flag5: {Flag5Unknown1}, {Flag5Unknown2}");
}
if (Flags.HasFlag(Flag.Flag6)) {
builder.Append($"Flag6: {Flag6Unknown1}, {Flag6Unknown2}, {Flag6Unknown3}");
builder.Append($"- Position:{Flag6Position}, Rotation:{Flag6Rotation}");
builder.Append($"Flag6: {Flag6Unknown1}, {Flag6Unknown2}");
}

return builder.ToString();
Expand Down
1 change: 1 addition & 0 deletions Maple2.Model/Game/User/SkillPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public void WriteTo(IByteWriter writer) {
writer.Write<SkillPointSource>(source);
writer.WriteClass<PointRank>(point);
}
writer.WriteInt();
}

public class PointRank : IByteSerializable {
Expand Down
Loading