public static void Postfix(ref string __result, Thing target)
        {
            var selectedThing = Find.Selector.SingleSelectedThing;

            if (__result.NullOrEmpty() && selectedThing != null)
            {
                // Create CE Tooltip
                StringBuilder           stringBuilder = new StringBuilder();
                Verb_LaunchProjectileCE verbCE        = null;
                Pawn pawn = selectedThing as Pawn;
                if (pawn != null && pawn != target && pawn.equipment != null &&
                    pawn.equipment.Primary != null && pawn.equipment.PrimaryEq.PrimaryVerb is Verb_LaunchProjectileCE)
                {
                    verbCE = pawn.equipment.PrimaryEq.PrimaryVerb as Verb_LaunchProjectileCE;
                }
                Building_TurretGunCE turret = selectedThing as Building_TurretGunCE;
                if (turret != null && turret != target)
                {
                    verbCE = turret.AttackVerb as Verb_LaunchProjectileCE;
                }
                if (verbCE != null)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShotBy".Translate(selectedThing.LabelShort, selectedThing) + ":\n");
                    string obstructReport;
                    if (verbCE.CanHitTarget(target, out obstructReport))
                    {
                        ShiftVecReport report = verbCE.ShiftVecReportFor(target);
                        stringBuilder.Append(report.GetTextReadout());
                    }
                    else
                    {
                        stringBuilder.Append("CannotHit".Translate());
                        if (!obstructReport.NullOrEmpty())
                        {
                            stringBuilder.Append(" " + obstructReport + ".");
                        }
                    }
                    Pawn pawn2 = target as Pawn;
                    if (pawn2 != null && pawn2.Faction == null && !pawn2.InAggroMentalState)
                    {
                        float manhunterOnDamageChance;
                        if (verbCE.IsMeleeAttack)
                        {
                            manhunterOnDamageChance = PawnUtility.GetManhunterOnDamageChance(pawn2, 0f, selectedThing);
                        }
                        else
                        {
                            manhunterOnDamageChance = PawnUtility.GetManhunterOnDamageChance(pawn2, selectedThing);
                        }
                        if (manhunterOnDamageChance > 0f)
                        {
                            stringBuilder.AppendLine();
                            stringBuilder.AppendLine(string.Format("{0}: {1}", "ManhunterPerHit".Translate(), manhunterOnDamageChance.ToStringPercent()));
                        }
                    }
                }
                __result = stringBuilder.ToString();
            }
        }
        public static void Postfix(ref Verb_LaunchProjectileCE __instance, ref ThingDef __result)
        {
            if (__instance.EquipmentSource != null)
            {
                if (!__instance.EquipmentSource.AllComps.NullOrEmpty())
                {
                    if (__instance.EquipmentSource.GetComp <CompUpgradeableProjectile>() != null && __instance.verbProps.defaultProjectile == __result)
                    {
                        if (__instance.EquipmentSource.GetComp <CompUpgradeableProjectile>() is CompUpgradeableProjectile upgradeableProjectile)
                        {
                            if (__instance.CasterPawn.Faction != null)
                            {
                                bool flag = upgradeableProjectile.ResearchDef != null;
                                if (flag)
                                {
                                    if (__instance.CasterPawn.Faction == Faction.OfPlayer && upgradeableProjectile.ResearchDef.IsFinished)
                                    {
                                        __result = upgradeableProjectile.ProjectileDef;
                                        return;
                                    }
                                }
                                else
                                {
                                    if (upgradeableProjectile.FactionDefs.Contains(__instance.CasterPawn.Faction.def))
                                    {
                                        __result = upgradeableProjectile.ProjectileDef;
                                        return;
                                    }
                                }
                            }
                        }
                    }

                    /*
                     * if (__instance.EquipmentSource.GetComp<CompSlotLoadable.CompSlotLoadable>() != null && __instance.verbProps.defaultProjectile == __result)
                     * {
                     * //    log.message(string.Format("{0} CompSlotLoadable != null", __instance.EquipmentSource));
                     *  if (__instance.EquipmentSource.GetComp<CompSlotLoadable.CompSlotLoadable>() is CompSlotLoadable.CompSlotLoadable slotLoadable)
                     *  {
                     *      if (!slotLoadable.Slots.NullOrEmpty())
                     *      {
                     *      //    log.message(string.Format("{0} Slots, Occupied: {1} Empty: {2}, Total: {3}", __instance.EquipmentSource, slotLoadable.Slots.FindAll(x => x.SlotOccupant != null).Count, slotLoadable.Slots.FindAll(x => x.SlotOccupant == null).Count, slotLoadable.Slots.Count));
                     *          foreach (CompSlotLoadable.SlotLoadable slot in slotLoadable.Slots.FindAll(x => x.SlotOccupant != null))
                     *          {
                     *              CompSlotLoadable.CompSlottedBonus slottedBonus = slot.SlotOccupant.TryGetCompFast<CompSlotLoadable.CompSlottedBonus>();
                     *          //    log.message(string.Format("{0}'s Slot at {1} with: {2} slottedBonus: {3}", __instance.EquipmentSource, slotLoadable.Slots.IndexOf(slot), slot.SlotOccupant, slottedBonus!=null));
                     *              if (slottedBonus != null)
                     *              {
                     *              //    log.message(string.Format("{0} slottedBonus: {1}", __instance.EquipmentSource, slottedBonus));
                     *                  __result = slottedBonus.Props.projectileReplacer;
                     *                  break;
                     *              }
                     *          }
                     *      }
                     *  }
                     * }
                     */
                }
            }
        }
