Beispiel #1
0
        public CombatUI(ICombatController combatController,
                        IUICharacterManager uiCharacterManager,
                        GameUIConstants gameUIConstants,
                        IUIContainer uiContainer,
                        UserInput userInput,
                        IUIStateTracker defaultsHandler,
                        IDisplayManager displayManager,
                        IDisplayCombatState combatStateHandler)
        {
            _combatController   = combatController;
            _displayManager     = displayManager;
            _combatStateHandler = combatStateHandler;
            _defaultsHandler    = defaultsHandler;

            _uiCharacterManager                      = uiCharacterManager;
            _uiCharacterManager.Characters           = _displayManager.GetDisplayCharacters();
            _uiCharacterManager.CurrentRoundOrderIds = _combatStateHandler.GetRoundOrderIds()[0];
            _uiCharacterManager.NextRoundOrderIds    = _combatStateHandler.GetRoundOrderIds()[1];

            _uiContainer = uiContainer;

            _userInput = userInput;

            BindEvents();
            RefreshActionPanelList();
        }
    // Use this for initialization
    void Start()
    {
        combatController = GetComponent <ICombatController> ();
        if (combatController == null)
        {
            combatController = new NullCombatController();
        }

        virtualController = GetComponent <IVirtualController> ();
        if (virtualController == null)
        {
            virtualController = new NullVirtualController();
        }
        virtualController.SetMovementSpeedProperties(
            projectileSpeed,
            projectileMaxSpeedBoost,
            0f,
            0f
            );

        lifeTimer = new Timer(lifeTimeSec);
        lifeTimer.startTimer();

        indestructableTimer = new Timer(indesctructableTimeSec);
        indestructableTimer.startTimer();
    }
    private void Start()
    {
        if ((!(HumanoidAnimator?.enabled) ?? false) ||
            !(HumanoidAnimator.gameObject.activeSelf))
        {
            Debug.Log("Animator is disabled or null");
            Animate = false;
        }
        if (!Animate)
        {
            this.GetComponent <SpriteRenderer>().enabled             = true;
            this.GetComponent <HumanoidAnimatorController>().enabled = false;
            HumanoidAnimator.gameObject.SetActive(false);
            return;
        }

        SetWeaponsPositionsToAnchors();

        humanoidCombatController = GetComponent <ICombatController>();

        SetAnimatorStateAccordingToWeaponHoldingType(humanoidCombatController.Weapon);
        AddAttackAnimationsToWeapons();         // если подобрать новое оружие, то у него не будет анимации выстрела

        SetUpPlayerWeaponSwitchController();
        SetUpEnemyHealthState();

        humanoidRigidbody2D = GetComponent <Rigidbody2D>();
    }
Beispiel #4
0
        /// <summary>
        /// 考古战役
        /// </summary>
        /// <param name="user"></param>
        /// <param name="plotNpcID"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerArchaeologyPlot(GameUser user, int plotNpcID)
        {
            ICombatController controller   = CombatControllerFactory.Create();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.KaoGuPlot);

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID));
            plotCombater.SetDefend(new MonsterQueue(plotNpcID));
            return(plotCombater);
        }
Beispiel #5
0
        /// <summary>
        /// 圣吉塔战役
        /// </summary>
        /// <param name="user"></param>
        /// <param name="plotNpcID"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerSJTPlot(GameUser user, int plotNpcID, double difficultNum)
        {
            ICombatController controller   = CombatControllerFactory.Create();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.ShengJiTa);

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID));
            plotCombater.SetDefend(new MonsterQueue(plotNpcID, difficultNum));
            return(plotCombater);
        }
Beispiel #6
0
        /// <summary>
        /// 国家战
        /// </summary>
        /// <param name="cuser1">发起人</param>
        /// <param name="cuser2"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerTournament(CountryUser cuser1, CountryUser cuser2)
        {
            TrumpAbilityAttack.CombatTrumpLift(cuser1.UserId); //法宝每战斗M次就扣除N点寿命
            ICombatController controller   = CombatControllerFactory.Create();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.Country);

            plotCombater.SetAttack(new UserEmbattleQueue(cuser1.UserId, GetMagicId(cuser1.UserId), cuser1.InspirePercent, CombatType.Country));
            plotCombater.SetDefend(new UserEmbattleQueue(cuser2.UserId, GetMagicId(cuser2.UserId), cuser2.InspirePercent, CombatType.Country));
            return(plotCombater);
        }
