diff --git a/server/channelserver/handlers_goocoo.go b/server/channelserver/handlers_goocoo.go new file mode 100644 index 000000000..151ed88ca --- /dev/null +++ b/server/channelserver/handlers_goocoo.go @@ -0,0 +1,66 @@ +package channelserver + +import ( + "erupe-ce/common/byteframe" + "erupe-ce/network/mhfpacket" + "fmt" + + "go.uber.org/zap" +) + +func getGoocooData(s *Session, cid uint32) [][]byte { + var goocoo []byte + var goocoos [][]byte + for i := 0; i < 5; i++ { + err := s.server.db.QueryRow(fmt.Sprintf("SELECT goocoo%d FROM goocoo WHERE id=$1", i), cid).Scan(&goocoo) + if err != nil { + if _, err := s.server.db.Exec("INSERT INTO goocoo (id) VALUES ($1)", s.charID); err != nil { + s.logger.Error("Failed to insert goocoo record", zap.Error(err)) + } + return goocoos + } + if err == nil && goocoo != nil { + goocoos = append(goocoos, goocoo) + } + } + return goocoos +} + +func handleMsgMhfEnumerateGuacot(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfEnumerateGuacot) + bf := byteframe.NewByteFrame() + goocoos := getGoocooData(s, s.charID) + bf.WriteUint16(uint16(len(goocoos))) + bf.WriteUint16(0) + for _, goocoo := range goocoos { + bf.WriteBytes(goocoo) + } + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) +} + +func handleMsgMhfUpdateGuacot(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfUpdateGuacot) + for _, goocoo := range pkt.Goocoos { + if goocoo.Data1[0] == 0 { + if _, err := s.server.db.Exec(fmt.Sprintf("UPDATE goocoo SET goocoo%d=NULL WHERE id=$1", goocoo.Index), s.charID); err != nil { + s.logger.Error("Failed to clear goocoo slot", zap.Error(err)) + } + } else { + bf := byteframe.NewByteFrame() + bf.WriteUint32(goocoo.Index) + for i := range goocoo.Data1 { + bf.WriteInt16(goocoo.Data1[i]) + } + for i := range goocoo.Data2 { + bf.WriteUint32(goocoo.Data2[i]) + } + bf.WriteUint8(uint8(len(goocoo.Name))) + bf.WriteBytes(goocoo.Name) + if _, err := s.server.db.Exec(fmt.Sprintf("UPDATE goocoo SET goocoo%d=$1 WHERE id=$2", goocoo.Index), bf.Data(), s.charID); err != nil { + s.logger.Error("Failed to update goocoo slot", zap.Error(err)) + } + dumpSaveData(s, bf.Data(), fmt.Sprintf("goocoo-%d", goocoo.Index)) + } + } + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) +} diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers_misc.go similarity index 74% rename from server/channelserver/handlers.go rename to server/channelserver/handlers_misc.go index 988f4a938..9bb830356 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers_misc.go @@ -11,113 +11,6 @@ import ( "go.uber.org/zap" ) -func getGoocooData(s *Session, cid uint32) [][]byte { - var goocoo []byte - var goocoos [][]byte - for i := 0; i < 5; i++ { - err := s.server.db.QueryRow(fmt.Sprintf("SELECT goocoo%d FROM goocoo WHERE id=$1", i), cid).Scan(&goocoo) - if err != nil { - if _, err := s.server.db.Exec("INSERT INTO goocoo (id) VALUES ($1)", s.charID); err != nil { - s.logger.Error("Failed to insert goocoo record", zap.Error(err)) - } - return goocoos - } - if err == nil && goocoo != nil { - goocoos = append(goocoos, goocoo) - } - } - return goocoos -} - -func handleMsgMhfEnumerateGuacot(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfEnumerateGuacot) - bf := byteframe.NewByteFrame() - goocoos := getGoocooData(s, s.charID) - bf.WriteUint16(uint16(len(goocoos))) - bf.WriteUint16(0) - for _, goocoo := range goocoos { - bf.WriteBytes(goocoo) - } - doAckBufSucceed(s, pkt.AckHandle, bf.Data()) -} - -func handleMsgMhfUpdateGuacot(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfUpdateGuacot) - for _, goocoo := range pkt.Goocoos { - if goocoo.Data1[0] == 0 { - if _, err := s.server.db.Exec(fmt.Sprintf("UPDATE goocoo SET goocoo%d=NULL WHERE id=$1", goocoo.Index), s.charID); err != nil { - s.logger.Error("Failed to clear goocoo slot", zap.Error(err)) - } - } else { - bf := byteframe.NewByteFrame() - bf.WriteUint32(goocoo.Index) - for i := range goocoo.Data1 { - bf.WriteInt16(goocoo.Data1[i]) - } - for i := range goocoo.Data2 { - bf.WriteUint32(goocoo.Data2[i]) - } - bf.WriteUint8(uint8(len(goocoo.Name))) - bf.WriteBytes(goocoo.Name) - if _, err := s.server.db.Exec(fmt.Sprintf("UPDATE goocoo SET goocoo%d=$1 WHERE id=$2", goocoo.Index), bf.Data(), s.charID); err != nil { - s.logger.Error("Failed to update goocoo slot", zap.Error(err)) - } - dumpSaveData(s, bf.Data(), fmt.Sprintf("goocoo-%d", goocoo.Index)) - } - } - doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) -} - -type Scenario struct { - MainID uint32 - // 0 = Basic - // 1 = Veteran - // 3 = Other - // 6 = Pallone - // 7 = Diva - CategoryID uint8 -} - -func handleMsgMhfInfoScenarioCounter(s *Session, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfInfoScenarioCounter) - var scenarios []Scenario - var scenario Scenario - scenarioData, err := s.server.db.Queryx("SELECT scenario_id, category_id FROM scenario_counter") - if err != nil { - _ = scenarioData.Close() - s.logger.Error("Failed to get scenario counter info from db", zap.Error(err)) - doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1)) - return - } - for scenarioData.Next() { - err = scenarioData.Scan(&scenario.MainID, &scenario.CategoryID) - if err != nil { - continue - } - scenarios = append(scenarios, scenario) - } - - // Trim excess scenarios - if len(scenarios) > 128 { - scenarios = scenarios[:128] - } - - bf := byteframe.NewByteFrame() - bf.WriteUint8(uint8(len(scenarios))) - for _, scenario := range scenarios { - bf.WriteUint32(scenario.MainID) - // If item exchange - switch scenario.CategoryID { - case 3, 6, 7: - bf.WriteBool(true) - default: - bf.WriteBool(false) - } - bf.WriteUint8(scenario.CategoryID) - } - doAckBufSucceed(s, pkt.AckHandle, bf.Data()) -} - func handleMsgMhfGetEtcPoints(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfGetEtcPoints) diff --git a/server/channelserver/handlers_scenario.go b/server/channelserver/handlers_scenario.go new file mode 100644 index 000000000..5ab10c3cb --- /dev/null +++ b/server/channelserver/handlers_scenario.go @@ -0,0 +1,58 @@ +package channelserver + +import ( + "erupe-ce/common/byteframe" + "erupe-ce/network/mhfpacket" + + "go.uber.org/zap" +) + +type Scenario struct { + MainID uint32 + // 0 = Basic + // 1 = Veteran + // 3 = Other + // 6 = Pallone + // 7 = Diva + CategoryID uint8 +} + +func handleMsgMhfInfoScenarioCounter(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfInfoScenarioCounter) + var scenarios []Scenario + var scenario Scenario + scenarioData, err := s.server.db.Queryx("SELECT scenario_id, category_id FROM scenario_counter") + if err != nil { + _ = scenarioData.Close() + s.logger.Error("Failed to get scenario counter info from db", zap.Error(err)) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1)) + return + } + for scenarioData.Next() { + err = scenarioData.Scan(&scenario.MainID, &scenario.CategoryID) + if err != nil { + continue + } + scenarios = append(scenarios, scenario) + } + + // Trim excess scenarios + if len(scenarios) > 128 { + scenarios = scenarios[:128] + } + + bf := byteframe.NewByteFrame() + bf.WriteUint8(uint8(len(scenarios))) + for _, scenario := range scenarios { + bf.WriteUint32(scenario.MainID) + // If item exchange + switch scenario.CategoryID { + case 3, 6, 7: + bf.WriteBool(true) + default: + bf.WriteBool(false) + } + bf.WriteUint8(scenario.CategoryID) + } + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) +}