private static void WeaponEquipped(Agent __instance, EquipmentIndex equipmentSlot, ref WeaponData weaponData, WeaponStatsData[] weaponStatsData, ref WeaponData ammoWeaponData, WeaponStatsData[] ammoWeaponStatsData, GameEntity weaponEntity, bool removeOldWeaponFromScene, bool isWieldedOnSpawn) { if (!__instance.IsHero || !(__instance.Character is CharacterObject hero)) { return; } if (weaponStatsData != null) { for (int i = 0; i < weaponStatsData.Length; i++) { switch ((WeaponClass)weaponStatsData[i].WeaponClass) { case WeaponClass.Bow: //弓可以在马上用。 if (((CharacterObject)__instance.Character).GetPerkValue(DefaultPerks.Bow.MountedArcher) || ((CharacterObject)__instance.Character).GetPerkValue(DefaultPerks.Riding.BowExpert)) { weaponStatsData[i].ItemUsageIndex = MBItem.GetItemUsageIndex("bow"); } break; case WeaponClass.Crossbow: //弩可以在马上用。 if (((CharacterObject)__instance.Character).GetPerkValue(DefaultPerks.Crossbow.CrossbowCavalry) || ((CharacterObject)__instance.Character).GetPerkValue(DefaultPerks.Riding.CrossbowExpert)) { weaponStatsData[i].WeaponFlags = weaponStatsData[i].WeaponFlags & ~(ulong)WeaponFlags.CantReloadOnHorseback; } break; } } } }
private static void CallWeaponEquippedPrefix(ref Agent __instance, EquipmentIndex equipmentSlot, ref WeaponData weaponData, ref WeaponStatsData[] weaponStatsData, ref WeaponData ammoWeaponData, ref WeaponStatsData[] ammoWeaponStatsData, ref GameEntity weaponEntity, bool removeOldWeaponFromScene, bool isWieldedOnSpawn) { if (weaponStatsData == null) { return; } for (var i = 0; i < weaponStatsData.Length; i++) { var weapon = weaponStatsData[i]; if (weapon.ItemUsageIndex != MBItem.GetItemUsageIndex("long_bow") || !HeroHasPerk(__instance.Character, _bowExpert)) { continue; } var updatedWeapon = weapon; updatedWeapon.ItemUsageIndex = MBItem.GetItemUsageIndex("bow"); weaponStatsData[i] = updatedWeapon; } }
public static ItemObject.ItemUsageSetFlags GetItemUsageSetFlag(WeaponComponentData item) { if (!string.IsNullOrEmpty(item.ItemUsage)) { return(MBItem.GetItemUsageSetFlags(item.ItemUsage)); } return((ItemObject.ItemUsageSetFlags) 0); }
internal static bool IsWeaponCouchable(ItemObject weapon) { bool flag = false; using (IEnumerator <WeaponComponentData> enumerator = weapon.Weapons.GetEnumerator()) { while (enumerator.MoveNext()) { if (!MBItem.GetItemIsPassiveUsage(enumerator.Current.ItemUsage)) { continue; } flag = true; break; } } return(flag); }
protected override void Apply(Agent __instance, EquipmentIndex equipmentSlot, ref WeaponData weaponData, ref WeaponStatsData[] weaponStatsData, ref WeaponData ammoWeaponData, ref WeaponStatsData[] ammoWeaponStatsData, GameEntity weaponEntity) { for (var i = 0; i < (weaponStatsData?.Length ?? 0); i++) { var weapon = weaponStatsData[i]; if (weapon.ItemUsageIndex == MBItem.GetItemUsageIndex("long_bow") && HeroHasPerk(__instance.Character, MountedArcher)) { var updatedWeapon = weapon; updatedWeapon.ItemUsageIndex = MBItem.GetItemUsageIndex("bow"); weaponStatsData[i] = updatedWeapon; } } }
private ItemObject.ItemUsageSetFlags GetItemUsageSetFlag(WeaponComponentData item) { return(!string.IsNullOrEmpty(item.ItemUsage) ? MBItem.GetItemUsageSetFlags(item.ItemUsage) : (ItemObject.ItemUsageSetFlags) 0); }
private void GetItemPoseAndCamera(ItemObject item, Scene scene, ref Camera camera, ref MatrixFrame itemFrame, ref MatrixFrame itemFrame1, ref MatrixFrame itemFrame2) { if (item.IsCraftedWeapon) { GetItemPoseAndCameraForCraftedItem(item, scene, ref camera, ref itemFrame, ref itemFrame1, ref itemFrame2); return; } string str = ""; bool flag = false; if (item.WeaponComponent != null) { WeaponClass weaponClass = item.WeaponComponent.PrimaryWeapon.WeaponClass; if (weaponClass - WeaponClass.OneHandedSword <= 1) { str = "sword"; flag = true; } } else { ItemObject.ItemTypeEnum type = item.Type; if (type != ItemObject.ItemTypeEnum.HeadArmor) { if (type == ItemObject.ItemTypeEnum.BodyArmor) { str = "armor"; flag = true; } } else { str = "helmet"; flag = true; } } if (item.Type == ItemObject.ItemTypeEnum.Shield) { str = "shield"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Crossbow) { str = "crossbow"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Bow) { str = "bow"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.LegArmor) { str = "boot"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Horse || item.Type == ItemObject.ItemTypeEnum.HorseHarness) { str = "horse"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Cape) { str = "cape"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.HandArmor) { str = "glove"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Arrows) { str = "arrow"; flag = true; } if (item.Type == ItemObject.ItemTypeEnum.Bolts) { str = "bolt"; flag = true; } Game game = Game.Current; if (((game != null) ? game.DefaultItems : null) != null && (item == DefaultItems.IronOre || item == DefaultItems.HardWood || item == DefaultItems.Charcoal || item == DefaultItems.IronIngot1 || item == DefaultItems.IronIngot2 || item == DefaultItems.IronIngot3 || item == DefaultItems.IronIngot4 || item == DefaultItems.IronIngot5 || item == DefaultItems.IronIngot6 || item.ItemCategory == DefaultItemCategories.Silver)) { str = "craftmat"; flag = true; } string tag = str + "_cam"; string tag2 = str + "_frame"; if (flag) { GameEntity gameEntity = scene.FindEntityWithTag(tag); if (gameEntity != null) { camera = Camera.CreateCamera(); Vec3 vec = default(Vec3); gameEntity.GetCameraParamsFromCameraScript(camera, ref vec); } GameEntity gameEntity2 = scene.FindEntityWithTag(tag2); if (gameEntity2 != null) { itemFrame = gameEntity2.GetGlobalFrame(); gameEntity2.SetVisibilityExcludeParents(false); } } else { GameEntity gameEntity3 = scene.FindEntityWithTag("goods_cam"); if (gameEntity3 != null) { camera = Camera.CreateCamera(); Vec3 vec2 = default(Vec3); gameEntity3.GetCameraParamsFromCameraScript(camera, ref vec2); } GameEntity gameEntity4 = scene.FindEntityWithTag("goods_frame"); if (gameEntity4 != null) { itemFrame = gameEntity4.GetGlobalFrame(); gameEntity4.SetVisibilityExcludeParents(false); gameEntity4.UpdateGlobalBounds(); MatrixFrame globalFrame = gameEntity4.GetGlobalFrame(); MetaMesh itemMeshForInventory = new ItemRosterElement(item, 0, null).GetItemMeshForInventory(false); Vec3 vec3 = new Vec3(1000000f, 1000000f, 1000000f, -1f); Vec3 vec4 = new Vec3(-1000000f, -1000000f, -1000000f, -1f); if (itemMeshForInventory != null) { MatrixFrame identity = MatrixFrame.Identity; for (int num = 0; num != itemMeshForInventory.MeshCount; num++) { Vec3 boundingBoxMin = itemMeshForInventory.GetMeshAtIndex(num).GetBoundingBoxMin(); Vec3 boundingBoxMax = itemMeshForInventory.GetMeshAtIndex(num).GetBoundingBoxMax(); Vec3[] array = new Vec3[] { globalFrame.TransformToParent(new Vec3(boundingBoxMin.x, boundingBoxMin.y, boundingBoxMin.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMin.x, boundingBoxMin.y, boundingBoxMax.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMin.x, boundingBoxMax.y, boundingBoxMin.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMin.x, boundingBoxMax.y, boundingBoxMax.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMax.x, boundingBoxMin.y, boundingBoxMin.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMax.x, boundingBoxMin.y, boundingBoxMax.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMax.x, boundingBoxMax.y, boundingBoxMin.z, -1f)), globalFrame.TransformToParent(new Vec3(boundingBoxMax.x, boundingBoxMax.y, boundingBoxMax.z, -1f)) }; for (int i = 0; i < 8; i++) { vec3 = Vec3.Vec3Min(vec3, array[i]); vec4 = Vec3.Vec3Max(vec4, array[i]); } } } Vec3 v = (vec3 + vec4) * 0.5f; Vec3 v2 = gameEntity4.GetGlobalFrame().TransformToLocal(v); MatrixFrame globalFrame2 = gameEntity4.GetGlobalFrame(); globalFrame2.origin -= v2; itemFrame = globalFrame2; MatrixFrame frame = camera.Frame; float f = (vec4 - vec3).Length * 6f; if (item.Type == ItemObject.ItemTypeEnum.Animal) { f = (vec4 - vec3).Length * 3f; } frame.origin += frame.rotation.u * f; camera.Frame = frame; } } if (camera == null) { camera = Camera.CreateCamera(); camera.SetViewVolume(false, -1f, 1f, -0.5f, 0.5f, 0.01f, 100f); MatrixFrame identity2 = MatrixFrame.Identity; identity2.origin -= identity2.rotation.u * 7f; identity2.rotation.u = identity2.rotation.u * -1f; camera.Frame = identity2; } if (item.Type == ItemObject.ItemTypeEnum.Shield) { GameEntity gameEntity5 = scene.FindEntityWithTag(tag); MatrixFrame holsterFrameByIndex = MBItem.GetHolsterFrameByIndex(MBItem.GetItemHolsterIndex(item.ItemHolsters[0])); itemFrame.rotation = holsterFrameByIndex.rotation; MatrixFrame frame2 = itemFrame.TransformToParent(gameEntity5.GetFrame()); camera.Frame = frame2; } }