Support 6.3 HotFix (#138)

* Support 6.3 HotFix

* FATE begin/end code
This commit is contained in:
ksh 2023-01-15 05:09:11 +09:00 committed by GitHub
parent 4c4ecddbd2
commit 6bc453117f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 1841 additions and 1737 deletions

View file

@ -1,11 +1,12 @@
# DutyPacket configuration
# packet
Version=2006282
Description=6.28 HotFix
OpFate=568
OpDuty=378
OpMatch=371
OpInstance=389
OpZone=731
Version=2006300
Description=6.3 HotFix
OpFate=623
OpDuty=368
OpMatch=907
OpInstance=455
OpZone=405
OpSouthernBozja=0

View file

@ -4,8 +4,8 @@
* Duty finding codes from https://github.com/purutu/ACT.DFAssist
* Network analyzer codes from https://github.com/Noisyfox/ACT.FFXIVPing
## Not Working on 6.3
Packet structure has changed. DutyContent doesn't work until fix this problem. Sorry!!! 😭
## 6.3 HotFix
Working again 😭
---
@ -16,7 +16,3 @@ Revi 님께서 작성하신 Wiki가 있어 링크합니다. 정리가 잘되어
6.2부터 패킷이 바뀌어서 6.1 및 그 이전 버전과 호환이 되지 않습니다. 버전 27에 한국판을 감지하는 기능을 넣었고 이 버전으로 업데이트 하시면 문제없이 동작합니다.
한국판이 6.2로 업데이트가 예정되면 그때 SQEX판과 동일하게 작동하도록 다시금 변경하겠습니다.
6.1에서 동작하는 것 확인했습니다. 패킷은 자동으로 업뎃됩니다
※ 6.3에서 패킷이 변경되어 변경점을 찾을 때까지 6.3에서 동작하지 않아요;;;

View file

@ -240,6 +240,8 @@ namespace DutyContent.Tab
var fcode = BitConverter.ToUInt16(data, 4);
if (fcode > 100)
{
if (DcConfig.Duty.PacketForLocal)
{
// 53=begin, 54=end, 62=progress
if (data[0] == 53)
@ -279,6 +281,52 @@ namespace DutyContent.Tab
TraceFate(fcode, false, fate);
}
}
else
{
// 52,49,66=begin / 55=probably npc contact point
// 60=progress
// 53=end
if (data[0] == 49)
{
var fate = DcContent.GetFate(fcode);
TraceFate(fcode, true, fate, 0);
if (DcConfig.Duty.Fates[DcConfig.Duty.ActiveFate].Selected.Contains(fcode))
{
PlayEffectSoundFate();
NotifyFate(fate);
_overlay.PlayFate(fate);
}
_last_fate = fcode;
}
else if (data[0] == 60 && data[8] > 0) // more than 0%
{
var fate = DcContent.TryFate(fcode);
if (fate != null)
{
var rate = data[8] >= 100 ? -1 : data[8];
TraceFate(fcode, false, fate, rate);
}
else
{
if (DcConfig.DebugEnable)
{
WriteLog(Color.Magenta, 37, 12, fcode);
_last_fate = fcode;
}
}
}
else if (data[0] == 53)
{
var fate = DcContent.TryFate(fcode);
if (fate != null)
TraceFate(fcode, false, fate);
}
}
}
}
// Duty
@ -1552,6 +1600,26 @@ namespace DutyContent.Tab
return -1;
}
private static (int Pos, int Value) IndexOfValues(byte[] data, int index, params ushort[] values)
{
int len = data.Length;
for (int i = index; i < len; i++)
{
if (i + 1 >= len)
break;
ushort n = BitConverter.ToUInt16(data, i);
for (int u = 0; u < values.Length; u++)
{
if (values[u] == n)
return (i, n);
}
}
return (-1, 0);
}
#endif
//
@ -1571,13 +1639,37 @@ namespace DutyContent.Tab
}
else
#endif
#if false
// 매칭 관련
if (opcode == 548 || opcode == 288 || opcode == 880 || opcode == 460)
if (opcode == 368)
{
var s = DataToByteString(data);
Logger.L("{0}({1}) => {2}", opcode, data.Length, s);
}
#endif
#if true
// 페이트
(int t, int v) = IndexOfValues(data, 0,
// middle la noscea
553, 649, 687, 688, 693, 717, 220, 221, 222, 223, 225,
226, 227, 229, 231, 233, 235, 237, 238, 239, 240, 1387,
1597, 1598, 1599,
// southern bozja
1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619,
1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628);
if (opcode == 623 && t > 0 && data[0] != 0x3C)
{
var s = DataToByteString(data);
Logger.L("페이트: {0}({1}:{1:X})({2},{3}) => {4}", opcode, v, data.Length, t, s);
}
#endif
#endif
// fate & duty & packet
if (DcConfig.Duty.PacketForLocal)
{
// for ACTOZ/Korean service
// fate
if (_new_packet.OpFate == 0 && data.Length > 4 && data[0] == 0x3E)
@ -1599,11 +1691,6 @@ namespace DutyContent.Tab
}
}
// duty & packet
if (DcConfig.Duty.PacketForLocal)
{
// for ACTOZ/Korean service
// duty
if (_new_packet.OpDuty == 0 && data.Length > 12)
{
@ -1654,6 +1741,26 @@ namespace DutyContent.Tab
{
// for common
// fate
if (_new_packet.OpFate == 0 && data.Length > 20 && data[0] == 0x3C) // real size is 32
{
var cc = BitConverter.ToUInt16(data, 4);
if (IsFateInFindList(cc) && _new_packet.OpFate != opcode)
{
_new_packet.OpFate = opcode;
WorkerAct.Invoker(() =>
{
lstPacketInfo.Items[0].SubItems[2].Text = Locale.Text(10016);
lstPacketInfo.Items[0].SubItems[3].Text = _new_packet.OpFate.ToString();
});
_last_fate = cc;
return;
}
}
// duty
if (_new_packet.OpDuty == 0 && data.Length > 20) // real size is 40
{