132 lines
3.4 KiB
Go
132 lines
3.4 KiB
Go
package player
|
|
|
|
// SetCharacterFlag sets a character flag
|
|
func (p *Player) SetCharacterFlag(flag int) {
|
|
if flag > CF_MAXIMUM_FLAG {
|
|
return
|
|
}
|
|
|
|
if flag < 32 {
|
|
p.GetInfoStruct().SetFlags(p.GetInfoStruct().GetFlags() | (1 << uint(flag)))
|
|
} else {
|
|
p.GetInfoStruct().SetFlags2(p.GetInfoStruct().GetFlags2() | (1 << uint(flag-32)))
|
|
}
|
|
p.SetCharSheetChanged(true)
|
|
}
|
|
|
|
// ResetCharacterFlag resets a character flag
|
|
func (p *Player) ResetCharacterFlag(flag int) {
|
|
if flag > CF_MAXIMUM_FLAG {
|
|
return
|
|
}
|
|
|
|
if flag < 32 {
|
|
p.GetInfoStruct().SetFlags(p.GetInfoStruct().GetFlags() & ^(1 << uint(flag)))
|
|
} else {
|
|
p.GetInfoStruct().SetFlags2(p.GetInfoStruct().GetFlags2() & ^(1 << uint(flag-32)))
|
|
}
|
|
p.SetCharSheetChanged(true)
|
|
}
|
|
|
|
// ToggleCharacterFlag toggles a character flag
|
|
func (p *Player) ToggleCharacterFlag(flag int) {
|
|
if flag > CF_MAXIMUM_FLAG {
|
|
return
|
|
}
|
|
|
|
if p.GetCharacterFlag(flag) {
|
|
p.ResetCharacterFlag(flag)
|
|
} else {
|
|
p.SetCharacterFlag(flag)
|
|
}
|
|
}
|
|
|
|
// GetCharacterFlag returns whether a character flag is set
|
|
func (p *Player) GetCharacterFlag(flag int) bool {
|
|
if flag > CF_MAXIMUM_FLAG {
|
|
return false
|
|
}
|
|
|
|
var ret bool
|
|
if flag < 32 {
|
|
ret = (p.GetInfoStruct().GetFlags() & (1 << uint(flag))) != 0
|
|
} else {
|
|
ret = (p.GetInfoStruct().GetFlags2() & (1 << uint(flag-32))) != 0
|
|
}
|
|
return ret
|
|
}
|
|
|
|
// ControlFlagsChanged returns whether control flags have changed
|
|
func (p *Player) ControlFlagsChanged() bool {
|
|
return p.controlFlags.ControlFlagsChanged()
|
|
}
|
|
|
|
// SetPlayerControlFlag sets a player control flag
|
|
func (p *Player) SetPlayerControlFlag(param, paramValue int8, isActive bool) {
|
|
p.controlFlags.SetPlayerControlFlag(param, paramValue, isActive)
|
|
}
|
|
|
|
// SendControlFlagUpdates sends control flag updates to the client
|
|
func (p *Player) SendControlFlagUpdates(client *Client) {
|
|
p.controlFlags.SendControlFlagUpdates(client)
|
|
}
|
|
|
|
// NewPlayerControlFlags creates a new PlayerControlFlags instance
|
|
func NewPlayerControlFlags() PlayerControlFlags {
|
|
return PlayerControlFlags{
|
|
flagsChanged: false,
|
|
flagChanges: make(map[int8]map[int8]int8),
|
|
currentFlags: make(map[int8]map[int8]bool),
|
|
}
|
|
}
|
|
|
|
// SetPlayerControlFlag sets a control flag
|
|
func (pcf *PlayerControlFlags) SetPlayerControlFlag(param, paramValue int8, isActive bool) {
|
|
pcf.controlMutex.Lock()
|
|
defer pcf.controlMutex.Unlock()
|
|
|
|
if pcf.currentFlags[param] == nil {
|
|
pcf.currentFlags[param] = make(map[int8]bool)
|
|
}
|
|
|
|
if pcf.currentFlags[param][paramValue] != isActive {
|
|
pcf.currentFlags[param][paramValue] = isActive
|
|
|
|
pcf.changesMutex.Lock()
|
|
if pcf.flagChanges[param] == nil {
|
|
pcf.flagChanges[param] = make(map[int8]int8)
|
|
}
|
|
if isActive {
|
|
pcf.flagChanges[param][paramValue] = 1
|
|
} else {
|
|
pcf.flagChanges[param][paramValue] = 0
|
|
}
|
|
pcf.flagsChanged = true
|
|
pcf.changesMutex.Unlock()
|
|
}
|
|
}
|
|
|
|
// ControlFlagsChanged returns whether flags have changed
|
|
func (pcf *PlayerControlFlags) ControlFlagsChanged() bool {
|
|
pcf.changesMutex.Lock()
|
|
defer pcf.changesMutex.Unlock()
|
|
return pcf.flagsChanged
|
|
}
|
|
|
|
// SendControlFlagUpdates sends flag updates to client
|
|
func (pcf *PlayerControlFlags) SendControlFlagUpdates(client *Client) {
|
|
pcf.changesMutex.Lock()
|
|
defer pcf.changesMutex.Unlock()
|
|
|
|
if !pcf.flagsChanged {
|
|
return
|
|
}
|
|
|
|
// TODO: Implement packet sending logic
|
|
// For each change in flagChanges, create and send appropriate packets
|
|
|
|
// Clear changes after sending
|
|
pcf.flagChanges = make(map[int8]map[int8]int8)
|
|
pcf.flagsChanged = false
|
|
}
|