Beispiel #7
0
        /// <summary>
        /// 副本战役
        /// </summary>
        /// <param name="user"></param>
        /// <param name="plotNpcID"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerPlot(GameUser user, int plotNpcID)
        {
            //TrumpAbilityAttack.CombatTrumpLift(user.UserID); //法宝每战斗M次就扣除N点寿命
            ICombatController controller   = CombatControllerFactory.Create();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.Plot);

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID));
            plotCombater.SetDefend(new MonsterQueue(plotNpcID));
            return(plotCombater);
        }
 public static ICombatController Create()
 {
     if (controller == null)
     {
         lock (lockThis)
         {
             if (controller == null)
             {
                 controller = (ICombatController)Activator.CreateInstance(Type.GetType(ZyGameBaseConfigManager.GetCombat().TypeName));
             }
         }
     }
     return(controller);
 }
 public static ICombatController Create()
 {
     if (controller == null)
     {
         lock (lockThis)
         {
             if (controller == null)
             {
                 controller = (ICombatController)Activator.CreateInstance(Type.GetType(ZyGameBaseConfigManager.GetCombat().TypeName));
             }
         }
     }
     return controller;
 }
Beispiel #10
0
        /// <summary>
        /// 玩家竞技
        /// </summary>
        /// <param name="user1">发起人</param>
        /// <param name="user2"></param>
        /// <returns></returns>
        public static ISingleCombat TriggerTournament(GameUser user1, GameUser user2)
        {
            //TrumpAbilityAttack.CombatTrumpLift(user1.UserID); //法宝每战斗M次就扣除N点寿命
            ICombatController controller   = CombatControllerFactory.Create();
            ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.User);

            user1 = UserCacheGlobal.LoadOffline(user1.UserID);
            user2 = UserCacheGlobal.LoadOffline(user2.UserID);

            if (user1 != null && user2 != null)
            {
                plotCombater.SetAttack(new UserEmbattleQueue(user1.UserID, user1.UseMagicID, 0, CombatType.User));
                plotCombater.SetDefend(new UserEmbattleQueue(user2.UserID, user2.UseMagicID, 0, CombatType.User));
            }
            return(plotCombater);
        }
Beispiel #11
0
    void Start()
    {
        virtualController = GetComponent <IVirtualController> ();
        if (virtualController == null)
        {
            virtualController = new NullVirtualController();
        }

        combatController = GetComponent <ICombatController> ();
        if (combatController == null)
        {
            combatController = new NullCombatController();
        }

        cameraController = new NullCameraController();

        attackRadiusTrigger           = gameObject.AddComponent <SphereCollider> ();
        attackRadiusTrigger.isTrigger = true;
        attackRadiusTrigger.radius    = visionRadius;
    }
