public static void Postfix(float armorAmountFloat,
                            WeaponComponentData shieldOnBack,
                            AgentFlag victimAgentFlag,
                            float victimAgentAbsorbedDamageRatio,
                            float damageMultiplierOfBone,
                            float combatDifficultyMultiplier,
                            DamageTypes damageType,
                            float magnitude,
                            Vec3 blowPosition,
                            ItemObject item,
                            bool blockedWithShield,
                            bool hitShieldOnBack,
                            int speedBonus,
                            bool cancelDamage,
                            bool isFallDamage,
                            ref int inflictedDamage,
                            ref int absorbedByArmor,
                            ref int armorAmount)
 {
     if (damageType == DamageTypes.Pierce && victimAgentFlag.HasAnyFlag <AgentFlag>(AgentFlag.Mountable))
     {
         inflictedDamage = (int)(inflictedDamage * SubModule.Settings.Battle_WarStomp_DamageMultiplierToHorse);
     }
 }
Exemplo n.º 2
0
        public static void GetAttackCollisionResults(Mission.Missile missile, bool isHorseArcher, float armorAmountFloat, WeaponComponentData shieldOnBack, AgentFlag victimAgentFlag, float victimAgentAbsorbedDamageRatio, float damageMultiplierOfBone, float combatDifficultyMultiplier, MissionWeapon victimShield, bool canGiveDamageToAgentShield, bool isVictimAgentLeftStance, bool isFriendlyFire, bool doesAttackerHaveMountAgent, bool doesVictimHaveMountAgent, Vec2 attackerAgentMovementVelocity, Vec3 attackerAgentMountMovementDirection, float attackerMovementDirectionAsAngle, Vec2 victimAgentMovementVelocity, Vec3 victimAgentMountMovementDirection, float victimMovementDirectionAsAngle, bool isVictimAgentSameWithAttackerAgent, bool isAttackerAgentMine, bool isAttackerAgentHasRiderAgent, bool isAttackerAgentRiderAgentIsMine, bool isAttackerAgentMount, bool isVictimAgentMine, bool isVictimAgentHasRiderAgent, bool isVictimAgentRiderAgentIsMine, bool isVictimAgentMount, bool isAttackerAgentNull, bool isAttackerAIControlled, BasicCharacterObject attackerAgentCharacter, BasicCharacterObject victimAgentCharacter, Vec3 attackerAgentMovementDirection, Vec3 attackerAgentVelocity, float attackerAgentMountChargeDamageProperty, Vec3 attackerAgentCurrentWeaponOffset, bool isAttackerAgentHuman, bool isAttackerAgentActive, bool isAttackerAgentCharging, bool isVictimAgentNull, float victimAgentScale, float victimAgentWeight, float victimAgentTotalEncumbrance, bool isVictimAgentHuman, Vec3 victimAgentVelocity, Vec3 victimAgentPosition, int weaponAttachBoneIndex, MissionWeapon offHandItem, bool isHeadShot, bool crushedThrough, bool IsVictimRiderAgentSameAsAttackerAgent, float momentumRemaining, ref AttackCollisionData attackCollisionData, bool cancelDamage, string victimAgentName, out CombatLogData combatLog)
        {
            float distance = 0f;

            if (attackCollisionData.IsMissile)
            {
                distance = (attackCollisionData.MissileStartingPosition - attackCollisionData.CollisionGlobalPosition).Length;
            }
            combatLog = new CombatLogData(isVictimAgentSameWithAttackerAgent, isAttackerAgentHuman, isAttackerAgentMine, isAttackerAgentHasRiderAgent, isAttackerAgentRiderAgentIsMine, isAttackerAgentMount, isVictimAgentHuman, isVictimAgentMine, false, isVictimAgentHasRiderAgent, isVictimAgentRiderAgentIsMine, isVictimAgentMount, false, IsVictimRiderAgentSameAsAttackerAgent, false, false, distance);
            ItemObject          itemFromWeaponKind  = ItemObject.GetItemFromWeaponKind(attackCollisionData.AffectorWeaponKind);
            WeaponComponentData weaponComponentData = (itemFromWeaponKind != null) ? itemFromWeaponKind.GetWeaponWithUsageIndex(attackCollisionData.CurrentUsageIndex) : null;
            bool flag = Extensions.HitWithAnotherBone(ref attackCollisionData, weaponAttachBoneIndex);
            Vec3 agentVelocityContribution  = Extensions.GetAgentVelocityContribution(doesAttackerHaveMountAgent, attackerAgentMovementVelocity, attackerAgentMountMovementDirection, attackerMovementDirectionAsAngle);
            Vec3 agentVelocityContribution2 = Extensions.GetAgentVelocityContribution(doesVictimHaveMountAgent, victimAgentMovementVelocity, victimAgentMountMovementDirection, victimMovementDirectionAsAngle);

            if (attackCollisionData.IsColliderAgent)
            {
                combatLog.IsRangedAttack = attackCollisionData.IsMissile;
                combatLog.HitSpeed       = (attackCollisionData.IsMissile ? (agentVelocityContribution2 - attackCollisionData.MissileVelocity).Length : (agentVelocityContribution - agentVelocityContribution2).Length);
            }
            float baseMagnitude;
            int   speedBonus;

            Mission.ComputeBlowMagnitude(ref attackCollisionData, doesVictimHaveMountAgent, weaponComponentData, isAttackerAgentNull, attackerAgentCharacter, attackerAgentMovementDirection, attackerAgentVelocity, attackerAgentMountChargeDamageProperty, attackerAgentCurrentWeaponOffset, isAttackerAgentHuman, isAttackerAgentActive, isAttackerAgentCharging, isVictimAgentNull, victimAgentScale, victimAgentWeight, victimAgentTotalEncumbrance, isVictimAgentHuman, victimAgentVelocity, victimAgentPosition, momentumRemaining, cancelDamage, flag, attackCollisionData.MissileTotalDamage, agentVelocityContribution, agentVelocityContribution2, out attackCollisionData.BaseMagnitude, out baseMagnitude, out attackCollisionData.MovementSpeedDamageModifier, out speedBonus);
            DamageTypes damageType = (itemFromWeaponKind == null || flag || attackCollisionData.IsAlternativeAttack || attackCollisionData.IsFallDamage || attackCollisionData.IsHorseCharge) ? DamageTypes.Blunt : ((DamageTypes)attackCollisionData.DamageType);

            combatLog.DamageType = damageType;
            if (!attackCollisionData.IsColliderAgent && attackCollisionData.EntityExists)
            {
                string name         = PhysicsMaterial.GetFromIndex(attackCollisionData.PhysicsMaterialIndex).Name;
                bool   isWoodenBody = name == "wood" || name == "wood_weapon" || name == "wood_shield";
                attackCollisionData.BaseMagnitude  *= Extensions.GetEntityDamageMultiplier(isAttackerAgentCharging, weaponComponentData, damageType, isWoodenBody);
                attackCollisionData.InflictedDamage = MBMath.ClampInt((int)attackCollisionData.BaseMagnitude, 0, 2000);
                combatLog.InflictedDamage           = attackCollisionData.InflictedDamage;
            }
            int num = 0;

            if (attackCollisionData.IsColliderAgent && !isVictimAgentNull)
            {
                if (attackCollisionData.IsAlternativeAttack)
                {
                    baseMagnitude = attackCollisionData.BaseMagnitude;
                }
                if (attackCollisionData.AttackBlockedWithShield)
                {
                    Mission.ComputeBlowDamageOnShield(isAttackerAgentNull, isAttackerAgentActive, isAttackerAgentCharging, canGiveDamageToAgentShield, isVictimAgentLeftStance, victimShield, ref attackCollisionData, weaponComponentData, attackCollisionData.BaseMagnitude);
                    attackCollisionData.AbsorbedByArmor = attackCollisionData.InflictedDamage;
                }
                else
                {
                    Mission.ComputeBlowDamage(armorAmountFloat, shieldOnBack, victimAgentFlag, victimAgentAbsorbedDamageRatio, damageMultiplierOfBone, combatDifficultyMultiplier, damageType, baseMagnitude, attackCollisionData.CollisionGlobalPosition, itemFromWeaponKind, attackCollisionData.AttackBlockedWithShield, attackCollisionData.CollidedWithShieldOnBack, speedBonus, cancelDamage, attackCollisionData.IsFallDamage, out attackCollisionData.InflictedDamage, out attackCollisionData.AbsorbedByArmor, out num);
                }



                GCOToolbox.GCOToolbox.ProjectileBalance.ApplyProjectileArmorResistance(armorAmountFloat, ref attackCollisionData, missile, isHorseArcher);


                combatLog.InflictedDamage = attackCollisionData.InflictedDamage;
                combatLog.AbsorbedDamage  = attackCollisionData.AbsorbedByArmor;

                //combatLog.AttackProgress = attackCollisionData.AttackProgress;
                //issionGameModels.Current.AgentApplyDamageModel.CalculateDamage(attackerAgentCharacter, victimAgentCharacter, offHandItem, isHeadShot, isVictimAgentMount, isVictimAgentHuman, doesAttackerHaveMountAgent, isVictimAgentNull, isAttackerAgentHuman, attackCollisionData, weaponComponentData);
                //combatLog.ExtraDamage = attackCollisionData.InflictedDamage - combatLog.InflictedDamage;
            }
            if (!attackCollisionData.IsFallDamage && isFriendlyFire && !isAttackerAIControlled && GameNetwork.IsSessionActive)
            {
                int num2 = attackCollisionData.IsMissile ? MultiplayerOptions.OptionType.FriendlyFireDamageRangedSelfPercent.GetIntValue(MultiplayerOptions.MultiplayerOptionsAccessMode.CurrentMapOptions) : MultiplayerOptions.OptionType.FriendlyFireDamageMeleeSelfPercent.GetIntValue(MultiplayerOptions.MultiplayerOptionsAccessMode.CurrentMapOptions);
                attackCollisionData.SelfInflictedDamage = MBMath.Round((float)attackCollisionData.InflictedDamage * ((float)num2 * 0.01f));
                int num3 = attackCollisionData.IsMissile ? MultiplayerOptions.OptionType.FriendlyFireDamageRangedFriendPercent.GetIntValue(MultiplayerOptions.MultiplayerOptionsAccessMode.CurrentMapOptions) : MultiplayerOptions.OptionType.FriendlyFireDamageMeleeFriendPercent.GetIntValue(MultiplayerOptions.MultiplayerOptionsAccessMode.CurrentMapOptions);
                attackCollisionData.InflictedDamage = MBMath.Round((float)attackCollisionData.InflictedDamage * ((float)num3 * 0.01f));
                if (isVictimAgentMount && !doesAttackerHaveMountAgent)
                {
                    attackCollisionData.InflictedDamage = MBMath.Round((float)attackCollisionData.InflictedDamage * 0.1f);
                }
                combatLog.InflictedDamage = attackCollisionData.InflictedDamage;
                combatLog.IsFriendlyFire  = true;
            }
            if (attackCollisionData.AttackBlockedWithShield && attackCollisionData.InflictedDamage > 0 && (int)victimShield.HitPoints - attackCollisionData.InflictedDamage <= 0)
            {
                attackCollisionData.IsShieldBroken = true;
            }
        }
