From 49682524917415dc3f0ca960d5f095be7c5f8737 Mon Sep 17 00:00:00 2001 From: wish Date: Mon, 8 Aug 2022 18:21:54 +1000 Subject: [PATCH] initial mercenaries build --- patch-schema/mercenary.sql | 5 ++ server/channelserver/handlers_mercenary.go | 55 ++++++++++------------ 2 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 patch-schema/mercenary.sql diff --git a/patch-schema/mercenary.sql b/patch-schema/mercenary.sql new file mode 100644 index 000000000..f67e4fe4e --- /dev/null +++ b/patch-schema/mercenary.sql @@ -0,0 +1,5 @@ +BEGIN; + +CREATE SEQUENCE IF NOT EXISTS public.rasta_id_seq; + +END; \ No newline at end of file diff --git a/server/channelserver/handlers_mercenary.go b/server/channelserver/handlers_mercenary.go index 606579fe5..bbcf5dceb 100644 --- a/server/channelserver/handlers_mercenary.go +++ b/server/channelserver/handlers_mercenary.go @@ -9,7 +9,6 @@ import ( "go.uber.org/zap" "io" "io/ioutil" - "math/rand" "os" "path/filepath" ) @@ -132,8 +131,11 @@ func handleMsgMhfCreateMercenary(s *Session, p mhfpacket.MHFPacket) { bf := byteframe.NewByteFrame() - bf.WriteUint32(0x00) // Unk - bf.WriteUint32(rand.Uint32()) // Partner ID? + var nextID uint32 + s.server.db.QueryRow("SELECT nextval('rasta_id_seq')").Scan(&nextID) + + bf.WriteUint32(nextID) // New MercID + bf.WriteUint32(0xDEADBEEF) // Unk doAckSimpleSucceed(s, pkt.AckHandle, bf.Data()) } @@ -141,24 +143,16 @@ func handleMsgMhfCreateMercenary(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfSaveMercenary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfSaveMercenary) bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) - GCPValue := bf.ReadUint32() + GCP := bf.ReadUint32() _ = bf.ReadUint32() // unk MercDataSize := bf.ReadUint32() MercData := bf.ReadBytes(uint(MercDataSize)) _ = bf.ReadUint32() // unk if MercDataSize > 0 { - // the save packet has an extra null byte after its size - _, err := s.server.db.Exec("UPDATE characters SET savemercenary=$1 WHERE id=$2", MercData[:MercDataSize], s.charID) - if err != nil { - s.logger.Fatal("Failed to update savemercenary and gcp in db", zap.Error(err)) - } - } - // gcp value is always present regardless - _, err := s.server.db.Exec("UPDATE characters SET gcp=$1 WHERE id=$2", GCPValue, s.charID) - if err != nil { - s.logger.Fatal("Failed to update savemercenary and gcp in db", zap.Error(err)) + s.server.db.Exec("UPDATE characters SET savemercenary=$1 WHERE id=$2", MercData[:MercDataSize], s.charID) } + s.server.db.Exec("UPDATE characters SET gcp=$1 WHERE id=$2", GCP, s.charID) doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } @@ -166,31 +160,32 @@ func handleMsgMhfReadMercenaryW(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReadMercenaryW) var data []byte var gcp uint32 - // still has issues - err := s.server.db.QueryRow("SELECT savemercenary FROM characters WHERE id = $1", s.charID).Scan(&data) - if err != nil { - s.logger.Fatal("Failed to get savemercenary data from db", zap.Error(err)) - } - - err = s.server.db.QueryRow("SELECT COALESCE(gcp, 0) FROM characters WHERE id = $1", s.charID).Scan(&gcp) - if err != nil { - panic(err) - } - if len(data) == 0 { - data = []byte{0x00} - } + 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.WriteBytes(data) resp.WriteUint16(0) + if len(data) == 0 { + resp.WriteBool(false) + } else { + resp.WriteBool(true) + resp.WriteBytes(data) + } resp.WriteUint32(gcp) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) } func handleMsgMhfReadMercenaryM(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReadMercenaryM) - // accessing actual rasta data of someone else still unsure of the formatting of this - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + var data []byte + s.server.db.QueryRow("SELECT savemercenary FROM characters WHERE id = $1", pkt.CharID).Scan(&data) + resp := byteframe.NewByteFrame() + if len(data) == 0 { + resp.WriteBool(false) + } else { + resp.WriteBytes(data[4:]) + } + doAckBufSucceed(s, pkt.AckHandle, resp.Data()) } func handleMsgMhfContractMercenary(s *Session, p mhfpacket.MHFPacket) {}