ecs/servers/game/logic/player_counter.go
2025-06-20 15:34:46 +08:00

118 lines
3.0 KiB
Go

package logic
import (
"ecs/proto/pb"
"github.com/oylshe1314/framework/util"
)
type PlayerCounter struct {
Type uint32 `bson:"type" key:"1"`
Key uint64 `bson:"key" key:"2"`
Time int64 `bson:"time"`
Daily uint32 `bson:"daily"`
Total uint32 `bson:"total"`
}
func (this *PlayerCounter) BuildMsgCounter() *pb.Counter {
return &pb.Counter{Type: pb.CounterType(this.Type), Key: this.Key, Time: this.Time, Daily: this.Daily, Total: this.Total}
}
func (this *Player) getCounter(tipe pb.CounterType, key uint64) *PlayerCounter {
var counters = this.Counter[uint32(tipe)]
if counters == nil {
counters = map[uint64]*PlayerCounter{}
this.Counter[uint32(tipe)] = counters
}
var counter = counters[key]
if counter == nil {
counter = &PlayerCounter{Type: uint32(tipe), Key: key}
counters[key] = counter
}
return counter
}
func (this *Player) AddCounter(tipe pb.CounterType, key uint64, value uint32) {
var counter = this.getCounter(tipe, key)
counter.Time = util.Unix()
counter.Daily += value
counter.Total += value
this.SaveModel(counter)
_ = this.Send(pb.ModId_ModuleCounter, pb.MsgId_ModCounterChange, &pb.CounterListAck{
CounterList: []*pb.Counter{counter.BuildMsgCounter()},
})
}
func (this *Player) SetCounter(tipe pb.CounterType, key uint64, value uint32, onlyDaily bool) {
var counter = this.getCounter(tipe, key)
counter.Time = util.Unix()
counter.Daily = value
if !onlyDaily {
counter.Total = value
}
this.SaveModel(counter)
_ = this.Send(pb.ModId_ModuleCounter, pb.MsgId_ModCounterChange, &pb.CounterListAck{
CounterList: []*pb.Counter{counter.BuildMsgCounter()},
})
}
func (this *Player) ResetCounterDaily(tipe pb.CounterType, key uint64) bool {
var counters = this.Counter[uint32(tipe)]
if counters == nil {
return false
}
var counter = counters[key]
if counter == nil || counter.Daily == 0 {
return false
}
counter.Time = util.Unix()
counter.Daily = 0
this.SaveModel(counter)
_ = this.Send(pb.ModId_ModuleCounter, pb.MsgId_ModCounterChange, &pb.CounterListAck{
CounterList: []*pb.Counter{counter.BuildMsgCounter()},
})
return true
}
func (this *Player) GetCounter(tipe pb.CounterType, key uint64) (int64, uint32, uint32) {
var counter = this.getCounter(tipe, key)
if counter == nil {
return 0, 0, 0
} else {
return counter.Time, counter.Daily, counter.Total
}
}
func (this *Player) GetCounterTime(tipe pb.CounterType, key uint64) (time int64) {
time, _, _ = this.GetCounter(tipe, key)
return
}
func (this *Player) GetCounterDaily(tipe pb.CounterType, key uint64) (daily uint32) {
_, daily, _ = this.GetCounter(tipe, key)
return
}
func (this *Player) GetCounterTotal(tipe pb.CounterType, key uint64) (total uint32) {
_, _, total = this.GetCounter(tipe, key)
return
}
func (this *Player) BuildMsgCounterListAck() *pb.CounterListAck {
var counterList []*pb.Counter
for _, counters := range this.Counter {
for _, counter := range counters {
counterList = append(counterList, counter.BuildMsgCounter())
}
}
return &pb.CounterListAck{CounterList: counterList}
}