diff --git a/network/mhfpacket/msg_mhf_read_mercenary_m.go b/network/mhfpacket/msg_mhf_read_mercenary_m.go index 75c973a74..957b35f3a 100644 --- a/network/mhfpacket/msg_mhf_read_mercenary_m.go +++ b/network/mhfpacket/msg_mhf_read_mercenary_m.go @@ -12,7 +12,7 @@ import ( type MsgMhfReadMercenaryM struct { AckHandle uint32 CharID uint32 - Unk0 uint32 + MercID uint32 } // Opcode returns the ID associated with this packet type. @@ -24,7 +24,7 @@ func (m *MsgMhfReadMercenaryM) Opcode() network.PacketID { func (m *MsgMhfReadMercenaryM) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() m.CharID = bf.ReadUint32() - m.Unk0 = bf.ReadUint32() + m.MercID = bf.ReadUint32() return nil } diff --git a/network/mhfpacket/msg_mhf_read_mercenary_w.go b/network/mhfpacket/msg_mhf_read_mercenary_w.go index c80afee14..fee9fc19d 100644 --- a/network/mhfpacket/msg_mhf_read_mercenary_w.go +++ b/network/mhfpacket/msg_mhf_read_mercenary_w.go @@ -11,7 +11,7 @@ import ( // MsgMhfReadMercenaryW represents the MSG_MHF_READ_MERCENARY_W type MsgMhfReadMercenaryW struct { AckHandle uint32 - Unk0 bool + GetPact bool Unk1 uint8 Unk2 uint16 // Hardcoded 0 in the binary } @@ -24,7 +24,7 @@ func (m *MsgMhfReadMercenaryW) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfReadMercenaryW) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() - m.Unk0 = bf.ReadBool() + m.GetPact = bf.ReadBool() m.Unk1 = bf.ReadUint8() m.Unk2 = bf.ReadUint16() return nil diff --git a/network/mhfpacket/msg_mhf_save_mercenary.go b/network/mhfpacket/msg_mhf_save_mercenary.go index 3aa2b0311..8a9ddb9f8 100644 --- a/network/mhfpacket/msg_mhf_save_mercenary.go +++ b/network/mhfpacket/msg_mhf_save_mercenary.go @@ -10,11 +10,10 @@ import ( // MsgMhfSaveMercenary represents the MSG_MHF_SAVE_MERCENARY type MsgMhfSaveMercenary struct { - AckHandle uint32 - GCP uint32 - Unk0 uint32 - MercData []byte - Unk1 uint32 + AckHandle uint32 + GCP uint32 + PactMercID uint32 + MercData []byte } // Opcode returns the ID associated with this packet type. @@ -27,9 +26,10 @@ func (m *MsgMhfSaveMercenary) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Clie m.AckHandle = bf.ReadUint32() bf.ReadUint32() // lenData m.GCP = bf.ReadUint32() - m.Unk0 = bf.ReadUint32() - m.MercData = bf.ReadBytes(uint(bf.ReadUint32())) - m.Unk1 = bf.ReadUint32() + m.PactMercID = bf.ReadUint32() + dataSize := bf.ReadUint32() + _ = bf.ReadUint32() // Merc index? + m.MercData = bf.ReadBytes(uint(dataSize)) return nil } diff --git a/patch-schema/rasta-id.sql b/patch-schema/rasta-id.sql new file mode 100644 index 000000000..14541e378 --- /dev/null +++ b/patch-schema/rasta-id.sql @@ -0,0 +1,9 @@ +BEGIN; + +UPDATE characters SET savemercenary = NULL; + +ALTER TABLE characters ADD rasta_id INT; + +ALTER TABLE characters ADD pact_id INT; + +END; \ No newline at end of file diff --git a/server/channelserver/handlers_mercenary.go b/server/channelserver/handlers_mercenary.go index bdeb924de..e6ba0b707 100644 --- a/server/channelserver/handlers_mercenary.go +++ b/server/channelserver/handlers_mercenary.go @@ -11,6 +11,7 @@ import ( "io/ioutil" "os" "path/filepath" + "time" ) // THERE ARE [PARTENER] [MERCENARY] [OTOMO AIRU] @@ -114,12 +115,6 @@ func handleMsgMhfSaveHunterNavi(s *Session, p mhfpacket.MHFPacket) { doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } -/////////////////////////////////////////// - -/////////////////////////////////////////// -/// MERCENARY // -/////////////////////////////////////////// - func handleMsgMhfMercenaryHuntdata(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfMercenaryHuntdata) if pkt.Unk0 == 1 { @@ -149,15 +144,11 @@ func handleMsgMhfEnumerateMercenaryLog(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfCreateMercenary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfCreateMercenary) - bf := byteframe.NewByteFrame() - var nextID uint32 - s.server.db.QueryRow("SELECT nextval('rasta_id_seq')").Scan(&nextID) - - bf.WriteUint32(nextID) // New MercID - bf.WriteUint32(0xDEADBEEF) // Unk - + _ = s.server.db.QueryRow("SELECT nextval('rasta_id_seq')").Scan(&nextID) + s.server.db.Exec("UPDATE characters SET rasta_id=$1 WHERE id=$2", nextID, s.charID) + bf.WriteUint32(nextID) doAckSimpleSucceed(s, pkt.AckHandle, bf.Data()) } @@ -165,29 +156,48 @@ func handleMsgMhfSaveMercenary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfSaveMercenary) dumpSaveData(s, pkt.MercData, "mercenary") if len(pkt.MercData) > 0 { - s.server.db.Exec("UPDATE characters SET savemercenary=$1 WHERE id=$2", pkt.MercData, s.charID) + temp := byteframe.NewByteFrameFromBytes(pkt.MercData) + s.server.db.Exec("UPDATE characters SET savemercenary=$1, rasta_id=$2 WHERE id=$3", pkt.MercData, temp.ReadUint32(), s.charID) } - s.server.db.Exec("UPDATE characters SET gcp=$1 WHERE id=$2", pkt.GCP, s.charID) + s.server.db.Exec("UPDATE characters SET gcp=$1, pact_id=$2 WHERE id=$3", pkt.GCP, pkt.PactMercID, s.charID) doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } func handleMsgMhfReadMercenaryW(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReadMercenaryW) - if pkt.Unk0 { - doAckBufSucceed(s, pkt.AckHandle, make([]byte, 2)) + if pkt.GetPact { + var pactID uint32 + s.server.db.QueryRow("SELECT pact_id FROM characters WHERE id=$1", s.charID).Scan(&pactID) + if pactID > 0 { + var name string + var cid uint32 + s.server.db.QueryRow("SELECT name, id FROM characters WHERE rasta_id = $1", pactID).Scan(&name, &cid) + bf := byteframe.NewByteFrame() + bf.WriteBool(true) + bf.WriteUint32(pactID) + bf.WriteUint32(cid) + bf.WriteBool(true) + bf.WriteUint32(uint32(Time_Current_Adjusted().Unix())) + bf.WriteUint32(uint32(Time_Current_Adjusted().Add(time.Hour * 24 * 7).Unix())) + bf.WriteBytes(stringsupport.PaddedString(name, 18, true)) + bf.WriteBool(false) + } else { + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 2)) + } return } var data []byte var gcp uint32 - s.server.db.QueryRow("SELECT savemercenary FROM characters WHERE id = $1", s.charID).Scan(&data) - s.server.db.QueryRow("SELECT COALESCE(gcp, 0) FROM characters WHERE id = $1", s.charID).Scan(&gcp) + s.server.db.QueryRow("SELECT savemercenary FROM characters WHERE id=$1", s.charID).Scan(&data) + s.server.db.QueryRow("SELECT COALESCE(gcp, 0) FROM characters WHERE id=$1", s.charID).Scan(&gcp) resp := byteframe.NewByteFrame() + resp.WriteUint16(0) if len(data) == 0 { - resp.WriteBytes(make([]byte, 3)) + resp.WriteBool(false) } else { - resp.WriteBytes(data[1:]) - resp.WriteUint32(0) // Unk + resp.WriteBool(true) + resp.WriteBytes(data) } resp.WriteUint32(gcp) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) @@ -201,7 +211,7 @@ func handleMsgMhfReadMercenaryM(s *Session, p mhfpacket.MHFPacket) { if len(data) == 0 { resp.WriteBool(false) } else { - resp.WriteBytes(data[4:]) + resp.WriteBytes(data) } doAckBufSucceed(s, pkt.AckHandle, resp.Data()) }