interface to any
This commit is contained in:
parent
41f80008c9
commit
5cb4b5b56c
@ -101,19 +101,18 @@ func (d *Database) GetPool() *sqlitex.Pool {
|
|||||||
return d.pool
|
return d.pool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Query executes a query that returns rows
|
// Query executes a query that returns rows
|
||||||
func (d *Database) Query(query string, args ...interface{}) (*sql.Rows, error) {
|
func (d *Database) Query(query string, args ...any) (*sql.Rows, error) {
|
||||||
return d.db.Query(query, args...)
|
return d.db.Query(query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryRow executes a query that returns a single row
|
// QueryRow executes a query that returns a single row
|
||||||
func (d *Database) QueryRow(query string, args ...interface{}) *sql.Row {
|
func (d *Database) QueryRow(query string, args ...any) *sql.Row {
|
||||||
return d.db.QueryRow(query, args...)
|
return d.db.QueryRow(query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec executes a query that doesn't return rows
|
// Exec executes a query that doesn't return rows
|
||||||
func (d *Database) Exec(query string, args ...interface{}) (sql.Result, error) {
|
func (d *Database) Exec(query string, args ...any) (sql.Result, error) {
|
||||||
return d.db.Exec(query, args...)
|
return d.db.Exec(query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,7 +173,7 @@ func NewMySQL(dsn string) (*Database, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetZones retrieves all zones from the database
|
// GetZones retrieves all zones from the database
|
||||||
func (d *Database) GetZones() ([]map[string]interface{}, error) {
|
func (d *Database) GetZones() ([]map[string]any, error) {
|
||||||
rows, err := d.Query(`
|
rows, err := d.Query(`
|
||||||
SELECT id, name, file, description, motd, min_level, max_level,
|
SELECT id, name, file, description, motd, min_level, max_level,
|
||||||
min_version, xp_modifier, city_zone, weather_allowed,
|
min_version, xp_modifier, city_zone, weather_allowed,
|
||||||
@ -187,10 +186,10 @@ func (d *Database) GetZones() ([]map[string]interface{}, error) {
|
|||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
var zones []map[string]interface{}
|
var zones []map[string]any
|
||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
zone := make(map[string]interface{})
|
zone := make(map[string]any)
|
||||||
var id, minLevel, maxLevel, minVersion int
|
var id, minLevel, maxLevel, minVersion int
|
||||||
var name, file, description, motd string
|
var name, file, description, motd string
|
||||||
var xpModifier, safeX, safeY, safeZ, safeHeading float64
|
var xpModifier, safeX, safeY, safeZ, safeHeading float64
|
||||||
|
@ -43,8 +43,8 @@ type WorldInterface interface {
|
|||||||
|
|
||||||
// DatabaseInterface defines database operations needed by packet handlers
|
// DatabaseInterface defines database operations needed by packet handlers
|
||||||
type DatabaseInterface interface {
|
type DatabaseInterface interface {
|
||||||
GetCharacter(characterID int32) (map[string]interface{}, error)
|
GetCharacter(characterID int32) (map[string]any, error)
|
||||||
SaveCharacter(characterID int32, data map[string]interface{}) error
|
SaveCharacter(characterID int32, data map[string]any) error
|
||||||
// Add more database methods as needed
|
// Add more database methods as needed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ All server data is persisted to SQLite:
|
|||||||
func (d *Database) LoadRules() (map[string]map[string]string, error)
|
func (d *Database) LoadRules() (map[string]map[string]string, error)
|
||||||
|
|
||||||
// Zone management
|
// Zone management
|
||||||
func (d *Database) GetZones() ([]map[string]interface{}, error)
|
func (d *Database) GetZones() ([]map[string]any, error)
|
||||||
|
|
||||||
// Character persistence (planned)
|
// Character persistence (planned)
|
||||||
func (d *Database) SaveCharacter(character *Character) error
|
func (d *Database) SaveCharacter(character *Character) error
|
||||||
|
@ -80,7 +80,7 @@ const (
|
|||||||
type AchievementEvent struct {
|
type AchievementEvent struct {
|
||||||
Type AchievementEventType
|
Type AchievementEventType
|
||||||
CharacterID int32
|
CharacterID int32
|
||||||
Data map[string]interface{}
|
Data map[string]any
|
||||||
Timestamp int64
|
Timestamp int64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,7 +355,7 @@ func (aeh *AchievementEventHandler) handleGenericEvent(event *AchievementEvent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TriggerEvent is a convenience method for triggering achievement events
|
// TriggerEvent is a convenience method for triggering achievement events
|
||||||
func (w *World) TriggerAchievementEvent(eventType AchievementEventType, characterID int32, data map[string]interface{}) {
|
func (w *World) TriggerAchievementEvent(eventType AchievementEventType, characterID int32, data map[string]any) {
|
||||||
if w.achievementMgr == nil {
|
if w.achievementMgr == nil {
|
||||||
return // Achievement system not initialized
|
return // Achievement system not initialized
|
||||||
}
|
}
|
||||||
@ -379,7 +379,7 @@ func (w *World) TriggerAchievementEvent(eventType AchievementEventType, characte
|
|||||||
|
|
||||||
// OnNPCKill triggers an NPC kill achievement event
|
// OnNPCKill triggers an NPC kill achievement event
|
||||||
func (w *World) OnNPCKill(characterID int32, npcID int32, npcLevel int32) {
|
func (w *World) OnNPCKill(characterID int32, npcID int32, npcLevel int32) {
|
||||||
w.TriggerAchievementEvent(EventNPCKill, characterID, map[string]interface{}{
|
w.TriggerAchievementEvent(EventNPCKill, characterID, map[string]any{
|
||||||
"npc_id": npcID,
|
"npc_id": npcID,
|
||||||
"level": npcLevel,
|
"level": npcLevel,
|
||||||
})
|
})
|
||||||
@ -387,21 +387,21 @@ func (w *World) OnNPCKill(characterID int32, npcID int32, npcLevel int32) {
|
|||||||
|
|
||||||
// OnQuestComplete triggers a quest completion achievement event
|
// OnQuestComplete triggers a quest completion achievement event
|
||||||
func (w *World) OnQuestComplete(characterID int32, questID int32) {
|
func (w *World) OnQuestComplete(characterID int32, questID int32) {
|
||||||
w.TriggerAchievementEvent(EventQuestCompleted, characterID, map[string]interface{}{
|
w.TriggerAchievementEvent(EventQuestCompleted, characterID, map[string]any{
|
||||||
"quest_id": questID,
|
"quest_id": questID,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnLevelGain triggers a level gain achievement event
|
// OnLevelGain triggers a level gain achievement event
|
||||||
func (w *World) OnLevelGain(characterID int32, newLevel int32) {
|
func (w *World) OnLevelGain(characterID int32, newLevel int32) {
|
||||||
w.TriggerAchievementEvent(EventLevelGain, characterID, map[string]interface{}{
|
w.TriggerAchievementEvent(EventLevelGain, characterID, map[string]any{
|
||||||
"level": newLevel,
|
"level": newLevel,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnItemDiscovered triggers an item discovery achievement event
|
// OnItemDiscovered triggers an item discovery achievement event
|
||||||
func (w *World) OnItemDiscovered(characterID int32, itemID int32, rarity string) {
|
func (w *World) OnItemDiscovered(characterID int32, itemID int32, rarity string) {
|
||||||
w.TriggerAchievementEvent(EventItemDiscovered, characterID, map[string]interface{}{
|
w.TriggerAchievementEvent(EventItemDiscovered, characterID, map[string]any{
|
||||||
"item_id": itemID,
|
"item_id": itemID,
|
||||||
"rarity": rarity,
|
"rarity": rarity,
|
||||||
})
|
})
|
||||||
@ -409,7 +409,7 @@ func (w *World) OnItemDiscovered(characterID int32, itemID int32, rarity string)
|
|||||||
|
|
||||||
// OnZoneDiscovered triggers a zone discovery achievement event
|
// OnZoneDiscovered triggers a zone discovery achievement event
|
||||||
func (w *World) OnZoneDiscovered(characterID int32, zoneID int32) {
|
func (w *World) OnZoneDiscovered(characterID int32, zoneID int32) {
|
||||||
w.TriggerAchievementEvent(EventZoneDiscovered, characterID, map[string]interface{}{
|
w.TriggerAchievementEvent(EventZoneDiscovered, characterID, map[string]any{
|
||||||
"zone_id": zoneID,
|
"zone_id": zoneID,
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -289,11 +289,11 @@ func (am *AchievementManager) RemovePlayerManager(characterID int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetStatistics returns achievement system statistics
|
// GetStatistics returns achievement system statistics
|
||||||
func (am *AchievementManager) GetStatistics() map[string]interface{} {
|
func (am *AchievementManager) GetStatistics() map[string]any {
|
||||||
am.mutex.RLock()
|
am.mutex.RLock()
|
||||||
defer am.mutex.RUnlock()
|
defer am.mutex.RUnlock()
|
||||||
|
|
||||||
stats := map[string]interface{}{
|
stats := map[string]any{
|
||||||
"total_achievements": am.masterList.Size(),
|
"total_achievements": am.masterList.Size(),
|
||||||
"online_players": len(am.playerManagers),
|
"online_players": len(am.playerManagers),
|
||||||
"categories": am.masterList.GetCategories(),
|
"categories": am.masterList.GetCategories(),
|
||||||
|
@ -25,7 +25,7 @@ type Client struct {
|
|||||||
Player *entity.Entity
|
Player *entity.Entity
|
||||||
|
|
||||||
// Connection information
|
// Connection information
|
||||||
Connection interface{} // TODO: Will be *udp.Connection
|
Connection any // TODO: Will be *udp.Connection
|
||||||
IPAddress string
|
IPAddress string
|
||||||
ConnectedTime time.Time
|
ConnectedTime time.Time
|
||||||
LastActivity time.Time
|
LastActivity time.Time
|
||||||
|
@ -272,7 +272,7 @@ func (im *ItemManager) SearchItems(name string, maxResults int32) []*items.Item
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetStatistics returns item system statistics
|
// GetStatistics returns item system statistics
|
||||||
func (im *ItemManager) GetStatistics() map[string]interface{} {
|
func (im *ItemManager) GetStatistics() map[string]any {
|
||||||
im.mutex.RLock()
|
im.mutex.RLock()
|
||||||
defer im.mutex.RUnlock()
|
defer im.mutex.RUnlock()
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ func (im *ItemManager) GetStatistics() map[string]interface{} {
|
|||||||
totalWorldDrops += len(drops)
|
totalWorldDrops += len(drops)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := make(map[string]interface{})
|
result := make(map[string]any)
|
||||||
for k, v := range systemStats {
|
for k, v := range systemStats {
|
||||||
result[k] = v
|
result[k] = v
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"eq2emu/internal/database"
|
||||||
"eq2emu/internal/npc"
|
"eq2emu/internal/npc"
|
||||||
"eq2emu/internal/npc/ai"
|
"eq2emu/internal/npc/ai"
|
||||||
"eq2emu/internal/database"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NPCManager manages NPCs for the world server
|
// NPCManager manages NPCs for the world server
|
||||||
@ -412,7 +412,7 @@ func (nm *NPCManager) RemoveNPCFromZone(zoneID int32, npcID int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetStatistics returns NPC system statistics
|
// GetStatistics returns NPC system statistics
|
||||||
func (nm *NPCManager) GetStatistics() map[string]interface{} {
|
func (nm *NPCManager) GetStatistics() map[string]any {
|
||||||
nm.mutex.RLock()
|
nm.mutex.RLock()
|
||||||
defer nm.mutex.RUnlock()
|
defer nm.mutex.RUnlock()
|
||||||
|
|
||||||
@ -423,7 +423,7 @@ func (nm *NPCManager) GetStatistics() map[string]interface{} {
|
|||||||
totalZones := len(nm.npcsByZone)
|
totalZones := len(nm.npcsByZone)
|
||||||
totalInCombat := len(nm.activeCombat)
|
totalInCombat := len(nm.activeCombat)
|
||||||
|
|
||||||
result := map[string]interface{}{
|
result := map[string]any{
|
||||||
"total_npcs": stats.TotalNPCs,
|
"total_npcs": stats.TotalNPCs,
|
||||||
"npcs_in_combat": stats.NPCsInCombat,
|
"npcs_in_combat": stats.NPCsInCombat,
|
||||||
"npcs_with_spells": stats.NPCsWithSpells,
|
"npcs_with_spells": stats.NPCsWithSpells,
|
||||||
|
@ -304,14 +304,14 @@ func (w *World) SendCharacterAchievements(client *Client) {
|
|||||||
|
|
||||||
// Get all achievements with player progress
|
// Get all achievements with player progress
|
||||||
allAchievements := w.achievementMgr.masterList.GetAllAchievements()
|
allAchievements := w.achievementMgr.masterList.GetAllAchievements()
|
||||||
characterData := make(map[string]interface{})
|
characterData := make(map[string]any)
|
||||||
|
|
||||||
for achievementID, achievement := range allAchievements {
|
for achievementID, achievement := range allAchievements {
|
||||||
progress := w.achievementMgr.GetPlayerProgress(characterID, achievementID)
|
progress := w.achievementMgr.GetPlayerProgress(characterID, achievementID)
|
||||||
completed := w.achievementMgr.IsPlayerCompleted(characterID, achievementID)
|
completed := w.achievementMgr.IsPlayerCompleted(characterID, achievementID)
|
||||||
percentage := w.achievementMgr.GetCompletionPercentage(characterID, achievementID)
|
percentage := w.achievementMgr.GetCompletionPercentage(characterID, achievementID)
|
||||||
|
|
||||||
characterData[fmt.Sprintf("achievement_%d", achievementID)] = map[string]interface{}{
|
characterData[fmt.Sprintf("achievement_%d", achievementID)] = map[string]any{
|
||||||
"id": achievementID,
|
"id": achievementID,
|
||||||
"title": achievement.Title,
|
"title": achievement.Title,
|
||||||
"description": achievement.UncompletedText,
|
"description": achievement.UncompletedText,
|
||||||
@ -564,7 +564,7 @@ func (w *World) SendNPCInfo(client *Client, npcID int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendNPCUpdate sends NPC update to clients in range
|
// SendNPCUpdate sends NPC update to clients in range
|
||||||
func (w *World) SendNPCUpdate(npcID int32, updateType string, data map[string]interface{}) {
|
func (w *World) SendNPCUpdate(npcID int32, updateType string, data map[string]any) {
|
||||||
// TODO: Implement NPC update broadcasting
|
// TODO: Implement NPC update broadcasting
|
||||||
// This would send updates to all clients in range of the NPC
|
// This would send updates to all clients in range of the NPC
|
||||||
|
|
||||||
@ -604,13 +604,13 @@ type WorldDatabaseAdapter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCharacter implements packets.DatabaseInterface
|
// GetCharacter implements packets.DatabaseInterface
|
||||||
func (wda *WorldDatabaseAdapter) GetCharacter(characterID int32) (map[string]interface{}, error) {
|
func (wda *WorldDatabaseAdapter) GetCharacter(characterID int32) (map[string]any, error) {
|
||||||
// TODO: Implement character loading from database
|
// TODO: Implement character loading from database
|
||||||
return nil, fmt.Errorf("character loading not yet implemented")
|
return nil, fmt.Errorf("character loading not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SaveCharacter implements packets.DatabaseInterface
|
// SaveCharacter implements packets.DatabaseInterface
|
||||||
func (wda *WorldDatabaseAdapter) SaveCharacter(characterID int32, data map[string]interface{}) error {
|
func (wda *WorldDatabaseAdapter) SaveCharacter(characterID int32, data map[string]any) error {
|
||||||
// TODO: Implement character saving to database
|
// TODO: Implement character saving to database
|
||||||
return fmt.Errorf("character saving not yet implemented")
|
return fmt.Errorf("character saving not yet implemented")
|
||||||
}
|
}
|
||||||
@ -902,7 +902,7 @@ func (w *World) HandleItemUpdate(ctx *packets.PacketContext, packet *packets.Pac
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendItemDetails sends detailed item information to a client
|
// SendItemDetails sends detailed item information to a client
|
||||||
func (w *World) SendItemDetails(client *Client, item interface{}) {
|
func (w *World) SendItemDetails(client *Client, item any) {
|
||||||
if w.itemMgr == nil {
|
if w.itemMgr == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -947,7 +947,7 @@ func (w *World) SendPlayerInventory(client *Client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendItemUpdate sends item update to client
|
// SendItemUpdate sends item update to client
|
||||||
func (w *World) SendItemUpdate(client *Client, updateType string, itemData map[string]interface{}) {
|
func (w *World) SendItemUpdate(client *Client, updateType string, itemData map[string]any) {
|
||||||
if w.itemMgr == nil {
|
if w.itemMgr == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -961,7 +961,7 @@ func (w *World) SendItemUpdate(client *Client, updateType string, itemData map[s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BroadcastItemUpdate broadcasts item updates to nearby players
|
// BroadcastItemUpdate broadcasts item updates to nearby players
|
||||||
func (w *World) BroadcastItemUpdate(sourcePlayerID uint32, updateType string, itemData map[string]interface{}) {
|
func (w *World) BroadcastItemUpdate(sourcePlayerID uint32, updateType string, itemData map[string]any) {
|
||||||
// TODO: Implement item update broadcasting (for things like equipment changes visible to others)
|
// TODO: Implement item update broadcasting (for things like equipment changes visible to others)
|
||||||
|
|
||||||
fmt.Printf("Broadcasting item update from player %d: %s - %v\n",
|
fmt.Printf("Broadcasting item update from player %d: %s - %v\n",
|
||||||
|
@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"eq2emu/internal/titles"
|
|
||||||
"eq2emu/internal/database"
|
"eq2emu/internal/database"
|
||||||
|
"eq2emu/internal/titles"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TitleManager manages titles for the world server
|
// TitleManager manages titles for the world server
|
||||||
@ -198,7 +198,7 @@ func (tm *TitleManager) ProcessAchievementCompletion(playerID int32, achievement
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetStatistics returns title system statistics
|
// GetStatistics returns title system statistics
|
||||||
func (tm *TitleManager) GetStatistics() map[string]interface{} {
|
func (tm *TitleManager) GetStatistics() map[string]any {
|
||||||
tm.mutex.RLock()
|
tm.mutex.RLock()
|
||||||
defer tm.mutex.RUnlock()
|
defer tm.mutex.RUnlock()
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ func (tm *TitleManager) GetStatistics() map[string]interface{} {
|
|||||||
titleManagerStats := tm.titleManager.GetStatistics()
|
titleManagerStats := tm.titleManager.GetStatistics()
|
||||||
|
|
||||||
// Combine with our own statistics
|
// Combine with our own statistics
|
||||||
stats := map[string]interface{}{
|
stats := map[string]any{
|
||||||
"total_titles": tm.titleManager.GetMasterList().GetTitleCount(),
|
"total_titles": tm.titleManager.GetMasterList().GetTitleCount(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,10 +49,10 @@ type World struct {
|
|||||||
itemMgr *ItemManager
|
itemMgr *ItemManager
|
||||||
|
|
||||||
// Master lists (singletons)
|
// Master lists (singletons)
|
||||||
masterSpells interface{} // TODO: implement spell manager
|
masterSpells any // TODO: implement spell manager
|
||||||
masterQuests interface{} // TODO: implement quest manager
|
masterQuests any // TODO: implement quest manager
|
||||||
masterSkills interface{} // TODO: implement skill manager
|
masterSkills any // TODO: implement skill manager
|
||||||
masterFactions interface{} // TODO: implement faction manager
|
masterFactions any // TODO: implement faction manager
|
||||||
|
|
||||||
// Server statistics
|
// Server statistics
|
||||||
stats *ServerStatistics
|
stats *ServerStatistics
|
||||||
|
Loading…
x
Reference in New Issue
Block a user