GCG初步 但会卡进度条 用命令/gcg进入

This commit is contained in:
UnKownOwO
2023-01-04 21:59:25 +08:00
parent 2bc157dd2d
commit f991480192
203 changed files with 5104 additions and 2790 deletions

View File

@@ -1,10 +1,9 @@
package game
import (
"hk4e/gs/model"
"strconv"
"strings"
"hk4e/gs/model"
)
// HelpCommand 帮助命令
@@ -249,3 +248,12 @@ func (c *CommandManager) GiveCommand(cmd *CommandMessage) {
c.SendMessage(player, "已给予玩家 UID%v, 所有内容。", target.PlayerID)
}
}
// GcgCommand Gcg测试命令
func (c *CommandManager) GcgCommand(cm *CommandMessage) {
player := cm.Executor.(*model.Player)
GAME_MANAGER.GCGStartChallenge(player)
c.SendMessage(player, "收到命令")
}

View File

@@ -13,11 +13,11 @@ func (c *CommandManager) GMTeleportPlayer(userId, sceneId uint32, posX, posY, po
logger.Error("player is nil, uid: %v", userId)
return
}
GAME_MANAGER.TeleportPlayer(player, uint32(constant.EnterReasonConst.Gm), sceneId, &model.Vector{
GAME_MANAGER.TeleportPlayer(player, constant.EnterReasonConst.Gm, sceneId, &model.Vector{
X: posX,
Y: posY,
Z: posZ,
})
}, 0)
}
// GMAddUserItem 给予玩家物品

View File