Ejemplo n.º 3
0
        public static Vector2 MuzzlePosition(Vector2 sourceLoc, Verb_LaunchProjectileCE instance)
        {
            //    Log.Message("MuzzlePosition CE");
            Vector2 result = sourceLoc;
            //    Log.Message("MuzzlePosition CE sourceLoc: " + sourceLoc);
            string msg      = "CE MuzzlePosition {0}: {1}, aimAngle: {2}";
            float  aimAngle = 0f;

            if (instance.EquipmentSource is Thing equipment)
            {
                //    Log.Message("MuzzlePosition CE EquipmentSource: " + equipment);
                Thing   launcher    = instance.Shooter;
                Vector3 origin      = new Vector3(sourceLoc.x, 0, sourceLoc.y);
                Vector3 destination = instance.CurrentTarget.Cell.ToVector3Shifted();
                if ((destination - origin).MagnitudeHorizontalSquared() > 0.001f)
                {
                    aimAngle = (destination - origin).AngleFlat();
                }
                IDrawnWeaponWithRotation rotation = equipment as IDrawnWeaponWithRotation;
                if (rotation != null)
                {
                    //    Log.Message(rotation + " is IDrawnWeaponWithRotation with RotationOffset: " + rotation.RotationOffset);
                    aimAngle += rotation.RotationOffset;
                }
                Log.Message(string.Format(msg, "Original", sourceLoc, aimAngle));
                GunDrawExtension gunDrawExtension = equipment.def.GetModExtensionFast <GunDrawExtension>();
                if (gunDrawExtension != null)
                {
                    Log.Message("gunDrawExtension");
                }
                else
                if (equipment.def.HasComp(typeof(OgsCompOversizedWeapon.CompOversizedWeapon)))
                {
                    OgsCompOversizedWeapon.CompOversizedWeapon compOversized = equipment.TryGetCompFast <OgsCompOversizedWeapon.CompOversizedWeapon>();
                    if (compOversized != null)
                    {
                        bool    DualWeapon     = compOversized.Props != null && compOversized.Props.isDualWeapon;
                        Vector3 offsetMainHand = default(Vector3);
                        Vector3 offsetOffHand  = default(Vector3);
                        float   offHandAngle   = aimAngle;
                        float   mainHandAngle  = aimAngle;

                        OgsCompOversizedWeapon.OversizedUtil.SetAnglesAndOffsets(equipment, equipment as ThingWithComps, aimAngle, launcher, ref offsetMainHand, ref offsetOffHand, ref offHandAngle, ref mainHandAngle, true, DualWeapon && !compOversized.FirstAttack);
                        Vector3 vector = DualWeapon && !compOversized.FirstAttack ? offsetOffHand : offsetMainHand;
                        //    Vector3 vector = compOversized.AdjustRenderOffsetFromDir(equippable.PrimaryVerb.CasterPawn, !compOversized.FirstAttack);
                        origin += vector;
                    }
                }
                origin = equipment.MuzzlePositionFor(origin, aimAngle);
                result = new Vector2(origin.x, origin.z);
            }
            Log.Message(string.Format(msg, "result", result, aimAngle));
            return(result);
        }
        /// <summary>
        /// Returns a predicate for valid targets if the verb is a Verb_LaunchProjectileCE or descendent.
        /// </summary>
        /// <param name="verb">Verb that is to be checked for type and used for valid target checking</param>
        /// <returns>Predicate of type Thing which indicates if that thing is a valid target for the pawn.</returns>
        static Predicate <Thing> GetValidTargetPredicate(Verb verb)
        {
            Predicate <Thing> predicate = null;

            if ((verb as Verb_LaunchProjectileCE) != null)
            {
                Verb_LaunchProjectileCE verbCE = verb as Verb_LaunchProjectileCE;
                predicate = t => verbCE.CanHitTargetFrom(verb.caster.Position, new LocalTargetInfo(t));
            }

            return(predicate);
        }
