From 18989e9435d70a481279166b3e77f07890f94d9e Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 16:25:32 +1000 Subject: [PATCH 1/7] initial netcafe implementation --- ...g_mhf_post_cafe_duration_bonus_received.go | 19 +- network/mhfpacket/msg_mhf_start_boost_time.go | 17 +- patch-schema/netcafe.sql | 21 +++ server/channelserver/handlers.go | 67 +------ server/channelserver/handlers_cafe.go | 178 ++++++++++++++++++ server/channelserver/handlers_event.go | 2 - server/channelserver/handlers_tactics.go | 9 - 7 files changed, 226 insertions(+), 87 deletions(-) create mode 100644 patch-schema/netcafe.sql create mode 100644 server/channelserver/handlers_cafe.go diff --git a/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go b/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go index c89159c0c..be8947f2c 100644 --- a/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go +++ b/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go @@ -1,15 +1,19 @@ package mhfpacket -import ( - "errors" +import ( + "errors" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgMhfPostCafeDurationBonusReceived represents the MSG_MHF_POST_CAFE_DURATION_BONUS_RECEIVED -type MsgMhfPostCafeDurationBonusReceived struct{} +type MsgMhfPostCafeDurationBonusReceived struct { + AckHandle uint32 + Unk0 uint32 + CafeBonusID uint32 +} // Opcode returns the ID associated with this packet type. func (m *MsgMhfPostCafeDurationBonusReceived) Opcode() network.PacketID { @@ -18,7 +22,10 @@ func (m *MsgMhfPostCafeDurationBonusReceived) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfPostCafeDurationBonusReceived) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { - return errors.New("NOT IMPLEMENTED") + m.AckHandle = bf.ReadUint32() + m.Unk0 = bf.ReadUint32() + m.CafeBonusID = bf.ReadUint32() + return nil } // Build builds a binary packet from the current data. diff --git a/network/mhfpacket/msg_mhf_start_boost_time.go b/network/mhfpacket/msg_mhf_start_boost_time.go index ff424aca9..583ab3ab0 100644 --- a/network/mhfpacket/msg_mhf_start_boost_time.go +++ b/network/mhfpacket/msg_mhf_start_boost_time.go @@ -1,15 +1,18 @@ package mhfpacket -import ( - "errors" +import ( + "errors" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgMhfStartBoostTime represents the MSG_MHF_START_BOOST_TIME -type MsgMhfStartBoostTime struct{} +type MsgMhfStartBoostTime struct { + AckHandle uint32 + Unk0 uint32 +} // Opcode returns the ID associated with this packet type. func (m *MsgMhfStartBoostTime) Opcode() network.PacketID { @@ -18,7 +21,9 @@ func (m *MsgMhfStartBoostTime) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfStartBoostTime) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { - return errors.New("NOT IMPLEMENTED") + m.AckHandle = bf.ReadUint32() + m.Unk0 = bf.ReadUint32() + return nil } // Build builds a binary packet from the current data. diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql new file mode 100644 index 000000000..6bef530cc --- /dev/null +++ b/patch-schema/netcafe.sql @@ -0,0 +1,21 @@ +BEGIN; + +ALTER TABLE IF EXISTS public.characters + ADD COLUMN cafe_time integer DEFAULT 0; + +CREATE TABLE IF NOT EXISTS public.cafebonus +( + id integer NOT NULL PRIMARY KEY, + line integer NOT NULL, + itemclass integer NOT NULL, + itemid integer NOT NULL, + tradequantity integer NOT NULL +); + +CREATE TABLE IF NOT EXISTS public.cafe_accepted +( + cafe_id integer NOT NULL, + character_id integer NOT NULL +); + +END; \ No newline at end of file diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index d3497eae9..d409fdde8 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -10,16 +10,14 @@ import ( "net" "strings" - "io/ioutil" - "math/bits" - "math/rand" - "time" - "erupe-ce/common/byteframe" "erupe-ce/network/mhfpacket" "go.uber.org/zap" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" + "io/ioutil" + "math/bits" + "math/rand" ) // Temporary function to just return no results for a MSG_MHF_ENUMERATE* packet @@ -641,65 +639,6 @@ func handleMsgMhfUpdateUnionItem(s *Session, p mhfpacket.MHFPacket) { doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } -func handleMsgMhfAcquireCafeItem(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfAcquireCafeItem) - var netcafe_points int - err := s.server.db.QueryRow("UPDATE characters SET netcafe_points = netcafe_points - $1 WHERE id = $2 RETURNING netcafe_points", pkt.PointCost, s.charID).Scan(&netcafe_points) - if err != nil { - s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) - } - resp := byteframe.NewByteFrame() - resp.WriteUint32(uint32(netcafe_points)) - doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) -} - -func handleMsgMhfUpdateCafepoint(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfUpdateCafepoint) - var netcafe_points int - err := s.server.db.QueryRow("SELECT COALESCE(netcafe_points, 0) FROM characters WHERE id = $1", s.charID).Scan(&netcafe_points) - if err != nil { - s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) - } - resp := byteframe.NewByteFrame() - resp.WriteUint32(0) - resp.WriteUint32(uint32(netcafe_points)) - doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) -} - -func handleMsgMhfCheckDailyCafepoint(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfCheckDailyCafepoint) - - // I am not sure exactly what this does, but all responses I have seen include this exact sequence of bytes - // 1 daily, 5 daily halk pots, 3 point boosted quests, also adds 5 netcafe points but not sent to client - // available once after midday every day - - // get next midday - var t = Time_static() - year, month, day := t.Date() - midday := time.Date(year, month, day, 12, 0, 0, 0, t.Location()) - if t.After(midday) { - midday = midday.Add(24 * time.Hour) - } - - // get time after which daily claiming would be valid from db - var dailyTime time.Time - err := s.server.db.QueryRow("SELECT COALESCE(daily_time, $2) FROM characters WHERE id = $1", s.charID, time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)).Scan(&dailyTime) - if err != nil { - s.logger.Fatal("Failed to get daily_time savedata from db", zap.Error(err)) - } - - if t.After(dailyTime) { - // +5 netcafe points and setting next valid window - _, err := s.server.db.Exec("UPDATE characters SET daily_time=$1, netcafe_points=netcafe_points::int + 5 WHERE id=$2", midday, s.charID) - if err != nil { - s.logger.Fatal("Failed to update daily_time and netcafe_points savedata in db", zap.Error(err)) - } - doAckBufSucceed(s, pkt.AckHandle, []byte{0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01}) - } else { - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) - } -} - func handleMsgMhfGetCogInfo(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfCheckWeeklyStamp(s *Session, p mhfpacket.MHFPacket) { diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go new file mode 100644 index 000000000..8692864cf --- /dev/null +++ b/server/channelserver/handlers_cafe.go @@ -0,0 +1,178 @@ +package channelserver + +import ( + "erupe-ce/common/byteframe" + ps "erupe-ce/common/pascalstring" + "erupe-ce/network/mhfpacket" + "go.uber.org/zap" + "time" +) + +func handleMsgMhfAcquireCafeItem(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfAcquireCafeItem) + var netcafe_points int + err := s.server.db.QueryRow("UPDATE characters SET netcafe_points = netcafe_points - $1 WHERE id = $2 RETURNING netcafe_points", pkt.PointCost, s.charID).Scan(&netcafe_points) + if err != nil { + s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) + } + resp := byteframe.NewByteFrame() + resp.WriteUint32(uint32(netcafe_points)) + doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) +} + +func handleMsgMhfUpdateCafepoint(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfUpdateCafepoint) + var netcafe_points int + err := s.server.db.QueryRow("SELECT COALESCE(netcafe_points, 0) FROM characters WHERE id = $1", s.charID).Scan(&netcafe_points) + if err != nil { + s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) + } + resp := byteframe.NewByteFrame() + resp.WriteUint32(0) + resp.WriteUint32(uint32(netcafe_points)) + doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) +} + +func handleMsgMhfCheckDailyCafepoint(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfCheckDailyCafepoint) + + // I am not sure exactly what this does, but all responses I have seen include this exact sequence of bytes + // 1 daily, 5 daily halk pots, 3 point boosted quests, also adds 5 netcafe points but not sent to client + // available once after midday every day + + // get next midday + var t = Time_static() + year, month, day := t.Date() + midday := time.Date(year, month, day, 12, 0, 0, 0, t.Location()) + if t.After(midday) { + midday = midday.Add(24 * time.Hour) + } + + // get time after which daily claiming would be valid from db + var dailyTime time.Time + err := s.server.db.QueryRow("SELECT COALESCE(daily_time, $2) FROM characters WHERE id = $1", s.charID, time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)).Scan(&dailyTime) + if err != nil { + s.logger.Fatal("Failed to get daily_time savedata from db", zap.Error(err)) + } + + if t.After(dailyTime) { + // +5 netcafe points and setting next valid window + _, err := s.server.db.Exec("UPDATE characters SET daily_time=$1, netcafe_points=netcafe_points::int + 5 WHERE id=$2", midday, s.charID) + if err != nil { + s.logger.Fatal("Failed to update daily_time and netcafe_points savedata in db", zap.Error(err)) + } + doAckBufSucceed(s, pkt.AckHandle, []byte{0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01}) + } else { + doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) + } +} + +func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfGetCafeDuration) + bf := byteframe.NewByteFrame() + + var cafeTime uint32 + err := s.server.db.QueryRow("SELECT cafe_time FROM characters WHERE id = $1", s.charID).Scan(&cafeTime) + if err != nil { + panic(err) + } + cafeTime = uint32(Time_Current_Adjusted().Unix()) - uint32(s.sessionStart) + cafeTime + bf.WriteUint32(cafeTime) // Total hours + bf.WriteUint16(0) + ps.Uint16(bf, "Resets at next maintenance", true) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) +} + +type CafeBonus struct { + ID uint32 `db:"id"` + Line uint32 `db:"line"` + ItemClass uint32 `db:"itemclass"` + ItemID uint32 `db:"itemid"` + TradeQuantity uint32 `db:"tradequantity"` + FlagCount uint8 `db:"flagcount"` +} + +func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfGetCafeDurationBonusInfo) + bf := byteframe.NewByteFrame() + + var count uint32 + rows, err := s.server.db.Queryx(` + SELECT cb.id, line, itemclass, itemid, tradequantity, + ( + SELECT count(*) + FROM cafe_accepted ca + WHERE cb.id = ca.cafe_id AND ca.character_id = $1 + ) AS flagcount + FROM cafebonus cb ORDER BY id ASC;`, s.charID) + if err != nil { + s.logger.Error("Error getting cafebonus", zap.Error(err)) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4)) + } else { + for rows.Next() { + count++ + Cafes := &CafeBonus{} + err = rows.StructScan(&Cafes) + if err != nil { + s.logger.Error("Error scanning cafebonus", zap.Error(err)) + } + bf.WriteUint32(Cafes.Line) // Time + bf.WriteUint32(0) // Unk + bf.WriteUint32(Cafes.ItemID) + bf.WriteUint32(Cafes.TradeQuantity) + bf.WriteUint8(Cafes.FlagCount) + } + resp := byteframe.NewByteFrame() + resp.WriteUint32(0) + resp.WriteUint32(uint32(time.Now().Unix())) //timestamp + resp.WriteUint32(count) + resp.WriteBytes(bf.Data()) + doAckBufSucceed(s, pkt.AckHandle, resp.Data()) + } +} + +func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfReceiveCafeDurationBonus) + bf := byteframe.NewByteFrame() + + row := s.server.db.QueryRowx(` + SELECT c.id, c.line, itemclass, itemid, tradequantity + FROM cafebonus c + WHERE ( + SELECT count(*) + FROM cafe_accepted ca + WHERE c.id = ca.cafe_id AND ca.character_id = $1 + ) < 1 AND ( + SELECT ch.cafe_time + $2 + FROM characters ch + WHERE ch.id = $1 + ) >= c.line LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) + Cafe := &CafeBonus{} + err := row.StructScan(Cafe) + if err != nil { + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 8)) + return + } + bf.WriteUint32(1) + bf.WriteUint32(Cafe.ID) + bf.WriteUint32(Cafe.ItemClass) + bf.WriteUint32(Cafe.ItemID) + bf.WriteUint32(Cafe.TradeQuantity) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) +} + +func handleMsgMhfPostCafeDurationBonusReceived(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfPostCafeDurationBonusReceived) + + _, err := s.server.db.Exec("INSERT INTO public.cafe_accepted VALUES ($1, $2)", pkt.CafeBonusID, s.charID) + if err != nil { + s.logger.Error("Error updating accepted CafeBonus count", zap.Error(err)) + } + + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) +} + +func handleMsgMhfStartBoostTime(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfStartBoostTime) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) +} diff --git a/server/channelserver/handlers_event.go b/server/channelserver/handlers_event.go index af16799c7..87ae246af 100644 --- a/server/channelserver/handlers_event.go +++ b/server/channelserver/handlers_event.go @@ -325,8 +325,6 @@ func handleMsgMhfPostBoostTimeQuestReturn(s *Session, p mhfpacket.MHFPacket) { doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } -func handleMsgMhfStartBoostTime(s *Session, p mhfpacket.MHFPacket) {} - func handleMsgMhfPostBoostTime(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfPostBoostTimeLimit(s *Session, p mhfpacket.MHFPacket) {} diff --git a/server/channelserver/handlers_tactics.go b/server/channelserver/handlers_tactics.go index 585c0ef79..4991ce846 100644 --- a/server/channelserver/handlers_tactics.go +++ b/server/channelserver/handlers_tactics.go @@ -2,7 +2,6 @@ package channelserver import ( "encoding/hex" - "erupe-ce/network/mhfpacket" ) @@ -58,11 +57,3 @@ func handleMsgMhfGetUdTacticsRanking(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfSetUdTacticsFollower(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfGetUdTacticsLog(s *Session, p mhfpacket.MHFPacket) {} - -func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) {} - -func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) {} - -func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) {} - -func handleMsgMhfPostCafeDurationBonusReceived(s *Session, p mhfpacket.MHFPacket) {} From 3bb0ab62955ad30358f233baba04d36dd10285ef Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 17:21:24 +1000 Subject: [PATCH 2/7] cleanup logic and update cafe time --- patch-schema/netcafe.sql | 8 ++-- server/channelserver/handlers.go | 25 +++++----- server/channelserver/handlers_cafe.go | 66 +++++++++++++-------------- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql index 6bef530cc..cfd85e5f8 100644 --- a/patch-schema/netcafe.sql +++ b/patch-schema/netcafe.sql @@ -6,10 +6,10 @@ ALTER TABLE IF EXISTS public.characters CREATE TABLE IF NOT EXISTS public.cafebonus ( id integer NOT NULL PRIMARY KEY, - line integer NOT NULL, - itemclass integer NOT NULL, - itemid integer NOT NULL, - tradequantity integer NOT NULL + minutes_req integer NOT NULL, + item_type integer NOT NULL, + item_id integer NOT NULL, + quantity integer NOT NULL ); CREATE TABLE IF NOT EXISTS public.cafe_accepted diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index d409fdde8..26447a2fb 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -190,8 +190,12 @@ func handleMsgSysLogout(s *Session, p mhfpacket.MHFPacket) { } func logoutPlayer(s *Session) { - delete(s.server.sessions, s.rawConn) - s.rawConn.Close() + if _, exists := s.server.sessions[s.rawConn]; exists { + delete(s.server.sessions, s.rawConn) + s.rawConn.Close() + } else { + return // Prevent re-running logout logic on real logouts + } _, err := s.server.db.Exec("UPDATE sign_sessions SET server_id=NULL, char_id=NULL WHERE token=$1", s.token) if err != nil { @@ -204,13 +208,13 @@ func logoutPlayer(s *Session) { } var timePlayed int + var sessionTime int _ = s.server.db.QueryRow("SELECT time_played FROM characters WHERE id = $1", s.charID).Scan(&timePlayed) - - timePlayed = (int(Time_Current_Adjusted().Unix()) - int(s.sessionStart)) + timePlayed + sessionTime = int(Time_Current_Adjusted().Unix()) - int(s.sessionStart) + timePlayed += sessionTime var rpGained int - - if s.rights > 0x40000000 { // N Course + if s.rights >= 0x40000000 { // N Course rpGained = timePlayed / 900 timePlayed = timePlayed % 900 } else { @@ -218,10 +222,10 @@ func logoutPlayer(s *Session) { timePlayed = timePlayed % 1800 } - _, err = s.server.db.Exec("UPDATE characters SET time_played = $1 WHERE id = $2", timePlayed, s.charID) - if err != nil { - panic(err) - } + s.server.db.Exec("UPDATE characters SET time_played = $1 WHERE id = $2", timePlayed, s.charID) + s.server.db.Exec("UPDATE characters SET cafe_time=cafe_time+$1 WHERE id=$2", sessionTime, s.charID) + + treasureHuntUnregister(s) if s.stage == nil { return @@ -241,7 +245,6 @@ func logoutPlayer(s *Session) { removeSessionFromSemaphore(s) removeSessionFromStage(s) - treasureHuntUnregister(s) saveData, err := GetCharacterSaveData(s, s.charID) if err != nil { diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index 8692864cf..76529ce4f 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -10,26 +10,26 @@ import ( func handleMsgMhfAcquireCafeItem(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfAcquireCafeItem) - var netcafe_points int - err := s.server.db.QueryRow("UPDATE characters SET netcafe_points = netcafe_points - $1 WHERE id = $2 RETURNING netcafe_points", pkt.PointCost, s.charID).Scan(&netcafe_points) + var netcafePoints uint32 + err := s.server.db.QueryRow("UPDATE characters SET netcafe_points = netcafe_points - $1 WHERE id = $2 RETURNING netcafe_points", pkt.PointCost, s.charID).Scan(&netcafePoints) if err != nil { - s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) + s.logger.Fatal("Failed to get netcafe points from db", zap.Error(err)) } resp := byteframe.NewByteFrame() - resp.WriteUint32(uint32(netcafe_points)) + resp.WriteUint32(netcafePoints) doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) } func handleMsgMhfUpdateCafepoint(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfUpdateCafepoint) - var netcafe_points int - err := s.server.db.QueryRow("SELECT COALESCE(netcafe_points, 0) FROM characters WHERE id = $1", s.charID).Scan(&netcafe_points) + var netcafePoints uint32 + err := s.server.db.QueryRow("SELECT COALESCE(netcafe_points, 0) FROM characters WHERE id = $1", s.charID).Scan(&netcafePoints) if err != nil { - s.logger.Fatal("Failed to get plate data savedata from db", zap.Error(err)) + s.logger.Fatal("Failed to get netcate points from db", zap.Error(err)) } resp := byteframe.NewByteFrame() resp.WriteUint32(0) - resp.WriteUint32(uint32(netcafe_points)) + resp.WriteUint32(netcafePoints) doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) } @@ -77,19 +77,19 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { panic(err) } cafeTime = uint32(Time_Current_Adjusted().Unix()) - uint32(s.sessionStart) + cafeTime - bf.WriteUint32(cafeTime) // Total hours + bf.WriteUint32(cafeTime) // Total cafe time bf.WriteUint16(0) ps.Uint16(bf, "Resets at next maintenance", true) doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } type CafeBonus struct { - ID uint32 `db:"id"` - Line uint32 `db:"line"` - ItemClass uint32 `db:"itemclass"` - ItemID uint32 `db:"itemid"` - TradeQuantity uint32 `db:"tradequantity"` - FlagCount uint8 `db:"flagcount"` + ID uint32 `db:"id"` + Minutes uint32 `db:"minutes_req"` + ItemType uint32 `db:"item_type"` + ItemID uint32 `db:"item_id"` + Quantity uint32 `db:"quantity"` + Claimed bool `db:"claimed"` } func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { @@ -98,12 +98,12 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { var count uint32 rows, err := s.server.db.Queryx(` - SELECT cb.id, line, itemclass, itemid, tradequantity, + SELECT cb.id, minutes_req, item_type, item_id, quantity, ( SELECT count(*) FROM cafe_accepted ca WHERE cb.id = ca.cafe_id AND ca.character_id = $1 - ) AS flagcount + )::int::bool AS claimed FROM cafebonus cb ORDER BY id ASC;`, s.charID) if err != nil { s.logger.Error("Error getting cafebonus", zap.Error(err)) @@ -111,20 +111,20 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { } else { for rows.Next() { count++ - Cafes := &CafeBonus{} - err = rows.StructScan(&Cafes) + cafeBonus := &CafeBonus{} + err = rows.StructScan(&cafeBonus) if err != nil { s.logger.Error("Error scanning cafebonus", zap.Error(err)) } - bf.WriteUint32(Cafes.Line) // Time - bf.WriteUint32(0) // Unk - bf.WriteUint32(Cafes.ItemID) - bf.WriteUint32(Cafes.TradeQuantity) - bf.WriteUint8(Cafes.FlagCount) + bf.WriteUint32(cafeBonus.Minutes) + bf.WriteUint32(0) // Unk + bf.WriteUint32(cafeBonus.ItemID) + bf.WriteUint32(cafeBonus.Quantity) + bf.WriteBool(cafeBonus.Claimed) } resp := byteframe.NewByteFrame() resp.WriteUint32(0) - resp.WriteUint32(uint32(time.Now().Unix())) //timestamp + resp.WriteUint32(uint32(time.Now().Unix())) resp.WriteUint32(count) resp.WriteBytes(bf.Data()) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) @@ -136,7 +136,7 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { bf := byteframe.NewByteFrame() row := s.server.db.QueryRowx(` - SELECT c.id, c.line, itemclass, itemid, tradequantity + SELECT c.id, minutes_req, item_type, item_id, quantity FROM cafebonus c WHERE ( SELECT count(*) @@ -146,18 +146,18 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { SELECT ch.cafe_time + $2 FROM characters ch WHERE ch.id = $1 - ) >= c.line LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) - Cafe := &CafeBonus{} - err := row.StructScan(Cafe) + ) >= minutes_req LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) + cafeBonus := &CafeBonus{} + err := row.StructScan(cafeBonus) if err != nil { doAckBufSucceed(s, pkt.AckHandle, make([]byte, 8)) return } bf.WriteUint32(1) - bf.WriteUint32(Cafe.ID) - bf.WriteUint32(Cafe.ItemClass) - bf.WriteUint32(Cafe.ItemID) - bf.WriteUint32(Cafe.TradeQuantity) + bf.WriteUint32(cafeBonus.ID) + bf.WriteUint32(cafeBonus.ItemType) + bf.WriteUint32(cafeBonus.ItemID) + bf.WriteUint32(cafeBonus.Quantity) doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } From ac90c2dd09aae0103aa91b57ddcab35536cd69f8 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 17:23:33 +1000 Subject: [PATCH 3/7] correct minutes->seconds --- patch-schema/netcafe.sql | 2 +- server/channelserver/handlers_cafe.go | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql index cfd85e5f8..e56633c46 100644 --- a/patch-schema/netcafe.sql +++ b/patch-schema/netcafe.sql @@ -6,7 +6,7 @@ ALTER TABLE IF EXISTS public.characters CREATE TABLE IF NOT EXISTS public.cafebonus ( id integer NOT NULL PRIMARY KEY, - minutes_req integer NOT NULL, + seconds_req integer NOT NULL, item_type integer NOT NULL, item_id integer NOT NULL, quantity integer NOT NULL diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index 76529ce4f..8e7deaf5e 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -85,7 +85,7 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { type CafeBonus struct { ID uint32 `db:"id"` - Minutes uint32 `db:"minutes_req"` + Seconds uint32 `db:"time_req"` ItemType uint32 `db:"item_type"` ItemID uint32 `db:"item_id"` Quantity uint32 `db:"quantity"` @@ -98,7 +98,7 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { var count uint32 rows, err := s.server.db.Queryx(` - SELECT cb.id, minutes_req, item_type, item_id, quantity, + SELECT cb.id, seconds_req, item_type, item_id, quantity, ( SELECT count(*) FROM cafe_accepted ca @@ -116,7 +116,7 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { if err != nil { s.logger.Error("Error scanning cafebonus", zap.Error(err)) } - bf.WriteUint32(cafeBonus.Minutes) + bf.WriteUint32(cafeBonus.Seconds) bf.WriteUint32(0) // Unk bf.WriteUint32(cafeBonus.ItemID) bf.WriteUint32(cafeBonus.Quantity) @@ -136,7 +136,7 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { bf := byteframe.NewByteFrame() row := s.server.db.QueryRowx(` - SELECT c.id, minutes_req, item_type, item_id, quantity + SELECT c.id, seconds_req, item_type, item_id, quantity FROM cafebonus c WHERE ( SELECT count(*) @@ -146,7 +146,7 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { SELECT ch.cafe_time + $2 FROM characters ch WHERE ch.id = $1 - ) >= minutes_req LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) + ) >= seconds_req LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) cafeBonus := &CafeBonus{} err := row.StructScan(cafeBonus) if err != nil { From 0ba9adcc88534dba575a27e8bfe946ad52303ff6 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 17:46:17 +1000 Subject: [PATCH 4/7] handle receiving multiple items --- patch-schema/netcafe.sql | 2 +- server/channelserver/handlers_cafe.go | 43 ++++++++++++++++----------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql index e56633c46..c7aeb9460 100644 --- a/patch-schema/netcafe.sql +++ b/patch-schema/netcafe.sql @@ -6,7 +6,7 @@ ALTER TABLE IF EXISTS public.characters CREATE TABLE IF NOT EXISTS public.cafebonus ( id integer NOT NULL PRIMARY KEY, - seconds_req integer NOT NULL, + time_req integer NOT NULL, item_type integer NOT NULL, item_id integer NOT NULL, quantity integer NOT NULL diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index 8e7deaf5e..cfac96cc7 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -5,6 +5,7 @@ import ( ps "erupe-ce/common/pascalstring" "erupe-ce/network/mhfpacket" "go.uber.org/zap" + "io" "time" ) @@ -85,7 +86,7 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { type CafeBonus struct { ID uint32 `db:"id"` - Seconds uint32 `db:"time_req"` + TimeReq uint32 `db:"time_req"` ItemType uint32 `db:"item_type"` ItemID uint32 `db:"item_id"` Quantity uint32 `db:"quantity"` @@ -98,7 +99,7 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { var count uint32 rows, err := s.server.db.Queryx(` - SELECT cb.id, seconds_req, item_type, item_id, quantity, + SELECT cb.id, time_req, item_type, item_id, quantity, ( SELECT count(*) FROM cafe_accepted ca @@ -116,7 +117,7 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { if err != nil { s.logger.Error("Error scanning cafebonus", zap.Error(err)) } - bf.WriteUint32(cafeBonus.Seconds) + bf.WriteUint32(cafeBonus.TimeReq) bf.WriteUint32(0) // Unk bf.WriteUint32(cafeBonus.ItemID) bf.WriteUint32(cafeBonus.Quantity) @@ -134,9 +135,10 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReceiveCafeDurationBonus) bf := byteframe.NewByteFrame() - - row := s.server.db.QueryRowx(` - SELECT c.id, seconds_req, item_type, item_id, quantity + var count uint32 + bf.WriteUint32(0) + rows, err := s.server.db.Queryx(` + SELECT c.id, time_req, item_type, item_id, quantity FROM cafebonus c WHERE ( SELECT count(*) @@ -146,19 +148,26 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { SELECT ch.cafe_time + $2 FROM characters ch WHERE ch.id = $1 - ) >= seconds_req LIMIT 1;`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) - cafeBonus := &CafeBonus{} - err := row.StructScan(cafeBonus) + ) >= time_req`, s.charID, Time_Current_Adjusted().Unix()-s.sessionStart) if err != nil { - doAckBufSucceed(s, pkt.AckHandle, make([]byte, 8)) - return + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) + } else { + for rows.Next() { + cafeBonus := &CafeBonus{} + err = rows.StructScan(cafeBonus) + if err != nil { + continue + } + count++ + bf.WriteUint32(cafeBonus.ID) + bf.WriteUint32(cafeBonus.ItemType) + bf.WriteUint32(cafeBonus.ItemID) + bf.WriteUint32(cafeBonus.Quantity) + } + bf.Seek(0, io.SeekStart) + bf.WriteUint32(count) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } - bf.WriteUint32(1) - bf.WriteUint32(cafeBonus.ID) - bf.WriteUint32(cafeBonus.ItemType) - bf.WriteUint32(cafeBonus.ItemID) - bf.WriteUint32(cafeBonus.Quantity) - doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } func handleMsgMhfPostCafeDurationBonusReceived(s *Session, p mhfpacket.MHFPacket) { From d8072ee06e70ff8abf405e055fee6c4fd1e8d9a2 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 18:22:56 +1000 Subject: [PATCH 5/7] default netcafe rewards and maintenance --- main.go | 4 +++- patch-schema/netcafe.sql | 12 +++++++++++- server/channelserver/handlers_cafe.go | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index d0b13d649..c3c0162e0 100644 --- a/main.go +++ b/main.go @@ -108,9 +108,11 @@ func main() { } logger.Info("Connected to database") - // Clear existing tokens + // Clear stale data _ = db.MustExec("DELETE FROM sign_sessions") _ = db.MustExec("DELETE FROM servers") + _ = db.MustExec("DELETE FROM cafe_accepted") + _ = db.MustExec("UPDATE characters SET cafe_time=0") // Clean the DB if the option is on. if erupeConfig.DevMode && erupeConfig.DevModeOptions.CleanDB { diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql index c7aeb9460..077adc7bd 100644 --- a/patch-schema/netcafe.sql +++ b/patch-schema/netcafe.sql @@ -5,7 +5,7 @@ ALTER TABLE IF EXISTS public.characters CREATE TABLE IF NOT EXISTS public.cafebonus ( - id integer NOT NULL PRIMARY KEY, + id serial NOT NULL PRIMARY KEY, time_req integer NOT NULL, item_type integer NOT NULL, item_id integer NOT NULL, @@ -18,4 +18,14 @@ CREATE TABLE IF NOT EXISTS public.cafe_accepted character_id integer NOT NULL ); +INSERT INTO public.cafebonus (time_req, item_type, item_id, quantity) +VALUES + (1800, 17, 0, 250), + (3600, 17, 0, 500), + (7200, 17, 0, 1000), + (10800, 17, 0, 1500), + (18000, 17, 0, 1750), + (28800, 17, 0, 3000), + (43200, 17, 0, 4000); + END; \ No newline at end of file diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index cfac96cc7..a020d38a0 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -118,7 +118,7 @@ func handleMsgMhfGetCafeDurationBonusInfo(s *Session, p mhfpacket.MHFPacket) { s.logger.Error("Error scanning cafebonus", zap.Error(err)) } bf.WriteUint32(cafeBonus.TimeReq) - bf.WriteUint32(0) // Unk + bf.WriteUint32(cafeBonus.ItemType) bf.WriteUint32(cafeBonus.ItemID) bf.WriteUint32(cafeBonus.Quantity) bf.WriteBool(cafeBonus.Claimed) From 440b73f69658fdae79430fa3162d258ba01b66f1 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 21:23:02 +1000 Subject: [PATCH 6/7] implement netcafe points and boost time --- ...g_mhf_post_cafe_duration_bonus_received.go | 9 +-- patch-schema/netcafe.sql | 11 +++- server/channelserver/handlers_cafe.go | 66 +++++++++++++++++-- server/channelserver/handlers_event.go | 26 -------- 4 files changed, 74 insertions(+), 38 deletions(-) diff --git a/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go b/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go index be8947f2c..baa102f61 100644 --- a/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go +++ b/network/mhfpacket/msg_mhf_post_cafe_duration_bonus_received.go @@ -11,8 +11,7 @@ import ( // MsgMhfPostCafeDurationBonusReceived represents the MSG_MHF_POST_CAFE_DURATION_BONUS_RECEIVED type MsgMhfPostCafeDurationBonusReceived struct { AckHandle uint32 - Unk0 uint32 - CafeBonusID uint32 + CafeBonusID []uint32 } // Opcode returns the ID associated with this packet type. @@ -23,8 +22,10 @@ func (m *MsgMhfPostCafeDurationBonusReceived) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfPostCafeDurationBonusReceived) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() - m.Unk0 = bf.ReadUint32() - m.CafeBonusID = bf.ReadUint32() + ids := int(bf.ReadUint32()) + for i := 0; i < ids; i++ { + m.CafeBonusID = append(m.CafeBonusID, bf.ReadUint32()) + } return nil } diff --git a/patch-schema/netcafe.sql b/patch-schema/netcafe.sql index 077adc7bd..e284742ce 100644 --- a/patch-schema/netcafe.sql +++ b/patch-schema/netcafe.sql @@ -1,7 +1,16 @@ BEGIN; ALTER TABLE IF EXISTS public.characters - ADD COLUMN cafe_time integer DEFAULT 0; + ADD COLUMN IF NOT EXISTS cafe_time integer DEFAULT 0; + +ALTER TABLE IF EXISTS public.characters + DROP COLUMN IF EXISTS netcafe_points; + +ALTER TABLE IF EXISTS public.characters + ADD COLUMN IF NOT EXISTS netcafe_points int DEFAULT 0; + +ALTER TABLE IF EXISTS public.characters + ADD COLUMN IF NOT EXISTS boost_time timestamp without time zone; CREATE TABLE IF NOT EXISTS public.cafebonus ( diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index a020d38a0..041304ed7 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -29,7 +29,6 @@ func handleMsgMhfUpdateCafepoint(s *Session, p mhfpacket.MHFPacket) { s.logger.Fatal("Failed to get netcate points from db", zap.Error(err)) } resp := byteframe.NewByteFrame() - resp.WriteUint32(0) resp.WriteUint32(netcafePoints) doAckSimpleSucceed(s, pkt.AckHandle, resp.Data()) } @@ -58,7 +57,7 @@ func handleMsgMhfCheckDailyCafepoint(s *Session, p mhfpacket.MHFPacket) { if t.After(dailyTime) { // +5 netcafe points and setting next valid window - _, err := s.server.db.Exec("UPDATE characters SET daily_time=$1, netcafe_points=netcafe_points::int + 5 WHERE id=$2", midday, s.charID) + _, err := s.server.db.Exec("UPDATE characters SET daily_time=$1, netcafe_points=netcafe_points+5 WHERE id=$2", midday, s.charID) if err != nil { s.logger.Fatal("Failed to update daily_time and netcafe_points savedata in db", zap.Error(err)) } @@ -172,16 +171,69 @@ func handleMsgMhfReceiveCafeDurationBonus(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostCafeDurationBonusReceived(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfPostCafeDurationBonusReceived) - - _, err := s.server.db.Exec("INSERT INTO public.cafe_accepted VALUES ($1, $2)", pkt.CafeBonusID, s.charID) - if err != nil { - s.logger.Error("Error updating accepted CafeBonus count", zap.Error(err)) + var cafeBonus CafeBonus + for _, cbID := range pkt.CafeBonusID { + err := s.server.db.QueryRow(` + SELECT cb.id, item_type, quantity FROM cafebonus cb WHERE cb.id=$1 + `, cbID).Scan(&cafeBonus.ID, &cafeBonus.ItemType, &cafeBonus.Quantity) + if err == nil { + if cafeBonus.ItemType == 17 { + s.server.db.Exec("UPDATE characters SET netcafe_points=netcafe_points+$1 WHERE id=$2", cafeBonus.Quantity, s.charID) + } + } + s.server.db.Exec("INSERT INTO public.cafe_accepted VALUES ($1, $2)", cbID, s.charID) } - doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } func handleMsgMhfStartBoostTime(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfStartBoostTime) + bf := byteframe.NewByteFrame() + boostLimit := Time_Current_Adjusted().Add(100 * time.Minute) + s.server.db.Exec("UPDATE characters SET boost_time=$1 WHERE id=$2", boostLimit, s.charID) + bf.WriteUint32(uint32(boostLimit.Unix())) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) +} + +func handleMsgMhfGetBoostTime(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfGetBoostTime) + doAckBufSucceed(s, pkt.AckHandle, []byte{}) +} + +func handleMsgMhfGetBoostTimeLimit(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfGetBoostTimeLimit) + bf := byteframe.NewByteFrame() + var boostLimit time.Time + err := s.server.db.QueryRow("SELECT boost_time FROM characters WHERE id=$1", s.charID).Scan(&boostLimit) + if err != nil { + bf.WriteUint32(0) + } else { + bf.WriteUint32(uint32(boostLimit.Unix())) + } + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } + +func handleMsgMhfGetBoostRight(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfGetBoostRight) + var boostLimit time.Time + err := s.server.db.QueryRow("SELECT boost_time FROM characters WHERE id=$1", s.charID).Scan(&boostLimit) + if err != nil { + doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + return + } + if boostLimit.Unix() < Time_Current_Adjusted().Unix() { + doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x02}) + } else { + doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) + } +} + +func handleMsgMhfPostBoostTimeQuestReturn(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfPostBoostTimeQuestReturn) + doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) +} + +func handleMsgMhfPostBoostTime(s *Session, p mhfpacket.MHFPacket) {} + +func handleMsgMhfPostBoostTimeLimit(s *Session, p mhfpacket.MHFPacket) {} diff --git a/server/channelserver/handlers_event.go b/server/channelserver/handlers_event.go index 87ae246af..7ec7c30e7 100644 --- a/server/channelserver/handlers_event.go +++ b/server/channelserver/handlers_event.go @@ -303,32 +303,6 @@ func handleMsgMhfGetUdInfo(s *Session, p mhfpacket.MHFPacket) { doAckBufSucceed(s, pkt.AckHandle, resp.Data()) } -func handleMsgMhfGetBoostTime(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfGetBoostTime) - - doAckBufSucceed(s, pkt.AckHandle, []byte{}) - updateRights(s) -} - -func handleMsgMhfGetBoostTimeLimit(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfGetBoostTimeLimit) - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) -} - -func handleMsgMhfGetBoostRight(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfGetBoostRight) - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) -} - -func handleMsgMhfPostBoostTimeQuestReturn(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfPostBoostTimeQuestReturn) - doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) -} - -func handleMsgMhfPostBoostTime(s *Session, p mhfpacket.MHFPacket) {} - -func handleMsgMhfPostBoostTimeLimit(s *Session, p mhfpacket.MHFPacket) {} - func handleMsgMhfGetRestrictionEvent(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfSetRestrictionEvent(s *Session, p mhfpacket.MHFPacket) { From 0edfd255fdd1d10ad22b374a04d2cc36d44ecebc Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 13 Aug 2022 21:46:05 +1000 Subject: [PATCH 7/7] correct backwards comparison --- server/channelserver/handlers_cafe.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index 041304ed7..c7d826429 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -222,10 +222,10 @@ func handleMsgMhfGetBoostRight(s *Session, p mhfpacket.MHFPacket) { doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) return } - if boostLimit.Unix() < Time_Current_Adjusted().Unix() { - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x02}) - } else { + if boostLimit.Unix() > Time_Current_Adjusted().Unix() { doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) + } else { + doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x02}) } }