// RimWorld.Targeter public static bool ProcessInputEvents_PreFix(Targeter __instance) { AccessTools.Method(typeof(Targeter), "ConfirmStillValid").Invoke(__instance, null); if (Event.current.type == EventType.MouseDown) { ////Log.Message("1"); if (Event.current.button == 0 && __instance.IsTargeting) { ////Log.Message("2"); if (__instance.targetingVerb != null) { ////Log.Message("3"); if (__instance.targetingVerb is Verb_UseAbility) { Verb_UseAbility abilityVerb = __instance.targetingVerb as Verb_UseAbility; ////Log.Message("4"); //if (((Action<LocalTargetInfo>)AccessTools.Field(typeof(Targeter), "action").GetValue(__instance)) != null) //{ ////Log.Message("5"); //TargetingParameters targetParams = (TargetingParameters)AccessTools.Field(typeof(Targeter), "targetParams").GetValue(__instance); if (abilityVerb.ability.powerdef.MainVerb.AbilityTargetCategory != AbilityTargetCategory.TargetSelf) { TargetingParameters targetParams = abilityVerb.ability.powerdef.MainVerb.targetParams; if (targetParams != null) { ////Log.Message("6"); IEnumerable <LocalTargetInfo> source = GenUI.TargetsAtMouse(targetParams, false); if (source != null && source.Count <LocalTargetInfo>() > 0) { ////Log.Message("7"); if (source.Any <LocalTargetInfo>()) { //Pawn caster = (Pawn)AccessTools.Field(typeof(Targeter), "caster").GetValue(__instance); Pawn caster = (Pawn)__instance.targetingVerb.caster; CompAbilityUser.TryCastAbility(caster, source.First <LocalTargetInfo>(), caster.GetComp <CompAbilityUser>(), (Verb_UseAbility)__instance.targetingVerb, ((Verb_UseAbility)(__instance.targetingVerb)).ability.powerdef as AbilityDef)?.Invoke(); ////Log.Message("8"); //AccessTools.Method(typeof(Targeter), "action").Invoke(__instance, new object[] { }); SoundDefOf.TickHigh.PlayOneShotOnCamera(); __instance.StopTargeting(); Event.current.Use(); return(false); } } } } else { //Pawn caster = (Pawn)AccessTools.Field(typeof(Targeter), "caster").GetValue(__instance); Pawn caster = (Pawn)__instance.targetingVerb.caster; CompAbilityUser.TryCastAbility(caster, null, caster.GetComp <CompAbilityUser>(), (Verb_UseAbility)__instance.targetingVerb, ((Verb_UseAbility)(__instance.targetingVerb)).ability.powerdef as AbilityDef)?.Invoke(); ////Log.Message("8"); //AccessTools.Method(typeof(Targeter), "action").Invoke(__instance, new object[] { }); SoundDefOf.TickHigh.PlayOneShotOnCamera(); __instance.StopTargeting(); Event.current.Use(); return(false); } //} } } } } return(true); }
public IEnumerable <Command_PawnAbility> GetPawnAbilityVerbs() { //Log.ErrorOnce("GetPawnAbilityVerbs Called", 912912); List <Verb_UseAbility> temp = new List <Verb_UseAbility>(); temp.AddRange(this.AbilityVerbs); for (int i = 0; i < this.allPowers.Count; i++) { int j = i; Verb_UseAbility newVerb = temp[j]; VerbProperties_Ability newVerbProps = newVerb.UseAbilityProps; newVerb.caster = this.AbilityUser; newVerb.verbProps = temp[j].verbProps; Command_PawnAbility command_CastPower = new Command_PawnAbility(this, this.allPowers[i]) { verb = newVerb, defaultLabel = this.allPowers[j].powerdef.LabelCap }; //GetDesc StringBuilder s = new StringBuilder(); s.AppendLine(this.allPowers[j].powerdef.GetDescription()); s.AppendLine(PostAbilityVerbCompDesc(newVerb.UseAbilityProps)); command_CastPower.defaultDesc = s.ToString(); s = null; command_CastPower.targetingParams = this.allPowers[j].powerdef.MainVerb.targetParams; //command_CastPower.targetingParams = TargetingParameters.ForAttackAny(); //if (newVerb.useAbilityProps.AbilityTargetCategory == AbilityTargetCategory.TargetSelf) //{ // command_CastPower.targetingParams = TargetingParameters.ForSelf(this.abilityUser); //} //else //{ // command_CastPower.targetingParams = TargetingParameters. //} command_CastPower.icon = this.allPowers[j].powerdef.uiIcon; //string str; //if (FloatMenuUtility.GetAttackAction(this.abilityUser, LocalTargetInfo.Invalid, out str) == null) //{ // command_CastPower.Disable(str.CapitalizeFirst() + "."); //} command_CastPower.action = delegate(Thing target) { Action attackAction = CompAbilityUser.TryCastAbility(this.AbilityUser, target, this, newVerb, this.allPowers[j].powerdef as AbilityDef); if (attackAction != null) { if (CanOverpowerTarget(this.AbilityUser, target, this.allPowers[j].powerdef as AbilityDef)) { attackAction(); } } }; if (newVerb.caster.Faction != Faction.OfPlayer) { command_CastPower.Disable("CannotOrderNonControlled".Translate()); } string reason = ""; if (newVerb.CasterIsPawn) { if (newVerb.CasterPawn.story.WorkTagIsDisabled(WorkTags.Violent) && this.allPowers[j].powerdef.MainVerb.isViolent) { command_CastPower.Disable("IsIncapableOfViolence".Translate(new object[] { newVerb.CasterPawn.NameStringShort })); } else if (!newVerb.CasterPawn.drafter.Drafted) { command_CastPower.Disable("IsNotDrafted".Translate(new object[] { newVerb.CasterPawn.NameStringShort })); } else if (!newVerb.ability.CanFire) { command_CastPower.Disable("AU_PawnAbilityRecharging".Translate(new object[] { newVerb.CasterPawn.NameStringShort })); } //This is a hook for modders. else if (!CanCastPowerCheck(newVerb, out reason)) { command_CastPower.Disable(reason.Translate(new object[] { newVerb.CasterPawn.NameStringShort })); } } yield return(command_CastPower); } temp = null; yield break; }