Exemple #1
0
 public PlayerAutoMove(PlayerEntity player)
 {
     if (null == player)
     {
         return;
     }
     _gamePlay   = player.gamePlay;
     _playerMove = player.playerMove;
 }
        public static void UpdateGamePlayData(FreeData fd, ItemPosition ip, ItemType itemType)
        {
            GamePlayComponent gamePlay = fd.Player.gamePlay;

            if (ip == null)
            {
                if (itemType == ItemType.Armor)
                {
                    gamePlay.MaxArmor = 0;
                    gamePlay.CurArmor = 0;
                }
                if (itemType == ItemType.Helmet)
                {
                    gamePlay.MaxHelmet = 0;
                    gamePlay.CurHelmet = 0;
                }
            }
            else
            {
                FreeItemInfo itemInfo = FreeItemConfig.GetItemInfo(ip.key.GetKey());
                switch (itemType)
                {
                case ItemType.Armor:
                    gamePlay.CurArmor = Math.Max(0, ip.GetCount());
                    if (itemInfo.id == 1)
                    {
                        gamePlay.MaxArmor = 200;
                    }
                    else if (itemInfo.id == 2)
                    {
                        gamePlay.MaxArmor = 220;
                    }
                    else if (itemInfo.id == 3)
                    {
                        gamePlay.MaxArmor = 250;
                    }
                    break;

                case ItemType.Helmet:
                    gamePlay.CurHelmet = Math.Max(0, ip.GetCount());
                    if (itemInfo.id == 8)
                    {
                        gamePlay.MaxHelmet = 80;
                    }
                    else if (itemInfo.id == 9)
                    {
                        gamePlay.MaxHelmet = 150;
                    }
                    else if (itemInfo.id == 10)
                    {
                        gamePlay.MaxHelmet = 230;
                    }
                    break;
                }
            }
        }
        public List <PlayerWeaponBagData> FilterSortedWeaponBagDatas(PlayerInfoComponent playerInfoComponent,
                                                                     GamePlayComponent gamePlayComponent)
        {
            var list         = new List <PlayerWeaponBagData>();
            var jobAttribute = (gamePlayComponent == null
                            ? (int)EJobAttribute.EJob_EveryMan
                            : gamePlayComponent.JobAttribute);

            if (jobAttribute == (int)EJobAttribute.EJob_Variant || jobAttribute == (int)EJobAttribute.EJob_Matrix)
            {
                var originList = PlayerEntityFactory.MakeVariantWeaponBag();
                for (int i = 0; i < originList.Length; i++)
                {
                    list.Add(originList[i]);
                }
            }
            else
            {
                var originList = playerInfoComponent.WeaponBags;
                for (int i = 0; i < originList.Length; i++)
                {
                    if (originList[i] == null)
                    {
                        continue;
                    }
                    Logger.InfoFormat("Server Origin Data =====>add BagIndex:{0}", originList[i].BagIndex);
                    list.Add(originList[i]);
                    //    ServerRoomWeaponPreLog(playerInfoComponent.WeaponBags);
                    //    if ((EGameMode)ModeId == EGameMode.Survival) return null;
                    //    if (playerInfoComponent.WeaponBags == null ||
                    //playerInfoComponent.WeaponBags.Length == 0) return null;
                    //    var valuableBagDatas = new List<PlayerWeaponBagData>(playerInfoComponent.WeaponBags);
                    //    for (int i = valuableBagDatas.Count - 1; i >= 0; i--)
                    //    {
                    //        if (valuableBagDatas[i] == null || valuableBagDatas[i].weaponList.Count == 0 ||
                    //          valuableBagDatas[i].BagIndex > GlobalConst.WeaponBagMaxCount)
                    //        {
                    //            valuableBagDatas.RemoveAt(i);
                    //            continue;
                    //        }
                    //   //     DebugUtil.LogInUnity("Server init bag item:"+valuableBagDatas[i].ToString(),DebugUtil.DebugColor.Blue);
                    //    }
                    //    valuableBagDatas.Sort(ModeUtil.RoomWeaponCompareCmd);

                    //    return valuableBagDatas;
                }
            }

            return(list);
        }
        private static List <PlayerEntity> CheckUpdatePlayerStatus(PlayerEntity player, PlayerDamageInfo damage, Contexts contexts)
        {
            GamePlayComponent gamePlay = player.gamePlay;

            if (gamePlay.IsLifeState(EPlayerLifeState.Alive))
            {
                if (gamePlay.CurHp <= 0)
                {
                    //存活队友
                    int aliveCount = 0;
                    //存活队伍
                    HashSet <long> aliveTeams = new HashSet <long>();
                    if (null != contexts)
                    {
                        foreach (PlayerEntity other in contexts.player.GetEntities())
                        {
                            if (other.hasPlayerInfo && other != player && other.gamePlay.IsLifeState(EPlayerLifeState.Alive))
                            {
                                aliveTeams.Add(other.playerInfo.TeamId);
                                if (other.playerInfo.TeamId == player.playerInfo.TeamId)
                                {
                                    aliveCount++;
                                }
                            }
                        }
                    }
                    if (damage.type == (int)EUIDeadType.Drown || /*|| damage.type == (int) EUIDeadType.VehicleBomb*/
                        player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Swim ||
                        player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Dive)
                    {
                        //直接死亡
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dead, player.time.ClientTime);
                    }
                    else if (aliveCount == 0)
                    {
                        //自己
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dead, player.time.ClientTime);
                        //全队阵亡
                        if (null != contexts)
                        {
                            List <PlayerEntity> teamList = new List <PlayerEntity>();
                            foreach (PlayerEntity other in contexts.player.GetEntities())
                            {
                                if (other.hasPlayerInfo && other != player &&
                                    other.playerInfo.TeamId == player.playerInfo.TeamId &&
                                    other.gamePlay.IsLifeState(EPlayerLifeState.Dying))
                                {
                                    teamList.Add(other);
                                }
                            }
                            return(teamList);
                        }
                    }
                    else if (GetTeamCapacity(contexts) > 1 && aliveTeams.Count > 1)
                    {
                        //受伤状态
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dying, player.time.ClientTime);
                    }
                    else
                    {
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dead, player.time.ClientTime);
                    }
                }
            }
            else if (gamePlay.IsLifeState(EPlayerLifeState.Dying))
            {
                if (gamePlay.InHurtedHp <= 0)
                {
                    gamePlay.ChangeLifeState(EPlayerLifeState.Dead, player.time.ClientTime);
                }
                else
                {
                    int aliveCount = 0;
                    if (null != contexts)
                    {
                        foreach (PlayerEntity other in contexts.player.GetEntities())
                        {
                            if (other.hasPlayerInfo && other != player && other.gamePlay.IsLifeState(EPlayerLifeState.Alive) && other.playerInfo.TeamId == player.playerInfo.TeamId)
                            {
                                aliveCount++;
                            }
                        }
                    }
                    if (aliveCount == 0)
                    {
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dead, player.time.ClientTime);
                    }
                }
            }
            return(null);
        }
