260 lines
7.6 KiB
Go
260 lines
7.6 KiB
Go
package ground_spawn
|
|
|
|
// Database interface for ground spawn persistence
|
|
type Database interface {
|
|
LoadGroundSpawnEntries(groundspawnID int32) ([]*GroundSpawnEntry, error)
|
|
LoadGroundSpawnItems(groundspawnID int32) ([]*GroundSpawnEntryItem, error)
|
|
SaveGroundSpawn(gs *GroundSpawn) error
|
|
LoadAllGroundSpawns() ([]*GroundSpawn, error)
|
|
DeleteGroundSpawn(id int32) error
|
|
}
|
|
|
|
// Logger interface for ground spawn logging
|
|
type Logger interface {
|
|
LogInfo(message string, args ...interface{})
|
|
LogError(message string, args ...interface{})
|
|
LogDebug(message string, args ...interface{})
|
|
LogWarning(message string, args ...interface{})
|
|
}
|
|
|
|
// Player interface for ground spawn interactions
|
|
type Player interface {
|
|
GetID() int32
|
|
GetName() string
|
|
GetLevel() int16
|
|
GetLocation() int32
|
|
GetSkillByName(skillName string) *Skill
|
|
CheckQuestsHarvestUpdate(item *Item, quantity int16)
|
|
UpdatePlayerStatistic(statType int32, amount int32)
|
|
SendMessage(message string)
|
|
}
|
|
|
|
// Client interface for client communication
|
|
type Client interface {
|
|
GetPlayer() *Player
|
|
GetVersion() int16
|
|
GetLogger() Logger
|
|
GetCurrentZoneID() int32
|
|
Message(channel int32, message string, args ...interface{})
|
|
SimpleMessage(channel int32, message string)
|
|
SendPopupMessage(type_ int32, message string, sound string, duration float32, r, g, b int32)
|
|
AddItem(item *Item, itemDeleted *bool) error
|
|
}
|
|
|
|
// Skill interface for skill management
|
|
type Skill interface {
|
|
GetCurrentValue() int16
|
|
GetMaxValue() int16
|
|
GetName() string
|
|
IncreaseSkill(amount int16) bool
|
|
}
|
|
|
|
// Item interface for harvest rewards
|
|
type Item interface {
|
|
GetID() int32
|
|
GetName() string
|
|
GetCount() int16
|
|
SetCount(count int16)
|
|
CreateItemLink(version int16, color bool) string
|
|
}
|
|
|
|
// Zone interface for zone-specific operations
|
|
type Zone interface {
|
|
GetID() int32
|
|
GetGroundSpawnEntries(groundspawnID int32) []*GroundSpawnEntry
|
|
GetGroundSpawnEntryItems(groundspawnID int32) []*GroundSpawnEntryItem
|
|
ProcessSpell(spell *Spell, caster *Player, target *Player, harvest bool, fromItem bool)
|
|
ProcessEntityCommand(command *EntityCommand, player *Player, target *Player)
|
|
}
|
|
|
|
// Spell interface for harvest spells
|
|
type Spell interface {
|
|
GetID() int32
|
|
GetName() string
|
|
GetType() string
|
|
}
|
|
|
|
// EntityCommand interface for ground spawn commands
|
|
type EntityCommand interface {
|
|
GetID() int32
|
|
GetName() string
|
|
GetCommand() string
|
|
}
|
|
|
|
// Rules interface for game rules and configuration
|
|
type Rules interface {
|
|
GetZoneRule(zoneID int32, category string, ruleName string) *Rule
|
|
}
|
|
|
|
// Rule interface for individual rule values
|
|
type Rule interface {
|
|
GetInt16() int16
|
|
GetFloat() float32
|
|
GetBool() bool
|
|
GetString() string
|
|
}
|
|
|
|
// GroundSpawnProvider interface for systems that provide ground spawn functionality
|
|
type GroundSpawnProvider interface {
|
|
GetGroundSpawn(id int32) *GroundSpawn
|
|
CreateGroundSpawn(config GroundSpawnConfig) *GroundSpawn
|
|
GetGroundSpawnsByZone(zoneID int32) []*GroundSpawn
|
|
ProcessHarvest(gs *GroundSpawn, player *Player) (*HarvestResult, error)
|
|
}
|
|
|
|
// HarvestHandler interface for handling harvest events
|
|
type HarvestHandler interface {
|
|
OnHarvestStart(gs *GroundSpawn, player *Player) error
|
|
OnHarvestComplete(gs *GroundSpawn, player *Player, result *HarvestResult) error
|
|
OnHarvestFailed(gs *GroundSpawn, player *Player, reason string) error
|
|
OnGroundSpawnDepleted(gs *GroundSpawn) error
|
|
}
|
|
|
|
// ItemProvider interface for item creation and management
|
|
type ItemProvider interface {
|
|
GetItem(itemID int32) *Item
|
|
CreateItem(itemID int32, quantity int16) *Item
|
|
GetItemName(itemID int32) string
|
|
}
|
|
|
|
// SkillProvider interface for skill management
|
|
type SkillProvider interface {
|
|
GetPlayerSkill(player *Player, skillName string) *Skill
|
|
GetSkillIDByName(skillName string) int32
|
|
IncreasePlayerSkill(player *Player, skillName string, amount int16) bool
|
|
}
|
|
|
|
// SpawnProvider interface for spawn system integration
|
|
type SpawnProvider interface {
|
|
CreateSpawn() interface{}
|
|
GetSpawn(id int32) interface{}
|
|
RegisterGroundSpawn(gs *GroundSpawn) error
|
|
UnregisterGroundSpawn(id int32) error
|
|
}
|
|
|
|
// GroundSpawnAware interface for entities that can interact with ground spawns
|
|
type GroundSpawnAware interface {
|
|
CanHarvest(gs *GroundSpawn) bool
|
|
GetHarvestSkill(skillName string) *Skill
|
|
GetHarvestModifiers() *HarvestModifiers
|
|
OnHarvestResult(result *HarvestResult)
|
|
}
|
|
|
|
// PlayerGroundSpawnAdapter provides ground spawn functionality for players
|
|
type PlayerGroundSpawnAdapter struct {
|
|
player *Player
|
|
manager *Manager
|
|
logger Logger
|
|
}
|
|
|
|
// NewPlayerGroundSpawnAdapter creates a new player ground spawn adapter
|
|
func NewPlayerGroundSpawnAdapter(player *Player, manager *Manager, logger Logger) *PlayerGroundSpawnAdapter {
|
|
return &PlayerGroundSpawnAdapter{
|
|
player: player,
|
|
manager: manager,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// CanHarvest returns true if the player can harvest the ground spawn
|
|
func (pgsa *PlayerGroundSpawnAdapter) CanHarvest(gs *GroundSpawn) bool {
|
|
if gs == nil || pgsa.player == nil {
|
|
return false
|
|
}
|
|
|
|
// Check if ground spawn is available
|
|
if !gs.IsAvailable() {
|
|
return false
|
|
}
|
|
|
|
// Check if player has required skill
|
|
skill := pgsa.player.GetSkillByName(gs.GetCollectionSkill())
|
|
if skill == nil {
|
|
return false
|
|
}
|
|
|
|
// TODO: Add additional checks (quest requirements, level, etc.)
|
|
|
|
return true
|
|
}
|
|
|
|
// GetHarvestSkill returns the player's skill for a specific harvest type
|
|
func (pgsa *PlayerGroundSpawnAdapter) GetHarvestSkill(skillName string) *Skill {
|
|
if pgsa.player == nil {
|
|
return nil
|
|
}
|
|
|
|
return pgsa.player.GetSkillByName(skillName)
|
|
}
|
|
|
|
// GetHarvestModifiers returns harvest modifiers for the player
|
|
func (pgsa *PlayerGroundSpawnAdapter) GetHarvestModifiers() *HarvestModifiers {
|
|
// TODO: Calculate modifiers based on player stats, equipment, buffs, etc.
|
|
return &HarvestModifiers{
|
|
SkillMultiplier: 1.0,
|
|
RareChanceBonus: 0.0,
|
|
QuantityMultiplier: 1.0,
|
|
LuckModifier: 0,
|
|
}
|
|
}
|
|
|
|
// OnHarvestResult handles harvest result notifications
|
|
func (pgsa *PlayerGroundSpawnAdapter) OnHarvestResult(result *HarvestResult) {
|
|
if result == nil || pgsa.player == nil {
|
|
return
|
|
}
|
|
|
|
if result.Success && len(result.ItemsAwarded) > 0 {
|
|
if pgsa.logger != nil {
|
|
pgsa.logger.LogDebug("Player %s successfully harvested %d items",
|
|
pgsa.player.GetName(), len(result.ItemsAwarded))
|
|
}
|
|
}
|
|
}
|
|
|
|
// HarvestEventAdapter adapts harvest events for different systems
|
|
type HarvestEventAdapter struct {
|
|
handler HarvestHandler
|
|
logger Logger
|
|
}
|
|
|
|
// NewHarvestEventAdapter creates a new harvest event adapter
|
|
func NewHarvestEventAdapter(handler HarvestHandler, logger Logger) *HarvestEventAdapter {
|
|
return &HarvestEventAdapter{
|
|
handler: handler,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// ProcessHarvestEvent processes a harvest event
|
|
func (hea *HarvestEventAdapter) ProcessHarvestEvent(eventType string, gs *GroundSpawn, player *Player, data interface{}) {
|
|
if hea.handler == nil {
|
|
return
|
|
}
|
|
|
|
switch eventType {
|
|
case "harvest_start":
|
|
if err := hea.handler.OnHarvestStart(gs, player); err != nil && hea.logger != nil {
|
|
hea.logger.LogError("Harvest start handler failed: %v", err)
|
|
}
|
|
|
|
case "harvest_complete":
|
|
if result, ok := data.(*HarvestResult); ok {
|
|
if err := hea.handler.OnHarvestComplete(gs, player, result); err != nil && hea.logger != nil {
|
|
hea.logger.LogError("Harvest complete handler failed: %v", err)
|
|
}
|
|
}
|
|
|
|
case "harvest_failed":
|
|
if reason, ok := data.(string); ok {
|
|
if err := hea.handler.OnHarvestFailed(gs, player, reason); err != nil && hea.logger != nil {
|
|
hea.logger.LogError("Harvest failed handler failed: %v", err)
|
|
}
|
|
}
|
|
|
|
case "ground_spawn_depleted":
|
|
if err := hea.handler.OnGroundSpawnDepleted(gs); err != nil && hea.logger != nil {
|
|
hea.logger.LogError("Ground spawn depleted handler failed: %v", err)
|
|
}
|
|
}
|
|
} |