65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package world
|
|
|
|
import (
|
|
"bd2server/internal/server/domain/command"
|
|
"fmt"
|
|
)
|
|
|
|
func (s *Service) fieldObjectCurrentPack(pack int) bool {
|
|
|
|
current := s.activePack
|
|
|
|
if current == 0 {
|
|
current = s.state.ActivePackID()
|
|
}
|
|
return current == pack
|
|
}
|
|
|
|
func (s *Service) validateFieldObjectMap(ctx command.Context, pack, mapID int) error {
|
|
_, saved := s.state.Position()
|
|
_, event, err := s.resolveEventFieldPack(ctx, pack)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !saved && !event {
|
|
return nil
|
|
}
|
|
current, err := s.currentFieldMap(ctx, pack)
|
|
if err != nil {
|
|
return fmt.Errorf("%w: field object map unavailable (pack=%d object_map=%d): %v", ErrInvalidRequest, pack, mapID, err)
|
|
}
|
|
if current != mapID {
|
|
return fmt.Errorf("%w: field object outside current map (pack=%d object_map=%d current_map=%d)", ErrInvalidRequest, pack, mapID, current)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) rewardMonsterAvailable(ctx command.Context, pack, monster int) (bool, error) {
|
|
if s.fieldObjectLoader == nil && s.fieldObjects == nil {
|
|
return true, nil
|
|
}
|
|
design, err := s.fieldObjectDesign(ctx, pack)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
linked := false
|
|
for _, obj := range design.Objects {
|
|
if obj.MonsterID != monster || obj.BuffID != 0 || len(obj.Rewards) != 0 {
|
|
continue
|
|
}
|
|
linked = true
|
|
period, e := s.fieldObjectPeriodFor(pack, obj)
|
|
if e != nil {
|
|
continue
|
|
}
|
|
opened, e := s.state.FieldRewardOpened(ctx, pack, obj.ID, period)
|
|
if e != nil {
|
|
return false, e
|
|
}
|
|
if opened {
|
|
return true, nil
|
|
}
|
|
}
|
|
return !linked, nil
|
|
}
|