@@ -71,6 +71,7 @@ func (c *CommandManager) InitRouter() {
c.RegisterRouter(CommandPermNormal, c.OpCommand, "op")
c.RegisterRouter(CommandPermNormal, c.TeleportCommand, "teleport", "tp")
c.RegisterRouter(CommandPermNormal, c.GiveCommand, "give", "item")
c.RegisterRouter(CommandPermNormal, c.GcgCommand, "gcg")
}
// GM命令
{

View File

@@ -26,6 +26,7 @@ var USER_MANAGER *UserManager = nil
var WORLD_MANAGER *WorldManager = nil
var TICK_MANAGER *TickManager = nil
var COMMAND_MANAGER *CommandManager = nil
var GCG_MANAGER *GCGManager = nil
var MESSAGE_QUEUE *mq.MessageQueue
var SELF *model.Player
@@ -53,6 +54,7 @@ func NewGameManager(dao *dao.Dao, messageQueue *mq.MessageQueue, gsId uint32) (r
WORLD_MANAGER = NewWorldManager(r.snowflake)
TICK_MANAGER = NewTickManager()
COMMAND_MANAGER = NewCommandManager()
GCG_MANAGER = NewGCGManager()
r.run()
return r
}

105
gs/game/gcg_manager.go Normal file
View File

@@ -0,0 +1,105 @@
package game
import (
"hk4e/gs/model"
)
// ControllerType 操控者类型
type ControllerType uint8
const (
ControllerType_Player ControllerType = iota // 玩家
ControllerType_AI // AI
)
// GCGCardInfo 游戏对局内卡牌
type GCGCardInfo struct {
cardId uint32 // 卡牌Id
guid uint32 // 唯一Id
faceType uint32 // 卡面类型
tagList []uint32 // Tag
tokenMap map[uint32]uint32 // Token
skillIdList []uint32 // 技能Id列表
skillLimitList []uint32 // 技能限制列表
isShow bool // 是否展示
}
// GCGController 操控者
type GCGController struct {
controllerId uint32 // 操控者Id
cardMap map[uint32]*GCGCardInfo // 卡牌列表
controllerType ControllerType // 操控者的类型
player *model.Player
ai uint32 // 暂时不写
}
// GCGGame 游戏对局
type GCGGame struct {
guid uint32 // 唯一Id
gameId uint32 // 游戏Id
round uint32 // 游戏回合数
serverSeqCounter uint32 // 请求序列生成计数器
controllerIdCounter uint32 // 操控者Id生成器
cardGuidCounter uint32 // 卡牌guid生成计数器
controllerMap map[uint32]*GCGController // 操控者列表 uint32 -> controllerId
}
// GCGManager 七圣召唤管理器
type GCGManager struct {
gameMap map[uint32]*GCGGame // 游戏列表 uint32 -> guid
gameGuidCounter uint32 // 游戏guid生成计数器
}
func NewGCGManager() *GCGManager {
gcgManager := new(GCGManager)
gcgManager.gameMap = make(map[uint32]*GCGGame)
return gcgManager
}
// CreateGame 创建GCG游戏对局
func (g *GCGManager) CreateGame(gameId uint32) *GCGGame {
g.gameGuidCounter++
game := &GCGGame{
guid: g.gameGuidCounter,
gameId: gameId,
round: 1,
controllerMap: make(map[uint32]*GCGController, 0),
}
// 记录游戏
g.gameMap[game.guid] = game
return game
}
// JoinGame 玩家加入GCG游戏
func (g *GCGManager) JoinGame(game *GCGGame, player *model.Player) {
game.controllerIdCounter++
controller := &GCGController{
controllerId: game.controllerIdCounter,
cardMap: make(map[uint32]*GCGCardInfo, 0),
controllerType: ControllerType_Player,
player: player,
}
// 生成卡牌信息
// 记录操控者
game.controllerMap[game.controllerIdCounter] = controller
}
//// CreateGameCardInfo 生成操控者卡牌信息
//func (g *GCGManager) CreateGameCardInfo(controller *GCGController, gcgDeck *model.GCGDeck) *GCGCardInfo {
//
//}
// GetGameControllerByUserId 通过玩家Id获取GCGController对象
func (g *GCGManager) GetGameControllerByUserId(game *GCGGame, userId uint32) *GCGController {
for _, controller := range game.controllerMap {
// 为nil说明该操控者不是玩家
if controller.player == nil {
return nil
}
if controller.player.PlayerID == userId {
return controller
}
}
return nil
}

View File

@@ -123,6 +123,8 @@ func (r *RouteManager) InitRoute() {
r.registerRouter(cmd.VehicleInteractReq, GAME_MANAGER.VehicleInteractReq)
r.registerRouter(cmd.SceneEntityDrownReq, GAME_MANAGER.SceneEntityDrownReq)
r.registerRouter(cmd.GetOnlinePlayerInfoReq, GAME_MANAGER.GetOnlinePlayerInfoReq)
r.registerRouter(cmd.GCGAskDuelReq, GAME_MANAGER.GCGAskDuelReq)
r.registerRouter(cmd.GCGInitFinishReq, GAME_MANAGER.GCGInitFinishReq)
}
func (r *RouteManager) RouteHandle(netMsg *mq.NetMsg) {

578
gs/game/user_gcg.go Normal file
View File

@@ -0,0 +1,578 @@
package game
import (
pb "google.golang.org/protobuf/proto"
"hk4e/common/constant"
"hk4e/gs/model"
"hk4e/protocol/cmd"
"hk4e/protocol/proto"
)
func (g *GameManager) GCGLogin(player *model.Player) {
player.SceneId = 1076
player.Pos.X = 8.974
player.Pos.Y = 0
player.Pos.Z = 9.373
// GCG基础信息
g.SendMsg(cmd.GCGBasicDataNotify, player.PlayerID, player.ClientSeq, g.PacketGCGBasicDataNotify(player))
// GCG等级挑战解锁
g.SendMsg(cmd.GCGLevelChallengeNotify, player.PlayerID, player.ClientSeq, g.PacketGCGLevelChallengeNotify(player))
// GCG禁止的卡牌
g.SendMsg(cmd.GCGDSBanCardNotify, player.PlayerID, player.ClientSeq, g.PacketGCGDSBanCardNotify(player))
// GCG解锁或拥有的内容
g.SendMsg(cmd.GCGDSDataNotify, player.PlayerID, player.ClientSeq, g.PacketGCGDSDataNotify(player))
// GCG酒馆挑战数据
g.SendMsg(cmd.GCGTCTavernChallengeDataNotify, player.PlayerID, player.ClientSeq, g.PacketGCGTCTavernChallengeDataNotify(player))
}
// GCGTavernInit GCG酒馆初始化
func (g *GameManager) GCGTavernInit(player *model.Player) {
//// GCG酒馆信息通知
//g.SendMsg(cmd.GCGTCTavernInfoNotify, player.PlayerID, player.ClientSeq, g.PacketGCGTCTavernInfoNotify(player))
//// GCG酒馆NPC信息通知
//g.SendMsg(cmd.GCGTavernNpcInfoNotify, player.PlayerID, player.ClientSeq, g.PacketGCGTavernNpcInfoNotify(player))
// 可能是包没发全导致卡进度条?
g.SendMsg(cmd.DungeonWayPointNotify, player.PlayerID, player.ClientSeq, &proto.DungeonWayPointNotify{})
g.SendMsg(cmd.DungeonDataNotify, player.PlayerID, player.ClientSeq, &proto.DungeonDataNotify{})
g.SendMsg(cmd.Unk3300_DGBNCDEIIFC, player.PlayerID, player.ClientSeq, &proto.Unk3300_DGBNCDEIIFC{})
}
// GCGStartChallenge GCG开始挑战
func (g *GameManager) GCGStartChallenge(player *model.Player) {
// GCG开始游戏通知
//gcgStartChallengeByCheckRewardRsp := &proto.GCGStartChallengeByCheckRewardRsp{
// ExceededItemTypeList: make([]uint32, 0, 0),
// LevelId: 0,
// ExceededItemList: make([]uint32, 0, 0),
// LevelType: proto.GCGLevelType_GCG_LEVEL_TYPE_GUIDE_GROUP,
// ConfigId: 7066505,
// Retcode: 0,
//}
//g.SendMsg(cmd.GCGStartChallengeByCheckRewardRsp, player.PlayerID, player.ClientSeq, gcgStartChallengeByCheckRewardRsp)
// GCG游戏简要信息通知
GAME_MANAGER.SendMsg(cmd.GCGGameBriefDataNotify, player.PlayerID, player.ClientSeq, g.PacketGCGGameBriefDataNotify(player, proto.GCGGameBusinessType_GCG_GAME_BUSINESS_TYPE_GUIDE_GROUP, 30102))
// 玩家进入GCG界面
g.TeleportPlayer(player, constant.EnterReasonConst.DungeonEnter, 79999, new(model.Vector), 2162)
}
// GCGAskDuelReq GCG决斗请求
func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message) {
// 获取玩家所在的游戏
game, ok := GCG_MANAGER.gameMap[player.GCGCurGameGuid]
if !ok {
g.CommonRetError(cmd.GCGAskDuelRsp, player, &proto.GCGAskDuelRsp{}, proto.Retcode_RET_GCG_GAME_NOT_RUNNING)
return
}
// 计数器+1
game.serverSeqCounter++
// 获取玩家的操控者对象
gameController := GCG_MANAGER.GetGameControllerByUserId(game, player.PlayerID)
if gameController == nil {
g.CommonRetError(cmd.GCGAskDuelRsp, player, &proto.GCGAskDuelRsp{}, proto.Retcode_RET_GCG_NOT_IN_GCG_DUNGEON)
return
}
// PacketGCGAskDuelRsp
//gcgAskDuelRsp := &proto.GCGAskDuelRsp{
// Duel: &proto.GCGDuel{
// ServerSeq: game.serverSeqCounter,
// ShowInfoList: make([]*proto.GCGControllerShowInfo, 0, len(game.controllerMap)),
// ForbidFinishChallengeList: nil,
// CardList: nil,
// Unk3300_BIANMOPDEHO: 0,
// CostRevise: nil,
// GameId: game.gameId,
// FieldList: nil,
// Unk3300_CDCMBOKBLAK: nil,
// BusinessType: 0,
// IntentionList: nil,
// ChallengeList: nil,
// HistoryCardList: nil,
// Round: game.round,
// ControllerId: gameController.controllerId,
// HistoryMsgPackList: nil,
// Unk3300_JHDDNKFPINA: 0,
// CardIdList: make([]uint32, 0, 0),
// Unk3300_JBBMBKGOONO: 0,
// Phase: nil,
// },
//}
//// 玩家信息列表
//for _, controller := range game.controllerMap {
// gcgControllerShowInfo := &proto.GCGControllerShowInfo{
// ControllerId: controller.controllerId,
// ProfilePicture: &proto.ProfilePicture{},
// }
// // 如果为玩家则更改为玩家信息
// if controller.controllerType == ControllerType_Player {
// gcgControllerShowInfo.ProfilePicture.AvatarId = player.HeadImage
// gcgControllerShowInfo.ProfilePicture.AvatarId = player.AvatarMap[player.HeadImage].Costume
// }
// gcgAskDuelRsp.Duel.ShowInfoList = append(gcgAskDuelRsp.Duel.ShowInfoList)
//}
//GAME_MANAGER.SendMsg(cmd.GCGAskDuelRsp, player.PlayerID, player.ClientSeq, gcgAskDuelRsp)
// PacketGCGAskDuelRsp
gcgAskDuelRsp := new(proto.GCGAskDuelRsp)
gcgAskDuelRsp.Duel = &proto.GCGDuel{
ServerSeq: 1, // 应该每次+1
ShowInfoList: []*proto.GCGControllerShowInfo{
// 玩家的
{
// PsnId: ?
NickName: player.NickName,
// OnlineId: ?
ProfilePicture: &proto.ProfilePicture{
AvatarId: player.TeamConfig.GetActiveAvatarId(),
CostumeId: player.AvatarMap[player.TeamConfig.GetActiveAvatarId()].Costume,
},
ControllerId: 1,
},
// 对手的
{
ProfilePicture: &proto.ProfilePicture{},
ControllerId: 2,
},
},
// ForbidFinishChallengeList: nil,
CardList: []*proto.GCGCard{
{
TagList: []uint32{203, 303, 401},
Guid: 1, // 应该每次+1
IsShow: true,
TokenList: []*proto.GCGToken{
{
Key: 1,
Value: 10,
},
{
Key: 2,
Value: 10,
},
{
Key: 4,
},
{
Key: 5,
Value: 3,
},
},
// FaceType: 0, ?
SkillIdList: []uint32{13011, 13012, 13013},
// SkillLimitsList: nil,
Id: 1301,
ControllerId: 1,
},
{
TagList: []uint32{201, 301, 401},
Guid: 2, // 应该每次+1
IsShow: true,
TokenList: []*proto.GCGToken{
{
Key: 1,
Value: 10,
},
{
Key: 2,
Value: 10,
},
{
Key: 4,
},
{
Key: 5,
Value: 2,
},
},
// FaceType: 0, ?
SkillIdList: []uint32{11031, 11032, 11033},
// SkillLimitsList: nil,
Id: 1103,
ControllerId: 1,
},
{
TagList: []uint32{200, 300, 502, 503},
Guid: 3, // 应该每次+1
IsShow: true,
TokenList: []*proto.GCGToken{
{
Key: 1,
Value: 4,
},
{
Key: 2,
Value: 4,
},
{
Key: 4,
},
{
Key: 5,
Value: 2,
},
},
// FaceType: 0, ?
SkillIdList: []uint32{30011, 30012, 30013},
// SkillLimitsList: nil,
Id: 3301,
ControllerId: 2,
},
{
TagList: []uint32{200, 303, 502, 503},
Guid: 4, // 应该每次+1
IsShow: true,
TokenList: []*proto.GCGToken{
{
Key: 1,
Value: 8,
},
{
Key: 2,
Value: 8,
},
{
Key: 4,
},
{
Key: 5,
Value: 2,
},
},
// FaceType: 0, ?
SkillIdList: []uint32{33021, 33022, 33023, 33024},
// SkillLimitsList: nil,
Id: 3302,
ControllerId: 2,
},
{
Guid: 5, // 应该每次+1
IsShow: true,
SkillIdList: []uint32{13010111},
Id: 1301011,
ControllerId: 1,
},
},
Unk3300_BIANMOPDEHO: 1,
CostRevise: &proto.GCGCostReviseInfo{
CanUseHandCardIdList: nil,
SelectOnStageCostList: nil,
PlayCardCostList: nil,
AttackCostList: nil,
IsCanAttack: false,
},
// GameId: 0,
FieldList: []*proto.GCGPlayerField{
{
// Unk3300_IKJMGAHCFPM: 0,
ModifyZoneMap: map[uint32]*proto.GCGZone{
1: {},
2: {},
},
// Unk3300_GGHKFFADEAL: 0,
Unk3300_AOPJIOHMPOF: nil,
Unk3300_FDFPHNDOJML: 0,
Unk3300_IPLMHKCNDLE: &proto.GCGZone{},
Unk3300_EIHOMDLENMK: &proto.GCGZone{},
// WaitingList: nil,
// Unk3300_PBECINKKHND: 0,
ControllerId: 1,
Unk3300_INDJNJJJNKL: &proto.GCGZone{
CardList: []uint32{1, 2},
},
Unk3300_EFNAEFBECHD: &proto.GCGZone{},
// IsPassed: false,
// IntentionList: nil,
// DiceSideList: nil,
// DeckCardNum: 0,
// Unk3300_GLNIFLOKBPM: 0,
},
{
// Unk3300_IKJMGAHCFPM: 0,
ModifyZoneMap: map[uint32]*proto.GCGZone{
3: {},
4: {},
},
// Unk3300_GGHKFFADEAL: 0,
Unk3300_AOPJIOHMPOF: nil,
Unk3300_FDFPHNDOJML: 0,
Unk3300_IPLMHKCNDLE: &proto.GCGZone{},
Unk3300_EIHOMDLENMK: &proto.GCGZone{},
// WaitingList: nil,
// Unk3300_PBECINKKHND: 0,
ControllerId: 2,
Unk3300_INDJNJJJNKL: &proto.GCGZone{
CardList: []uint32{3, 4},
},
Unk3300_EFNAEFBECHD: &proto.GCGZone{},
// IsPassed: false,
// IntentionList: nil,
// DiceSideList: nil,
// DeckCardNum: 0,
// Unk3300_GLNIFLOKBPM: 0,
},
},
// 应该是玩家成员列表
Unk3300_CDCMBOKBLAK: []*proto.Unk3300_ADHENCIFKNI{
{
ControllerId: 1,
},
{
ControllerId: 2,
},
},
// BusinessType: 0,
// IntentionList: nil,
ChallengeList: []*proto.GCGDuelChallenge{
{
ChallengeId: 906,
TotalProgress: 1,
},
{
ChallengeId: 907,
TotalProgress: 1,
},
{
ChallengeId: 903,
TotalProgress: 1,
},
{
ChallengeId: 904,
TotalProgress: 1,
},
{
ChallengeId: 905,
TotalProgress: 1,
},
{
ChallengeId: 908,
TotalProgress: 1,
},
{
ChallengeId: 909,
TotalProgress: 1,
},
},
Round: 1,
ControllerId: 1,
HistoryMsgPackList: []*proto.GCGMessagePack{
{
MsgList: []*proto.GCGMessage{
{
Message: &proto.GCGMessage_PhaseChange{PhaseChange: &proto.GCGMsgPhaseChange{
BeforePhase: proto.GCGPhaseType_GCG_PHASE_TYPE_START,
AllowControllerMap: []*proto.Uint32Pair{
{
Key: 1,
Value: 1,
},
{
Key: 2,
Value: 1,
},
},
}},
},
},
},
{
MsgList: []*proto.GCGMessage{
{
Message: &proto.GCGMessage_UpdateController{UpdateController: &proto.GCGMsgUpdateController{
AllowControllerMap: []*proto.Uint32Pair{
{
Key: 1,
Value: 1,
},
{
Key: 2,
},
},
}},
},
},
},
{
ActionType: proto.GCGActionType_GCG_ACTION_TYPE_SEND_MESSAGE,
MsgList: []*proto.GCGMessage{
{
Message: &proto.GCGMessage_PhaseContinue{},
},
},
},
},
// Unk3300_JHDDNKFPINA: 0,
CardIdList: []uint32{1103, 1301, 3001, 3302, 1301011},
// Unk3300_JBBMBKGOONO: 0,
Phase: &proto.GCGPhase{
PhaseType: proto.GCGPhaseType_GCG_PHASE_TYPE_START,
AllowControllerMap: map[uint32]uint32{
1: 1,
2: 0,
},
},
}
gcgAskDuelRsp.Duel.HistoryCardList = gcgAskDuelRsp.Duel.CardList
GAME_MANAGER.SendMsg(cmd.GCGAskDuelRsp, player.PlayerID, player.ClientSeq, gcgAskDuelRsp)
}
// GCGInitFinishReq GCG决斗请求
func (g *GameManager) GCGInitFinishReq(player *model.Player, payloadMsg pb.Message) {
GAME_MANAGER.SendMsg(cmd.GCGAskDuelRsp, player.PlayerID, player.ClientSeq, &proto.GCGInitFinishRsp{})
}
// PacketGCGGameBriefDataNotify GCG游戏简要数据通知
func (g *GameManager) PacketGCGGameBriefDataNotify(player *model.Player, businessType proto.GCGGameBusinessType, gameId uint32) *proto.GCGGameBriefDataNotify {
gcgGameBriefDataNotify := &proto.GCGGameBriefDataNotify{
GcgBriefData: &proto.GCGGameBriefData{
BusinessType: businessType,
PlatformType: uint32(proto.PlatformType_PLATFORM_TYPE_PC), // TODO 根据玩家设备修改
GameId: gameId,
PlayerBriefList: []*proto.GCGPlayerBriefData{
{
Uid: player.PlayerID,
ControllerId: 1,
ProfilePicture: &proto.ProfilePicture{
AvatarId: player.TeamConfig.GetActiveAvatarId(),
CostumeId: player.AvatarMap[player.TeamConfig.GetActiveAvatarId()].Costume,
},
NickName: player.NickName,
CardIdList: []uint32{1301, 1103},
},
{
ControllerId: 2,
ProfilePicture: &proto.ProfilePicture{},
CardIdList: []uint32{3001, 3302},
},
},
},
IsNewGame: true,
}
return gcgGameBriefDataNotify
}
// PacketGCGTavernNpcInfoNotify GCG酒馆NPC信息通知
func (g *GameManager) PacketGCGTavernNpcInfoNotify(player *model.Player) *proto.GCGTavernNpcInfoNotify {
gcgTavernNpcInfoNotify := &proto.GCGTavernNpcInfoNotify{
Unk3300_FKAKHMMIEBC: make([]*proto.GCGTavernNpcInfo, 0, 0),
Unk3300_BAMLNENDLCM: make([]*proto.GCGTavernNpcInfo, 0, 0),
CharacterNpc: &proto.GCGTavernNpcInfo{
Id: 0,
ScenePointId: 0,
LevelId: 0,
},
}
return gcgTavernNpcInfoNotify
}
// PacketGCGTCTavernInfoNotify GCG酒馆信息通知
func (g *GameManager) PacketGCGTCTavernInfoNotify(player *model.Player) *proto.GCGTCTavernInfoNotify {
gcgTCTavernInfoNotify := &proto.GCGTCTavernInfoNotify{
LevelId: 0,
Unk3300_IMFJBNFMCHM: false,
Unk3300_MBGMHBNBKBK: false,
PointId: 0,
ElementType: 8,
AvatarId: 10000007,
CharacterId: 0,
}
return gcgTCTavernInfoNotify
}
// PacketGCGTCTavernChallengeDataNotify GCG酒馆挑战数据
func (g *GameManager) PacketGCGTCTavernChallengeDataNotify(player *model.Player) *proto.GCGTCTavernChallengeDataNotify {
gcgTCTavernChallengeDataNotify := &proto.GCGTCTavernChallengeDataNotify{
TavernChallengeList: make([]*proto.GCGTCTavernChallengeData, 0, 0),
}
for _, challenge := range player.GCGInfo.TavernChallengeMap {
gcgTCTavernChallengeData := &proto.GCGTCTavernChallengeData{
UnlockLevelIdList: challenge.UnlockLevelIdList,
CharacterId: challenge.CharacterId,
}
gcgTCTavernChallengeDataNotify.TavernChallengeList = append(gcgTCTavernChallengeDataNotify.TavernChallengeList, gcgTCTavernChallengeData)
}
return gcgTCTavernChallengeDataNotify
}
// PacketGCGBasicDataNotify GCG基础数据通知
func (g *GameManager) PacketGCGBasicDataNotify(player *model.Player) *proto.GCGBasicDataNotify {
gcgBasicDataNotify := &proto.GCGBasicDataNotify{
Level: player.GCGInfo.Level,
Exp: player.GCGInfo.Exp,
LevelRewardTakenList: make([]uint32, 0, 0),
}
return gcgBasicDataNotify
}
// PacketGCGLevelChallengeNotify GCG等级挑战通知
func (g *GameManager) PacketGCGLevelChallengeNotify(player *model.Player) *proto.GCGLevelChallengeNotify {
gcgLevelChallengeNotify := &proto.GCGLevelChallengeNotify{
UnlockBossChallengeList: make([]*proto.GCGBossChallengeData, 0, 0),
UnlockWorldChallengeList: player.GCGInfo.UnlockWorldChallengeList,
LevelList: make([]*proto.GCGLevelData, 0, 0),
}
// Boss挑战信息
for _, challenge := range player.GCGInfo.UnlockBossChallengeMap {
gcgBossChallengeData := &proto.GCGBossChallengeData{
UnlockLevelIdList: challenge.UnlockLevelIdList,
Id: challenge.Id,
}
gcgLevelChallengeNotify.UnlockBossChallengeList = append(gcgLevelChallengeNotify.UnlockBossChallengeList, gcgBossChallengeData)
}
// 等级挑战信息
for _, challenge := range player.GCGInfo.LevelChallengeMap {
gcgLevelData := &proto.GCGLevelData{
FinishedChallengeIdList: challenge.FinishedChallengeIdList,
LevelId: challenge.LevelId,
}
gcgLevelChallengeNotify.LevelList = append(gcgLevelChallengeNotify.LevelList, gcgLevelData)
}
return gcgLevelChallengeNotify
}
// PacketGCGDSBanCardNotify GCG禁止的卡牌通知
func (g *GameManager) PacketGCGDSBanCardNotify(player *model.Player) *proto.GCGDSBanCardNotify {
gcgDSBanCardNotify := &proto.GCGDSBanCardNotify{
CardList: player.GCGInfo.BanCardList,
}
return gcgDSBanCardNotify
}
// PacketGCGDSDataNotify GCG数据通知
func (g *GameManager) PacketGCGDSDataNotify(player *model.Player) *proto.GCGDSDataNotify {
gcgDSDataNotify := &proto.GCGDSDataNotify{
CurDeckId: player.GCGInfo.CurDeckId,
DeckList: make([]*proto.GCGDSDeckData, 0, len(player.GCGInfo.DeckList)),
UnlockCardBackIdList: player.GCGInfo.UnlockCardBackIdList,
CardList: make([]*proto.GCGDSCardData, 0, len(player.GCGInfo.CardList)),
UnlockFieldIdList: player.GCGInfo.UnlockFieldIdList,
UnlockDeckIdList: player.GCGInfo.UnlockDeckIdList,
}
// 卡组列表
for i, deck := range player.GCGInfo.DeckList {
gcgDSDeckData := &proto.GCGDSDeckData{
CreateTime: uint32(deck.CreateTime),
FieldId: deck.FieldId,
CardBackId: deck.CardBackId,
CardList: deck.CardList,
CharacterCardList: deck.CharacterCardList,
Id: uint32(i),
Name: deck.Name,
IsValid: true, // TODO 校验卡组是否有效
}
gcgDSDataNotify.DeckList = append(gcgDSDataNotify.DeckList, gcgDSDeckData)
}
// 卡牌列表
for _, card := range player.GCGInfo.CardList {
gcgDSCardData := &proto.GCGDSCardData{
Num: card.Num,
FaceType: card.FaceType,
CardId: card.CardId,
ProficiencyRewardTakenIdxList: card.ProficiencyRewardTakenIdxList,
UnlockFaceTypeList: card.UnlockFaceTypeList,
Proficiency: card.Proficiency,
}
gcgDSDataNotify.CardList = append(gcgDSDataNotify.CardList, gcgDSCardData)
}
return gcgDSDataNotify
}

View File

@@ -131,6 +131,7 @@ func (g *GameManager) LoginNotify(userId uint32, player *model.Player, clientSeq
g.SendMsg(cmd.PlayerStoreNotify, userId, clientSeq, g.PacketPlayerStoreNotify(player))
g.SendMsg(cmd.AvatarDataNotify, userId, clientSeq, g.PacketAvatarDataNotify(player))
g.SendMsg(cmd.OpenStateUpdateNotify, userId, clientSeq, g.PacketOpenStateUpdateNotify())
g.GCGLogin(player) // 发送GCG登录相关的通知包
playerLoginRsp := &proto.PlayerLoginRsp{
IsUseAbilityHash: true,
AbilityHashCode: -228935105,
@@ -385,6 +386,7 @@ func (g *GameManager) CreatePlayer(userId uint32, nickName string, mainCharAvata
player.GameObjectGuidMap = make(map[uint64]model.GameObject)
player.DropInfo = model.NewDropInfo()
player.ChatMsgMap = make(map[uint32][]*model.ChatMsg)
player.GCGInfo = model.NewGCGInfo()
// 添加选定的主角
player.AddAvatar(mainCharAvatarId)

View File

@@ -32,7 +32,7 @@ func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.M
Y: transPos.Y,
Z: transPos.Z,
}
g.TeleportPlayer(player, uint32(constant.EnterReasonConst.TransPoint), sceneId, pos)
g.TeleportPlayer(player, constant.EnterReasonConst.TransPoint, sceneId, pos, 0)
sceneTransToPointRsp := &proto.SceneTransToPointRsp{
PointId: req.PointId,
@@ -59,13 +59,13 @@ func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
Y: float64(posYInt),
Z: float64(req.Mark.Pos.Z),
}
g.TeleportPlayer(player, uint32(constant.EnterReasonConst.Gm), req.Mark.SceneId, pos)
g.TeleportPlayer(player, constant.EnterReasonConst.Gm, req.Mark.SceneId, pos, 0)
}
}
}
// TeleportPlayer 传送玩家至地图上的某个位置
func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint32, sceneId uint32, pos *model.Vector) {
func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, sceneId uint32, pos *model.Vector, dungeonId uint32) {
// 传送玩家
newSceneId := sceneId
oldSceneId := player.SceneId
@@ -97,14 +97,20 @@ func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint32, s
player.SceneLoadState = model.SceneNone
var enterType proto.EnterType
if jumpScene {
logger.Debug("player jump scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_JUMP
} else {
logger.Debug("player goto scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_GOTO
switch enterReason {
case constant.EnterReasonConst.DungeonEnter:
logger.Debug("player dungeon scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_DUNGEON
default:
if jumpScene {
logger.Debug("player jump scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_JUMP
} else {
logger.Debug("player goto scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_GOTO
}
}
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, enterReason, oldSceneId, oldPos)
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, uint32(enterReason), oldSceneId, oldPos, dungeonId)
g.SendMsg(cmd.PlayerEnterSceneNotify, player.PlayerID, player.ClientSeq, playerEnterSceneNotify)
}

View File

@@ -327,6 +327,7 @@ func (g *GameManager) HostEnterMpWorld(hostPlayer *model.Player, otherUid uint32
uint32(constant.EnterReasonConst.HostFromSingleToMp),
hostPlayer.SceneId,
hostPlayer.Pos,
0,
)
g.SendMsg(cmd.PlayerEnterSceneNotify, hostPlayer.PlayerID, hostPlayer.ClientSeq, hostPlayerEnterSceneNotify)

View File

@@ -212,6 +212,8 @@ func (g *GameManager) SceneInitFinishReq(player *model.Player, payloadMsg pb.Mes
}
g.SendMsg(cmd.SyncScenePlayTeamEntityNotify, player.PlayerID, player.ClientSeq, syncScenePlayTeamEntityNotify)
g.GCGTavernInit(player) // GCG酒馆信息通知
SceneInitFinishRsp := &proto.SceneInitFinishRsp{
EnterSceneToken: player.EnterSceneToken,
}
@@ -346,8 +348,9 @@ func (g *GameManager) PacketPlayerEnterSceneNotifyTp(
enterReason uint32,
prevSceneId uint32,
prevPos *model.Vector,
dungeonId uint32,
) *proto.PlayerEnterSceneNotify {
return g.PacketPlayerEnterSceneNotifyMp(player, player, enterType, enterReason, prevSceneId, prevPos)
return g.PacketPlayerEnterSceneNotifyMp(player, player, enterType, enterReason, prevSceneId, prevPos, dungeonId)
}
func (g *GameManager) PacketPlayerEnterSceneNotifyMp(
@@ -357,6 +360,7 @@ func (g *GameManager) PacketPlayerEnterSceneNotifyMp(
enterReason uint32,
prevSceneId uint32,
prevPos *model.Vector,
dungeonId uint32,
) *proto.PlayerEnterSceneNotify {
world := WORLD_MANAGER.GetWorldByID(player.WorldId)
scene := world.GetSceneById(player.SceneId)
@@ -373,12 +377,15 @@ func (g *GameManager) PacketPlayerEnterSceneNotifyMp(
WorldLevel: targetPlayer.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_WORLD_LEVEL],
EnterReason: enterReason,
WorldType: 1,
DungeonId: dungeonId,
}
playerEnterSceneNotify.SceneTransaction = strconv.Itoa(int(player.SceneId)) + "-" +
strconv.Itoa(int(targetPlayer.PlayerID)) + "-" +
strconv.Itoa(int(time.Now().Unix())) + "-" +
"296359"
playerEnterSceneNotify.SceneTagIdList = []uint32{102, 111, 112, 116, 118, 126, 135, 140, 142, 149, 1091, 1094, 1095, 1099, 1101, 1103, 1105, 1110, 1120, 1122, 1125, 1127, 1129, 1131, 1133, 1135, 1137, 1138, 1140, 1143, 1146, 1165, 1168}
if player.SceneId == 3 {
playerEnterSceneNotify.SceneTagIdList = []uint32{102, 111, 112, 116, 118, 126, 135, 140, 142, 149, 1091, 1094, 1095, 1099, 1101, 1103, 1105, 1110, 1120, 1122, 1125, 1127, 1129, 1131, 1133, 1135, 1137, 1138, 1140, 1143, 1146, 1165, 1168}
}
return playerEnterSceneNotify
}
@@ -468,6 +475,9 @@ func (g *GameManager) AddSceneEntityNotify(player *model.Player, visionType prot
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_MONSTER):
sceneEntityInfoMonster := g.PacketSceneEntityInfoMonster(scene, entity.id)
entityList = append(entityList, sceneEntityInfoMonster)
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_NPC):
sceneEntityInfoNpc := g.PacketSceneEntityInfoNpc(scene, entity.id)
entityList = append(entityList, sceneEntityInfoNpc)
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET):
sceneEntityInfoGadget := g.PacketSceneEntityInfoGadget(scene, entity.id)
entityList = append(entityList, sceneEntityInfoGadget)
@@ -580,7 +590,7 @@ func (g *GameManager) PacketSceneEntityInfoAvatar(scene *Scene, player *model.Pl
Val: int64(entity.level),
}}},
FightPropList: g.PacketFightPropMapToPbFightPropList(entity.fightProp),
LifeState: 1,
LifeState: uint32(entity.lifeState),
AnimatorParaList: make([]*proto.AnimatorParameterValueInfoPair, 0),
Entity: &proto.SceneEntityInfo_Avatar{
Avatar: g.PacketSceneAvatarInfo(scene, player, avatarId),
@@ -637,7 +647,7 @@ func (g *GameManager) PacketSceneEntityInfoMonster(scene *Scene, entityId uint32
Val: int64(entity.level),
}}},
FightPropList: g.PacketFightPropMapToPbFightPropList(entity.fightProp),
LifeState: 1,
LifeState: uint32(entity.lifeState),
AnimatorParaList: make([]*proto.AnimatorParameterValueInfoPair, 0),
Entity: &proto.SceneEntityInfo_Monster{
Monster: g.PacketSceneMonsterInfo(),
@@ -656,6 +666,54 @@ func (g *GameManager) PacketSceneEntityInfoMonster(scene *Scene, entityId uint32
return sceneEntityInfo
}
func (g *GameManager) PacketSceneEntityInfoNpc(scene *Scene, entityId uint32) *proto.SceneEntityInfo {
entity := scene.GetEntity(entityId)
if entity == nil {
return new(proto.SceneEntityInfo)
}
pos := &proto.Vector{
X: float32(entity.pos.X),
Y: float32(entity.pos.Y),
Z: float32(entity.pos.Z),
}
sceneEntityInfo := &proto.SceneEntityInfo{
EntityType: proto.ProtEntityType_PROT_ENTITY_TYPE_NPC,
EntityId: entity.id,
MotionInfo: &proto.MotionInfo{
Pos: pos,
Rot: &proto.Vector{
X: float32(entity.rot.X),
Y: float32(entity.rot.Y),
Z: float32(entity.rot.Z),
},
Speed: &proto.Vector{},
State: proto.MotionState(entity.moveState),
},
PropList: []*proto.PropPair{{Type: uint32(constant.PlayerPropertyConst.PROP_LEVEL), PropValue: &proto.PropValue{
Type: uint32(constant.PlayerPropertyConst.PROP_LEVEL),
Value: &proto.PropValue_Ival{Ival: int64(entity.level)},
Val: int64(entity.level),
}}},
FightPropList: g.PacketFightPropMapToPbFightPropList(entity.fightProp),
LifeState: uint32(entity.lifeState),
AnimatorParaList: make([]*proto.AnimatorParameterValueInfoPair, 0),
Entity: &proto.SceneEntityInfo_Npc{
Npc: g.PacketSceneNpcInfo(entity.npcEntity),
},
EntityClientData: new(proto.EntityClientData),
EntityAuthorityInfo: &proto.EntityAuthorityInfo{
AbilityInfo: new(proto.AbilitySyncStateInfo),
RendererChangedInfo: new(proto.EntityRendererChangedInfo),
AiInfo: &proto.SceneEntityAiInfo{
IsAiOpen: true,
BornPos: pos,
},
BornPos: pos,
},
}
return sceneEntityInfo
}
func (g *GameManager) PacketSceneEntityInfoGadget(scene *Scene, entityId uint32) *proto.SceneEntityInfo {
entity := scene.GetEntity(entityId)
if entity == nil {
@@ -685,7 +743,7 @@ func (g *GameManager) PacketSceneEntityInfoGadget(scene *Scene, entityId uint32)
Val: int64(1),
}}},
FightPropList: g.PacketFightPropMapToPbFightPropList(entity.fightProp),
LifeState: 1,
LifeState: uint32(entity.lifeState),
AnimatorParaList: make([]*proto.AnimatorParameterValueInfoPair, 0),
EntityClientData: new(proto.EntityClientData),
EntityAuthorityInfo: &proto.EntityAuthorityInfo{
@@ -767,6 +825,16 @@ func (g *GameManager) PacketSceneMonsterInfo() *proto.SceneMonsterInfo {
return sceneMonsterInfo
}
func (g *GameManager) PacketSceneNpcInfo(entity *NpcEntity) *proto.SceneNpcInfo {
sceneNpcInfo := &proto.SceneNpcInfo{
NpcId: entity.NpcId,
RoomId: entity.RoomId,
ParentQuestId: entity.ParentQuestId,
BlockId: entity.BlockId,
}
return sceneNpcInfo
}
func (g *GameManager) PacketSceneGadgetInfoNormal(gadgetId uint32) *proto.SceneGadgetInfo {
sceneGadgetInfo := &proto.SceneGadgetInfo{
GadgetId: gadgetId,

View File

@@ -482,7 +482,7 @@ func (g *GameManager) DrownBackHandler(player *model.Player) {
// }
// }
// 传送玩家至安全位置
g.TeleportPlayer(player, uint32(constant.EnterReasonConst.Revival), player.SceneId, pos)
g.TeleportPlayer(player, constant.EnterReasonConst.Revival, player.SceneId, pos, 0)
}
// 防止重置后又被修改
if player.StaminaInfo.DrownBackDelay != 0 {

View File

@@ -55,8 +55,7 @@ func (g *GameManager) CreateVehicleReq(player *model.Player, payloadMsg pb.Messa
g.CommonRetError(cmd.VehicleInteractRsp, player, &proto.VehicleInteractRsp{})
return
}
GAME_MANAGER.AddSceneEntityNotifyBroadcast(player, scene, proto.VisionType_VISION_TYPE_BORN, []*proto.SceneEntityInfo{GAME_MANAGER.PacketSceneEntityInfoGadget(scene, entityId)}, false)
GAME_MANAGER.AddSceneEntityNotify(player, proto.VisionType_VISION_TYPE_BORN, []uint32{entityId}, true, false)
// 记录创建的载具信息
player.VehicleInfo.LastCreateEntityIdMap[req.VehicleId] = entityId
player.VehicleInfo.LastCreateTime = time.Now().UnixMilli()

View File

@@ -527,6 +527,13 @@ type AvatarEntity struct {
type MonsterEntity struct {
}
type NpcEntity struct {
NpcId uint32
RoomId uint32
ParentQuestId uint32
BlockId uint32
}
const (
GADGET_TYPE_NORMAL = iota
GADGET_TYPE_GATHER
@@ -579,6 +586,7 @@ type Entity struct {
level uint8
avatarEntity *AvatarEntity
monsterEntity *MonsterEntity
npcEntity *NpcEntity
gadgetEntity *GadgetEntity
}
@@ -748,6 +756,7 @@ func (s *Scene) CreateEntityMonster(pos *model.Vector, level uint8, fightProp ma
fightProp: fightProp,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_MONSTER),
level: level,
monsterEntity: &MonsterEntity{},
}
s.entityMap[entity.id] = entity
s.world.aoiManager.AddEntityIdToGridByPos(entity.id, float32(entity.pos.X), float32(entity.pos.Y), float32(entity.pos.Z))
@@ -763,6 +772,36 @@ func (s *Scene) CreateEntityMonster(pos *model.Vector, level uint8, fightProp ma
return entity.id
}
func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQuestId, blockId uint32) uint32 {
entityId := s.world.GetNextWorldEntityId(constant.EntityIdTypeConst.NPC)
entity := &Entity{
id: entityId,
scene: s,
lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos,
rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE),
lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{
uint32(constant.FightPropertyConst.FIGHT_PROP_CUR_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
},
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_NPC),
level: 0,
npcEntity: &NpcEntity{
NpcId: npcId,
RoomId: roomId,
ParentQuestId: parentQuestId,
BlockId: blockId,
},
}
s.entityMap[entity.id] = entity
s.world.aoiManager.AddEntityIdToGridByPos(entity.id, float32(entity.pos.X), float32(entity.pos.Y), float32(entity.pos.Z))
return entity.id
}
func (s *Scene) CreateEntityGadgetNormal(pos *model.Vector, gadgetId uint32) uint32 {
entityId := s.world.GetNextWorldEntityId(constant.EntityIdTypeConst.GADGET)
entity := &Entity{

97
gs/model/gcg.go Normal file
View File

@@ -0,0 +1,97 @@
package model
// GCGCard 卡牌
type GCGCard struct {
CardId uint32 `bson:"cardId"` // 卡牌Id
Num uint32 `bson:"num"` // 数量
FaceType uint32 `bson:"faceType"` // 卡面类型
UnlockFaceTypeList []uint32 `bson:"unlockFaceTypeList"` // 解锁的卡面类型
Proficiency uint32 `bson:"proficiency"` // 熟练程度等级
ProficiencyRewardTakenIdxList []uint32 `bson:"faceType"` // 熟练程度奖励列表
}
// GCGDeck 卡组
type GCGDeck struct {
Name string `bson:"name"` // 卡组名
CharacterCardList []uint32 `bson:"characterCardList"` // 角色牌列表
CardList []uint32 `bson:"cardList"` // 卡牌列表
FieldId uint32 `bson:"fieldId"` // 牌盒样式Id
CardBackId uint32 `bson:"cardBackId"` // 牌背样式Id
CreateTime int64 `bson:"createTime"` // 卡组创建时间
}
// GCGTavernChallenge 酒馆挑战信息
type GCGTavernChallenge struct {
CharacterId uint32 `bson:"characterId"` // 角色Id
UnlockLevelIdList []uint32 `bson:"unlockLevelIdList"` // 解锁的等级Id
}
// GCGBossChallenge Boss挑战信息
type GCGBossChallenge struct {
Id uint32 `bson:"Id"` // BossId
UnlockLevelIdList []uint32 `bson:"unlockLevelIdList"` // 解锁的等级Id
}
// GCGLevelChallenge 等级挑战信息
type GCGLevelChallenge struct {
LevelId uint32 `bson:"levelId"` // 等级Id
FinishedChallengeIdList []uint32 `bson:"finishedChallengeIdList"` // 完成的挑战Id列表
}
// GCGInfo 七圣召唤信息
type GCGInfo struct {
// 基础信息
Level uint32 `bson:"level"` // 等级
Exp uint32 `bson:"exp"` // 经验
// 卡牌
CardList map[uint32]*GCGCard `bson:"cardList"` // 拥有的卡牌 uint32 -> CardId(卡牌Id)
CurDeckId uint32 `bson:"CurDeckId"` // 现行的卡组Id
DeckList []*GCGDeck `bson:"deckList"` // 卡组列表
UnlockDeckIdList []uint32 `bson:"unlockDeckIdList"` // 解锁的卡组
UnlockCardBackIdList []uint32 `bson:"unlockCardBackIdList"` // 解锁的卡背
UnlockFieldIdList []uint32 `bson:"unlockFieldIdList"` // 解锁的牌盒
// 挑战
TavernChallengeMap map[uint32]*GCGTavernChallenge `bson:"tavernChallengeMap"` // 酒馆挑战 uint32 -> CharacterId(角色Id)
LevelChallengeMap map[uint32]*GCGLevelChallenge `bson:"levelChallengeMap"` // 等级挑战 uint32 -> LevelId(等级Id)
UnlockBossChallengeMap map[uint32]*GCGBossChallenge `bson:"unlockBossChallengeMap"` // 解锁的Boss挑战 uint32 -> Id
UnlockWorldChallengeList []uint32 `bson:"unlockWorldChallengeList"` // 解锁的世界挑战
// 其他
BanCardList []uint32 `bson:"banCardList"` // 被禁止的卡牌列表
}
func NewGCGInfo() *GCGInfo {
gcgInfo := &GCGInfo{
Level: 0,
Exp: 0,
CardList: make(map[uint32]*GCGCard, 0),
CurDeckId: 0,
DeckList: make([]*GCGDeck, 0, 0),
UnlockDeckIdList: make([]uint32, 0, 0),
UnlockCardBackIdList: make([]uint32, 0, 0),
UnlockFieldIdList: make([]uint32, 0, 0),
TavernChallengeMap: make(map[uint32]*GCGTavernChallenge, 0),
UnlockBossChallengeMap: make(map[uint32]*GCGBossChallenge, 0),
UnlockWorldChallengeList: make([]uint32, 0, 0),
BanCardList: make([]uint32, 0, 0),
}
gcgInfo.UnlockDeckIdList = append(gcgInfo.UnlockDeckIdList, 1, 2)
gcgInfo.UnlockCardBackIdList = append(gcgInfo.UnlockCardBackIdList, 0)
gcgInfo.UnlockFieldIdList = append(gcgInfo.UnlockFieldIdList, 0)
gcgInfo.TavernChallengeMap[8] = &GCGTavernChallenge{
CharacterId: 8,
UnlockLevelIdList: make([]uint32, 0, 0),
}
gcgInfo.TavernChallengeMap[13] = &GCGTavernChallenge{
CharacterId: 13,
UnlockLevelIdList: make([]uint32, 0, 0),
}
gcgInfo.TavernChallengeMap[17] = &GCGTavernChallenge{
CharacterId: 17,
UnlockLevelIdList: make([]uint32, 0, 0),
}
gcgInfo.TavernChallengeMap[20] = &GCGTavernChallenge{
CharacterId: 20,
UnlockLevelIdList: make([]uint32, 0, 0),
}
return gcgInfo
}

View File

@@ -53,6 +53,7 @@ type Player struct {
DropInfo *DropInfo `bson:"dropInfo"` // 掉落信息
MainCharAvatarId uint32 `bson:"mainCharAvatarId"` // 主角id
ChatMsgMap map[uint32][]*ChatMsg `bson:"chatMsgMap"` // 聊天信息
GCGInfo *GCGInfo `bson:"gcgInfo"` // 七圣召唤信息
IsGM uint8 `bson:"isGM"` // 管理员权限等级
// 在线数据 请随意 记得加忽略字段的tag
EnterSceneToken uint32 `bson:"-" msgpack:"-"` // 玩家的世界进入令牌
@@ -73,6 +74,7 @@ type Player struct {
AbilityInvokeHandler *InvokeHandler[proto.AbilityInvokeEntry] `bson:"-" msgpack:"-"` // ability转发器
GateAppId string `bson:"-" msgpack:"-"` // 网关服务器的appid
FightAppId string `bson:"-" msgpack:"-"` // 战斗服务器的appid
GCGCurGameGuid uint32 `bson:"-" msgpack:"-"` // GCG玩家所在的游戏guid
}
func (p *Player) GetNextGameObjectGuid() uint64 {
@@ -86,6 +88,7 @@ func (p *Player) InitAll() {
p.StaminaInfo = new(StaminaInfo)
p.VehicleInfo = new(VehicleInfo)
p.VehicleInfo.LastCreateEntityIdMap = make(map[uint32]uint32)
p.GCGInfo = NewGCGInfo()
p.InitAllAvatar()
p.InitAllWeapon()
p.InitAllItem()

File diff suppressed because it is too large Load Diff

View File

@@ -248,6 +248,29 @@ func (c *CmdProtoMap) registerAllMessage() {
c.registerMessage(VehicleInteractRsp, &proto.VehicleInteractRsp{}) // 载具交互响应
c.registerMessage(VehicleStaminaNotify, &proto.VehicleStaminaNotify{}) // 载具耐力消耗通知
// 七圣召唤
c.registerMessage(GCGBasicDataNotify, &proto.GCGBasicDataNotify{}) // GCG基本数据通知
c.registerMessage(GCGLevelChallengeNotify, &proto.GCGLevelChallengeNotify{}) // GCG等级挑战通知
c.registerMessage(GCGDSBanCardNotify, &proto.GCGDSBanCardNotify{}) // GCG禁止的卡牌通知
c.registerMessage(GCGDSDataNotify, &proto.GCGDSDataNotify{}) // GCG数据通知 (解锁的内容)
c.registerMessage(GCGTCTavernChallengeDataNotify, &proto.GCGTCTavernChallengeDataNotify{}) // GCG酒馆挑战数据通知
c.registerMessage(GCGTCTavernInfoNotify, &proto.GCGTCTavernInfoNotify{}) // GCG酒馆信息通知
c.registerMessage(GCGTavernNpcInfoNotify, &proto.GCGTavernNpcInfoNotify{}) // GCG酒馆NPC信息通知
c.registerMessage(GCGGameBriefDataNotify, &proto.GCGGameBriefDataNotify{}) // GCG游戏简要数据通知
c.registerMessage(GCGAskDuelReq, &proto.GCGAskDuelReq{}) // GCG决斗请求
c.registerMessage(GCGAskDuelRsp, &proto.GCGAskDuelRsp{}) // GCG决斗响应
c.registerMessage(GCGInitFinishReq, &proto.GCGInitFinishReq{}) // GCG初始化完成请求
c.registerMessage(GCGInitFinishRsp, &proto.GCGInitFinishRsp{}) // GCG初始化完成响应
c.registerMessage(Unk3300_DGBNCDEIIFC, &proto.Unk3300_DGBNCDEIIFC{}) // GCG
c.registerMessage(DungeonWayPointNotify, &proto.DungeonWayPointNotify{}) // GCG
c.registerMessage(DungeonDataNotify, &proto.DungeonDataNotify{}) // GCG
//// TODO 客户端开始GCG游戏
//c.registerMessage(GCGStartChallengeByCheckRewardReq, &proto.GCGStartChallengeByCheckRewardReq{}) // GCG开始挑战来自检测奖励请求
//c.registerMessage(GCGStartChallengeByCheckRewardRsp, &proto.GCGStartChallengeByCheckRewardRsp{}) // GCG开始挑战来自检测奖励响应
//c.registerMessage(GCGStartChallengeReq, &proto.GCGStartChallengeReq{}) // GCG开始挑战请求
//c.registerMessage(GCGStartChallengeRsp, &proto.GCGStartChallengeRsp{}) // GCG开始挑战响应
// 乱七八糟
c.registerMessage(MarkMapReq, &proto.MarkMapReq{}) // 标记地图请求
c.registerMessage(TowerAllDataReq, &proto.TowerAllDataReq{}) // 深渊数据请求

View File

@@ -0,0 +1,48 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
enum GCGActionType {
GCG_ACTION_TYPE_NONE = 0;
GCG_ACTION_TYPE_SPECIAL_PHASE = 1;
GCG_ACTION_TYPE_NEXT_PHASE = 2;
GCG_ACTION_TYPE_DRAW = 3;
GCG_ACTION_TYPE_REDRAW = 4;
GCG_ACTION_TYPE_SELECT_ONSTAGE = 5;
GCG_ACTION_TYPE_ROLL = 6;
GCG_ACTION_TYPE_REROLL = 7;
GCG_ACTION_TYPE_ATTACK = 8;
GCG_ACTION_TYPE_PLAY_CARD = 9;
GCG_ACTION_TYPE_PASS = 10;
GCG_ACTION_TYPE_REBOOT = 11;
GCG_ACTION_TYPE_GAME_OVER = 12;
GCG_ACTION_TYPE_TRIGGER = 13;
GCG_ACTION_TYPE_PHASE_EXIT = 14;
GCG_ACTION_TYPE_CUSTOM = 15;
GCG_ACTION_TYPE_NOTIFY_COST = 16;
GCG_ACTION_TYPE_AFTER_OPERATION = 17;
GCG_ACTION_TYPE_USE_SKILL = 18;
GCG_ACTION_TYPE_NOTIFY_SKILL_PREVIEW = 19;
GCG_ACTION_TYPE_PREVIEW_ATTACK = 20;
GCG_ACTION_TYPE_PREVIEW_AFTER_ATTACK = 21;
GCG_ACTION_TYPE_SEND_MESSAGE = 22;
GCG_ACTION_TYPE_WAITING_CHARACTER = 23;
GCG_ACTION_TYPE_TRIGGER_SKILL = 24;
GCG_ACTION_TYPE_BEFORE_NEXT_OPERATION = 25;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7820
// EnetChannelId: 0
// EnetIsReliable: true
message GCGApplyInviteBattleNotify {
bool is_agree = 14;
int32 retcode = 6;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7984;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
bool is_agree = 4;
int32 retcode = 14;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7730
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGApplyInviteBattleReq {
bool is_agree = 9;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7032;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
bool is_agree = 12;
}

View File

@@ -16,12 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7304
// EnetChannelId: 0
// EnetIsReliable: true
message GCGApplyInviteBattleRsp {
int32 retcode = 5;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7754;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 punish_end_time = 6;
int32 retcode = 8;
}

View File

@@ -16,11 +16,15 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7237
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGAskDuelReq {}
message GCGAskDuelReq {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7034;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
}

View File

@@ -18,13 +18,17 @@ syntax = "proto3";
import "GCGDuel.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7869
// EnetChannelId: 0
// EnetIsReliable: true
message GCGAskDuelRsp {
int32 retcode = 3;
GCGDuel duel = 13;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7564;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
GCGDuel duel = 9;
int32 retcode = 2;
}

View File

@@ -16,10 +16,11 @@
syntax = "proto3";
package proto;
import "Uint32Pair.proto";
option go_package = "./;proto";
message GCGAttackCostInfo {
uint32 skill_id = 8;
map<uint32, uint32> cost_map = 3;
repeated Uint32Pair cost_map = 1;
uint32 skill_id = 7;
}

View File

@@ -0,0 +1,32 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGBackToDuelReq {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7015;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
bool is_back = 10;
}

View File

@@ -0,0 +1,31 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGBackToDuelRsp {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7039;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 14;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7319
// EnetChannelId: 0
// EnetIsReliable: true
message GCGBasicDataNotify {
uint32 level = 9;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7739;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 level = 6;
uint32 exp = 4;
repeated uint32 level_reward_taken_list = 12;
repeated uint32 level_reward_taken_list = 14;
}

View File

@@ -16,10 +16,9 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGBossChallengeData {
uint32 id = 9;
repeated uint32 unlock_level_id_list = 14;
repeated uint32 unlock_level_id_list = 3;
uint32 id = 10;
}

View File

@@ -18,12 +18,16 @@ syntax = "proto3";
import "GCGBossChallengeData.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7073
// EnetChannelId: 0
// EnetIsReliable: true
message GCGBossChallengeUpdateNotify {
GCGBossChallengeData boss_challenge = 11;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7852;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
GCGBossChallengeData boss_challenge = 7;
}

View File

@@ -16,17 +16,19 @@
syntax = "proto3";
import "GCGSkillLimitsInfo.proto";
import "GCGToken.proto";
package proto;
option go_package = "./;proto";
message GCGCard {
uint32 guid = 15;
repeated GCGToken token_list = 2;
bool is_show = 14;
uint32 controller_id = 7;
repeated uint32 tag_list = 7;
uint32 guid = 11;
bool is_show = 15;
repeated GCGToken token_list = 8;
uint32 face_type = 2;
repeated uint32 skill_id_list = 13;
repeated GCGSkillLimitsInfo skill_limits_list = 3;
uint32 id = 6;
repeated uint32 tag_list = 3;
uint32 face_type = 5;
uint32 controller_id = 5;
}

View File

@@ -0,0 +1,25 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
import "GCGSkillLimitsInfo.proto";
option go_package = "./;proto";
message GCGCardSkillLimitsInfo {
repeated GCGSkillLimitsInfo skill_limits_list = 1;
}

View File

@@ -16,7 +16,6 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGChallengeData {

View File

@@ -18,14 +18,17 @@ syntax = "proto3";
import "GCGDuelChallenge.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7268
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGChallengeUpdateNotify {
uint32 server_seq = 12;
GCGDuelChallenge challenge = 13;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7270;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 server_seq = 15;
GCGDuelChallenge challenge = 1;
}

View File

@@ -0,0 +1,27 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
import "GCGSkillPreviewInfo.proto";
option go_package = "./;proto";
message GCGChangeOnstageInfo {
bool is_quick = 11;
uint32 card_guid = 6;
GCGSkillPreviewInfo change_onstage_preview_info = 5;
}

View File

@@ -16,10 +16,11 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
enum GCGClientPerformType {
GCG_CLIENT_PERFORM_TYPE_INVALID = 0;
GCG_CLIENT_PERFORM_TYPE_CARD_EXCHANGE = 1;
GCG_CLIENT_PERFORM_TYPE_FIRST_HAND = 2;
GCG_CLIENT_PERFORM_TYPE_REROLL = 3;
}

View File

@@ -16,11 +16,15 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7506
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGClientSettleReq {}
message GCGClientSettleReq {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7035;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7105
// EnetChannelId: 0
// EnetIsReliable: true
message GCGClientSettleRsp {
uint32 close_time = 4;
int32 retcode = 1;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7532;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 close_time = 5;
int32 retcode = 9;
}

View File

@@ -18,11 +18,12 @@ syntax = "proto3";
import "ProfilePicture.proto";
package proto;
option go_package = "./;proto";
message GCGControllerShowInfo {
ProfilePicture profile_picture = 11;
string nick_name = 14;
uint32 controller_id = 9;
string psn_id = 12;
string nick_name = 10;
string online_id = 15;
ProfilePicture profile_picture = 3;
uint32 controller_id = 11;
}

View File

@@ -20,13 +20,12 @@ import "GCGAttackCostInfo.proto";
import "GCGPlayCardCostInfo.proto";
import "GCGSelectOnStageCostInfo.proto";
package proto;
option go_package = "./;proto";
message GCGCostReviseInfo {
bool is_can_attack = 4;
repeated uint32 can_use_hand_card_id_list = 11;
repeated uint32 can_use_hand_card_id_list = 15;
repeated GCGSelectOnStageCostInfo select_on_stage_cost_list = 13;
repeated GCGPlayCardCostInfo play_card_cost_list = 5;
repeated GCGSelectOnStageCostInfo select_on_stage_cost_list = 10;
repeated GCGAttackCostInfo attack_cost_list = 2;
repeated GCGAttackCostInfo attack_cost_list = 12;
bool is_can_attack = 14;
}

View File

@@ -0,0 +1,31 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDSBanCardNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7135;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
repeated uint32 card_list = 10;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7265
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSCardBackUnlockNotify {
uint32 card_back_id = 6;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7078;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 card_back_id = 13;
}

View File

@@ -16,13 +16,13 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGDSCardData {
uint32 card_id = 14;
repeated uint32 unlock_face_type_list = 9;
uint32 num = 12;
uint32 proficiency = 8;
uint32 face_type = 6;
uint32 num = 11;
uint32 face_type = 5;
uint32 card_id = 4;
repeated uint32 proficiency_reward_taken_idx_list = 14;
repeated uint32 unlock_face_type_list = 6;
uint32 proficiency = 10;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7049
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSCardFaceUnlockNotify {
uint32 card_id = 13;
uint32 face_type = 1;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7767;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 face_type = 13;
uint32 card_id = 8;
}

View File

@@ -0,0 +1,32 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDSCardFaceUpdateNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7066;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 card_id = 9;
uint32 face_type = 1;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7358
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSCardNumChangeNotify {
uint32 card_id = 4;
uint32 num = 10;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7244;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 num = 1;
uint32 card_id = 15;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7680
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSCardProficiencyNotify {
uint32 proficiency = 2;
uint32 card_id = 12;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7969;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 proficiency = 10;
uint32 card_id = 13;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7292
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSChangeCardBackReq {
uint32 deck_id = 10;
uint32 card_back_id = 12;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7680;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 card_back_id = 15;
uint32 deck_id = 13;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7044
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSChangeCardBackRsp {
int32 retcode = 15;
uint32 card_back_id = 6;
uint32 deck_id = 5;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7011;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 13;
uint32 card_back_id = 5;
uint32 deck_id = 9;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7169
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSChangeCardFaceReq {
uint32 face_type = 6;
uint32 card_id = 3;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7010;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 card_id = 9;
uint32 face_type = 14;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7331
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSChangeCardFaceRsp {
uint32 face_type = 8;
uint32 card_id = 4;
int32 retcode = 9;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7549;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 face_type = 9;
int32 retcode = 5;
uint32 card_id = 8;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7131
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSChangeCurDeckReq {
uint32 deck_id = 3;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7257;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 deck_id = 13;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7301
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSChangeCurDeckRsp {
int32 retcode = 8;
uint32 deck_id = 14;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7908;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 6;
uint32 deck_id = 3;
}

View File

@@ -16,14 +16,19 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7432
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSChangeDeckNameReq {
uint32 deck_id = 13;
string name = 7;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7463;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
bool Unk3300_OIPMFIIBPHB = 11;
uint32 deck_id = 2;
string name = 1;
}

View File

@@ -16,14 +16,19 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7916
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSChangeDeckNameRsp {
uint32 deck_id = 13;
int32 retcode = 14;
string name = 1;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7617;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
bool Unk3300_OIPMFIIBPHB = 5;
int32 retcode = 15;
uint32 deck_id = 10;
string name = 7;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7541
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSChangeFieldReq {
uint32 field_id = 6;
uint32 deck_id = 11;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7788;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 field_id = 3;
uint32 deck_id = 13;
}

View File

@@ -16,14 +16,18 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7444
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSChangeFieldRsp {
int32 retcode = 1;
uint32 field_id = 3;
uint32 deck_id = 2;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7036;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 14;
uint32 deck_id = 6;
uint32 field_id = 1;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7796
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSCurDeckChangeNotify {
uint32 deck_id = 6;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7769;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 deck_id = 3;
}

View File

@@ -19,17 +19,21 @@ syntax = "proto3";
import "GCGDSCardData.proto";
import "GCGDSDeckData.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7122
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSDataNotify {
repeated GCGDSDeckData deck_list = 4;
repeated uint32 unlock_card_back_id_list = 5;
repeated uint32 unlock_field_id_list = 6;
uint32 cur_deck_id = 10;
repeated GCGDSCardData card_list = 3;
repeated uint32 unlock_deck_id_list = 1;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7850;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 cur_deck_id = 8;
repeated GCGDSDeckData deck_list = 3;
repeated uint32 unlock_card_back_id_list = 10;
repeated GCGDSCardData card_list = 9;
repeated uint32 unlock_field_id_list = 5;
repeated uint32 unlock_deck_id_list = 6;
}

View File

@@ -16,16 +16,15 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGDSDeckData {
fixed32 create_time = 5;
uint32 field_id = 13;
uint32 card_back_id = 9;
repeated uint32 card_list = 1;
uint32 card_back_id = 15;
repeated uint32 character_card_list = 10;
string name = 5;
uint32 id = 3;
fixed32 create_time = 13;
bool is_valid = 4;
uint32 field_id = 7;
repeated uint32 character_card_list = 7;
uint32 id = 12;
string name = 10;
bool is_valid = 15;
}

View File

@@ -16,16 +16,20 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7104
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSDeckSaveReq {
uint32 deck_id = 1;
repeated uint32 card_list = 4;
repeated uint32 character_card_list = 9;
string name = 14;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7713;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 deck_id = 4;
repeated uint32 card_list = 11;
repeated uint32 character_card_list = 6;
string name = 5;
}

View File

@@ -16,15 +16,19 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7269
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSDeckSaveRsp {
fixed32 create_time = 14;
uint32 deck_id = 11;
int32 retcode = 8;
bool is_valid = 4;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7459;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 9;
bool is_valid = 5;
uint32 deck_id = 15;
fixed32 create_time = 7;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7732
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSDeckUnlockNotify {
uint32 deck_id = 15;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7427;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 deck_id = 14;
}

View File

@@ -0,0 +1,32 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDSDeckUpdateNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7751;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
bool is_valid = 2;
uint32 deck_id = 15;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7988
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGDSDeleteDeckReq {
uint32 deck_id = 15;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7821;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 deck_id = 1;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7524
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSDeleteDeckRsp {
int32 retcode = 14;
uint32 deck_id = 7;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7067;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 deck_id = 14;
int32 retcode = 13;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7333
// EnetChannelId: 0
// EnetIsReliable: true
message GCGDSFieldUnlockNotify {
uint32 field_id = 1;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7860;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 field_id = 12;
}

View File

@@ -0,0 +1,33 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDSTakeCardProficiencyRewardReq {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7001;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 reward_index = 15;
uint32 card_id = 3;
}

View File

@@ -0,0 +1,33 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDSTakeCardProficiencyRewardRsp {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7718;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 card_id = 6;
int32 retcode = 1;
uint32 reward_index = 15;
}

View File

@@ -16,10 +16,9 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGDamageDetail {
uint32 skill_id = 10;
uint32 card_guid = 7;
uint32 card_guid = 4;
uint32 skill_id = 12;
}

View File

@@ -0,0 +1,31 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGDebugReplayNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7071;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
string json_str = 15;
}

View File

@@ -16,7 +16,6 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
enum GCGDiceSideType {

View File

@@ -21,27 +21,33 @@ import "GCGControllerShowInfo.proto";
import "GCGCostReviseInfo.proto";
import "GCGDuelChallenge.proto";
import "GCGGameBusinessType.proto";
import "GCGMessagePack.proto";
import "GCGPVEIntention.proto";
import "GCGPhase.proto";
import "GCGPlayerField.proto";
import "Unk3300_ADHENCIFKNI.proto";
package proto;
option go_package = "./;proto";
message GCGDuel {
uint32 server_seq = 3;
repeated GCGPlayerField field_list = 7;
GCGGameBusinessType business_type = 14;
repeated GCGDuelChallenge challenge_list = 5;
uint32 game_id = 11;
uint32 controller_id = 13;
uint32 round = 15;
uint32 cur_controller_id = 12;
repeated GCGPVEIntention intention_list = 1;
GCGCostReviseInfo cost_revise = 10;
repeated uint32 card_id_list = 4;
repeated GCGCard card_list = 9;
repeated GCGControllerShowInfo show_info_list = 6;
uint32 game_type = 2;
GCGPhase phase = 8;
repeated GCGControllerShowInfo show_info_list = 7;
repeated uint32 forbid_finish_challenge_list = 192;
repeated GCGCard card_list = 1;
uint32 Unk3300_BIANMOPDEHO = 9;
GCGCostReviseInfo cost_revise = 8;
uint32 game_id = 4;
repeated GCGPlayerField field_list = 5;
repeated Unk3300_ADHENCIFKNI Unk3300_CDCMBOKBLAK = 1987;
GCGGameBusinessType business_type = 13;
repeated GCGPVEIntention intention_list = 2;
repeated GCGDuelChallenge challenge_list = 1617;
repeated GCGCard history_card_list = 1872;
uint32 round = 11;
uint32 controller_id = 12;
repeated GCGMessagePack history_msg_pack_list = 797;
uint32 Unk3300_JHDDNKFPINA = 10;
repeated uint32 card_id_list = 6;
uint32 Unk3300_JBBMBKGOONO = 15;
GCGPhase phase = 14;
}

View File

@@ -16,11 +16,10 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGDuelChallenge {
uint32 total_progress = 7;
uint32 challenge_id = 10;
uint32 cur_progress = 12;
uint32 challenge_id = 12;
uint32 cur_progress = 2;
uint32 total_progress = 4;
}

View File

@@ -17,8 +17,8 @@
syntax = "proto3";
import "GCGChallengeData.proto";
import "PlatformType.proto";
package proto;
option go_package = "./;proto";
message GCGDuelExtra {
@@ -28,4 +28,11 @@ message GCGDuelExtra {
map<uint32, uint32> card_face_map = 4;
repeated GCGChallengeData challenge_list = 5;
uint32 score = 6;
bool is_match_ai = 7;
uint32 ai_deck_id = 8;
bool is_internal = 9;
repeated uint32 forbid_finish_challenge_list = 10;
uint32 level = 11;
uint32 client_version = 12;
PlatformType platform_type = 13;
}

View File

@@ -16,7 +16,6 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
enum GCGEndReason {
@@ -25,4 +24,10 @@ enum GCGEndReason {
GCG_END_REASON_SURRENDER = 2;
GCG_END_REASON_DISCONNECTED = 3;
GCG_END_REASON_ROUND_LIMIT = 4;
GCG_END_REASON_GM = 5;
GCG_END_REASON_NO_PLAYER = 6;
GCG_END_REASON_GIVE_UP = 7;
GCG_END_REASON_INIT_TIMEOUT = 8;
GCG_END_REASON_EFFECT = 9;
GCG_END_REASON_Unk3300_INAPHKAKKHF = 10;
}

View File

@@ -19,13 +19,13 @@ syntax = "proto3";
import "GCGGameBusinessType.proto";
import "GCGPlayerBriefData.proto";
package proto;
option go_package = "./;proto";
message GCGGameBriefData {
uint32 game_id = 14;
uint32 game_uid = 9;
GCGGameBusinessType business_type = 13;
uint32 verify_code = 5;
repeated GCGPlayerBriefData player_brief_list = 12;
uint32 Unk3300_NCLDOGNCHGF = 13;
GCGGameBusinessType business_type = 8;
uint32 Unk3300_FJJDMIBIBJN = 14;
uint32 platform_type = 6;
uint32 game_id = 12;
repeated GCGPlayerBriefData player_brief_list = 5;
}

View File

@@ -18,12 +18,17 @@ syntax = "proto3";
import "GCGGameBriefData.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7539
// EnetChannelId: 0
// EnetIsReliable: true
message GCGGameBriefDataNotify {
GCGGameBriefData gcg_brief_data = 10;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7824;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
GCGGameBriefData gcg_brief_data = 3;
bool is_new_game = 4;
}

View File

@@ -16,7 +16,6 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
enum GCGGameBusinessType {
@@ -29,4 +28,7 @@ enum GCGGameBusinessType {
GCG_GAME_BUSINESS_TYPE_WORLD_CHALLENGE = 6;
GCG_GAME_BUSINESS_TYPE_BOSS_CHALLENGE = 7;
GCG_GAME_BUSINESS_TYPE_WEEK_CHALLENGE = 8;
GCG_GAME_BUSINESS_TYPE_BREAK_CHALLENGE = 9;
GCG_GAME_BUSINESS_TYPE_QUEST = 10;
GCG_GAME_BUSINESS_TYPE_GUIDE_GROUP = 11;
}

View File

@@ -0,0 +1,40 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGGameCreateFailReasonNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7658;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
enum GCGGameCreateReason {
GCG_GAME_CREATE_REASON_NONE = 0;
GCG_GAME_CREATE_REASON_GAME_MAX = 1;
GCG_GAME_CREATE_REASON_CLIENT_VERSION_NOT_LATEST = 2;
GCG_GAME_CREATE_REASON_RESOURCE_NOT_COMPLETE = 3;
GCG_GAME_CREATE_REASON_TIMEOUT = 4;
GCG_GAME_CREATE_REASON_Unk3300_EMCDFGGFFAH = 5;
}
GCGGameCreateReason reason = 7;
}

View File

@@ -0,0 +1,29 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGGameMaxNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7226;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7736
// EnetChannelId: 0
// EnetIsReliable: true
message GCGGrowthLevelNotify {
uint32 exp = 7;
uint32 level = 11;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7343;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 level = 10;
uint32 exp = 2;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7477
// EnetChannelId: 0
// EnetIsReliable: true
message GCGGrowthLevelRewardNotify {
repeated uint32 level_reward_taken_list = 8;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7934;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
repeated uint32 level_reward_taken_list = 2;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7051
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGGrowthLevelTakeRewardReq {
uint32 level = 4;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7486;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 level = 12;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7670
// EnetChannelId: 0
// EnetIsReliable: true
message GCGGrowthLevelTakeRewardRsp {
uint32 level = 1;
int32 retcode = 13;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7602;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 4;
uint32 level = 11;
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7224
// EnetChannelId: 0
// EnetIsReliable: true
message GCGHeartBeatNotify {
uint32 server_seq = 6;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7576;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 server_seq = 12;
}

View File

@@ -16,11 +16,15 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7684
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGInitFinishReq {}
message GCGInitFinishReq {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7348;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
}

View File

@@ -16,12 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7433
// EnetChannelId: 0
// EnetIsReliable: true
message GCGInitFinishRsp {
int32 retcode = 2;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7369;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
int32 retcode = 4;
}

View File

@@ -0,0 +1,24 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
enum GCGIntentionChangeType {
GCG_INTENTION_CHANGE_TYPE_NONE = 0;
GCG_INTENTION_CHANGE_TYPE_RM = 1;
}

View File

@@ -16,10 +16,16 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7692
// EnetChannelId: 0
// EnetIsReliable: true
message GCGInviteBattleNotify {}
message GCGInviteBattleNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7448;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 confirm_end_time = 1;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7783
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message GCGInviteGuestBattleReq {
uint32 uid = 11;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7202;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// IS_ALLOW_CLIENT = 1;
// }
uint32 uid = 8;
}

View File

@@ -16,13 +16,19 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7251
// EnetChannelId: 0
// EnetIsReliable: true
message GCGInviteGuestBattleRsp {
int32 retcode = 3;
uint32 uid = 11;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7997;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 uid = 12;
int32 retcode = 13;
uint32 punish_end_time = 3;
uint32 confirm_end_time = 7;
}

View File

@@ -0,0 +1,31 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGLevelChallengeDeleteNotify {
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7993;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
repeated uint32 level_id_list = 6;
}

View File

@@ -16,13 +16,17 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
// CmdId: 7629
// EnetChannelId: 0
// EnetIsReliable: true
message GCGLevelChallengeFinishNotify {
repeated uint32 finished_challenge_id_list = 10;
uint32 level_id = 15;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7004;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
uint32 level_id = 14;
repeated uint32 finished_challenge_id_list = 3;
}

View File

@@ -19,14 +19,18 @@ syntax = "proto3";
import "GCGBossChallengeData.proto";
import "GCGLevelData.proto";
package proto;
option go_package = "./;proto";
// CmdId: 7055
// EnetChannelId: 0
// EnetIsReliable: true
message GCGLevelChallengeNotify {
repeated GCGBossChallengeData unlock_boss_challenge_list = 3;
repeated uint32 unlock_world_challenge_list = 8;
repeated GCGLevelData level_list = 10;
// enum CmdId {
// option allow_alias = true;
// NONE = 0;
// CMD_ID = 7183;
// ENET_CHANNEL_ID = 0;
// ENET_IS_RELIABLE = 1;
// }
repeated GCGBossChallengeData unlock_boss_challenge_list = 11;
repeated uint32 unlock_world_challenge_list = 3;
repeated GCGLevelData level_list = 4;
}

View File

@@ -16,10 +16,9 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
message GCGLevelData {
repeated uint32 finished_challenge_id_list = 10;
uint32 level_id = 9;
repeated uint32 finished_challenge_id_list = 13;
uint32 level_id = 7;
}

View File

@@ -16,7 +16,6 @@
syntax = "proto3";
package proto;
option go_package = "./;proto";
enum GCGLevelType {
@@ -26,4 +25,7 @@ enum GCGLevelType {
GCG_LEVEL_TYPE_WORLD = 3;
GCG_LEVEL_TYPE_BOSS = 4;
GCG_LEVEL_TYPE_CHARACTER = 5;
GCG_LEVEL_TYPE_BREAK = 6;
GCG_LEVEL_TYPE_QUEST = 7;
GCG_LEVEL_TYPE_GUIDE_GROUP = 8;
}

View File

@@ -0,0 +1,24 @@
// Sorapointa - A server software re-implementation for a certain anime game, and avoid sorapointa.
// Copyright (C) 2022 Sorapointa Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
syntax = "proto3";
option go_package = "./;proto";
message GCGLimitsInfo {
uint32 Unk3300_MNCNOLHHGPA = 7;
uint32 Unk3300_PHKPKFBDGJF = 13;
}

View File

@@ -18,9 +18,8 @@ syntax = "proto3";
import "MatchPlayerInfo.proto";
package proto;
option go_package = "./;proto";
message GCGMatchInfo {
repeated MatchPlayerInfo player_list = 13;
repeated MatchPlayerInfo player_list = 15;
}

View File

@@ -31,14 +31,19 @@ import "GCGMsgModifyAdd.proto";
import "GCGMsgModifyRemove.proto";
import "GCGMsgMoveCard.proto";
import "GCGMsgNewCard.proto";
import "GCGMsgNoDamageSkillResult.proto";
import "GCGMsgOpTimer.proto";
import "GCGMsgPVEDoOp.proto";
import "GCGMsgPVEGenCardOp.proto";
import "GCGMsgPVEIntentionChange.proto";
import "GCGMsgPVEIntentionInfo.proto";
import "GCGMsgPass.proto";
import "GCGMsgPhaseChange.proto";
import "GCGMsgPhaseContinue.proto";
import "GCGMsgReactionBegin.proto";
import "GCGMsgReactionEnd.proto";
import "GCGMsgRemoveCards.proto";
import "GCGMsgSelectOnStage.proto";
import "GCGMsgSelectOnStageByEffect.proto";
import "GCGMsgSkillLimitsChange.proto";
import "GCGMsgSkillResult.proto";
import "GCGMsgTokenChange.proto";
import "GCGMsgUpdateController.proto";
@@ -46,39 +51,43 @@ import "GCGMsgUseSkill.proto";
import "GCGMsgUseSkillEnd.proto";
import "GCGMsgWaitingListChange.proto";
package proto;
option go_package = "./;proto";
message GCGMessage {
oneof message {
GCGMsgTokenChange token_change = 12;
GCGMsgPhaseChange phase_change = 13;
GCGMsgAddCards add_cards = 10;
GCGMsgRemoveCards remove_cards = 14;
GCGMsgTokenChange token_change = 2;
GCGMsgPhaseChange phase_change = 10;
GCGMsgAddCards add_cards = 5;
GCGMsgRemoveCards remove_cards = 12;
GCGMsgSelectOnStage select_on_stage = 6;
GCGMsgDiceRoll dice_roll = 9;
GCGMsgDiceReroll dice_reroll = 11;
GCGMsgPass pass = 5;
GCGMsgCharDie char_die = 2;
GCGMsgSkillResult skill_result = 1;
GCGMsgCostDice cost_dice = 7;
GCGMsgAddDice add_dice = 3;
GCGMsgMoveCard move_card = 15;
GCGMsgUseSkill use_skill = 4;
GCGMsgNewCard new_card = 1848;
GCGMsgUpdateController update_controller = 429;
GCGMsgModifyAdd modify_add = 1851;
GCGMsgModifyRemove modify_remove = 471;
GCGMsgUseSkillEnd use_skill_end = 1411;
GCGMsgPVEGenCardOp pve_gen_card_op = 1741;
GCGMsgPVEDoOp pve_do_op = 614;
GCGMsgDuelDataChange duel_data_change = 1008;
GCGMsgClientPerform client_perform = 1035;
GCGMsgGameOver game_over = 714;
GCGMsgOpTimer op_timer = 1862;
GCGMsgWaitingListChange waiting_list_change = 1678;
GCGMsgCardUpdate card_update = 1879;
GCGMsgSelectOnStageByEffect select_on_stage_by_effect = 2042;
GCGMsgCostRevise cost_revise = 1350;
GCGMsgDiceRoll dice_roll = 14;
GCGMsgDiceReroll dice_reroll = 15;
GCGMsgPass pass = 8;
GCGMsgCharDie char_die = 4;
GCGMsgSkillResult skill_result = 3;
GCGMsgCostDice cost_dice = 13;
GCGMsgAddDice add_dice = 7;
GCGMsgMoveCard move_card = 11;
GCGMsgUseSkill use_skill = 1;
GCGMsgNewCard new_card = 296;
GCGMsgUpdateController update_controller = 1111;
GCGMsgModifyAdd modify_add = 1733;
GCGMsgModifyRemove modify_remove = 2014;
GCGMsgUseSkillEnd use_skill_end = 1368;
GCGMsgDuelDataChange duel_data_change = 1791;
GCGMsgClientPerform client_perform = 1677;
GCGMsgGameOver game_over = 632;
GCGMsgOpTimer op_timer = 154;
GCGMsgWaitingListChange waiting_list_change = 1991;
GCGMsgCardUpdate card_update = 1702;
GCGMsgSelectOnStageByEffect select_on_stage_by_effect = 1737;
GCGMsgCostRevise cost_revise = 468;
GCGMsgPhaseContinue phase_continue = 1157;
GCGMsgPVEIntentionInfo pve_intention_info = 850;
GCGMsgPVEIntentionChange pve_intention_change = 1268;
GCGMsgSkillLimitsChange skill_limits_change = 710;
GCGMsgNoDamageSkillResult no_damage_skill_result = 773;
GCGMsgReactionBegin reaction_begin = 243;
GCGMsgReactionEnd reaction_end = 1172;
}
}

Some files were not shown because too many files have changed in this diff Show More