public BulletHitHandler(Contexts contexts, IEntityIdGenerator entityIdGenerator, IPlayerDamager damager, IDamageInfoCollector damageInfoCollector, ISoundEntityFactory soundEntityFactory, IEnvironmentTypeConfigManager environmentTypeConfigManager) { _contexts = contexts; this._entityIdGenerator = entityIdGenerator; _damager = damager; _damageInfoCollector = damageInfoCollector; _soundEntityFactory = soundEntityFactory; _environmentTypeConfigManager = environmentTypeConfigManager; _sceneObjectEntityFactory = _contexts.session.entityFactoryObject.SceneObjectEntityFactory; _triggerObjectManager = SingletonManager.Get <TriggerObjectManager>(); }
public MeleeHitHandler( IPlayerDamager damager, ClientEffectContext context, IEntityIdGenerator idGenerator, IDamageInfoCollector damageInfoCollector, ISoundEntityFactory soundEntityFactory) { _damager = damager; _clientEffectContext = context; _entityIdGenerator = idGenerator; _damageInfoCollector = damageInfoCollector; _soundEntityFactory = soundEntityFactory; }
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); }
public static void DoProcessPlayerHealthDamage(Contexts contexts, IGameRule gameRule, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, IDamageInfoCollector damageInfoCollector) { List <PlayerEntity> teamList = OnePlayerHealthDamage(contexts, gameRule, srcPlayer, playerEntity, damage, damageInfoCollector, false); if (null != teamList) { //队友 foreach (PlayerEntity other in teamList) { PlayerDamageInfo damageInfo = new PlayerDamageInfo(other.gamePlay.InHurtedHp, (int)EUIDeadType.NoHelp, (int)EBodyPart.Chest, 0); OnePlayerHealthDamage(contexts, gameRule, null, other, damageInfo, damageInfoCollector, true); } } }
public static void DoProcessPlayerHealthDamage(Contexts contexts, IPlayerDamager damager, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, IDamageInfoCollector damageInfoCollector) { IGameRule gameRule = null != damager ? damager.GameRule : null; DoProcessPlayerHealthDamage(contexts, gameRule, srcPlayer, playerEntity, damage, damageInfoCollector); }
public static void ProcessPlayerHealthDamage(Contexts contexts, IPlayerDamager damager, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, IDamageInfoCollector damageInfoCollector) { if (null == damageInfoCollector) { _logger.Error("damageInfoCollector is null"); } DoProcessPlayerHealthDamage(contexts, damager, srcPlayer, playerEntity, damage, damageInfoCollector); }
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); }
public static void OnEnvironmentHit(PlayerContext playerContext, IPlayerDamager damager, IDamageInfoCollector damageInfoCollector) { if (!_active) { return; } var player = playerContext.flagSelfEntity; BulletPlayerUtility.ProcessPlayerHealthDamage( damager, player, player, new PlayerDamageInfo(10, (int)EUIDeadType.Weapon, (int)EBodyPart.Chest, player.weaponLogicInfo.WeaponId), damageInfoCollector); }