Exemplo n.º 3
0
        internal static bool GetAttackCollisionResultsPrefix(ref Mission __instance, bool isHorseArcher, Mission.Missile missile, Agent attackerAgent, Agent victimAgent, GameEntity hitObject, float momentumRemaining, ref AttackCollisionData attackCollisionData, bool crushedThrough, bool cancelDamage, out WeaponComponentData shieldOnBack)
        {
            bool  flag             = attackerAgent == null;
            bool  flag2            = victimAgent == null;
            float armorAmountFloat = 0f;

            if (!flag2)
            {
                armorAmountFloat = victimAgent.GetBaseArmorEffectivenessForBodyPart(attackCollisionData.VictimHitBodyPart);
            }
            shieldOnBack = null;
            if (!flag2 && (victimAgent.GetAgentFlags() & AgentFlag.CanWieldWeapon) != AgentFlag.None)
            {
                EquipmentIndex wieldedItemIndex = victimAgent.GetWieldedItemIndex(Agent.HandIndex.OffHand);
                victimAgent.GetWieldedItemIndex(Agent.HandIndex.OffHand);
                for (int i = 0; i < 4; i++)
                {
                    WeaponComponentData currentUsageItem = victimAgent.Equipment[i].CurrentUsageItem;
                    if (i != (int)wieldedItemIndex && currentUsageItem != null && currentUsageItem.IsShield)
                    {
                        shieldOnBack = currentUsageItem;
                        break;
                    }
                }
            }
            MissionWeapon victimShield = default(MissionWeapon);

            if (!flag2 && (victimAgent.GetAgentFlags() & AgentFlag.CanWieldWeapon) != AgentFlag.None)
            {
                EquipmentIndex wieldedItemIndex2 = victimAgent.GetWieldedItemIndex(Agent.HandIndex.OffHand);
                if (wieldedItemIndex2 != EquipmentIndex.None)
                {
                    victimShield = victimAgent.Equipment[wieldedItemIndex2];
                }
            }
            Vec3 attackerAgentMountMovementDirection = default(Vec3);

            if (!flag && attackerAgent.HasMount)
            {
                attackerAgentMountMovementDirection = attackerAgent.MountAgent.GetMovementDirection();
            }
            Vec3 victimAgentMountMovementDirection = default(Vec3);

            if (!flag2 && victimAgent.HasMount)
            {
                victimAgentMountMovementDirection = victimAgent.MountAgent.GetMovementDirection();
            }
            bool                  flag3 = attackerAgent == victimAgent;
            ItemObject            itemFromWeaponKind    = ItemObject.GetItemFromWeaponKind(attackCollisionData.AffectorWeaponKind);
            int                   weaponAttachBoneIndex = (int)((itemFromWeaponKind != null && !flag && attackerAgent.IsHuman) ? attackerAgent.Monster.GetBoneToAttachForItem(itemFromWeaponKind) : -1);
            DestructableComponent destructableComponent = (hitObject != null) ? hitObject.GetFirstScriptOfTypeInFamily <DestructableComponent>() : null;
            bool                  flag4;

            if (!flag3 && (flag2 || !victimAgent.IsFriendOf(attackerAgent)))
            {
                if (destructableComponent != null)
                {
                    BattleSideEnum battleSide     = destructableComponent.BattleSide;
                    Team           team           = attackerAgent.Team;
                    BattleSideEnum?battleSideEnum = (team != null) ? new BattleSideEnum?(team.Side) : null;
                    flag4 = (battleSide == battleSideEnum.GetValueOrDefault() & battleSideEnum != null);
                }
                else
                {
                    flag4 = false;
                }
            }
            else
            {
                flag4 = true;
            }
            bool          isFriendlyFire = flag4;
            MissionWeapon offHandItem    = default(MissionWeapon);

            if (!flag && (attackerAgent.GetAgentFlags() & AgentFlag.CanWieldWeapon) != AgentFlag.None)
            {
                EquipmentIndex wieldedItemIndex3 = attackerAgent.GetWieldedItemIndex(Agent.HandIndex.OffHand);
                if (wieldedItemIndex3 != EquipmentIndex.None)
                {
                    offHandItem = attackerAgent.Equipment[wieldedItemIndex3];
                }
            }
            bool                 isHeadShot = attackCollisionData.VictimHitBodyPart == BoneBodyPartType.Head;
            float                victimAgentAbsorbedDamageRatio = 0f;
            float                num = 0f;
            float                victimMovementDirectionAsAngle = 0f;
            float                victimAgentScale            = 0f;
            float                victimAgentWeight           = 0f;
            float                victimAgentTotalEncumbrance = 0f;
            float                combatDifficultyMultiplier  = 1f;
            AgentFlag            victimAgentFlag             = AgentFlag.CanAttack;
            bool                 isVictimAgentLeftStance     = false;
            bool                 doesVictimHaveMountAgent    = false;
            bool                 isVictimAgentMine           = false;
            bool                 flag5 = false;
            bool                 isVictimAgentRiderAgentIsMine         = false;
            bool                 isVictimAgentMount                    = false;
            bool                 isVictimAgentHuman                    = false;
            bool                 isVictimRiderAgentSameAsAttackerAgent = false;
            BasicCharacterObject victimAgentCharacter                  = new BasicCharacterObject();
            Vec2                 victimAgentMovementVelocity           = default(Vec2);
            Vec3                 victimAgentPosition                   = default(Vec3);
            Vec3                 victimAgentVelocity                   = default(Vec3);
            string               victimAgentName = string.Empty;

            if (!flag2)
            {
                isVictimAgentMount = victimAgent.IsMount;
                isVictimAgentMine  = victimAgent.IsMine;
                bool isMainAgent = victimAgent.IsMainAgent;
                isVictimAgentHuman       = victimAgent.IsHuman;
                isVictimAgentLeftStance  = victimAgent.GetIsLeftStance();
                doesVictimHaveMountAgent = victimAgent.HasMount;
                flag5 = (victimAgent.RiderAgent != null);
                isVictimRiderAgentSameAsAttackerAgent = (!flag5 && victimAgent.RiderAgent == attackerAgent);
                victimAgentAbsorbedDamageRatio        = victimAgent.Monster.AbsorbedDamageRatio;
                num = victimAgent.GetDamageMultiplierForBone(attackCollisionData.CollisionBoneIndex, (DamageTypes)attackCollisionData.DamageType);
                if (!attackCollisionData.IsMissile && (sbyte)attackCollisionData.DamageType == 1)
                {
                    num = (1f + num) * 0.5f;
                }
                victimMovementDirectionAsAngle = victimAgent.MovementDirectionAsAngle;
                victimAgentScale            = victimAgent.AgentScale;
                victimAgentWeight           = (float)victimAgent.Monster.Weight;
                victimAgentTotalEncumbrance = victimAgent.GetTotalEncumbrance();
                combatDifficultyMultiplier  = __instance.GetDamageMultiplierOfCombatDifficulty(victimAgent);
                string name = victimAgent.Name;
                victimAgentName               = (((name != null) ? name.ToString() : null) ?? string.Empty);
                victimAgentMovementVelocity   = victimAgent.MovementVelocity;
                victimAgentVelocity           = victimAgent.Velocity;
                victimAgentPosition           = victimAgent.Position;
                victimAgentFlag               = victimAgent.GetAgentFlags();
                victimAgentCharacter          = victimAgent.Character;
                isVictimAgentRiderAgentIsMine = (flag5 && victimAgent.RiderAgent.IsMine);
                if (victimAgent.MountAgent != null)
                {
                    Vec2 movementVelocity = victimAgent.MountAgent.MovementVelocity;
                }
            }
            float attackerMovementDirectionAsAngle       = 0f;
            float attackerAgentMountChargeDamageProperty = 0f;
            bool  doesAttackerHaveMountAgent             = false;
            bool  isAttackerAgentMine = false;
            bool  flag6 = false;
            bool  isAttackerAgentRiderAgentIsMine = false;
            bool  isAttackerAgentMount            = false;
            bool  isAttackerAgentHuman            = false;
            bool  flag7 = false;
            bool  isAttackerAgentCharging               = false;
            Vec2  attackerAgentMovementVelocity         = default(Vec2);
            BasicCharacterObject attackerAgentCharacter = new BasicCharacterObject();
            Vec3 attackerAgentMovementDirection         = default(Vec3);
            Vec3 attackerAgentVelocity            = default(Vec3);
            Vec3 attackerAgentCurrentWeaponOffset = default(Vec3);
            bool isAttackerAIControlled           = false;

            if (!flag)
            {
                doesAttackerHaveMountAgent = attackerAgent.HasMount;
                bool isMainAgent2 = attackerAgent.IsMainAgent;
                isAttackerAgentMine  = attackerAgent.IsMine;
                isAttackerAgentMount = attackerAgent.IsMount;
                isAttackerAgentHuman = attackerAgent.IsHuman;
                flag7 = attackerAgent.IsActive();
                isAttackerAgentCharging = attackerAgent.IsCharging;
                flag6 = (attackerAgent.RiderAgent != null);
                isAttackerAIControlled                 = attackerAgent.IsAIControlled;
                attackerMovementDirectionAsAngle       = attackerAgent.MovementDirectionAsAngle;
                attackerAgentMountChargeDamageProperty = attackerAgent.GetAgentDrivenPropertyValue(DrivenProperty.MountChargeDamage);
                attackerAgentMovementVelocity          = attackerAgent.MovementVelocity;
                attackerAgentMovementDirection         = attackerAgent.GetMovementDirection();
                attackerAgentVelocity = attackerAgent.Velocity;
                if (flag7)
                {
                    attackerAgentCurrentWeaponOffset = attackerAgent.GetCurWeaponOffset();
                }
                attackerAgentCharacter = attackerAgent.Character;
                if (flag6)
                {
                    isAttackerAgentRiderAgentIsMine = attackerAgent.RiderAgent.IsMine;
                }
                if (attackerAgent.MountAgent != null)
                {
                    Vec2 movementVelocity2 = attackerAgent.MountAgent.MovementVelocity;
                }
            }
            bool canGiveDamageToAgentShield = true;

            if (!flag3)
            {
                canGiveDamageToAgentShield = Extensions.CanGiveDamageToAgentShield(attackerAgent, victimAgent);
            }
            CombatLogData combatLog;


            GetAttackCollisionResults(missile, isHorseArcher, armorAmountFloat, shieldOnBack, victimAgentFlag, victimAgentAbsorbedDamageRatio, num, combatDifficultyMultiplier, victimShield, canGiveDamageToAgentShield, isVictimAgentLeftStance, isFriendlyFire, doesAttackerHaveMountAgent, doesVictimHaveMountAgent, attackerAgentMovementVelocity, attackerAgentMountMovementDirection, attackerMovementDirectionAsAngle, victimAgentMovementVelocity, victimAgentMountMovementDirection, victimMovementDirectionAsAngle, flag3, isAttackerAgentMine, flag6, isAttackerAgentRiderAgentIsMine, isAttackerAgentMount, isVictimAgentMine, flag5, isVictimAgentRiderAgentIsMine, isVictimAgentMount, flag, isAttackerAIControlled, attackerAgentCharacter, victimAgentCharacter, attackerAgentMovementDirection, attackerAgentVelocity, attackerAgentMountChargeDamageProperty, attackerAgentCurrentWeaponOffset, isAttackerAgentHuman, flag7, isAttackerAgentCharging, flag2, victimAgentScale, victimAgentWeight, victimAgentTotalEncumbrance, isVictimAgentHuman, victimAgentVelocity, victimAgentPosition, weaponAttachBoneIndex, offHandItem, isHeadShot, crushedThrough, isVictimRiderAgentSameAsAttackerAgent, momentumRemaining, ref attackCollisionData, cancelDamage, victimAgentName, out combatLog);
            combatLog.BodyPartHit    = attackCollisionData.VictimHitBodyPart;
            combatLog.IsFatalDamage  = (victimAgent != null && victimAgent.Health - (float)attackCollisionData.InflictedDamage <= 0f);
            combatLog.IsVictimEntity = (hitObject != null);

            Extensions.PrintAttackCollisionResults(attackerAgent, victimAgent, hitObject, attackCollisionData, combatLog, cancelDamage);

            return(false);
        }