fixed object package
This commit is contained in:
parent
d38847344c
commit
5ed7c44270
@ -14,6 +14,16 @@ type ObjectSpawn struct {
|
||||
// Object-specific properties
|
||||
clickable bool // Whether the object can be clicked/interacted with
|
||||
deviceID int8 // Device ID for interactive objects
|
||||
|
||||
// Merchant properties (duplicated from spawn since fields are unexported)
|
||||
merchantID int32
|
||||
merchantType int8
|
||||
merchantMinLevel int32
|
||||
merchantMaxLevel int32
|
||||
isCollector bool
|
||||
|
||||
// Transport properties (duplicated from spawn since fields are unexported)
|
||||
transporterID int32
|
||||
}
|
||||
|
||||
// NewObjectSpawn creates a new object spawn with default values
|
||||
@ -25,11 +35,11 @@ func NewObjectSpawn() *ObjectSpawn {
|
||||
baseSpawn.SetSpawnType(ObjectSpawnType)
|
||||
|
||||
// Set object appearance defaults
|
||||
appearance := baseSpawn.GetAppearance()
|
||||
appearance := baseSpawn.GetAppearanceData()
|
||||
appearance.ActivityStatus = ObjectActivityStatus
|
||||
appearance.Pos.State = ObjectPosState
|
||||
appearance.Difficulty = ObjectDifficulty
|
||||
baseSpawn.SetAppearance(appearance)
|
||||
// Note: No SetAppearance method, but appearance is modified by reference
|
||||
|
||||
return &ObjectSpawn{
|
||||
Spawn: baseSpawn,
|
||||
@ -65,15 +75,42 @@ func (os *ObjectSpawn) IsObject() bool {
|
||||
|
||||
// Copy creates a deep copy of the object spawn
|
||||
func (os *ObjectSpawn) Copy() *ObjectSpawn {
|
||||
// Copy base spawn
|
||||
newSpawn := os.Spawn.Copy()
|
||||
|
||||
// Create new object spawn
|
||||
newObjectSpawn := &ObjectSpawn{
|
||||
Spawn: newSpawn,
|
||||
clickable: os.clickable,
|
||||
deviceID: os.deviceID,
|
||||
// Create new object spawn with new spawn
|
||||
newObjectSpawn := NewObjectSpawn()
|
||||
|
||||
// Copy properties from original
|
||||
newObjectSpawn.clickable = os.clickable
|
||||
newObjectSpawn.deviceID = os.deviceID
|
||||
|
||||
// Copy spawn properties
|
||||
newObjectSpawn.SetDatabaseID(os.GetDatabaseID())
|
||||
newObjectSpawn.SetID(os.GetID())
|
||||
newObjectSpawn.SetName(os.GetName())
|
||||
newObjectSpawn.SetLevel(os.GetLevel())
|
||||
newObjectSpawn.SetSize(os.GetSize())
|
||||
newObjectSpawn.SetSpawnType(os.GetSpawnType())
|
||||
newObjectSpawn.SetX(os.GetX())
|
||||
newObjectSpawn.SetY(os.GetY(), false)
|
||||
newObjectSpawn.SetZ(os.GetZ())
|
||||
newObjectSpawn.SetHeading(int16(os.GetHeading()), int16(os.GetHeading()))
|
||||
newObjectSpawn.SetFactionID(os.GetFactionID())
|
||||
newObjectSpawn.SetTarget(os.GetTarget())
|
||||
newObjectSpawn.SetAlive(os.IsAlive())
|
||||
|
||||
// Copy merchant properties if they exist
|
||||
if os.merchantID > 0 {
|
||||
newObjectSpawn.merchantID = os.merchantID
|
||||
newObjectSpawn.merchantType = os.merchantType
|
||||
newObjectSpawn.merchantMinLevel = os.merchantMinLevel
|
||||
newObjectSpawn.merchantMaxLevel = os.merchantMaxLevel
|
||||
}
|
||||
|
||||
// Copy transport properties if they exist
|
||||
if os.transporterID > 0 {
|
||||
newObjectSpawn.transporterID = os.transporterID
|
||||
}
|
||||
|
||||
newObjectSpawn.isCollector = os.isCollector
|
||||
|
||||
return newObjectSpawn
|
||||
}
|
||||
@ -86,9 +123,9 @@ func (os *ObjectSpawn) HandleUse(clientID int32, command string) error {
|
||||
// Copy relevant properties for handling
|
||||
object.clickable = os.clickable
|
||||
object.deviceID = os.deviceID
|
||||
object.transporterID = os.GetTransporterID()
|
||||
object.transporterID = os.transporterID
|
||||
object.appearanceShowCommandIcon = int8(0)
|
||||
if os.GetAppearance().ShowCommandIcon == 1 {
|
||||
if os.GetAppearanceData().ShowCommandIcon == 1 {
|
||||
object.appearanceShowCommandIcon = ObjectShowCommandIcon
|
||||
}
|
||||
|
||||
@ -99,18 +136,18 @@ func (os *ObjectSpawn) HandleUse(clientID int32, command string) error {
|
||||
|
||||
// SetShowCommandIcon sets whether to show the command icon
|
||||
func (os *ObjectSpawn) SetShowCommandIcon(show bool) {
|
||||
appearance := os.GetAppearance()
|
||||
appearance := os.GetAppearanceData()
|
||||
if show {
|
||||
appearance.ShowCommandIcon = ObjectShowCommandIcon
|
||||
} else {
|
||||
appearance.ShowCommandIcon = 0
|
||||
}
|
||||
os.SetAppearance(appearance)
|
||||
// Appearance is modified by reference, no need to set it back
|
||||
}
|
||||
|
||||
// ShowsCommandIcon returns whether the command icon is shown
|
||||
func (os *ObjectSpawn) ShowsCommandIcon() bool {
|
||||
return os.GetAppearance().ShowCommandIcon == ObjectShowCommandIcon
|
||||
return os.GetAppearanceData().ShowCommandIcon == ObjectShowCommandIcon
|
||||
}
|
||||
|
||||
// GetObjectInfo returns comprehensive information about the object spawn
|
||||
@ -128,12 +165,12 @@ func (os *ObjectSpawn) GetObjectInfo() map[string]any {
|
||||
info["clickable"] = os.clickable
|
||||
info["device_id"] = os.deviceID
|
||||
info["shows_command_icon"] = os.ShowsCommandIcon()
|
||||
info["transporter_id"] = os.GetTransporterID()
|
||||
info["merchant_id"] = os.GetMerchantID()
|
||||
info["is_collector"] = os.IsCollector()
|
||||
info["transporter_id"] = os.transporterID
|
||||
info["merchant_id"] = os.merchantID
|
||||
info["is_collector"] = os.isCollector
|
||||
|
||||
// Add position info
|
||||
appearance := os.GetAppearance()
|
||||
appearance := os.GetAppearanceData()
|
||||
info["x"] = appearance.Pos.X
|
||||
info["y"] = appearance.Pos.Y
|
||||
info["z"] = appearance.Pos.Z
|
||||
@ -142,40 +179,114 @@ func (os *ObjectSpawn) GetObjectInfo() map[string]any {
|
||||
return info
|
||||
}
|
||||
|
||||
// Getter and setter methods for object-specific properties
|
||||
|
||||
// GetMerchantID returns the merchant ID
|
||||
func (os *ObjectSpawn) GetMerchantID() int32 {
|
||||
return os.merchantID
|
||||
}
|
||||
|
||||
// SetMerchantID sets the merchant ID
|
||||
func (os *ObjectSpawn) SetMerchantID(merchantID int32) {
|
||||
os.merchantID = merchantID
|
||||
}
|
||||
|
||||
// GetMerchantType returns the merchant type
|
||||
func (os *ObjectSpawn) GetMerchantType() int8 {
|
||||
return os.merchantType
|
||||
}
|
||||
|
||||
// SetMerchantType sets the merchant type
|
||||
func (os *ObjectSpawn) SetMerchantType(merchantType int8) {
|
||||
os.merchantType = merchantType
|
||||
}
|
||||
|
||||
// GetMerchantMinLevel returns the minimum merchant level
|
||||
func (os *ObjectSpawn) GetMerchantMinLevel() int8 {
|
||||
return int8(os.merchantMinLevel)
|
||||
}
|
||||
|
||||
// GetMerchantMaxLevel returns the maximum merchant level
|
||||
func (os *ObjectSpawn) GetMerchantMaxLevel() int8 {
|
||||
return int8(os.merchantMaxLevel)
|
||||
}
|
||||
|
||||
// SetMerchantLevelRange sets the merchant level range
|
||||
func (os *ObjectSpawn) SetMerchantLevelRange(minLevel, maxLevel int8) {
|
||||
os.merchantMinLevel = int32(minLevel)
|
||||
os.merchantMaxLevel = int32(maxLevel)
|
||||
}
|
||||
|
||||
// GetTransporterID returns the transporter ID
|
||||
func (os *ObjectSpawn) GetTransporterID() int32 {
|
||||
return os.transporterID
|
||||
}
|
||||
|
||||
// SetTransporterID sets the transporter ID
|
||||
func (os *ObjectSpawn) SetTransporterID(transporterID int32) {
|
||||
os.transporterID = transporterID
|
||||
}
|
||||
|
||||
// IsCollector returns whether this object is a collector
|
||||
func (os *ObjectSpawn) IsCollector() bool {
|
||||
return os.isCollector
|
||||
}
|
||||
|
||||
// SetCollector sets whether this object is a collector
|
||||
func (os *ObjectSpawn) SetCollector(isCollector bool) {
|
||||
os.isCollector = isCollector
|
||||
}
|
||||
|
||||
// GetZoneName returns the zone name (from spawn system)
|
||||
func (os *ObjectSpawn) GetZoneName() string {
|
||||
// TODO: Implement when zone system is integrated
|
||||
// For now return empty string
|
||||
return ""
|
||||
}
|
||||
|
||||
// SetZoneName sets the zone name (placeholder for spawn system)
|
||||
func (os *ObjectSpawn) SetZoneName(zoneName string) {
|
||||
// TODO: Implement when zone system is integrated
|
||||
// This would be handled by the spawn system
|
||||
}
|
||||
|
||||
// ObjectSpawnManager manages object spawns specifically
|
||||
type ObjectSpawnManager struct {
|
||||
spawnManager *spawn.SpawnManager // Reference to global spawn manager
|
||||
objects map[int32]*ObjectSpawn // Object spawns by spawn ID
|
||||
objects map[int32]*ObjectSpawn // Object spawns by spawn ID
|
||||
// TODO: Add reference to spawn manager when it exists
|
||||
}
|
||||
|
||||
// NewObjectSpawnManager creates a new object spawn manager
|
||||
func NewObjectSpawnManager(spawnManager *spawn.SpawnManager) *ObjectSpawnManager {
|
||||
func NewObjectSpawnManager() *ObjectSpawnManager {
|
||||
return &ObjectSpawnManager{
|
||||
spawnManager: spawnManager,
|
||||
objects: make(map[int32]*ObjectSpawn),
|
||||
objects: make(map[int32]*ObjectSpawn),
|
||||
}
|
||||
}
|
||||
|
||||
// AddObjectSpawn adds an object spawn to both the object and spawn managers
|
||||
// AddObjectSpawn adds an object spawn to the manager
|
||||
func (osm *ObjectSpawnManager) AddObjectSpawn(objectSpawn *ObjectSpawn) error {
|
||||
// Add to spawn manager first
|
||||
if err := osm.spawnManager.AddSpawn(objectSpawn.Spawn); err != nil {
|
||||
return err
|
||||
if objectSpawn == nil {
|
||||
return fmt.Errorf("cannot add nil object spawn")
|
||||
}
|
||||
|
||||
// Add to object tracking
|
||||
osm.objects[objectSpawn.GetID()] = objectSpawn
|
||||
|
||||
// TODO: Add to global spawn manager when it exists
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveObjectSpawn removes an object spawn from both managers
|
||||
// RemoveObjectSpawn removes an object spawn from the manager
|
||||
func (osm *ObjectSpawnManager) RemoveObjectSpawn(spawnID int32) error {
|
||||
// Remove from object tracking
|
||||
if _, exists := osm.objects[spawnID]; !exists {
|
||||
return fmt.Errorf("object spawn %d not found", spawnID)
|
||||
}
|
||||
|
||||
delete(osm.objects, spawnID)
|
||||
|
||||
// Remove from spawn manager
|
||||
return osm.spawnManager.RemoveSpawn(spawnID)
|
||||
// TODO: Remove from global spawn manager when it exists
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetObjectSpawn retrieves an object spawn by ID
|
||||
@ -187,16 +298,8 @@ func (osm *ObjectSpawnManager) GetObjectSpawn(spawnID int32) *ObjectSpawn {
|
||||
func (osm *ObjectSpawnManager) GetObjectSpawnsByZone(zoneName string) []*ObjectSpawn {
|
||||
result := make([]*ObjectSpawn, 0)
|
||||
|
||||
// Get all spawns in zone and filter for objects
|
||||
spawns := osm.spawnManager.GetSpawnsByZone(zoneName)
|
||||
for _, spawn := range spawns {
|
||||
if spawn.GetSpawnType() == ObjectSpawnType {
|
||||
if objectSpawn, exists := osm.objects[spawn.GetID()]; exists {
|
||||
result = append(result, objectSpawn)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Filter by zone when zone system is implemented
|
||||
// For now, return empty slice
|
||||
return result
|
||||
}
|
||||
|
||||
@ -236,7 +339,7 @@ func ConvertSpawnToObject(spawn *spawn.Spawn) *ObjectSpawn {
|
||||
}
|
||||
|
||||
// Set clickable based on appearance flags or other indicators
|
||||
appearance := spawn.GetAppearance()
|
||||
appearance := spawn.GetAppearanceData()
|
||||
if appearance.ShowCommandIcon == ObjectShowCommandIcon {
|
||||
objectSpawn.clickable = true
|
||||
}
|
||||
@ -269,9 +372,13 @@ func LoadObjectSpawnFromData(spawnData map[string]any) *ObjectSpawn {
|
||||
|
||||
// Load position data
|
||||
if x, ok := spawnData["x"].(float32); ok {
|
||||
appearance := objectSpawn.GetAppearance()
|
||||
appearance.Pos.X = x
|
||||
objectSpawn.SetAppearance(appearance)
|
||||
objectSpawn.SetX(x)
|
||||
}
|
||||
if y, ok := spawnData["y"].(float32); ok {
|
||||
objectSpawn.SetY(y, false)
|
||||
}
|
||||
if z, ok := spawnData["z"].(float32); ok {
|
||||
objectSpawn.SetZ(z)
|
||||
}
|
||||
|
||||
// TODO: Load other properties as needed
|
||||
|
@ -67,7 +67,7 @@ type ObjectInterface interface {
|
||||
SetTransporterID(int32)
|
||||
|
||||
// Copying
|
||||
Copy() ObjectInterface
|
||||
Copy() *ObjectSpawn
|
||||
}
|
||||
|
||||
// EntityInterface defines the interface for entities in trade/spell systems
|
||||
|
1230
internal/object/object_test.go
Normal file
1230
internal/object/object_test.go
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user