Beispiel #12
0
        /// <summary>
        /// 触发战斗
        /// </summary>
        /// <param name="user"></param>
        /// <param name="bossCombatProcess"></param>
        /// <returns></returns>
        public bool Combat(GameUser user, BossCombatProcess bossCombatProcess)
        {
            CombatGeneral bossGeneral = Boss;

            bossGeneral.LossLifeNum = 0;

            BossUser          bossUser       = GetCombatUser(user.UserID);
            ICombatController controller     = CombatControllerFactory.Create();
            ISingleCombat     plotCombater   = controller.GetSingleCombat(CombatType.BossPlot);
            double            inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent;

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent, CombatType.BossPlot));
            plotCombater.SetDefend(new MonsterQueue(Boss));

            bool isWin = plotCombater.Doing();

            bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult();
            bossUser.CombatNum         += 1;
            bossUser.DamageNum          = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue);
            bossCombatProcess.LiveNum   = bossGeneral.LifeNum;
            bossCombatProcess.DamageNum = bossGeneral.LossLifeNum;
            bossCombatProcess.IsWin     = isWin;
            bossCombatProcess.UserId    = user.UserID;

            DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess);
            if (isWin && bossGeneral.IsOver)
            {
                GameActive active   = GameActive;
                short      lv       = MathUtils.Subtraction(bossGeneral.Lv, (short)active.BossPrize.KillBossLv, (short)1);
                int        killCoin = lv * active.BossPrize.KillBossRate;
                user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue);

                new TjxChatService().SystemSend(ChatType.World, string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin));
                TraceLog.ReleaseWriteDebug(string.Format(LanguageManager.GetLang().St5405_CombatKillReward, user.NickName, killCoin));
                bossCombatProcess.KillGameCoin = killCoin;

                ServerEnvSet.Set(ServerEnvKey.KillBossUserID, user.UserID);
                DoKillPrize(user);

                int tempMinute = active.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime");
                if (new TimeSpan(0, tempMinute, 0).TotalSeconds - active.ColdTime < 0)
                {
                    //Boss自动升级
                    active.BossLv = MathUtils.Addition(active.BossLv, (short)1);
                    //active.Update();
                }
                active.CombatStatus = CombatStatus.Killed;
                CombatHelper.BossKillDate(); //增加boss被杀时间
            }
            else
            {
                bossUser.IsRelive        = true;
                bossUser.ReliveBeginDate = DateTime.Now;
            }
            //日志
            var log = new UserCombatLog
            {
                CombatLogID   = Guid.NewGuid().ToString(),
                UserID        = user.UserID,
                CityID        = user.CityID,
                PlotID        = GameActive == null ? 0 : GameActive.BossPlotID,
                NpcID         = bossGeneral.GeneralID,
                CombatType    = CombatType.BossPlot,
                HostileUser   = string.Empty,
                IsWin         = isWin,
                CombatProcess = JsonUtils.Serialize(bossCombatProcess),
                CreateDate    = DateTime.Now
            };
            var sender = DataSyncManager.GetDataSender();

            sender.Send(log);

            //user.Update();

            return(isWin);
        }
Beispiel #13
0
    void Start()
    {
        bodyMass    = GetBodyMass();
        drag        = GetDrag();
        angularDrag = GetAngularDrag();
        normalSpeed = GetNormalSpeed();

        runSpeedMax       = GetRunSpeedMax();
        runSpeedIncrement = GetRunSpeedIncrement();
        turnSpeed         = GetTurnSpeed();

        maxHP = GetMaxHP();

        rigidBody = GetComponent <Rigidbody> ();
        if (rigidBody == null)
        {
            rigidBody = gameObject.AddComponent <Rigidbody> ();
        }
        rigidBody.mass           = bodyMass;
        rigidBody.drag           = drag;
        rigidBody.angularDrag    = angularDrag;
        rigidBody.freezeRotation = true;
        rigidBody.isKinematic    = false;

        healthController = GetComponent <IHealthController> ();
        if (healthController == null)
        {
            healthController = new NullHealthController();
        }

        jumpController = GetComponent <IJumpController> ();
        if (jumpController == null)
        {
            jumpController = new NullJumpAttributes();
        }

        interactionController = GetComponent <IInteractionController> ();
        if (interactionController == null)
        {
            interactionController = new NullInteractionController();
        }

        timeManipulatableController = GetComponent <ITimeManipulatableController> ();
        if (timeManipulatableController == null)
        {
            timeManipulatableController = new NullTimeManipulatableController();
        }

        combatController = GetComponent <ICombatController> ();
        if (combatController == null)
        {
            combatController = new NullCombatController();
        }

        timePauseProjectileAttackController = GetComponent <TimePauseProjectileAttackController> ();
        if (timePauseProjectileAttackController == null)
        {
            timePauseProjectileAttackController = new NullProjectileAttackController();
        }

        timeSlowProjectileAttackController = GetComponent <TimeSlowProjectileAttackController> ();
        if (timeSlowProjectileAttackController == null)
        {
            timeSlowProjectileAttackController = new NullProjectileAttackController();
        }
    }
