修复开场任务

This commit is contained in:
flswld
2023-03-04 20:14:26 +08:00
parent 266889df36
commit ca616cb08d
17 changed files with 342 additions and 189 deletions

View File

@@ -8,6 +8,18 @@ const (
QUEST_STATE_FAILED = 4
)
const (
QUEST_LOGIC_TYPE_NONE = 0
QUEST_LOGIC_TYPE_AND = 1
QUEST_LOGIC_TYPE_OR = 2
QUEST_LOGIC_TYPE_NOT = 3
QUEST_LOGIC_TYPE_A_AND_ETCOR = 4
QUEST_LOGIC_TYPE_A_AND_B_AND_ETCOR = 5
QUEST_LOGIC_TYPE_A_OR_ETCAND = 6
QUEST_LOGIC_TYPE_A_OR_B_OR_ETCAND = 7
QUEST_LOGIC_TYPE_A_AND_B_OR_ETCAND = 8
)
const (
QUEST_ACCEPT_COND_TYPE_NONE = 0
QUEST_ACCEPT_COND_TYPE_STATE_EQUAL = 1

View File

@@ -52,7 +52,7 @@ func (c *Controller) gateTokenVerify(context *gin.Context) {
verifyFail(account.PlayerID)
return
}
if time.Now().UnixMilli()-int64(account.ComboTokenCreateTime) > time.Minute.Milliseconds()*5 {
if time.Now().UnixMilli()-int64(account.ComboTokenCreateTime) > time.Hour.Milliseconds()*24 {
verifyFail(account.PlayerID)
return
}

View File

@@ -17,7 +17,7 @@ import (
func (g *GameManager) GetAllAvatarDataConfig() map[int32]*gdconf.AvatarData {
allAvatarDataConfig := make(map[int32]*gdconf.AvatarData)
for avatarId, avatarData := range gdconf.GetAvatarDataMap() {
if avatarId < 10000002 || avatarId >= 11000000 {
if avatarId <= 10000001 || avatarId >= 11000000 {
// 跳过无效角色
continue
}
@@ -25,10 +25,6 @@ func (g *GameManager) GetAllAvatarDataConfig() map[int32]*gdconf.AvatarData {
// 跳过主角
continue
}
if avatarId >= 10000079 {
// 跳过后续版本的角色
continue
}
allAvatarDataConfig[avatarId] = avatarData
}
return allAvatarDataConfig

View File

@@ -386,8 +386,6 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
g.RemoveSceneEntityNotifyToPlayer(player, proto.VisionType_VISION_MISS, delEntityIdList)
g.AddSceneEntityNotify(player, proto.VisionType_VISION_MEET, addEntityIdList, false, false)
// 场景区域触发器
dbQuest := player.GetDbQuest()
updateQuest := false
for _, group := range newVisionGroupMap {
for _, region := range group.RegionList {
shape := alg.NewShape()
@@ -443,7 +441,7 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
logger.Error("trigger action fail, trigger: %v, uid: %v", trigger, player.PlayerID)
}
}
updateQuest = g.TriggerFire(dbQuest, trigger)
g.TriggerFire(player, trigger)
}
} else if oldPosInRegion && !newPosInRegion {
logger.Debug("player leave region: %v, uid: %v", region, player.PlayerID)
@@ -473,38 +471,14 @@ func (g *GameManager) AoiPlayerMove(player *model.Player, oldPos *model.Vector,
}
}
}
if updateQuest {
g.AcceptQuest(player, true)
}
}
func (g *GameManager) TriggerFire(dbQuest *model.DbQuest, trigger *gdconf.Trigger) bool {
// TODO 这一块写得太炸裂了需要优化
updateQuest := false
func (g *GameManager) TriggerFire(player *model.Player, trigger *gdconf.Trigger) {
for _, triggerDataConfig := range gdconf.GetTriggerDataMap() {
if triggerDataConfig.TriggerName == trigger.Name {
for _, quest := range dbQuest.GetQuestMap() {
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
if questDataConfig == nil {
continue
}
for _, questCond := range questDataConfig.FinishCondList {
if questCond.Type != constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE {
continue
}
if len(questCond.Param) != 1 {
continue
}
if questCond.Param[0] != triggerDataConfig.TriggerId {
continue
}
dbQuest.ForceFinishQuest(quest.QuestId)
updateQuest = true
}
}
g.TriggerQuest(player, constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE, triggerDataConfig.TriggerId)
}
}
return updateQuest
}
func (g *GameManager) AbilityInvocationsNotify(player *model.Player, payloadMsg pb.Message) {
@@ -713,9 +687,12 @@ func (g *GameManager) EvtCreateGadgetNotify(player *model.Player, payloadMsg pb.
}
logger.Debug("EvtCreateGadgetNotify: %v", req)
world := WORLD_MANAGER.GetWorldByID(player.WorldId)
if world == nil {
logger.Error("world is nil, WorldId: %v", player.WorldId)
return
}
scene := world.GetSceneById(player.SceneId)
if scene == nil {
logger.Error("scene is nil, sceneId: %v", player.SceneId)
if req.InitPos == nil {
return
}
scene.CreateEntityGadgetClient(&model.Vector{

View File

@@ -24,25 +24,6 @@ func (g *GameManager) GetAllItemDataConfig() map[int32]*gdconf.ItemData {
// 排除圣遗物
continue
}
if itemId == 100086 ||
itemId == 100087 ||
(itemId >= 100100 && itemId <= 101000) ||
(itemId >= 101106 && itemId <= 101110) ||
itemId == 101306 ||
(itemId >= 101500 && itemId <= 104000) ||
itemId == 105001 ||
itemId == 105004 ||
(itemId >= 106000 && itemId <= 107000) ||
itemId == 107011 ||
itemId == 108000 ||
(itemId >= 109000 && itemId <= 110000) ||
(itemId >= 115000 && itemId <= 130000) ||
(itemId >= 200200 && itemId <= 200899) ||
itemId == 220050 ||
itemId == 220054 {
// 排除无效道具
continue
}
allItemDataConfig[itemId] = itemData
}
return allItemDataConfig

View File

@@ -50,6 +50,7 @@ func (g *GameManager) OnLoginOk(userId uint32, player *model.Player, clientSeq u
g.SendMsgToGate(cmd.DoSetPlayerBornDataNotify, userId, clientSeq, gateAppId, new(proto.DoSetPlayerBornDataNotify))
return
}
SELF = player
player.OnlineTime = uint32(time.Now().UnixMilli())
player.Online = true
@@ -80,6 +81,9 @@ func (g *GameManager) OnLoginOk(userId uint32, player *model.Player, clientSeq u
return
}
// TODO DEBUG DEL
g.AcceptQuest(player, false)
g.LoginNotify(userId, player, clientSeq)
MESSAGE_QUEUE.SendToAll(&mq.NetMsg{
@@ -95,6 +99,8 @@ func (g *GameManager) OnLoginOk(userId uint32, player *model.Player, clientSeq u
TICK_MANAGER.CreateUserTimer(userId, UserTimerActionTest, 100)
atomic.AddInt32(&ONLINE_PLAYER_NUM, 1)
SELF = nil
}
func (g *GameManager) OnReg(userId uint32, clientSeq uint32, gateAppId string, payloadMsg pb.Message) {

View File

@@ -69,28 +69,60 @@ func (g *GameManager) AcceptQuest(player *model.Player, notifyClient bool) {
if dbQuest.GetQuestById(uint32(questData.QuestId)) != nil {
continue
}
canAccept := true
acceptCondResultList := make([]bool, 0)
for _, acceptCond := range questData.AcceptCondList {
result := false
switch acceptCond.Type {
case constant.QUEST_ACCEPT_COND_TYPE_STATE_EQUAL:
// 某个任务状态等于 参数1:任务id 参数2:任务状态
if len(acceptCond.Param) != 2 {
logger.Error("quest accept cond config format error, questId: %v", questData.QuestId)
canAccept = false
break
}
quest := dbQuest.GetQuestById(uint32(acceptCond.Param[0]))
if quest == nil {
canAccept = false
break
}
if quest.State != uint8(acceptCond.Param[1]) {
break
}
result = true
case constant.QUEST_ACCEPT_COND_TYPE_STATE_NOT_EQUAL:
// 某个任务状态不等于 参数1:任务id 参数2:任务状态
if len(acceptCond.Param) != 2 {
break
}
quest := dbQuest.GetQuestById(uint32(acceptCond.Param[0]))
if quest == nil {
break
}
if quest.State == uint8(acceptCond.Param[1]) {
break
}
result = true
default:
break
}
acceptCondResultList = append(acceptCondResultList, result)
}
canAccept := false
switch questData.AcceptCondCompose {
case constant.QUEST_LOGIC_TYPE_NONE:
fallthrough
case constant.QUEST_LOGIC_TYPE_AND:
canAccept = true
for _, acceptCondResult := range acceptCondResultList {
if !acceptCondResult {
canAccept = false
break
}
default:
canAccept = false
break
}
case constant.QUEST_LOGIC_TYPE_OR:
canAccept = false
for _, acceptCondResult := range acceptCondResultList {
if acceptCondResult {
canAccept = true
break
}
}
}
if canAccept {
@@ -115,6 +147,68 @@ func (g *GameManager) AcceptQuest(player *model.Player, notifyClient bool) {
}
}
// TriggerQuest 触发任务
func (g *GameManager) TriggerQuest(player *model.Player, cond int32, param ...int32) {
dbQuest := player.GetDbQuest()
updateQuestIdList := make([]uint32, 0)
for _, quest := range dbQuest.GetQuestMap() {
questDataConfig := gdconf.GetQuestDataById(int32(quest.QuestId))
if questDataConfig == nil {
continue
}
for _, questCond := range questDataConfig.FinishCondList {
if questCond.Type != cond {
continue
}
switch cond {
case constant.QUEST_FINISH_COND_TYPE_TRIGGER_FIRE:
// 场景触发器跳了 参数1:触发器id
if len(questCond.Param) != 1 {
continue
}
if len(param) != 1 {
continue
}
if questCond.Param[0] != param[0] {
continue
}
dbQuest.ForceFinishQuest(quest.QuestId)
updateQuestIdList = append(updateQuestIdList, quest.QuestId)
case constant.QUEST_FINISH_COND_TYPE_UNLOCK_TRANS_POINT:
// 解锁传送锚点 参数1:场景id 参数2:传送锚点id
if len(questCond.Param) != 2 {
continue
}
if len(param) != 2 {
continue
}
if questCond.Param[0] != param[0] {
continue
}
if questCond.Param[1] != param[1] {
continue
}
dbQuest.ForceFinishQuest(quest.QuestId)
updateQuestIdList = append(updateQuestIdList, quest.QuestId)
}
}
}
if len(updateQuestIdList) > 0 {
ntf := &proto.QuestListUpdateNotify{
QuestList: make([]*proto.Quest, 0),
}
for _, questId := range updateQuestIdList {
pbQuest := g.PacketQuest(player, questId)
if pbQuest == nil {
continue
}
ntf.QuestList = append(ntf.QuestList, pbQuest)
}
g.SendMsg(cmd.QuestListUpdateNotify, player.PlayerID, player.ClientSeq, ntf)
g.AcceptQuest(player, true)
}
}
// PacketQuest 打包一个任务
func (g *GameManager) PacketQuest(player *model.Player, questId uint32) *proto.Quest {
dbQuest := player.GetDbQuest()

View File

@@ -15,12 +15,6 @@ func (g *GameManager) GetAllReliquaryDataConfig() map[int32]*gdconf.ItemData {
if itemData.Type != constant.ITEM_TYPE_RELIQUARY {
continue
}
if (itemId >= 20002 && itemId <= 20004) ||
itemId == 23334 ||
(itemId >= 23300 && itemId <= 23340) {
// 跳过无效圣遗物
continue
}
allReliquaryDataConfig[itemId] = itemData
}
return allReliquaryDataConfig

View File

@@ -20,24 +20,6 @@ func (g *GameManager) GetAllWeaponDataConfig() map[int32]*gdconf.ItemData {
if itemData.Type != constant.ITEM_TYPE_WEAPON {
continue
}
if (itemId >= 10000 && itemId <= 10008) ||
itemId == 11411 ||
(itemId >= 11506 && itemId <= 11508) ||
itemId == 12505 ||
itemId == 12506 ||
itemId == 12508 ||
itemId == 12509 ||
itemId == 13503 ||
itemId == 13506 ||
itemId == 14411 ||
itemId == 14503 ||
itemId == 14505 ||
itemId == 14508 ||
(itemId >= 15504 && itemId <= 15506) ||
itemId == 20001 || itemId == 15306 || itemId == 14306 || itemId == 13304 || itemId == 12304 {
// 跳过无效武器
continue
}
allWeaponDataConfig[itemId] = itemData
}
return allWeaponDataConfig

View File

@@ -3,6 +3,7 @@ package game
import (
"strconv"
"hk4e/common/constant"
"hk4e/gdconf"
"hk4e/gs/model"
"hk4e/pkg/logger"
@@ -15,12 +16,22 @@ import (
func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.SceneTransToPointReq)
pointDataConfig := gdconf.GetScenePointBySceneIdAndPointId(int32(req.SceneId), int32(req.PointId))
if pointDataConfig == nil {
g.SendError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{})
dbWorld := player.GetDbWorld()
dbScene := dbWorld.GetSceneById(req.SceneId)
if dbScene == nil {
g.SendError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{}, proto.Retcode_RET_POINT_NOT_UNLOCKED)
return
}
unlock := dbScene.CheckPointUnlock(req.PointId)
if !unlock {
g.SendError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{}, proto.Retcode_RET_POINT_NOT_UNLOCKED)
return
}
pointDataConfig := gdconf.GetScenePointBySceneIdAndPointId(int32(req.SceneId), int32(req.PointId))
if pointDataConfig == nil {
g.SendError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{}, proto.Retcode_RET_POINT_NOT_UNLOCKED)
return
}
// 传送玩家
sceneId := req.SceneId
g.TeleportPlayer(player, uint16(proto.EnterReason_ENTER_REASON_TRANS_POINT), sceneId, &model.Vector{
@@ -40,6 +51,65 @@ func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.M
g.SendMsg(cmd.SceneTransToPointRsp, player.PlayerID, player.ClientSeq, sceneTransToPointRsp)
}
func (g *GameManager) UnlockTransPointReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.UnlockTransPointReq)
dbWorld := player.GetDbWorld()
dbScene := dbWorld.GetSceneById(req.SceneId)
if dbScene == nil {
g.SendError(cmd.UnlockTransPointRsp, player, &proto.UnlockTransPointRsp{}, proto.Retcode_RET_POINT_NOT_UNLOCKED)
return
}
unlock := dbScene.CheckPointUnlock(req.PointId)
if unlock {
g.SendError(cmd.UnlockTransPointRsp, player, &proto.UnlockTransPointRsp{}, proto.Retcode_RET_POINT_ALREAY_UNLOCKED)
return
}
dbScene.UnlockPoint(req.PointId)
g.TriggerQuest(player, constant.QUEST_FINISH_COND_TYPE_UNLOCK_TRANS_POINT, int32(req.SceneId), int32(req.PointId))
g.SendMsg(cmd.ScenePointUnlockNotify, player.PlayerID, player.ClientSeq, &proto.ScenePointUnlockNotify{
SceneId: req.SceneId,
PointList: []uint32{req.PointId},
UnhidePointList: nil,
})
g.SendSucc(cmd.UnlockTransPointRsp, player, &proto.UnlockTransPointRsp{})
}
func (g *GameManager) GetScenePointReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.GetScenePointReq)
dbWorld := player.GetDbWorld()
dbScene := dbWorld.GetSceneById(req.SceneId)
if dbScene == nil {
g.SendError(cmd.GetScenePointRsp, player, &proto.GetScenePointRsp{})
return
}
getScenePointRsp := &proto.GetScenePointRsp{
SceneId: req.SceneId,
}
areaIdMap := make(map[uint32]bool)
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
if uint32(worldAreaData.SceneId) == req.SceneId {
areaIdMap[uint32(worldAreaData.AreaId1)] = true
}
}
areaList := make([]uint32, 0)
for areaId := range areaIdMap {
areaList = append(areaList, areaId)
}
getScenePointRsp.UnlockAreaList = areaList
for _, pointId := range dbScene.GetUnlockPointList() {
pointData := gdconf.GetScenePointBySceneIdAndPointId(int32(req.SceneId), int32(pointId))
if pointData.IsModelHidden {
getScenePointRsp.HidePointList = append(getScenePointRsp.HidePointList, pointId)
}
getScenePointRsp.UnlockedPointList = append(getScenePointRsp.UnlockedPointList, pointId)
}
g.SendMsg(cmd.GetScenePointRsp, player.PlayerID, player.ClientSeq, getScenePointRsp)
}
func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.MarkMapReq)
operation := req.Op
@@ -61,6 +131,51 @@ func (g *GameManager) MarkMapReq(player *model.Player, payloadMsg pb.Message) {
}
}
func (g *GameManager) GetSceneAreaReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.GetSceneAreaReq)
getSceneAreaRsp := &proto.GetSceneAreaRsp{
SceneId: req.SceneId,
}
areaIdMap := make(map[uint32]bool)
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
if uint32(worldAreaData.SceneId) == req.SceneId {
areaIdMap[uint32(worldAreaData.AreaId1)] = true
}
}
areaList := make([]uint32, 0)
for areaId := range areaIdMap {
areaList = append(areaList, areaId)
}
getSceneAreaRsp.AreaIdList = areaList
if req.SceneId == 3 {
getSceneAreaRsp.CityInfoList = []*proto.CityInfo{
{CityId: 1, Level: 10},
{CityId: 2, Level: 10},
{CityId: 3, Level: 10},
{CityId: 4, Level: 10},
{CityId: 99, Level: 1},
{CityId: 100, Level: 1},
{CityId: 101, Level: 1},
{CityId: 102, Level: 1},
}
}
g.SendMsg(cmd.GetSceneAreaRsp, player.PlayerID, player.ClientSeq, getSceneAreaRsp)
}
func (g *GameManager) EnterWorldAreaReq(player *model.Player, payloadMsg pb.Message) {
logger.Debug("player enter world area, uid: %v", player.PlayerID)
req := payloadMsg.(*proto.EnterWorldAreaReq)
logger.Debug("EnterWorldAreaReq: %v", req)
enterWorldAreaRsp := &proto.EnterWorldAreaRsp{
AreaType: req.AreaType,
AreaId: req.AreaId,
}
g.SendMsg(cmd.EnterWorldAreaRsp, player.PlayerID, player.ClientSeq, enterWorldAreaRsp)
}
// TeleportPlayer 传送玩家至地图上的某个位置
func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, sceneId uint32, pos, rot *model.Vector, dungeonId uint32) {
// 传送玩家
@@ -122,79 +237,3 @@ func (g *GameManager) TeleportPlayer(player *model.Player, enterReason uint16, s
playerEnterSceneNotify := g.PacketPlayerEnterSceneNotifyTp(player, enterType, uint32(enterReason), oldSceneId, oldPos, dungeonId)
g.SendMsg(cmd.PlayerEnterSceneNotify, player.PlayerID, player.ClientSeq, playerEnterSceneNotify)
}
func (g *GameManager) GetScenePointReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.GetScenePointReq)
scenePointMapConfig := gdconf.GetScenePointMapBySceneId(int32(req.SceneId))
if scenePointMapConfig == nil {
return
}
getScenePointRsp := &proto.GetScenePointRsp{
SceneId: req.SceneId,
}
areaIdMap := make(map[uint32]bool)
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
if uint32(worldAreaData.SceneId) == req.SceneId {
areaIdMap[uint32(worldAreaData.AreaId1)] = true
}
}
areaList := make([]uint32, 0)
for areaId := range areaIdMap {
areaList = append(areaList, areaId)
}
getScenePointRsp.UnlockAreaList = areaList
for _, pointData := range scenePointMapConfig {
if pointData.PointType == gdconf.PointTypeOther {
continue
}
getScenePointRsp.UnlockedPointList = append(getScenePointRsp.UnlockedPointList, uint32(pointData.Id))
}
g.SendMsg(cmd.GetScenePointRsp, player.PlayerID, player.ClientSeq, getScenePointRsp)
}
func (g *GameManager) GetSceneAreaReq(player *model.Player, payloadMsg pb.Message) {
req := payloadMsg.(*proto.GetSceneAreaReq)
getSceneAreaRsp := &proto.GetSceneAreaRsp{
SceneId: req.SceneId,
}
areaIdMap := make(map[uint32]bool)
for _, worldAreaData := range gdconf.GetWorldAreaDataMap() {
if uint32(worldAreaData.SceneId) == req.SceneId {
areaIdMap[uint32(worldAreaData.AreaId1)] = true
}
}
areaList := make([]uint32, 0)
for areaId := range areaIdMap {
areaList = append(areaList, areaId)
}
getSceneAreaRsp.AreaIdList = areaList
if req.SceneId == 3 {
getSceneAreaRsp.CityInfoList = []*proto.CityInfo{
{CityId: 1, Level: 10},
{CityId: 2, Level: 10},
{CityId: 3, Level: 10},
{CityId: 4, Level: 10},
{CityId: 99, Level: 1},
{CityId: 100, Level: 1},
{CityId: 101, Level: 1},
{CityId: 102, Level: 1},
}
}
g.SendMsg(cmd.GetSceneAreaRsp, player.PlayerID, player.ClientSeq, getSceneAreaRsp)
}
func (g *GameManager) EnterWorldAreaReq(player *model.Player, payloadMsg pb.Message) {
logger.Debug("player enter world area, uid: %v", player.PlayerID)
req := payloadMsg.(*proto.EnterWorldAreaReq)
logger.Debug("EnterWorldAreaReq: %v", req)
enterWorldAreaRsp := &proto.EnterWorldAreaRsp{
AreaType: req.AreaType,
AreaId: req.AreaId,
}
g.SendMsg(cmd.EnterWorldAreaRsp, player.PlayerID, player.ClientSeq, enterWorldAreaRsp)
}

