eq2go/internal/player/player_info.go

170 lines
4.2 KiB
Go

package player
import (
"math"
"eq2emu/internal/entity"
)
// NewPlayerInfo creates a new PlayerInfo instance
func NewPlayerInfo(player *Player) *PlayerInfo {
return &PlayerInfo{
player: player,
infoStruct: player.GetInfoStruct(),
}
}
// CalculateXPPercentages calculates XP bar percentages for display
func (pi *PlayerInfo) CalculateXPPercentages() {
xpNeeded := pi.infoStruct.GetXPNeeded()
if xpNeeded > 0 {
divPercent := (float64(pi.infoStruct.GetXP()) / float64(xpNeeded)) * 100.0
percentage := int16(divPercent) * 10
whole := math.Floor(divPercent)
fractional := divPercent - whole
pi.infoStruct.SetXPYellow(percentage)
pi.infoStruct.SetXPBlue(int16(fractional * 1000))
// Vitality bars probably need a revisit
pi.infoStruct.SetXPBlueVitalityBar(0)
pi.infoStruct.SetXPYellowVitalityBar(0)
if pi.player.GetXPVitality() > 0 {
vitalityTotal := pi.player.GetXPVitality()*10 + float32(percentage)
vitalityTotal -= float32((int(percentage/100) * 100))
if vitalityTotal < 100 { // 10%
pi.infoStruct.SetXPBlueVitalityBar(pi.infoStruct.GetXPBlue() + int16(pi.player.GetXPVitality()*10))
} else {
pi.infoStruct.SetXPYellowVitalityBar(pi.infoStruct.GetXPYellow() + int16(pi.player.GetXPVitality()*10))
}
}
}
}
// CalculateTSXPPercentages calculates tradeskill XP bar percentages
func (pi *PlayerInfo) CalculateTSXPPercentages() {
tsXPNeeded := pi.infoStruct.GetTSXPNeeded()
if tsXPNeeded > 0 {
percentage := (float64(pi.infoStruct.GetTSXP()) / float64(tsXPNeeded)) * 1000
pi.infoStruct.SetTradeskillExpYellow(int16(percentage))
pi.infoStruct.SetTradeskillExpBlue(int16((percentage - float64(pi.infoStruct.GetTradeskillExpYellow())) * 1000))
}
}
// SetHouseZone sets the house zone ID
func (pi *PlayerInfo) SetHouseZone(id int32) {
pi.houseZoneID = id
}
// SetBindZone sets the bind zone ID
func (pi *PlayerInfo) SetBindZone(id int32) {
pi.bindZoneID = id
}
// SetBindX sets the bind X coordinate
func (pi *PlayerInfo) SetBindX(x float32) {
pi.bindX = x
}
// SetBindY sets the bind Y coordinate
func (pi *PlayerInfo) SetBindY(y float32) {
pi.bindY = y
}
// SetBindZ sets the bind Z coordinate
func (pi *PlayerInfo) SetBindZ(z float32) {
pi.bindZ = z
}
// SetBindHeading sets the bind heading
func (pi *PlayerInfo) SetBindHeading(heading float32) {
pi.bindHeading = heading
}
// GetHouseZoneID returns the house zone ID
func (pi *PlayerInfo) GetHouseZoneID() int32 {
return pi.houseZoneID
}
// GetBindZoneID returns the bind zone ID
func (pi *PlayerInfo) GetBindZoneID() int32 {
return pi.bindZoneID
}
// GetBindZoneX returns the bind X coordinate
func (pi *PlayerInfo) GetBindZoneX() float32 {
return pi.bindX
}
// GetBindZoneY returns the bind Y coordinate
func (pi *PlayerInfo) GetBindZoneY() float32 {
return pi.bindY
}
// GetBindZoneZ returns the bind Z coordinate
func (pi *PlayerInfo) GetBindZoneZ() float32 {
return pi.bindZ
}
// GetBindZoneHeading returns the bind heading
func (pi *PlayerInfo) GetBindZoneHeading() float32 {
return pi.bindHeading
}
// GetBoatX returns the boat X offset
func (pi *PlayerInfo) GetBoatX() float32 {
return pi.boatXOffset
}
// GetBoatY returns the boat Y offset
func (pi *PlayerInfo) GetBoatY() float32 {
return pi.boatYOffset
}
// GetBoatZ returns the boat Z offset
func (pi *PlayerInfo) GetBoatZ() float32 {
return pi.boatZOffset
}
// GetBoatSpawn returns the boat spawn ID
func (pi *PlayerInfo) GetBoatSpawn() int32 {
return pi.boatSpawn
}
// SetBoatX sets the boat X offset
func (pi *PlayerInfo) SetBoatX(x float32) {
pi.boatXOffset = x
}
// SetBoatY sets the boat Y offset
func (pi *PlayerInfo) SetBoatY(y float32) {
pi.boatYOffset = y
}
// SetBoatZ sets the boat Z offset
func (pi *PlayerInfo) SetBoatZ(z float32) {
pi.boatZOffset = z
}
// SetBoatSpawn sets the boat spawn
func (pi *PlayerInfo) SetBoatSpawn(spawn *entity.Spawn) {
if spawn != nil {
pi.boatSpawn = spawn.GetDatabaseID()
} else {
pi.boatSpawn = 0
}
}
// SetAccountAge sets the account age base
func (pi *PlayerInfo) SetAccountAge(age int32) {
pi.infoStruct.SetAccountAgeBase(age)
}
// RemoveOldPackets cleans up old packet data
func (pi *PlayerInfo) RemoveOldPackets() {
pi.changes = nil
pi.origPacket = nil
pi.petChanges = nil
pi.petOrigPacket = nil
}