64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package world
|
|
|
|
import (
|
|
"bd2server/internal/server/gamedata"
|
|
"bd2server/internal/server/wire"
|
|
"fmt"
|
|
)
|
|
|
|
func (s *Service) handlePackDetail(request []byte) (int, []byte, bool, error) {
|
|
seq, found, err := wire.Varint(request, 1)
|
|
if err != nil || !found || seq == 0 || seq > 0x7fffffff {
|
|
return 0, nil, true, fmt.Errorf("%w: PackDetailInfo invalid sequence", ErrInvalidRequest)
|
|
}
|
|
packID, err := requestPack(request)
|
|
if err != nil {
|
|
return 0, nil, true, err
|
|
}
|
|
if !s.packUnlocked(packID) || !s.packSummaryTargets[packID] {
|
|
return 0, nil, true, fmt.Errorf("%w: PackDetailInfo unavailable pack %d", ErrInvalidRequest, packID)
|
|
}
|
|
if s.packDetailDesign == nil {
|
|
return 0, nil, true, fmt.Errorf("world: missing pack detail design loader")
|
|
}
|
|
design, err := s.packDetailDesign(packID)
|
|
if err != nil {
|
|
return 0, nil, true, err
|
|
}
|
|
filter := map[int]bool{}
|
|
for _, id := range design.RegenMonsterIDs {
|
|
filter[id] = true
|
|
}
|
|
ids, err := s.openedFieldObjects(packID)
|
|
if err != nil {
|
|
return 0, nil, true, err
|
|
}
|
|
response := []byte{}
|
|
if len(filter) > 0 {
|
|
rows, e := s.monsterRows(packID, filter)
|
|
if e != nil {
|
|
return 0, nil, true, e
|
|
}
|
|
for _, row := range rows {
|
|
response = wire.AppendBytes(response, 1, row)
|
|
}
|
|
}
|
|
for _, id := range ids {
|
|
response = wire.AppendBytes(response, 2, wire.AppendVarint(nil, 1, uint64(id)))
|
|
}
|
|
research, e := s.state.ResearchObjects(packID)
|
|
if e != nil {
|
|
return 0, nil, true, e
|
|
}
|
|
for _, id := range research {
|
|
response = wire.AppendVarint(response, 3, uint64(id))
|
|
}
|
|
return 627, response, true, nil
|
|
}
|
|
|
|
func (s *Service) attachPackDetailDesign(root, version string) {
|
|
s.packDetailDesign = func(packID int) (gamedata.PackDetailDesign, error) {
|
|
return gamedata.LoadPackDetailDesign(root, version, packID)
|
|
}
|
|
}
|