Ejemplo n.º 5
0
        internal static void VerbsTick(this VerbTracker _this)
        {
            if (_this.AllVerbs == null)
            {
                return;
            }
            foreach (Verb verb in _this.AllVerbs)
            {
                verb.VerbTick();

                // If we have a CE verb, call custom VerbTicker
                Verb_LaunchProjectileCE verbCE = verb as Verb_LaunchProjectileCE;
                if (verbCE != null)
                {
                    verbCE.VerbTickCE();
                }
            }
        }
 static bool Postfix(
     bool __result,
     Verb_LaunchProjectileCE __instance,
     IntVec3 root,
     LocalTargetInfo targ,
     ref string report)
 {
     if (__result)
     {
         if (ShieldBlocks(__instance.caster, __instance, root, targ))
         {
             report = "Block by shield";
             return(false);
         }
         return(true);
     }
     return(false);
 }
 internal static void Postfix(Verb __instance, ref bool __result, LocalTargetInfo castTarg, bool surpriseAttack = false, bool canHitNonTargetPawns = true)
 {
     if (__result)
     {
         if (__instance.CasterIsPawn && __instance.verbProps.warmupTime > 0f && __instance.verbProps.verbClass != null && __instance.verbProps.verbClass == typeof(Verb_ShootCE))
         {
             bool extcheck = __instance is Verb_ShootCEOneUse || __instance is Verb_ShootMortarCE;
             if (!extcheck)
             {
                 ShootLine newShootLine;
                 Verb_LaunchProjectileCE vlCE = __instance as Verb_LaunchProjectileCE;
                 if (!vlCE.TryFindCEShootLineFromTo(__instance.caster.Position, castTarg, out newShootLine))
                 {
                     __result = false;
                 }
                 __instance.CasterPawn.Drawer.Notify_WarmingCastAlongLine(newShootLine, __instance.caster.Position);
             }
         }
     }
 }
 public static void Postfix(ref string __result, Thing target)
 {
     if (__result.NullOrEmpty() && Find.Selector.SingleSelectedThing != null)
     {
         // Create CE Tooltip
         StringBuilder           stringBuilder = new StringBuilder();
         Verb_LaunchProjectileCE verbCE        = null;
         Pawn pawn = Find.Selector.SingleSelectedThing as Pawn;
         if (pawn != null && pawn != target && pawn.equipment != null &&
             pawn.equipment.Primary != null && pawn.equipment.PrimaryEq.PrimaryVerb is Verb_LaunchProjectileCE)
         {
             verbCE = pawn.equipment.PrimaryEq.PrimaryVerb as Verb_LaunchProjectileCE;
         }
         Building_TurretGunCE turret = Find.Selector.SingleSelectedThing as Building_TurretGunCE;
         if (turret != null && turret != target)
         {
             verbCE = turret.AttackVerb as Verb_LaunchProjectileCE;
         }
         if (verbCE != null)
         {
             stringBuilder.AppendLine();
             stringBuilder.Append("ShotBy".Translate(new object[] { Find.Selector.SingleSelectedThing.LabelShort }) + ":\n");
             string obstructReport;
             if (verbCE.CanHitTarget(target, out obstructReport))
             {
                 ShiftVecReport report = verbCE.ShiftVecReportFor(target);
                 stringBuilder.Append(report.GetTextReadout());
             }
             else
             {
                 stringBuilder.Append("CannotHit".Translate());
                 if (!obstructReport.NullOrEmpty())
                 {
                     stringBuilder.Append(" " + obstructReport + ".");
                 }
             }
         }
         __result = stringBuilder.ToString();
     }
 }
        internal static string ShotCalculationTipString(Thing target)
        {
            StringBuilder stringBuilder = new StringBuilder();

            if (Find.Selector.SingleSelectedThing != null)
            {
                Verb verb = null;
                Verb_LaunchProjectileCE verbCE = null;
                Pawn pawn = Find.Selector.SingleSelectedThing as Pawn;
                if (pawn != null && pawn != target && pawn.equipment != null && pawn.equipment.Primary != null && pawn.equipment.PrimaryEq.PrimaryVerb is Verb_LaunchProjectile)
                {
                    verb = pawn.equipment.PrimaryEq.PrimaryVerb;
                }
                Building_TurretGun building_TurretGun = Find.Selector.SingleSelectedThing as Building_TurretGun;
                if (building_TurretGun != null && building_TurretGun != target)
                {
                    verb = building_TurretGun.AttackVerb;
                }
                if (verb != null)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShotBy".Translate(new object[]
                    {
                        Find.Selector.SingleSelectedThing.LabelShort
                    }) + ": ");
                    if (verb.CanHitTarget(target))
                    {
                        stringBuilder.Append(ShotReport.HitReportFor(verb.caster, verb, target).GetTextReadout());
                    }
                    else
                    {
                        stringBuilder.Append("CannotHit".Translate());
                    }
                }
                // Append CE tooltip
                else
                {
                    if (pawn != null && pawn != target && pawn.equipment != null &&
                        pawn.equipment.Primary != null && pawn.equipment.PrimaryEq.PrimaryVerb is Verb_LaunchProjectileCE)
                    {
                        verbCE = pawn.equipment.PrimaryEq.PrimaryVerb as Verb_LaunchProjectileCE;
                    }
                    Building_TurretGun building_TurretGun2 = Find.Selector.SingleSelectedThing as Building_TurretGun;
                    if (building_TurretGun != null && building_TurretGun != target)
                    {
                        verbCE = building_TurretGun.AttackVerb as Verb_LaunchProjectileCE;
                    }
                    if (verbCE != null)
                    {
                        stringBuilder.AppendLine();
                        stringBuilder.Append("ShotBy".Translate(new object[] { pawn.LabelShort }) + ":\n");
                        if (verbCE.CanHitTarget(target))
                        {
                            ShiftVecReport report = verbCE.ShiftVecReportFor(target);
                            stringBuilder.Append(report.GetTextReadout());
                        }
                        else
                        {
                            stringBuilder.Append("CannotHit".Translate());
                        }
                    }
                }
            }
            return(stringBuilder.ToString());
        }