private static List <PlayerEntity> OnePlayerHealthDamage(Contexts contexts, IGameRule gameRule, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, IDamageInfoCollector damageInfoCollector, bool isTeam)
        {
            if (playerEntity.gamePlay.IsDead())
            {
                return(null);
            }

            float curHp      = playerEntity.gamePlay.CurHp;
            float realDamage = damage.damage;

            if (gameRule != null)
            {
                realDamage = gameRule.HandleDamage(srcPlayer, playerEntity, damage);
            }
            if (null != damageInfoCollector)
            {
                damageInfoCollector.SetPlayerDamageInfo(srcPlayer, playerEntity, realDamage, (EBodyPart)damage.part);
            }
            if (!SharedConfig.IsOffline && !SharedConfig.IsServer)
            {
                return(null);
            }

            float ret = playerEntity.gamePlay.DecreaseHp(realDamage);

            damage.damage = ret;

            //玩家状态
            List <PlayerEntity> teamList = CheckUpdatePlayerStatus(playerEntity, damage, !isTeam && gameRule != null ? gameRule.Contexts : null);

            //保存最后伤害来源
            StatisticsData statisticsData = playerEntity.statisticsData.Statistics;

            if (statisticsData.DataCollectSwitch)
            {
                if (playerEntity.gamePlay.IsLastLifeState(EPlayerLifeState.Alive))
                {
                    statisticsData.IsHited = true;
                    if (null != srcPlayer)
                    {
                        statisticsData.LastHurtKey = srcPlayer.entityKey.Value;
                    }
                    else
                    {
                        statisticsData.LastHurtKey = EntityKey.Default;
                    }
                    statisticsData.LastHurtType     = damage.type;
                    statisticsData.LastHurtPart     = damage.part;
                    statisticsData.LastHurtWeaponId = damage.weaponId;
                }

                //谁击倒算谁的人头
                if (statisticsData.IsHited)
                {
                    if (gameRule != null)
                    {
                        PlayerEntity lastEntity = gameRule.Contexts.player.GetEntityWithEntityKey(statisticsData.LastHurtKey);
                        if (null != lastEntity)
                        {
                            srcPlayer = lastEntity;
                        }
                    }
                    damage.type     = statisticsData.LastHurtType;
                    damage.part     = statisticsData.LastHurtPart;
                    damage.weaponId = statisticsData.LastHurtWeaponId;
                }

                if (playerEntity.gamePlay.IsDead())
                {
                    //UI击杀信息
                    int killType = 0;
                    if (damage.part == (int)EBodyPart.Head)
                    {
                        killType |= (int)EUIKillType.Crit;
                    }
                    if (playerEntity.gamePlay.IsHitDown())
                    {
                        killType |= (int)EUIKillType.Hit;
                    }
                    damage.KillType = killType;
                    //UI击杀反馈
                    if (null != srcPlayer && srcPlayer.playerInfo.TeamId != playerEntity.playerInfo.TeamId)
                    {
                        int feedbackType = 0;
                        if (damage.part == (int)EBodyPart.Head)
                        {
                            //爆头
                            feedbackType |= 1 << (int)EUIKillFeedbackType.CritKill;
                        }
                        if (damage.IsOverWall)
                        {
                            //穿墙击杀
                            feedbackType |= 1 << (int)EUIKillFeedbackType.ThroughWall;
                        }
                        if (SharedConfig.IsServer && null != gameRule && gameRule.Contexts.session.serverSessionObjects.DeathOrder == 0 && srcPlayer.playerInfo.TeamId != playerEntity.playerInfo.TeamId)
                        {
                            //一血
                            feedbackType |= 1 << (int)EUIKillFeedbackType.FirstBlood;
                        }
                        if (playerEntity.playerInfo.PlayerId == srcPlayer.statisticsData.Statistics.RevengeKillerId)
                        {
                            //复仇
                            feedbackType |= 1 << (int)EUIKillFeedbackType.Revenge;
                            srcPlayer.statisticsData.Statistics.RevengeKillerId = 0L;
                        }
                        //武器
                        WeaponResConfigItem newConfig = SingletonManager.Get <WeaponResourceConfigManager>().GetConfigById(damage.weaponId);
                        if (null != newConfig)
                        {
                            if (newConfig.SubType == (int)EWeaponSubType.Melee)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.MeleeWeapon;
                            }
                            else if (newConfig.SubType == (int)EWeaponSubType.BurnBomb)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.Burning;
                            }
                            else if (newConfig.SubType == (int)EWeaponSubType.Grenade)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.Grenade;
                            }
                        }
                        if (feedbackType == 0)
                        {
                            //普通击杀
                            feedbackType = 1 << (int)EUIKillFeedbackType.Normal;
                        }
                        damage.KillFeedbackType = feedbackType;
                    }
                }

                //数据统计
                ProcessDamageStatistics(contexts, gameRule, srcPlayer, playerEntity, damage);
            }

            //击杀|击倒
            if (null != gameRule && playerEntity.gamePlay.IsDead())
            {
                gameRule.KillPlayer(srcPlayer, playerEntity, damage);
            }

            _logger.DebugFormat("change player hp entityId:{0}, health {1}->{2}, state {3}, srcPlayerId:{4}, playerId:{5}, hurtType:{6}, weaponId:{7}", playerEntity.entityKey.Value.EntityId, curHp, playerEntity.gamePlay.CurHp, playerEntity.gamePlay.LifeState, (srcPlayer != null) ? srcPlayer.playerInfo.PlayerId : 0, playerEntity.playerInfo.PlayerId, damage.type, damage.weaponId);

            return(teamList);
        }
