Skip to content

Commit

Permalink
fix: fix Universalis query
Browse files Browse the repository at this point in the history
  • Loading branch information
zhyupe committed Oct 8, 2024
1 parent a3a1862 commit 2604b27
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 14 deletions.
2 changes: 2 additions & 0 deletions Cafe.Matcha/Constant/MatchaOpcode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ internal enum MatchaOpcode
MarketBoardItemListing,
MarketBoardItemListingCount,
MarketBoardItemListingHistory,
MarketBoardRequestItemListingInfo,
NpcSpawn,
PlayerSetup,
PlayerSpawn,
Expand Down Expand Up @@ -70,6 +71,7 @@ internal static class OpcodeStorage
{ 0x0333, MatchaOpcode.MarketBoardItemListing },
{ 0x0397, MatchaOpcode.MarketBoardItemListingCount },
{ 0x02f6, MatchaOpcode.MarketBoardItemListingHistory },
{ 0x81c8, MatchaOpcode.MarketBoardRequestItemListingInfo },
{ 0x032f, MatchaOpcode.NpcSpawn },
{ 0x01b1, MatchaOpcode.PlayerSetup },
{ 0x00a1, MatchaOpcode.PlayerSpawn },
Expand Down
71 changes: 61 additions & 10 deletions Cafe.Matcha/Network/NetworkMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,29 @@ internal interface INetworkMonitor

internal class NetworkMonitor : INetworkMonitor
{
private uint marketQueryItemId = 0;

public void HandleMessageReceived(string connection, long epoch, byte[] message)
{
try
{
HandleMessage(new Packet(message));
HandleMessage(new Packet(Packet.PacketSender.Server, message));
}
catch (Exception e)
{
try
{
FireException(e);
}
catch { }
}
}

public void HandleMessageSent(string connection, long epoch, byte[] message)
{
try
{
HandleMessage(new Packet(Packet.PacketSender.Client, message));
}
catch (Exception e)
{
Expand Down Expand Up @@ -55,11 +73,14 @@ private void HandleMessage(Packet packet)
}
#endif

TryHandleMessage(packet);
if (packet.Sender == Packet.PacketSender.Server)
{
TryHandleServerMessage(packet);
}
}
}

private void TryHandleMessage(Packet packet)
private void TryHandleServerMessage(Packet packet)
{
// Treasure Shifting Wheel Result
if (packet.DataLength == 88)
Expand All @@ -69,8 +90,7 @@ private void TryHandleMessage(Packet packet)
if (
level == 7636061 || // G10 运河宝物库神殿
level == 8508181 || // G12 梦羽宝殿
level == 9413549 // G15 育体宝殿
)
level == 9413549) // G15 育体宝殿
{
var result = (TreasureShiftingWheelResultType)data[40];
switch (result)
Expand Down Expand Up @@ -504,7 +524,42 @@ private bool HandleMessageByOpcode(Packet packet)
}
else if (opcode == MatchaOpcode.MarketBoardItemListingCount)
{
// Useless as ItemId is removed in 7.0
if (packet.DataLength != 8)
{
return false;
}

var status = BitConverter.ToUInt32(data, 0);
var count = BitConverter.ToUInt32(data, 4);
var itemId = marketQueryItemId;

if (status == 0 && itemId != 0) // OK
{
ThreadPool.QueueUserWorkItem(o => Universalis.Client.QueryItem(State.Instance.WorldId, itemId, FireEvent));
FireEvent(new MarketBoardItemListingCountDTO()
{
Item = (int)itemId,
Count = (int)count,
World = State.Instance.WorldId
});
}

marketQueryItemId = 0;
return true;
}
else if (opcode == MatchaOpcode.MarketBoardRequestItemListingInfo)
{
if (packet.DataLength != 8)
{
return false;
}

var itemId = BitConverter.ToUInt32(data, 0);
if (itemId != 0)
{
marketQueryItemId = itemId;
}

return true;
}
else if (opcode == MatchaOpcode.MarketBoardItemListing)
Expand Down Expand Up @@ -685,10 +740,6 @@ private void FireEvent(BaseDTO args)
OnReceiveEvent?.Invoke(args);
}

public void HandleMessageSent(string connection, long epoch, byte[] message)
{
}

#if DEBUG
private void LogIncorrectPacketSize(MatchaOpcode opcode, int size)
{
Expand Down
21 changes: 17 additions & 4 deletions Cafe.Matcha/Network/Packet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
{
using System;
using System.Linq;
using System.Windows.Forms;
using Cafe.Matcha.Constant;

internal class Packet
Expand All @@ -24,6 +23,11 @@ internal class Packet
/// </summary>
public byte SegmentType;

/// <summary>
/// Sender.
/// </summary>
public PacketSender Sender;

/// <summary>
/// Source.
/// </summary>
Expand All @@ -46,9 +50,11 @@ internal class Packet

public int DataLength => Bytes.Length - HeaderLength;

public Packet(byte[] bytes)
public Packet(PacketSender sender, byte[] bytes)
{
Sender = sender;
Bytes = bytes;

if (bytes.Length < HeaderLength)
{
return;
Expand All @@ -69,14 +75,15 @@ public Packet(byte[] bytes)

public bool GetMatchaOpcode(out MatchaOpcode matchaOpcode)
{
var key = Sender == PacketSender.Server ? Opcode : (ushort)(0x8000 | Opcode);
var region = Config.Instance.Region;
switch (region)
{
case Region.Global:
return OpcodeStorage.Global.TryGetValue(Opcode, out matchaOpcode);
return OpcodeStorage.Global.TryGetValue(key, out matchaOpcode);

case Region.China:
return OpcodeStorage.China.TryGetValue(Opcode, out matchaOpcode);
return OpcodeStorage.China.TryGetValue(key, out matchaOpcode);

default:
matchaOpcode = default;
Expand All @@ -88,5 +95,11 @@ public byte[] GetRawData()
{
return Bytes.Skip(HeaderLength).ToArray();
}

public enum PacketSender
{
Server,
Client
}
}
}

0 comments on commit 2604b27

Please sign in to comment.