完善客户端协议

This commit is contained in:
flswld
2023-01-19 19:29:52 +08:00
parent a00bee14d0
commit 2983c16272
3254 changed files with 57101 additions and 93258 deletions

3
.gitignore vendored
View File

@@ -22,7 +22,8 @@
bin bin
# Game protocol protobuf generate file # Game protocol protobuf generate file
protocol/proto/*.pb.go protocol/proto
protocol/proto_hk4e/proto
gate/client_proto/proto gate/client_proto/proto
gate/client_proto/client_proto_gen.go gate/client_proto/client_proto_gen.go

View File

@@ -1,23 +1,21 @@
CUR_DIR=$(shell pwd) CUR_DIR=$(shell pwd)
.PHONY: build .PHONY: build
# build
build: build:
mkdir -p bin/ && CGO_ENABLED=0 go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/ ./cmd/... mkdir -p bin/ && CGO_ENABLED=0 go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/ ./cmd/...
.PHONY: dev_tool .PHONY: dev_tool
# 安装工具
dev_tool: dev_tool:
# install protoc # 安装natsrpc生成工具
go install github.com/golang/protobuf/protoc-gen-go@v1.5.2 go install github.com/golang/protobuf/protoc-gen-go@v1.5.2
go install github.com/byebyebruce/natsrpc/cmd/protoc-gen-natsrpc@develop go install github.com/byebyebruce/natsrpc/cmd/protoc-gen-natsrpc@develop
test: test:
go test ./... go test ./...
.PHONY: gen .PHONY: gen_natsrpc
# gen 生成代码 gen_natsrpc:
gen: # 生成natsrpc协议代码
protoc \ protoc \
--proto_path=gs/api \ --proto_path=gs/api \
--go_out=paths=source_relative:gs/api \ --go_out=paths=source_relative:gs/api \
@@ -28,5 +26,18 @@ gen:
--go_out=paths=source_relative:node/api \ --go_out=paths=source_relative:node/api \
--natsrpc_out=paths=source_relative:node/api \ --natsrpc_out=paths=source_relative:node/api \
node/api/*.proto node/api/*.proto
#cd protocol/proto && make gen
.PHONY: gen_proto
gen_proto:
# 生成客户端协议代码
cd protocol/proto_hk4e && \
rm -rf ./proto && mkdir -p proto && \
protoc --proto_path=./ --go_out=paths=source_relative:./proto ./*.proto && \
protoc --proto_path=./ --go_out=paths=source_relative:./proto ./cmd/*.proto && \
protoc --proto_path=./ --go_out=paths=source_relative:./proto ./pb/*.proto && \
protoc --proto_path=./ --go_out=paths=source_relative:./proto ./server_only/*.proto && \
mv ./proto/cmd/* ./proto/ && rm -rf ./proto/cmd && \
mv ./proto/pb/* ./proto/ && rm -rf ./proto/pb && \
mv ./proto/server_only/* ./proto/ && rm -rf ./proto/server_only && \
rm -rf ../proto && mkdir -p ../proto && mv ./proto/* ../proto/ && rm -rf ./proto && \
cd ../../

View File

@@ -7,7 +7,7 @@ hk4e game server
* Go >= 1.18 * Go >= 1.18
> 1. 首次需要安装工具 `make dev_tool` > 1. 首次需要安装工具 `make dev_tool`
> 2. 生成协议 `make gen` > 2. 生成协议 `make gen_natsrpc && make gen_proto`
## 快速运行 ## 快速运行

View File

@@ -221,10 +221,10 @@ func (f *FightRoutine) attackHandle(gameMsg *mq.GameMsg) {
case cmd.CombatInvocationsNotify: case cmd.CombatInvocationsNotify:
req := payloadMsg.(*proto.CombatInvocationsNotify) req := payloadMsg.(*proto.CombatInvocationsNotify)
for _, entry := range req.InvokeList { for _, entry := range req.InvokeList {
if entry.ForwardType != proto.ForwardType_FORWARD_TYPE_TO_ALL { if entry.ForwardType != proto.ForwardType_FORWARD_TO_ALL {
continue continue
} }
if entry.ArgumentType != proto.CombatTypeArgument_COMBAT_TYPE_ARGUMENT_EVT_BEING_HIT { if entry.ArgumentType != proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT {
continue continue
} }
hitInfo := new(proto.EvtBeingHitInfo) hitInfo := new(proto.EvtBeingHitInfo)

View File

@@ -28,7 +28,7 @@ func (g *GCGAi) ReceiveGCGMessagePackNotify(notify *proto.GCGMessagePackNotify)
// 阶段改变 // 阶段改变
msg := message.GetPhaseChange() msg := message.GetPhaseChange()
switch msg.AfterPhase { switch msg.AfterPhase {
case proto.GCGPhaseType_GCG_PHASE_TYPE_ON_STAGE: case proto.GCGPhaseType_GCG_PHASE_ON_STAGE:
logger.Error("请选择你的英雄 hhh") logger.Error("请选择你的英雄 hhh")
go func() { go func() {
time.Sleep(3 * 1000) time.Sleep(3 * 1000)
@@ -37,7 +37,7 @@ func (g *GCGAi) ReceiveGCGMessagePackNotify(notify *proto.GCGMessagePackNotify)
// 操控者选择角色牌 // 操控者选择角色牌
g.game.ControllerSelectChar(gameController, cardInfo, []uint32{}) g.game.ControllerSelectChar(gameController, cardInfo, []uint32{})
}() }()
case proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN: case proto.GCGPhaseType_GCG_PHASE_MAIN:
if gameController.allow == 0 { if gameController.allow == 0 {
return return
} }
@@ -57,10 +57,10 @@ func (g *GCGAi) ReceiveGCGMessagePackNotify(notify *proto.GCGMessagePackNotify)
time.Sleep(3 * 1000) time.Sleep(3 * 1000)
cardInfo1 := g.game.controllerMap[g.controllerId].cardMap[CardInfoType_Char][0] cardInfo1 := g.game.controllerMap[g.controllerId].cardMap[CardInfoType_Char][0]
cardInfo2 := g.game.controllerMap[g.controllerId].cardMap[CardInfoType_Char][1] cardInfo2 := g.game.controllerMap[g.controllerId].cardMap[CardInfoType_Char][1]
g.game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_NONE, g.game.GCGMsgPVEIntention(&proto.GCGMsgPVEIntention{CardGuid: cardInfo1.guid, SkillIdList: []uint32{cardInfo1.skillList[0].skillId}}, &proto.GCGMsgPVEIntention{CardGuid: cardInfo2.guid, SkillIdList: []uint32{cardInfo2.skillList[0].skillId}})) g.game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_NONE, g.game.GCGMsgPVEIntention(&proto.GCGMsgPVEIntention{CardGuid: cardInfo1.guid, SkillIdList: []uint32{cardInfo1.skillList[0].skillId}}, &proto.GCGMsgPVEIntention{CardGuid: cardInfo2.guid, SkillIdList: []uint32{cardInfo2.skillList[0].skillId}}))
g.game.SendAllMsgPack() g.game.SendAllMsgPack()
g.game.SetControllerAllow(g.game.controllerMap[g.controllerId], false, true) g.game.SetControllerAllow(g.game.controllerMap[g.controllerId], false, true)
g.game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_SEND_MESSAGE, g.game.GCGMsgPhaseContinue()) g.game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_SEND_MESSAGE, g.game.GCGMsgPhaseContinue())
}() }()
} }
} }

View File

@@ -160,11 +160,11 @@ type GCGManager struct {
func NewGCGManager() *GCGManager { func NewGCGManager() *GCGManager {
gcgManager := new(GCGManager) gcgManager := new(GCGManager)
gcgManager.phaseFuncMap = map[proto.GCGPhaseType]func(game *GCGGame){ gcgManager.phaseFuncMap = map[proto.GCGPhaseType]func(game *GCGGame){
proto.GCGPhaseType_GCG_PHASE_TYPE_START: gcgManager.PhaseStart, proto.GCGPhaseType_GCG_PHASE_START: gcgManager.PhaseStart,
proto.GCGPhaseType_GCG_PHASE_TYPE_DRAW: gcgManager.PhaseDraw, proto.GCGPhaseType_GCG_PHASE_DRAW: gcgManager.PhaseDraw,
proto.GCGPhaseType_GCG_PHASE_TYPE_DICE: gcgManager.PhaseRollDice, proto.GCGPhaseType_GCG_PHASE_DICE: gcgManager.PhaseRollDice,
proto.GCGPhaseType_GCG_PHASE_TYPE_PRE_MAIN: gcgManager.PhasePreMain, proto.GCGPhaseType_GCG_PHASE_PRE_MAIN: gcgManager.PhasePreMain,
proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN: gcgManager.PhaseMain, proto.GCGPhaseType_GCG_PHASE_MAIN: gcgManager.PhaseMain,
} }
gcgManager.gameMap = make(map[uint32]*GCGGame) gcgManager.gameMap = make(map[uint32]*GCGGame)
return gcgManager return gcgManager
@@ -195,7 +195,7 @@ func (g *GCGManager) PhaseStart(game *GCGGame) {
// 设置除了先手的玩家不允许操控 // 设置除了先手的玩家不允许操控
game.SetExceptControllerAllow(game.roundInfo.firstController, false, true) game.SetExceptControllerAllow(game.roundInfo.firstController, false, true)
// 游戏跳过阶段消息包 // 游戏跳过阶段消息包
game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_SEND_MESSAGE, game.GCGMsgPhaseContinue()) game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_SEND_MESSAGE, game.GCGMsgPhaseContinue())
// 等待玩家进入 // 等待玩家进入
} }
@@ -207,7 +207,7 @@ func (g *GCGManager) PhaseDraw(game *GCGGame) {
game.ControllerDrawCard(controller, 5) // 默认5张 game.ControllerDrawCard(controller, 5) // 默认5张
} }
// 游戏选择角色卡牌阶段 // 游戏选择角色卡牌阶段
game.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_ON_STAGE) game.ChangePhase(proto.GCGPhaseType_GCG_PHASE_ON_STAGE)
} }
// PhaseRollDice 阶段投掷骰子 // PhaseRollDice 阶段投掷骰子
@@ -219,7 +219,7 @@ func (g *GCGManager) PhaseRollDice(game *GCGGame) {
// 玩家需要8个骰子 // 玩家需要8个骰子
for i := 0; i < 8; i++ { for i := 0; i < 8; i++ {
// diceSide := proto.GCGDiceSideType(random.GetRandomInt32(1, 8)) // diceSide := proto.GCGDiceSideType(random.GetRandomInt32(1, 8))
diceSide := proto.GCGDiceSideType_GCG_DICE_SIDE_TYPE_PAIMON diceSide := proto.GCGDiceSideType_GCG_DICE_SIDE_PAIMON
diceSideList = append(diceSideList, diceSide) diceSideList = append(diceSideList, diceSide)
} }
// 存储该回合玩家的骰子 // 存储该回合玩家的骰子
@@ -227,9 +227,9 @@ func (g *GCGManager) PhaseRollDice(game *GCGGame) {
for _, c := range game.controllerMap { for _, c := range game.controllerMap {
// 发送给其他玩家骰子信息时隐藏具体的骰子类型 // 发送给其他玩家骰子信息时隐藏具体的骰子类型
if c == controller { if c == controller {
game.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_ROLL, game.GCGMsgDiceRoll(controller.controllerId, uint32(len(diceSideList)), diceSideList)) game.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_ROLL, game.GCGMsgDiceRoll(controller.controllerId, uint32(len(diceSideList)), diceSideList))
} else { } else {
game.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_ROLL, game.GCGMsgDiceRoll(controller.controllerId, uint32(len(diceSideList)), []proto.GCGDiceSideType{})) game.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_ROLL, game.GCGMsgDiceRoll(controller.controllerId, uint32(len(diceSideList)), []proto.GCGDiceSideType{}))
} }
} }
} }
@@ -239,18 +239,18 @@ func (g *GCGManager) PhaseRollDice(game *GCGGame) {
// PhasePreMain 阶段战斗开始 // PhasePreMain 阶段战斗开始
func (g *GCGManager) PhasePreMain(game *GCGGame) { func (g *GCGManager) PhasePreMain(game *GCGGame) {
// TODO 使用技能完善 // TODO 使用技能完善
game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_TRIGGER_SKILL, game.GCGMsgUseSkill(195, 33024), game.GCGMsgNewCard(), game.GCGMsgModifyAdd(2, proto.GCGReason_GCG_REASON_EFFECT, 4, []uint32{23}), game.GCGMsgUseSkillEnd(181, 33024)) game.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TRIGGER_SKILL, game.GCGMsgUseSkill(195, 33024), game.GCGMsgNewCard(), game.GCGMsgModifyAdd(2, proto.GCGReason_GCG_REASON_EFFECT, 4, []uint32{23}), game.GCGMsgUseSkillEnd(181, 33024))
// 设置先手允许操控 // 设置先手允许操控
game.SetControllerAllow(game.controllerMap[game.roundInfo.firstController], true, false) game.SetControllerAllow(game.controllerMap[game.roundInfo.firstController], true, false)
// 游戏行动阶段 // 游戏行动阶段
game.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN) game.ChangePhase(proto.GCGPhaseType_GCG_PHASE_MAIN)
} }
// PhaseMain 阶段行动 // PhaseMain 阶段行动
func (g *GCGManager) PhaseMain(game *GCGGame) { func (g *GCGManager) PhaseMain(game *GCGGame) {
// 消耗费用信息 // 消耗费用信息
for _, controller := range game.controllerMap { for _, controller := range game.controllerMap {
game.AddMsgPack(controller, 0, proto.GCGActionType_GCG_ACTION_TYPE_NOTIFY_COST, game.GCGMsgCostRevise(controller)) game.AddMsgPack(controller, 0, proto.GCGActionType_GCG_ACTION_NOTIFY_COST, game.GCGMsgCostRevise(controller))
// 如果玩家当前允许操作则发送技能预览信息 // 如果玩家当前允许操作则发送技能预览信息
if controller.allow == 1 && controller.player != nil { if controller.allow == 1 && controller.player != nil {
GAME_MANAGER.SendMsg(cmd.GCGSkillPreviewNotify, controller.player.PlayerID, controller.player.ClientSeq, GAME_MANAGER.PacketGCGSkillPreviewNotify(game, controller)) GAME_MANAGER.SendMsg(cmd.GCGSkillPreviewNotify, controller.player.PlayerID, controller.player.ClientSeq, GAME_MANAGER.PacketGCGSkillPreviewNotify(game, controller))
@@ -408,14 +408,14 @@ func (g *GCGGame) ChangePhase(phase proto.GCGPhaseType) {
// 根据阶段改变操控者允许状态 // 根据阶段改变操控者允许状态
switch phase { switch phase {
case proto.GCGPhaseType_GCG_PHASE_TYPE_ON_STAGE, proto.GCGPhaseType_GCG_PHASE_TYPE_DICE: case proto.GCGPhaseType_GCG_PHASE_ON_STAGE, proto.GCGPhaseType_GCG_PHASE_DICE:
// 该阶段允许所有操控者操作 // 该阶段允许所有操控者操作
g.SetAllControllerAllow(true, false) g.SetAllControllerAllow(true, false)
for _, controller := range g.controllerMap { for _, controller := range g.controllerMap {
g.roundInfo.allowControllerMap[controller.controllerId] = controller.allow g.roundInfo.allowControllerMap[controller.controllerId] = controller.allow
} }
case proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN: case proto.GCGPhaseType_GCG_PHASE_MAIN:
// 行动阶段仅允许操控者操作 // 行动阶段仅允许操控者操作
for _, controller := range g.controllerMap { for _, controller := range g.controllerMap {
// 跳过不允许的操控者 // 跳过不允许的操控者
@@ -426,17 +426,13 @@ func (g *GCGGame) ChangePhase(phase proto.GCGPhaseType) {
} }
} }
allowControllerMap := make([]*proto.Uint32Pair, 0, len(g.controllerMap)) allowControllerMap := make(map[uint32]uint32)
for controllerId, allow := range g.roundInfo.allowControllerMap { for controllerId, allow := range g.roundInfo.allowControllerMap {
pair := &proto.Uint32Pair{ allowControllerMap[controllerId] = allow
Key: controllerId,
Value: allow,
}
allowControllerMap = append(allowControllerMap, pair)
} }
// 游戏下一阶段切换消息包 // 游戏下一阶段切换消息包
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_NEXT_PHASE, g.GCGMsgPhaseChange(beforePhase, phase, allowControllerMap)) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_NEXT_PHASE, g.GCGMsgPhaseChange(beforePhase, phase, allowControllerMap))
// 执行阶段处理前假装现在是最后一个阶段处理 // 执行阶段处理前假装现在是最后一个阶段处理
g.roundInfo.isLastMsgPack = true g.roundInfo.isLastMsgPack = true
@@ -467,7 +463,7 @@ func (g *GCGGame) SetExceptControllerAllow(controllerId uint32, isAllow bool, is
// 是否添加消息包 // 是否添加消息包
if isAddMsg { if isAddMsg {
// 更新客户端操控者允许状态消息包 // 更新客户端操控者允许状态消息包
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_NONE, g.GCGMsgUpdateController()) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_NONE, g.GCGMsgUpdateController())
} }
} }
@@ -479,7 +475,7 @@ func (g *GCGGame) SetAllControllerAllow(isAllow bool, isAddMsg bool) {
// 是否添加消息包 // 是否添加消息包
if isAddMsg { if isAddMsg {
// 更新客户端操控者允许状态消息包 // 更新客户端操控者允许状态消息包
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_NONE, g.GCGMsgUpdateController()) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_NONE, g.GCGMsgUpdateController())
} }
} }
@@ -495,7 +491,7 @@ func (g *GCGGame) SetControllerAllow(controller *GCGController, isAllow bool, is
// 是否添加消息包 // 是否添加消息包
if isAddMsg { if isAddMsg {
// 更新客户端操控者允许状态消息包 // 更新客户端操控者允许状态消息包
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_NONE, g.GCGMsgUpdateController()) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_NONE, g.GCGMsgUpdateController())
} }
} }
@@ -514,7 +510,7 @@ func (g *GCGGame) ControllerSelectChar(controller *GCGController, cardInfo *GCGC
g.SetControllerAllow(controller, false, true) g.SetControllerAllow(controller, false, true)
// 广播选择的角色卡牌消息包 // 广播选择的角色卡牌消息包
g.AddAllMsgPack(controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_SELECT_ONSTAGE, g.GCGMsgSelectOnStage(controller.controllerId, cardInfo.guid, proto.GCGReason_GCG_REASON_DEFAULT)) g.AddAllMsgPack(controller.controllerId, proto.GCGActionType_GCG_ACTION_SELECT_ONSTAGE, g.GCGMsgSelectOnStage(controller.controllerId, cardInfo.guid, proto.GCGReason_GCG_REASON_DEFAULT))
// 该阶段确保每位玩家都选择了角色牌 // 该阶段确保每位玩家都选择了角色牌
isAllSelectedChar := true isAllSelectedChar := true
@@ -526,12 +522,12 @@ func (g *GCGGame) ControllerSelectChar(controller *GCGController, cardInfo *GCGC
// 如果有玩家未选择角色牌不同处理 // 如果有玩家未选择角色牌不同处理
if isAllSelectedChar { if isAllSelectedChar {
// 回合信息 // 回合信息
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_SEND_MESSAGE, g.GCGMsgDuelDataChange()) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_SEND_MESSAGE, g.GCGMsgDuelDataChange())
// 游戏投掷骰子阶段 // 游戏投掷骰子阶段
g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_DICE) g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_DICE)
} else { } else {
// 跳过该阶段 官服是这样的我也不知道为什么 // 跳过该阶段 官服是这样的我也不知道为什么
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_SEND_MESSAGE, g.GCGMsgPhaseContinue()) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_SEND_MESSAGE, g.GCGMsgPhaseContinue())
// 立刻发送消息包 模仿官服效果 // 立刻发送消息包 模仿官服效果
g.SendAllMsgPack() g.SendAllMsgPack()
@@ -543,7 +539,7 @@ func (g *GCGGame) ControllerReRollDice(controller *GCGController, diceIndexList
// 玩家禁止操作 // 玩家禁止操作
g.SetAllControllerAllow(false, true) g.SetAllControllerAllow(false, true)
// 游戏战斗开始阶段 // 游戏战斗开始阶段
g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_PRE_MAIN) g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_PRE_MAIN)
} }
// ControllerUseSkill 操控者使用技能 // ControllerUseSkill 操控者使用技能
@@ -582,8 +578,8 @@ func (g *GCGGame) ControllerUseSkill(controller *GCGController, skillId uint32,
// 因为使用技能自身充能+1 // 因为使用技能自身充能+1
msgList = append(msgList, g.GCGMsgTokenChange(controller.selectedCharCardGuid, proto.GCGReason_GCG_REASON_ATTACK, constant.GCGTokenConst.TOKEN_CUR_ELEM, 3)) msgList = append(msgList, g.GCGMsgTokenChange(controller.selectedCharCardGuid, proto.GCGReason_GCG_REASON_ATTACK, constant.GCGTokenConst.TOKEN_CUR_ELEM, 3))
g.AddAllMsgPack(controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_ATTACK, msgList...) g.AddAllMsgPack(controller.controllerId, proto.GCGActionType_GCG_ACTION_ATTACK, msgList...)
g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN) g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_MAIN)
} }
// ControllerDrawCard 操控者抽取手牌 // ControllerDrawCard 操控者抽取手牌
@@ -611,9 +607,9 @@ func (g *GCGGame) ControllerDrawCard(controller *GCGController, count int) {
// 发送给别人隐藏卡牌信息的消息包 为了安全 // 发送给别人隐藏卡牌信息的消息包 为了安全
for _, c := range g.controllerMap { for _, c := range g.controllerMap {
if c == controller { if c == controller {
g.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_DRAW, msgList...) g.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_DRAW, msgList...)
} else { } else {
g.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_TYPE_DRAW, otherMsgList...) g.AddMsgPack(c, controller.controllerId, proto.GCGActionType_GCG_ACTION_DRAW, otherMsgList...)
} }
} }
} }
@@ -660,7 +656,7 @@ func (g *GCGGame) InitGame(playerList []*model.Player) {
// TODO 验证玩家人数是否符合 // TODO 验证玩家人数是否符合
// 游戏开始阶段 // 游戏开始阶段
g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_START) g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_START)
} }
// StartGame 开始GCG游戏 // StartGame 开始GCG游戏
@@ -673,9 +669,9 @@ func (g *GCGGame) StartGame() {
// 游戏开始设置所有玩家不允许操作 // 游戏开始设置所有玩家不允许操作
g.SetAllControllerAllow(false, true) g.SetAllControllerAllow(false, true)
// 分配先手 // 分配先手
g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_TYPE_PHASE_EXIT, g.GCGMsgClientPerform(proto.GCGClientPerformType_GCG_CLIENT_PERFORM_TYPE_FIRST_HAND, []uint32{g.roundInfo.firstController})) g.AddAllMsgPack(0, proto.GCGActionType_GCG_ACTION_PHASE_EXIT, g.GCGMsgClientPerform(proto.GCGClientPerformType_GCG_PERFORM_FIRST_HAND, []uint32{g.roundInfo.firstController}))
// 游戏抽取手牌阶段 // 游戏抽取手牌阶段
g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_TYPE_DRAW) g.ChangePhase(proto.GCGPhaseType_GCG_PHASE_DRAW)
} }
// CheckAllInitFinish 检查所有玩家是否加载完成 // CheckAllInitFinish 检查所有玩家是否加载完成
@@ -755,7 +751,7 @@ func (g *GCGGame) SendAllMsgPack() {
} }
// GCGMsgPhaseChange GCG消息阶段改变 // GCGMsgPhaseChange GCG消息阶段改变
func (g *GCGGame) GCGMsgPhaseChange(beforePhase proto.GCGPhaseType, afterPhase proto.GCGPhaseType, allowControllerMap []*proto.Uint32Pair) *proto.GCGMessage { func (g *GCGGame) GCGMsgPhaseChange(beforePhase proto.GCGPhaseType, afterPhase proto.GCGPhaseType, allowControllerMap map[uint32]uint32) *proto.GCGMessage {
gcgMsgPhaseChange := &proto.GCGMsgPhaseChange{ gcgMsgPhaseChange := &proto.GCGMsgPhaseChange{
BeforePhase: beforePhase, BeforePhase: beforePhase,
AfterPhase: afterPhase, AfterPhase: afterPhase,
@@ -783,19 +779,15 @@ func (g *GCGGame) GCGMsgPhaseContinue() *proto.GCGMessage {
// GCGMsgUpdateController GCG消息更新操控者 // GCGMsgUpdateController GCG消息更新操控者
func (g *GCGGame) GCGMsgUpdateController() *proto.GCGMessage { func (g *GCGGame) GCGMsgUpdateController() *proto.GCGMessage {
gcgMsgUpdateController := &proto.GCGMsgUpdateController{ gcgMsgUpdateController := &proto.GCGMsgUpdateController{
AllowControllerMap: make([]*proto.Uint32Pair, 0, len(g.controllerMap)), AllowControllerMap: make(map[uint32]uint32),
} }
// 操控者的是否允许操作 // 操控者的是否允许操作
for _, controller := range g.controllerMap { for _, controller := range g.controllerMap {
// 如果处于行动阶段只发送允许操作的 // 如果处于行动阶段只发送允许操作的
if g.roundInfo.phaseType == proto.GCGPhaseType_GCG_PHASE_TYPE_MAIN && controller.allow == 0 { if g.roundInfo.phaseType == proto.GCGPhaseType_GCG_PHASE_MAIN && controller.allow == 0 {
continue continue
} }
pair := &proto.Uint32Pair{ gcgMsgUpdateController.AllowControllerMap[controller.controllerId] = controller.allow
Key: controller.controllerId,
Value: controller.allow,
}
gcgMsgUpdateController.AllowControllerMap = append(gcgMsgUpdateController.AllowControllerMap, pair)
} }
gcgMessage := &proto.GCGMessage{ gcgMessage := &proto.GCGMessage{
Message: &proto.GCGMessage_UpdateController{ Message: &proto.GCGMessage_UpdateController{
@@ -963,15 +955,12 @@ func (g *GCGGame) GCGMsgCostRevise(controller *GCGController) *proto.GCGMessage
return new(proto.GCGMessage) return new(proto.GCGMessage)
} }
gcgAttackCostInfo := &proto.GCGAttackCostInfo{ gcgAttackCostInfo := &proto.GCGAttackCostInfo{
CostMap: make([]*proto.Uint32Pair, len(gcgSkillConfig.CostMap)), CostMap: make(map[uint32]uint32),
SkillId: skillInfo.skillId, SkillId: skillInfo.skillId,
} }
// 技能消耗 // 技能消耗
for costType, costValue := range gcgSkillConfig.CostMap { for costType, costValue := range gcgSkillConfig.CostMap {
gcgAttackCostInfo.CostMap = append(gcgAttackCostInfo.CostMap, &proto.Uint32Pair{ gcgAttackCostInfo.CostMap[costType] = costValue
Key: costType,
Value: costValue,
})
} }
gcgMsgCostRevise.CostRevise.AttackCostList = append(gcgMsgCostRevise.CostRevise.AttackCostList, gcgAttackCostInfo) gcgMsgCostRevise.CostRevise.AttackCostList = append(gcgMsgCostRevise.CostRevise.AttackCostList, gcgAttackCostInfo)
} }
@@ -983,11 +972,8 @@ func (g *GCGGame) GCGMsgCostRevise(controller *GCGController) *proto.GCGMessage
} }
gcgSelectOnStageCostInfo := &proto.GCGSelectOnStageCostInfo{ gcgSelectOnStageCostInfo := &proto.GCGSelectOnStageCostInfo{
CardGuid: cardInfo.guid, CardGuid: cardInfo.guid,
CostMap: []*proto.Uint32Pair{ CostMap: map[uint32]uint32{
{ 10: 1,
Key: 10,
Value: 1,
},
}, },
} }
gcgMsgCostRevise.CostRevise.SelectOnStageCostList = append(gcgMsgCostRevise.CostRevise.SelectOnStageCostList, gcgSelectOnStageCostInfo) gcgMsgCostRevise.CostRevise.SelectOnStageCostList = append(gcgMsgCostRevise.CostRevise.SelectOnStageCostList, gcgSelectOnStageCostInfo)
@@ -1045,11 +1031,11 @@ func (g *GCGGame) GCGMsgTokenChange(cardGuid uint32, reason proto.GCGReason, tok
gcgMsgTokenChange := &proto.GCGMsgTokenChange{ gcgMsgTokenChange := &proto.GCGMsgTokenChange{
TokenType: tokenType, TokenType: tokenType,
// token改变为的值 // token改变为的值
Unk3300_LLGHGEALDDI: tokenChangeValue, After: tokenChangeValue,
Reason: reason, Reason: reason,
// 可能是改变之前的值 无所谓就算是0也能跑 // 可能是改变之前的值 无所谓就算是0也能跑
Unk3300_LCNKBFBJDFM: 0, // Unk Before: 0, // Unk
CardGuid: cardGuid, CardGuid: cardGuid,
} }
gcgMessage := &proto.GCGMessage{ gcgMessage := &proto.GCGMessage{
Message: &proto.GCGMessage_TokenChange{ Message: &proto.GCGMessage_TokenChange{
@@ -1080,15 +1066,15 @@ func (g *GCGGame) GCGMsgSkillResult(selectedCharCardGuid uint32, skillId uint32)
} }
gcgMsgSkillResult := &proto.GCGMsgSkillResult{ gcgMsgSkillResult := &proto.GCGMsgSkillResult{
// 攻击附带的元素特效 // 攻击附带的元素特效
Unk3300_NIGDCIGLAKE: gcgSkillConfig.ElementType, EffectElement: gcgSkillConfig.ElementType,
TargetCardGuid: resultTargetCardGuid, TargetCardGuid: resultTargetCardGuid,
Unk3300_PDBAGJINFPF: 0, // Unk // Unk3300_PDBAGJINFPF: 0, // Unk
DetailList: []*proto.GCGDamageDetail{}, DetailList: []*proto.GCGDamageDetail{},
SkillId: skillId, SkillId: skillId,
Damage: gcgSkillConfig.Damage, Damage: gcgSkillConfig.Damage,
Unk3300_EPNDCIAJOJP: 0, // Unk3300_EPNDCIAJOJP: 0,
Unk3300_NNJAOEHNPPD: 0, // Unk3300_NNJAOEHNPPD: 0,
Unk3300_LPGLOCDDPCL: 0, // Unk3300_LPGLOCDDPCL: 0,
} }
gcgMessage := &proto.GCGMessage{ gcgMessage := &proto.GCGMessage{
Message: &proto.GCGMessage_SkillResult{ Message: &proto.GCGMessage_SkillResult{

View File

@@ -216,9 +216,9 @@ func (g *GameManager) PacketAvatarEquipChangeNotify(avatar *model.Avatar, weapon
Level: uint32(weapon.Level), Level: uint32(weapon.Level),
AbilityInfo: new(proto.AbilitySyncStateInfo), AbilityInfo: new(proto.AbilitySyncStateInfo),
} }
itemDataConfig, ok := gdconf.CONF.ItemDataMap[int32(weapon.ItemId)] itemDataConfig, exist := gdconf.CONF.ItemDataMap[int32(weapon.ItemId)]
if ok { if exist {
avatarEquipChangeNotify.EquipType = uint32(itemDataConfig.EquipType) avatarEquipChangeNotify.EquipType = uint32(itemDataConfig.Type)
} }
return avatarEquipChangeNotify return avatarEquipChangeNotify
} }
@@ -227,9 +227,9 @@ func (g *GameManager) PacketAvatarEquipTakeOffNotify(avatar *model.Avatar, weapo
avatarEquipChangeNotify := &proto.AvatarEquipChangeNotify{ avatarEquipChangeNotify := &proto.AvatarEquipChangeNotify{
AvatarGuid: avatar.Guid, AvatarGuid: avatar.Guid,
} }
itemDataConfig, ok := gdconf.CONF.ItemDataMap[int32(weapon.ItemId)] itemDataConfig, exist := gdconf.CONF.ItemDataMap[int32(weapon.ItemId)]
if ok { if exist {
avatarEquipChangeNotify.EquipType = uint32(itemDataConfig.EquipType) avatarEquipChangeNotify.EquipType = uint32(itemDataConfig.Type)
} }
return avatarEquipChangeNotify return avatarEquipChangeNotify
} }

View File

@@ -46,7 +46,7 @@ func (g *GameManager) QueryPathReq(player *model.Player, payloadMsg pb.Message)
queryPathRsp := &proto.QueryPathRsp{ queryPathRsp := &proto.QueryPathRsp{
QueryId: req.QueryId, QueryId: req.QueryId,
QueryStatus: proto.QueryPathRsp_PATH_STATUS_TYPE_SUCC, QueryStatus: proto.QueryPathRsp_STATUS_SUCC,
Corners: []*proto.Vector{req.DestinationPos[0]}, Corners: []*proto.Vector{req.DestinationPos[0]},
} }
g.SendMsg(cmd.QueryPathRsp, player.PlayerID, player.ClientSeq, queryPathRsp) g.SendMsg(cmd.QueryPathRsp, player.PlayerID, player.ClientSeq, queryPathRsp)
@@ -166,7 +166,7 @@ func (g *GameManager) ServerAppidBindNotify(userId uint32, fightAppId string, jo
// 进入场景 // 进入场景
player.SceneJump = true player.SceneJump = true
player.SceneLoadState = model.SceneNone player.SceneLoadState = model.SceneNone
g.SendMsg(cmd.PlayerEnterSceneNotify, userId, player.ClientSeq, g.PacketPlayerEnterSceneNotifyLogin(player, proto.EnterType_ENTER_TYPE_SELF)) g.SendMsg(cmd.PlayerEnterSceneNotify, userId, player.ClientSeq, g.PacketPlayerEnterSceneNotifyLogin(player, proto.EnterType_ENTER_SELF))
} }
func (g *GameManager) ObstacleModifyNotify(player *model.Player, payloadMsg pb.Message) { func (g *GameManager) ObstacleModifyNotify(player *model.Player, payloadMsg pb.Message) {

View File

@@ -102,7 +102,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
scene := world.GetSceneById(player.SceneId) scene := world.GetSceneById(player.SceneId)
for _, entry := range req.InvokeList { for _, entry := range req.InvokeList {
switch entry.ArgumentType { switch entry.ArgumentType {
case proto.CombatTypeArgument_COMBAT_TYPE_ARGUMENT_EVT_BEING_HIT: case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT:
hitInfo := new(proto.EvtBeingHitInfo) hitInfo := new(proto.EvtBeingHitInfo)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EvtBeingHitInfo") clientProtoObj := g.GetClientProtoObjByName("EvtBeingHitInfo")
@@ -151,7 +151,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
} }
g.SendToWorldA(world, cmd.EntityFightPropUpdateNotify, player.ClientSeq, entityFightPropUpdateNotify) g.SendToWorldA(world, cmd.EntityFightPropUpdateNotify, player.ClientSeq, entityFightPropUpdateNotify)
if currHp == 0 && target.avatarEntity == nil { if currHp == 0 && target.avatarEntity == nil {
scene.SetEntityLifeState(target, constant.LifeStateConst.LIFE_DEAD, proto.PlayerDieType_PLAYER_DIE_TYPE_GM) scene.SetEntityLifeState(target, constant.LifeStateConst.LIFE_DEAD, proto.PlayerDieType_PLAYER_DIE_GM)
} }
combatData, err := pb.Marshal(hitInfo) combatData, err := pb.Marshal(hitInfo)
if err != nil { if err != nil {
@@ -159,7 +159,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
} }
entry.CombatData = combatData entry.CombatData = combatData
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
case proto.CombatTypeArgument_COMBAT_TYPE_ARGUMENT_ENTITY_MOVE: case proto.CombatTypeArgument_ENTITY_MOVE:
entityMoveInfo := new(proto.EntityMoveInfo) entityMoveInfo := new(proto.EntityMoveInfo)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EntityMoveInfo") clientProtoObj := g.GetClientProtoObjByName("EntityMoveInfo")
@@ -225,7 +225,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
sceneEntity.lastMoveReliableSeq = entityMoveInfo.ReliableSeq sceneEntity.lastMoveReliableSeq = entityMoveInfo.ReliableSeq
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
case proto.CombatTypeArgument_COMBAT_TYPE_ARGUMENT_ANIMATOR_STATE_CHANGED: case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED:
evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo) evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EvtAnimatorStateChangedInfo") clientProtoObj := g.GetClientProtoObjByName("EvtAnimatorStateChangedInfo")
@@ -303,9 +303,9 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
addEntityIdList = append(addEntityIdList, entityId) addEntityIdList = append(addEntityIdList, entityId)
} }
// 发送已消失格子里的实体消失通知 // 发送已消失格子里的实体消失通知
g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_TYPE_MISS, delEntityIdList) g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, delEntityIdList)
// 发送新出现格子里的实体出现通知 // 发送新出现格子里的实体出现通知
g.AddSceneEntityNotify(player, proto.VisionType_VISION_TYPE_MEET, addEntityIdList, false, false) g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false)
} }
} }
} }
@@ -384,7 +384,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg
} }
for _, abilityInvokeEntry := range req.Invokes { for _, abilityInvokeEntry := range req.Invokes {
switch abilityInvokeEntry.ArgumentType { switch abilityInvokeEntry.ArgumentType {
case proto.AbilityInvokeArgument_ABILITY_INVOKE_ARGUMENT_META_ADD_NEW_ABILITY: case proto.AbilityInvokeArgument_ABILITY_META_ADD_NEW_ABILITY:
abilityMetaAddAbility := new(proto.AbilityMetaAddAbility) abilityMetaAddAbility := new(proto.AbilityMetaAddAbility)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("AbilityMetaAddAbility") clientProtoObj := g.GetClientProtoObjByName("AbilityMetaAddAbility")
@@ -411,7 +411,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg
continue continue
} }
worldAvatar.abilityList = append(worldAvatar.abilityList, abilityMetaAddAbility.Ability) worldAvatar.abilityList = append(worldAvatar.abilityList, abilityMetaAddAbility.Ability)
case proto.AbilityInvokeArgument_ABILITY_INVOKE_ARGUMENT_META_MODIFIER_CHANGE: case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE:
abilityMetaModifierChange := new(proto.AbilityMetaModifierChange) abilityMetaModifierChange := new(proto.AbilityMetaModifierChange)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("AbilityMetaModifierChange") clientProtoObj := g.GetClientProtoObjByName("AbilityMetaModifierChange")
@@ -529,7 +529,7 @@ func (g *GameManager) EvtCreateGadgetNotify(player *model.Player, payloadMsg pb.
Y: float64(req.InitEulerAngles.Y), Y: float64(req.InitEulerAngles.Y),
Z: float64(req.InitEulerAngles.Z), Z: float64(req.InitEulerAngles.Z),
}, req.EntityId, req.ConfigId, req.CampId, req.CampType, req.OwnerEntityId, req.TargetEntityId, req.PropOwnerEntityId) }, req.EntityId, req.ConfigId, req.CampId, req.CampType, req.OwnerEntityId, req.TargetEntityId, req.PropOwnerEntityId)
g.AddSceneEntityNotify(player, proto.VisionType_VISION_TYPE_BORN, []uint32{req.EntityId}, true, true) g.AddSceneEntityNotify(player, proto.VisionType_VISION_BORN, []uint32{req.EntityId}, true, true)
} }
func (g *GameManager) EvtDestroyGadgetNotify(player *model.Player, payloadMsg pb.Message) { func (g *GameManager) EvtDestroyGadgetNotify(player *model.Player, payloadMsg pb.Message) {
@@ -542,5 +542,5 @@ func (g *GameManager) EvtDestroyGadgetNotify(player *model.Player, payloadMsg pb
world := WORLD_MANAGER.GetWorldByID(player.WorldId) world := WORLD_MANAGER.GetWorldByID(player.WorldId)
scene := world.GetSceneById(player.SceneId) scene := world.GetSceneById(player.SceneId)
scene.DestroyEntity(req.EntityId) scene.DestroyEntity(req.EntityId)
g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_TYPE_MISS, []uint32{req.EntityId}) g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{req.EntityId})
} }

View File

@@ -55,7 +55,8 @@ func (g *GameManager) GCGStartChallenge(player *model.Player) {
game := GCG_MANAGER.CreateGame(30101, []*model.Player{player}) game := GCG_MANAGER.CreateGame(30101, []*model.Player{player})
// GCG游戏简要信息通知 // GCG游戏简要信息通知
GAME_MANAGER.SendMsg(cmd.GCGGameBriefDataNotify, player.PlayerID, player.ClientSeq, g.PacketGCGGameBriefDataNotify(player, proto.GCGGameBusinessType_GCG_GAME_BUSINESS_TYPE_GUIDE_GROUP, game)) GAME_MANAGER.SendMsg(cmd.GCGGameBriefDataNotify, player.PlayerID, player.ClientSeq,
g.PacketGCGGameBriefDataNotify(player, proto.GCGGameBusinessType_GCG_GAME_GUIDE_GROUP, game))
// 玩家进入GCG界面 // 玩家进入GCG界面
g.TeleportPlayer(player, constant.EnterReasonConst.DungeonEnter, 79999, new(model.Vector), new(model.Vector), 2162) g.TeleportPlayer(player, constant.EnterReasonConst.DungeonEnter, 79999, new(model.Vector), new(model.Vector), 2162)
@@ -89,8 +90,8 @@ func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message)
ShowInfoList: make([]*proto.GCGControllerShowInfo, 0, len(game.controllerMap)), ShowInfoList: make([]*proto.GCGControllerShowInfo, 0, len(game.controllerMap)),
ForbidFinishChallengeList: nil, ForbidFinishChallengeList: nil,
// CardList 卡牌列表 // CardList 卡牌列表
CardList: make([]*proto.GCGCard, 0, 0), CardList: make([]*proto.GCGCard, 0, 0),
Unk3300_BIANMOPDEHO: 1, // Unk // Unk3300_BIANMOPDEHO: 1, // Unk
CostRevise: &proto.GCGCostReviseInfo{ // 暂无数据 CostRevise: &proto.GCGCostReviseInfo{ // 暂无数据
CanUseHandCardIdList: nil, CanUseHandCardIdList: nil,
SelectOnStageCostList: nil, SelectOnStageCostList: nil,
@@ -100,10 +101,10 @@ func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message)
}, },
GameId: 0, // 官服是0 GameId: 0, // 官服是0
// FieldList 玩家牌盒信息 卡牌显示相关 // FieldList 玩家牌盒信息 卡牌显示相关
FieldList: make([]*proto.GCGPlayerField, 0, len(game.controllerMap)), FieldList: make([]*proto.GCGPlayerField, 0, len(game.controllerMap)),
Unk3300_CDCMBOKBLAK: make([]*proto.Unk3300_ADHENCIFKNI, 0, len(game.controllerMap)), // Unk3300_CDCMBOKBLAK: make([]*proto.Unk3300_ADHENCIFKNI, 0, len(game.controllerMap)),
BusinessType: 0, BusinessType: 0,
IntentionList: nil, // empty IntetionList: nil, // empty
// ChallengeList 可能是挑战目标 // ChallengeList 可能是挑战目标
ChallengeList: []*proto.GCGDuelChallenge{ ChallengeList: []*proto.GCGDuelChallenge{
// TODO 暂时写死 // TODO 暂时写死
@@ -148,14 +149,14 @@ func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message)
TotalProgress: 0, TotalProgress: 0,
}, },
}, },
HistoryCardList: make([]*proto.GCGCard, 0, len(gameController.historyCardList)), HistoryCardList: make([]*proto.GCGCard, 0, len(gameController.historyCardList)),
Round: game.roundInfo.roundNum, Round: game.roundInfo.roundNum,
ControllerId: gameController.controllerId, ControllerId: gameController.controllerId,
HistoryMsgPackList: gameController.historyMsgPackList, HistoryMsgPackList: gameController.historyMsgPackList,
Unk3300_JHDDNKFPINA: 0, // Unk3300_JHDDNKFPINA: 0,
// CardIdList 游戏内的所有卡牌Id // CardIdList 游戏内的所有卡牌Id
CardIdList: make([]uint32, 0, 0), CardIdList: make([]uint32, 0, 0),
Unk3300_JBBMBKGOONO: 0, // Unk // Unk3300_JBBMBKGOONO: 0, // Unk
// 阶段数据 // 阶段数据
Phase: &proto.GCGPhase{ Phase: &proto.GCGPhase{
PhaseType: game.roundInfo.phaseType, PhaseType: game.roundInfo.phaseType,
@@ -180,41 +181,41 @@ func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message)
for _, controller := range game.controllerMap { for _, controller := range game.controllerMap {
// FieldList 玩家牌盒信息 卡牌显示相关 // FieldList 玩家牌盒信息 卡牌显示相关
playerField := &proto.GCGPlayerField{ playerField := &proto.GCGPlayerField{
Unk3300_IKJMGAHCFPM: 0, CurWaitingIndex: 0,
// 卡牌图片 // 卡牌图片
ModifyZoneMap: make(map[uint32]*proto.GCGZone, len(controller.cardMap[CardInfoType_Char])), ModifyZoneMap: make(map[uint32]*proto.GCGZone, len(controller.cardMap[CardInfoType_Char])),
Unk3300_GGHKFFADEAL: 0, FieldShowId: 0,
Unk3300_AOPJIOHMPOF: &proto.GCGZone{ SummonZone: &proto.GCGZone{
CardList: []uint32{}, CardList: []uint32{},
}, },
Unk3300_FDFPHNDOJML: 0, CardBackShowId: 0,
// 卡牌技能? // 卡牌技能?
Unk3300_IPLMHKCNDLE: &proto.GCGZone{ OnStageZone: &proto.GCGZone{
CardList: []uint32{}, // 官服CardList: []uint32{5}, CardList: []uint32{}, // 官服CardList: []uint32{5},
}, },
Unk3300_EIHOMDLENMK: &proto.GCGZone{ AssistZone: &proto.GCGZone{
CardList: []uint32{}, CardList: []uint32{},
}, },
WaitingList: []*proto.GCGWaitingCharacter{}, WaitingList: []*proto.GCGWaitingCharacter{},
Unk3300_PBECINKKHND: 0, DiceCount: 0,
ControllerId: controller.controllerId, ControllerId: controller.controllerId,
// 卡牌位置 // 卡牌位置
Unk3300_INDJNJJJNKL: &proto.GCGZone{ CharacterZone: &proto.GCGZone{
CardList: make([]uint32, 0, len(controller.cardMap[CardInfoType_Char])), CardList: make([]uint32, 0, len(controller.cardMap[CardInfoType_Char])),
}, },
Unk3300_EFNAEFBECHD: &proto.GCGZone{ HandZone: &proto.GCGZone{
CardList: []uint32{}, CardList: []uint32{},
}, },
IsPassed: false, IsPassed: false,
IntentionList: []*proto.GCGPVEIntention{}, IntentionList: []*proto.GCGPVEIntention{},
DiceSideList: []proto.GCGDiceSideType{}, DiceSideList: []proto.GCGDiceSideType{},
// 牌堆卡牌数量 // 牌堆卡牌数量
DeckCardNum: uint32(len(controller.cardMap[CardInfoType_Deck])), DeckCardNum: uint32(len(controller.cardMap[CardInfoType_Deck])),
Unk3300_GLNIFLOKBPM: 0, OnStageCharacterGuid: 0,
} }
for _, info := range controller.cardMap[CardInfoType_Char] { for _, info := range controller.cardMap[CardInfoType_Char] {
playerField.ModifyZoneMap[info.guid] = &proto.GCGZone{CardList: []uint32{}} playerField.ModifyZoneMap[info.guid] = &proto.GCGZone{CardList: []uint32{}}
playerField.Unk3300_INDJNJJJNKL.CardList = append(playerField.Unk3300_INDJNJJJNKL.CardList, info.guid) playerField.CharacterZone.CardList = append(playerField.CharacterZone.CardList, info.guid)
} }
// 添加完所有卡牌的位置之类的信息后添加这个牌盒 // 添加完所有卡牌的位置之类的信息后添加这个牌盒
gcgAskDuelRsp.Duel.FieldList = append(gcgAskDuelRsp.Duel.FieldList, playerField) gcgAskDuelRsp.Duel.FieldList = append(gcgAskDuelRsp.Duel.FieldList, playerField)
@@ -243,14 +244,14 @@ func (g *GameManager) GCGAskDuelReq(player *model.Player, payloadMsg pb.Message)
} }
} }
} }
// Unk3300_CDCMBOKBLAK 你问我这是啥? 我也不知道 // // Unk3300_CDCMBOKBLAK 你问我这是啥? 我也不知道
for _, controller := range game.controllerMap { // for _, controller := range game.controllerMap {
gcgAskDuelRsp.Duel.Unk3300_CDCMBOKBLAK = append(gcgAskDuelRsp.Duel.Unk3300_CDCMBOKBLAK, &proto.Unk3300_ADHENCIFKNI{ // gcgAskDuelRsp.Duel.Unk3300_CDCMBOKBLAK = append(gcgAskDuelRsp.Duel.Unk3300_CDCMBOKBLAK, &proto.GCGMsgOpTimer{
BeginTime: 0, // BeginTime: 0,
TimeStamp: 0, // TimeStamp: 0,
ControllerId: controller.controllerId, // ControllerId: controller.controllerId,
}) // })
} // }
GAME_MANAGER.SendMsg(cmd.GCGAskDuelRsp, player.PlayerID, player.ClientSeq, gcgAskDuelRsp) GAME_MANAGER.SendMsg(cmd.GCGAskDuelRsp, player.PlayerID, player.ClientSeq, gcgAskDuelRsp)
} }
@@ -394,20 +395,20 @@ func (g *GameManager) PacketGCGSkillPreviewNotify(game *GCGGame, controller *GCG
} }
gcgSkillPreviewInfo := &proto.GCGSkillPreviewInfo{ gcgSkillPreviewInfo := &proto.GCGSkillPreviewInfo{
ChangeOnstageCharacterList: nil, ChangeOnstageCharacterList: nil,
Unk3300_DAJFJEDNLKK: nil, AddCardList: nil,
SkillId: skillInfo.skillId, SkillId: skillInfo.skillId,
// 技能造成的血量预览信息 // 技能造成的血量预览信息
HpInfoMap: make(map[uint32]*proto.GCGSkillPreviewHpInfo, 1), HpInfoMap: make(map[uint32]*proto.GCGSkillPreviewHpInfo, 1),
Unk3300_AGNONGELFGC: nil, RmCardList: nil,
ExtraInfo: nil, ExtraInfo: nil,
ReactionInfoMap: nil, ReactionInfoMap: nil,
// 技能对自身改变预览信息 // 技能对自身改变预览信息
CardTokenChangeMap: make(map[uint32]*proto.GCGSkillPreviewTokenChangeInfo, 1), CardTokenChangeMap: make(map[uint32]*proto.GCGSkillPreviewTokenChangeInfo, 1),
} }
// HpInfoMap // HpInfoMap
// key -> 显示对哪个角色卡造成伤害 // key -> 显示对哪个角色卡造成伤害
gcgSkillPreviewInfo.HpInfoMap[targetSelectedCharCard.guid] = &proto.GCGSkillPreviewHpInfo{ gcgSkillPreviewInfo.HpInfoMap[targetSelectedCharCard.guid] = &proto.GCGSkillPreviewHpInfo{
ChangeType: proto.GCGSkillHpChangeType_GCG_SKILL_HP_CHANGE_TYPE_DAMAGE, ChangeType: proto.GCGSkillHpChangeType_GCG_SKILL_HP_CHANGE_DAMAGE,
HpChangeValue: gcgSkillConfig.Damage, HpChangeValue: gcgSkillConfig.Damage,
} }
// CardTokenChangeMap // CardTokenChangeMap
@@ -416,10 +417,10 @@ func (g *GameManager) PacketGCGSkillPreviewNotify(game *GCGGame, controller *GCG
TokenChangeList: []*proto.GCGSkillPreviewTokenInfo{ TokenChangeList: []*proto.GCGSkillPreviewTokenInfo{
{ {
// Token类型 // Token类型
TokenType: constant.GCGTokenConst.TOKEN_CUR_ELEM, TokenType: constant.GCGTokenConst.TOKEN_CUR_ELEM,
Unk3300_MMIKPPJMHAD: 0, BeforeValue: 0,
// 更改为的值 // 更改为的值
Unk3300_IKICJMEFEON: selectedCharCard.tokenMap[constant.GCGTokenConst.TOKEN_CUR_ELEM] + 1, AfterValue: selectedCharCard.tokenMap[constant.GCGTokenConst.TOKEN_CUR_ELEM] + 1,
}, },
}, },
} }
@@ -469,8 +470,8 @@ func (g *GameManager) SendGCGMessagePackNotify(controller *GCGController, server
func (g *GameManager) PacketGCGGameBriefDataNotify(player *model.Player, businessType proto.GCGGameBusinessType, game *GCGGame) *proto.GCGGameBriefDataNotify { func (g *GameManager) PacketGCGGameBriefDataNotify(player *model.Player, businessType proto.GCGGameBusinessType, game *GCGGame) *proto.GCGGameBriefDataNotify {
gcgGameBriefDataNotify := &proto.GCGGameBriefDataNotify{ gcgGameBriefDataNotify := &proto.GCGGameBriefDataNotify{
GcgBriefData: &proto.GCGGameBriefData{ GcgBriefData: &proto.GCGGameBriefData{
BusinessType: businessType, BusinessType: businessType,
PlatformType: uint32(proto.PlatformType_PLATFORM_TYPE_PC), // TODO 根据玩家设备修改 // PlatformType: uint32(proto.PlatformType_PC), // TODO 根据玩家设备修改
GameId: game.gameId, GameId: game.gameId,
PlayerBriefList: make([]*proto.GCGPlayerBriefData, 0, len(game.controllerMap)), PlayerBriefList: make([]*proto.GCGPlayerBriefData, 0, len(game.controllerMap)),
}, },
@@ -501,8 +502,8 @@ func (g *GameManager) PacketGCGGameBriefDataNotify(player *model.Player, busines
// PacketGCGTavernNpcInfoNotify GCG酒馆NPC信息通知 // PacketGCGTavernNpcInfoNotify GCG酒馆NPC信息通知
func (g *GameManager) PacketGCGTavernNpcInfoNotify(player *model.Player) *proto.GCGTavernNpcInfoNotify { func (g *GameManager) PacketGCGTavernNpcInfoNotify(player *model.Player) *proto.GCGTavernNpcInfoNotify {
gcgTavernNpcInfoNotify := &proto.GCGTavernNpcInfoNotify{ gcgTavernNpcInfoNotify := &proto.GCGTavernNpcInfoNotify{
Unk3300_FKAKHMMIEBC: make([]*proto.GCGTavernNpcInfo, 0, 0), WeekNpcList: make([]*proto.GCGTavernNpcInfo, 0, 0),
Unk3300_BAMLNENDLCM: make([]*proto.GCGTavernNpcInfo, 0, 0), ConstNpcList: make([]*proto.GCGTavernNpcInfo, 0, 0),
CharacterNpc: &proto.GCGTavernNpcInfo{ CharacterNpc: &proto.GCGTavernNpcInfo{
Id: 0, Id: 0,
ScenePointId: 0, ScenePointId: 0,
@@ -515,13 +516,13 @@ func (g *GameManager) PacketGCGTavernNpcInfoNotify(player *model.Player) *proto.
// PacketGCGTCTavernInfoNotify GCG酒馆信息通知 // PacketGCGTCTavernInfoNotify GCG酒馆信息通知
func (g *GameManager) PacketGCGTCTavernInfoNotify(player *model.Player) *proto.GCGTCTavernInfoNotify { func (g *GameManager) PacketGCGTCTavernInfoNotify(player *model.Player) *proto.GCGTCTavernInfoNotify {
gcgTCTavernInfoNotify := &proto.GCGTCTavernInfoNotify{ gcgTCTavernInfoNotify := &proto.GCGTCTavernInfoNotify{
LevelId: 0, LevelId: 0,
Unk3300_IMFJBNFMCHM: false, IsLastDuelWin: false,
Unk3300_MBGMHBNBKBK: false, IsOwnerInDuel: false,
PointId: 0, PointId: 0,
ElementType: 8, ElementType: 8,
AvatarId: 10000007, AvatarId: 10000007,
CharacterId: 0, CharacterId: 0,
} }
return gcgTCTavernInfoNotify return gcgTCTavernInfoNotify
} }

View File

@@ -59,7 +59,7 @@ func (g *GameManager) AddUserItem(userId uint32, itemList []*UserItem, isHint bo
} }
storeItemChangeNotify := &proto.StoreItemChangeNotify{ storeItemChangeNotify := &proto.StoreItemChangeNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
ItemList: make([]*proto.Item, 0), ItemList: make([]*proto.Item, 0),
} }
for _, userItem := range itemList { for _, userItem := range itemList {
@@ -126,7 +126,7 @@ func (g *GameManager) CostUserItem(userId uint32, itemList []*UserItem) {
} }
storeItemChangeNotify := &proto.StoreItemChangeNotify{ storeItemChangeNotify := &proto.StoreItemChangeNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
ItemList: make([]*proto.Item, 0), ItemList: make([]*proto.Item, 0),
} }
for _, userItem := range itemList { for _, userItem := range itemList {
@@ -150,7 +150,7 @@ func (g *GameManager) CostUserItem(userId uint32, itemList []*UserItem) {
} }
storeItemDelNotify := &proto.StoreItemDelNotify{ storeItemDelNotify := &proto.StoreItemDelNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
GuidList: make([]uint64, 0), GuidList: make([]uint64, 0),
} }
for _, userItem := range itemList { for _, userItem := range itemList {

View File

@@ -177,7 +177,7 @@ func (g *GameManager) PacketPlayerDataNotify(player *model.Player) *proto.Player
func (g *GameManager) PacketStoreWeightLimitNotify() *proto.StoreWeightLimitNotify { func (g *GameManager) PacketStoreWeightLimitNotify() *proto.StoreWeightLimitNotify {
storeWeightLimitNotify := &proto.StoreWeightLimitNotify{ storeWeightLimitNotify := &proto.StoreWeightLimitNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
// 背包容量限制 // 背包容量限制
WeightLimit: 30000, WeightLimit: 30000,
WeaponCountLimit: 2000, WeaponCountLimit: 2000,
@@ -190,7 +190,7 @@ func (g *GameManager) PacketStoreWeightLimitNotify() *proto.StoreWeightLimitNoti
func (g *GameManager) PacketPlayerStoreNotify(player *model.Player) *proto.PlayerStoreNotify { func (g *GameManager) PacketPlayerStoreNotify(player *model.Player) *proto.PlayerStoreNotify {
playerStoreNotify := &proto.PlayerStoreNotify{ playerStoreNotify := &proto.PlayerStoreNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
WeightLimit: 30000, WeightLimit: 30000,
} }
itemDataMapConfig := gdconf.CONF.ItemDataMap itemDataMapConfig := gdconf.CONF.ItemDataMap

View File

@@ -51,9 +51,9 @@ func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
logger.Debug("user mark map, uid: %v", player.PlayerID) logger.Debug("user mark map, uid: %v", player.PlayerID)
req := payloadMsg.(*proto.MarkMapReq) req := payloadMsg.(*proto.MarkMapReq)
operation := req.Op operation := req.Op
if operation == proto.MarkMapReq_OPERATION_ADD { if operation == proto.MarkMapReq_ADD {
logger.Debug("user mark type: %v", req.Mark.PointType) logger.Debug("user mark type: %v", req.Mark.PointType)
if req.Mark.PointType == proto.MapMarkPointType_MAP_MARK_POINT_TYPE_NPC { if req.Mark.PointType == proto.MapMarkPointType_MONSTER {
posYInt, err := strconv.ParseInt(req.Mark.Name, 10, 64) posYInt, err := strconv.ParseInt(req.Mark.Name, 10, 64)
if err != nil { if err != nil {
logger.Error("parse pos y error: %v", err) logger.Error("parse pos y error: %v", err)
@@ -87,7 +87,7 @@ func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, s
world := WORLD_MANAGER.GetWorldByID(player.WorldId) world := WORLD_MANAGER.GetWorldByID(player.WorldId)
oldScene := world.GetSceneById(oldSceneId) oldScene := world.GetSceneById(oldSceneId)
activeAvatarId := world.GetPlayerActiveAvatarId(player) activeAvatarId := world.GetPlayerActiveAvatarId(player)
g.RemoveSceneEntityNotifyBroadcast(oldScene, proto.VisionType_VISION_TYPE_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}) g.RemoveSceneEntityNotifyBroadcast(oldScene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)})
if jumpScene { if jumpScene {
delTeamEntityNotify := g.PacketDelTeamEntityNotify(oldScene, player) delTeamEntityNotify := g.PacketDelTeamEntityNotify(oldScene, player)
g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify) g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify)
@@ -109,14 +109,14 @@ func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, s
switch enterReason { switch enterReason {
case constant.EnterReasonConst.DungeonEnter: case constant.EnterReasonConst.DungeonEnter:
logger.Debug("player dungeon scene, scene: %v, pos: %v", player.SceneId, player.Pos) logger.Debug("player dungeon scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_DUNGEON enterType = proto.EnterType_ENTER_DUNGEON
default: default:
if jumpScene { if jumpScene {
logger.Debug("player jump scene, scene: %v, pos: %v", player.SceneId, player.Pos) logger.Debug("player jump scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_JUMP enterType = proto.EnterType_ENTER_JUMP
} else { } else {
logger.Debug("player goto scene, scene: %v, pos: %v", player.SceneId, player.Pos) logger.Debug("player goto scene, scene: %v, pos: %v", player.SceneId, player.Pos)
enterType = proto.EnterType_ENTER_TYPE_GOTO enterType = proto.EnterType_ENTER_GOTO
} }
} }
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, uint32(enterReason), oldSceneId, oldPos, dungeonId) playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, uint32(enterReason), oldSceneId, oldPos, dungeonId)

View File

@@ -90,7 +90,7 @@ func (g *GameManager) JoinOtherWorld(player *model.Player, hostPlayer *model.Pla
player.Rot.Z = hostPlayer.Rot.Z player.Rot.Z = hostPlayer.Rot.Z
g.UserWorldAddPlayer(hostWorld, player) g.UserWorldAddPlayer(hostWorld, player)
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyLogin(player, proto.EnterType_ENTER_TYPE_OTHER) playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyLogin(player, proto.EnterType_ENTER_OTHER)
g.SendMsg(cmd.PlayerEnterSceneNotify, player.PlayerID, player.ClientSeq, playerEnterSceneNotify) g.SendMsg(cmd.PlayerEnterSceneNotify, player.PlayerID, player.ClientSeq, playerEnterSceneNotify)
} else { } else {
hostWorld.waitEnterPlayerMap[player.PlayerID] = time.Now().UnixMilli() hostWorld.waitEnterPlayerMap[player.PlayerID] = time.Now().UnixMilli()
@@ -180,7 +180,7 @@ func (g *GameManager) UserApplyEnterWorld(player *model.Player, targetUid uint32
TargetUid: targetUid, TargetUid: targetUid,
TargetNickname: "", TargetNickname: "",
IsAgreed: false, IsAgreed: false,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_CANNOT_ENTER_MP, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_CANNOT_ENTER_MP,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, player.PlayerID, player.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, player.PlayerID, player.ClientSeq, playerApplyEnterMpResultNotify)
} }
@@ -286,7 +286,7 @@ func (g *GameManager) UserDealEnterWorld(hostPlayer *model.Player, otherUid uint
TargetUid: hostPlayer.PlayerID, TargetUid: hostPlayer.PlayerID,
TargetNickname: hostPlayer.NickName, TargetNickname: hostPlayer.NickName,
IsAgreed: false, IsAgreed: false,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_CANNOT_ENTER_MP, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_CANNOT_ENTER_MP,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, otherPlayer.PlayerID, otherPlayer.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, otherPlayer.PlayerID, otherPlayer.ClientSeq, playerApplyEnterMpResultNotify)
return return
@@ -296,7 +296,7 @@ func (g *GameManager) UserDealEnterWorld(hostPlayer *model.Player, otherUid uint
TargetUid: hostPlayer.PlayerID, TargetUid: hostPlayer.PlayerID,
TargetNickname: hostPlayer.NickName, TargetNickname: hostPlayer.NickName,
IsAgreed: agree, IsAgreed: agree,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_JUDGE, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_JUDGE,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, otherPlayer.PlayerID, otherPlayer.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, otherPlayer.PlayerID, otherPlayer.ClientSeq, playerApplyEnterMpResultNotify)
} }
@@ -325,7 +325,7 @@ func (g *GameManager) HostEnterMpWorld(hostPlayer *model.Player, otherUid uint32
hostPlayerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyMp( hostPlayerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyMp(
hostPlayer, hostPlayer,
hostPlayer, hostPlayer,
proto.EnterType_ENTER_TYPE_GOTO, proto.EnterType_ENTER_GOTO,
uint32(constant.EnterReasonConst.HostFromSingleToMp), uint32(constant.EnterReasonConst.HostFromSingleToMp),
hostPlayer.SceneId, hostPlayer.SceneId,
hostPlayer.Pos, hostPlayer.Pos,
@@ -341,7 +341,7 @@ func (g *GameManager) HostEnterMpWorld(hostPlayer *model.Player, otherUid uint32
// 仅仅把当前的场上角色的实体消失掉 // 仅仅把当前的场上角色的实体消失掉
activeAvatarId := world.GetPlayerActiveAvatarId(hostPlayer) activeAvatarId := world.GetPlayerActiveAvatarId(hostPlayer)
g.RemoveSceneEntityNotifyToPlayer(hostPlayer, proto.VisionType_VISION_TYPE_MISS, []uint32{world.GetPlayerWorldAvatarEntityId(hostPlayer, activeAvatarId)}) g.RemoveSceneEntityNotifyToPlayer(hostPlayer, proto.VisionType_VISION_MISS, []uint32{world.GetPlayerWorldAvatarEntityId(hostPlayer, activeAvatarId)})
} }
func (g *GameManager) UserLeaveWorld(player *model.Player) bool { func (g *GameManager) UserLeaveWorld(player *model.Player) bool {
@@ -389,19 +389,19 @@ func (g *GameManager) UserWorldRemovePlayer(world *World, player *model.Player)
// 仅仅把当前的场上角色的实体消失掉 // 仅仅把当前的场上角色的实体消失掉
activeAvatarId := world.GetPlayerActiveAvatarId(player) activeAvatarId := world.GetPlayerActiveAvatarId(player)
g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_TYPE_MISS, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}) g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)})
delTeamEntityNotify := g.PacketDelTeamEntityNotify(scene, player) delTeamEntityNotify := g.PacketDelTeamEntityNotify(scene, player)
g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify) g.SendMsg(cmd.DelTeamEntityNotify, player.PlayerID, player.ClientSeq, delTeamEntityNotify)
if world.multiplayer { if world.multiplayer {
playerQuitFromMpNotify := &proto.PlayerQuitFromMpNotify{ playerQuitFromMpNotify := &proto.PlayerQuitFromMpNotify{
Reason: proto.PlayerQuitFromMpNotify_QUIT_REASON_BACK_TO_MY_WORLD, Reason: proto.PlayerQuitFromMpNotify_BACK_TO_MY_WORLD,
} }
g.SendMsg(cmd.PlayerQuitFromMpNotify, player.PlayerID, player.ClientSeq, playerQuitFromMpNotify) g.SendMsg(cmd.PlayerQuitFromMpNotify, player.PlayerID, player.ClientSeq, playerQuitFromMpNotify)
activeAvatarId := world.GetPlayerActiveAvatarId(player) activeAvatarId := world.GetPlayerActiveAvatarId(player)
g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_TYPE_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)}) g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, []uint32{world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)})
} }
world.RemovePlayer(player) world.RemovePlayer(player)
@@ -430,7 +430,7 @@ func (g *GameManager) UpdateWorldPlayerInfo(hostWorld *World, excludePlayer *mod
} }
playerPreEnterMpNotify := &proto.PlayerPreEnterMpNotify{ playerPreEnterMpNotify := &proto.PlayerPreEnterMpNotify{
State: proto.PlayerPreEnterMpNotify_STATE_START, State: proto.PlayerPreEnterMpNotify_START,
Uid: excludePlayer.PlayerID, Uid: excludePlayer.PlayerID,
Nickname: excludePlayer.NickName, Nickname: excludePlayer.NickName,
} }
@@ -588,7 +588,7 @@ func (g *GameManager) ServerUserMpReq(userMpInfo *mq.UserMpInfo, gsAppId string)
TargetUid: userMpInfo.HostUserId, TargetUid: userMpInfo.HostUserId,
TargetNickname: userMpInfo.HostNickname, TargetNickname: userMpInfo.HostNickname,
IsAgreed: false, IsAgreed: false,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_CANNOT_ENTER_MP, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_CANNOT_ENTER_MP,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, applyPlayer.PlayerID, applyPlayer.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, applyPlayer.PlayerID, applyPlayer.ClientSeq, playerApplyEnterMpResultNotify)
return return
@@ -598,7 +598,7 @@ func (g *GameManager) ServerUserMpReq(userMpInfo *mq.UserMpInfo, gsAppId string)
TargetUid: userMpInfo.HostUserId, TargetUid: userMpInfo.HostUserId,
TargetNickname: userMpInfo.HostNickname, TargetNickname: userMpInfo.HostNickname,
IsAgreed: userMpInfo.Agreed, IsAgreed: userMpInfo.Agreed,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_JUDGE, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_JUDGE,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, applyPlayer.PlayerID, applyPlayer.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, applyPlayer.PlayerID, applyPlayer.ClientSeq, playerApplyEnterMpResultNotify)
} }
@@ -617,7 +617,7 @@ func (g *GameManager) ServerUserMpRsp(userMpInfo *mq.UserMpInfo) {
TargetUid: userMpInfo.HostUserId, TargetUid: userMpInfo.HostUserId,
TargetNickname: "", TargetNickname: "",
IsAgreed: false, IsAgreed: false,
Reason: proto.PlayerApplyEnterMpResultNotify_REASON_PLAYER_CANNOT_ENTER_MP, Reason: proto.PlayerApplyEnterMpResultNotify_PLAYER_CANNOT_ENTER_MP,
} }
g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, player.PlayerID, player.ClientSeq, playerApplyEnterMpResultNotify) g.SendMsg(cmd.PlayerApplyEnterMpResultNotify, player.PlayerID, player.ClientSeq, playerApplyEnterMpResultNotify)
} }

View File

@@ -245,13 +245,13 @@ func (g *GameManager) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Mess
g.SendMsg(cmd.GuestPostEnterSceneNotify, world.owner.PlayerID, world.owner.ClientSeq, guestPostEnterSceneNotify) g.SendMsg(cmd.GuestPostEnterSceneNotify, world.owner.PlayerID, world.owner.ClientSeq, guestPostEnterSceneNotify)
} }
var visionType = proto.VisionType_VISION_TYPE_NONE var visionType = proto.VisionType_VISION_NONE
activeAvatarId := world.GetPlayerActiveAvatarId(player) activeAvatarId := world.GetPlayerActiveAvatarId(player)
if player.SceneJump { if player.SceneJump {
visionType = proto.VisionType_VISION_TYPE_BORN visionType = proto.VisionType_VISION_BORN
} else { } else {
visionType = proto.VisionType_VISION_TYPE_TRANSPORT visionType = proto.VisionType_VISION_TRANSPORT
} }
activeAvatarEntityId := world.GetPlayerWorldAvatarEntityId(player, activeAvatarId) activeAvatarEntityId := world.GetPlayerWorldAvatarEntityId(player, activeAvatarId)
g.AddSceneEntityNotify(player, visionType, []uint32{activeAvatarEntityId}, true, false) g.AddSceneEntityNotify(player, visionType, []uint32{activeAvatarEntityId}, true, false)
@@ -264,9 +264,9 @@ func (g *GameManager) EnterSceneDoneReq(player *model.Player, payloadMsg pb.Mess
} }
} }
if player.SceneJump { if player.SceneJump {
visionType = proto.VisionType_VISION_TYPE_MEET visionType = proto.VisionType_VISION_MEET
} else { } else {
visionType = proto.VisionType_VISION_TYPE_TRANSPORT visionType = proto.VisionType_VISION_TRANSPORT
} }
entityMap := scene.GetAllEntity() entityMap := scene.GetAllEntity()
entityIdList := make([]uint32, 0) entityIdList := make([]uint32, 0)
@@ -552,8 +552,8 @@ func (g *GameManager) AddSceneEntityNotify(player *model.Player, visionType prot
continue continue
} }
switch entity.entityType { switch entity.entityType {
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_AVATAR): case uint32(proto.ProtEntityType_PROT_ENTITY_AVATAR):
if visionType == proto.VisionType_VISION_TYPE_MEET && entity.avatarEntity.uid == player.PlayerID { if visionType == proto.VisionType_VISION_MEET && entity.avatarEntity.uid == player.PlayerID {
continue continue
} }
scenePlayer := USER_MANAGER.GetOnlineUser(entity.avatarEntity.uid) scenePlayer := USER_MANAGER.GetOnlineUser(entity.avatarEntity.uid)
@@ -566,14 +566,14 @@ func (g *GameManager) AddSceneEntityNotify(player *model.Player, visionType prot
} }
sceneEntityInfoAvatar := g.PacketSceneEntityInfoAvatar(scene, scenePlayer, world.GetPlayerActiveAvatarId(scenePlayer)) sceneEntityInfoAvatar := g.PacketSceneEntityInfoAvatar(scene, scenePlayer, world.GetPlayerActiveAvatarId(scenePlayer))
entityList = append(entityList, sceneEntityInfoAvatar) entityList = append(entityList, sceneEntityInfoAvatar)
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_WEAPON): case uint32(proto.ProtEntityType_PROT_ENTITY_WEAPON):
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_MONSTER): case uint32(proto.ProtEntityType_PROT_ENTITY_MONSTER):
sceneEntityInfoMonster := g.PacketSceneEntityInfoMonster(scene, entity.id) sceneEntityInfoMonster := g.PacketSceneEntityInfoMonster(scene, entity.id)
entityList = append(entityList, sceneEntityInfoMonster) entityList = append(entityList, sceneEntityInfoMonster)
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_NPC): case uint32(proto.ProtEntityType_PROT_ENTITY_NPC):
sceneEntityInfoNpc := g.PacketSceneEntityInfoNpc(scene, entity.id) sceneEntityInfoNpc := g.PacketSceneEntityInfoNpc(scene, entity.id)
entityList = append(entityList, sceneEntityInfoNpc) entityList = append(entityList, sceneEntityInfoNpc)
case uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET): case uint32(proto.ProtEntityType_PROT_ENTITY_GADGET):
sceneEntityInfoGadget := g.PacketSceneEntityInfoGadget(scene, entity.id) sceneEntityInfoGadget := g.PacketSceneEntityInfoGadget(scene, entity.id)
entityList = append(entityList, sceneEntityInfoGadget) entityList = append(entityList, sceneEntityInfoGadget)
} }
@@ -655,7 +655,7 @@ func (g *GameManager) PacketSceneEntityInfoAvatar(scene *Scene, player *model.Pl
} }
worldAvatar := scene.world.GetWorldAvatarByEntityId(entity.id) worldAvatar := scene.world.GetWorldAvatarByEntityId(entity.id)
sceneEntityInfo := &proto.SceneEntityInfo{ sceneEntityInfo := &proto.SceneEntityInfo{
EntityType: proto.ProtEntityType_PROT_ENTITY_TYPE_AVATAR, EntityType: proto.ProtEntityType_PROT_ENTITY_AVATAR,
EntityId: entity.id, EntityId: entity.id,
MotionInfo: &proto.MotionInfo{ MotionInfo: &proto.MotionInfo{
Pos: pos, Pos: pos,
@@ -712,7 +712,7 @@ func (g *GameManager) PacketSceneEntityInfoMonster(scene *Scene, entityId uint32
Z: float32(entity.pos.Z), Z: float32(entity.pos.Z),
} }
sceneEntityInfo := &proto.SceneEntityInfo{ sceneEntityInfo := &proto.SceneEntityInfo{
EntityType: proto.ProtEntityType_PROT_ENTITY_TYPE_MONSTER, EntityType: proto.ProtEntityType_PROT_ENTITY_MONSTER,
EntityId: entity.id, EntityId: entity.id,
MotionInfo: &proto.MotionInfo{ MotionInfo: &proto.MotionInfo{
Pos: pos, Pos: pos,
@@ -760,7 +760,7 @@ func (g *GameManager) PacketSceneEntityInfoNpc(scene *Scene, entityId uint32) *p
Z: float32(entity.pos.Z), Z: float32(entity.pos.Z),
} }
sceneEntityInfo := &proto.SceneEntityInfo{ sceneEntityInfo := &proto.SceneEntityInfo{
EntityType: proto.ProtEntityType_PROT_ENTITY_TYPE_NPC, EntityType: proto.ProtEntityType_PROT_ENTITY_NPC,
EntityId: entity.id, EntityId: entity.id,
MotionInfo: &proto.MotionInfo{ MotionInfo: &proto.MotionInfo{
Pos: pos, Pos: pos,
@@ -808,7 +808,7 @@ func (g *GameManager) PacketSceneEntityInfoGadget(scene *Scene, entityId uint32)
Z: float32(entity.pos.Z), Z: float32(entity.pos.Z),
} }
sceneEntityInfo := &proto.SceneEntityInfo{ sceneEntityInfo := &proto.SceneEntityInfo{
EntityType: proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET, EntityType: proto.ProtEntityType_PROT_ENTITY_GADGET,
EntityId: entity.id, EntityId: entity.id,
MotionInfo: &proto.MotionInfo{ MotionInfo: &proto.MotionInfo{
Pos: pos, Pos: pos,
@@ -900,7 +900,7 @@ func (g *GameManager) PacketSceneMonsterInfo(entity *Entity) *proto.SceneMonster
sceneMonsterInfo := &proto.SceneMonsterInfo{ sceneMonsterInfo := &proto.SceneMonsterInfo{
MonsterId: entity.monsterEntity.monsterId, MonsterId: entity.monsterEntity.monsterId,
AuthorityPeerId: 1, AuthorityPeerId: 1,
BornType: proto.MonsterBornType_MONSTER_BORN_TYPE_DEFAULT, BornType: proto.MonsterBornType_MONSTER_BORN_DEFAULT,
// BlockId: 3001, // BlockId: 3001,
// TitleId: 3001, // TitleId: 3001,
// SpecialNameId: 40, // SpecialNameId: 40,

View File

@@ -167,9 +167,9 @@ func (g *GameManager) GetPlayerFriendListReq(player *model.Player, payloadMsg pb
} }
var onlineState proto.FriendOnlineState = 0 var onlineState proto.FriendOnlineState = 0
if online { if online {
onlineState = proto.FriendOnlineState_FRIEND_ONLINE_STATE_ONLINE onlineState = proto.FriendOnlineState_FRIEND_ONLINE
} else { } else {
onlineState = proto.FriendOnlineState_FRIEND_ONLINE_STATE_DISCONNECT onlineState = proto.FriendOnlineState_FREIEND_DISCONNECT
} }
friendBrief := &proto.FriendBrief{ friendBrief := &proto.FriendBrief{
Uid: friendPlayer.PlayerID, Uid: friendPlayer.PlayerID,
@@ -184,7 +184,7 @@ func (g *GameManager) GetPlayerFriendListReq(player *model.Player, payloadMsg pb
NameCardId: friendPlayer.NameCard, NameCardId: friendPlayer.NameCard,
Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24, Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24,
IsGameSource: true, IsGameSource: true,
PlatformType: proto.PlatformType_PLATFORM_TYPE_PC, PlatformType: proto.PlatformType_PC,
} }
getPlayerFriendListRsp.FriendList = append(getPlayerFriendListRsp.FriendList, friendBrief) getPlayerFriendListRsp.FriendList = append(getPlayerFriendListRsp.FriendList, friendBrief)
} }
@@ -205,9 +205,9 @@ func (g *GameManager) GetPlayerAskFriendListReq(player *model.Player, payloadMsg
} }
var onlineState proto.FriendOnlineState var onlineState proto.FriendOnlineState
if online { if online {
onlineState = proto.FriendOnlineState_FRIEND_ONLINE_STATE_ONLINE onlineState = proto.FriendOnlineState_FRIEND_ONLINE
} else { } else {
onlineState = proto.FriendOnlineState_FRIEND_ONLINE_STATE_DISCONNECT onlineState = proto.FriendOnlineState_FREIEND_DISCONNECT
} }
friendBrief := &proto.FriendBrief{ friendBrief := &proto.FriendBrief{
Uid: friendPlayer.PlayerID, Uid: friendPlayer.PlayerID,
@@ -222,7 +222,7 @@ func (g *GameManager) GetPlayerAskFriendListReq(player *model.Player, payloadMsg
NameCardId: friendPlayer.NameCard, NameCardId: friendPlayer.NameCard,
Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24, Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24,
IsGameSource: true, IsGameSource: true,
PlatformType: proto.PlatformType_PLATFORM_TYPE_PC, PlatformType: proto.PlatformType_PC,
} }
getPlayerAskFriendListRsp.AskFriendList = append(getPlayerAskFriendListRsp.AskFriendList, friendBrief) getPlayerAskFriendListRsp.AskFriendList = append(getPlayerAskFriendListRsp.AskFriendList, friendBrief)
} }
@@ -305,13 +305,13 @@ func (g *GameManager) AskAddFriendReq(player *model.Player, payloadMsg pb.Messag
ProfilePicture: &proto.ProfilePicture{AvatarId: player.HeadImage}, ProfilePicture: &proto.ProfilePicture{AvatarId: player.HeadImage},
WorldLevel: player.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_WORLD_LEVEL], WorldLevel: player.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_WORLD_LEVEL],
Signature: player.Signature, Signature: player.Signature,
OnlineState: proto.FriendOnlineState_FRIEND_ONLINE_STATE_ONLINE, OnlineState: proto.FriendOnlineState_FRIEND_ONLINE,
IsMpModeAvailable: true, IsMpModeAvailable: true,
LastActiveTime: player.OfflineTime, LastActiveTime: player.OfflineTime,
NameCardId: player.NameCard, NameCardId: player.NameCard,
Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24, Param: (uint32(time.Now().Unix()) - player.OfflineTime) / 3600 / 24,
IsGameSource: true, IsGameSource: true,
PlatformType: proto.PlatformType_PLATFORM_TYPE_PC, PlatformType: proto.PlatformType_PC,
} }
g.SendMsg(cmd.AskAddFriendNotify, targetPlayer.PlayerID, targetPlayer.ClientSeq, askAddFriendNotify) g.SendMsg(cmd.AskAddFriendNotify, targetPlayer.PlayerID, targetPlayer.ClientSeq, askAddFriendNotify)
} }
@@ -323,7 +323,7 @@ func (g *GameManager) DealAddFriendReq(player *model.Player, payloadMsg pb.Messa
result := req.DealAddFriendResult result := req.DealAddFriendResult
agree := false agree := false
if result == proto.DealAddFriendResultType_DEAL_ADD_FRIEND_RESULT_TYPE_ACCEPT { if result == proto.DealAddFriendResultType_DEAL_ADD_FRIEND_ACCEPT {
agree = true agree = true
} }
if agree { if agree {
@@ -387,7 +387,7 @@ func (g *GameManager) GetOnlinePlayerListReq(player *model.Player, payloadMsg pb
Uid: BigWorldAiUid, Uid: BigWorldAiUid,
Nickname: BigWorldAiName, Nickname: BigWorldAiName,
PlayerLevel: 1, PlayerLevel: 1,
MpSettingType: proto.MpSettingType_MP_SETTING_TYPE_ENTER_AFTER_APPLY, MpSettingType: proto.MpSettingType_MP_SETTING_ENTER_AFTER_APPLY,
NameCardId: 210001, NameCardId: 210001,
Signature: BigWorldAiSign, Signature: BigWorldAiSign,
ProfilePicture: &proto.ProfilePicture{AvatarId: 10000007}, ProfilePicture: &proto.ProfilePicture{AvatarId: 10000007},
@@ -499,13 +499,13 @@ func (g *GameManager) ServerAddFriendNotify(addFriendInfo *mq.AddFriendInfo) {
ProfilePicture: &proto.ProfilePicture{AvatarId: addFriendInfo.ApplyPlayerOnlineInfo.HeadImageId}, ProfilePicture: &proto.ProfilePicture{AvatarId: addFriendInfo.ApplyPlayerOnlineInfo.HeadImageId},
WorldLevel: addFriendInfo.ApplyPlayerOnlineInfo.WorldLevel, WorldLevel: addFriendInfo.ApplyPlayerOnlineInfo.WorldLevel,
Signature: addFriendInfo.ApplyPlayerOnlineInfo.Signature, Signature: addFriendInfo.ApplyPlayerOnlineInfo.Signature,
OnlineState: proto.FriendOnlineState_FRIEND_ONLINE_STATE_ONLINE, OnlineState: proto.FriendOnlineState_FRIEND_ONLINE,
IsMpModeAvailable: true, IsMpModeAvailable: true,
LastActiveTime: 0, LastActiveTime: 0,
NameCardId: addFriendInfo.ApplyPlayerOnlineInfo.NameCardId, NameCardId: addFriendInfo.ApplyPlayerOnlineInfo.NameCardId,
Param: 0, Param: 0,
IsGameSource: true, IsGameSource: true,
PlatformType: proto.PlatformType_PLATFORM_TYPE_PC, PlatformType: proto.PlatformType_PC,
} }
g.SendMsg(cmd.AskAddFriendNotify, targetPlayer.PlayerID, targetPlayer.ClientSeq, askAddFriendNotify) g.SendMsg(cmd.AskAddFriendNotify, targetPlayer.PlayerID, targetPlayer.ClientSeq, askAddFriendNotify)
case "DealAddFriendReq": case "DealAddFriendReq":

View File

@@ -20,7 +20,7 @@ import (
// HandleAbilityStamina 处理来自ability的耐力消耗 // HandleAbilityStamina 处理来自ability的耐力消耗
func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.AbilityInvokeEntry) { func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.AbilityInvokeEntry) {
switch entry.ArgumentType { switch entry.ArgumentType {
case proto.AbilityInvokeArgument_ABILITY_INVOKE_ARGUMENT_MIXIN_COST_STAMINA: case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA:
// 大剑重击 或 持续技能 耐力消耗 // 大剑重击 或 持续技能 耐力消耗
costStamina := new(proto.AbilityMixinCostStamina) costStamina := new(proto.AbilityMixinCostStamina)
if appConfig.CONF.Hk4e.ClientProtoProxyEnable { if appConfig.CONF.Hk4e.ClientProtoProxyEnable {
@@ -42,7 +42,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab
} }
// 处理持续耐力消耗 // 处理持续耐力消耗
g.SkillSustainStamina(player, costStamina.IsSwim) g.SkillSustainStamina(player, costStamina.IsSwim)
case proto.AbilityInvokeArgument_ABILITY_INVOKE_ARGUMENT_META_MODIFIER_CHANGE: case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE:
// 普通角色重击耐力消耗 // 普通角色重击耐力消耗
world := WORLD_MANAGER.GetWorldByID(player.WorldId) world := WORLD_MANAGER.GetWorldByID(player.WorldId)
// 获取世界中的角色实体 // 获取世界中的角色实体
@@ -91,7 +91,7 @@ func (g *GameManager) SceneAvatarStaminaStepReq(player *model.Player, payloadMsg
// 根据动作状态消耗耐力 // 根据动作状态消耗耐力
switch player.StaminaInfo.State { switch player.StaminaInfo.State {
case proto.MotionState_MOTION_STATE_CLIMB: case proto.MotionState_MOTION_CLIMB:
// 缓慢攀爬 // 缓慢攀爬
var angleRevise int32 // 角度修正值 归一化为-90到+90范围内的角 var angleRevise int32 // 角度修正值 归一化为-90到+90范围内的角
// rotX ∈ [0,90) angle = rotX // rotX ∈ [0,90) angle = rotX
@@ -118,7 +118,7 @@ func (g *GameManager) SceneAvatarStaminaStepReq(player *model.Player, payloadMsg
} }
logger.Debug("stamina climbing, rotX: %v, costRevise: %v, cost: %v", req.Rot.X, costRevise, constant.StaminaCostConst.CLIMBING_BASE-costRevise) logger.Debug("stamina climbing, rotX: %v, costRevise: %v, cost: %v", req.Rot.X, costRevise, constant.StaminaCostConst.CLIMBING_BASE-costRevise)
g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMBING_BASE-costRevise) g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMBING_BASE-costRevise)
case proto.MotionState_MOTION_STATE_SWIM_MOVE: case proto.MotionState_MOTION_SWIM_MOVE:
// 缓慢游泳 // 缓慢游泳
g.UpdatePlayerStamina(player, constant.StaminaCostConst.SWIMMING) g.UpdatePlayerStamina(player, constant.StaminaCostConst.SWIMMING)
} }
@@ -152,16 +152,16 @@ func (g *GameManager) ImmediateStamina(player *model.Player, motionState proto.M
// 根据玩家的状态立刻消耗耐力 // 根据玩家的状态立刻消耗耐力
switch motionState { switch motionState {
case proto.MotionState_MOTION_STATE_CLIMB: case proto.MotionState_MOTION_CLIMB:
// 攀爬开始 // 攀爬开始
g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMB_START) g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMB_START)
case proto.MotionState_MOTION_STATE_DASH_BEFORE_SHAKE: case proto.MotionState_MOTION_DASH_BEFORE_SHAKE:
// 冲刺 // 冲刺
g.UpdatePlayerStamina(player, constant.StaminaCostConst.SPRINT) g.UpdatePlayerStamina(player, constant.StaminaCostConst.SPRINT)
case proto.MotionState_MOTION_STATE_CLIMB_JUMP: case proto.MotionState_MOTION_CLIMB_JUMP:
// 攀爬跳跃 // 攀爬跳跃
g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMB_JUMP) g.UpdatePlayerStamina(player, constant.StaminaCostConst.CLIMB_JUMP)
case proto.MotionState_MOTION_STATE_SWIM_DASH: case proto.MotionState_MOTION_SWIM_DASH:
// 快速游泳开始 // 快速游泳开始
g.UpdatePlayerStamina(player, constant.StaminaCostConst.SWIM_DASH_START) g.UpdatePlayerStamina(player, constant.StaminaCostConst.SWIM_DASH_START)
} }
@@ -358,7 +358,7 @@ func (g *GameManager) UpdateVehicleStamina(player *model.Player, vehicleEntity *
// 添加的耐力大于0为恢复 // 添加的耐力大于0为恢复
if staminaCost > 0 { if staminaCost > 0 {
// 耐力延迟2s(10 ticks)恢复 动作状态为加速将立刻恢复耐力 // 耐力延迟2s(10 ticks)恢复 动作状态为加速将立刻恢复耐力
if staminaInfo.VehicleRestoreDelay < 10 && staminaInfo.State != proto.MotionState_MOTION_STATE_SKIFF_POWERED_DASH { if staminaInfo.VehicleRestoreDelay < 10 && staminaInfo.State != proto.MotionState_MOTION_SKIFF_POWERED_DASH {
// logger.Debug("stamina delay add, restoreDelay: %v", staminaInfo.RestoreDelay) // logger.Debug("stamina delay add, restoreDelay: %v", staminaInfo.RestoreDelay)
staminaInfo.VehicleRestoreDelay++ staminaInfo.VehicleRestoreDelay++
return // 不恢复耐力 return // 不恢复耐力
@@ -399,7 +399,7 @@ func (g *GameManager) UpdatePlayerStamina(player *model.Player, staminaCost int3
// 添加的耐力大于0为恢复 // 添加的耐力大于0为恢复
if staminaCost > 0 { if staminaCost > 0 {
// 耐力延迟2s(10 ticks)恢复 动作状态为加速将立刻恢复耐力 // 耐力延迟2s(10 ticks)恢复 动作状态为加速将立刻恢复耐力
if staminaInfo.PlayerRestoreDelay < 10 && staminaInfo.State != proto.MotionState_MOTION_STATE_POWERED_FLY { if staminaInfo.PlayerRestoreDelay < 10 && staminaInfo.State != proto.MotionState_MOTION_POWERED_FLY {
// logger.Debug("stamina delay add, restoreDelay: %v", staminaInfo.RestoreDelay) // logger.Debug("stamina delay add, restoreDelay: %v", staminaInfo.RestoreDelay)
staminaInfo.PlayerRestoreDelay++ staminaInfo.PlayerRestoreDelay++
return // 不恢复耐力 return // 不恢复耐力
@@ -460,7 +460,7 @@ func (g *GameManager) DrownBackHandler(player *model.Player) {
// 先传送玩家再设置角色存活否则同时设置会传送前显示角色实体 // 先传送玩家再设置角色存活否则同时设置会传送前显示角色实体
if player.StaminaInfo.DrownBackDelay > 20 && player.SceneLoadState == model.SceneEnterDone { if player.StaminaInfo.DrownBackDelay > 20 && player.SceneLoadState == model.SceneEnterDone {
// 设置角色存活 // 设置角色存活
scene.SetEntityLifeState(avatarEntity, constant.LifeStateConst.LIFE_REVIVE, proto.PlayerDieType_PLAYER_DIE_TYPE_NONE) scene.SetEntityLifeState(avatarEntity, constant.LifeStateConst.LIFE_REVIVE, proto.PlayerDieType_PLAYER_DIE_NONE)
// 重置溺水返回时间 // 重置溺水返回时间
player.StaminaInfo.DrownBackDelay = 0 player.StaminaInfo.DrownBackDelay = 0
} else if player.StaminaInfo.DrownBackDelay == 20 { } else if player.StaminaInfo.DrownBackDelay == 20 {
@@ -516,10 +516,10 @@ func (g *GameManager) HandleDrown(player *model.Player, stamina uint32) {
} }
// 确保玩家正在游泳 // 确保玩家正在游泳
if player.StaminaInfo.State == proto.MotionState_MOTION_STATE_SWIM_MOVE || player.StaminaInfo.State == proto.MotionState_MOTION_STATE_SWIM_DASH { if player.StaminaInfo.State == proto.MotionState_MOTION_SWIM_MOVE || player.StaminaInfo.State == proto.MotionState_MOTION_SWIM_DASH {
logger.Debug("player drown, curStamina: %v, state: %v", stamina, player.StaminaInfo.State) logger.Debug("player drown, curStamina: %v, state: %v", stamina, player.StaminaInfo.State)
// 设置角色为死亡 // 设置角色为死亡
scene.SetEntityLifeState(avatarEntity, constant.LifeStateConst.LIFE_DEAD, proto.PlayerDieType_PLAYER_DIE_TYPE_DRAWN) scene.SetEntityLifeState(avatarEntity, constant.LifeStateConst.LIFE_DEAD, proto.PlayerDieType_PLAYER_DIE_DRAWN)
// 溺水返回安全点 计时开始 // 溺水返回安全点 计时开始
player.StaminaInfo.DrownBackDelay = 1 player.StaminaInfo.DrownBackDelay = 1
} }

View File

@@ -39,10 +39,10 @@ func (g *GameManager) ChangeAvatarReq(player *model.Player, payloadMsg pb.Messag
logger.Error("can not find old avatar entity, entity id: %v", oldAvatarEntityId) logger.Error("can not find old avatar entity, entity id: %v", oldAvatarEntityId)
return return
} }
oldAvatarEntity.moveState = uint16(proto.MotionState_MOTION_STATE_STANDBY) oldAvatarEntity.moveState = uint16(proto.MotionState_MOTION_STANDBY)
sceneEntityDisappearNotify := &proto.SceneEntityDisappearNotify{ sceneEntityDisappearNotify := &proto.SceneEntityDisappearNotify{
DisappearType: proto.VisionType_VISION_TYPE_REPLACE, DisappearType: proto.VisionType_VISION_REPLACE,
EntityList: []uint32{oldAvatarEntity.id}, EntityList: []uint32{oldAvatarEntity.id},
} }
for _, scenePlayer := range scene.playerMap { for _, scenePlayer := range scene.playerMap {
@@ -52,7 +52,7 @@ func (g *GameManager) ChangeAvatarReq(player *model.Player, payloadMsg pb.Messag
newAvatarId := world.GetPlayerActiveAvatarId(player) newAvatarId := world.GetPlayerActiveAvatarId(player)
newAvatarEntity := g.PacketSceneEntityInfoAvatar(scene, player, newAvatarId) newAvatarEntity := g.PacketSceneEntityInfoAvatar(scene, player, newAvatarId)
sceneEntityAppearNotify := &proto.SceneEntityAppearNotify{ sceneEntityAppearNotify := &proto.SceneEntityAppearNotify{
AppearType: proto.VisionType_VISION_TYPE_REPLACE, AppearType: proto.VisionType_VISION_REPLACE,
Param: oldAvatarEntity.id, Param: oldAvatarEntity.id,
EntityList: []*proto.SceneEntityInfo{newAvatarEntity}, EntityList: []*proto.SceneEntityInfo{newAvatarEntity},
} }

View File

@@ -17,7 +17,7 @@ func (g *GameManager) VehicleDestroyMotion(player *model.Player, entity *Entity,
scene := world.GetSceneById(player.SceneId) scene := world.GetSceneById(player.SceneId)
// 状态等于 MOTION_STATE_DESTROY_VEHICLE 代表请求销毁 // 状态等于 MOTION_STATE_DESTROY_VEHICLE 代表请求销毁
if state == proto.MotionState_MOTION_STATE_DESTROY_VEHICLE { if state == proto.MotionState_MOTION_DESTROY_VEHICLE {
g.DestroyVehicleEntity(player, scene, entity.gadgetEntity.gadgetVehicleEntity.vehicleId, entity.id) g.DestroyVehicleEntity(player, scene, entity.gadgetEntity.gadgetVehicleEntity.vehicleId, entity.id)
} }
} }
@@ -55,7 +55,7 @@ func (g *GameManager) CreateVehicleReq(player *model.Player, payloadMsg pb.Messa
g.CommonRetError(cmd.VehicleInteractRsp, player, &proto.VehicleInteractRsp{}) g.CommonRetError(cmd.VehicleInteractRsp, player, &proto.VehicleInteractRsp{})
return return
} }
GAME_MANAGER.AddSceneEntityNotify(player, proto.VisionType_VISION_TYPE_BORN, []uint32{entityId}, true, false) GAME_MANAGER.AddSceneEntityNotify(player, proto.VisionType_VISION_BORN, []uint32{entityId}, true, false)
// 记录创建的载具信息 // 记录创建的载具信息
player.VehicleInfo.LastCreateEntityIdMap[req.VehicleId] = entityId player.VehicleInfo.LastCreateEntityIdMap[req.VehicleId] = entityId
player.VehicleInfo.LastCreateTime = time.Now().UnixMilli() player.VehicleInfo.LastCreateTime = time.Now().UnixMilli()
@@ -107,7 +107,7 @@ func (g *GameManager) DestroyVehicleEntity(player *model.Player, scene *Scene, v
} }
// 删除已创建的载具 // 删除已创建的载具
scene.DestroyEntity(entity.id) scene.DestroyEntity(entity.id)
g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_TYPE_MISS, []uint32{entity.id}) g.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_MISS, []uint32{entity.id})
} }
// EnterVehicle 进入载具 // EnterVehicle 进入载具
@@ -136,7 +136,7 @@ func (g *GameManager) EnterVehicle(player *model.Player, entity *Entity, avatarG
// PacketVehicleInteractRsp // PacketVehicleInteractRsp
vehicleInteractRsp := &proto.VehicleInteractRsp{ vehicleInteractRsp := &proto.VehicleInteractRsp{
InteractType: proto.VehicleInteractType_VEHICLE_INTERACT_TYPE_IN, InteractType: proto.VehicleInteractType_VEHICLE_INTERACT_IN,
Member: &proto.VehicleMember{ Member: &proto.VehicleMember{
Uid: player.PlayerID, Uid: player.PlayerID,
AvatarGuid: avatarGuid, AvatarGuid: avatarGuid,
@@ -168,7 +168,7 @@ func (g *GameManager) ExitVehicle(player *model.Player, entity *Entity, avatarGu
// PacketVehicleInteractRsp // PacketVehicleInteractRsp
vehicleInteractRsp := &proto.VehicleInteractRsp{ vehicleInteractRsp := &proto.VehicleInteractRsp{
InteractType: proto.VehicleInteractType_VEHICLE_INTERACT_TYPE_OUT, InteractType: proto.VehicleInteractType_VEHICLE_INTERACT_OUT,
Member: &proto.VehicleMember{ Member: &proto.VehicleMember{
Uid: player.PlayerID, Uid: player.PlayerID,
AvatarGuid: avatarGuid, AvatarGuid: avatarGuid,
@@ -203,10 +203,10 @@ func (g *GameManager) VehicleInteractReq(player *model.Player, payloadMsg pb.Mes
avatarGuid := player.AvatarMap[player.TeamConfig.GetActiveAvatarId()].Guid avatarGuid := player.AvatarMap[player.TeamConfig.GetActiveAvatarId()].Guid
switch req.InteractType { switch req.InteractType {
case proto.VehicleInteractType_VEHICLE_INTERACT_TYPE_IN: case proto.VehicleInteractType_VEHICLE_INTERACT_IN:
// 进入载具 // 进入载具
g.EnterVehicle(player, entity, avatarGuid) g.EnterVehicle(player, entity, avatarGuid)
case proto.VehicleInteractType_VEHICLE_INTERACT_TYPE_OUT: case proto.VehicleInteractType_VEHICLE_INTERACT_OUT:
// 离开载具 // 离开载具
g.ExitVehicle(player, entity, avatarGuid) g.ExitVehicle(player, entity, avatarGuid)
} }

View File

@@ -11,7 +11,7 @@ import (
func (g *GameManager) GetAllWeaponDataConfig() map[int32]*gdconf.ItemData { func (g *GameManager) GetAllWeaponDataConfig() map[int32]*gdconf.ItemData {
allWeaponDataConfig := make(map[int32]*gdconf.ItemData) allWeaponDataConfig := make(map[int32]*gdconf.ItemData)
for itemId, itemData := range gdconf.CONF.ItemDataMap { for itemId, itemData := range gdconf.CONF.ItemDataMap {
if uint16(itemData.EquipType) != constant.EquipTypeConst.EQUIP_WEAPON { if uint16(itemData.Type) != constant.ItemTypeConst.ITEM_WEAPON {
continue continue
} }
if (itemId >= 10000 && itemId <= 10008) || if (itemId >= 10000 && itemId <= 10008) ||
@@ -52,7 +52,7 @@ func (g *GameManager) AddUserWeapon(userId uint32, itemId uint32) uint64 {
} }
storeItemChangeNotify := &proto.StoreItemChangeNotify{ storeItemChangeNotify := &proto.StoreItemChangeNotify{
StoreType: proto.StoreType_STORE_TYPE_PACK, StoreType: proto.StoreType_STORE_PACK,
ItemList: make([]*proto.Item, 0), ItemList: make([]*proto.Item, 0),
} }
affixMap := make(map[uint32]uint32) affixMap := make(map[uint32]uint32)

View File

@@ -337,10 +337,10 @@ func (t *TickManager) onTickSecond(now int64) {
GAME_MANAGER.SendMsg(cmd.WorldPlayerRTTNotify, player.PlayerID, 0, worldPlayerRTTNotify) GAME_MANAGER.SendMsg(cmd.WorldPlayerRTTNotify, player.PlayerID, 0, worldPlayerRTTNotify)
// 玩家安全位置更新 // 玩家安全位置更新
switch player.StaminaInfo.State { switch player.StaminaInfo.State {
case proto.MotionState_MOTION_STATE_DANGER_RUN, proto.MotionState_MOTION_STATE_RUN, case proto.MotionState_MOTION_DANGER_RUN, proto.MotionState_MOTION_RUN,
proto.MotionState_MOTION_STATE_DANGER_STANDBY_MOVE, proto.MotionState_MOTION_STATE_DANGER_STANDBY, proto.MotionState_MOTION_STATE_LADDER_TO_STANDBY, proto.MotionState_MOTION_STATE_STANDBY_MOVE, proto.MotionState_MOTION_STATE_STANDBY, proto.MotionState_MOTION_DANGER_STANDBY_MOVE, proto.MotionState_MOTION_DANGER_STANDBY, proto.MotionState_MOTION_LADDER_TO_STANDBY, proto.MotionState_MOTION_STANDBY_MOVE, proto.MotionState_MOTION_STANDBY,
proto.MotionState_MOTION_STATE_DANGER_WALK, proto.MotionState_MOTION_STATE_WALK, proto.MotionState_MOTION_DANGER_WALK, proto.MotionState_MOTION_WALK,
proto.MotionState_MOTION_STATE_DASH: proto.MotionState_MOTION_DASH:
// 仅在陆地时更新玩家安全位置 // 仅在陆地时更新玩家安全位置
player.SafePos.X = player.Pos.X player.SafePos.X = player.Pos.X
player.SafePos.Y = player.Pos.Y player.SafePos.Y = player.Pos.Y

View File

@@ -226,7 +226,7 @@ func (g *GameManager) VideoPlayerUpdate(rgb bool) {
for _, v := range SCREEN_ENTITY_ID_LIST { for _, v := range SCREEN_ENTITY_ID_LIST {
scene.DestroyEntity(v) scene.DestroyEntity(v)
} }
GAME_MANAGER.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_TYPE_REMOVE, SCREEN_ENTITY_ID_LIST) GAME_MANAGER.RemoveSceneEntityNotifyBroadcast(scene, proto.VisionType_VISION_REMOVE, SCREEN_ENTITY_ID_LIST)
SCREEN_ENTITY_ID_LIST = make([]uint32, 0) SCREEN_ENTITY_ID_LIST = make([]uint32, 0)
leftTopPos := &model.Vector{ leftTopPos := &model.Vector{
X: BASE_POS.X + float64(float64(SCREEN_WIDTH)*SCREEN_DPI/2), X: BASE_POS.X + float64(float64(SCREEN_WIDTH)*SCREEN_DPI/2),
@@ -256,5 +256,5 @@ func (g *GameManager) VideoPlayerUpdate(rgb bool) {
} }
} }
} }
GAME_MANAGER.AddSceneEntityNotify(world.owner, proto.VisionType_VISION_TYPE_BORN, SCREEN_ENTITY_ID_LIST, true, false) GAME_MANAGER.AddSceneEntityNotify(world.owner, proto.VisionType_VISION_BORN, SCREEN_ENTITY_ID_LIST, true, false)
} }

View File

@@ -845,7 +845,7 @@ func (s *Scene) SetEntityLifeState(entity *Entity, lifeState uint16, dieType pro
// 删除实体 // 删除实体
s.DestroyEntity(entity.id) s.DestroyEntity(entity.id)
GAME_MANAGER.RemoveSceneEntityNotifyBroadcast(s, proto.VisionType_VISION_TYPE_DIE, []uint32{entity.id}) GAME_MANAGER.RemoveSceneEntityNotifyBroadcast(s, proto.VisionType_VISION_DIE, []uint32{entity.id})
} }
} }
@@ -857,11 +857,11 @@ func (s *Scene) CreateEntityAvatar(player *model.Player, avatarId uint32) uint32
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: player.Pos, pos: player.Pos,
rot: player.Rot, rot: player.Rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: player.AvatarMap[avatarId].FightPropMap, fightProp: player.AvatarMap[avatarId].FightPropMap,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_AVATAR), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_AVATAR),
level: player.AvatarMap[avatarId].Level, level: player.AvatarMap[avatarId].Level,
avatarEntity: &AvatarEntity{ avatarEntity: &AvatarEntity{
uid: player.PlayerID, uid: player.PlayerID,
@@ -891,11 +891,11 @@ func (s *Scene) CreateEntityWeapon() uint32 {
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: new(model.Vector), pos: new(model.Vector),
rot: new(model.Vector), rot: new(model.Vector),
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: nil, fightProp: nil,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_WEAPON), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_WEAPON),
level: 0, level: 0,
} }
s.entityMap[entity.id] = entity s.entityMap[entity.id] = entity
@@ -914,11 +914,11 @@ func (s *Scene) CreateEntityMonster(pos, rot *model.Vector, monsterId uint32, le
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: fightProp, fightProp: fightProp,
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_MONSTER), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_MONSTER),
level: level, level: level,
monsterEntity: &MonsterEntity{ monsterEntity: &MonsterEntity{
monsterId: monsterId, monsterId: monsterId,
@@ -952,7 +952,7 @@ func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQue
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
@@ -960,7 +960,7 @@ func (s *Scene) CreateEntityNpc(pos, rot *model.Vector, npcId, roomId, parentQue
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32, uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1), uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_NPC), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_NPC),
level: 0, level: 0,
npcEntity: &NpcEntity{ npcEntity: &NpcEntity{
NpcId: npcId, NpcId: npcId,
@@ -988,7 +988,7 @@ func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
@@ -996,7 +996,7 @@ func (s *Scene) CreateEntityGadgetNormal(pos, rot *model.Vector, gadgetId uint32
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32, uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1), uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET),
level: 0, level: 0,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetId: gadgetId, gadgetId: gadgetId,
@@ -1022,7 +1022,7 @@ func (s *Scene) CreateEntityGadgetGather(pos, rot *model.Vector, gadgetId uint32
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
@@ -1030,7 +1030,7 @@ func (s *Scene) CreateEntityGadgetGather(pos, rot *model.Vector, gadgetId uint32
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32, uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1), uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET),
level: 0, level: 0,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetId: gadgetId, gadgetId: gadgetId,
@@ -1054,7 +1054,7 @@ func (s *Scene) CreateEntityGadgetClient(pos, rot *model.Vector, entityId uint32
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
@@ -1062,7 +1062,7 @@ func (s *Scene) CreateEntityGadgetClient(pos, rot *model.Vector, entityId uint32
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32, uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): math.MaxFloat32,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1), uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET),
level: 0, level: 0,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetType: GADGET_TYPE_CLIENT, gadgetType: GADGET_TYPE_CLIENT,
@@ -1092,7 +1092,7 @@ func (s *Scene) CreateEntityGadgetVehicle(uid uint32, pos, rot *model.Vector, ve
lifeState: constant.LifeStateConst.LIFE_ALIVE, lifeState: constant.LifeStateConst.LIFE_ALIVE,
pos: pos, pos: pos,
rot: rot, rot: rot,
moveState: uint16(proto.MotionState_MOTION_STATE_NONE), moveState: uint16(proto.MotionState_MOTION_NONE),
lastMoveSceneTimeMs: 0, lastMoveSceneTimeMs: 0,
lastMoveReliableSeq: 0, lastMoveReliableSeq: 0,
fightProp: map[uint32]float32{ fightProp: map[uint32]float32{
@@ -1101,7 +1101,7 @@ func (s *Scene) CreateEntityGadgetVehicle(uid uint32, pos, rot *model.Vector, ve
uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): 114514, uint32(constant.FightPropertyConst.FIGHT_PROP_MAX_HP): 114514,
uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1), uint32(constant.FightPropertyConst.FIGHT_PROP_BASE_HP): float32(1),
}, },
entityType: uint32(proto.ProtEntityType_PROT_ENTITY_TYPE_GADGET), entityType: uint32(proto.ProtEntityType_PROT_ENTITY_GADGET),
level: 0, level: 0,
gadgetEntity: &GadgetEntity{ gadgetEntity: &GadgetEntity{
gadgetType: GADGET_TYPE_VEHICLE, gadgetType: GADGET_TYPE_VEHICLE,

View File

@@ -125,15 +125,15 @@ func (i *InvokeHandler[T]) InitInvokeHandler() {
func (i *InvokeHandler[T]) AddEntry(forward proto.ForwardType, entry *T) { func (i *InvokeHandler[T]) AddEntry(forward proto.ForwardType, entry *T) {
switch forward { switch forward {
case proto.ForwardType_FORWARD_TYPE_TO_ALL: case proto.ForwardType_FORWARD_TO_ALL:
i.EntryListForwardAll = append(i.EntryListForwardAll, entry) i.EntryListForwardAll = append(i.EntryListForwardAll, entry)
case proto.ForwardType_FORWARD_TYPE_TO_ALL_EXCEPT_CUR: case proto.ForwardType_FORWARD_TO_ALL_EXCEPT_CUR:
fallthrough fallthrough
case proto.ForwardType_FORWARD_TYPE_TO_ALL_EXIST_EXCEPT_CUR: case proto.ForwardType_FORWARD_TO_ALL_EXIST_EXCEPT_CUR:
i.EntryListForwardAllExceptCur = append(i.EntryListForwardAllExceptCur, entry) i.EntryListForwardAllExceptCur = append(i.EntryListForwardAllExceptCur, entry)
case proto.ForwardType_FORWARD_TYPE_TO_HOST: case proto.ForwardType_FORWARD_TO_HOST:
i.EntryListForwardHost = append(i.EntryListForwardHost, entry) i.EntryListForwardHost = append(i.EntryListForwardHost, entry)
case proto.ForwardType_FORWARD_TYPE_ONLY_SERVER: case proto.ForwardType_FORWARD_ONLY_SERVER:
i.EntryListForwardServer = append(i.EntryListForwardServer, entry) i.EntryListForwardServer = append(i.EntryListForwardServer, entry)
// logger.Error("forward server entry: %v", entry) // logger.Error("forward server entry: %v", entry)
default: default:

View File

@@ -20,6 +20,7 @@ type Reliquary struct {
func (p *Player) InitReliquary(reliquary *Reliquary) { func (p *Player) InitReliquary(reliquary *Reliquary) {
reliquary.Guid = p.GetNextGameObjectGuid() reliquary.Guid = p.GetNextGameObjectGuid()
p.GameObjectGuidMap[reliquary.Guid] = GameObject(reliquary)
p.ReliquaryMap[reliquary.ReliquaryId] = reliquary p.ReliquaryMap[reliquary.ReliquaryId] = reliquary
if reliquary.AvatarId != 0 { if reliquary.AvatarId != 0 {
avatar := p.AvatarMap[reliquary.AvatarId] avatar := p.AvatarMap[reliquary.AvatarId]

View File

@@ -23,39 +23,39 @@ func (s *StaminaInfo) SetStaminaCost(state proto.MotionState) {
// TODO 角色天赋 食物 会影响耐力消耗 // TODO 角色天赋 食物 会影响耐力消耗
switch state { switch state {
// 消耗耐力 // 消耗耐力
case proto.MotionState_MOTION_STATE_DASH: case proto.MotionState_MOTION_DASH:
// 快速跑步 // 快速跑步
s.CostStamina = constant.StaminaCostConst.DASH s.CostStamina = constant.StaminaCostConst.DASH
case proto.MotionState_MOTION_STATE_FLY, proto.MotionState_MOTION_STATE_FLY_FAST, proto.MotionState_MOTION_STATE_FLY_SLOW: case proto.MotionState_MOTION_FLY, proto.MotionState_MOTION_FLY_FAST, proto.MotionState_MOTION_FLY_SLOW:
// 滑翔 // 滑翔
s.CostStamina = constant.StaminaCostConst.FLY s.CostStamina = constant.StaminaCostConst.FLY
case proto.MotionState_MOTION_STATE_SWIM_DASH: case proto.MotionState_MOTION_SWIM_DASH:
// 快速游泳 // 快速游泳
s.CostStamina = constant.StaminaCostConst.SWIM_DASH s.CostStamina = constant.StaminaCostConst.SWIM_DASH
case proto.MotionState_MOTION_STATE_SKIFF_DASH: case proto.MotionState_MOTION_SKIFF_DASH:
// 浪船加速 // 浪船加速
s.CostStamina = constant.StaminaCostConst.SKIFF_DASH s.CostStamina = constant.StaminaCostConst.SKIFF_DASH
// 恢复耐力 // 恢复耐力
case proto.MotionState_MOTION_STATE_DANGER_RUN, proto.MotionState_MOTION_STATE_RUN: case proto.MotionState_MOTION_DANGER_RUN, proto.MotionState_MOTION_RUN:
// 正常跑步 // 正常跑步
s.CostStamina = constant.StaminaCostConst.RUN s.CostStamina = constant.StaminaCostConst.RUN
case proto.MotionState_MOTION_STATE_DANGER_STANDBY_MOVE, proto.MotionState_MOTION_STATE_DANGER_STANDBY, proto.MotionState_MOTION_STATE_LADDER_TO_STANDBY, proto.MotionState_MOTION_STATE_STANDBY_MOVE, proto.MotionState_MOTION_STATE_STANDBY: case proto.MotionState_MOTION_DANGER_STANDBY_MOVE, proto.MotionState_MOTION_DANGER_STANDBY, proto.MotionState_MOTION_LADDER_TO_STANDBY, proto.MotionState_MOTION_STANDBY_MOVE, proto.MotionState_MOTION_STANDBY:
// 站立 // 站立
s.CostStamina = constant.StaminaCostConst.STANDBY s.CostStamina = constant.StaminaCostConst.STANDBY
case proto.MotionState_MOTION_STATE_DANGER_WALK, proto.MotionState_MOTION_STATE_WALK: case proto.MotionState_MOTION_DANGER_WALK, proto.MotionState_MOTION_WALK:
// 走路 // 走路
s.CostStamina = constant.StaminaCostConst.WALK s.CostStamina = constant.StaminaCostConst.WALK
case proto.MotionState_MOTION_STATE_SKIFF_BOARDING, proto.MotionState_MOTION_STATE_SKIFF_NORMAL: case proto.MotionState_MOTION_SKIFF_BOARDING, proto.MotionState_MOTION_SKIFF_NORMAL:
// 浪船正常移动或停下 // 浪船正常移动或停下
s.CostStamina = constant.StaminaCostConst.SKIFF_NORMAL s.CostStamina = constant.StaminaCostConst.SKIFF_NORMAL
case proto.MotionState_MOTION_STATE_POWERED_FLY: case proto.MotionState_MOTION_POWERED_FLY:
// 滑翔加速 (风圈等) // 滑翔加速 (风圈等)
s.CostStamina = constant.StaminaCostConst.POWERED_FLY s.CostStamina = constant.StaminaCostConst.POWERED_FLY
case proto.MotionState_MOTION_STATE_SKIFF_POWERED_DASH: case proto.MotionState_MOTION_SKIFF_POWERED_DASH:
// 浪船加速 (风圈等) // 浪船加速 (风圈等)
s.CostStamina = constant.StaminaCostConst.POWERED_SKIFF s.CostStamina = constant.StaminaCostConst.POWERED_SKIFF
// 缓慢动作将在客户端发送消息后消耗 // 缓慢动作将在客户端发送消息后消耗
case proto.MotionState_MOTION_STATE_CLIMB, proto.MotionState_MOTION_STATE_SWIM_MOVE: case proto.MotionState_MOTION_CLIMB, proto.MotionState_MOTION_SWIM_MOVE:
// 缓慢攀爬 或 缓慢游泳 // 缓慢攀爬 或 缓慢游泳
s.CostStamina = 0 s.CostStamina = 0
} }

View File

@@ -55,14 +55,14 @@ func (h *Handle) QueryPath(userId uint32, gateAppId string, payloadMsg pb.Messag
if !ok { if !ok {
queryPathRsp := &proto.QueryPathRsp{ queryPathRsp := &proto.QueryPathRsp{
QueryId: req.QueryId, QueryId: req.QueryId,
QueryStatus: proto.QueryPathRsp_PATH_STATUS_TYPE_FAIL, QueryStatus: proto.QueryPathRsp_STATUS_FAIL,
} }
h.SendMsg(cmd.QueryPathRsp, userId, gateAppId, queryPathRsp) h.SendMsg(cmd.QueryPathRsp, userId, gateAppId, queryPathRsp)
return return
} }
queryPathRsp := &proto.QueryPathRsp{ queryPathRsp := &proto.QueryPathRsp{
QueryId: req.QueryId, QueryId: req.QueryId,
QueryStatus: proto.QueryPathRsp_PATH_STATUS_TYPE_SUCC, QueryStatus: proto.QueryPathRsp_STATUS_SUCC,
Corners: h.ConvMeshVecListToPbVecList(path), Corners: h.ConvMeshVecListToPbVecList(path),
} }
h.SendMsg(cmd.QueryPathRsp, userId, gateAppId, queryPathRsp) h.SendMsg(cmd.QueryPathRsp, userId, gateAppId, queryPathRsp)

View File

@@ -1,37 +0,0 @@
// 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 "AISnapshotEntitySkillCycle.proto";
package proto;
option go_package = "./;proto";
message AISnapshotEntityData {
float tick_time = 5;
uint32 tactic = 2;
repeated AISnapshotEntitySkillCycle finished_skill_cycles = 9;
float moved_distance = 4;
uint32 ai_target_id = 13;
uint32 threat_target_id = 3;
uint32 threat_list_size = 1;
uint32 entity_id = 15;
map<uint32, uint32> hitting_avatars = 7;
float distance_to_player = 11;
uint32 attack_target_id = 10;
float real_time = 14;
}

View File

@@ -1,28 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AISnapshotEntitySkillCycle {
bool failed = 12;
bool trydoskill = 8;
bool success = 9;
bool selected = 1;
uint32 skill_id = 2;
}

View File

@@ -1,26 +0,0 @@
// 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 "AISnapshotEntityData.proto";
package proto;
option go_package = "./;proto";
message AISnapshotInfo {
repeated AISnapshotEntityData ai_snapshots = 13;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionBlink {
Vector rot = 11;
Vector pos = 10;
}

View File

@@ -1,28 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionCreateGadget {
uint32 room_id = 3;
Vector rot = 8;
Vector pos = 11;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionCreateTile {
Vector rot = 3;
Vector pos = 8;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionDeductStamina {
bool is_swim = 1;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionDestroyTile {
Vector rot = 3;
Vector pos = 1;
}

View File

@@ -1,26 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionFireAfterImage {
Vector dir = 12;
}

View File

@@ -1,28 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionGenerateElemBall {
uint32 room_id = 2;
Vector pos = 7;
Vector rot = 13;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionHitEffect {
uint32 trigger_id = 3;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionServerMonsterLog {
repeated int32 param_list = 2;
}

View File

@@ -1,25 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionSetBulletTrackTarget {
uint32 chased_entity_id = 1;
uint32 lock_point_index = 2;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionSetCrashDamage {
Vector hit_pos = 2;
float damage = 15;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionSetRandomOverrideMapValue {
float random_value = 1;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityActionSummon {
Vector pos = 10;
Vector rot = 1;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityActionTriggerAbility {
uint32 other_id = 14;
}

View File

@@ -1,30 +0,0 @@
// 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 "AbilityScalarValueEntry.proto";
import "AbilityString.proto";
package proto;
option go_package = "./;proto";
message AbilityAppliedAbility {
AbilityString ability_name = 1;
AbilityString ability_override = 2;
repeated AbilityScalarValueEntry override_map = 3;
uint32 instanced_ability_id = 4;
}

View File

@@ -1,40 +0,0 @@
// 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 "AbilityAttachedModifier.proto";
import "AbilityString.proto";
import "ModifierDurability.proto";
package proto;
option go_package = "./;proto";
message AbilityAppliedModifier {
int32 modifier_local_id = 1;
uint32 parent_ability_entity_id = 2;
AbilityString parent_ability_name = 3;
AbilityString parent_ability_override = 4;
uint32 instanced_ability_id = 5;
uint32 instanced_modifier_id = 6;
float exist_duration = 7;
AbilityAttachedModifier attached_instanced_modifier = 8;
uint32 apply_entity_id = 9;
bool is_attached_parent_ability = 10;
ModifierDurability modifier_durability = 11;
uint32 sbuff_uid = 12;
bool is_serverbuff_modifier = 13;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityApplyLevelModifier {
uint32 apply_entity_id = 6;
}

View File

@@ -1,28 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityArgument {
oneof arg {
uint32 int_arg = 5;
float float_arg = 15;
string str_arg = 11;
}
}

View File

@@ -1,28 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityAttachedModifier {
bool is_invalid = 1;
uint32 owner_entity_id = 2;
uint32 instanced_modifier_id = 3;
bool is_serverbuff_modifier = 4;
int32 attach_name_hash = 5;
}

View File

@@ -1,28 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityBornType {
Vector rot = 2;
Vector move_dir = 14;
Vector pos = 5;
}

View File

@@ -1,30 +0,0 @@
// 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 "AbilityControlBlock.proto";
package proto;
option go_package = "./;proto";
// CmdId: 1131
// EnetChannelId: 0
// EnetIsReliable: true
message AbilityChangeNotify {
uint32 entity_id = 1;
AbilityControlBlock ability_control_block = 15;
}

View File

@@ -1,26 +0,0 @@
// 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 "AbilityEmbryo.proto";
package proto;
option go_package = "./;proto";
message AbilityControlBlock {
repeated AbilityEmbryo ability_embryo_list = 1;
}

View File

@@ -1,26 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityEmbryo {
uint32 ability_id = 1;
fixed32 ability_name_hash = 2;
fixed32 ability_override_name_hash = 3;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityFloatValue {
float value = 1;
}

View File

@@ -1,26 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityGadgetInfo {
uint32 camp_id = 1;
uint32 camp_target_type = 2;
uint32 target_entity_id = 3;
}

View File

@@ -1,29 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityIdentifier {
uint32 modifier_owner_id = 2;
uint32 instanced_modifier_id = 9;
uint32 instanced_ability_id = 10;
bool is_serverbuff_modifier = 6;
uint32 ability_caster_id = 15;
int32 local_id = 3;
}

View File

@@ -1,31 +0,0 @@
// 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 "AbilityInvokeEntry.proto";
package proto;
option go_package = "./;proto";
// CmdId: 1107
// EnetChannelId: 0
// EnetIsReliable: true
message AbilityInvocationFailNotify {
string reason = 7;
uint32 entity_id = 13;
AbilityInvokeEntry invoke = 3;
}

View File

@@ -1,35 +0,0 @@
// 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 "AbilityInvokeEntry.proto";
package proto;
option go_package = "./;proto";
// CmdId: 1172
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AbilityInvocationFixedNotify {
AbilityInvokeEntry invoke6th = 14;
AbilityInvokeEntry invoke5th = 8;
AbilityInvokeEntry invoke4th = 1;
AbilityInvokeEntry invoke2nd = 5;
AbilityInvokeEntry invoke1st = 10;
AbilityInvokeEntry invoke3rd = 12;
}

View File

@@ -1,30 +0,0 @@
// 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 "AbilityInvokeEntry.proto";
package proto;
option go_package = "./;proto";
// CmdId: 1198
// EnetChannelId: 0
// EnetIsReliable: true
// IsAllowClient: true
message AbilityInvocationsNotify {
repeated AbilityInvokeEntry invokes = 2;
}

View File

@@ -1,84 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
enum AbilityInvokeArgument {
ABILITY_INVOKE_ARGUMENT_NONE = 0;
ABILITY_INVOKE_ARGUMENT_META_MODIFIER_CHANGE = 1;
ABILITY_INVOKE_ARGUMENT_META_COMMAND_MODIFIER_CHANGE_REQUEST = 2;
ABILITY_INVOKE_ARGUMENT_META_SPECIAL_FLOAT_ARGUMENT = 3;
ABILITY_INVOKE_ARGUMENT_META_OVERRIDE_PARAM = 4;
ABILITY_INVOKE_ARGUMENT_META_CLEAR_OVERRIDE_PARAM = 5;
ABILITY_INVOKE_ARGUMENT_META_REINIT_OVERRIDEMAP = 6;
ABILITY_INVOKE_ARGUMENT_META_GLOBAL_FLOAT_VALUE = 7;
ABILITY_INVOKE_ARGUMENT_META_CLEAR_GLOBAL_FLOAT_VALUE = 8;
ABILITY_INVOKE_ARGUMENT_META_ABILITY_ELEMENT_STRENGTH = 9;
ABILITY_INVOKE_ARGUMENT_META_ADD_OR_GET_ABILITY_AND_TRIGGER = 10;
ABILITY_INVOKE_ARGUMENT_META_SET_KILLED_STATE = 11;
ABILITY_INVOKE_ARGUMENT_META_SET_ABILITY_TRIGGER = 12;
ABILITY_INVOKE_ARGUMENT_META_ADD_NEW_ABILITY = 13;
ABILITY_INVOKE_ARGUMENT_META_REMOVE_ABILITY = 14;
ABILITY_INVOKE_ARGUMENT_META_SET_MODIFIER_APPLY_ENTITY = 15;
ABILITY_INVOKE_ARGUMENT_META_MODIFIER_DURABILITY_CHANGE = 16;
ABILITY_INVOKE_ARGUMENT_META_ELEMENT_REACTION_VISUAL = 17;
ABILITY_INVOKE_ARGUMENT_META_SET_POSE_PARAMETER = 18;
ABILITY_INVOKE_ARGUMENT_META_UPDATE_BASE_REACTION_DAMAGE = 19;
ABILITY_INVOKE_ARGUMENT_META_TRIGGER_ELEMENT_REACTION = 20;
ABILITY_INVOKE_ARGUMENT_META_LOSE_HP = 21;
ABILITY_INVOKE_ARGUMENT_META_DURABILITY_IS_ZERO = 22;
ABILITY_INVOKE_ARGUMENT_ACTION_TRIGGER_ABILITY = 50;
ABILITY_INVOKE_ARGUMENT_ACTION_SET_CRASH_DAMAGE = 51;
ABILITY_INVOKE_ARGUMENT_ACTION_EFFECT = 52;
ABILITY_INVOKE_ARGUMENT_ACTION_SUMMON = 53;
ABILITY_INVOKE_ARGUMENT_ACTION_BLINK = 54;
ABILITY_INVOKE_ARGUMENT_ACTION_CREATE_GADGET = 55;
ABILITY_INVOKE_ARGUMENT_ACTION_APPLY_LEVEL_MODIFIER = 56;
ABILITY_INVOKE_ARGUMENT_ACTION_GENERATE_ELEM_BALL = 57;
ABILITY_INVOKE_ARGUMENT_ACTION_SET_RANDOM_OVERRIDE_MAP_VALUE = 58;
ABILITY_INVOKE_ARGUMENT_ACTION_SERVER_MONSTER_LOG = 59;
ABILITY_INVOKE_ARGUMENT_ACTION_CREATE_TILE = 60;
ABILITY_INVOKE_ARGUMENT_ACTION_DESTROY_TILE = 61;
ABILITY_INVOKE_ARGUMENT_ACTION_FIRE_AFTER_IMAGE = 62;
ABILITY_INVOKE_ARGUMENT_ACTION_DEDUCT_STAMINA = 63;
ABILITY_INVOKE_ARGUMENT_ACTION_HIT_EFFECT = 64;
ABILITY_INVOKE_ARGUMENT_ACTION_SET_BULLET_TRACK_TARGET = 65;
ABILITY_INVOKE_ARGUMENT_MIXIN_AVATAR_STEER_BY_CAMERA = 100;
ABILITY_INVOKE_ARGUMENT_MIXIN_MONSTER_DEFEND = 101;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIND_ZONE = 102;
ABILITY_INVOKE_ARGUMENT_MIXIN_COST_STAMINA = 103;
ABILITY_INVOKE_ARGUMENT_MIXIN_ELITE_SHIELD = 104;
ABILITY_INVOKE_ARGUMENT_MIXIN_ELEMENT_SHIELD = 105;
ABILITY_INVOKE_ARGUMENT_MIXIN_GLOBAL_SHIELD = 106;
ABILITY_INVOKE_ARGUMENT_MIXIN_SHIELD_BAR = 107;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIND_SEED_SPAWNER = 108;
ABILITY_INVOKE_ARGUMENT_MIXIN_DO_ACTION_BY_ELEMENT_REACTION = 109;
ABILITY_INVOKE_ARGUMENT_MIXIN_FIELD_ENTITY_COUNT_CHANGE = 110;
ABILITY_INVOKE_ARGUMENT_MIXIN_SCENE_PROP_SYNC = 111;
ABILITY_INVOKE_ARGUMENT_MIXIN_WIDGET_MP_SUPPORT = 112;
ABILITY_INVOKE_ARGUMENT_MIXIN_DO_ACTION_BY_SELF_MODIFIER_ELEMENT_DURABILITY_RATIO = 113;
ABILITY_INVOKE_ARGUMENT_MIXIN_FIREWORKS_LAUNCHER = 114;
ABILITY_INVOKE_ARGUMENT_MIXIN_ATTACK_RESULT_CREATE_COUNT = 115;
ABILITY_INVOKE_ARGUMENT_MIXIN_UGC_TIME_CONTROL = 116;
ABILITY_INVOKE_ARGUMENT_MIXIN_AVATAR_COMBAT = 117;
ABILITY_INVOKE_ARGUMENT_MIXIN_DEATH_ZONE_REGIONAL_PLAY_MIXIN = 118;
ABILITY_INVOKE_ARGUMENT_MIXIN_UI_INTERACT = 119;
ABILITY_INVOKE_ARGUMENT_MIXIN_SHOOT_FROM_CAMERA = 120;
ABILITY_INVOKE_ARGUMENT_MIXIN_ERASE_BRICK_ACTIVITY = 121;
}

View File

@@ -1,35 +0,0 @@
// 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 "AbilityInvokeArgument.proto";
import "AbilityInvokeEntryHead.proto";
import "ForwardType.proto";
package proto;
option go_package = "./;proto";
message AbilityInvokeEntry {
AbilityInvokeArgument argument_type = 1;
AbilityInvokeEntryHead head = 2;
uint32 forward_peer = 4;
uint32 event_id = 12;
ForwardType forward_type = 3;
bytes ability_data = 15;
double total_tick_time = 14;
uint32 entity_id = 9;
}

View File

@@ -1,30 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityInvokeEntryHead {
int32 modifier_config_local_id = 7;
bool is_serverbuff_modifier = 2;
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 12;
int32 local_id = 10;
uint32 server_buff_uid = 14;
uint32 target_id = 3;
}

View File

@@ -1,26 +0,0 @@
// 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 "AbilityAppliedAbility.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaAddAbility {
AbilityAppliedAbility ability = 12;
}

View File

@@ -1,28 +0,0 @@
// 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 "AbilityString.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaAddOrGetAbilityAndTrigger {
AbilityString ability_name = 13;
float trigger_argument = 3;
AbilityString ability_override = 8;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaDurabilityIsZero {
bool is_zero = 5;
}

View File

@@ -1,27 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaElementReactionVisual {
int32 hit_index = 2;
uint32 element_source_type = 12;
uint32 element_reactor_type = 6;
uint32 element_reaction_type = 5;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaLoseHp {
uint32 lose_hp_config_idx = 10;
}

View File

@@ -1,39 +0,0 @@
// 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 "AbilityAttachedModifier.proto";
import "AbilityString.proto";
import "ModifierAction.proto";
import "ModifierProperty.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaModifierChange {
AbilityAttachedModifier attached_instanced_modifier = 7;
uint32 server_buff_uid = 4;
bool is_attached_parent_ability = 10;
ModifierAction action = 13;
int32 modifier_local_id = 2;
AbilityString parent_ability_name = 1;
bool is_mute_remote = 6;
uint32 apply_entity_id = 5;
repeated ModifierProperty properties = 3;
AbilityString parent_ability_override = 11;
bool is_durability_zero = 9;
}

View File

@@ -1,25 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaModifierDurabilityChange {
float reduce_durability = 6;
float remain_durability = 15;
}

View File

@@ -1,26 +0,0 @@
// 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 "AbilityScalarValueEntry.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaReInitOverrideMap {
repeated AbilityScalarValueEntry override_map = 7;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaSetAbilityTrigger {
uint32 trigger_ability_entity_id = 11;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaSetKilledState {
bool killed = 2;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaSetModifierApplyEntityId {
uint32 apply_entity_id = 10;
}

View File

@@ -1,26 +0,0 @@
// 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 "AnimatorParameterValueInfoPair.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaSetPoseParameter {
AnimatorParameterValueInfoPair value = 6;
}

View File

@@ -1,25 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaSpecialFloatArgument {
float argument_value = 14;
bool is_on = 10;
}

View File

@@ -1,28 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMetaTriggerElementReaction {
int32 hit_index = 9;
uint32 element_source_type = 7;
uint32 element_reactor_type = 12;
uint32 trigger_entity_id = 2;
uint32 element_reaction_type = 1;
}

View File

@@ -1,29 +0,0 @@
// 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 "AbilityString.proto";
package proto;
option go_package = "./;proto";
message AbilityMetaUpdateBaseReactionDamage {
uint32 source_caster_id = 15;
AbilityString ability_name = 1;
AbilityString global_value_key = 4;
uint32 reaction_type = 8;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinAvatarCombat {
bool is_enter_combat = 9;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityMixinAvatarSteerByCamera {
Vector target_dir = 7;
Vector target_pos = 6;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinCostStamina {
bool is_swim = 3;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinDoActionByElementReaction {
uint32 target_entity_id = 1;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinDoActionBySelfModifierElementDurabilityRatio {
float last_durability_ratio = 9;
}

View File

@@ -1,29 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinElementShield {
float sub_shield = 10;
float shield = 8;
uint32 absorb_type = 1;
uint32 player_num = 4;
bool is_shield_broken = 9;
float max_shield = 12;
}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinEliteShield {
float sub_shield = 2;
}

View File

@@ -1,22 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinEmpty {}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinFieldEntityCountChange {
uint32 field_entity_count = 14;
}

View File

@@ -1,29 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinFireworksLauncher {
uint32 invoke_type = 2;
uint32 start_count_down_time = 3;
uint32 fired_bullet_count = 1;
uint32 phase = 6;
repeated uint32 fireworks_config = 4;
uint32 turn_index = 7;
}

View File

@@ -1,29 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinGlobalShield {
bool is_create_effect = 4;
float sub_shield = 7;
float height_offset = 5;
uint32 avatar_id = 11;
float max_shield = 10;
string shield_effect_name = 2;
}

View File

@@ -1,33 +0,0 @@
// 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 "MassivePropSyncInfo.proto";
package proto;
option go_package = "./;proto";
message AbilityMixinRecoverInfo {
uint32 local_id = 3;
repeated uint32 data_list = 4;
bool is_serverbuff_modifier = 5;
repeated MassivePropSyncInfo massive_prop_list = 6;
oneof source {
uint32 instanced_ability_id = 1;
uint32 instanced_modifier_id = 2;
}
}

View File

@@ -1,28 +0,0 @@
// 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 "MassivePropSyncInfo.proto";
package proto;
option go_package = "./;proto";
message AbilityMixinScenePropSync {
repeated int64 delete_id_list = 5;
bool is_clear_all = 12;
repeated MassivePropSyncInfo massive_prop_list = 15;
}

View File

@@ -1,27 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinShieldBar {
uint32 player_num = 14;
float max_shield = 15;
float shield = 12;
uint32 element_type = 13;
}

View File

@@ -1,27 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityMixinShootFromCamera {
Vector init_pos = 13;
Vector forward = 2;
}

View File

@@ -1,25 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinUGCTimeControl {
uint64 start_move_time_ms = 13;
uint32 start_move_time = 3;
}

View File

@@ -1,22 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinUIInteract {}

View File

@@ -1,24 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinWidgetMpSupport {
uint32 target_entity_id = 9;
}

View File

@@ -1,40 +0,0 @@
// 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 "Vector.proto";
package proto;
option go_package = "./;proto";
message AbilityMixinWindSeedSpawner {
oneof cmd {
AddSignal add_signal = 2;
RefreshSeed refresh_seed = 15;
CatchSeed catch_seed = 11;
}
message AddSignal {}
message RefreshSeed {
repeated Vector pos_list = 6;
}
message CatchSeed {
uint32 entity_id = 8;
}
}

View File

@@ -1,25 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityMixinWindZone {
repeated uint32 entity_ids = 13;
repeated uint32 zone_id_list = 10;
}

View File

@@ -1,30 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
enum AbilityScalarType {
ABILITY_SCALAR_TYPE_UNKNOWN = 0;
ABILITY_SCALAR_TYPE_FLOAT = 1;
ABILITY_SCALAR_TYPE_INT = 2;
ABILITY_SCALAR_TYPE_BOOL = 3;
ABILITY_SCALAR_TYPE_TRIGGER = 4;
ABILITY_SCALAR_TYPE_STRING = 5;
ABILITY_SCALAR_TYPE_UINT = 6;
}

View File

@@ -1,34 +0,0 @@
// 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 "AbilityScalarType.proto";
import "AbilityString.proto";
package proto;
option go_package = "./;proto";
message AbilityScalarValueEntry {
AbilityString key = 1;
AbilityScalarType value_type = 2;
oneof value {
float float_value = 3;
string string_value = 4;
int32 int_value = 5;
uint32 uint_value = 6;
}
}

View File

@@ -1,27 +0,0 @@
// 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";
package proto;
option go_package = "./;proto";
message AbilityString {
oneof type {
string str = 1;
uint32 hash = 2;
}
}

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