예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        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);
                        }
                    }
                }
            }
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
 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));
 }
예제 #7
0
 public void OnPlayerDamage(Contexts contexts, PlayerEntity sourcePlayer, PlayerEntity targetPlayer,
                            PlayerDamageInfo damage)
 {
     BulletPlayerUtil.ProcessPlayerHealthDamage(contexts, _damager, sourcePlayer, targetPlayer, damage);
 }