diff --git a/network/mhfpacket/msg_mhf_contract_mercenary.go b/network/mhfpacket/msg_mhf_contract_mercenary.go index a139dabb9..1dad97253 100644 --- a/network/mhfpacket/msg_mhf_contract_mercenary.go +++ b/network/mhfpacket/msg_mhf_contract_mercenary.go @@ -13,7 +13,7 @@ type MsgMhfContractMercenary struct { AckHandle uint32 PactMercID uint32 CID uint32 - Cancel bool + Op uint8 } // Opcode returns the ID associated with this packet type. @@ -26,7 +26,7 @@ func (m *MsgMhfContractMercenary) Parse(bf *byteframe.ByteFrame, ctx *clientctx. m.AckHandle = bf.ReadUint32() m.PactMercID = bf.ReadUint32() m.CID = bf.ReadUint32() - m.Cancel = bf.ReadBool() + m.Op = bf.ReadUint8() return nil } diff --git a/server/channelserver/handlers_mercenary.go b/server/channelserver/handlers_mercenary.go index f13687d04..6eea2a9a6 100644 --- a/server/channelserver/handlers_mercenary.go +++ b/server/channelserver/handlers_mercenary.go @@ -166,27 +166,42 @@ func handleMsgMhfSaveMercenary(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfReadMercenaryW(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReadMercenaryW) if pkt.Op > 0 { + bf := byteframe.NewByteFrame() var pactID uint32 + var name string + var cid 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.WriteUint8(1) // numLends bf.WriteUint32(pactID) bf.WriteUint32(cid) - bf.WriteBool(true) + bf.WriteBool(false) // ? bf.WriteUint32(uint32(Time_Current_Adjusted().Add(time.Hour * 24 * -8).Unix())) bf.WriteUint32(uint32(Time_Current_Adjusted().Add(time.Hour * 24 * -1).Unix())) bf.WriteBytes(stringsupport.PaddedString(name, 18, true)) - if pkt.Op == 1 { - bf.WriteBool(false) - } - doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } else { - doAckBufSucceed(s, pkt.AckHandle, make([]byte, 2)) + bf.WriteUint8(0) } + + if pkt.Op < 2 { + var loans uint8 + temp := byteframe.NewByteFrame() + rows, _ := s.server.db.Query("SELECT name, id, pact_id FROM characters WHERE pact_id=(SELECT rasta_id FROM characters WHERE id=$1)", s.charID) + for rows.Next() { + loans++ + rows.Scan(&name, &cid, &pactID) + temp.WriteUint32(pactID) + temp.WriteUint32(cid) + temp.WriteUint32(uint32(Time_Current_Adjusted().Add(time.Hour * 24 * -8).Unix())) + temp.WriteUint32(uint32(Time_Current_Adjusted().Add(time.Hour * 24 * -1).Unix())) + temp.WriteBytes(stringsupport.PaddedString(name, 18, true)) + } + bf.WriteUint8(loans) + bf.WriteBytes(temp.Data()) + } + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) return } var data []byte @@ -221,10 +236,13 @@ func handleMsgMhfReadMercenaryM(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfContractMercenary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfContractMercenary) - if pkt.Cancel { - s.server.db.Exec("UPDATE characters SET pact_id=0 WHERE id=$1", s.charID) - } else { + switch pkt.Op { + case 0: s.server.db.Exec("UPDATE characters SET pact_id=$1 WHERE id=$2", pkt.PactMercID, s.charID) + case 1: // Cancel lend + s.server.db.Exec("UPDATE characters SET pact_id=0 WHERE id=$1", s.charID) + case 2: // Cancel loan + s.server.db.Exec("UPDATE characters SET pact_id=0 WHERE id=$1", pkt.CID) } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) }