Ejemplo n.º 1
0
 public static void MissionNameMarkerTargetVMConstructorPostfix(MissionNameMarkerTargetVM __instance, Agent agent)
 {
     if (MissionHelpers.InSiegeMission() || MissionHelpers.InFieldBattleMission() || MissionHelpers.InHideOutMission())
     {
         if (Agent.Main != null && agent.IsEnemyOf(Agent.Main) || agent.Team.IsEnemyOf(Mission.Current.PlayerTeam))
         {
             __instance.MarkerType = 2;
         }
         else if (Agent.Main != null && agent.IsFriendOf(Agent.Main) || agent.Team.IsFriendOf(Mission.Current.PlayerTeam))
         {
             __instance.MarkerType = 0;
         }
     }
 }
Ejemplo n.º 2
0
        public override void OnMissionBehaviourInitialize(Mission mission)
        {
            try
            {
                // Add the marker overlay for appropriate mission types
                if (mission.GetMissionBehaviour <MissionNameMarkerUIHandler>() == null &&
                    (MissionHelpers.InSiegeMission() ||
                     MissionHelpers.InFieldBattleMission() ||
                     Mission.Current?.GetMissionBehaviour <TournamentFightMissionController>() != null))
                {
                    mission.AddMissionBehaviour(SandBoxViewCreator.CreateMissionNameMarkerUIHandler(mission));
                }

                mission.AddMissionBehaviour(new BLTAdoptAHeroCommonMissionBehavior());
                mission.AddMissionBehaviour(new BLTAdoptAHeroCustomMissionBehavior());
                mission.AddMissionBehaviour(new BLTSummonBehavior());
                mission.AddMissionBehaviour(new BLTRemoveAgentsBehavior());
                mission.AddMissionBehaviour(new BLTHeroPowersMissionBehavior());
            }
            catch (Exception e)
            {
                Log.Exception(nameof(OnMissionBehaviourInitialize), e);
            }
        }
