mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 16:02:26 +08:00
完美解决多人联机角色动画同步的全部问题
This commit is contained in:
@@ -101,24 +101,24 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
for _, entry := range req.InvokeList {
|
for _, entry := range req.InvokeList {
|
||||||
switch entry.ArgumentType {
|
switch entry.ArgumentType {
|
||||||
case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT:
|
case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT:
|
||||||
hitInfo := new(proto.EvtBeingHitInfo)
|
evtBeingHitInfo := new(proto.EvtBeingHitInfo)
|
||||||
err := pb.Unmarshal(entry.CombatData, hitInfo)
|
err := pb.Unmarshal(entry.CombatData, evtBeingHitInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("parse EvtBeingHitInfo error: %v", err)
|
logger.Error("parse EvtBeingHitInfo error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
attackResult := hitInfo.AttackResult
|
// logger.Debug("EvtBeingHitInfo: %v, ForwardType: %v", evtBeingHitInfo, entry.ForwardType)
|
||||||
|
attackResult := evtBeingHitInfo.AttackResult
|
||||||
if attackResult == nil {
|
if attackResult == nil {
|
||||||
logger.Error("attackResult is nil")
|
logger.Error("attackResult is nil")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// logger.Debug("run attack handler, attackResult: %v", attackResult)
|
|
||||||
target := scene.GetEntity(attackResult.DefenseId)
|
target := scene.GetEntity(attackResult.DefenseId)
|
||||||
if target == nil {
|
if target == nil {
|
||||||
logger.Error("could not found target, defense id: %v", attackResult.DefenseId)
|
logger.Error("could not found target, defense id: %v", attackResult.DefenseId)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
attackResult.Damage *= 10
|
attackResult.Damage *= 100
|
||||||
damage := attackResult.Damage
|
damage := attackResult.Damage
|
||||||
attackerId := attackResult.AttackerId
|
attackerId := attackResult.AttackerId
|
||||||
_ = attackerId
|
_ = attackerId
|
||||||
@@ -140,7 +140,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
if currHp == 0 && target.GetEntityType() != constant.ENTITY_TYPE_AVATAR {
|
if currHp == 0 && target.GetEntityType() != constant.ENTITY_TYPE_AVATAR {
|
||||||
scene.SetEntityLifeState(target, constant.LIFE_STATE_DEAD, proto.PlayerDieType_PLAYER_DIE_GM)
|
scene.SetEntityLifeState(target, constant.LIFE_STATE_DEAD, proto.PlayerDieType_PLAYER_DIE_GM)
|
||||||
}
|
}
|
||||||
combatData, err := pb.Marshal(hitInfo)
|
combatData, err := pb.Marshal(evtBeingHitInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("create combat invocations entity hit info error: %v", err)
|
logger.Error("create combat invocations entity hit info error: %v", err)
|
||||||
}
|
}
|
||||||
@@ -153,6 +153,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
logger.Error("parse EntityMoveInfo error: %v", err)
|
logger.Error("parse EntityMoveInfo error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// logger.Debug("EntityMoveInfo: %v, ForwardType: %v", entityMoveInfo, entry.ForwardType)
|
||||||
motionInfo := entityMoveInfo.MotionInfo
|
motionInfo := entityMoveInfo.MotionInfo
|
||||||
if motionInfo.Pos == nil || motionInfo.Rot == nil {
|
if motionInfo.Pos == nil || motionInfo.Rot == nil {
|
||||||
continue
|
continue
|
||||||
@@ -208,11 +209,11 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
sceneEntity.SetMoveState(uint16(motionInfo.State))
|
sceneEntity.SetMoveState(uint16(motionInfo.State))
|
||||||
sceneEntity.SetLastMoveSceneTimeMs(entityMoveInfo.SceneTime)
|
sceneEntity.SetLastMoveSceneTimeMs(entityMoveInfo.SceneTime)
|
||||||
sceneEntity.SetLastMoveReliableSeq(entityMoveInfo.ReliableSeq)
|
sceneEntity.SetLastMoveReliableSeq(entityMoveInfo.ReliableSeq)
|
||||||
|
// 众里寻他千百度 蓦然回首 那人却在灯火阑珊处
|
||||||
if motionInfo.State == proto.MotionState_MOTION_NOTIFY {
|
if motionInfo.State == proto.MotionState_MOTION_NOTIFY || motionInfo.State == proto.MotionState_MOTION_FIGHT {
|
||||||
|
// 只要转发了这两个包的其中之一 客户端的动画就会被打断
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
||||||
case proto.CombatTypeArgument_COMBAT_ANIMATOR_PARAMETER_CHANGED:
|
case proto.CombatTypeArgument_COMBAT_ANIMATOR_PARAMETER_CHANGED:
|
||||||
evtAnimatorParameterInfo := new(proto.EvtAnimatorParameterInfo)
|
evtAnimatorParameterInfo := new(proto.EvtAnimatorParameterInfo)
|
||||||
@@ -222,19 +223,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// logger.Debug("EvtAnimatorParameterInfo: %v, ForwardType: %v", evtAnimatorParameterInfo, entry.ForwardType)
|
// logger.Debug("EvtAnimatorParameterInfo: %v, ForwardType: %v", evtAnimatorParameterInfo, entry.ForwardType)
|
||||||
// 这是否?
|
|
||||||
evtAnimatorParameterInfo.IsServerCache = false
|
|
||||||
newCombatData, err := pb.Marshal(evtAnimatorParameterInfo)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("build EvtAnimatorParameterInfo error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
entry.CombatData = newCombatData
|
|
||||||
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
||||||
// g.SendToWorldAEC(world, cmd.EvtAnimatorParameterNotify, player.ClientSeq, &proto.EvtAnimatorParameterNotify{
|
|
||||||
// AnimatorParamInfo: evtAnimatorParameterInfo,
|
|
||||||
// ForwardType: entry.ForwardType,
|
|
||||||
// }, player.PlayerID)
|
|
||||||
case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED:
|
case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED:
|
||||||
evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo)
|
evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo)
|
||||||
err := pb.Unmarshal(entry.CombatData, evtAnimatorStateChangedInfo)
|
err := pb.Unmarshal(entry.CombatData, evtAnimatorStateChangedInfo)
|
||||||
@@ -243,20 +232,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// logger.Debug("EvtAnimatorStateChangedInfo: %v, ForwardType: %v", evtAnimatorStateChangedInfo, entry.ForwardType)
|
// logger.Debug("EvtAnimatorStateChangedInfo: %v, ForwardType: %v", evtAnimatorStateChangedInfo, entry.ForwardType)
|
||||||
// 试试看?
|
|
||||||
evtAnimatorStateChangedInfo.HandleAnimatorStateImmediately = true
|
|
||||||
evtAnimatorStateChangedInfo.ForceSync = true
|
|
||||||
newCombatData, err := pb.Marshal(evtAnimatorStateChangedInfo)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("build EvtAnimatorParameterInfo error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
entry.CombatData = newCombatData
|
|
||||||
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
||||||
// g.SendToWorldAEC(world, cmd.EvtAnimatorStateChangedNotify, player.ClientSeq, &proto.EvtAnimatorStateChangedNotify{
|
|
||||||
// ForwardType: entry.ForwardType,
|
|
||||||
// EvtAnimatorStateChangedInfo: evtAnimatorStateChangedInfo,
|
|
||||||
// }, player.PlayerID)
|
|
||||||
default:
|
default:
|
||||||
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,24 +28,24 @@ func (g *GameManager) EnterSceneReadyReq(player *model.Player, payloadMsg pb.Mes
|
|||||||
logger.Debug("player enter scene ready, uid: %v", player.PlayerID)
|
logger.Debug("player enter scene ready, uid: %v", player.PlayerID)
|
||||||
world := WORLD_MANAGER.GetWorldByID(player.WorldId)
|
world := WORLD_MANAGER.GetWorldByID(player.WorldId)
|
||||||
|
|
||||||
enterSceneContext := world.GetEnterSceneContextByToken(req.EnterSceneToken)
|
ctx := world.GetEnterSceneContextByToken(req.EnterSceneToken)
|
||||||
if enterSceneContext == nil {
|
if ctx == nil {
|
||||||
logger.Error("get enter scene context is nil, uid: %v", player.PlayerID)
|
logger.Error("get enter scene context is nil, uid: %v", player.PlayerID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if enterSceneContext.OldSceneId != 0 {
|
if ctx.OldSceneId != 0 {
|
||||||
aoiManager, exist := WORLD_MANAGER.GetSceneBlockAoiMap()[enterSceneContext.OldSceneId]
|
aoiManager, exist := WORLD_MANAGER.GetSceneBlockAoiMap()[ctx.OldSceneId]
|
||||||
if !exist {
|
if !exist {
|
||||||
logger.Error("player scene not exist in aoi, sceneId: %v, uid: %v", enterSceneContext.OldSceneId, player.PlayerID)
|
logger.Error("player scene not exist in aoi, sceneId: %v, uid: %v", ctx.OldSceneId, player.PlayerID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
objectList := aoiManager.GetObjectListByPos(float32(enterSceneContext.OldPos.X), 0.0, float32(enterSceneContext.OldPos.Z))
|
objectList := aoiManager.GetObjectListByPos(float32(ctx.OldPos.X), 0.0, float32(ctx.OldPos.Z))
|
||||||
delEntityIdList := make([]uint32, 0)
|
delEntityIdList := make([]uint32, 0)
|
||||||
oldScene := world.GetSceneById(enterSceneContext.OldSceneId)
|
oldScene := world.GetSceneById(ctx.OldSceneId)
|
||||||
for _, groupAny := range objectList {
|
for _, groupAny := range objectList {
|
||||||
groupConfig := groupAny.(*gdconf.Group)
|
groupConfig := groupAny.(*gdconf.Group)
|
||||||
distance2D := math.Sqrt((player.Pos.X-float64(groupConfig.Pos.X))*(player.Pos.X-float64(groupConfig.Pos.X)) +
|
distance2D := math.Sqrt((ctx.OldPos.X-float64(groupConfig.Pos.X))*(ctx.OldPos.X-float64(groupConfig.Pos.X)) +
|
||||||
(player.Pos.Z-float64(groupConfig.Pos.Z))*(player.Pos.Z-float64(groupConfig.Pos.Z)))
|
(ctx.OldPos.Z-float64(groupConfig.Pos.Z))*(ctx.OldPos.Z-float64(groupConfig.Pos.Z)))
|
||||||
if distance2D > ENTITY_LOD {
|
if distance2D > ENTITY_LOD {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user