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; } } }