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; } } }
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); } }
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}!"); }