ecs/servers/game/logic/player_money.go

235 lines
6.3 KiB
Go
Raw Normal View History

2025-06-04 18:17:39 +08:00
package logic
import (
"ecs/proto"
"ecs/proto/pb"
"github.com/oylshe1314/framework/util"
)
type PlayerMoney struct {
Type uint32 `bson:"type" key:"1"`
Value uint32 `bson:"value"`
}
func (this *PlayerMoney) BuildMsgMoney() *pb.Money {
return &pb.Money{Type: pb.MoneyType(this.Type), Value: this.Value}
}
func (this *Player) GetMoney(moneyType pb.MoneyType) *PlayerMoney {
var money = this.Money[uint32(moneyType)]
if money == nil {
money = &PlayerMoney{Type: uint32(moneyType)}
this.Money[money.Type] = money
}
return money
}
2025-06-21 16:17:24 +08:00
func (this *Player) GetMoneyValue(moneyType pb.MoneyType) uint32 {
var money = this.Money[uint32(moneyType)]
if money == nil {
return 0
}
return money.Value
}
func (this *Player) AddMoney(moneyType pb.MoneyType, value uint32, logType LogType) bool {
2025-06-04 18:17:39 +08:00
switch moneyType {
case pb.MoneyType_Exp:
this.addExp(value, logType)
2025-06-04 18:17:39 +08:00
case pb.MoneyType_Power:
this.addPower(value, logType)
2025-06-21 16:17:24 +08:00
case pb.MoneyType_DailyActive:
this.addActiveValue(moneyType, value, logType)
2025-06-04 18:17:39 +08:00
default:
this.addMoney(moneyType, value, logType)
}
return true
2025-06-04 18:17:39 +08:00
}
func (this *Player) CheckMoney(moneyType pb.MoneyType, value uint32) (bool, proto.TipError) {
2025-06-04 18:17:39 +08:00
if this.checkMoney(moneyType, value) {
return true, nil
2025-06-04 18:17:39 +08:00
}
switch moneyType {
case pb.MoneyType_Exp:
return false, proto.TipExpNotEnough
2025-06-04 18:17:39 +08:00
case pb.MoneyType_Power:
return false, proto.TipPowerNotEnough
2025-06-04 18:17:39 +08:00
default:
return false, proto.TipMoneyNotEnough
2025-06-04 18:17:39 +08:00
}
}
func (this *Player) ReduceMoney(moneyType pb.MoneyType, value uint32, logType LogType) {
switch moneyType {
case pb.MoneyType_Exp:
return
2025-06-04 18:17:39 +08:00
case pb.MoneyType_Power:
this.reducePower(value, logType)
default:
this.reduceMoney(moneyType, value, logType)
}
}
func (this *Player) addMoney(moneyType pb.MoneyType, value uint32, logType LogType) {
if value == 0 {
return
}
var money = this.GetMoney(moneyType)
money.Value += value
this.SaveModel(money)
2025-06-20 15:34:46 +08:00
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
2025-06-04 18:17:39 +08:00
//if logType != LogTypeNone {
// this.manager.eventManager.PlayerMoneyObtain(this, logType, uint32(moneyType), value, money.Value)
//}
}
func (this *Player) checkMoney(moneyType pb.MoneyType, value uint32) bool {
if value == 0 {
return true
}
return this.GetMoney(moneyType).Value >= value
}
func (this *Player) reduceMoney(moneyType pb.MoneyType, value uint32, logType LogType) {
if value == 0 {
return
}
var money = this.GetMoney(moneyType)
if value > money.Value {
this.manager.logger.Error("Reduce money out of range, did not check before reducing?")
value = money.Value
}
money.Value -= value
this.SaveModel(money)
2025-06-20 15:34:46 +08:00
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
2025-06-04 18:17:39 +08:00
//if logType != LogTypeNone {
// this.manager.eventManager.PlayerMoneyConsume(this, logType, uint32(moneyType), value, money.Value)
//}
}
func (this *Player) addExp(value uint32, logType LogType) {
if value == 0 {
return
}
var roleHero = this.RoleHero()
if roleHero == nil {
return
}
var curExp = roleHero.Exp + uint64(value)
var curLevel = roleHero.Level
for {
var heroLevelTable = this.manager.tables.HeroLevel.Find3(int(roleHero.Id), int(curLevel))
if heroLevelTable == nil {
return
}
if curExp < uint64(heroLevelTable.NeedExp) {
break
}
curLevel += 1
curExp -= uint64(heroLevelTable.NeedExp)
}
roleHero.Exp = curExp
roleHero.Level = curLevel
this.SaveModel(roleHero)
this.RoleExp = roleHero.Exp
this.RoleLevel = roleHero.Level
this.SaveField("role_exp", this.RoleExp)
this.SaveField("role_level", this.RoleLevel)
2025-06-20 15:34:46 +08:00
_ = this.Send(pb.ModId_ModuleHero, pb.MsgId_ModHeroChange, &pb.HeroChangeListAck{
ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Changed, Hero: roleHero.BuildMsgHero()}},
})
//if logType != LogTypeNone {
// this.manager.eventManager.PlayerMoneyObtain(this, logType, uint32(proto.MoneyTypeExp), value, money.Value)
//}
}
2025-06-04 18:17:39 +08:00
func (this *Player) addPower(value uint32, logType LogType) {
var money = this.GetMoney(pb.MoneyType_Power)
money.Value += value
this.SaveModel(money)
2025-06-20 15:34:46 +08:00
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
2025-06-04 18:17:39 +08:00
if money.Value >= uint32(RolePowerMax) && this.PowerNextTime > 0 {
this.ChangeProperty(util.NewPair(pb.RolePropertyType_PowerNextTime, int64(0)))
}
//if logType != LogTypeNone {
// this.manager.eventManager.PlayerMoneyObtain(this, logType, uint32(proto.MoneyTypeExp), value, money.Value)
//}
}
func (this *Player) reducePower(value uint32, logType LogType) {
var money = this.GetMoney(pb.MoneyType_Power)
if value > money.Value {
this.manager.logger.Error("Reduce money out of range, did not check before reducing?")
value = money.Value
}
money.Value -= value
this.SaveModel(money)
if money.Value < uint32(RolePowerMax) && this.PowerNextTime == 0 {
this.ChangeProperty(util.NewPair(pb.RolePropertyType_PowerNextTime, util.Unix()+int64(RolePowerCycle)))
}
2025-06-20 15:34:46 +08:00
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
2025-06-04 18:17:39 +08:00
//if logType != LogTypeNone {
// this.manager.eventManager.PlayerMoneyConsume(this, logType, uint32(proto.MoneyTypePower), value, money.Value)
//}
}
2025-06-21 16:17:24 +08:00
func (this *Player) addActiveValue(moneyType pb.MoneyType, value uint32, logType LogType) {
var money = this.GetMoney(pb.MoneyType_Power)
money.Value += value
this.SaveModel(money)
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
this.checkRewardActive(money)
}
func (this *Player) MoneyActiveValueReset(moneyType pb.MoneyType) bool {
var money = this.GetMoney(moneyType)
if money.Value == 0 {
return false
}
money.Value = 0
this.SaveModel(money)
_ = this.Send(pb.ModId_ModuleRole, pb.MsgId_ModRoleMoneyChange, &pb.MoneyListAck{MoneyList: []*pb.Money{money.BuildMsgMoney()}})
var rewardActive = this.newRewardActive(money)
_ = this.Send(pb.ModId_ModuleReward, pb.MsgId_ModRewardActiveChange, &pb.RewardActiveChangeAck{RewardActive: rewardActive.BuildMsgRewardActive()})
return true
}
2025-06-04 18:17:39 +08:00
func (this *Player) BuildMsgMoneyListAck() *pb.MoneyListAck {
var list []*pb.Money
for _, money := range this.Money {
list = append(list, money.BuildMsgMoney())
}
return &pb.MoneyListAck{MoneyList: list}
}