Ejemplo n.º 3
0
        protected override void ExecuteInternal(ReplyContext context, object baseConfig,
                                                Action <string> onSuccess, Action <string> onFailure)
        {
            if (Mission.Current == null)
            {
                onFailure($"No mission is active!");
                return;
            }

            if (BLTBuffetModule.EffectsConfig.DisableEffectsInTournaments &&
                MissionHelpers.InTournament())
            {
                onFailure($"Not allowed during tournament!");
                return;
            }

            if (!Mission.Current.IsLoadingFinished ||
                Mission.Current.CurrentState != Mission.State.Continuing ||
                Mission.Current?.GetMissionBehaviour <TournamentFightMissionController>() != null && Mission.Current.Mode != MissionMode.Battle)
            {
                onFailure($"The mission has not started yet!");
                return;
            }

            if (Mission.Current.IsMissionEnding || Mission.Current.MissionResult?.BattleResolved == true)
            {
                onFailure($"The mission is ending!");
                return;
            }

            var effectsBehaviour = BLTEffectsBehaviour.Get();

            var config = (Config)baseConfig;

            bool GeneralAgentFilter(Agent agent)
            => agent.IsHuman && (!config.TargetOnFootOnly || agent.HasMount == false) && !effectsBehaviour.Contains(agent, config);

            var target = config.Target switch
            {
                Target.Player => Agent.Main,
                Target.AdoptedHero => Mission.Current.Agents.FirstOrDefault(a => a.IsAdoptedBy(context.UserName)),
                Target.Any => Mission.Current.Agents.Where(GeneralAgentFilter).Where(a => !a.IsAdopted()).SelectRandom(),
                Target.EnemyTeam => Mission.Current.Agents.Where(GeneralAgentFilter)
                .Where(a => a.Team?.IsValid == true &&
                       Mission.Current.PlayerTeam?.IsValid == true &&
                       !a.Team.IsFriendOf(Mission.Current.PlayerTeam) &&
                       !a.IsAdopted())
                .SelectRandom(),
                Target.PlayerTeam => Mission.Current.Agents.Where(GeneralAgentFilter)
                .Where(a => a.Team?.IsPlayerTeam == true && !a.IsAdopted())
                .SelectRandom(),
                Target.AllyTeam => Mission.Current.Agents.Where(GeneralAgentFilter)
                .Where(a => a.Team?.IsPlayerAlly == false && !a.IsAdopted())
                .SelectRandom(),
                _ => null
            };

            if (target == null || target.AgentVisuals == null)
            {
                onFailure($"Couldn't find the target!");
                return;
            }

            if (string.IsNullOrEmpty(config.Name))
            {
                onFailure($"CharacterEffect {context.Source} configuration error: Name is missing!");
                return;
            }

            if (effectsBehaviour.Contains(target, config))
            {
                onFailure($"{target.Name} already affected by {config.Name}!");
                return;
            }

            if (config.TargetOnFootOnly && target.HasMount)
            {
                onFailure($"{target.Name} is mounted so cannot be affected by {config.Name}!");
                return;
            }

            var effectState = effectsBehaviour.Add(target, config);

            foreach (var pfx in config.ParticleEffects ?? Enumerable.Empty <ParticleEffectDef>())
            {
                var pfxState = new CharacterEffectState.PfxState();
                switch (pfx.AttachPoint)
                {
                case ParticleEffectDef.AttachPointEnum.OnWeapon:
                    pfxState.weaponEffects = CreateWeaponEffects(target, pfx.Name);
                    break;

                case ParticleEffectDef.AttachPointEnum.OnHands:
                    pfxState.boneAttachments = CreateAgentEffects(target,
                                                                  pfx.Name,
                                                                  MatrixFrame.Identity,
                                                                  Game.Current.HumanMonster.MainHandItemBoneIndex,
                                                                  Game.Current.HumanMonster.OffHandItemBoneIndex);
                    break;

                case ParticleEffectDef.AttachPointEnum.OnHead:
                    pfxState.boneAttachments = CreateAgentEffects(target,
                                                                  pfx.Name,
                                                                  MatrixFrame.Identity.Strafe(0.1f),
                                                                  Game.Current.HumanMonster.HeadLookDirectionBoneIndex);
                    break;

                case ParticleEffectDef.AttachPointEnum.OnBody:
                    pfxState.boneAttachments = CreateAgentEffects(target, pfx.Name, MatrixFrame.Identity.Elevate(0.1f));
                    break;

                default:
                    Log.Error($"{config.Name}: No location specified for particle Id {pfx.Name} in CharacterEffect");
                    break;
                }
                effectState.state.Add(pfxState);
            }

            // if (config.Properties != null && target.AgentDrivenProperties != null)
            // {
            //     ApplyPropertyModifiers(target, config);
            // }

            // if (config.Light != null)
            // {
            //     effectState.light = CreateLight(target, config.Light.Radius, config.Light.Intensity, config.Light.ColorParsed);
            // }

            if (config.RemoveArmor)
            {
                foreach (var(_, index) in target.SpawnEquipment.YieldArmorSlots())
                {
                    target.SpawnEquipment[index] = EquipmentElement.Invalid;
                }
                target.UpdateSpawnEquipmentAndRefreshVisuals(target.SpawnEquipment);
            }

            if (!string.IsNullOrEmpty(config.ActivateParticleEffect))
            {
                Mission.Current.Scene.CreateBurstParticle(ParticleSystemManager.GetRuntimeIdByName(config.ActivateParticleEffect), target.AgentVisuals.GetGlobalFrame());
            }
            if (!string.IsNullOrEmpty(config.ActivateSound))
            {
                Mission.Current.MakeSound(SoundEvent.GetEventIdFromString(config.ActivateSound), target.AgentVisuals.GetGlobalFrame().origin, false, true, target.Index, -1);
            }

            Log.LogFeedEvent($"{config.Name} is active on {target.Name}!");

            onSuccess($"{config.Name} is active on {target.Name}!");
        }