171 lines
4.2 KiB
Go
171 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
|
|
}
|