internal static bool ApplyHorseCrippleLogic(Agent victim, BoneBodyPartType victimHitBodyPart) { bool makesRear = false; if (Config.ConfigSettings.HorseProjectileCrippleEnabled) { if (victim != null && victim.IsMount) { if (victim.RiderAgent != null && !victim.RiderAgent.IsMainAgent) { if (victimHitBodyPart == BoneBodyPartType.Head || victimHitBodyPart == BoneBodyPartType.Neck) { makesRear = Config.ConfigSettings.HorseHeadshotRearingEnabled; } else { if (victim.IsActive() && victim.RiderAgent) { victim.RiderAgent.AgentDrivenProperties.MountSpeed = 0f; HorseCrippleLogic.CrippleHorseNew(victim, MissionTime.SecondsFromNow((float)Config.ConfigSettings.HorseProjectileCrippleDuration)); victim.UpdateAgentStats(); } } } } } return(makesRear); }
private static bool UpdateHorseStatsPrefix(ref SandboxAgentStatCalculateModel __instance, Agent agent, AgentDrivenProperties agentDrivenProperties) { Equipment spawnEquipment = agent.SpawnEquipment; agentDrivenProperties.AiSpeciesIndex = (int)spawnEquipment[EquipmentIndex.ArmorItemEndSlot].Item.Id.InternalValue; agentDrivenProperties.AttributeRiding = 0.8f + ((spawnEquipment[EquipmentIndex.HorseHarness].Item != null) ? 0.2f : 0f); float num = 0f; for (int i = 1; i < 12; i++) { if (spawnEquipment[i].Item != null) { num += (float)spawnEquipment[i].GetBodyArmorHorse(); } } agentDrivenProperties.ArmorTorso = num; ItemObject item = spawnEquipment[EquipmentIndex.ArmorItemEndSlot].Item; if (item != null) { float num2 = 1f; if (!agent.Mission.Scene.IsAtmosphereIndoor) { if (agent.Mission.Scene.GetRainDensity() > 0f) { num2 *= 0.9f; } if (CampaignTime.Now.IsNightTime) { num2 *= 0.9f; } } HorseComponent horseComponent = item.HorseComponent; EquipmentElement equipmentElement = spawnEquipment[EquipmentIndex.ArmorItemEndSlot]; EquipmentElement harness = spawnEquipment[EquipmentIndex.HorseHarness]; int baseHorseManeuver = equipmentElement.GetBaseHorseManeuver(harness); int num3 = equipmentElement.GetBaseHorseSpeed(harness) + 1; agentDrivenProperties.MountChargeDamage = (float)equipmentElement.GetBaseHorseCharge(harness) * 0.004f; agentDrivenProperties.MountDifficulty = (float)equipmentElement.Item.Difficulty; RidingModel ridingModel = Game.Current.BasicModels.RidingModel; ItemObject item2 = equipmentElement.Item; Agent riderAgent = agent.RiderAgent; agentDrivenProperties.TopSpeedReachDuration = ridingModel.CalculateAcceleration(item2, (riderAgent != null) ? riderAgent.Character : null); if (agent.RiderAgent != null) { ExplainedNumber explainedNumber = new ExplainedNumber((float)baseHorseManeuver, null); ExplainedNumber explainedNumber2 = new ExplainedNumber((float)num3, null); SkillHelper.AddSkillBonusForCharacter(DefaultSkills.Riding, DefaultSkillEffects.HorseManeuver, agent.RiderAgent.Character as CharacterObject, ref explainedNumber, true); SkillHelper.AddSkillBonusForCharacter(DefaultSkills.Riding, DefaultSkillEffects.HorseSpeed, agent.RiderAgent.Character as CharacterObject, ref explainedNumber2, true); if (harness.Item == null) { explainedNumber.AddFactor(-0.1f, null); explainedNumber2.AddFactor(-0.1f, null); } agentDrivenProperties.MountManeuver = explainedNumber.ResultNumber; if (HorseCrippleLogic.CheckHorseCrippled(agent)) { agentDrivenProperties.MountSpeed = 1; } else { agentDrivenProperties.MountSpeed = num2 * 0.22f * (1f + explainedNumber2.ResultNumber); } return(false); } agentDrivenProperties.MountManeuver = (float)baseHorseManeuver; if (HorseCrippleLogic.CheckHorseCrippled(agent)) { agentDrivenProperties.MountSpeed = 1; } else { agentDrivenProperties.MountSpeed = num2 * 0.22f * (float)(1 + num3); } } return(false); }