Beispiel #14
0
        /// <summary>
        /// 触发战斗
        /// </summary>
        /// <param name="user"></param>
        /// <param name="bossCombatProcess"></param>
        /// <returns></returns>
        public bool Combat(GameUser user, BossCombatProcess bossCombatProcess)
        {
            CombatGeneral bossGeneral = Boss;

            bossGeneral.LossLifeNum = 0;
            bool     isWin    = false;
            BossUser bossUser = GetCombatUser(user.UserID);

            ICombatController controller     = CombatControllerFactory.Create();
            ISingleCombat     plotCombater   = controller.GetSingleCombat(CombatType.BossPlot);
            double            inspirePercent = bossUser.InspirePercent + bossUser.ReliveInspirePercent;

            plotCombater.SetAttack(new UserEmbattleQueue(user.UserID, user.UseMagicID, inspirePercent,
                                                         CombatType.BossPlot));
            plotCombater.SetDefend(new MonsterQueue(bossGeneral));

            isWin = plotCombater.Doing();
            bossCombatProcess.ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult();
            bossUser.CombatNum         += 1;
            bossUser.DamageNum          = MathUtils.Addition(bossUser.DamageNum, bossGeneral.LossLifeNum, int.MaxValue);
            bossCombatProcess.LiveNum   = bossGeneral.LifeNum;
            bossCombatProcess.DamageNum = bossGeneral.LossLifeNum;
            bossCombatProcess.IsWin     = isWin;
            bossCombatProcess.UserId    = user.UserID;

            DoDamagePrize(user, bossGeneral.LossLifeNum, bossCombatProcess);
            if (isWin && bossGeneral.IsOver)
            {
                //GameActive active = GameActive;
                UserGuild guild        = UserGuild;
                short     bossprizeLv  = 0;
                int       killbossrate = 0;
                if (guild.BossPrize != null)
                {
                    bossprizeLv  = (short)guild.BossPrize.KillBossLv;
                    killbossrate = guild.BossPrize.KillBossRate;
                    //击杀奖
                    BossActivePrize bossPrize    = UserGuild.BossPrize;
                    string          prizeItemMsg = string.Empty;
                    DoTopThreePrize(0, user, bossPrize.KillReward, bossPrize.Items, out prizeItemMsg);
                }

                short lv       = MathUtils.Subtraction(bossGeneral.Lv, bossprizeLv, (short)1);
                int   killCoin = lv * killbossrate;
                user.GameCoin = MathUtils.Addition(user.GameCoin, killCoin, int.MaxValue);
                // new CacheChat().SystemSend(ChatType.World, string.Format("{0}玩家获得公会Boss战击杀奖,奖励{1}金币", user.NickName, killCoin));
                new TjxChatService(user).SystemGuildSend(ChatType.Guild,
                                                         string.Format(LanguageManager.GetLang().St6105_CombatKillReward, user.NickName, killCoin));
                bossCombatProcess.KillGameCoin = killCoin;

                DoKillPrize();


                int tempMinute = gameActive.Minutes - ConfigEnvSet.GetInt("BossCombat.KillTime");
                int subSeconds = (int)new TimeSpan(0, tempMinute, 0).TotalSeconds;
                if (subSeconds - guild.ColdTime < 0)
                {
                    //Boss自动升级
                    guild.GuildBossInfo.UpdateNotify(obj =>
                    {
                        guild.GuildBossInfo.BossLv = MathUtils.Addition(guild.GuildBossInfo.BossLv, (short)1, short.MaxValue);
                        return(true);
                    });
                    //guild.Update();
                }
                guild.CombatStatus = CombatStatus.Killed;
                CombatHelper.UpdateGuildBossKill(guild.GuildID); //公会boss已被杀
            }
            else
            {
                bossUser.IsRelive        = true;
                bossUser.ReliveBeginDate = DateTime.Now;
            }
            //日志
            var log = new UserCombatLog
            {
                CombatLogID   = Guid.NewGuid().ToString(),
                UserID        = user.UserID,
                CityID        = user.CityID,
                PlotID        = gameActive == null ? 0 : gameActive.BossPlotID,
                NpcID         = bossGeneral.GeneralID,
                CombatType    = CombatType.BossPlot,
                HostileUser   = string.Empty,
                IsWin         = isWin,
                CombatProcess = JsonUtils.Serialize(bossCombatProcess),
                CreateDate    = DateTime.Now
            };

            var sender = DataSyncManager.GetDataSender();

            sender.Send(log);

            //user.Update();

            return(isWin);
        }
 public void BindController(ICombatController controller)
 {
     UnityEngine.Debug.Assert(controller != null);
     UnityEngine.Debug.Assert(m_Controller == null, "Attempting to bind a combat controller to an already bound device!");
     m_Controller = controller;
 }
