コード例 #1
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);
        }
        public override void OnMissionTick(float dt)
        {
            base.OnMissionTick(dt);
            Vec3       renderCameraPosition = this.Mission.Scene.LastFinalRenderCameraPosition;
            Vec3       vec3_1 = -this.Mission.Scene.LastFinalRenderCameraFrame.rotation.u;
            float      collisionDistance;
            GameEntity collidedEntity;
            bool       flag1 = Mission.Current.Scene.RayCastForClosestEntityOrTerrain(renderCameraPosition, renderCameraPosition + vec3_1 * 100f, out collisionDistance, out collidedEntity, excludeBodyFlags: BodyFlags.OnlyCollideWithRaycast);

            if (Input.DebugInput.IsShiftDown() && Agent.Main != null && ((NativeObject)collidedEntity != (NativeObject)null && !collidedEntity.HasScriptOfType <DestructableComponent>()))
            {
                float num = 5f;
                foreach (DestructableComponent destructableComponent in Mission.Current.ActiveMissionObjects.Where <MissionObject>((Func <MissionObject, bool>)(x => x is DestructableComponent)))
                {
                    if ((double)(destructableComponent.GameEntity.GlobalPosition - Agent.Main.Position).Length < (double)num)
                    {
                        collidedEntity = destructableComponent.GameEntity;
                    }
                }
            }
            GameEntity gameEntity1 = (GameEntity)null;

            if (flag1 && (Input.DebugInput.IsKeyDown(InputKey.MiddleMouseButton) || Input.DebugInput.IsKeyReleased(InputKey.MiddleMouseButton)))
            {
                Vec3 vec3_2 = renderCameraPosition + vec3_1 * collisionDistance;
                if ((NativeObject)collidedEntity == (NativeObject)null)
                {
                    return;
                }
                bool flag2      = Input.DebugInput.IsKeyReleased(InputKey.MiddleMouseButton);
                int  weaponKind = 0;
                if (flag2)
                {
                    weaponKind = !Input.DebugInput.IsAltDown() ? (!Input.DebugInput.IsControlDown() ? (int)Game.Current.ObjectManager.GetObject <ItemObject>("ballista_projectile").Id.InternalValue : (int)Game.Current.ObjectManager.GetObject <ItemObject>("pot").Id.InternalValue) : (int)Game.Current.ObjectManager.GetObject <ItemObject>("boulder").Id.InternalValue;
                }
                GameEntity            gameEntity2 = collidedEntity;
                DestructableComponent destructableComponent1;
                for (destructableComponent1 = (DestructableComponent)null; destructableComponent1 == null && (NativeObject)gameEntity2 != (NativeObject)null; gameEntity2 = gameEntity2.Parent)
                {
                    destructableComponent1 = gameEntity2.GetFirstScriptOfType <DestructableComponent>();
                }
                if (destructableComponent1 != null && !destructableComponent1.IsDestroyed)
                {
                    if (flag2)
                    {
                        if (Agent.Main != null)
                        {
                            DestructableComponent destructableComponent2 = destructableComponent1;
                            Agent             main            = Agent.Main;
                            Vec3              impactPosition  = vec3_2 - vec3_1 * 0.1f;
                            Vec3              impactDirection = vec3_1;
                            MissionWeapon     missionWeapon   = new MissionWeapon(ItemObject.GetItemFromWeaponKind(weaponKind), (ItemModifier)null, (Banner)null);
                            ref MissionWeapon local           = ref missionWeapon;
                            destructableComponent2.TriggerOnHit(main, 400, impactPosition, impactDirection, in local, (ScriptComponentBehaviour)null);
                        }
                    }
                    else
                    {
                        gameEntity1 = destructableComponent1.GameEntity;
                    }
                }
            }