2025-09-14 01:35:16 +08:00
|
|
|
|
package player
|
2025-09-04 02:00:57 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2025-09-21 08:00:58 +00:00
|
|
|
|
"blazing/common/data/xmlres"
|
2025-10-25 15:06:05 +08:00
|
|
|
|
"blazing/common/socket/errorcode"
|
2025-09-04 02:00:57 +08:00
|
|
|
|
"blazing/common/utils"
|
2025-10-25 15:06:05 +08:00
|
|
|
|
"blazing/cool"
|
2025-11-18 23:41:31 +00:00
|
|
|
|
"blazing/logic/service/common"
|
2025-11-15 22:17:43 +00:00
|
|
|
|
"blazing/logic/service/fight/info"
|
2025-11-16 11:56:57 +08:00
|
|
|
|
"blazing/logic/service/space"
|
2025-11-18 22:16:55 +00:00
|
|
|
|
"sync/atomic"
|
2025-09-04 02:00:57 +08:00
|
|
|
|
|
2025-12-06 23:59:00 +08:00
|
|
|
|
"blazing/modules/base/service"
|
|
|
|
|
|
|
2025-09-04 03:05:37 +08:00
|
|
|
|
blservice "blazing/modules/blazing/service"
|
2025-09-04 02:00:57 +08:00
|
|
|
|
"context"
|
|
|
|
|
|
|
2025-10-13 18:51:41 +08:00
|
|
|
|
"github.com/antlabs/timer"
|
2025-09-04 02:00:57 +08:00
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
2025-10-14 03:07:55 +08:00
|
|
|
|
"github.com/panjf2000/gnet/v2"
|
2025-09-04 02:00:57 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func ConutPlayer() int {
|
|
|
|
|
|
|
|
|
|
|
|
count := 0
|
|
|
|
|
|
Mainplayer.Range(func(uint32, *Player) bool {
|
|
|
|
|
|
count++
|
|
|
|
|
|
return true // 继续遍历
|
|
|
|
|
|
})
|
|
|
|
|
|
return count
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var Mainplayer = &utils.SyncMap[uint32, *Player]{} //玩家数据
|
|
|
|
|
|
|
|
|
|
|
|
type OgreInfo struct {
|
|
|
|
|
|
Data [9]OgrePetInfo
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type OgrePetInfo struct {
|
|
|
|
|
|
Id uint32
|
|
|
|
|
|
Shiny uint32
|
|
|
|
|
|
Lv uint32 `struc:"skip"` //等级
|
2025-11-22 22:57:32 +08:00
|
|
|
|
Item uint32 `struc:"skip"` //奖励,如果有的话
|
2025-12-10 13:54:51 +00:00
|
|
|
|
Ext uint32 `struc:"skip"` //是否变尼尔尼奥
|
2025-09-04 02:00:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type Player struct {
|
2025-10-14 03:07:55 +08:00
|
|
|
|
MainConn gnet.Conn
|
2025-09-21 14:56:37 +00:00
|
|
|
|
baseplayer
|
2025-09-04 02:00:57 +08:00
|
|
|
|
IsLogin bool //是否登录
|
2025-11-16 20:30:17 +00:00
|
|
|
|
Done
|
2025-09-21 14:56:37 +00:00
|
|
|
|
|
2025-10-13 18:51:41 +08:00
|
|
|
|
StopChan timer.TimeNoder
|
2025-09-04 02:00:57 +08:00
|
|
|
|
|
|
|
|
|
|
context.Context
|
2025-11-18 23:41:31 +00:00
|
|
|
|
Fightinfo info.Fightinfo //当前邀请的玩家ID
|
2025-11-18 22:16:55 +00:00
|
|
|
|
|
|
|
|
|
|
Logintime uint32 //当前登录时间
|
2025-11-15 13:20:42 +08:00
|
|
|
|
OgreInfo OgreInfo
|
2025-09-21 14:56:37 +00:00
|
|
|
|
|
2025-10-21 00:41:59 +08:00
|
|
|
|
Service *blservice.UserService
|
2025-12-06 23:59:00 +08:00
|
|
|
|
User *service.BaseSysUserService
|
2025-10-21 00:41:59 +08:00
|
|
|
|
// PVP被邀请信息
|
2025-11-18 23:41:31 +00:00
|
|
|
|
HavePVPinfo []common.PlayerI
|
2025-09-21 08:00:58 +00:00
|
|
|
|
monsters [3]int
|
2025-11-20 05:57:29 +08:00
|
|
|
|
//0 无,1可以刷怪,2是切换过地图
|
|
|
|
|
|
Canmon uint32 //可以刷怪
|
|
|
|
|
|
// Changemap bool //是否切换过地图
|
2025-09-04 02:00:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PlayerOption 定义配置 Player 的函数类型
|
|
|
|
|
|
type PlayerOption func(*Player)
|
|
|
|
|
|
|
2025-10-14 03:07:55 +08:00
|
|
|
|
func WithConn(c gnet.Conn) PlayerOption {
|
2025-09-04 02:00:57 +08:00
|
|
|
|
return func(p *Player) {
|
|
|
|
|
|
p.MainConn = c
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-11-13 21:36:18 +08:00
|
|
|
|
func (p *Player) UseCoins(t uint32) bool {
|
2025-09-04 02:00:57 +08:00
|
|
|
|
|
2025-11-13 21:36:18 +08:00
|
|
|
|
if p.Info.Coins < t {
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
2025-12-08 21:11:12 +08:00
|
|
|
|
|
2025-11-13 21:36:18 +08:00
|
|
|
|
return true
|
|
|
|
|
|
|
2025-11-25 16:36:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
func (p *Player) UseGold(t uint32) bool {
|
|
|
|
|
|
|
2025-12-06 23:59:00 +08:00
|
|
|
|
if p.User.GetGold(uint(p.Info.UserID)) < t {
|
2025-11-25 16:36:55 +08:00
|
|
|
|
return false
|
|
|
|
|
|
}
|
2025-12-06 23:59:00 +08:00
|
|
|
|
//p.Info.GoldBean = p.Info.GoldBean - t
|
2025-11-25 16:36:55 +08:00
|
|
|
|
return true
|
|
|
|
|
|
|
2025-11-13 21:36:18 +08:00
|
|
|
|
}
|
2025-09-05 22:40:36 +08:00
|
|
|
|
func (p *Player) GetAction() {
|
|
|
|
|
|
|
2025-11-18 23:41:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *Player) InvitePlayer(ff common.PlayerI) {
|
|
|
|
|
|
f.HavePVPinfo = append(f.HavePVPinfo, ff)
|
2025-11-20 15:19:13 +08:00
|
|
|
|
tt := common.NewTomeeHeader(2501, f.GetInfo().UserID)
|
|
|
|
|
|
f.SendPack(tt.Pack(&info.NoteInviteToFightOutboundInfo{
|
|
|
|
|
|
UserID: ff.GetInfo().UserID,
|
|
|
|
|
|
Nick: ff.GetInfo().Nick,
|
|
|
|
|
|
Mode: ff.Getfightinfo().Mode,
|
|
|
|
|
|
}))
|
2025-11-18 23:41:31 +00:00
|
|
|
|
|
2025-11-16 11:56:57 +08:00
|
|
|
|
}
|
2025-11-18 22:16:55 +00:00
|
|
|
|
func (p *Player) Getfightinfo() info.Fightinfo {
|
2025-11-18 23:41:31 +00:00
|
|
|
|
return p.Fightinfo
|
2025-11-16 20:30:17 +00:00
|
|
|
|
}
|
2025-11-19 00:09:12 +00:00
|
|
|
|
func (p *Player) QuitFight() {
|
2025-11-20 15:19:13 +08:00
|
|
|
|
|
2025-11-20 05:57:29 +08:00
|
|
|
|
p.FightC = nil
|
2025-11-16 20:30:17 +00:00
|
|
|
|
|
2025-11-26 15:25:10 +08:00
|
|
|
|
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
|
|
|
|
|
|
|
2025-11-19 00:09:12 +00:00
|
|
|
|
}
|
2025-11-16 11:56:57 +08:00
|
|
|
|
func (p *Player) GetSpace() *space.Space {
|
|
|
|
|
|
return space.GetSpace(p.Info.MapID)
|
2025-10-31 00:53:22 +08:00
|
|
|
|
}
|
2025-11-13 02:43:00 +08:00
|
|
|
|
|
2025-11-19 00:09:12 +00:00
|
|
|
|
// 0无战斗,1PVP,2,BOOS,3PVE
|
2025-11-20 05:57:29 +08:00
|
|
|
|
func (p *Player) CanFight() bool {
|
2025-11-19 00:09:12 +00:00
|
|
|
|
|
2025-11-21 02:40:27 +08:00
|
|
|
|
if len(p.Info.PetList) == 0 {
|
|
|
|
|
|
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
|
|
|
|
|
|
return false
|
2025-11-18 22:16:55 +00:00
|
|
|
|
|
2025-11-21 02:40:27 +08:00
|
|
|
|
}
|
2025-11-18 22:16:55 +00:00
|
|
|
|
|
2025-11-20 05:57:29 +08:00
|
|
|
|
if p.FightC != nil {
|
2025-11-21 02:40:27 +08:00
|
|
|
|
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
|
2025-11-20 05:57:29 +08:00
|
|
|
|
return false
|
2025-11-18 22:16:55 +00:00
|
|
|
|
|
2025-11-20 05:57:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
// if p.GetSpace().ARENA.ChallengerID == p.Info.UserID || p.GetSpace().ARENA.Id == p.Info.UserID {
|
|
|
|
|
|
// return false
|
|
|
|
|
|
// }
|
|
|
|
|
|
for _, v := range p.Info.PetList {
|
|
|
|
|
|
if v.Hp > 0 { // 只要找到一个血量大于0的宠物,就可以战斗
|
|
|
|
|
|
return true
|
2025-11-18 22:16:55 +00:00
|
|
|
|
}
|
2025-10-31 00:53:22 +08:00
|
|
|
|
}
|
2025-11-20 05:57:29 +08:00
|
|
|
|
// 遍历完所有宠物,都没有血量大于0的,才不能战斗
|
2025-11-21 02:40:27 +08:00
|
|
|
|
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
|
2025-10-31 00:53:22 +08:00
|
|
|
|
return false
|
2025-11-20 05:57:29 +08:00
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// return false
|
2025-10-31 00:53:22 +08:00
|
|
|
|
|
2025-09-05 22:40:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-01 00:40:19 +08:00
|
|
|
|
func (p *Player) SendPack(b []byte) error {
|
2025-11-01 01:08:47 +08:00
|
|
|
|
if p.MainConn == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
_, ok := p.MainConn.Context().(*ClientData)
|
|
|
|
|
|
if ok {
|
2025-11-20 15:19:13 +08:00
|
|
|
|
|
2025-11-01 01:08:47 +08:00
|
|
|
|
return p.MainConn.Context().(*ClientData).SendPack(b)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
2025-11-01 00:40:19 +08:00
|
|
|
|
|
2025-09-21 08:00:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-15 22:17:43 +00:00
|
|
|
|
// 添加物品 返回成功添加的物品
|
2025-12-08 21:11:12 +08:00
|
|
|
|
func (p *Player) ItemAdd(ItemId, ItemCnt uint32) (result bool) {
|
|
|
|
|
|
|
|
|
|
|
|
switch ItemId {
|
|
|
|
|
|
case 1: //塞尔豆
|
|
|
|
|
|
p.Info.Coins = p.Info.Coins + ItemCnt
|
|
|
|
|
|
return true
|
|
|
|
|
|
case 3: //累计经验
|
|
|
|
|
|
p.Info.ExpPool = p.Info.ExpPool + ItemCnt
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
case 5: //金豆ItemAdd
|
|
|
|
|
|
p.User.SetGold(p.Info.UserID, uint32(p.User.GetGold(uint(p.Info.UserID))+ItemCnt*100))
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
itemx, ok := xmlres.ItemsMAP[int(ItemId)]
|
2025-11-02 18:56:16 +08:00
|
|
|
|
if !ok {
|
2025-12-08 21:11:12 +08:00
|
|
|
|
cool.Loger.Error(context.TODO(), "物品不存在", ItemId)
|
2025-10-25 15:06:05 +08:00
|
|
|
|
|
2025-11-19 16:11:02 +08:00
|
|
|
|
t1 := common.NewTomeeHeader(2601, p.Info.UserID)
|
2025-12-04 01:33:37 +08:00
|
|
|
|
t1.Result = uint32(errorcode.ErrorCodes.ErrSystemError200007)
|
2025-10-25 15:06:05 +08:00
|
|
|
|
|
2025-11-02 18:56:16 +08:00
|
|
|
|
p.SendPack(t1.Pack(nil)) //准备包由各自发,因为协议不一样
|
2025-12-08 21:11:12 +08:00
|
|
|
|
return false
|
|
|
|
|
|
|
2025-11-02 18:56:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
if itemx.Max == 0 {
|
|
|
|
|
|
itemx.Max = 1
|
|
|
|
|
|
}
|
2025-10-25 15:06:05 +08:00
|
|
|
|
|
2025-12-08 21:11:12 +08:00
|
|
|
|
if p.Service.Item.CheakItem(ItemId)+ItemCnt > uint32(itemx.Max) {
|
2025-12-08 19:16:37 +08:00
|
|
|
|
|
2025-12-08 21:11:12 +08:00
|
|
|
|
println(p.Info.UserID, "物品超过拥有最大限制", ItemId)
|
2025-11-19 16:11:02 +08:00
|
|
|
|
t1 := common.NewTomeeHeader(2601, p.Info.UserID)
|
2025-11-02 18:56:16 +08:00
|
|
|
|
t1.Result = uint32(errorcode.ErrorCodes.ErrTooManyOfItem)
|
2025-10-25 15:06:05 +08:00
|
|
|
|
|
2025-11-02 18:56:16 +08:00
|
|
|
|
p.SendPack(t1.Pack(nil)) //准备包由各自发,因为协议不一样
|
2025-12-08 21:11:12 +08:00
|
|
|
|
return false
|
2025-10-25 15:06:05 +08:00
|
|
|
|
}
|
2025-12-08 21:11:12 +08:00
|
|
|
|
p.Service.Item.AddItem(ItemId, ItemCnt)
|
|
|
|
|
|
return true
|
2025-11-02 18:56:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-08 21:11:12 +08:00
|
|
|
|
return false
|
2025-09-11 01:07:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-26 14:56:29 +08:00
|
|
|
|
func (player1 *Player) Kick() {
|
|
|
|
|
|
if player1.IsLogin {
|
|
|
|
|
|
//取成功,否则创建
|
|
|
|
|
|
//player1.Save() //先保存数据再返回
|
2025-11-19 16:11:02 +08:00
|
|
|
|
head := common.NewTomeeHeader(1001, player1.Info.UserID)
|
2025-10-26 14:56:29 +08:00
|
|
|
|
head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere)
|
|
|
|
|
|
//实际上这里有个问题,会造成重复保存问题
|
|
|
|
|
|
|
|
|
|
|
|
player1.SendPack(head.Pack(nil))
|
2025-11-01 14:31:19 +08:00
|
|
|
|
CloseChan := make(chan struct{})
|
2025-10-26 14:56:29 +08:00
|
|
|
|
|
2025-11-01 14:31:19 +08:00
|
|
|
|
player1.MainConn.CloseWithCallback(func(c gnet.Conn, err error) error {
|
|
|
|
|
|
|
|
|
|
|
|
close(CloseChan)
|
|
|
|
|
|
return nil
|
|
|
|
|
|
})
|
|
|
|
|
|
<-CloseChan
|
2025-10-26 14:56:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-06 01:47:08 +08:00
|
|
|
|
|
2025-09-04 02:00:57 +08:00
|
|
|
|
func (p *Player) Cheak(b error) {
|
|
|
|
|
|
if b != nil {
|
|
|
|
|
|
g.Log().Error(context.Background(), "出现错误", p.Info.UserID, b.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|