View File

@@ -69,6 +69,7 @@ func (r *RouteManager) initRoute() {
r.registerRouter(cmd.PostEnterSceneReq, GAME_MANAGER.PostEnterSceneReq)
r.registerRouter(cmd.TowerAllDataReq, GAME_MANAGER.TowerAllDataReq)
r.registerRouter(cmd.SceneTransToPointReq, GAME_MANAGER.SceneTransToPointReq)
r.registerRouter(cmd.UnlockTransPointReq, GAME_MANAGER.UnlockTransPointReq)
r.registerRouter(cmd.MarkMapReq, GAME_MANAGER.MarkMapReq)
r.registerRouter(cmd.ChangeAvatarReq, GAME_MANAGER.ChangeAvatarReq)
r.registerRouter(cmd.SetUpAvatarTeamReq, GAME_MANAGER.SetUpAvatarTeamReq)

View File

@@ -30,8 +30,8 @@ type Avatar struct {
Promote uint8 // 突破等阶
Satiation uint32 // 饱食度
SatiationPenalty uint32 // 饱食度溢出
CurrHP float32 // 当前生命值
CurrEnergy float32 // 当前元素能量值
CurrHP float64 // 当前生命值
CurrEnergy float64 // 当前元素能量值
FetterList []uint32 // 资料解锁条目
SkillLevelMap map[uint32]uint32 // 技能等级数据
SkillDepotId uint32 // 技能库id
@@ -85,7 +85,7 @@ func (a *DbAvatar) InitAvatarFightProp(avatar *Avatar) {
avatar.FightPropMap[constant.FIGHT_PROP_CUR_DEFENSE] = avatarDataConfig.GetBaseDefenseByLevel(avatar.Level)
avatar.FightPropMap[constant.FIGHT_PROP_MAX_HP] = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
// 当前血量
avatar.FightPropMap[constant.FIGHT_PROP_CUR_HP] = avatar.CurrHP
avatar.FightPropMap[constant.FIGHT_PROP_CUR_HP] = float32(avatar.CurrHP)
// 双暴
avatar.FightPropMap[constant.FIGHT_PROP_CRITICAL] = avatarDataConfig.Critical
avatar.FightPropMap[constant.FIGHT_PROP_CRITICAL_HURT] = avatarDataConfig.CriticalHurt
@@ -147,7 +147,7 @@ func (a *DbAvatar) AddAvatar(player *Player, avatarId uint32) {
// 小技能1级
avatar.SkillLevelMap[uint32(skillId)] = 1
}
avatar.CurrHP = avatarDataConfig.GetBaseHpByLevel(avatar.Level)
avatar.CurrHP = float64(avatarDataConfig.GetBaseHpByLevel(avatar.Level))
// 角色突破奖励领取状态
for promoteLevel := range avatarDataConfig.PromoteRewardMap {
@@ -158,7 +158,7 @@ func (a *DbAvatar) AddAvatar(player *Player, avatarId uint32) {
a.AvatarMap[avatarId] = avatar
}
func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float32, max bool) {
func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float64, max bool) {
var avatarSkillDataConfig *gdconf.AvatarSkillData = nil
if avatar.AvatarId == 10000005 || avatar.AvatarId == 10000007 {
avatarSkillDepotDataConfig := gdconf.GetAvatarSkillDepotDataById(int32(avatar.SkillDepotId))
@@ -185,7 +185,7 @@ func (a *DbAvatar) SetCurrEnergy(avatar *Avatar, value float32, max bool) {
if max {
avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(avatarSkillDataConfig.CostElemVal)
} else {
avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = value
avatar.FightPropMap[uint32(elementType.CurrEnergyProp)] = float32(value)
}
}

View File

@@ -1,5 +1,9 @@
package model
type DbGacha struct {
GachaPoolInfo map[uint32]*GachaPoolInfo
}
type GachaPoolInfo struct {
GachaType uint32 // 卡池类型
OrangeTimes uint32 // 5星保底计数
@@ -8,10 +12,6 @@ type GachaPoolInfo struct {
MustGetUpPurple bool // 是否4星大保底
}
type DbGacha struct {
GachaPoolInfo map[uint32]*GachaPoolInfo
}
func (p *Player) GetDbGacha() *DbGacha {
if p.DbGacha == nil {
p.DbGacha = NewDbGacha()

72
gs/model/db_world.go Normal file
View File

@@ -0,0 +1,72 @@
package model
import (
"hk4e/gdconf"
)
type DbScene struct {
SceneId uint32
UnlockPointMap map[uint32]bool
}
type DbWorld struct {
SceneMap map[uint32]*DbScene
}
func (p *Player) GetDbWorld() *DbWorld {
if p.DbWorld == nil {
p.DbWorld = NewDbWorld()
}
return p.DbWorld
}
func NewDbWorld() *DbWorld {
r := &DbWorld{
SceneMap: make(map[uint32]*DbScene),
}
return r
}
func NewScene(sceneId uint32) *DbScene {
r := &DbScene{
SceneId: sceneId,
UnlockPointMap: make(map[uint32]bool),
}
return r
}
func (w *DbWorld) GetSceneById(sceneId uint32) *DbScene {
scene, exist := w.SceneMap[sceneId]
// 不存在自动创建场景
if !exist {
// 拒绝创建配置表中不存在的非法场景
sceneDataConfig := gdconf.GetSceneDataById(int32(sceneId))
if sceneDataConfig == nil {
return nil
}
scene = NewScene(sceneId)
w.SceneMap[sceneId] = scene
}
return scene
}
func (s *DbScene) GetUnlockPointList() []uint32 {
unlockPointList := make([]uint32, 0)
for pointId := range s.UnlockPointMap {
unlockPointList = append(unlockPointList, pointId)
}
return unlockPointList
}
func (s *DbScene) UnlockPoint(pointId uint32) {
pointDataConfig := gdconf.GetScenePointBySceneIdAndPointId(int32(s.SceneId), int32(pointId))
if pointDataConfig == nil {
return
}
s.UnlockPointMap[pointId] = true
}
func (s *DbScene) CheckPointUnlock(pointId uint32) bool {
_, exist := s.UnlockPointMap[pointId]
return exist
}

View File

@@ -53,6 +53,7 @@ type Player struct {
DbAvatar *DbAvatar // 角色
DbGacha *DbGacha // 卡池
DbQuest *DbQuest // 任务
DbWorld *DbWorld // 大世界
// 在线数据 请随意 记得加忽略字段的tag
LastSaveTime uint32 `bson:"-" msgpack:"-"` // 上一次保存时间
EnterSceneToken uint32 `bson:"-" msgpack:"-"` // 世界进入令牌

View File

@@ -1,5 +0,0 @@
package cmd
const (
GCGDSBanCardNotify uint16 = 65501
)

View File

@@ -68,8 +68,9 @@ func (c *CmdProtoMap) registerAllMessage() {
c.registerMessage(EnterWorldAreaRsp, &proto.EnterWorldAreaRsp{}) // 进入世界区域响应
c.registerMessage(SceneTransToPointReq, &proto.SceneTransToPointReq{}) // 场景传送点传送请求
c.registerMessage(SceneTransToPointRsp, &proto.SceneTransToPointRsp{}) // 场景传送点传送响应
c.registerMessage(PathfindingEnterSceneReq, &proto.PathfindingEnterSceneReq{}) // 寻路进入场景请求
c.registerMessage(PathfindingEnterSceneRsp, &proto.PathfindingEnterSceneRsp{}) // 寻路进入场景响应
c.registerMessage(UnlockTransPointReq, &proto.UnlockTransPointReq{}) // 解锁场景传送点请求
c.registerMessage(UnlockTransPointRsp, &proto.UnlockTransPointRsp{}) // 解锁场景传送点响应
c.registerMessage(ScenePointUnlockNotify, &proto.ScenePointUnlockNotify{}) // 场景传送点解锁通知
c.registerMessage(QueryPathReq, &proto.QueryPathReq{}) // 寻路请求
c.registerMessage(QueryPathRsp, &proto.QueryPathRsp{}) // 寻路响应
c.registerMessage(GetScenePointReq, &proto.GetScenePointReq{}) // 获取场景传送点请求
@@ -95,8 +96,10 @@ func (c *CmdProtoMap) registerAllMessage() {
c.registerMessage(WorldDataNotify, &proto.WorldDataNotify{}) // 世界数据通知 世界等级、是否多人世界等
c.registerMessage(WorldPlayerInfoNotify, &proto.WorldPlayerInfoNotify{}) // 世界玩家信息通知
c.registerMessage(HostPlayerNotify, &proto.HostPlayerNotify{}) // 世界房主玩家信息通知
c.registerMessage(ToTheMoonEnterSceneReq, &proto.ToTheMoonEnterSceneReq{}) // 进入场景请求
c.registerMessage(ToTheMoonEnterSceneRsp, &proto.ToTheMoonEnterSceneRsp{}) // 进入场景响应
c.registerMessage(PathfindingEnterSceneReq, &proto.PathfindingEnterSceneReq{}) // 寻路服务器进入场景请求
c.registerMessage(PathfindingEnterSceneRsp, &proto.PathfindingEnterSceneRsp{}) // 寻路服务器进入场景响应
c.registerMessage(ToTheMoonEnterSceneReq, &proto.ToTheMoonEnterSceneReq{}) // 寻路服务器进入场景请求
c.registerMessage(ToTheMoonEnterSceneRsp, &proto.ToTheMoonEnterSceneRsp{}) // 寻路服务器进入场景响应
c.registerMessage(SetEntityClientDataNotify, &proto.SetEntityClientDataNotify{}) // 通知
c.registerMessage(LeaveWorldNotify, &proto.LeaveWorldNotify{}) // 删除客户端世界通知
c.registerMessage(SceneAvatarStaminaStepReq, &proto.SceneAvatarStaminaStepReq{}) // 缓慢游泳或缓慢攀爬时消耗耐力请求
@@ -278,9 +281,9 @@ func (c *CmdProtoMap) registerAllMessage() {
c.registerMessage(VehicleStaminaNotify, &proto.VehicleStaminaNotify{}) // 载具耐力消耗通知
// 七圣召唤
c.registerMessage(GCGBasicDataNotify, &proto.GCGBasicDataNotify{}) // GCG基本数据通知
c.registerMessage(GCGLevelChallengeNotify, &proto.GCGLevelChallengeNotify{}) // GCG等级挑战通知
c.registerMessage(GCGDSBanCardNotify, &proto.GCGDSBanCardNotify{}) // GCG禁止的卡牌通知
c.registerMessage(GCGBasicDataNotify, &proto.GCGBasicDataNotify{}) // GCG基本数据通知
c.registerMessage(GCGLevelChallengeNotify, &proto.GCGLevelChallengeNotify{}) // GCG等级挑战通知
// c.registerMessage(GCGDSBanCardNotify, &proto.GCGDSBanCardNotify{}) // GCG禁止的卡牌通知
c.registerMessage(GCGDSDataNotify, &proto.GCGDSDataNotify{}) // GCG数据通知 (解锁的内容)
c.registerMessage(GCGTCTavernChallengeDataNotify, &proto.GCGTCTavernChallengeDataNotify{}) // GCG酒馆挑战数据通知
c.registerMessage(GCGTCTavernInfoNotify, &proto.GCGTCTavernInfoNotify{}) // GCG酒馆信息通知