Exemple #2
0
        private static List <PlayerEntity> OnePlayerHealthDamage(Contexts contexts, IGameRule gameRule, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, IDamageInfoCollector damageInfoCollector, bool isTeam)
        {
            if (playerEntity.gamePlay.IsDead())
            {
                return(null);
            }

            if ((DateTime.Now.Ticks / 10000L) - playerEntity.statisticsData.Statistics.LastHitDownTime <= 1000 && !damage.InstantDeath)
            {
                return(null);
            }

            float curHp      = playerEntity.gamePlay.CurHp;
            float realDamage = damage.damage;

            if (gameRule != null)
            {
                realDamage = gameRule.HandleDamage(srcPlayer, playerEntity, damage);
            }
            if (null != damageInfoCollector)
            {
                damageInfoCollector.SetPlayerDamageInfo(srcPlayer, playerEntity, realDamage, (EBodyPart)damage.part);
            }
            if (!SharedConfig.IsOffline && !SharedConfig.IsServer)
            {
                return(null);
            }

            float ret = playerEntity.gamePlay.DecreaseHp(realDamage);

            _logger.InfoFormat("[hit] after CurrHp :" + playerEntity.gamePlay.CurHp);
            damage.damage = ret;

            //玩家状态
            List <PlayerEntity> teamList = CheckUpdatePlayerStatus(playerEntity, damage, !isTeam && gameRule != null ? gameRule.Contexts : null);

            //保存最后伤害来源
            StatisticsData statisticsData = playerEntity.statisticsData.Statistics;

            if (statisticsData.DataCollectSwitch)
            {
                if (playerEntity.gamePlay.IsLastLifeState(EPlayerLifeState.Alive))
                {
                    statisticsData.IsHited = true;
                    if (null != srcPlayer)
                    {
                        statisticsData.LastHurtKey = srcPlayer.entityKey.Value;
                    }
                    else
                    {
                        statisticsData.LastHurtKey = EntityKey.Default;
                    }
                    statisticsData.LastHurtType     = damage.type;
                    statisticsData.LastHurtPart     = damage.part;
                    statisticsData.LastHurtWeaponId = damage.weaponId;
                }

                //击倒人头
                if (statisticsData.IsHited && (damage.type == (int)EUIDeadType.NoHelp || damage.type == (int)EUIDeadType.Poison || damage.type == (int)EUIDeadType.Bomb ||
                                               damage.type == (int)EUIDeadType.Drown || damage.type == (int)EUIDeadType.Bombing || damage.type == (int)EUIDeadType.Fall))
                {
                    if (gameRule != null)
                    {
                        PlayerEntity lastEntity = gameRule.Contexts.player.GetEntityWithEntityKey(statisticsData.LastHurtKey);
                        if (null != lastEntity)
                        {
                            srcPlayer = lastEntity;
                            if (srcPlayer.playerInfo.TeamId == playerEntity.playerInfo.TeamId)
                            {
                                damage.type     = statisticsData.LastHurtType;
                                damage.part     = statisticsData.LastHurtPart;
                                damage.weaponId = statisticsData.LastHurtWeaponId;
                            }
                            else
                            {
                                damage.type = (int)EUIDeadType.NoHelp;
                            }
                        }
                    }
                }

                if (playerEntity.gamePlay.IsHitDown())
                {
                    statisticsData.LastHitDownTime = (DateTime.Now.Ticks / 10000L);
                    SimpleProto message = FreePool.Allocate();
                    message.Key = FreeMessageConstant.ScoreInfo;
                    int feedbackType = 0;
                    message.Ks.Add(3);
                    message.Bs.Add(true);
                    if (null != srcPlayer)
                    {
                        if (srcPlayer.playerInfo.TeamId != playerEntity.playerInfo.TeamId)
                        {
                            feedbackType |= 1 << (int)EUIKillFeedbackType.Hit;
                        }
                        message.Ss.Add(srcPlayer.playerInfo.PlayerName);
                        message.Ds.Add(srcPlayer.playerInfo.TeamId);
                        message.Ins.Add(damage.weaponId);
                    }
                    else
                    {
                        message.Ss.Add("");
                        message.Ds.Add(-1);
                        message.Ins.Add(0);
                    }
                    message.Ins.Add((int)EUIKillType.Hit);
                    message.Ins.Add(feedbackType);
                    message.Ss.Add(playerEntity.playerInfo.PlayerName);
                    message.Ds.Add(playerEntity.playerInfo.TeamId);
                    message.Ins.Add(damage.type);
                    SendMessageAction.sender.SendMessage(contexts.session.commonSession.FreeArgs as IEventArgs, message, 4, string.Empty);
                }

                if (playerEntity.gamePlay.IsDead())
                {
                    //UI击杀信息
                    int killType = 0;
                    if (damage.part == (int)EBodyPart.Head)
                    {
                        killType |= (int)EUIKillType.Crit;
                    }
                    damage.KillType = killType;
                    playerEntity.playerInfo.SpecialFeedbackType = 0;
                    //UI击杀反馈
                    if (null != srcPlayer && srcPlayer.playerInfo.TeamId != playerEntity.playerInfo.TeamId)
                    {
                        int feedbackType = 0;
                        if (damage.part == (int)EBodyPart.Head)
                        {
                            //爆头
                            feedbackType |= 1 << (int)EUIKillFeedbackType.CritKill;
                        }
                        if (damage.IsOverWall)
                        {
                            //穿墙击杀
                            feedbackType |= 1 << (int)EUIKillFeedbackType.ThroughWall;
                        }
                        if (SharedConfig.IsServer && null != gameRule && gameRule.Contexts.session.serverSessionObjects.DeathOrder == 0 && srcPlayer.playerInfo.TeamId != playerEntity.playerInfo.TeamId)
                        {
                            //一血
                            feedbackType |= 1 << (int)EUIKillFeedbackType.FirstBlood;
                        }
                        if (playerEntity.playerInfo.PlayerId == srcPlayer.statisticsData.Statistics.RevengeKillerId)
                        {
                            //复仇
                            feedbackType |= 1 << (int)EUIKillFeedbackType.Revenge;
                            srcPlayer.statisticsData.Statistics.RevengeKillerId = 0L;
                        }
                        if (srcPlayer.playerInfo.JobAttribute == (int)EJobAttribute.EJob_Hero)
                        {
                            //英雄击杀
                            feedbackType |= 1 << (int)EUIKillFeedbackType.HeroKO;
                            playerEntity.playerInfo.SpecialFeedbackType = (int)EUIKillFeedbackType.HeroKO;
                        }
                        //武器
                        WeaponResConfigItem newConfig = SingletonManager.Get <WeaponResourceConfigManager>().GetConfigById(damage.weaponId);
                        if (null != newConfig)
                        {
                            if (newConfig.SubType == (int)EWeaponSubType.Melee)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.MeleeWeapon;
                                playerEntity.playerInfo.SpecialFeedbackType = (int)EUIKillFeedbackType.MeleeWeapon;
                            }
                            else if (newConfig.SubType == (int)EWeaponSubType.BurnBomb)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.Burning;
                            }
                            else if (newConfig.SubType == (int)EWeaponSubType.Grenade)
                            {
                                feedbackType |= 1 << (int)EUIKillFeedbackType.Grenade;
                            }
                        }
                        if (feedbackType == 0)
                        {
                            //普通击杀
                            feedbackType = 1 << (int)EUIKillFeedbackType.Normal;
                        }
                        damage.KillFeedbackType = feedbackType;
                    }
                }

                //数据统计
                ProcessDamageStatistics(contexts, gameRule, srcPlayer, playerEntity, damage);
            }

            //击杀|击倒
            if (null != gameRule && playerEntity.gamePlay.IsDead())
            {
                gameRule.KillPlayer(srcPlayer, playerEntity, damage);
            }

            _logger.DebugFormat("change player hp entityId:{0}, health {1}->{2}, state {3}, srcPlayerId:{4}, playerId:{5}, hurtType:{6}, weaponId:{7}", playerEntity.entityKey.Value.EntityId, curHp, playerEntity.gamePlay.CurHp, playerEntity.gamePlay.LifeState, (srcPlayer != null) ? srcPlayer.playerInfo.PlayerId : 0, playerEntity.playerInfo.PlayerId, damage.type, damage.weaponId);

            return(teamList);
        }