refactor(controller): 重构控制器函数命名和代码注释

- 重命名 EGG 函数为 EggGamePlay,更新宠物生成逻辑
- 重命名 Leiyi 函数为 GetLeiyiTrainStatus
- 重命名 Cacthpet 函数为 CatchPet,添加详细函数注释
- 为 ArenaSetOwner、ArenaFightOwner、ArenaGetInfo、ArenaUpfight、ArenaOwnerAcce
  等擂台相关函数添加注释前缀
- 重命名 PETKing 函数为 PetKing
- 重命名 FRESH_CHOICE_FIGHT_LEVEL 函数为 FreshChoiceFightLevel,添加详细参数说明
- 重命名 BuyMItem 函数为 BuyMultipleItems
- 重命名 ITEM_S
This commit is contained in:
2025-12-24 19:03:11 +08:00
parent 9baca27033
commit 502d497dce
32 changed files with 533 additions and 615 deletions

View File

@@ -7,10 +7,10 @@ import (
"blazing/modules/blazing/model"
)
func (h Controller) EGG(data *egg.C2S_EGG_GAME_PLAY, c *player.Player) (result *egg.S2C_EGG_GAME_PLAY, err errorcode.ErrorCode) {
r := model.GenPetInfo(1, -1, -1, -1, 0, nil)
c.Service.Pet.PetAdd(r)
result = &egg.S2C_EGG_GAME_PLAY{HadTime: r.CatchTime, ListInfo: []model.ItemInfo{}, PetID: r.ID}
func (h Controller) EggGamePlay(data *egg.C2S_EGG_GAME_PLAY, c *player.Player) (result *egg.S2C_EGG_GAME_PLAY, err errorcode.ErrorCode) {
newPet := model.GenPetInfo(1, -1, -1, -1, 1, nil)
c.Service.Pet.PetAdd(newPet)
result = &egg.S2C_EGG_GAME_PLAY{HadTime: newPet.CatchTime, ListInfo: []model.ItemInfo{}, PetID: newPet.ID}
return

View File

@@ -6,7 +6,7 @@ import (
"blazing/logic/service/player"
)
func (h Controller) Leiyi(data *leiyi.C2s_LEIYI_TRAIN_GET_STATUS, c *player.Player) (result *leiyi.S2C_LEIYI_TRAIN_GET_STATUS, err errorcode.ErrorCode) {
func (h Controller) GetLeiyiTrainStatus(data *leiyi.C2s_LEIYI_TRAIN_GET_STATUS, c *player.Player) (result *leiyi.S2C_LEIYI_TRAIN_GET_STATUS, err errorcode.ErrorCode) {
result = &leiyi.S2C_LEIYI_TRAIN_GET_STATUS{}
for i := 0; i < 6; i++ {

View File

@@ -8,8 +8,11 @@ import (
"github.com/gogf/gf/v2/util/grand"
)
// Cacthpet 传送仓抓稀有
func (h Controller) Cacthpet(data *pet.C2S_9756, c *player.Player) (result *pet.S2C_9756, err errorcode.ErrorCode) {
// CatchPet 传送仓抓稀有宠物
// data: 空输入结构
// c: 当前玩家对象
// 返回: 捕捉结果消耗的EV值和错误码
func (h Controller) CatchPet(data *pet.C2S_9756, c *player.Player) (result *pet.S2C_9756, err errorcode.ErrorCode) {
result = &pet.S2C_9756{
UseEV: uint32(grand.N(1, 13)),
}

View File

@@ -15,7 +15,7 @@ import (
// 如果星际擂台上无人,站到星际擂台的包
// 前端到后端无数据内容 空包
// 后端到前端无数据内容 空包
// 都需要通过2419包广播更新擂台状态
// ArenaSetOwner 都需要通过2419包广播更新擂台状态
func (h Controller) ArenaSetOwner(data *fight.ARENA_SET_OWENR, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if !c.CanFight() {
@@ -37,7 +37,7 @@ func (h Controller) ArenaSetOwner(data *fight.ARENA_SET_OWENR, c *player.Player)
// 前端到后端无数据内容 空包
// 后端到前端无数据内容 空包
// 还是后端主动发送2503的包给双方前端后 等待前端加载完毕 主动发送2404包通知后端开始战斗
// 并不会通知对方是否接受挑战。只要有人挑战就直接进入对战
// ArenaFightOwner 并不会通知对方是否接受挑战。只要有人挑战就直接进入对战
func (h Controller) ArenaFightOwner(data *fight.ARENA_FIGHT_OWENR, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if !c.CanFight() {
@@ -107,7 +107,7 @@ func (h Controller) ArenaFightOwner(data *fight.ARENA_FIGHT_OWENR, c *player.Pla
// ArenaGetInfo 获取星际擂台信息的包 进入空间站地图前端会发送请求包 或者 有人站到星际擂台上后 广播回包
// 前端到后端无数据内容
// 后端到前端
// ArenaGetInfo 后端到前端
func (h Controller) ArenaGetInfo(data *fight.ARENA_GET_INFO, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) {
result = &c.GetSpace().Owner
@@ -117,7 +117,7 @@ func (h Controller) ArenaGetInfo(data *fight.ARENA_GET_INFO, c *player.Player) (
// ArenaUpfight 放弃擂台挑战的包
// 前端到后端无数据内容
// 后端到前端无数据内容
// 都需要通过2419包广播更新擂台状态
// ArenaUpfight 都需要通过2419包广播更新擂台状态
func (h Controller) ArenaUpfight(data *fight.ARENA_UPFIGHT, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
//原子操作,修改擂台状态
if atomic.LoadUint32(&c.GetSpace().Owner.UserID) != c.GetInfo().UserID { //说明已经有人了
@@ -139,7 +139,7 @@ func (h Controller) ArenaUpfight(data *fight.ARENA_UPFIGHT, c *player.Player) (r
// 前端到后端无数据内容
// 后端到前端无数据内容
// public static const ARENA_OWENR_OUT:uint = 2423;
// 此包不清楚具体怎么触发 但已知此包为后端主动发送。不清楚什么情况下回用到
// ArenaOwnerAcce 此包不清楚具体怎么触发 但已知此包为后端主动发送。不清楚什么情况下回用到
func (h Controller) ArenaOwnerAcce(data *fight.ARENA_OWENR_ACCE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
s := c.GetSpace()
@@ -155,4 +155,4 @@ func (h Controller) ArenaOwnerAcce(data *fight.ARENA_OWENR_ACCE, c *player.Playe
c.SendPackCmd(2419, &c.GetSpace().Owner)
return nil, -1
}
}

View File

@@ -34,7 +34,7 @@ func (h Controller) PetMelee(data *fight.StartPetWarInboundInfo, c *player.Playe
return
}
func (h Controller) PETKing(data *fight.PetKingJoinInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) PetKing(data *fight.PetKingJoinInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
c.Fightinfo.Status = info.BattleMode.PET_TOPLEVEL

View File

@@ -11,7 +11,15 @@ import (
"github.com/jinzhu/copier"
)
func (h Controller) FRESH_CHOICE_FIGHT_LEVEL(data *fight.C2S_FRESH_CHOICE_FIGHT_LEVEL, c *player.Player) (result *fight.S2C_FreshChoiceLevelRequestInfo, err errorcode.ErrorCode) {
// FreshChoiceFightLevel 处理玩家选择挑战模式(试炼之塔或勇者之塔)
// 根据不同的CMD值设置玩家的挑战状态和地图信息并返回当前挑战层级信息
// 参数:
// data: 客户端发送的挑战层级选择请求数据包含CMD和挑战层级
// c: 玩家对象,包含玩家的详细信息
// 返回值:
// result: 服务器返回给客户端的挑战层级信息包含当前战斗层级和Boss ID
// err: 错误码,表示处理过程中是否出现错误
func (h Controller) FreshChoiceFightLevel(data *fight.C2S_FRESH_CHOICE_FIGHT_LEVEL, c *player.Player) (result *fight.S2C_FreshChoiceLevelRequestInfo, err errorcode.ErrorCode) {
result = &fight.S2C_FreshChoiceLevelRequestInfo{}
@@ -25,8 +33,11 @@ func (h Controller) FRESH_CHOICE_FIGHT_LEVEL(data *fight.C2S_FRESH_CHOICE_FIGHT_
c.Info.MapID = 600
result.CurFightLevel = uint(c.Info.CurrentStage)
}
// 设置Boss ID为固定值10
result.BossId = []uint32{10}
// 重置玩家的Canmon标志位为0表示可以刷怪
atomic.StoreUint32(&c.Canmon, 0)
// 在函数结束时将玩家传送到对应地图
defer c.GetSpace().EnterMap(c)
return result, 0
}

View File

@@ -53,8 +53,8 @@ func (h Controller) BuyItem(data *item.BuyInboundInfo, c *player.Player) (result
return &item.BuyOutboundInfo{Coins: c.Info.Coins}, 0
}
// BuyMItem 批量购买道具
func (h Controller) BuyMItem(data *item.BuyMultiInboundInfo, c *player.Player) (result *item.BuyMultiOutboundInfo, err errorcode.ErrorCode) {
// BuyMultipleItems 批量购买道具
func (h Controller) BuyMultipleItems(data *item.BuyMultiInboundInfo, c *player.Player) (result *item.BuyMultiOutboundInfo, err errorcode.ErrorCode) {
for _, itemID := range data.ItemIds {
itemInfo, exists := xmlres.ItemsMAP[int(itemID)]
if !exists {

View File

@@ -10,14 +10,18 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
func (h Controller) ITEM_SALE(data *item.C2S_ITEM_SALE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
// ItemSale 出售道具
// data: 包含道具ID和数量的输入信息
// c: 当前玩家对象
// 返回: 空结果和错误码
func (h Controller) ItemSale(data *item.C2S_ITEM_SALE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if c.Service.Item.CheakItem(data.ItemId) < data.Amount {
return nil, errorcode.ErrorCodes.ErrSystemError
}
if xmlres.ItemsMAP[int(data.ItemId)].SellPrice != 0 {
c.Info.Coins += uint32(int64(data.Amount) * int64(xmlres.ItemsMAP[int(data.ItemId)].SellPrice))
itemConfig := xmlres.ItemsMAP[int(data.ItemId)]
if itemConfig.SellPrice != 0 {
c.Info.Coins += uint32(int64(data.Amount) * int64(itemConfig.SellPrice))
}
c.Service.Item.UPDATE(data.ItemId, -gconv.Int(data.Amount))
return result, 0

View File

@@ -10,28 +10,34 @@ import (
"github.com/jinzhu/copier"
)
func (h Controller) UserItemList(data *item.ItemListInboundInfo, c *player.Player) (result *item.ItemListOutboundInfo, err errorcode.ErrorCode) {
// GetUserItemList 获取用户道具列表
// data: 包含分页参数的输入信息
// c: 当前玩家对象
// 返回: 道具列表和错误码
func (h Controller) GetUserItemList(data *item.ItemListInboundInfo, c *player.Player) (result *item.ItemListOutboundInfo, err errorcode.ErrorCode) {
result = &item.ItemListOutboundInfo{}
result.ItemList = make([]model.SingleItemInfo, 0)
item := c.Service.Item.Get(data.Param1, data.Param2)
for _, v := range item {
var vv model.SingleItemInfo
vv.ItemId = v.ItemId
vv.ItemCnt = v.ItemCnt
vv.LeftTime = 360000
if vv.ItemCnt != 0 {
result.ItemList = append(result.ItemList, vv)
items := c.Service.Item.Get(data.Param1, data.Param2)
for _, itemData := range items {
var itemInfo model.SingleItemInfo
itemInfo.ItemId = itemData.ItemId
itemInfo.ItemCnt = itemData.ItemCnt
itemInfo.LeftTime = 360000
if itemInfo.ItemCnt != 0 {
result.ItemList = append(result.ItemList, itemInfo)
}
}
return result, 0
}
func (h Controller) ItemUsePet(data *item.C2S_USE_PET_ITEM_OUT_OF_FIGHT, c *player.Player) (result *item.S2C_USE_PET_ITEM_OUT_OF_FIGHT, err errorcode.ErrorCode) {
_, onpet, ok := c.FindPet(data.CatchTime)
if !ok {
// UsePetItemOutOfFight 战斗外使用宠物道具
// data: 包含道具ID和宠物捕获时间的输入信息
// c: 当前玩家对象
// 返回: 使用后的宠物信息和错误码
func (h Controller) UsePetItemOutOfFight(data *item.C2S_USE_PET_ITEM_OUT_OF_FIGHT, c *player.Player) (result *item.S2C_USE_PET_ITEM_OUT_OF_FIGHT, err errorcode.ErrorCode) {
_, currentPet, found := c.FindPet(data.CatchTime)
if !found {
return nil, errorcode.ErrorCodes.Err10401
}
@@ -40,48 +46,50 @@ func (h Controller) ItemUsePet(data *item.C2S_USE_PET_ITEM_OUT_OF_FIGHT, c *play
}
if data.ItemID == 300036 {
//神经元需要特殊处理
if onpet.OldCatchTime == 0 {
// 神经元需要特殊处理
if currentPet.OldCatchTime == 0 {
return nil, errorcode.ErrorCodes.ErrSystemError
}
oldpetc := onpet.CatchTime
oldpet := c.Service.Pet.PetInfo_One_Unscoped(onpet.OldCatchTime)
oldPetCatchTime := currentPet.CatchTime
oldPet := c.Service.Pet.PetInfo_One_Unscoped(currentPet.OldCatchTime)
copier.CopyWithOption(onpet, oldpet.Data, copier.Option{DeepCopy: true})
onpet.CatchTime = oldpetc
onpet.EffectInfo = oldpet.Data.EffectInfo
copier.CopyWithOption(currentPet, oldPet.Data, copier.Option{DeepCopy: true})
currentPet.CatchTime = oldPetCatchTime
currentPet.EffectInfo = oldPet.Data.EffectInfo
} else {
hd := item.PetItemRegistry.GetHandler(data.ItemID)
if hd == nil {
handler := item.PetItemRegistry.GetHandler(data.ItemID)
if handler == nil {
return nil, errorcode.ErrorCodes.ErrSystemError
}
r := hd(data.ItemID, onpet)
if !r {
success := handler(data.ItemID, currentPet)
if !success {
return nil, errorcode.ErrorCodes.ErrSystemError
}
}
c.Service.Item.UPDATE(data.ItemID, -1)
result = &item.S2C_USE_PET_ITEM_OUT_OF_FIGHT{}
onpet.CalculatePetPane(false)
copier.Copy(&result, onpet)
currentPet.CalculatePetPane(false)
copier.Copy(&result, currentPet)
return result, 0
}
// ResetNature 重置宠物性格
// data: 包含道具ID和宠物捕获时间的输入信息
// c: 当前玩家对象
// 返回: 无数据和错误码
func (h Controller) ResetNature(data *item.C2S_PET_RESET_NATURE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if c.Service.Item.CheakItem(data.ItemId) <= 0 {
return nil, errorcode.ErrorCodes.ErrSystemError
}
_, onpet, ok := c.FindPet(data.CatchTime)
if !ok {
_, currentPet, found := c.FindPet(data.CatchTime)
if !found {
return nil, errorcode.ErrorCodes.Err10401
}
onpet.Nature = data.Nature
onpet.CalculatePetPane(false)
currentPet.Nature = data.Nature
currentPet.CalculatePetPane(false)
c.Service.Item.UPDATE(data.ItemId, -1)
return result, 0
}

View File

@@ -20,8 +20,8 @@ func fetchData() (any, error) {
return ServerList, nil
}
// 处理命令: 105
func (h *Controller) COMMEND_ONLINE(data *user.SidInfo, c gnet.Conn) (result *rpc.CommendSvrInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
// GetServerOnline 处理命令: 105
func (h Controller) GetServerOnline(data *user.SidInfo, c gnet.Conn) (result *rpc.CommendSvrInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
result = rpc.NewInInfo()
if service.NewBaseSysUserService().GetPerson(data.Head.UserID).Debug == 1 {

View File

@@ -18,48 +18,47 @@ import (
"github.com/panjf2000/gnet/v2"
)
// 处理命令: 1001
func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
tt := data.CheakSession()
if !tt {
// Login 处理命令: 1001
func (h Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
isSessionValid := data.CheakSession()
if !isSessionValid {
defer c.Close()
return
}
err1 := h.RPCClient.Kick(data.Head.UserID) //先踢人
if err1 != nil {
kickErr := h.RPCClient.Kick(data.Head.UserID) //先踢人
if kickErr != nil {
fmt.Println("踢人失败", err)
}
cool.Loger.Info(context.TODO(), "踢人请求完成,继续登录流程")
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
t := player.GetPlayer(c, data.Head.UserID)
if t == nil {
currentPlayer := player.GetPlayer(c, data.Head.UserID)
if currentPlayer == nil {
cool.Loger.Error(context.Background(), "获取玩家失败", data.Head.UserID)
defer c.Close()
return
}
t.Service = blservice.NewUserService(data.Head.UserID)
currentPlayer.Service = blservice.NewUserService(data.Head.UserID)
t.Info = t.Service.Info.Personself()
currentPlayer.Info = currentPlayer.Service.Info.Personself()
if t.Info == nil {
if currentPlayer.Info == nil {
defer c.Close()
return
}
t.Info.UserID = data.Head.UserID
t.Logintime = uint32(time.Now().Unix()) //保存时间戳
currentPlayer.Info.UserID = data.Head.UserID
currentPlayer.Logintime = uint32(time.Now().Unix()) //保存时间戳
t.CompleteLogin() //通知客户端登录成功
currentPlayer.CompleteLogin() //通知客户端登录成功
result = user.NewOutInfo() //设置登录消息
result.PlayerInfo = *t.Info
defer space.GetSpace(t.Info.MapID).EnterMap(t)
result.PlayerInfo = *currentPlayer.Info
defer space.GetSpace(currentPlayer.Info.MapID).EnterMap(currentPlayer)
return result, 0

View File

@@ -15,7 +15,7 @@ import (
"github.com/jinzhu/copier"
)
func (h *Controller) MapEnter(data *space.InInfo, c *player.Player) (result *info.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) EnterMap(data *space.InInfo, c *player.Player) (result *info.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
c.Info.MapID = data.MapId //登录地图
c.GetSpace().User.Store(c.Info.UserID, c) //添加玩家
@@ -28,7 +28,7 @@ func (h *Controller) MapEnter(data *space.InInfo, c *player.Player) (result *inf
return result, 0
}
func (h Controller) MapHot(data *maphot.InInfo, c *player.Player) (result *maphot.OutInfo, err errorcode.ErrorCode) {
func (h Controller) GetMapHot(data *maphot.InInfo, c *player.Player) (result *maphot.OutInfo, err errorcode.ErrorCode) {
result = &maphot.OutInfo{
@@ -37,7 +37,7 @@ func (h Controller) MapHot(data *maphot.InInfo, c *player.Player) (result *mapho
return
}
func (h *Controller) MapLeave(data *space.LeaveMapInboundInfo, c *player.Player) (result *info.LeaveMapOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) LeaveMap(data *space.LeaveMapInboundInfo, c *player.Player) (result *info.LeaveMapOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
atomic.StoreUint32(&c.Canmon, 0)
//data.Broadcast(c.Info.MapID, info.LeaveMapOutboundInfo{UserID: c.Info.UserID}) //同步广播
@@ -51,7 +51,7 @@ func (h *Controller) MapLeave(data *space.LeaveMapInboundInfo, c *player.Player)
//c.Info.MapID = 0 // 重置当前地图
return
}
func (h *Controller) MapList(data *space.ListMapPlayerInboundInfo, c *player.Player) (result *info.ListMapPlayerOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) GetMapPlayerList(data *space.ListMapPlayerInboundInfo, c *player.Player) (result *info.ListMapPlayerOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
atomic.StoreUint32(&c.Canmon, 2)
c.MapNPC.Reset(5 * time.Second)
result = &info.ListMapPlayerOutboundInfo{
@@ -60,7 +60,7 @@ func (h *Controller) MapList(data *space.ListMapPlayerInboundInfo, c *player.Pla
return
}
func (h *Controller) Attack_Boss(data *space.AttackBossInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) AttackBoss(data *space.AttackBossInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
if atomic.LoadInt32(&c.GetSpace().MapBossInfo.Hp) > 0 {
atomic.AddInt32(&c.GetSpace().MapBossInfo.Hp, -1)

View File

@@ -8,7 +8,7 @@ import (
"github.com/jinzhu/copier"
)
func (h *Controller) NonoFollowOrHome(data *nono.NonoFollowOrHomeInInfo, c *player.Player) (result *nono.NonoFollowOutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
func (h Controller) NonoFollowOrHome(data *nono.NonoFollowOrHomeInInfo, c *player.Player) (result *nono.NonoFollowOutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
c.Info.NONO.Flag = data.Flag
result = &nono.NonoFollowOutInfo{
@@ -23,7 +23,7 @@ func (h *Controller) NonoFollowOrHome(data *nono.NonoFollowOrHomeInInfo, c *play
return
}
// 获取nono信息
// GetNonoInfo 获取nono信息
func (h *Controller) GetNonoInfo(data *nono.NonoInboundInfo, c *player.Player) (result *nono.NonoOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &nono.NonoOutboundInfo{}

View File

@@ -6,7 +6,7 @@ import (
"blazing/logic/service/player"
)
func (h *Controller) IS_COLLECT(
func (h Controller) IsCollect(
data *pet.C2S_IS_COLLECT, c *player.Player) (result *pet.S2C_IS_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_IS_COLLECT{
ID: data.Type,

View File

@@ -8,41 +8,44 @@ import (
"github.com/samber/lo"
)
func (h Controller) PetEVdiy(data *pet.PetEV, c *player.Player) (result *pet.S2C_50001, err errorcode.ErrorCode) {
_, onpet, ok := c.FindPet(data.CacthTime)
if !ok {
// PetEVDiy 自定义分配宠物努力值EV
// data: 包含宠物捕获时间和EV分配数据的输入信息
// c: 当前玩家对象
// 返回: 分配结果和错误码
func (h Controller) PetEVDiy(data *pet.PetEV, c *player.Player) (result *pet.S2C_50001, err errorcode.ErrorCode) {
_, currentPet, found := c.FindPet(data.CacthTime)
if !found {
return nil, errorcode.ErrorCodes.Err10401
}
//分配超过510的数据
// 分配超过510的数据
if lo.Sum(data.EVs[:]) > 510 {
return nil, errorcode.ErrorCodes.Err10401
}
for i, v := range data.EVs {
//分配超过255的数据
if v > 255 {
for i, evValue := range data.EVs {
// 分配超过255的数据
if evValue > 255 {
return nil, errorcode.ErrorCodes.Err10401
}
//分配比之前点数少的
if v < onpet.Ev[i] {
// 分配比之前点数少的
if evValue < currentPet.Ev[i] {
return nil, errorcode.ErrorCodes.Err10401
}
}
if lo.Sum(data.EVs[:]) < lo.Sum(onpet.Ev[:]) {
if lo.Sum(data.EVs[:]) < lo.Sum(currentPet.Ev[:]) {
return nil, errorcode.ErrorCodes.Err10401
}
USEEV1 := lo.Sum(data.EVs[:]) - lo.Sum(onpet.Ev[:])
//加的比池子还多
if USEEV1 > c.Info.EVPool {
usedEV := lo.Sum(data.EVs[:]) - lo.Sum(currentPet.Ev[:])
// 加的比池子还多
if usedEV > c.Info.EVPool {
return nil, errorcode.ErrorCodes.Err10401
}
onpet.Ev = data.EVs
onpet.CalculatePetPane(false)
c.Info.EVPool -= USEEV1
currentPet.Ev = data.EVs
currentPet.CalculatePetPane(false)
c.Info.EVPool -= usedEV
result = &pet.S2C_50001{}
result.UseEV = USEEV1
result.UseEV = usedEV
return result, 0
}

View File

@@ -12,96 +12,96 @@ import (
"github.com/jinzhu/copier"
)
// 获取精灵信息
func (h *Controller) GetPetInfo(
// GetPetInfo 获取精灵信息
// data: 包含精灵捕获时间的输入信息
// c: 当前玩家对象
// 返回: 精灵信息和错误码
func (h Controller) GetPetInfo(
data *pet.InInfo,
c *player.Player) (result *pet.OutInfo,
err errorcode.ErrorCode) { //这个时候player应该是空的
_, tet, ok := c.FindPet(data.CatchTime)
err errorcode.ErrorCode) {
_, petInfo, found := c.FindPet(data.CatchTime)
if ok {
if found {
result = &pet.OutInfo{
PetInfo: *tet,
PetInfo: *petInfo,
}
return result, 0
} else {
result = &pet.OutInfo{
PetInfo: c.Service.Pet.PetInfo_One(data.CatchTime).Data,
}
}
result = &pet.OutInfo{
PetInfo: c.Service.Pet.PetInfo_One(data.CatchTime).Data,
}
return result, 0
}
// 获取仓库列表
func (h *Controller) GetPetList(
// GetPetList 获取仓库列表
// data: 空输入结构
// c: 当前玩家对象
// 返回: 精灵列表和错误码
func (h Controller) GetPetList(
data *pet.GetPetListInboundEmpty,
c *player.Player) (result *pet.GetPetListOutboundInfo,
err errorcode.ErrorCode) { //这个时候player应该是空的
err errorcode.ErrorCode) {
result = &pet.GetPetListOutboundInfo{}
tt := c.Service.Pet.PetInfo(0) //获得未放生的精灵
result.ShortInfoList = make([]pet.PetShortInfo, len(tt))
for i, v := range tt {
copier.Copy(&result.ShortInfoList[i], &v.Data)
petList := c.Service.Pet.PetInfo(0) // 获取未放生的精灵
result.ShortInfoList = make([]pet.PetShortInfo, len(petList))
for i, petItem := range petList {
copier.Copy(&result.ShortInfoList[i], &petItem.Data)
}
return result, 0
}
// 获取放生列表
func (h *Controller) PET_ROWEI_LIST(
// GetPetReleaseList 获取放生列表
// data: 空输入结构
// c: 当前玩家对象
// 返回: 放生精灵列表和错误码
func (h Controller) GetPetReleaseList(
data *pet.GetPetListFreeInboundEmpty,
c *player.Player) (result *pet.GetPetListOutboundInfo,
err errorcode.ErrorCode) { //这个时候player应该是空的
err errorcode.ErrorCode) {
result = &pet.GetPetListOutboundInfo{}
tt := c.Service.Pet.PetInfo(1) //获得未放生的精灵
result.ShortInfoList = make([]pet.PetShortInfo, len(tt))
for i, v := range tt {
copier.Copy(&result.ShortInfoList[i], &v.Data)
petList := c.Service.Pet.PetInfo(1) // 获取已放生的精灵
result.ShortInfoList = make([]pet.PetShortInfo, len(petList))
for i, petItem := range petList {
copier.Copy(&result.ShortInfoList[i], &petItem.Data)
}
return result, 0
}
// 放生
func (h *Controller) PET_ROWEI(
data *pet.PET_ROWEI, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
_, _, ok := c.FindPet(data.CatchTime)
r := xmlres.PetMAP[int(data.ID)].FreeForbidden
//如果背包没找到,再放入背包
if !ok && t.CatchTime != 0 && r == 0 {
t.Free = 1
// PetReleaseToWarehouse 将精灵从仓库包中放生
// data: 包含精灵ID和捕获时间的输入信息
// c: 当前玩家对象
// 返回: 无数据和错误码
func (h Controller) PetReleaseToWarehouse(
data *pet.PET_ROWEI, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(pet *model.PetEX) {
_, _, inBag := c.FindPet(data.CatchTime)
freeForbidden := xmlres.PetMAP[int(data.ID)].FreeForbidden
// 如果背包没找到,再放入背包
if !inBag && pet.CatchTime != 0 && freeForbidden == 0 {
pet.Free = 1
} else {
err = errorcode.ErrorCodes.ErrCannotReleaseNonWarehouse
}
})
return nil, err
}
// 领回包
func (h *Controller) PET_RETRIEVE(
// PetRetrieveFromWarehouse 领回包
func (h Controller) PetRetrieveFromWarehouse(
data *pet.PET_RETRIEVE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(pet *model.PetEX) {
_, _, ok := c.FindPet(data.CatchTime)
//如果背包没找到,再放入背包
if !ok && t.CatchTime != 0 {
t.Free = 0
if !ok && pet.CatchTime != 0 {
pet.Free = 0
}
})
@@ -110,8 +110,8 @@ func (h *Controller) PET_RETRIEVE(
}
// 精灵背包仓库切换
func (h *Controller) PetRelease(
// TogglePetBagWarehouse 精灵背包仓库切换
func (h Controller) TogglePetBagWarehouse(
data *pet.PetReleaseInboundInfo,
c *player.Player) (
result *pet.PetReleaseOutboundInfo,
@@ -128,10 +128,10 @@ func (h *Controller) PetRelease(
switch data.Flag {
case 0:
index, v, ok := c.FindPet(data.CatchTime)
index, pet, ok := c.FindPet(data.CatchTime)
if ok {
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
t.Data = *v
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(petData *model.PetEX) {
petData.Data = *pet
//t.InBag = 0
})
@@ -142,15 +142,15 @@ func (h *Controller) PetRelease(
case 1:
if len(c.Info.PetList) < 6 {
//todo 背包
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(t *model.PetEX) {
c.Service.Pet.PetInfo_One_exec(data.CatchTime, func(petData *model.PetEX) {
_, _, ok := c.FindPet(data.CatchTime)
//如果背包没找到,再放入背包
if !ok && t.CatchTime != 0 {
if !ok && petData.CatchTime != 0 {
//t.InBag = 1
c.Info.PetList = append(c.Info.PetList, t.Data)
result.PetInfo = t.Data
c.Info.PetList = append(c.Info.PetList, petData.Data)
result.PetInfo = petData.Data
}
})
@@ -165,14 +165,14 @@ func (h *Controller) PetRelease(
return result, 0
}
// 精灵展示
func (h *Controller) PlayerShowPet(
// PlayerShowPet 精灵展示
func (h Controller) PlayerShowPet(
data *pet.PetShowInboundInfo, c *player.Player) (result *pet.PetShowOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.PetShowOutboundInfo{}
_, onpet, ok := c.FindPet(data.CatchTime)
_, currentPet, ok := c.FindPet(data.CatchTime)
if ok {
copier.Copy(&result, onpet)
copier.Copy(&result, currentPet)
result.Flag = data.Flag
result.UserID = data.Head.UserID
defer c.GetSpace().Broadcast(c, data.Head.CMD, result)
@@ -181,16 +181,16 @@ func (h *Controller) PlayerShowPet(
}
// 单体治疗
func (h *Controller) PetOneCure(
// PetOneCure 单体治疗
func (h Controller) PetOneCure(
data *pet.PetOneCureInboundInfo, c *player.Player) (result *pet.PetOneCureOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
if c.GetSpace().Owner.UserID == c.Info.UserID {
return result, errorcode.ErrorCodes.ErrChampionCannotHeal
}
_, onpet, ok := c.FindPet(data.CatchTime)
_, currentPet, ok := c.FindPet(data.CatchTime)
if ok {
defer onpet.Cure()
defer currentPet.Cure()
}
@@ -200,8 +200,8 @@ func (h *Controller) PetOneCure(
}
// 精灵首发
func (h *Controller) PetFirst(
// PetFirst 精灵首发
func (h Controller) PetFirst(
data *pet.PetDefaultInboundInfo, c *player.Player) (result *pet.PetDefaultOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
//擂台住不能换精灵
if c.GetSpace().Owner.UserID == c.Info.UserID {
@@ -226,10 +226,10 @@ func (h *Controller) PetFirst(
// 返回:索引、元素指针、是否找到
func (h Controller) SetPetExp(data *pet.PetSetExpInboundInfo, c *player.Player) (result *pet.PetSetExpOutboundInfo, err errorcode.ErrorCode) {
_, onpet, ok := c.FindPet(data.CatchTime)
if ok && onpet.Level < 100 {
_, currentPet, ok := c.FindPet(data.CatchTime)
if ok && currentPet.Level < 100 {
c.AddPetExp(onpet, data.Exp)
c.AddPetExp(currentPet, data.Exp)
return &pet.PetSetExpOutboundInfo{
Exp: c.Info.ExpPool,
}, 0
@@ -240,8 +240,8 @@ func (h Controller) SetPetExp(data *pet.PetSetExpInboundInfo, c *player.Player)
}, errorcode.ErrorCodes.ErrSystemError
}
// 精灵图鉴
func (h Controller) PetBargeList(data *pet.PetBargeListInboundInfo, c *player.Player) (result *pet.PetBargeListOutboundInfo, err errorcode.ErrorCode) {
// GetPetBargeList 精灵图鉴
func (h Controller) GetPetBargeList(data *pet.PetBargeListInboundInfo, c *player.Player) (result *pet.PetBargeListOutboundInfo, err errorcode.ErrorCode) {
return &pet.PetBargeListOutboundInfo{
PetBargeList: make([]pet.PetBargeListInfo, 0),

View File

@@ -20,13 +20,13 @@ func (h Controller) SetPetSkill(data *pet.ChangeSkillInfo, c *player.Player) (re
c.Info.Coins -= setSkillCost
_, onpet, ok := c.FindPet(data.CatchTime)
_, currentPet, ok := c.FindPet(data.CatchTime)
if !ok {
return nil, errorcode.ErrorCodes.ErrSystemBusy
}
// 检查要替换的技能是否已存在
_, _, exists := utils.FindWithIndex(onpet.SkillList, func(item model.SkillInfo) bool {
_, _, exists := utils.FindWithIndex(currentPet.SkillList, func(item model.SkillInfo) bool {
return item.ID == data.ReplaceSkill
})
if exists {
@@ -34,12 +34,12 @@ func (h Controller) SetPetSkill(data *pet.ChangeSkillInfo, c *player.Player) (re
}
// 查找要学习的技能并替换
_, hasSkill, ok := utils.FindWithIndex(onpet.SkillList, func(item model.SkillInfo) bool {
_, targetSkill, ok := utils.FindWithIndex(currentPet.SkillList, func(item model.SkillInfo) bool {
return item.ID == data.HasSkill
})
if ok {
hasSkill.ID = data.ReplaceSkill
hasSkill.PP = uint32(xmlres.SkillMap[int(hasSkill.ID)].MaxPP)
targetSkill.ID = data.ReplaceSkill
targetSkill.PP = uint32(xmlres.SkillMap[int(targetSkill.ID)].MaxPP)
}
return &pet.ChangeSkillOutInfo{
@@ -47,8 +47,8 @@ func (h Controller) SetPetSkill(data *pet.ChangeSkillInfo, c *player.Player) (re
}, 0
}
// SkillSort 排序宠物技能消耗50赛尔豆
func (h Controller) SkillSort(data *pet.C2S_Skill_Sort, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
// SortPetSkills 排序宠物技能消耗50赛尔豆
func (h Controller) SortPetSkills(data *pet.C2S_Skill_Sort, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
const skillSortCost = 50
if !c.UseCoins(skillSortCost) {
@@ -57,18 +57,18 @@ func (h Controller) SkillSort(data *pet.C2S_Skill_Sort, c *player.Player) (resul
c.Info.Coins -= skillSortCost
_, onpet, ok := c.FindPet(data.CapTm)
_, currentPet, ok := c.FindPet(data.CapTm)
if ok {
var newSkillList []model.SkillInfo
for _, skillID := range data.Skill {
_, skill, found := utils.FindWithIndex(onpet.SkillList, func(item model.SkillInfo) bool {
_, skill, found := utils.FindWithIndex(currentPet.SkillList, func(item model.SkillInfo) bool {
return item.ID == skillID
})
if found {
newSkillList = append(newSkillList, *skill)
}
}
onpet.SkillList = newSkillList
currentPet.SkillList = newSkillList
}
return nil, 0

View File

@@ -7,21 +7,22 @@ import (
"blazing/logic/service/room"
)
// 购买家具
func (h Controller) BUY_FITMENT(data *room.C2S_BUY_FITMENT, c *player.Player) (result *room.S2C_BUY_FITMENT, err errorcode.ErrorCode) {
// BuyFitment 购买基地家具
// data: 包含家具ID和购买数量的输入信息
// c: 当前玩家对象
// 返回: 购买结果和错误码
func (h Controller) BuyFitment(data *room.C2S_BUY_FITMENT, c *player.Player) (result *room.S2C_BUY_FITMENT, err errorcode.ErrorCode) {
result = &room.S2C_BUY_FITMENT{}
used := xmlres.ItemsMAP[int(data.ID)].Price * int(data.Count)
itemConfig := xmlres.ItemsMAP[int(data.ID)]
totalCost := itemConfig.Price * int(data.Count)
if !c.UseCoins(uint32(used)) {
if !c.UseCoins(uint32(totalCost)) {
return nil, errorcode.ErrorCodes.ErrSunDouInsufficient10016
}
c.Service.Room.Add(data.ID, data.Count)
c.Info.Coins -= uint32(used)
c.Info.Coins -= uint32(totalCost)
result.ID = data.ID
result.Coins = c.Info.Coins
return
}

View File

@@ -11,60 +11,65 @@ import (
"github.com/jinzhu/copier"
)
// 获取基地物品
func (h Controller) OnFitmentUsering(data *room.FitmentUseringInboundInfo, c *player.Player) (result *room.FitmentUseringOutboundInfo, err errorcode.ErrorCode) {
// GetFitmentUsing 获取基地展示的家具物品
// data: 包含目标用户ID的输入信息
// c: 当前玩家对象
// 返回: 基地家具信息和错误码
func (h Controller) GetFitmentUsing(data *room.FitmentUseringInboundInfo, c *player.Player) (result *room.FitmentUseringOutboundInfo, err errorcode.ErrorCode) {
result = &room.FitmentUseringOutboundInfo{UserId: c.Info.UserID, RoomId: data.TargetUserID}
result.Fitments = make([]model.FitmentShowInfo, 0)
result.Fitments = append(result.Fitments, model.FitmentShowInfo{Id: 500001, Status: 1, X: 1, Y: 1, Dir: 1})
r := c.Service.Room.Get(data.TargetUserID)
result.Fitments = append(result.Fitments, r.PlacedItems...)
roomInfo := c.Service.Room.Get(data.TargetUserID)
result.Fitments = append(result.Fitments, roomInfo.PlacedItems...)
return
}
// 获取基地展示精灵
func (h Controller) OnGetRoomPetShowInfo(data *room.PetRoomListInboundInfo, c *player.Player) (result *room.PetRoomListOutboundInfo, err errorcode.ErrorCode) {
// GetRoomPetShowInfo 获取基地展示精灵列表
// data: 包含目标用户ID的输入信息
// c: 当前玩家对象
// 返回: 精灵展示列表和错误码
func (h Controller) GetRoomPetShowInfo(data *room.PetRoomListInboundInfo, c *player.Player) (result *room.PetRoomListOutboundInfo, err errorcode.ErrorCode) {
result = &room.PetRoomListOutboundInfo{}
result.Pets = make([]pet.PetShortInfo, 0)
r := c.Service.Room.Get(data.TargetUserID)
for _, v := range r.ShowPokemon {
pet12 := c.Service.Pet.PetInfo_One_ohter(data.TargetUserID, v)
if pet12.Data.ID == 0 {
roomInfo := c.Service.Room.Get(data.TargetUserID)
for _, catchTime := range roomInfo.ShowPokemon {
petInfo := c.Service.Pet.PetInfo_One_ohter(data.TargetUserID, catchTime)
if petInfo.Data.ID == 0 {
continue
}
var pet1 pet.PetShortInfo
copier.Copy(&pet1, &pet12.Data)
if pet12.ID != 0 {
result.Pets = append(result.Pets, pet1)
var petShortInfo pet.PetShortInfo
copier.Copy(&petShortInfo, &petInfo.Data)
if petInfo.ID != 0 {
result.Pets = append(result.Pets, petShortInfo)
}
}
return
}
// 获取自己房间的家具
func (h Controller) OnGetFitmentAll(data *room.FitmentAllInboundEmpty, c *player.Player) (result *room.FitmentAllOutboundInfo, err errorcode.ErrorCode) {
// GetAllFurniture 获取玩家的所有家具
// data: 空输入结构
// c: 当前玩家对象
// 返回: 玩家所有家具列表和错误码
func (h Controller) GetAllFurniture(data *room.FitmentAllInboundEmpty, c *player.Player) (result *room.FitmentAllOutboundInfo, err errorcode.ErrorCode) {
result = &room.FitmentAllOutboundInfo{}
result.Fitments = make([]room.FitmentItemInfo, 0)
r := c.Service.Room.Get(c.Info.UserID)
for k, v := range r.OwnedItems {
result.Fitments = append(result.Fitments, room.FitmentItemInfo{Id: k, AllCount: v, UsedCount: r.UserItems[k]})
roomData := c.Service.Room.Get(c.Info.UserID)
for itemID, count := range roomData.OwnedItems {
result.Fitments = append(result.Fitments, room.FitmentItemInfo{Id: itemID, AllCount: count, UsedCount: roomData.UserItems[itemID]})
}
return
}
func (h Controller) RoomPetInfo(data *room.C2S_RoomPetInfo, c *player.Player) (result *pet.RoomPetInfo, err errorcode.ErrorCode) {
r := c.Service.Pet.PetInfo_One_ohter(data.UserID, data.CatchTime)
// GetRoomPetInfo 获取玩家跟随精灵的信息
// data: 包含用户ID和精灵捕获时间的输入信息
// c: 当前玩家对象
// 返回: 精灵详细信息和错误码
func (h Controller) GetRoomPetInfo(data *room.C2S_RoomPetInfo, c *player.Player) (result *pet.RoomPetInfo, err errorcode.ErrorCode) {
petInfo := c.Service.Pet.PetInfo_One_ohter(data.UserID, data.CatchTime)
result = &pet.RoomPetInfo{}
copier.CopyWithOption(result, &r.Data, copier.Option{DeepCopy: true})
copier.CopyWithOption(result, &petInfo.Data, copier.Option{DeepCopy: true})
result.OwnerId = data.UserID
return
}

View File

@@ -9,35 +9,37 @@ import (
"github.com/jinzhu/copier"
)
// 基地设置
func (h Controller) SET_FITMENT(data *room.SET_FITMENT, c *player.Player) (result *room.NullInfo, err errorcode.ErrorCode) {
// SetFitment 设置基地家具摆放
// data: 包含家具列表的输入信息
// c: 当前玩家对象
// 返回: 空结果和错误码
func (h Controller) SetFitment(data *room.SET_FITMENT, c *player.Player) (result *room.NullInfo, err errorcode.ErrorCode) {
c.Service.Room.Set(data.Fitments)
return
}
func (h Controller) SET_Pet(data *room.C2S_PET_ROOM_SHOW, c *player.Player) (result *room.S2C_PET_ROOM_SHOW, err errorcode.ErrorCode) {
var showpet []uint32
for _, v := range data.PetShowList {
if v.CatchTime != 0 {
showpet = append(showpet, v.CatchTime)
// SetPet 设置基地展示的精灵
// data: 包含精灵展示列表的输入信息
// c: 当前玩家对象
// 返回: 精灵展示列表和错误码
func (h Controller) SetPet(data *room.C2S_PET_ROOM_SHOW, c *player.Player) (result *room.S2C_PET_ROOM_SHOW, err errorcode.ErrorCode) {
var showPetCatchTimes []uint32
for _, petShowInfo := range data.PetShowList {
if petShowInfo.CatchTime != 0 {
showPetCatchTimes = append(showPetCatchTimes, petShowInfo.CatchTime)
}
}
c.Service.Room.Show(showpet)
c.Service.Room.Show(showPetCatchTimes)
result = &room.S2C_PET_ROOM_SHOW{}
result.PetShowList = make([]pet.PetShortInfo, len(showpet))
for _, v := range showpet {
r1 := c.Service.Pet.PetInfo_One(v)
if r1.Data.ID == 0 {
result.PetShowList = make([]pet.PetShortInfo, len(showPetCatchTimes))
for _, catchTime := range showPetCatchTimes {
petInfo := c.Service.Pet.PetInfo_One(catchTime)
if petInfo.Data.ID == 0 {
continue
}
var r12 pet.PetShortInfo
copier.Copy(&r12, &r1.Data)
result.PetShowList = append(result.PetShowList, r12)
var petShortInfo pet.PetShortInfo
copier.Copy(&petShortInfo, &petInfo.Data)
result.PetShowList = append(result.PetShowList, petShortInfo)
}
return
}

View File

@@ -10,8 +10,8 @@ import (
"blazing/modules/blazing/model"
)
// 射击
func (h Controller) Aimat(data *user.AimatInboundInfo, c *player.Player) (result *user.AimatOutboundInfo, err errorcode.ErrorCode) {
// PlayerAim 射击
func (h Controller) PlayerAim(data *user.AimatInboundInfo, c *player.Player) (result *user.AimatOutboundInfo, err errorcode.ErrorCode) {
result = &user.AimatOutboundInfo{
ItemId: data.ItemId,
@@ -23,7 +23,7 @@ func (h Controller) Aimat(data *user.AimatInboundInfo, c *player.Player) (result
return
}
func (h Controller) Chat(data *user.ChatInboundInfo, c *player.Player) (result *user.ChatOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) PlayerChat(data *user.ChatInboundInfo, c *player.Player) (result *user.ChatOutboundInfo, err errorcode.ErrorCode) {
result = &user.ChatOutboundInfo{
@@ -92,7 +92,7 @@ func (h Controller) ChangeNONOColor(data *user.ChangeNONOColorInboundInfo, c *pl
c.GetSpace().Broadcast(c, data.Head.CMD, result)
return
}
func (h Controller) DANCE_ACTION(data *user.C2SDanceAction, c *player.Player) (result *user.S2CDanceAction, err errorcode.ErrorCode) {
func (h Controller) DanceAction(data *user.C2SDanceAction, c *player.Player) (result *user.S2CDanceAction, err errorcode.ErrorCode) {
result = &user.S2CDanceAction{
Type: data.Type,
@@ -101,7 +101,7 @@ func (h Controller) DANCE_ACTION(data *user.C2SDanceAction, c *player.Player) (r
c.GetSpace().Broadcast(c, data.Head.CMD, result)
return
}
func (h Controller) PEOPLE_TRANSFROM(data *user.C2SPEOPLE_TRANSFROM, c *player.Player) (result *user.S2CPEOPLE_TRANSFROM, err errorcode.ErrorCode) {
func (h Controller) PeopleTransform(data *user.C2SPEOPLE_TRANSFROM, c *player.Player) (result *user.S2CPEOPLE_TRANSFROM, err errorcode.ErrorCode) {
result = &user.S2CPEOPLE_TRANSFROM{
SuitID: data.SuitID,
@@ -117,8 +117,8 @@ func (h Controller) ChangePlayerCloth(data *item.ChangePlayerClothInboundInfo, c
ClothList: make([]model.PeopleItemInfo, 0),
}
for _, v := range data.ClothList {
result.ClothList = append(result.ClothList, model.PeopleItemInfo{ID: v, Level: 1})
for _, clothID := range data.ClothList {
result.ClothList = append(result.ClothList, model.PeopleItemInfo{ID: clothID, Level: 1})
}
c.Info.Clothes = result.ClothList

View File

@@ -12,19 +12,19 @@ import (
"github.com/panjf2000/gnet/v2"
)
// 处理命令: 1001
func (h *Controller) CreatePlayer(data *user.CreatePlayerInboundInfo, c gnet.Conn) (result *user.CreatePlayerOutInfo, err errorcode.ErrorCode) {
// CreatePlayer 处理命令: 1001
func (h Controller) CreatePlayer(data *user.CreatePlayerInboundInfo, c gnet.Conn) (result *user.CreatePlayerOutInfo, err errorcode.ErrorCode) {
data.Nickname = strings.Trim(data.Nickname, "\x00")
blservice.NewUserService(data.Head.UserID).Info.Reg(cool.Filter.Replace(data.Nickname, '*'), data.Color)
return result, 0
}
func (h *Controller) ChangePlayerName(data *user.ChangePlayerNameInboundInfo, c *player.Player) (result *user.ChangePlayerNameOutboundInfo, err errorcode.ErrorCode) {
newnice := cool.Filter.Replace(strings.Trim(data.Nickname, "\x00"), '*')
func (h Controller) ChangePlayerName(data *user.ChangePlayerNameInboundInfo, c *player.Player) (result *user.ChangePlayerNameOutboundInfo, err errorcode.ErrorCode) {
newNickname := cool.Filter.Replace(strings.Trim(data.Nickname, "\x00"), '*')
c.Info.Nick = newnice
c.Info.Nick = newNickname
result = &user.ChangePlayerNameOutboundInfo{
Nickname: newnice,
Nickname: newNickname,
UserID: c.Info.UserID,
}
c.GetSpace().Broadcast(c, data.Head.CMD, result)

View File

@@ -6,7 +6,11 @@ import (
"blazing/logic/service/player"
)
func (h Controller) OnSeeOnline(data *friend.SeeOnlineInboundInfo, c *player.Player) (result *friend.SeeOnlineOutboundInfo, err errorcode.ErrorCode) {
// GetOnlineFriends 获取在线好友列表
// data: 包含用户ID列表的输入信息
// c: 当前玩家对象
// 返回: 好友在线信息和错误码
func (h Controller) GetOnlineFriends(data *friend.SeeOnlineInboundInfo, c *player.Player) (result *friend.SeeOnlineOutboundInfo, err errorcode.ErrorCode) {
result = &friend.SeeOnlineOutboundInfo{}
result.Friends = make([]friend.OnlineInfo, 0)
return

View File

@@ -12,8 +12,8 @@ import (
// UserSimInfo 根据用户ID获取模拟用户信息
// data: 包含用户ID的输入信息
// c: 玩家对象
// 返回: 模拟用户信息及错误码
func (h Controller) UserSimInfo(data *user.SimUserInfoInboundInfo, c *player.Player) (result *user.SimUserInfoOutboundInfo, err errorcode.ErrorCode) {
// GetUserSimInfo 返回: 模拟用户信息及错误码
func (h Controller) GetUserSimInfo(data *user.SimUserInfoInboundInfo, c *player.Player) (result *user.SimUserInfoOutboundInfo, err errorcode.ErrorCode) {
ret := &user.SimUserInfoOutboundInfo{}
copier.Copy(ret, c.Service.Info.Person(data.UserId))
@@ -23,8 +23,8 @@ func (h Controller) UserSimInfo(data *user.SimUserInfoInboundInfo, c *player.Pla
// UserMoreInfo 获取用户的更多信息。
// data: 包含用户ID的输入信息。
// c: 当前玩家对象。
// 返回: 包含用户更多信息的输出结果和错误码。
func (h Controller) UserMoreInfo(data *user.MoreUserInfoInboundInfo, c *player.Player) (result *user.MoreUserInfoOutboundInfo, err errorcode.ErrorCode) {
// GetUserMoreInfo 返回: 包含用户更多信息的输出结果和错误码。
func (h Controller) GetUserMoreInfo(data *user.MoreUserInfoInboundInfo, c *player.Player) (result *user.MoreUserInfoOutboundInfo, err errorcode.ErrorCode) {
ret := &user.MoreUserInfoOutboundInfo{}
info := c.Service.Info.Person(data.UserId)
copier.CopyWithOption(ret, info, copier.Option{IgnoreEmpty: true, DeepCopy: true})
@@ -33,7 +33,7 @@ func (h Controller) UserMoreInfo(data *user.MoreUserInfoInboundInfo, c *player.P
return ret, 0
}
func (h Controller) PlayerGoldCount(data *item.GoldOnlineRemainInboundInfo, c *player.Player) (result *item.GoldOnlineRemainOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) GetPlayerGoldCount(data *item.GoldOnlineRemainInboundInfo, c *player.Player) (result *item.GoldOnlineRemainOutboundInfo, err errorcode.ErrorCode) {
return &item.GoldOnlineRemainOutboundInfo{
@@ -41,7 +41,7 @@ func (h Controller) PlayerGoldCount(data *item.GoldOnlineRemainInboundInfo, c *p
Coin: c.Info.Coins,
}, 0
}
func (h Controller) PlayerExp(data *item.ExpTotalRemainInboundInfo, c *player.Player) (result *item.ExpTotalRemainOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) GetPlayerExp(data *item.ExpTotalRemainInboundInfo, c *player.Player) (result *item.ExpTotalRemainOutboundInfo, err errorcode.ErrorCode) {
return &item.ExpTotalRemainOutboundInfo{

View File

@@ -7,20 +7,20 @@ import (
"blazing/modules/config/service"
)
func (h Controller) Talk(data *item.TalkCountInboundInfo, c *player.Player) (result *item.TalkCountOutboundInfo, err errorcode.ErrorCode) {
func (h Controller) GetTalkCount(data *item.TalkCountInboundInfo, c *player.Player) (result *item.TalkCountOutboundInfo, err errorcode.ErrorCode) {
result = &item.TalkCountOutboundInfo{}
cid, ok := c.Service.Talk.Cheak(c.Info.MapID, int(data.ID))
talkCount, ok := c.Service.Talk.Cheak(c.Info.MapID, int(data.ID))
if !ok {
return result, 0
}
result.GiftCount = uint32(cid)
result.GiftCount = uint32(talkCount)
return result, 0
}
//var talkcacche = make(map[string]uint32)
func (h Controller) TalkCate(data *item.TalkCateInboundInfo, c *player.Player) (result *item.DayTalkInfo, err errorcode.ErrorCode) {
func (h Controller) GetTalkCategory(data *item.TalkCateInboundInfo, c *player.Player) (result *item.DayTalkInfo, err errorcode.ErrorCode) {
result = &item.DayTalkInfo{}
result.OutList = make([]item.CateInfo, 0)
@@ -33,11 +33,11 @@ func (h Controller) TalkCate(data *item.TalkCateInboundInfo, c *player.Player) (
//service.NewItemService().GetItemCount(config.ItemID)
for _, itemid := range config.ItemID {
ritemcount := service.NewItemService().GetItemCount(itemid)
ret := c.ItemAdd(uint32(itemid), uint32(ritemcount))
if ret {
result.OutList = append(result.OutList, item.CateInfo{ID: itemid, Count: uint32(ritemcount)})
for _, itemID := range config.ItemID {
itemCount := service.NewItemService().GetItemCount(itemID)
success := c.ItemAdd(uint32(itemID), uint32(itemCount))
if success {
result.OutList = append(result.OutList, item.CateInfo{ID: itemID, Count: uint32(itemCount)})
}
}

View File

@@ -31,25 +31,24 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Playe
}
// AddTaskBuf 更新任务步骤
// data: 包含任务ID和任务步骤列表的输入信息
// c: 当前玩家对象
// 返回: 空输出结果和错误码
func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Player) (result *task.AddTaskBufOutboundInfo, err errorcode.ErrorCode) {
// isdaliy := false
// if data.Head.CMD != 2204 { //判断是每日任务
// isdaliy = true
// }
c.Service.Task.Exec(data.TaskId, func(te *model.TaskEX) bool {
te.Data = data.TaskList
c.Service.Task.Exec(data.TaskId, func(taskEx *model.TaskEX) bool {
taskEx.Data = data.TaskList
return true
})
return result, 0
}
// Complete_Task 完成任务
func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.Player) (result *task.CompleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.GetTask(int(data.TaskId)) != model.Accepted { //如果任务没有接受或者已经完成Complete_Task
// CompleteTask 完成任务
// data: 包含任务ID的输入信息
// c: 当前玩家对象
// 返回: 任务完成结果和错误码
func (h Controller) CompleteTask(data *task.CompleteTaskInboundInfo, c *player.Player) (result *task.CompleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.GetTask(int(data.TaskId)) != model.Accepted {
return result, 0
}
c.Info.SetTask(int(data.TaskId), model.Completed)
@@ -59,26 +58,22 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.
ItemList: make([]model.ItemInfo, 0),
}
//提交任务
//task.Tasktopic.Pub(*data)
tt := task.Get_Task_Info(*data)
if tt == nil {
return result, 0 //通过PUB/SUB回包
taskInfo := task.Get_Task_Info(*data)
if taskInfo == nil {
return result, 0
}
if tt.PetTypeId != 0 {
r := model.GenPetInfo(int(tt.PetTypeId), 31, -1, 0, 50, nil)
result.PetTypeId = r.ID
c.Service.Pet.PetAdd(r)
result.CaptureTime = r.CatchTime //这个写到后面,方便捕捉时间被修改后造成的时间不对问题
if taskInfo.PetTypeId != 0 {
newPet := model.GenPetInfo(int(taskInfo.PetTypeId), 31, -1, 0, 50, nil)
result.PetTypeId = newPet.ID
c.Service.Pet.PetAdd(newPet)
result.CaptureTime = newPet.CatchTime
}
for _, v := range tt.ItemList {
ret := c.ItemAdd(v.ItemId, v.ItemCnt) //获取成功的条目
if ret {
result.ItemList = append(result.ItemList, v)
for _, item := range taskInfo.ItemList {
success := c.ItemAdd(item.ItemId, item.ItemCnt)
if success {
result.ItemList = append(result.ItemList, item)
}
}
@@ -86,8 +81,8 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.
return result, 0 //通过PUB/SUB回包
}
// Get_Task_Buf 获取任务状态
func (h Controller) Get_Task_Buf(data *task.GetTaskBufInboundInfo, c *player.Player) (result *task.GetTaskBufOutboundInfo, err errorcode.ErrorCode) {
// GetTaskBuf 获取任务状态
func (h Controller) GetTaskBuf(data *task.GetTaskBufInboundInfo, c *player.Player) (result *task.GetTaskBufOutboundInfo, err errorcode.ErrorCode) {
result = &task.GetTaskBufOutboundInfo{
TaskId: data.TaskId,
}
@@ -100,8 +95,8 @@ func (h Controller) Get_Task_Buf(data *task.GetTaskBufInboundInfo, c *player.Pla
return result, 0
}
// Delete_Task 删除任务
func (h Controller) Delete_Task(data *task.DeleteTaskInboundInfo, c *player.Player) (result *task.DeleteTaskOutboundInfo, err errorcode.ErrorCode) {
// DeleteTask 删除任务
func (h Controller) DeleteTask(data *task.DeleteTaskInboundInfo, c *player.Player) (result *task.DeleteTaskOutboundInfo, err errorcode.ErrorCode) {
if c.Info.GetTask(int(data.TaskId)) == model.Accepted {
c.Info.SetTask(int(data.TaskId), model.Unaccepted)

View File

@@ -7,7 +7,7 @@ import (
"blazing/logic/service/space/info"
)
func (h Controller) Walk(data *space.WalkInInfo, c *player.Player) (result *info.WalkOutInfo, err errorcode.ErrorCode) {
func (h Controller) PlayerWalk(data *space.WalkInInfo, c *player.Player) (result *info.WalkOutInfo, err errorcode.ErrorCode) {
result = &info.WalkOutInfo{
Flag: data.Flag,
Point: data.Point,

View File

@@ -15,102 +15,77 @@ import (
"github.com/gogf/gf/v2/util/grand"
)
// 处理技能攻击逻辑
func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *info.SkillEntity) {
//oldpet := f.copypet(attacker.CurrentPet)
a.AttackTimeC(attacker.GetProp(5, true)) //计算命中
defender.Exec(func(t input.Effect) bool { //计算闪避 ,然后修改对方命中),同时相当于计算属性无效这种
t.Ctx().SkillEntity = a
t.Skill_Hit_ex()
// processSkillAttack 处理技能攻击逻辑
func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info.SkillEntity) {
skill.AttackTimeC(attacker.GetProp(5, true)) //计算命中
defender.Exec(func(effect input.Effect) bool { //计算闪避,然后修改对方命中),同时相当于计算属性无效这种
effect.Ctx().SkillEntity = skill
effect.Skill_Hit_ex()
return true
})
var oldprop [2][6]int8
var oldinfo [2]model.PetInfo
oldprop[0], oldprop[1] = attacker.Prop, defender.Prop //先复制能力提升
oldinfo[0], oldinfo[1] = attacker.CurrentPet.Info, defender.CurrentPet.Info
var originalProps [2][6]int8
var originalPetInfo [2]model.PetInfo
originalProps[0], originalProps[1] = attacker.Prop, defender.Prop //先复制能力提升
originalPetInfo[0], originalPetInfo[1] = attacker.CurrentPet.Info, defender.CurrentPet.Info
attacker.Exec(func(t input.Effect) bool {
attacker.Exec(func(effect input.Effect) bool {
//计算变威力
t.Ctx().SkillEntity = a
t.Skill_Hit() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
effect.Ctx().SkillEntity = skill
effect.Skill_Hit() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
return true
})
//技能命中+效果失效 这里就是修改效果命中为false
//技能miss+效果生效 这里属于强制改命中效果,但是正常来说,技能miss掉后效果也应该失效
//技能失效+效果失效
// 记录技能信息
//如果miss或者失效
attacker.AttackTime = a.AttackTime
attacker.SkillID = uint32(a.ID) //获取技能ID
if a.AttackTime != 0 { //如果命中
attacker.CalculateCrit(defender, a) //暴击计算
attacker.IsCritical = a.Crit
attacker.SumDamage = attacker.CalculatePower(defender, a)
//睡眠受击消除
attacker.AttackTime = skill.AttackTime
attacker.SkillID = uint32(skill.ID) //获取技能ID
if skill.AttackTime != 0 { //如果命中
attacker.CalculateCrit(defender, skill) //暴击计算
attacker.IsCritical = skill.Crit
attacker.SumDamage = attacker.CalculatePower(defender, skill)
}
attacker.Prop, defender.Prop = oldprop[0], oldprop[1] //先复制能力提升
attacker.CurrentPet.Info, defender.CurrentPet.Info = oldinfo[0], oldinfo[1]
attacker.Prop, defender.Prop = originalProps[0], originalProps[1]
attacker.CurrentPet.Info, defender.CurrentPet.Info = originalPetInfo[0], originalPetInfo[1]
if attacker.IsCritical == 1 { //命中了才有暴击
//暴击破防
if a.Category() == info.Category.PHYSICAL && defender.Prop[1] > 0 {
if skill.Category() == info.Category.PHYSICAL && defender.Prop[1] > 0 {
defender.Prop[1] = 0
} else if a.Category() == info.Category.SPECIAL && defender.Prop[3] > 0 {
} else if skill.Category() == info.Category.SPECIAL && defender.Prop[3] > 0 {
defender.Prop[3] = 0
}
//暴击翻倍
attacker.SumDamage = attacker.SumDamage.Mul(alpacadecimal.NewFromInt(2))
}
if !a.Side { //|| attacker.AttackTime == 0 {
if !skill.Side {
//这时候将被覆盖的效果全部装回来enterturn
for _, e := range attacker.Effect_Lost {
if e.Duration() > 0 || e.Duration() == -1 {
e.Alive(true)
for _, effect := range attacker.Effect_Lost {
if effect.Duration() > 0 || effect.Duration() == -1 {
effect.Alive(true)
}
}
} else {
// attacker.AddEffects(attacker.EffectCache...) //命中再添加效果
for _, e := range attacker.EffectCache {
//这里实现应该参考本地技能是否命中,然后
e.Hit(true) //我方效果命中
for _, effect := range attacker.EffectCache {
effect.Hit(true) //我方效果命中
}
}
// 扣减防御方血量
attacker.Exec(func(t input.Effect) bool {
t.Ctx().SkillEntity = a
t.OnSkill() //调用伤害计算
attacker.Exec(func(effect input.Effect) bool {
effect.Ctx().SkillEntity = skill
effect.OnSkill() //调用伤害计算
return true
})
defender.Damage(attacker, &info.DamageZone{
Damage: attacker.SumDamage,
},
)
//这里其实是受到致死伤害
//然后先触发死亡效果消除所有buff
//然后触发回神效果
})
}
// IsNil 检查值是否为nil
func IsNil(x interface{}) bool {
if x == nil {
return true
@@ -118,23 +93,24 @@ func IsNil(x interface{}) bool {
rv := reflect.ValueOf(x)
return rv.Kind() == reflect.Ptr && rv.IsNil()
}
func (f *FightC) copyskill(t *action.SelectSkillAction) *info.SkillEntity {
if t == nil {
// copySkill 复制技能实体
func (f *FightC) copySkill(action *action.SelectSkillAction) *info.SkillEntity {
if action == nil {
return nil
}
if t.SkillEntity == nil {
if action.SkillEntity == nil {
return nil
}
oldskill, _ := deepcopy.Anything(t.SkillEntity) //备份技能
oldskill.(*info.SkillEntity).Rand = f.rand //拷贝后随机数丢失
return oldskill.(*info.SkillEntity)
originalSkill, _ := deepcopy.Anything(action.SkillEntity) //备份技能
originalSkill.(*info.SkillEntity).Rand = f.rand //拷贝后随机数丢失
return originalSkill.(*info.SkillEntity)
}
//回合有先手方和后手方,同时有攻击方和被攻击方
func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
// enterturn 处理战斗回合逻辑
// 回合有先手方和后手方,同时有攻击方和被攻击方
func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction) {
//双方首发精灵登场时,依挑战方机制:房主方先判定,挑战方后判定
//双方非首发精灵登场时,根据切换先后判定(看手速)
// 神罗、圣华登场时魂免“登场时xx”等效果
@@ -145,171 +121,134 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
}
f.Broadcast(func(ff *input.Input) {
ff.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Turn_Start(fattack, sattack)
ff.Exec(func(effect input.Effect) bool { //回合开始前
effect.Turn_Start(firstAttack, secondAttack)
return true
})
})
if fattack != nil { //如果首技能是空的,说明都空过了
if fattack.GetPlayerID() == f.ownerID {
if firstAttack != nil { //如果首技能是空的,说明都空过了
if firstAttack.GetPlayerID() == f.ownerID {
//是否miss都应该施加解析effect
f.Our.Parseskill(fattack) //解析到临时数据
f.Opp.Parseskill(sattack) //解析到临时数据
f.Our.Parseskill(firstAttack) //解析到临时数据
f.Opp.Parseskill(secondAttack) //解析到临时数据
} else {
f.Opp.Parseskill(fattack)
f.Our.Parseskill(sattack)
f.Opp.Parseskill(firstAttack)
f.Our.Parseskill(secondAttack)
}
}
f.Broadcast(func(ff *input.Input) {
ff.Exec(func(t input.Effect) bool { //回合开始前
//结算状态
t.Compare_Pre(fattack, sattack) //先结算技能的优先级
f.Broadcast(func(fighter *input.Input) {
fighter.Exec(func(effect input.Effect) bool { //回合开始前
effect.Compare_Pre(firstAttack, secondAttack) //先结算技能的优先级
return true
})
ff.ResetAttackValue()
fighter.ResetAttackValue()
})
f.First, f.Second = f.Our, f.Opp
// 根据攻击方归属设置当前战斗的主/次攻击方属性
if fattack != nil {
if fattack.GetPlayerID() != f.ownerID {
if firstAttack != nil {
if firstAttack.GetPlayerID() != f.ownerID {
f.First, f.Second = f.Opp, f.Our // 攻击方为对方时,主攻击方是对方
}
}
if fattack != nil && sattack != nil {
if firstAttack != nil && secondAttack != nil {
switch {
case fattack.SkillEntity.Priority < sattack.SkillEntity.Priority:
fattack, sattack = sattack, fattack //互换先手权
case firstAttack.SkillEntity.Priority < secondAttack.SkillEntity.Priority:
firstAttack, secondAttack = secondAttack, firstAttack //互换先手权
f.First, f.Second = f.Second, f.First
case fattack.SkillEntity.Priority == sattack.SkillEntity.Priority:
case firstAttack.SkillEntity.Priority == secondAttack.SkillEntity.Priority:
if f.Second.GetProp(4, false) > f.First.GetProp(4, false) {
fattack, sattack = sattack, fattack //互换先手权
firstAttack, secondAttack = secondAttack, firstAttack //互换先手权
f.First, f.Second = f.Second, f.First
}
if f.Second.GetProp(4, false) == f.First.GetProp(4, false) {
if grand.Meet(1, 2) { //随机出手
fattack, sattack = sattack, fattack //互换先手权
firstAttack, secondAttack = secondAttack, firstAttack //互换先手权
f.First, f.Second = f.Second, f.First
}
}
}
}
if fattack == nil && sattack == nil {
fattack, sattack = sattack, fattack //互换先手权
if firstAttack == nil && secondAttack == nil {
firstAttack, secondAttack = secondAttack, firstAttack //互换先手权
f.First, f.Second = f.Second, f.First
}
var attacker, defender *input.Input
//开始回合操作
for i := 0; i < 2; i++ {
var oldskill *info.SkillEntity //原始技能
var currentskill *info.SkillEntity //当前技能
if i == 0 { //
var originalSkill *info.SkillEntity //原始技能
var currentSkill *info.SkillEntity //当前技能
if i == 0 {
attacker, defender = f.First, f.Second
oldskill = f.copyskill(fattack)
originalSkill = f.copySkill(firstAttack)
//先手阶段,先修复后手效果
f.Second.RecoverEffect()
} else {
attacker, defender = f.Second, f.First
oldskill = f.copyskill(sattack)
originalSkill = f.copySkill(secondAttack)
f.Second.ReactvieEffect()
}
currentskill = oldskill
defender.Exec(func(t input.Effect) bool { //这个是能否使用技能
//结算状态
//然后这里还可以处理自爆类
t.Ctx().SkillEntity = currentskill
return t.Action_start_ex(fattack, sattack) //返回本身结算,如果false,说明不能使用技能了
currentSkill = originalSkill
defender.Exec(func(effect input.Effect) bool { //这个是能否使用技能
effect.Ctx().SkillEntity = currentSkill
return effect.Action_start_ex(firstAttack, secondAttack)
})
canuseskill := attacker.Exec(func(t input.Effect) bool { //这个是能否使用技能
//结算状态
//然后这里还可以处理自爆类
t.Ctx().SkillEntity = currentskill
return t.Action_start(fattack, sattack) //返回本身结算,如果false,说明不能使用技能了
canUseSkill := attacker.Exec(func(effect input.Effect) bool { //这个是能否使用技能
effect.Ctx().SkillEntity = currentSkill
return effect.Action_start(firstAttack, secondAttack)
})
canuse := canuseskill && //
action.CanUse(currentskill) && //pp还在
attacker.CurrentPet.Info.Hp > 0
canUse := canUseSkill && action.CanUse(currentSkill) && attacker.CurrentPet.Info.Hp > 0
if !canuse {
if !canUse {
attacker.RecoverEffect()
currentskill = nil
currentSkill = nil
} else {
f.processSkillAttack(attacker, defender, currentskill)
currentskill = oldskill //还原技能
f.processSkillAttack(attacker, defender, currentSkill)
currentSkill = originalSkill //还原技能
_, skill, ok := utils.FindWithIndex(attacker.CurrentPet.Info.SkillList, func(item model.SkillInfo) bool {
return item.ID == currentskill.Info.ID
return item.ID == currentSkill.Info.ID
})
if ok {
skill.PP--
}
}
//0血不触发
if defender.CurrentPet.Info.Hp > 0 {
//技能使用后
defender.Exec(func(t input.Effect) bool {
t.Ctx().SkillEntity = currentskill
t.Skill_Use_ex()
defender.Exec(func(effect input.Effect) bool {
effect.Ctx().SkillEntity = currentSkill
effect.Skill_Use_ex()
return true
})
}
//技能使用后
attacker.Exec(func(t input.Effect) bool { //技能使用后的我方效果
t.Ctx().SkillEntity = currentskill
t.Skill_Useed()
attacker.Exec(func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill
effect.Skill_Useed()
return true
})
defender.Exec(func(t input.Effect) bool {
t.Ctx().SkillEntity = currentskill
t.Action_end_ex()
defender.Exec(func(effect input.Effect) bool {
effect.Ctx().SkillEntity = currentSkill
effect.Action_end_ex()
return true
})
if !attacker.CurrentPet.NotAlive {
//技能使用后
attacker.Exec(func(t input.Effect) bool { //技能使用后的我方效果
t.Ctx().SkillEntity = currentskill
t.Action_end()
attacker.Exec(func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill
effect.Action_end()
return true
})
}
fmt.Println(i,
// "玩家技能:", oldskill.(*info.SkillEntity).ID,
"玩家技能伤害:", attacker.SumDamage,
"自身剩余血量:", attacker.CurrentPet.Info.Hp,
"对手剩余血量:", defender.CurrentPet.Info.Hp,
@@ -368,33 +307,26 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
ff.GenInfo()
})
ret := info.AttackValueS{
attackValueResult := info.AttackValueS{
FAttack: *f.First.AttackValue,
SAttack: *f.Second.AttackValue,
}
//因为切完才能广播,所以必须和回合结束分开结算
f.Broadcast(func(ff *input.Input) {
for _, v := range f.Switch {
if ff.Player.GetInfo().UserID != v.Reason.UserId {
println("切精灵", v.Reason.UserId, v.Reason.ID)
ff.Player.SendPackCmd(2407, &v.Reason)
f.Broadcast(func(fighter *input.Input) {
for _, switchAction := range f.Switch {
if fighter.Player.GetInfo().UserID != switchAction.Reason.UserId {
println("切精灵", switchAction.Reason.UserId, switchAction.Reason.ID)
fighter.Player.SendPackCmd(2407, &switchAction.Reason)
}
}
})
f.Switch = make(map[uint32]*action.ActiveSwitchAction)
if f.closefight && f.Info.Mode == info.BattleMode.PET_MELEE {
return
}
f.Broadcast(func(ff *input.Input) {
ff.Player.SendPackCmd(2505, &ret)
ff.CanChange = 0
f.Broadcast(func(fighter *input.Input) {
fighter.Player.SendPackCmd(2505, &attackValueResult)
fighter.CanChange = 0
})
println("回合结束")
if f.Info.Status == info.BattleMode.FIGHT_WITH_NPC {

View File

@@ -31,35 +31,39 @@ func newbaseplayer() baseplayer {
}
return ret
}
func (p *baseplayer) GetInfo() *model.PlayerInfo {
// GetInfo 获取玩家基础信息
func (p *baseplayer) GetInfo() *model.PlayerInfo {
return p.Info
}
func (f *baseplayer) SetFightC(ff common.FightI) {
f.FightC = ff
// SetFightC 设置玩家战斗控制器
func (f *baseplayer) SetFightC(fightController common.FightI) {
f.FightC = fightController
}
// GetPlayerCaptureContext 获取玩家捕捉上下文
func (f *baseplayer) GetPlayerCaptureContext() *info.PlayerCaptureContext {
return f.PlayerCaptureContext
}
func (f *baseplayer) FindPet(CatchTime uint32) (int, *model.PetInfo, bool) {
// FindPet 根据捕捉时间查找宠物
// 返回值: (索引, 宠物信息, 是否找到)
func (f *baseplayer) FindPet(catchTime uint32) (int, *model.PetInfo, bool) {
return utils.FindWithIndex(f.Info.PetList, func(item model.PetInfo) bool {
return item.CatchTime == CatchTime
return item.CatchTime == catchTime
})
}
func (f *Player) Pet_del(CatchTime uint32) {
//println("删除精灵1", CatchTime)
index, _, ok := f.FindPet(CatchTime)
// Pet_del 删除指定宠物
// catchTime: 宠物的捕捉时间戳
func (f *Player) Pet_del(catchTime uint32) {
index, _, ok := f.FindPet(catchTime)
if ok {
// println("删除精灵", CatchTime)
copy(f.Info.PetList[index:], f.Info.PetList[index+1:])
f.Info.PetList = f.Info.PetList[:len(f.Info.PetList)-1]
f.Service.Pet.Pet_del(CatchTime)
f.Service.Pet.Pet_del(catchTime)
}
}
// // 计算整数的二进制1的个数Integer.bitCount

View File

@@ -7,59 +7,34 @@ import (
"sync/atomic"
)
func (p *Player) JoinFight(fn func(p common.PlayerI) bool) errorcode.ErrorCode {
// JoinFight 加入战斗队列
func (p *Player) JoinFight(handler func(p common.PlayerI) bool) errorcode.ErrorCode {
//加入队列前就开始判断一次
if !p.CanFight() {
return errorcode.ErrorCodes.ErrNoEligiblePokemon
}
if p.GetSpace().Owner.UserID == p.Info.UserID {
return errorcode.ErrorCodes.ErrSystemError
}
//修复发包进入,如果此时是擂台主
p.GetSpace().User.Range(func(key uint32, v common.PlayerI) bool {
if v.GetInfo().UserID != p.Info.UserID {
p.GetSpace().User.Range(func(key uint32, opponent common.PlayerI) bool {
if opponent.GetInfo().UserID != p.Info.UserID {
//确认是乱斗模式
if v.Getfightinfo() == p.Getfightinfo() && p.CanFight() {
// p.Fightinfo = nil //先将自身的准备信息置空
// //value.PVPinfo = nil
ttt := fn(v)
if ttt {
atomic.StoreUint32(&v.(*Player).Fightinfo.Mode, 0)
if opponent.Getfightinfo() == p.Getfightinfo() && p.CanFight() {
success := handler(opponent)
if success {
atomic.StoreUint32(&opponent.(*Player).Fightinfo.Mode, 0)
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
}
// lw = value
return ttt //如果发起成功就停止,否则继续遍历队列
return success //如果发起成功就停止,否则继续遍历队列
}
}
return false
})
return 0
}
func (p *Player) SendLoadPercent(b info.LoadPercentOutboundInfo) {
p.SendPack(common.NewTomeeHeader(2441, p.Info.UserID).Pack(&b)) //准备包由各自发,因为协议不一样
// SendLoadPercent 发送加载进度
func (p *Player) SendLoadPercent(loadInfo info.LoadPercentOutboundInfo) {
p.SendPack(common.NewTomeeHeader(2441, p.Info.UserID).Pack(&loadInfo))
}
// 同意对战
// AgreeBattle 处理战斗邀请响应(同意/拒绝)
// 参数:
//
// userid邀请者ID
// flag0-拒绝1-同意
// mode战斗模式
//
// 返回:
//
// bool是否成功仅同意且符合条件时为true
// common.PlayerI对应的邀请者玩家成功时有效

View File

@@ -11,82 +11,64 @@ import (
"github.com/jinzhu/copier"
)
// 主函数实现
// 添加经验
// 禁止发包
func (p *Player) AddPetExp(petinfo *model.PetInfo, addExp uint32) {
// AddPetExp 添加宠物经验
func (p *Player) AddPetExp(petInfo *model.PetInfo, addExp uint32) {
addExp = utils.Min(addExp, p.Info.ExpPool)
originalLevel := petinfo.Level
Exp := petinfo.Exp + addExp
originalLevel := petInfo.Level
exp := petInfo.Exp + addExp
p.Info.ExpPool -= addExp //减去已使用的经验
gainexp := Exp //已获得的经验
for Exp >= petinfo.NextLvExp {
gainedExp := exp //已获得的经验
for exp >= petInfo.NextLvExp {
petinfo.Level++
petInfo.Level++
Exp -= petinfo.LvExp
petinfo.Update(true)
if originalLevel < 100 && petinfo.Level == 100 { //升到100了
p.Info.ExpPool += Exp //减去已使用的经验
gainexp -= Exp
Exp = 0
exp -= petInfo.LvExp
petInfo.Update(true)
if originalLevel < 100 && petInfo.Level == 100 { //升到100了
p.Info.ExpPool += exp //减去已使用的经验
gainedExp -= exp
exp = 0
break //停止升级
}
}
petinfo.Exp = Exp
petInfo.Exp = exp
// 重新计算面板
if originalLevel != petinfo.Level {
petinfo.CalculatePetPane(false)
if originalLevel != petInfo.Level {
petInfo.CalculatePetPane(false)
petinfo.Cure()
p.Info.PetMaxLevel = utils.Max(petinfo.Level, p.Info.PetMaxLevel)
petInfo.Cure()
p.Info.PetMaxLevel = utils.Max(petInfo.Level, p.Info.PetMaxLevel)
// 处理技能学习
canLearnSkillList := utils.LastFourElements(petinfo.GetLevelRangeCanLearningSkills(originalLevel, petinfo.Level), 4) //获取最后四个技能,如果不足,那就取全部技能
learnableSkills := utils.LastFourElements(petInfo.GetLevelRangeCanLearningSkills(originalLevel, petInfo.Level), 4) //获取最后四个技能,如果不足,那就取全部技能
for i := 0; i < 4; i++ {
if len(canLearnSkillList) != 0 {
skid := canLearnSkillList[len(canLearnSkillList)-1]
petinfo.SkillList = append(petinfo.SkillList, model.SkillInfo{
if len(learnableSkills) != 0 {
skillID := learnableSkills[len(learnableSkills)-1]
petInfo.SkillList = append(petInfo.SkillList, model.SkillInfo{
ID: skid,
PP: uint32(xmlres.SkillMap[int(skid)].MaxPP),
ID: skillID,
PP: uint32(xmlres.SkillMap[int(skillID)].MaxPP),
})
canLearnSkillList = canLearnSkillList[:len(canLearnSkillList)-1]
learnableSkills = learnableSkills[:len(learnableSkills)-1]
}
}
if len(petinfo.SkillList) > 4 {
petinfo.SkillList = petinfo.SkillList[:4] //归正到4
if len(petInfo.SkillList) > 4 {
petInfo.SkillList = petInfo.SkillList[:4] //归正到4
}
}
t1 := common.NewTomeeHeader(2508, p.Info.UserID)
rrr := &info.PetUpdateOutboundInfo{}
header := common.NewTomeeHeader(2508, p.Info.UserID)
updateOutbound := &info.PetUpdateOutboundInfo{}
var petinfwo info.UpdatePropInfo
var petUpdateInfo info.UpdatePropInfo
copier.Copy(&petinfwo, petinfo)
petinfwo.Exp = gainexp
rrr.Data = append(rrr.Data, petinfwo)
p.SendPack(t1.Pack(rrr)) //准备包由各自发,因为协议不一样
// 发送经验更新消息
//player.SendMessage(generatePetUpdateInfo(petEntity, originalExp+addExp-exp, addition))
// // 发送技能更新消息
// updateSkillInfo := UpdateSkillInfo{
// PetCatchTime: petEntity.captureTime,
// ActiveSkillNum: activeSkillNum,
// UnActiveSkillNum: unActiveSkillNum,
// SkillArray: canLearnSkillList,
// }
// player.SendMessage(UpdateSkillOutboundInfo{
// InfoArray: []UpdateSkillInfo{updateSkillInfo},
// })
// return exp
copier.Copy(&petUpdateInfo, petInfo)
petUpdateInfo.Exp = gainedExp
updateOutbound.Data = append(updateOutbound.Data, petUpdateInfo)
p.SendPack(header.Pack(updateOutbound)) //准备包由各自发,因为协议不一样
}

View File

@@ -22,8 +22,8 @@ import (
"github.com/panjf2000/gnet/v2"
)
func ConutPlayer() int {
// CountPlayer 统计在线玩家数量
func CountPlayer() int {
count := 0
Mainplayer.Range(func(uint32, *Player) bool {
count++
@@ -32,7 +32,8 @@ func ConutPlayer() int {
return count
}
var Mainplayer = &utils.SyncMap[uint32, *Player]{} //玩家数据
// Mainplayer 全局玩家数据存储映射
var Mainplayer = &utils.SyncMap[uint32, *Player]{}
type OgreInfo struct {
Data [9]OgrePetInfo
@@ -86,9 +87,9 @@ type Player struct {
MapNPC timer.TimeNoder
context.Context
Fightinfo info.Fightinfo //当前邀请的玩家ID
Fightinfo info.Fightinfo // 当前邀请的玩家ID
Logintime uint32 //当前登录时间
Logintime uint32 // 当前登录时间
OgreInfo OgreInfo
Service *blservice.UserService
@@ -96,41 +97,39 @@ type Player struct {
// PVP被邀请信息
HavePVPinfo []common.PlayerI
monsters [3]int
//0 无,1可以刷怪,2是切换过地图
Canmon uint32 //可以刷怪
// Changemap bool //是否切换过地图
// 0 无,1可以刷怪,2是切换过地图
Canmon uint32 // 可以刷怪
}
// PlayerOption 定义配置 Player 的函数类型
type PlayerOption func(*Player)
// WithConn 设置玩家连接的配置选项
func WithConn(c gnet.Conn) PlayerOption {
return func(p *Player) {
p.MainConn = c
}
}
func (p *Player) UseCoins(t uint32) bool {
if p.Info.Coins < t {
func (p *Player) UseCoins(amount uint32) bool {
if p.Info.Coins < amount {
return false
}
return true
}
func (p *Player) UseGold(t uint32) bool {
if p.User.GetGold(uint(p.Info.UserID)) < t {
func (p *Player) UseGold(amount uint32) bool {
if p.User.GetGold(uint(p.Info.UserID)) < amount {
return false
}
//p.Info.GoldBean = p.Info.GoldBean - t
return true
}
func (p *Player) GetAction() {
}
// InvitePlayer 邀请玩家进行对战
func (f *Player) InvitePlayer(ff common.PlayerI) {
f.HavePVPinfo = append(f.HavePVPinfo, ff)
tt := common.NewTomeeHeader(2501, f.GetInfo().UserID)
@@ -139,51 +138,46 @@ func (f *Player) InvitePlayer(ff common.PlayerI) {
Nick: ff.GetInfo().Nick,
Mode: ff.Getfightinfo().Mode,
}))
}
// Getfightinfo 获取玩家的战斗信息
func (p *Player) Getfightinfo() info.Fightinfo {
return p.Fightinfo
}
// QuitFight 退出战斗
func (p *Player) QuitFight() {
p.FightC = nil
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
}
// GetSpace 获取玩家所在的空间
func (p *Player) GetSpace() *space.Space {
return space.GetSpace(p.Info.MapID)
}
// CanFight 检查玩家是否可以进行战斗
// 0无战斗1PVP2,BOOS,3PVE
func (p *Player) CanFight() bool {
if len(p.Info.PetList) == 0 {
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
return false
}
if p.FightC != nil {
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
return false
}
// 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的宠物就可以战斗
for _, pet := range p.Info.PetList {
if pet.Hp > 0 { // 只要找到一个血量大于0的宠物就可以战斗
return true
}
}
// 遍历完所有宠物都没有血量大于0的才不能战斗
atomic.StoreUint32(&p.Fightinfo.Mode, 0)
return false
// }
// return false
}
func (p *Player) SendPack(b []byte) error {
@@ -192,17 +186,13 @@ func (p *Player) SendPack(b []byte) error {
}
_, ok := p.MainConn.Context().(*ClientData)
if ok {
return p.MainConn.Context().(*ClientData).SendPack(b)
}
return nil
}
// 添加物品 返回成功添加的物品
// 添加物品 返回成功添加的物品
func (p *Player) ItemAdd(ItemId, ItemCnt uint32) (result bool) {
switch ItemId {
case 1: //塞尔豆
p.Info.Coins = p.Info.Coins + ItemCnt