520 lines
12 KiB
Go
520 lines
12 KiB
Go
package player
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"eq2emu/internal/common"
|
|
"eq2emu/internal/entity"
|
|
"eq2emu/internal/factions"
|
|
"eq2emu/internal/languages"
|
|
"eq2emu/internal/quests"
|
|
"eq2emu/internal/skills"
|
|
"eq2emu/internal/spells"
|
|
"eq2emu/internal/titles"
|
|
)
|
|
|
|
// SpawnState represents the state of a spawn for a player
|
|
type SpawnState int32
|
|
|
|
const (
|
|
SPAWN_STATE_NONE SpawnState = iota
|
|
SPAWN_STATE_SENDING
|
|
SPAWN_STATE_SENT_WAIT
|
|
SPAWN_STATE_SENT
|
|
SPAWN_STATE_REMOVING
|
|
SPAWN_STATE_REMOVING_SLEEP
|
|
SPAWN_STATE_REMOVED
|
|
)
|
|
|
|
// HistoryData represents character history data matching the character_history table
|
|
type HistoryData struct {
|
|
Value int32
|
|
Value2 int32
|
|
Location [200]byte
|
|
EventID int32
|
|
EventDate int32
|
|
NeedsSave bool
|
|
}
|
|
|
|
// LUAHistory represents history set through the LUA system
|
|
type LUAHistory struct {
|
|
Value int32
|
|
Value2 int32
|
|
SaveNeeded bool
|
|
}
|
|
|
|
// SpellBookEntry represents a spell in the player's spell book
|
|
type SpellBookEntry struct {
|
|
SpellID int32
|
|
Tier int8
|
|
Type int32
|
|
Slot int32
|
|
RecastAvailable int32
|
|
Status int8
|
|
Recast int16
|
|
Timer int32
|
|
SaveNeeded bool
|
|
InUse bool
|
|
InRemiss bool
|
|
Player *Player
|
|
Visible bool
|
|
}
|
|
|
|
// GMTagFilter represents a GM visual filter
|
|
type GMTagFilter struct {
|
|
FilterType int32
|
|
FilterValue int32
|
|
FilterSearchCriteria [256]byte
|
|
VisualTag int16
|
|
}
|
|
|
|
// QuickBarItem represents an item on the player's quickbar
|
|
type QuickBarItem struct {
|
|
Deleted bool
|
|
Hotbar int32
|
|
Slot int32
|
|
Type int32
|
|
Icon int16
|
|
IconType int16
|
|
ID int32
|
|
Tier int8
|
|
UniqueID int64
|
|
Text common.EQ2String16Bit
|
|
}
|
|
|
|
// LoginAppearances represents equipment appearance data for login
|
|
type LoginAppearances struct {
|
|
Deleted bool
|
|
EquipType int16
|
|
Red int8
|
|
Green int8
|
|
Blue int8
|
|
HRed int8
|
|
HGreen int8
|
|
HBlue int8
|
|
UpdateNeeded bool
|
|
}
|
|
|
|
// SpawnQueueState represents the spawn queue state with timer
|
|
type SpawnQueueState struct {
|
|
SpawnStateTimer time.Time
|
|
IndexID int16
|
|
}
|
|
|
|
// PlayerLoginAppearance manages login appearance data
|
|
type PlayerLoginAppearance struct {
|
|
appearanceList map[int8]*LoginAppearances
|
|
}
|
|
|
|
// InstanceData represents instance information for a player
|
|
type InstanceData struct {
|
|
DBID int32
|
|
InstanceID int32
|
|
ZoneID int32
|
|
ZoneInstanceType int8
|
|
ZoneName string
|
|
LastSuccessTimestamp int32
|
|
LastFailureTimestamp int32
|
|
SuccessLockoutTime int32
|
|
FailureLockoutTime int32
|
|
}
|
|
|
|
// CharacterInstances manages all instances for a character
|
|
type CharacterInstances struct {
|
|
instanceList []InstanceData
|
|
mu sync.Mutex
|
|
}
|
|
|
|
// PlayerInfo contains detailed player information for serialization
|
|
type PlayerInfo struct {
|
|
player *Player
|
|
infoStruct *entity.InfoStruct
|
|
houseZoneID int32
|
|
bindZoneID int32
|
|
bindX float32
|
|
bindY float32
|
|
bindZ float32
|
|
bindHeading float32
|
|
boatXOffset float32
|
|
boatYOffset float32
|
|
boatZOffset float32
|
|
boatSpawn int32
|
|
changes []byte
|
|
origPacket []byte
|
|
petChanges []byte
|
|
petOrigPacket []byte
|
|
}
|
|
|
|
// PlayerControlFlags manages player control flags
|
|
type PlayerControlFlags struct {
|
|
flagsChanged bool
|
|
flagChanges map[int8]map[int8]int8
|
|
currentFlags map[int8]map[int8]bool
|
|
controlMutex sync.Mutex
|
|
changesMutex sync.Mutex
|
|
}
|
|
|
|
// PlayerGroup represents a player's group information
|
|
type PlayerGroup struct {
|
|
// TODO: Implement group structure
|
|
}
|
|
|
|
// GroupMemberInfo represents information about a group member
|
|
type GroupMemberInfo struct {
|
|
// TODO: Implement group member structure
|
|
}
|
|
|
|
// Statistic represents a player statistic
|
|
type Statistic struct {
|
|
StatID int32
|
|
Value int64
|
|
Date int32
|
|
}
|
|
|
|
// Mail represents in-game mail
|
|
type Mail struct {
|
|
MailID int32
|
|
PlayerTo int32
|
|
PlayerFrom int32
|
|
Subject string
|
|
MailBody string
|
|
AlreadyRead int8
|
|
MailType int8
|
|
Coin int32
|
|
Stack int16
|
|
Postage int32
|
|
AttachmentID int32
|
|
CharItemID int32
|
|
TimeStamp int32
|
|
ExpireTime int32
|
|
}
|
|
|
|
// Collection represents a player collection
|
|
type Collection struct {
|
|
// TODO: Implement collection structure
|
|
}
|
|
|
|
// PlayerItemList manages the player's items
|
|
type PlayerItemList struct {
|
|
// TODO: Implement item list structure
|
|
}
|
|
|
|
// PlayerSkillList manages the player's skills
|
|
type PlayerSkillList struct {
|
|
skills.PlayerSkillList
|
|
}
|
|
|
|
// PlayerTitlesList manages the player's titles
|
|
type PlayerTitlesList struct {
|
|
titles.PlayerTitlesList
|
|
}
|
|
|
|
// PlayerLanguagesList manages the player's languages
|
|
type PlayerLanguagesList struct {
|
|
languages.PlayerLanguagesList
|
|
}
|
|
|
|
// PlayerFaction manages the player's faction standings
|
|
type PlayerFaction struct {
|
|
factions.PlayerFaction
|
|
}
|
|
|
|
// PlayerCollectionList manages the player's collections
|
|
type PlayerCollectionList struct {
|
|
// TODO: Implement collection list structure
|
|
}
|
|
|
|
// PlayerRecipeList manages the player's recipes
|
|
type PlayerRecipeList struct {
|
|
// TODO: Implement recipe list structure
|
|
}
|
|
|
|
// PlayerRecipeBookList manages the player's recipe books
|
|
type PlayerRecipeBookList struct {
|
|
// TODO: Implement recipe book list structure
|
|
}
|
|
|
|
// PlayerAchievementList manages the player's achievements
|
|
type PlayerAchievementList struct {
|
|
// TODO: Implement achievement list structure
|
|
}
|
|
|
|
// PlayerAchievementUpdateList manages achievement updates
|
|
type PlayerAchievementUpdateList struct {
|
|
// TODO: Implement achievement update list structure
|
|
}
|
|
|
|
// Guild represents a player's guild
|
|
type Guild struct {
|
|
// TODO: Implement guild structure
|
|
}
|
|
|
|
// Recipe represents a crafting recipe
|
|
type Recipe struct {
|
|
// TODO: Implement recipe structure
|
|
}
|
|
|
|
// TraitData represents a character trait
|
|
type TraitData struct {
|
|
// TODO: Implement trait structure
|
|
}
|
|
|
|
// PacketStruct represents a network packet structure
|
|
type PacketStruct struct {
|
|
// TODO: Implement packet structure
|
|
}
|
|
|
|
// Client represents a connected client
|
|
type Client struct {
|
|
// TODO: Implement client structure
|
|
}
|
|
|
|
// ZoneServer represents a zone server instance
|
|
type ZoneServer struct {
|
|
// TODO: Implement zone server structure
|
|
}
|
|
|
|
// NPC represents a non-player character
|
|
type NPC struct {
|
|
// TODO: Implement NPC structure
|
|
}
|
|
|
|
// Item represents an in-game item
|
|
type Item struct {
|
|
// TODO: Implement item structure
|
|
}
|
|
|
|
// MaintainedEffects represents a maintained spell effect
|
|
type MaintainedEffects struct {
|
|
spells.MaintainedEffects
|
|
}
|
|
|
|
// SpellEffects represents active spell effects
|
|
type SpellEffects struct {
|
|
spells.SpellEffects
|
|
}
|
|
|
|
// Player represents a player character extending Entity
|
|
type Player struct {
|
|
entity.Entity
|
|
|
|
// Client connection
|
|
client *Client
|
|
|
|
// Character identifiers
|
|
charID int32
|
|
spawnID int32
|
|
accountID int32
|
|
|
|
// Tutorial progress
|
|
tutorialStep int8
|
|
|
|
// Player information
|
|
info *PlayerInfo
|
|
|
|
// Group information
|
|
group *PlayerGroup
|
|
|
|
// Movement and position
|
|
movementPacket []byte
|
|
oldMovementPacket []byte
|
|
lastMovementActivity int16
|
|
posPacketSpeed float32
|
|
testX float32
|
|
testY float32
|
|
testZ float32
|
|
testTime int32
|
|
|
|
// Combat
|
|
rangeAttack bool
|
|
combatTarget *entity.Entity
|
|
resurrecting bool
|
|
|
|
// Packet management
|
|
packetNum int32
|
|
spawnIndex int16
|
|
spellCount int16
|
|
spellOrigPacket []byte
|
|
spellXorPacket []byte
|
|
raidOrigPacket []byte
|
|
raidXorPacket []byte
|
|
|
|
// Spawn management
|
|
spawnVisPacketList map[int32]string
|
|
spawnInfoPacketList map[int32]string
|
|
spawnPosPacketList map[int32]string
|
|
spawnPacketSent map[int32]int8
|
|
spawnStateList map[int32]*SpawnQueueState
|
|
playerSpawnIDMap map[int32]*entity.Spawn
|
|
playerSpawnReverseIDMap map[*entity.Spawn]int32
|
|
playerAggroRangeSpawns map[int32]bool
|
|
|
|
// Temporary spawn packets for XOR
|
|
spawnTmpVisXorPacket []byte
|
|
spawnTmpPosXorPacket []byte
|
|
spawnTmpInfoXorPacket []byte
|
|
visXorSize int32
|
|
posXorSize int32
|
|
infoXorSize int32
|
|
|
|
// Packet structures
|
|
spawnPosStruct *PacketStruct
|
|
spawnInfoStruct *PacketStruct
|
|
spawnVisStruct *PacketStruct
|
|
spawnHeaderStruct *PacketStruct
|
|
spawnFooterStruct *PacketStruct
|
|
widgetFooterStruct *PacketStruct
|
|
signFooterStruct *PacketStruct
|
|
|
|
// Character flags
|
|
charsheetChanged atomic.Bool
|
|
raidsheetChanged atomic.Bool
|
|
hassentRaid atomic.Bool
|
|
quickbarUpdated bool
|
|
|
|
// Quest system
|
|
playerQuests map[int32]*quests.Quest
|
|
completedQuests map[int32]*quests.Quest
|
|
pendingQuests map[int32]*quests.Quest
|
|
currentQuestFlagged map[*entity.Spawn]bool
|
|
playerSpawnQuestsRequired map[int32][]int32
|
|
playerSpawnHistoryRequired map[int32][]int32
|
|
|
|
// Skills and spells
|
|
spells []*SpellBookEntry
|
|
passiveSpells []int32
|
|
skillList PlayerSkillList
|
|
allSpellsLocked bool
|
|
|
|
// Items and equipment
|
|
itemList PlayerItemList
|
|
quickbarItems []*QuickBarItem
|
|
pendingLootItems map[int32]map[int32]bool
|
|
|
|
// Social lists
|
|
friendList map[string]int8
|
|
ignoreList map[string]int8
|
|
|
|
// Character history
|
|
characterHistory map[int8]map[int8][]*HistoryData
|
|
charLuaHistory map[int32]*LUAHistory
|
|
|
|
// POI discoveries
|
|
playersPoiList map[int32][]int32
|
|
|
|
// Collections and achievements
|
|
collectionList PlayerCollectionList
|
|
pendingCollectionReward *Collection
|
|
pendingItemRewards []Item
|
|
pendingSelectableItemRewards map[int32][]Item
|
|
achievementList PlayerAchievementList
|
|
achievementUpdateList PlayerAchievementUpdateList
|
|
|
|
// Titles and languages
|
|
playerTitlesList PlayerTitlesList
|
|
playerLanguagesList PlayerLanguagesList
|
|
currentLanguageID int32
|
|
|
|
// Recipes
|
|
recipeList PlayerRecipeList
|
|
recipebookList PlayerRecipeBookList
|
|
currentRecipe int32
|
|
|
|
// Factions
|
|
factions PlayerFaction
|
|
|
|
// Statistics
|
|
statistics map[int32]*Statistic
|
|
|
|
// Mail
|
|
mailList map[int32]*Mail
|
|
|
|
// Character instances
|
|
characterInstances CharacterInstances
|
|
|
|
// Character state
|
|
awayMessage string
|
|
biography string
|
|
isTracking bool
|
|
pendingDeletion bool
|
|
returningFromLD bool
|
|
custNPC bool
|
|
custNPCTarget *entity.Entity
|
|
stopSaveSpellEffects bool
|
|
gmVision bool
|
|
resetMentorship bool
|
|
activeReward bool
|
|
|
|
// Guild
|
|
guild *Guild
|
|
|
|
// Appearance
|
|
savedApp common.AppearanceData
|
|
savedFeatures common.CharFeatures
|
|
|
|
// Bots
|
|
spawnedBots map[int32]int32 // bot index -> spawn id
|
|
|
|
// Control flags
|
|
controlFlags PlayerControlFlags
|
|
|
|
// Target invisibility history
|
|
targetInvisHistory map[int32]bool
|
|
|
|
// Mount information
|
|
tmpMountModel int32
|
|
tmpMountColor common.EQ2Color
|
|
tmpMountSaddleColor common.EQ2Color
|
|
|
|
// Lift cooldown
|
|
liftCooldown time.Time
|
|
|
|
// GM visual filters
|
|
gmVisualFilters []GMTagFilter
|
|
|
|
// Food and drink
|
|
activeFoodUniqueID atomic.Int64
|
|
activeDrinkUniqueID atomic.Int64
|
|
|
|
// Housing
|
|
houseVaultSlots int8
|
|
|
|
// Traits
|
|
sortedTraitList map[int8]map[int8][]*TraitData
|
|
classTraining map[int8][]*TraitData
|
|
raceTraits map[int8][]*TraitData
|
|
innateRaceTraits map[int8][]*TraitData
|
|
focusEffects map[int8][]*TraitData
|
|
needTraitUpdate atomic.Bool
|
|
|
|
// Mutexes
|
|
playerQuestsMutex sync.RWMutex
|
|
spellsBookMutex sync.RWMutex
|
|
recipeBookMutex sync.RWMutex
|
|
playerSpawnQuestsRequiredMutex sync.RWMutex
|
|
playerSpawnHistoryRequiredMutex sync.RWMutex
|
|
luaHistoryMutex sync.RWMutex
|
|
controlFlagsMutex sync.RWMutex
|
|
infoMutex sync.RWMutex
|
|
posMutex sync.RWMutex
|
|
visMutex sync.RWMutex
|
|
indexMutex sync.RWMutex
|
|
spawnMutex sync.RWMutex
|
|
spawnAggroRangeMutex sync.RWMutex
|
|
traitMutex sync.RWMutex
|
|
spellPacketUpdateMutex sync.RWMutex
|
|
raidUpdateMutex sync.RWMutex
|
|
mailMutex sync.RWMutex
|
|
}
|
|
|
|
// SkillBonus represents a skill bonus from a spell
|
|
type SkillBonus struct {
|
|
SpellID int32
|
|
SkillID int32
|
|
Value float32
|
|
}
|
|
|
|
// AddItemType represents the type of item addition
|
|
type AddItemType int8 |