Beispiel #16
0
 void IController.SetCombatController(ICombatController[] controllers)
 {
 }
Beispiel #17
0
 void IController.SetCombatController(ICombatController[] controllers)
 {
     _CombatController.Differences(controllers);
 }
Beispiel #18
0
        private void DoCombat(MorePlotTeam team)
        {
            //初始阵形
            var plotNpcTeam = new ConfigCacheSet <PlotNPCInfo>().FindAll(m => m.PlotID == team.MorePlot.PlotID);
            TList <MonsterQueue> monsterQueueList = new TList <MonsterQueue>(plotNpcTeam.Count);
            var userEmbattleList = new TList <UserEmbattleQueue>(team.UserList.Count);

            foreach (var npcInfo in plotNpcTeam)
            {
                monsterQueueList.Add(new MonsterQueue(npcInfo.PlotNpcID));
            }
            foreach (var user in team.UserList)
            {
                var gameUser = new GameDataCacheSet <GameUser>().FindKey(user.UserId);
                userEmbattleList.Add(new UserEmbattleQueue(user.UserId, gameUser.UseMagicID, 0, CombatType.MultiPlot));
            }
            bool isLoop   = true;
            int  maxCount = 0;

            while (isLoop)
            {
                if (maxCount > 500)
                {
                    break;
                }
                int overNum = 0;
                for (int i = 0; i < userEmbattleList.Count; i++)
                {
                    maxCount++;
                    int position;
                    var userEmbattle = userEmbattleList[i];
                    if (userEmbattle.IsOver)
                    {
                        overNum++;
                        continue;
                    }
                    var monster = GetMonster(monsterQueueList, i, out position);
                    if (monster == null || monster.IsOver)
                    {
                        team.CombatResult = true;
                        isLoop            = false;
                        break;
                    }
                    ICombatController controller   = CombatControllerFactory.Create();
                    ISingleCombat     plotCombater = controller.GetSingleCombat(CombatType.MultiPlot);
                    plotCombater.SetAttack(userEmbattle);
                    plotCombater.SetDefend(monster);
                    bool IsWin = plotCombater.Doing();


                    var processLost = new TeamCombatProcess
                    {
                        TeamID           = team.TeamID,
                        PlotID           = team.MorePlot.PlotID,
                        Position         = position,
                        ProcessContainer = (CombatProcessContainer)plotCombater.GetProcessResult(),
                        UserId           = team.UserList[i].UserId,
                        PlotNpcID        = plotNpcTeam[position].PlotNpcID,
                        IsWin            = IsWin
                    };
                    //new BaseLog().SaveDebuLog(string.Format("多人副本>>{4}组队{0}打{1}位置{2}结果{3}", processLost.UserId, processLost.PlotNpcID, position + 1, IsWin, team.TeamID));

                    AppendLog(team.TeamID, processLost);
                }
                if (overNum == userEmbattleList.Count)
                {
                    team.CombatResult = false;
                    isLoop            = false;
                }
            }

            //奖励
            if (team.CombatResult)
            {
                //new BaseLog().SaveDebuLog(string.Format("多人副本>>组队{0}结果{1}", team.TeamID, team.CombatResult));
                SetCombatResult(team.TeamID, team.CombatResult);

                var chatService = new TjxChatService();
                foreach (var user in team.UserList)
                {
                    GameUser gameUser = new GameDataCacheSet <GameUser>().FindKey(user.UserId);
                    gameUser.ExpNum = MathUtils.Addition(gameUser.ExpNum, team.MorePlot.ExpNum, int.MaxValue);
                    //gameUser.Update();
                    UserItemHelper.AddUserItem(user.UserId, team.MorePlot.ItemId, team.MorePlot.ItemNum);
                    new BaseLog("参加多人副本获得奖励:" + team.MorePlot.ItemName);
                    SetWinNum(user.UserId, team.MorePlot.PlotID);
                    CombatHelper.DailyMorePlotRestrainNum(gameUser.UserID, team.MorePlot.PlotID); // 多人副本获胜加一次
                    chatService.SystemSendWhisper(gameUser, string.Format(LanguageManager.GetLang().St4211_MorePlotReward,
                                                                          team.MorePlot.ExpNum, team.MorePlot.ItemName, team.MorePlot.ItemNum));
                }
            }
        }