Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
huangxiaolei
2022-12-01 00:22:35 +08:00
3 changed files with 101 additions and 66 deletions

View File

@@ -3,6 +3,7 @@ package constant
var StaminaCostConst *StaminaCost var StaminaCostConst *StaminaCost
type StaminaCost struct { type StaminaCost struct {
// 消耗耐力
CLIMBING int32 CLIMBING int32
CLIMB_START int32 CLIMB_START int32
CLIMB_JUMP int32 CLIMB_JUMP int32
@@ -15,7 +16,13 @@ type StaminaCost struct {
SWIMMING int32 SWIMMING int32
TALENT_DASH int32 TALENT_DASH int32
TALENT_DASH_START int32 TALENT_DASH_START int32
RESTORE int32 // 回复体 // 恢复耐
POWERED_FLY int32
POWERED_SKIFF int32
RUN int32
SKIFF int32
STANDBY int32
WALK int32
} }
func InitStaminaCostConst() { func InitStaminaCostConst() {
@@ -33,5 +40,10 @@ func InitStaminaCostConst() {
StaminaCostConst.SWIMMING = -80 StaminaCostConst.SWIMMING = -80
StaminaCostConst.TALENT_DASH = -300 StaminaCostConst.TALENT_DASH = -300
StaminaCostConst.TALENT_DASH_START = -1000 StaminaCostConst.TALENT_DASH_START = -1000
StaminaCostConst.RESTORE = 500 StaminaCostConst.POWERED_FLY = 500
StaminaCostConst.POWERED_SKIFF = 500
StaminaCostConst.RUN = 500
StaminaCostConst.SKIFF = 500
StaminaCostConst.STANDBY = 500
StaminaCostConst.WALK = 500
} }

View File

@@ -10,24 +10,25 @@ import (
// HandleStamina 处理即时耐力消耗 // HandleStamina 处理即时耐力消耗
func (g *GameManager) HandleStamina(player *model.Player, motionState proto.MotionState) { func (g *GameManager) HandleStamina(player *model.Player, motionState proto.MotionState) {
staminaInfo := player.StaminaInfo
logger.LOG.Debug("stamina handle, uid: %v, motionState: %v", player.PlayerID, motionState) logger.LOG.Debug("stamina handle, uid: %v, motionState: %v", player.PlayerID, motionState)
staminaInfo := player.StaminaInfo // 记录玩家的此时位置
// 记录玩家的此时状态
staminaInfo.CurState = motionState
staminaInfo.CurPos = &model.Vector{ staminaInfo.CurPos = &model.Vector{
X: player.Pos.X, X: player.Pos.X,
Y: player.Pos.Y, Y: player.Pos.Y,
Z: player.Pos.Z, Z: player.Pos.Z,
} }
// 未改变状态不消耗耐力 // 未改变状态执行后面没有意义
if motionState == staminaInfo.PrevState { if motionState == staminaInfo.State {
return return
} }
// 根据玩家的状态消耗耐力 // 设置用于持续消耗或恢复耐力的值
g.SetStaminaCost(player, motionState)
// 根据玩家的状态立刻消耗耐力
switch motionState { switch motionState {
case proto.MotionState_MOTION_STATE_CLIMB: case proto.MotionState_MOTION_STATE_CLIMB:
// 攀爬 // 攀爬
@@ -39,7 +40,7 @@ func (g *GameManager) HandleStamina(player *model.Player, motionState proto.Moti
// 攀爬跳跃 // 攀爬跳跃
g.UpdateStamina(player, constant.StaminaCostConst.CLIMB_JUMP) g.UpdateStamina(player, constant.StaminaCostConst.CLIMB_JUMP)
case proto.MotionState_MOTION_STATE_SWIM_DASH: case proto.MotionState_MOTION_STATE_SWIM_DASH:
// 游泳冲刺开始 // 游泳冲刺
g.UpdateStamina(player, constant.StaminaCostConst.SWIM_DASH_START) g.UpdateStamina(player, constant.StaminaCostConst.SWIM_DASH_START)
} }
} }
@@ -47,61 +48,83 @@ func (g *GameManager) HandleStamina(player *model.Player, motionState proto.Moti
// StaminaHandler 处理持续耐力消耗 // StaminaHandler 处理持续耐力消耗
func (g *GameManager) StaminaHandler(player *model.Player) { func (g *GameManager) StaminaHandler(player *model.Player) {
staminaInfo := player.StaminaInfo staminaInfo := player.StaminaInfo
isMoving := g.GetPlayerIsMoving(staminaInfo)
// 玩家最大耐力 // 添加的耐力大于0为恢复
maxStamina := player.PropertiesMap[constant.PlayerPropertyConst.PROP_MAX_STAMINA] if staminaInfo.Cost > 0 {
// 玩家现行耐力 // 耐力延迟1s(5 ticks)恢复 动作状态为加速将立刻恢复耐力
curStamina := player.PropertiesMap[constant.PlayerPropertyConst.PROP_CUR_PERSIST_STAMINA] if staminaInfo.RestoreDelay < 5 && staminaInfo.State != proto.MotionState_MOTION_STATE_POWERED_FLY && staminaInfo.State != proto.MotionState_MOTION_STATE_SKIFF_POWERED_DASH {
logger.LOG.Debug("stamina delay add, restoreDelay: %v", staminaInfo.RestoreDelay)
// 确保玩家需要执行耐力消耗
if isMoving || curStamina < maxStamina {
var staminaConst int32
// 根据状态决定要修改的耐力
// TODO 角色天赋 食物 会影响耐力消耗
switch staminaInfo.CurState {
case proto.MotionState_MOTION_STATE_CLIMB:
// 攀爬
if isMoving {
staminaConst = constant.StaminaCostConst.CLIMBING
}
case proto.MotionState_MOTION_STATE_DASH:
// 跑步加速
staminaConst = constant.StaminaCostConst.DASH
case proto.MotionState_MOTION_STATE_FLY, proto.MotionState_MOTION_STATE_FLY_FAST, proto.MotionState_MOTION_STATE_FLY_SLOW:
// 飞行
staminaConst = constant.StaminaCostConst.FLY
case proto.MotionState_MOTION_STATE_SWIM_MOVE:
// 游泳移动
staminaConst = constant.StaminaCostConst.SWIMMING
case proto.MotionState_MOTION_STATE_SWIM_DASH:
// 游泳加速
staminaConst = constant.StaminaCostConst.SWIM_DASH
case proto.MotionState_MOTION_STATE_SKIFF_DASH:
// 载具加速移动
// TODO 玩家使用载具时需要用载具的协议发送prop
staminaConst = constant.StaminaCostConst.SKIFF_DASH
default:
// 回复体力
staminaConst = constant.StaminaCostConst.RESTORE
}
// 耐力延迟1s(5 ticks)恢复
if staminaConst > 0 && staminaInfo.RestoreDelay < 5 {
staminaInfo.RestoreDelay++ staminaInfo.RestoreDelay++
// 不恢复耐力 return // 不恢复耐力
staminaConst = 0
} }
// 更新玩家耐力
g.UpdateStamina(player, staminaConst)
} }
// 替换老数据
staminaInfo.PrevState = staminaInfo.CurState // 更新玩家耐力
g.UpdateStamina(player, staminaInfo.Cost)
// 记录坐标 用于判断是否移动
staminaInfo.PrevPos = staminaInfo.CurPos staminaInfo.PrevPos = staminaInfo.CurPos
} }
// SetStaminaCost 设置动作需要消耗的耐力
func (g *GameManager) SetStaminaCost(player *model.Player, state proto.MotionState) {
staminaInfo := player.StaminaInfo
// 耐力消耗值
var cost int32
// 根据状态决定要修改的耐力
// TODO 角色天赋 食物 会影响耐力消耗
switch state {
// 消耗耐力
case proto.MotionState_MOTION_STATE_CLIMB:
// 攀爬
// TODO 不应该通过这种方式判断玩家是否移动 应该有更好的方式
if g.GetPlayerIsMoving(staminaInfo) {
cost = constant.StaminaCostConst.CLIMBING
}
case proto.MotionState_MOTION_STATE_DASH:
// 疾跑
cost = constant.StaminaCostConst.DASH
case proto.MotionState_MOTION_STATE_FLY, proto.MotionState_MOTION_STATE_FLY_FAST, proto.MotionState_MOTION_STATE_FLY_SLOW:
// 飞行
cost = constant.StaminaCostConst.FLY
case proto.MotionState_MOTION_STATE_SWIM_MOVE:
// 游泳移动
cost = constant.StaminaCostConst.SWIMMING
case proto.MotionState_MOTION_STATE_SWIM_DASH:
// 游泳加速
cost = constant.StaminaCostConst.SWIM_DASH
case proto.MotionState_MOTION_STATE_SKIFF_DASH:
// 小艇加速移动
// TODO 玩家使用载具时需要用载具的协议发送prop
cost = constant.StaminaCostConst.SKIFF_DASH
// 恢复耐力
case proto.MotionState_MOTION_STATE_DANGER_RUN, proto.MotionState_MOTION_STATE_RUN:
// 跑步
cost = 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:
// 站立
cost = constant.StaminaCostConst.STANDBY
case proto.MotionState_MOTION_STATE_DANGER_WALK, proto.MotionState_MOTION_STATE_WALK:
// 走路
cost = constant.StaminaCostConst.WALK
case proto.MotionState_MOTION_STATE_POWERED_FLY:
// 飞行加速 (风圈等)
cost = constant.StaminaCostConst.POWERED_FLY
case proto.MotionState_MOTION_STATE_SKIFF_POWERED_DASH:
// 小艇加速 (风圈等)
cost = constant.StaminaCostConst.POWERED_SKIFF
}
// 确保目前的动作状态会改变耐力
// 如果会则修改记录 tick执行时会调用数据
if cost != 0 {
staminaInfo.State = state
staminaInfo.Cost = cost
}
}
// GetPlayerIsMoving 玩家是否正在移动 // GetPlayerIsMoving 玩家是否正在移动
func (g *GameManager) GetPlayerIsMoving(staminaInfo *model.StaminaInfo) bool { func (g *GameManager) GetPlayerIsMoving(staminaInfo *model.StaminaInfo) bool {
if staminaInfo.PrevPos == nil || staminaInfo.CurPos == nil { if staminaInfo.PrevPos == nil || staminaInfo.CurPos == nil {
@@ -122,6 +145,7 @@ func (g *GameManager) UpdateStamina(player *model.Player, staminaCost int32) {
} }
// 消耗耐力重新计算恢复需要延迟的tick // 消耗耐力重新计算恢复需要延迟的tick
if staminaCost < 0 { if staminaCost < 0 {
logger.LOG.Debug("stamina delay reset, restoreDelay: %v", player.StaminaInfo.RestoreDelay)
player.StaminaInfo.RestoreDelay = 0 player.StaminaInfo.RestoreDelay = 0
} }

View File

@@ -1,13 +1,12 @@
package model package model
import ( import "hk4e/protocol/proto"
"hk4e/protocol/proto"
)
type StaminaInfo struct { type StaminaInfo struct {
PrevState proto.MotionState State proto.MotionState // 动作状态
PrevPos *Vector Cost int32 // 消耗或恢复的耐力
CurState proto.MotionState RestoreDelay uint8 // 恢复延迟
CurPos *Vector
RestoreDelay uint8 PrevPos *Vector
CurPos *Vector
} }