Exemple #5
0
 public static void RemoveCastState(EPlayerCastState state, GamePlayComponent player)
 {
     player.CastState &= ~(1 << (int)state);
 }
Exemple #6
0
 public static void AddCastState(EPlayerCastState state, GamePlayComponent player)
 {
     player.CastState |= 1 << (int)state;
 }
Exemple #7
0
 public static bool HasCastState(EPlayerCastState state, GamePlayComponent player)
 {
     return((player.CastState & (1 << (int)state)) > 0);
 }
Exemple #8
0
 public static void RemoveGameState(EPlayerGameState state, GamePlayComponent player)
 {
     player.PlayerState &= ~(1 << (int)state);
 }
Exemple #9
0
 public static void AddPlayerState(EPlayerGameState state, GamePlayComponent player)
 {
     player.PlayerState |= 1 << (int)state;
 }
Exemple #10
0
 public static void AddUIState(EPlayerUIState state, GamePlayComponent player)
 {
     player.UIState |= 1 << (int)state;
 }
Exemple #11
0
 public static void RemoveUIState(EPlayerUIState state, GamePlayComponent player)
 {
     player.UIState      &= ~(1 << (int)state);
     player.UIStateUpdate = true;
 }
Exemple #12
0
 public static bool HasUIState(GamePlayComponent player)
 {
     return(HasUIState(EPlayerUIState.BagOpen, player) ||
            HasUIState(EPlayerUIState.ExitOpen, player) ||
            HasUIState(EPlayerUIState.MapOpen, player));
 }
        private static List <PlayerEntity> OnePlayerHealthDamage(Contexts contexts, IGameRule gameRule, PlayerEntity srcPlayer, PlayerEntity playerEntity, PlayerDamageInfo damage, bool isTeam)
        {
            GamePlayComponent gamePlay = playerEntity.gamePlay;

            if (gamePlay.IsDead())
            {
                return(null);
            }

            float realDamage = gameRule == null ? damage.damage : gameRule.HandleDamage(srcPlayer, playerEntity, damage);

            WeaponResConfigItem weaponConfig = SingletonManager.Get <WeaponResourceConfigManager>().GetConfigById(damage.weaponId);

            if (srcPlayer != null)
            {
                try
                {
                    //受伤梯形标记
                    if (SharedConfig.IsServer)
                    {
                        if (damage.type == (int)EUIDeadType.Weapon || damage.type == (int)EUIDeadType.Unarmed)
                        {
                            if (weaponConfig != null && weaponConfig.SubType != (int)EWeaponSubType.Grenade)
                            {
                                BulletStatisticsUtil.SetPlayerDamageInfoS(srcPlayer, playerEntity, realDamage, (EBodyPart)damage.part);
                            }
                        }
                    }
                    else
                    {
                        BulletStatisticsUtil.SetPlayerDamageInfoC(srcPlayer, playerEntity, realDamage, (EBodyPart)damage.part);
                    }
                }
                catch (Exception e)
                {
                    _logger.Error("受伤梯形标记", e);
                }
            }

            if (!SharedConfig.IsOffline && !SharedConfig.IsServer)
            {
                return(null);
            }

            if (!playerEntity.hasStatisticsData)
            {
                return(null);
            }

            StatisticsData statisticsData = playerEntity.statisticsData.Statistics;


            var now = gameRule == null ? playerEntity.time.ClientTime : gameRule.ServerTime;

            if (now - statisticsData.LastHitDownTime <= 1000 && !damage.InstantDeath)
            {
                return(null);
            }

            damage.damage = gamePlay.DecreaseHp(realDamage);

            //玩家状态
            List <PlayerEntity> teamList = CheckUpdatePlayerStatus(playerEntity, damage, isTeam ? null : contexts, (int)now);

            //保存最后伤害来源
            if (statisticsData.DataCollectSwitch)
            {
                try
                {
                    if (gamePlay.IsLastLifeState(EPlayerLifeState.Alive))
                    {
                        //statisticsData.IsHited = true;
                        statisticsData.LastHurtKey      = null != srcPlayer ? srcPlayer.entityKey.Value : EntityKey.Default;
                        statisticsData.LastHurtType     = damage.type;
                        statisticsData.LastHurtPart     = damage.part;
                        statisticsData.LastHurtWeaponId = damage.weaponId;
                    }

                    //击倒人头
                    if ((gamePlay.IsLifeState(EPlayerLifeState.Dying) || gamePlay.IsDead()) &&
                        (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))
                    {
                        PlayerEntity lastEntity = 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;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.Error("计算玩家战报信息失败", e);
                }

                if (gamePlay.IsHitDown())
                {
                    try
                    {
                        statisticsData.LastHitDownTime = now;
                        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);
                    }
                    catch (Exception e)
                    {
                        _logger.Error("计算玩家ScoreInfo信息失败", e);
                    }
                }

                if (gamePlay.IsDead())
                {
                    try
                    {
                        //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 && 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.gamePlay.JobAttribute == (int)EJobAttribute.EJob_Hero)
                            {
                                //英雄击杀
                                feedbackType |= 1 << (int)EUIKillFeedbackType.HeroKO;
                                playerEntity.playerInfo.SpecialFeedbackType = (int)EUIKillFeedbackType.HeroKO;
                            }
                            //武器
                            if (null != weaponConfig)
                            {
                                switch ((EWeaponSubType)weaponConfig.SubType)
                                {
                                case EWeaponSubType.Melee:
                                    feedbackType |= 1 << (int)EUIKillFeedbackType.MeleeWeapon;
                                    playerEntity.playerInfo.SpecialFeedbackType = (int)EUIKillFeedbackType.MeleeWeapon;
                                    break;

                                case EWeaponSubType.BurnBomb:
                                    feedbackType |= 1 << (int)EUIKillFeedbackType.Burning;
                                    break;

                                case EWeaponSubType.Grenade:
                                    feedbackType |= 1 << (int)EUIKillFeedbackType.Grenade;
                                    break;

                                default:
                                    break;
                                }
                            }
                            if (feedbackType == 0)
                            {
                                //普通击杀
                                feedbackType = 1 << (int)EUIKillFeedbackType.Normal;
                            }
                            damage.KillFeedbackType = feedbackType;
                        }
                    }
                    catch (Exception e)
                    {
                        _logger.Error("计算玩家战报信息失败", e);
                    }
                }

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

            //击杀|击倒
            if (gamePlay.IsDead())
            {
                gameRule.KillPlayer(srcPlayer, playerEntity, damage);
                try
                {
                    if (damage.HitPoint != Vector3.zero && damage.HitDirection != Vector3.zero && playerEntity.hasRagDoll)
                    {
                        playerEntity.ragDoll.ForceAtPosition = Vector3.zero;
                        switch (damage.type)
                        {
                        case (int)EUIDeadType.Weapon:
                            var config = SingletonManager.Get <WeaponConfigManagement>().FindConfigById(damage.weaponId);
                            if (weaponConfig.Type == (int)EWeaponType_Config.ThrowWeapon)
                            {
                                playerEntity.ragDoll.RigidBodyTransformName = "Bip01 Spine1";
                                playerEntity.ragDoll.Impulse = (damage.HitDirection.normalized + new Vector3(0, 1.732f)).normalized *
                                                               config.S_Ragdoll.RagdollForce * DamageFactor(realDamage);
                            }
                            else
                            {
                                foreach (var pair in Joint2BodyPart)
                                {
                                    if (pair.Value == (EBodyPart)damage.part)
                                    {
                                        playerEntity.ragDoll.RigidBodyTransformName = pair.Key.Substring(0, pair.Key.LastIndexOf("_"));
                                        break;
                                    }
                                }

                                playerEntity.ragDoll.Impulse = damage.HitDirection.normalized * config.S_Ragdoll.RagdollForce *
                                                               DamageFactor(realDamage);
                            }

                            break;

                        default:
                            var explosionConfig = SingletonManager.Get <WeaponConfigManagement>().FindConfigById(46);
                            playerEntity.ragDoll.RigidBodyTransformName = "Bip01 Spine1";
                            playerEntity.ragDoll.Impulse = (damage.HitDirection.normalized + new Vector3(0, 1.732f)).normalized *
                                                           explosionConfig.S_Ragdoll.RagdollForce * DamageFactor(realDamage);
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.Error("计算玩家死亡ragdoll运动信息失败", e);
                }
            }

            //_logger.DebugFormat("change player hp entityId:{0}, health {1}->{2}, state {3}, srcPlayerId:{4}, playerId:{5}, hurtType:{6}, weaponId:{7}",
            //    playerEntity.entityKey.Value.EntityId, playerEntity.gamePlay.CurHp, playerEntity.gamePlay.CurHp, playerEntity.gamePlay.LifeState, (srcPlayer != null) ? srcPlayer.playerInfo.PlayerId : 0, playerEntity.playerInfo.PlayerId, damage.type, damage.weaponId);
            return(teamList);
        }
        private static List <PlayerEntity> CheckUpdatePlayerStatus(PlayerEntity player, PlayerDamageInfo damage, Contexts contexts, int now)
        {
            GamePlayComponent gamePlay = player.gamePlay;

            if (contexts == null && damage.InstantDeath)
            {
                gamePlay.ChangeLifeState(EPlayerLifeState.Dead, now);
                return(null);
            }

            if (contexts.session.commonSession.RoomInfo.TeamCapacity <= 1)
            {
                if (damage.InstantDeath || gamePlay.CurHp <= 0)
                {
                    gamePlay.ChangeLifeState(EPlayerLifeState.Dead, now);
                }
                return(null);
            }
            else
            {
                switch (gamePlay.LifeState)
                {
                case (int)EPlayerLifeState.Alive:
                    if (gamePlay.CurHp <= 0 || damage.InstantDeath)
                    {
                        int aliveCount = 0;
                        List <PlayerEntity> teamList = new List <PlayerEntity>();
                        foreach (PlayerEntity other in contexts.player.GetInitializedPlayerEntities())
                        {
                            if (!other.hasGamePlay)
                            {
                                continue;
                            }
                            if (other.playerInfo.PlayerId != player.playerInfo.PlayerId && other.playerInfo.TeamId == player.playerInfo.TeamId)
                            {
                                switch (other.gamePlay.LifeState)
                                {
                                case (int)EPlayerLifeState.Alive:
                                    aliveCount++;
                                    break;

                                case (int)EPlayerLifeState.Dying:
                                    teamList.Add(other);
                                    break;

                                default:
                                    break;
                                }
                            }
                        }

                        if (damage.InstantDeath || damage.type == (int)EUIDeadType.Bomb ||
                            damage.type == (int)EUIDeadType.Drown ||
                            player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Swim ||
                            player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Dive)
                        {
                            gamePlay.ChangeLifeState(EPlayerLifeState.Dead, now);
                            return(aliveCount == 0 ? teamList : null);
                        }

                        if (aliveCount == 0)
                        {
                            gamePlay.ChangeLifeState(EPlayerLifeState.Dead, now);
                        }
                        else
                        {
                            gamePlay.ChangeLifeState(EPlayerLifeState.Dying, now);
                        }
                        return(aliveCount == 0 ? teamList : null);
                    }
                    break;

                case (int)EPlayerLifeState.Dying:
                    if (damage.InstantDeath || gamePlay.InHurtedHp <= 0)
                    {
                        gamePlay.ChangeLifeState(EPlayerLifeState.Dead, now);
                    }
                    break;

                default:
                    break;
                }

                return(null);
            }
        }