From 5dd722d3894ae0effed0de6cb5fd3d0038c55fdf Mon Sep 17 00:00:00 2001 From: UnKownOwO <80520429@qq.com> Date: Tue, 13 Dec 2022 20:08:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=80=E8=83=BD=E5=BC=80=E5=A7=8B=E8=80=90?= =?UTF-8?q?=E5=8A=9B=E6=B6=88=E8=80=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game_data_config/csv/AvatarSkillData.csv | 12 ++--- gs/constant/stamina_cost.go | 8 ++- gs/game/tick_manager.go | 2 +- gs/game/user_fight_sync.go | 6 +-- gs/game/user_stamina.go | 52 +++++++++++++------ 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/gdconf/game_data_config/csv/AvatarSkillData.csv b/gdconf/game_data_config/csv/AvatarSkillData.csv index 5abe5b56..541f4c78 100644 --- a/gdconf/game_data_config/csv/AvatarSkillData.csv +++ b/gdconf/game_data_config/csv/AvatarSkillData.csv @@ -1,6 +1,6 @@ AvatarSkillId,AbilityName,,,,CostStamina,CostElemType,CostElemVal,,,,,,,,,,,,,,,,,,,, int32,string,,,,int32,int32,int32,,,,,,,,,,,,,,,,,,,, -ID,Ability名称,是远程,技能CD,无视冷却缩减属性,消耗体力,消耗能量类型,消耗能量值,可累积次数,TriggerID,索敌范围,索敌公式权重1,索敌公式权重2,索敌公式权重3,索敌公式权重4,是默认镜头,支持按钮拖动,是否显示箭头,是否监控状态,默认锁定,图标名称,升级技能组ID,技能能量键值,消耗能量最小值,CanDoSkill为false强制可用,处理冷却所属技能槽,是否存档,shareCDID +ID,Ability鍚嶇О,鏄繙绋,鎶鑳紺D,鏃犺鍐峰嵈缂╁噺灞炴,娑堣椾綋鍔,娑堣楄兘閲忕被鍨,娑堣楄兘閲忓,鍙疮绉鏁,TriggerID,绱㈡晫鑼冨洿,绱㈡晫鍏紡鏉冮噸1,绱㈡晫鍏紡鏉冮噸2,绱㈡晫鍏紡鏉冮噸3,绱㈡晫鍏紡鏉冮噸4,鏄粯璁ら暅澶,鏀寔鎸夐挳鎷栧姩,鏄惁鏄剧ず绠ご,鏄惁鐩戞帶鐘舵,榛樿閿佸畾,鍥炬爣鍚嶇О,鍗囩骇鎶鑳界粍ID,鎶鑳借兘閲忛敭鍊,娑堣楄兘閲忔渶灏忓,CanDoSkill涓篺alse寮哄埗鍙敤,澶勭悊鍐峰嵈鎵灞炴妧鑳芥Ы,鏄惁瀛樻。,shareCDID 10001,,,0,,1,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,0,,,,,, 10002,,,0,,1,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,0,,,,,, 10003,,,0,,1,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,0,,,,,, @@ -11,7 +11,7 @@ ID,Ability 10102,,,10,,0,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,0,,,,,, 10111,,,0,,10,,,1,11,CircleLockEnemy,1,1,0.3,0,1,,,,,,0,,,,,, 10012,,,2,,0,,,1,2,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,0,,,,,, -10013,,,0,,1,,,1,3,CircleLockEnemyR5H6HC,1,1,0.3,0,,1,1,,,,233,,,1,,, +10013,,,0,,15,,,1,3,CircleLockEnemyR5H6HC,1,1,0.3,0,,1,1,,,,233,,,1,,, 10014,,,8,,0,4,30,1,5,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,0,,,,,, 10015,,,8,,0,,,1,4,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,0,,,,,, 10016,,,0,,0,,,1,4,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,0,,,,,, @@ -178,7 +178,7 @@ ID,Ability 10403,Diluc_FireCross,,12,,0,5,40,1,5,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,3639,,,,,, 10411,Avatar_Mona_ExtraAttack,,0,,0,,,1,0,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,4131,,,,,, 10412,,,12,,0,,,1,2,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,4132,,,,,, -10413,,,0,,1,,,1,3,CircleLockEnemyR5H6HC,1,1,0.3,0,,1,1,,,,4133,,,1,,, +10413,,,0,,15,,,1,3,CircleLockEnemyR5H6HC,1,1,0.3,0,,1,1,,,,4133,,,1,,, 10415,,,15,,0,2,60,1,5,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,4139,,,,,, 10421,Avatar_Keqing_ExtraAttack,,0,,0,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,4231,,,,,, 10422,,,7.5,,0,,,1,2,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,4232,,,,,, @@ -298,13 +298,13 @@ ID,Ability 10713,,,3,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,0,,,,2,, 10715,,,20,,0,4,80,1,5,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7139,,,,,, 10721,Avatar_Candace_ExtraAttack,,0,,0,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,7231,,,,,, -10722,·,,6,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,2,1,,,,7232,,,,,, +10722,路,,6,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,2,1,,,,7232,,,,,, 10725,,,15,,0,2,60,1,5,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7239,,,,,, 10731,Avatar_Nahida_ExtraAttack,,0,,0,,,1,0,CircleLockEnemyR10H6HC,1,1,0.3,0,1,,,,,,7331,,,,,, -10732,·,,5,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7332,,,,,, +10732,路,,5,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7332,,,,,, 10735,,,13.5,,0,3,50,1,5,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,7339,,,,,, 10741,Avatar_Layla_ExtraAttack,,0,,0,,,1,0,CircleLockEnemyR5H6HC,1,1,0.3,0,1,,,,,,7431,,,,,, -10742,·,,12,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7432,,,,,, +10742,路,,12,,0,,,1,2,CircleLockEnemyR8H6HC,1,1,0.3,0,1,,,,,,7432,,,,,, 10745,,,12,,0,5,40,1,5,CircleLockEnemyR15H10HC,1,1,0.3,0,1,,,,,,7439,,,,,, 20001,Dvalin_S01_AirGun,,0,,999999,,,1,0,CircleLockEnemyR10,1,1,0.3,0,1,2,1,,,,0,,,,,, 20002,Dvalin_S01_AirGun,,0,,0,,,1,0,CircleLockEnemyR10,1,1,0.3,0,1,2,1,,,,0,,,,,, diff --git a/gs/constant/stamina_cost.go b/gs/constant/stamina_cost.go index 9ac3df97..020fe65e 100644 --- a/gs/constant/stamina_cost.go +++ b/gs/constant/stamina_cost.go @@ -21,11 +21,13 @@ type StaminaCost struct { SKIFF int32 // 娓歌墖琛岄┒ STANDBY int32 // 绔欑珛 WALK int32 // 璧拌矾 - // 鎴樻枟鎶鑳 + // 姝﹀櫒娑堣楅粯璁ゅ FIGHT_SWORD_ONE_HAND int32 // 鍗曟墜鍓 FIGHT_POLE int32 // 闀挎灙 FIGHT_CATALYST int32 // 娉曞櫒 FIGHT_CLAYMORE_PER int32 // 鍙屾墜鍓 (姣忕娑堣) + // 鎶鑳藉紑濮嬫秷鑰 (鐩墠浠呭彂鐜扮猾鍗庝笌鑾鐨勫啿鍒轰細鏈夊紑濮嬫秷鑰) + SKILL_START map[uint32]int32 // [skillId]娑堣楀 } func InitStaminaCostConst() { @@ -51,4 +53,8 @@ func InitStaminaCostConst() { StaminaCostConst.FIGHT_POLE = -2500 StaminaCostConst.FIGHT_CATALYST = -5000 StaminaCostConst.FIGHT_CLAYMORE_PER = -4000 + StaminaCostConst.SKILL_START = map[uint32]int32{ + 10013: -1000, // 缁崕鍐插埡(闇版) + 10413: -1000, // 鑾鍐插埡(铏氬疄娴佸姩) + } } diff --git a/gs/game/tick_manager.go b/gs/game/tick_manager.go index 13cc39a5..86b28282 100644 --- a/gs/game/tick_manager.go +++ b/gs/game/tick_manager.go @@ -243,7 +243,7 @@ func (t *TickManager) onTick200MilliSecond(now int64) { // 鑰愬姏娑堣 for _, world := range WORLD_MANAGER.worldMap { for _, player := range world.playerMap { - GAME_MANAGER.StaminaHandler(player) + GAME_MANAGER.SustainStaminaHandler(player) } } } diff --git a/gs/game/user_fight_sync.go b/gs/game/user_fight_sync.go index c5908a8e..514a3215 100644 --- a/gs/game/user_fight_sync.go +++ b/gs/game/user_fight_sync.go @@ -137,7 +137,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p sceneEntity.lastMoveReliableSeq = entityMoveInfo.ReliableSeq // 澶勭悊鑰愬姏娑堣 - g.HandleStamina(player, motionInfo.State) + g.ImmediateStamina(player, motionInfo.State) player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) case proto.CombatTypeArgument_COMBAT_TYPE_ARGUMENT_ANIMATOR_STATE_CHANGED: @@ -280,8 +280,8 @@ func (g *GameManager) EvtDoSkillSuccNotify(player *model.Player, payloadMsg pb.M } logger.LOG.Debug("EvtDoSkillSuccNotify: %v", req) - // 璁板綍鑰愬姏娑堣楃殑鎶鑳絠d 鎶鑳芥寔缁秷鑰楅渶瑕佽繖涓幏鍙栧埌鎶鑳絠d - player.StaminaInfo.SetLastSkill(req.CasterId, req.SkillId) + // 澶勭悊鎶鑳藉紑濮嬬殑鑰愬姏娑堣 + g.SkillStartStamina(player, req.CasterId, req.SkillId) } func (g *GameManager) EvtAvatarEnterFocusNotify(player *model.Player, payloadMsg pb.Message) { diff --git a/gs/game/user_stamina.go b/gs/game/user_stamina.go index bddfb7e5..952a7804 100644 --- a/gs/game/user_stamina.go +++ b/gs/game/user_stamina.go @@ -24,7 +24,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab return } // 澶勭悊鎸佺画鑰愬姏娑堣 - g.HandleSkillSustainStamina(player) + g.SkillSustainStamina(player, costStamina.IsSwim) case proto.AbilityInvokeArgument_ABILITY_INVOKE_ARGUMENT_META_MODIFIER_CHANGE: // 鏅氳鑹查噸鍑昏愬姏娑堣 world := WORLD_MANAGER.GetWorldByID(player.WorldId) @@ -37,7 +37,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab abilityNameHashCode := uint32(0) for _, ability := range worldAvatar.abilityList { if ability.InstancedAbilityId == entry.Head.InstancedAbilityId { - logger.LOG.Error("%v", ability) + //logger.LOG.Error("%v", ability) abilityNameHashCode = ability.AbilityName.GetHash() } } @@ -56,7 +56,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab return } // 閲嶅嚮瀵瑰簲鐨勮愬姏娑堣 - g.HandleChargedAttackStamina(player, worldAvatar, avatarAbility) + g.ChargedAttackStamina(player, worldAvatar, avatarAbility) default: break } @@ -107,8 +107,8 @@ func (g *GameManager) SceneAvatarStaminaStepReq(player *model.Player, payloadMsg g.SendMsg(cmd.SceneAvatarStaminaStepRsp, player.PlayerID, player.ClientSeq, sceneAvatarStaminaStepRsp) } -// HandleStamina 澶勭悊鍗虫椂鑰愬姏娑堣 -func (g *GameManager) HandleStamina(player *model.Player, motionState proto.MotionState) { +// ImmediateStamina 澶勭悊鍗虫椂鑰愬姏娑堣 +func (g *GameManager) ImmediateStamina(player *model.Player, motionState proto.MotionState) { // 鐜╁鏆傚仠鐘舵佷笉鏇存柊鑰愬姏 if player.Pause { return @@ -144,8 +144,8 @@ func (g *GameManager) HandleStamina(player *model.Player, motionState proto.Moti } } -// HandleSkillSustainStamina 澶勭悊鎶鑳芥寔缁椂鐨勮愬姏娑堣 -func (g *GameManager) HandleSkillSustainStamina(player *model.Player) { +// SkillSustainStamina 澶勭悊鎶鑳芥寔缁椂鐨勮愬姏娑堣 +func (g *GameManager) SkillSustainStamina(player *model.Player, isSwim bool) { staminaInfo := player.StaminaInfo skillId := staminaInfo.LastSkillId @@ -186,17 +186,17 @@ func (g *GameManager) HandleSkillSustainStamina(player *model.Player) { pastTime := time.Now().UnixMilli() - staminaInfo.LastSkillTime // 鏍规嵁閰嶇疆浠ュ強璺濈涓婃鐨勬椂闂磋绠楁秷鑰楃殑鑰愬姏 costStamina = int32(float64(pastTime) / 1000 * float64(costStamina)) - logger.LOG.Debug("stamina skill sustain, skillId: %v, cost: %v", skillId, costStamina) + logger.LOG.Debug("stamina skill sustain, skillId: %v, cost: %v, isSwim: %v", skillId, costStamina, isSwim) // 鏍规嵁閰嶇疆浠ュ強璺濈涓婃鐨勬椂闂磋绠楁秷鑰楃殑鑰愬姏 g.UpdateStamina(player, costStamina) - // 璁板綍鏈鍚庨噴鏀剧殑鎶鑳 - player.StaminaInfo.SetLastSkill(staminaInfo.LastCasterId, staminaInfo.LastSkillId) + // 璁板綍鏈鍚庨噴鏀炬妧鑳界殑鏃堕棿 + player.StaminaInfo.LastSkillTime = time.Now().UnixMilli() } -// HandleChargedAttackStamina 澶勭悊閲嶅嚮鎶鑳藉嵆鏃惰愬姏娑堣 -func (g *GameManager) HandleChargedAttackStamina(player *model.Player, worldAvatar *WorldAvatar, skillData *gdconf.AvatarSkillData) { +// ChargedAttackStamina 澶勭悊閲嶅嚮鎶鑳藉嵆鏃惰愬姏娑堣 +func (g *GameManager) ChargedAttackStamina(player *model.Player, worldAvatar *WorldAvatar, skillData *gdconf.AvatarSkillData) { // 鑾峰彇鐜拌瑙掕壊鐨勯厤缃〃 avatarDataConfig, ok := gdconf.CONF.AvatarDataMap[int32(worldAvatar.avatarId)] if !ok { @@ -229,13 +229,31 @@ func (g *GameManager) HandleChargedAttackStamina(player *model.Player, worldAvat // 鏍规嵁閰嶇疆娑堣楄愬姏 g.UpdateStamina(player, costStamina) - - // 璁板綍鏈鍚庨噴鏀剧殑鎶鑳 - player.StaminaInfo.SetLastSkill(worldAvatar.avatarEntityId, uint32(skillData.AvatarSkillId)) } -// StaminaHandler 澶勭悊鎸佺画鑰愬姏娑堣 -func (g *GameManager) StaminaHandler(player *model.Player) { +// SkillStartStamina 澶勭悊鎶鑳藉紑濮嬫椂鐨勫嵆鏃惰愬姏娑堣 +func (g *GameManager) SkillStartStamina(player *model.Player, casterId uint32, skillId uint32) { + staminaInfo := player.StaminaInfo + + // 鑾峰彇璇ユ妧鑳藉紑濮嬫椂鎵闇娑堣楃殑鑰愬姏 + costStamina := constant.StaminaCostConst.SKILL_START[skillId] + logger.LOG.Debug("skill start stamina, skillId: %v, cost: %v", skillId, costStamina) + + // 璺濈涓婃澶勭悊鎶鑳藉紑濮嬭愬姏娑堣楄繃鍘荤殑鏃堕棿 + pastTime := time.Now().UnixMilli() - staminaInfo.LastSkillTime + // 涓婃瑙﹀彂鐨勬妧鑳界浉鍚屽垯姣400ms瑙﹀彂涓娆℃秷鑰 + if staminaInfo.LastSkillId == skillId && pastTime < 400 { + return + } + // 鏍规嵁閰嶇疆娑堣楄愬姏 + g.UpdateStamina(player, costStamina) + + // 璁板綍鏈鍚庨噴鏀剧殑鎶鑳 + player.StaminaInfo.SetLastSkill(casterId, skillId) +} + +// SustainStaminaHandler 澶勭悊鎸佺画鑰愬姏娑堣 +func (g *GameManager) SustainStaminaHandler(player *model.Player) { // 鐜╁鏆傚仠鐘舵佷笉鏇存柊鑰愬姏 if player.Pause { return