391 lines
17 KiB
Go
391 lines
17 KiB
Go
package housing
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// HouseZone represents a house type that can be purchased
|
|
type HouseZone struct {
|
|
mu sync.RWMutex
|
|
ID int32 `json:"id"` // Unique house type identifier
|
|
Name string `json:"name"` // House name/type
|
|
ZoneID int32 `json:"zone_id"` // Zone where house is located
|
|
CostCoin int64 `json:"cost_coin"` // Purchase cost in coins
|
|
CostStatus int64 `json:"cost_status"` // Purchase cost in status points
|
|
UpkeepCoin int64 `json:"upkeep_coin"` // Upkeep cost in coins
|
|
UpkeepStatus int64 `json:"upkeep_status"` // Upkeep cost in status points
|
|
Alignment int8 `json:"alignment"` // Alignment requirement
|
|
GuildLevel int8 `json:"guild_level"` // Required guild level
|
|
VaultSlots int `json:"vault_slots"` // Number of vault storage slots
|
|
MaxItems int `json:"max_items"` // Maximum items that can be placed
|
|
MaxVisitors int `json:"max_visitors"` // Maximum concurrent visitors
|
|
UpkeepPeriod int32 `json:"upkeep_period"` // Upkeep period in seconds
|
|
Description string `json:"description"` // Description text
|
|
SaveNeeded bool `json:"-"` // Flag indicating if database save is needed
|
|
}
|
|
|
|
// PlayerHouse represents a house owned by a player
|
|
type PlayerHouse struct {
|
|
mu sync.RWMutex
|
|
UniqueID int64 `json:"unique_id"` // Database unique ID
|
|
CharacterID int32 `json:"char_id"` // Owner character ID
|
|
HouseID int32 `json:"house_id"` // House type ID
|
|
InstanceID int32 `json:"instance_id"` // Instance identifier
|
|
UpkeepDue time.Time `json:"upkeep_due"` // When upkeep is due
|
|
EscrowCoins int64 `json:"escrow_coins"` // Coins in escrow account
|
|
EscrowStatus int64 `json:"escrow_status"` // Status points in escrow
|
|
PlayerName string `json:"player_name"` // Owner's name
|
|
Status int8 `json:"status"` // House status
|
|
Deposits []HouseDeposit `json:"deposits"` // Deposit history
|
|
History []HouseHistory `json:"history"` // Transaction history
|
|
AccessList map[int32]HouseAccess `json:"access_list"` // Player access permissions
|
|
Amenities []HouseAmenity `json:"amenities"` // Purchased amenities
|
|
Items []HouseItem `json:"items"` // Placed items
|
|
Settings HouseSettings `json:"settings"` // House settings
|
|
SaveNeeded bool `json:"-"` // Flag indicating if database save is needed
|
|
}
|
|
|
|
// HouseDeposit represents a deposit transaction
|
|
type HouseDeposit struct {
|
|
Timestamp time.Time `json:"timestamp"` // When deposit was made
|
|
Amount int64 `json:"amount"` // Coin amount deposited
|
|
LastAmount int64 `json:"last_amount"` // Previous coin amount
|
|
Status int64 `json:"status"` // Status points deposited
|
|
LastStatus int64 `json:"last_status"` // Previous status points
|
|
Name string `json:"name"` // Player who made deposit
|
|
CharacterID int32 `json:"character_id"` // Character ID who made deposit
|
|
}
|
|
|
|
// HouseHistory represents a house transaction history entry
|
|
type HouseHistory struct {
|
|
Timestamp time.Time `json:"timestamp"` // When transaction occurred
|
|
Amount int64 `json:"amount"` // Coin amount involved
|
|
Status int64 `json:"status"` // Status points involved
|
|
Reason string `json:"reason"` // Reason for transaction
|
|
Name string `json:"name"` // Player involved
|
|
CharacterID int32 `json:"character_id"` // Character ID involved
|
|
PosFlag int8 `json:"pos_flag"` // Positive/negative transaction
|
|
Type int `json:"type"` // Transaction type
|
|
}
|
|
|
|
// HouseAccess represents access permissions for a player
|
|
type HouseAccess struct {
|
|
CharacterID int32 `json:"character_id"` // Character being granted access
|
|
PlayerName string `json:"player_name"` // Player name
|
|
AccessLevel int8 `json:"access_level"` // Access level
|
|
Permissions int32 `json:"permissions"` // Permission flags
|
|
GrantedBy int32 `json:"granted_by"` // Who granted the access
|
|
GrantedDate time.Time `json:"granted_date"` // When access was granted
|
|
ExpiresDate time.Time `json:"expires_date"` // When access expires (0 = never)
|
|
Notes string `json:"notes"` // Optional notes
|
|
}
|
|
|
|
// HouseAmenity represents a purchased house amenity
|
|
type HouseAmenity struct {
|
|
ID int32 `json:"id"` // Amenity ID
|
|
Type int `json:"type"` // Amenity type
|
|
Name string `json:"name"` // Amenity name
|
|
Cost int64 `json:"cost"` // Purchase cost
|
|
StatusCost int64 `json:"status_cost"` // Status cost
|
|
PurchaseDate time.Time `json:"purchase_date"` // When purchased
|
|
X float32 `json:"x"` // X position
|
|
Y float32 `json:"y"` // Y position
|
|
Z float32 `json:"z"` // Z position
|
|
Heading float32 `json:"heading"` // Heading
|
|
IsActive bool `json:"is_active"` // Whether amenity is active
|
|
}
|
|
|
|
// HouseItem represents an item placed in a house
|
|
type HouseItem struct {
|
|
ID int64 `json:"id"` // Item unique ID
|
|
ItemID int32 `json:"item_id"` // Item template ID
|
|
CharacterID int32 `json:"character_id"` // Who placed the item
|
|
X float32 `json:"x"` // X position
|
|
Y float32 `json:"y"` // Y position
|
|
Z float32 `json:"z"` // Z position
|
|
Heading float32 `json:"heading"` // Heading
|
|
PitchX float32 `json:"pitch_x"` // Pitch X
|
|
PitchY float32 `json:"pitch_y"` // Pitch Y
|
|
RollX float32 `json:"roll_x"` // Roll X
|
|
RollY float32 `json:"roll_y"` // Roll Y
|
|
PlacedDate time.Time `json:"placed_date"` // When item was placed
|
|
Quantity int32 `json:"quantity"` // Item quantity
|
|
Condition int8 `json:"condition"` // Item condition
|
|
House string `json:"house"` // House identifier
|
|
}
|
|
|
|
// HouseSettings represents house configuration settings
|
|
type HouseSettings struct {
|
|
HouseName string `json:"house_name"` // Custom house name
|
|
VisitPermission int8 `json:"visit_permission"` // Who can visit
|
|
PublicNote string `json:"public_note"` // Public note displayed
|
|
PrivateNote string `json:"private_note"` // Private note for owner
|
|
AllowFriends bool `json:"allow_friends"` // Allow friends to visit
|
|
AllowGuild bool `json:"allow_guild"` // Allow guild members to visit
|
|
RequireApproval bool `json:"require_approval"` // Require approval for visits
|
|
ShowOnDirectory bool `json:"show_on_directory"` // Show in house directory
|
|
AllowDecoration bool `json:"allow_decoration"` // Allow others to decorate
|
|
TaxExempt bool `json:"tax_exempt"` // Tax exemption status
|
|
}
|
|
|
|
// HousingManager manages the overall housing system
|
|
type HousingManager struct {
|
|
mu sync.RWMutex
|
|
houseZones map[int32]*HouseZone // Available house types
|
|
playerHouses map[int64]*PlayerHouse // All player houses by unique ID
|
|
characterHouses map[int32][]*PlayerHouse // Houses by character ID
|
|
zoneInstances map[int32]map[int32]*PlayerHouse // Houses by zone and instance
|
|
database HousingDatabase
|
|
clientManager ClientManager
|
|
playerManager PlayerManager
|
|
itemManager ItemManager
|
|
zoneManager ZoneManager
|
|
eventHandler HousingEventHandler
|
|
logger LogHandler
|
|
// Configuration
|
|
enableUpkeep bool
|
|
enableForeclosure bool
|
|
upkeepGracePeriod int32
|
|
maxHousesPerPlayer int
|
|
enableStatistics bool
|
|
}
|
|
|
|
// HousingStatistics tracks housing system usage
|
|
type HousingStatistics struct {
|
|
TotalHouses int64 `json:"total_houses"`
|
|
ActiveHouses int64 `json:"active_houses"`
|
|
ForelosedHouses int64 `json:"foreclosed_houses"`
|
|
TotalDeposits int64 `json:"total_deposits"`
|
|
TotalWithdrawals int64 `json:"total_withdrawals"`
|
|
AverageUpkeepPaid float64 `json:"average_upkeep_paid"`
|
|
MostPopularHouseType int32 `json:"most_popular_house_type"`
|
|
HousesByType map[int32]int64 `json:"houses_by_type"`
|
|
HousesByAlignment map[int8]int64 `json:"houses_by_alignment"`
|
|
RevenueByType map[int]int64 `json:"revenue_by_type"`
|
|
TopDepositors []PlayerDeposits `json:"top_depositors"`
|
|
}
|
|
|
|
// PlayerDeposits tracks deposits by player
|
|
type PlayerDeposits struct {
|
|
CharacterID int32 `json:"character_id"`
|
|
PlayerName string `json:"player_name"`
|
|
TotalDeposits int64 `json:"total_deposits"`
|
|
HouseCount int `json:"house_count"`
|
|
}
|
|
|
|
// HousingSearchCriteria for searching houses
|
|
type HousingSearchCriteria struct {
|
|
OwnerName string `json:"owner_name"` // Filter by owner name
|
|
HouseType int32 `json:"house_type"` // Filter by house type
|
|
Alignment int8 `json:"alignment"` // Filter by alignment
|
|
MinCost int64 `json:"min_cost"` // Minimum cost filter
|
|
MaxCost int64 `json:"max_cost"` // Maximum cost filter
|
|
Zone int32 `json:"zone"` // Filter by zone
|
|
VisitableOnly bool `json:"visitable_only"` // Only houses that can be visited
|
|
PublicOnly bool `json:"public_only"` // Only publicly accessible houses
|
|
NamePattern string `json:"name_pattern"` // Filter by house name pattern
|
|
HasAmenities bool `json:"has_amenities"` // Filter houses with amenities
|
|
MinVaultSlots int `json:"min_vault_slots"` // Minimum vault slots
|
|
}
|
|
|
|
// Database record types for data persistence
|
|
|
|
// HouseZoneData represents database record for house zones
|
|
type HouseZoneData struct {
|
|
ID int32 `json:"id"`
|
|
Name string `json:"name"`
|
|
ZoneID int32 `json:"zone_id"`
|
|
CostCoin int64 `json:"cost_coin"`
|
|
CostStatus int64 `json:"cost_status"`
|
|
UpkeepCoin int64 `json:"upkeep_coin"`
|
|
UpkeepStatus int64 `json:"upkeep_status"`
|
|
Alignment int8 `json:"alignment"`
|
|
GuildLevel int8 `json:"guild_level"`
|
|
VaultSlots int `json:"vault_slots"`
|
|
MaxItems int `json:"max_items"`
|
|
MaxVisitors int `json:"max_visitors"`
|
|
UpkeepPeriod int32 `json:"upkeep_period"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
// PlayerHouseData represents database record for player houses
|
|
type PlayerHouseData struct {
|
|
UniqueID int64 `json:"unique_id"`
|
|
CharacterID int32 `json:"char_id"`
|
|
HouseID int32 `json:"house_id"`
|
|
InstanceID int32 `json:"instance_id"`
|
|
UpkeepDue time.Time `json:"upkeep_due"`
|
|
EscrowCoins int64 `json:"escrow_coins"`
|
|
EscrowStatus int64 `json:"escrow_status"`
|
|
Status int8 `json:"status"`
|
|
HouseName string `json:"house_name"`
|
|
VisitPermission int8 `json:"visit_permission"`
|
|
PublicNote string `json:"public_note"`
|
|
PrivateNote string `json:"private_note"`
|
|
AllowFriends bool `json:"allow_friends"`
|
|
AllowGuild bool `json:"allow_guild"`
|
|
RequireApproval bool `json:"require_approval"`
|
|
ShowOnDirectory bool `json:"show_on_directory"`
|
|
AllowDecoration bool `json:"allow_decoration"`
|
|
TaxExempt bool `json:"tax_exempt"`
|
|
}
|
|
|
|
// HouseDepositData represents database record for deposits
|
|
type HouseDepositData struct {
|
|
HouseID int64 `json:"house_id"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Amount int64 `json:"amount"`
|
|
LastAmount int64 `json:"last_amount"`
|
|
Status int64 `json:"status"`
|
|
LastStatus int64 `json:"last_status"`
|
|
Name string `json:"name"`
|
|
CharacterID int32 `json:"character_id"`
|
|
}
|
|
|
|
// HouseHistoryData represents database record for house history
|
|
type HouseHistoryData struct {
|
|
HouseID int64 `json:"house_id"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Amount int64 `json:"amount"`
|
|
Status int64 `json:"status"`
|
|
Reason string `json:"reason"`
|
|
Name string `json:"name"`
|
|
CharacterID int32 `json:"character_id"`
|
|
PosFlag int8 `json:"pos_flag"`
|
|
Type int `json:"type"`
|
|
}
|
|
|
|
// HouseAccessData represents database record for house access
|
|
type HouseAccessData struct {
|
|
HouseID int64 `json:"house_id"`
|
|
CharacterID int32 `json:"character_id"`
|
|
PlayerName string `json:"player_name"`
|
|
AccessLevel int8 `json:"access_level"`
|
|
Permissions int32 `json:"permissions"`
|
|
GrantedBy int32 `json:"granted_by"`
|
|
GrantedDate time.Time `json:"granted_date"`
|
|
ExpiresDate time.Time `json:"expires_date"`
|
|
Notes string `json:"notes"`
|
|
}
|
|
|
|
// HouseAmenityData represents database record for house amenities
|
|
type HouseAmenityData struct {
|
|
HouseID int64 `json:"house_id"`
|
|
ID int32 `json:"id"`
|
|
Type int `json:"type"`
|
|
Name string `json:"name"`
|
|
Cost int64 `json:"cost"`
|
|
StatusCost int64 `json:"status_cost"`
|
|
PurchaseDate time.Time `json:"purchase_date"`
|
|
X float32 `json:"x"`
|
|
Y float32 `json:"y"`
|
|
Z float32 `json:"z"`
|
|
Heading float32 `json:"heading"`
|
|
IsActive bool `json:"is_active"`
|
|
}
|
|
|
|
// HouseItemData represents database record for house items
|
|
type HouseItemData struct {
|
|
HouseID int64 `json:"house_id"`
|
|
ID int64 `json:"id"`
|
|
ItemID int32 `json:"item_id"`
|
|
CharacterID int32 `json:"character_id"`
|
|
X float32 `json:"x"`
|
|
Y float32 `json:"y"`
|
|
Z float32 `json:"z"`
|
|
Heading float32 `json:"heading"`
|
|
PitchX float32 `json:"pitch_x"`
|
|
PitchY float32 `json:"pitch_y"`
|
|
RollX float32 `json:"roll_x"`
|
|
RollY float32 `json:"roll_y"`
|
|
PlacedDate time.Time `json:"placed_date"`
|
|
Quantity int32 `json:"quantity"`
|
|
Condition int8 `json:"condition"`
|
|
House string `json:"house"`
|
|
}
|
|
|
|
// PacketData structures for client communication
|
|
|
|
// HousePurchasePacketData represents data for house purchase UI
|
|
type HousePurchasePacketData struct {
|
|
HouseID int32 `json:"house_id"`
|
|
Name string `json:"name"`
|
|
CostCoin int64 `json:"cost_coin"`
|
|
CostStatus int64 `json:"cost_status"`
|
|
UpkeepCoin int64 `json:"upkeep_coin"`
|
|
UpkeepStatus int64 `json:"upkeep_status"`
|
|
Alignment int8 `json:"alignment"`
|
|
GuildLevel int8 `json:"guild_level"`
|
|
VaultSlots int `json:"vault_slots"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
// HouseListPacketData represents data for housing list UI
|
|
type HouseListPacketData struct {
|
|
Houses []PlayerHouseInfo `json:"houses"`
|
|
}
|
|
|
|
// PlayerHouseInfo represents house info for list display
|
|
type PlayerHouseInfo struct {
|
|
UniqueID int64 `json:"unique_id"`
|
|
Name string `json:"name"`
|
|
HouseType string `json:"house_type"`
|
|
UpkeepDue time.Time `json:"upkeep_due"`
|
|
EscrowCoins int64 `json:"escrow_coins"`
|
|
EscrowStatus int64 `json:"escrow_status"`
|
|
Status int8 `json:"status"`
|
|
CanEnter bool `json:"can_enter"`
|
|
}
|
|
|
|
// BaseHouseWindowPacketData represents data for main house management UI
|
|
type BaseHouseWindowPacketData struct {
|
|
HouseInfo PlayerHouseInfo `json:"house_info"`
|
|
RecentDeposits []HouseDeposit `json:"recent_deposits"`
|
|
RecentHistory []HouseHistory `json:"recent_history"`
|
|
Amenities []HouseAmenity `json:"amenities"`
|
|
Settings HouseSettings `json:"settings"`
|
|
CanManage bool `json:"can_manage"`
|
|
}
|
|
|
|
// HouseVisitPacketData represents data for house visit UI
|
|
type HouseVisitPacketData struct {
|
|
AvailableHouses []VisitableHouse `json:"available_houses"`
|
|
}
|
|
|
|
// VisitableHouse represents a house that can be visited
|
|
type VisitableHouse struct {
|
|
UniqueID int64 `json:"unique_id"`
|
|
OwnerName string `json:"owner_name"`
|
|
HouseName string `json:"house_name"`
|
|
HouseType string `json:"house_type"`
|
|
PublicNote string `json:"public_note"`
|
|
CanVisit bool `json:"can_visit"`
|
|
RequiresApproval bool `json:"requires_approval"`
|
|
}
|
|
|
|
// Event structures for housing system events
|
|
|
|
// HousingEvent represents a housing system event
|
|
type HousingEvent struct {
|
|
ID int64 `json:"id"`
|
|
HouseID int64 `json:"house_id"`
|
|
EventType int `json:"event_type"`
|
|
CharacterID int32 `json:"character_id"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Data string `json:"data"`
|
|
}
|
|
|
|
// Configuration structure for housing system
|
|
type HousingConfig struct {
|
|
EnableUpkeep bool `json:"enable_upkeep"`
|
|
EnableForeclosure bool `json:"enable_foreclosure"`
|
|
UpkeepGracePeriod int32 `json:"upkeep_grace_period"` // seconds
|
|
MaxHousesPerPlayer int `json:"max_houses_per_player"`
|
|
EnableStatistics bool `json:"enable_statistics"`
|
|
AutoCleanupInterval int32 `json:"auto_cleanup_interval"` // seconds
|
|
MaxHistoryEntries int `json:"max_history_entries"`
|
|
MaxDepositEntries int `json:"max_deposit_entries"`
|
|
DefaultInstanceLifetime int32 `json:"default_instance_lifetime"` // seconds
|
|
}
|