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 # DutyPacket configuration
# packet # packet
Version=2006282 Version=2006300
Description=6.28 HotFix Description=6.3 HotFix
OpFate=568 OpFate=623
OpDuty=378 OpDuty=368
OpMatch=371 OpMatch=907
OpInstance=389 OpInstance=455
OpZone=731 OpZone=405
OpSouthernBozja=0 OpSouthernBozja=0

View file

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

View file

@ -240,6 +240,8 @@ namespace DutyContent.Tab
var fcode = BitConverter.ToUInt16(data, 4); var fcode = BitConverter.ToUInt16(data, 4);
if (fcode > 100) if (fcode > 100)
{
if (DcConfig.Duty.PacketForLocal)
{ {
// 53=begin, 54=end, 62=progress // 53=begin, 54=end, 62=progress
if (data[0] == 53) if (data[0] == 53)
@ -279,6 +281,52 @@ namespace DutyContent.Tab
TraceFate(fcode, false, fate); 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 // Duty
@ -1552,6 +1600,26 @@ namespace DutyContent.Tab
return -1; 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 #endif
// //
@ -1571,13 +1639,37 @@ namespace DutyContent.Tab
} }
else else
#endif #endif
#if false
// 매칭 관련 // 매칭 관련
if (opcode == 548 || opcode == 288 || opcode == 880 || opcode == 460) if (opcode == 368)
{ {
var s = DataToByteString(data); var s = DataToByteString(data);
Logger.L("{0}({1}) => {2}", opcode, data.Length, s); Logger.L("{0}({1}) => {2}", opcode, data.Length, s);
} }
#endif #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 // fate
if (_new_packet.OpFate == 0 && data.Length > 4 && data[0] == 0x3E) 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 // duty
if (_new_packet.OpDuty == 0 && data.Length > 12) if (_new_packet.OpDuty == 0 && data.Length > 12)
{ {
@ -1654,6 +1741,26 @@ namespace DutyContent.Tab
{ {
// for common // 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 // duty
if (_new_packet.OpDuty == 0 && data.Length > 20) // real size is 40 if (_new_packet.OpDuty == 0 && data.Length > 20) // real size is 40
{ {