private void DoHitPlayer(PlayerEntity srcPlayer, IBulletEntityAgent bulletEntityAgent, RaycastHit hit) { Collider collider = hit.collider; bulletEntityAgent.SetAnimationAndColliderText(hitTargetPlayer.networkAnimator.ToStringExt(), GetCollidersDebugDatas(hitTargetPlayer)); EBodyPart part = BulletPlayerUtil.GetBodyPartByHitBoxName(collider); BulletHitHandler._logger.InfoFormat("[Hit{0}]HitPlayer in {1}", cmdSeq, part); float hitboxFactor = bulletEntityAgent.GetDamageFactor(part); float totalDamage = GetBulletDamage(bulletEntityAgent, hitboxFactor, Vector3.Distance(hit.point, bulletEntityAgent.GunEmitPosition)); bulletEntityAgent.IsValid = false; //由于动画放在客户端做了,服务器调用的命令会被忽视,需要发送事件到客户端 // if (hitTargetPlayer.hasStateInterface && hitTargetPlayer.stateInterface.State.CanBeenHit()) // { // hitTargetPlayer.stateInterface.State.BeenHit(); // } ClientEffectFactory.AddBeenHitEvent(srcPlayer, hitTargetPlayer, AttackUtil.GeneraterUniqueHitId(srcPlayer, cmdSeq), contexts.session.currentTimeObject.CurrentTime); //添加假红统计 if (hitTargetPlayer.gamePlay.IsAlive()) { srcPlayer.StatisticsController().AddShootPlayer(cmdSeq, bulletEntityAgent, hit.point, hitTargetPlayer.entityKey.Value, hitTargetPlayer.position.Value, part, totalDamage); } ClientEffectFactory.AddHitPlayerEffectEvent(srcPlayer, hitTargetPlayer.entityKey.Value, hit.point, (int)EAudioUniqueId.BulletHit, part); BulletHitHandler._logger.InfoFormat("[Hit{5}]bullet from {0} hit player {1}, part {2}, hitbox factor {3}, result damage {4}", bulletEntityAgent.OwnerEntityKey, hitTargetPlayer.entityKey.Value, collider, hitboxFactor, totalDamage, cmdSeq); if (!hitTargetPlayer.gamePlay.IsLastLifeState(EPlayerLifeState.Dead)) { //有效命中 if (hitTargetPlayer.gamePlay.IsLastLifeState(EPlayerLifeState.Alive)) { srcPlayer.statisticsData.Statistics.ShootingPlayerCount++; } srcPlayer.statisticsData.Statistics.ShootingSuccCount++; } BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, damager, srcPlayer, hitTargetPlayer, new PlayerDamageInfo(totalDamage, (int)EUIDeadType.Weapon, (int)part, bulletEntityAgent.WeaponId, bulletEntityAgent.IsOverWall, false, false, bulletEntityAgent.HitPoint, bulletEntityAgent.Velocity)); DebugUtil.AppendShootText(cmdSeq, "[HitPlayer]hitPoint:{0},collider:{1},totalDamage:{2},part:{3}", hit.point, hit.collider, totalDamage, part); }
public void OnHitPlayer(Contexts contexts, PlayerEntity src, PlayerEntity target, RaycastHit hit, MeleeAttackInfo attackInfo, MeleeFireLogicConfig config, int seq) { EBodyPart part = BulletPlayerUtil.GetBodyPartByHitBoxName(hit.collider); var baseDamage = MeleeHitUtil.GetPlayerFactor(hit, config, part) * MeleeHitUtil.GetBaseDamage(attackInfo, config); if (src.hasStatisticsData) { src.statisticsData.Statistics.AttackType = (int)attackInfo.AttackType; } //有效命中 /*if (target.gamePlay.IsLastLifeState(EPlayerLifeState.Alive)) * { * src.statisticsData.Statistics.ShootingPlayerCount++; * }*/ var playerWeaponId = src.WeaponController().HeldConfigId; WeaponResConfigItem newConfig = SingletonManager.Get <WeaponResourceConfigManager>().GetConfigById(playerWeaponId); EUIDeadType euiDeadType = (null != newConfig && newConfig.SubType == (int)EWeaponSubType.Hand) ? EUIDeadType.Unarmed : EUIDeadType.Weapon; BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, _damager, src, target, new PlayerDamageInfo(Mathf.CeilToInt(baseDamage), (int)euiDeadType, (int)part, src.WeaponController().HeldWeaponAgent.ConfigId, false, false, false, hit.point, target.position.Value - src.position.Value)); // Logger.InfoFormat("[Hit] process damage sucess,dvalue:{0}", baseDamage); //由于动画放在客户端做了,服务器调用的命令会被忽视,需要发送事件到客户端 // if (target.hasStateInterface && target.stateInterface.State.CanBeenHit()) // { // target.stateInterface.State.BeenHit(); // } ClientEffectFactory.AddBeenHitEvent(src, target, AttackUtil.GeneraterUniqueHitId(src, seq), contexts.session.currentTimeObject.CurrentTime); int audioId = SingletonManager.Get <AudioWeaponManager>().FindById(playerWeaponId).HitList.Body; ClientEffectFactory.AddHitPlayerEffectEvent(src, target.entityKey.Value, hit.point, audioId, part); }
public override void DoAction(IEventArgs args) { FreeRuleEventArgs fr = (FreeRuleEventArgs)args; PlayerEntity player = (PlayerEntity)fr.GetEntity(target); if (player != null) { if (player.gamePlay.IsDead()) { return; } PlayerEntity sourcePlayer = null; UnitPosition up = null; try { if (!string.IsNullOrEmpty(source)) { sourcePlayer = (PlayerEntity)fr.GetEntity(source); } if (string.IsNullOrEmpty(part)) { part = ((int)EBodyPart.Chest).ToString(); } if (pos != null) { up = pos.Select(args); } } catch (Exception e) { Logger.Error("PlayerHurtAction handle error" + e.Message); } PlayerDamageInfo damageInfo = new PlayerDamageInfo(FreeUtil.ReplaceFloat(damage, args), FreeUtil.ReplaceInt(type, args), FreeUtil.ReplaceInt(part, args), 0, false, false, FreeUtil.ReplaceBool(dead, args), up != null ? player.position.Value : Vector3.zero, up != null ? player.position.Value - up.Vector3 : Vector3.zero); BulletPlayerUtil.DoProcessPlayerHealthDamage(args.GameContext, (IGameRule)fr.Rule, sourcePlayer, player, damageInfo); } }
public static void DoDamageToAllPassgers(Contexts contexts, VehicleEntity vehicle, float damage, EUIDeadType deadType, PlayerEntity sourcePlayer = null, bool isDamagePercent = false, bool sendToServer = false) { var seats = vehicle.vehicleSeat; var orignalDamge = damage; for (int seatId = 0; seatId < VehicleSeatComponent.MaxSeatCount; ++seatId) { EntityKey entityKey; if (seats.GetEntityKey(seatId, out entityKey)) { var player = contexts.player.GetEntityWithEntityKey(entityKey); if (player != null) { if (sourcePlayer == null && deadType == EUIDeadType.VehicleHit) { var lastDriveEntityKey = seats.LastDriverEntityKey; sourcePlayer = contexts.player.GetEntityWithEntityKey(lastDriveEntityKey); } //the case in which the damage is from self if (sourcePlayer == player) { sourcePlayer = null; } if (isDamagePercent) { var gamePlay = player.gamePlay; damage = orignalDamge * gamePlay.MaxHp; } BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, _damager, sourcePlayer, player, new PlayerDamageInfo(damage, (int)deadType, (int)EBodyPart.Chest, vehicle.vehicleAssetInfo.Id, false, false, false, deadType == EUIDeadType.VehicleBomb ? player.position.Value : Vector3.zero, deadType == EUIDeadType.VehicleBomb ? player.position.Value - vehicle.position.Value : Vector3.zero)); if (sendToServer) { SendDamageToServer(vehicle, player.entityKey.Value, damage); } } } } }
public void OnDisconnect(INetworkChannel channel, int messageType, object messageBody) { PlayerEntity player = GetPlayerEntity(channel); if (player != null) { try { logger.InfoFormat("player disconnected id {0}", player.entityKey); if (hallRoom != null && hallRoom.AllowReConnect) { logger.InfoFormat("player AllowReConnect id {0}", player.entityKey); player.stage.Value = EPlayerLoginStage.Offline; player.RemoveNetwork(); player.RemoveUpdateMessagePool(); } else { BulletPlayerUtil.DoProcessPlayerHealthDamage(ContextsWrapper.contexts, ContextsWrapper.FreeArgs.Rule as IGameRule, null, player, new PlayerDamageInfo(0, (int)EUIDeadType.NoHelp, 0, 0, false, false, true)); player.isFlagDestroy = true; if (player.hasFreeData) { if (player.isInitialized) { logger.InfoFormat("player PlayerLeave id {0}", player.entityKey); rule.PlayerLeave(ContextsWrapper.contexts, player); player.isInitialized = false; } } else { logger.ErrorFormat("Leave Player {0} Id {1} without Free Data ", player.playerInfo.PlayerName, player.playerInfo.PlayerId); } if (hallRoom != null) { logger.InfoFormat("player PlayerLeaveRoom id {0}", player.entityKey); hallRoom.PlayerLeaveRoom(player.playerInfo.PlayerId); } } } catch (Exception e) { logger.ErrorFormat("player disconnected error: {0} \n {1}", e.Message, e.StackTrace); } finally { int channelToPlayerCount = channelToPlayer.Count; try { channel.MessageReceived -= ChannelOnMessageReceived; channel.Disconnected -= ChannelOnDisonnected; channelToPlayer.Remove(channel); channel.Dispose(); } catch (Exception e) { logger.ErrorFormat("player Remove error: {0} \n {1}", e.Message, e.StackTrace); } finally { channelToPlayerCount--; } if (channelToPlayerCount == 0) { if (hallRoom == null && hallRoom.AllowReConnect) { logger.ErrorFormat("AllowReConnect"); } else { GameOver(true, RoomState.RGameOver); } } } } else { logger.ErrorFormat("illegal ChannelOnDisonnected event received {0}", channel); } }
public static void DoPlayerDamage(Contexts contexts, PlayerEntity sourcePlayer, PlayerEntity targetPlayer, float damage, EUIDeadType hitType = EUIDeadType.VehicleHit, EBodyPart hitPart = EBodyPart.Chest, int weaponId = 0) { BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, _damager, sourcePlayer, targetPlayer, new PlayerDamageInfo(damage, (int)hitType, (int)hitPart, weaponId)); }
public void OnPlayerDamage(Contexts contexts, PlayerEntity sourcePlayer, PlayerEntity targetPlayer, PlayerDamageInfo damage) { BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, _damager, sourcePlayer, targetPlayer, damage); }