public static void MineRock5_Damage_Prefix(MineRock5 __instance, HitData hit, out Dictionary <int, Vector3> __state) { __instance.SetupColliders(); __state = new Dictionary <int, Vector3>(); if (Input.GetKey(VeinMine.veinMineKey.Value) && VeinMine.progressiveMode.Value) { var radiusColliders = Physics.OverlapSphere(hit.m_point, VeinMine.progressiveMult.Value * (float)GetSkillLevel(Player.m_localPlayer.GetSkills(), Skills.SkillType.Pickaxes)); if (radiusColliders != null) { foreach (var area in radiusColliders) { if (__instance.GetAreaIndex(area) >= 0) { __state.Add(__instance.GetAreaIndex(area), __instance.GetHitArea(__instance.GetAreaIndex(area)).m_bound.m_pos + __instance.GetHitArea(__instance.GetAreaIndex(area)).m_collider.transform.position); } } } } }
public static void MineRock5_Damage_Patch(MineRock5 __instance, ZNetView ___m_nview, List <HitArea> ___m_hitAreas, HitData hit, Dictionary <int, Vector3> __state) { if (Player.m_localPlayer != null && hit.m_attacker == Player.m_localPlayer.GetZDOID()) { if (Input.GetKey(VeinMine.veinMineKey.Value) && !VeinMine.progressiveMode.Value) { for (int i = 0; i < (___m_hitAreas.Count <= 128 ? ___m_hitAreas.Count : 128); i++) { if (Player.m_localPlayer.GetCurrentWeapon().m_durability > 0 || !Player.m_localPlayer.GetCurrentWeapon().m_shared.m_useDurability) { hit.m_point = __instance.GetHitArea(i).m_bound.m_pos; hit.m_damage.m_pickaxe = __instance.m_health + 10; try { ___m_nview.InvokeRPC("Damage", new object[] { hit, i }); } catch { VeinMine.logger.LogInfo("Skipping section: " + i + "."); } } } } else if (Input.GetKey(VeinMine.veinMineKey.Value) && VeinMine.progressiveMode.Value) { foreach (var index in __state) { hit.m_point = index.Value; if (Player.m_localPlayer.GetCurrentWeapon().m_durability > 0 || !Player.m_localPlayer.GetCurrentWeapon().m_shared.m_useDurability) { try { ___m_nview.InvokeRPC("Damage", new object[] { hit, index.Key }); } catch { VeinMine.logger.LogInfo("Skipping section: " + index.Key + "."); } } } } } }
public static bool MineRock5_DamageArea_Prefix(MineRock5 __instance, HitData hit, int hitAreaIndex, ref EffectList ___m_destroyedEffect, ref EffectList ___m_hitEffect, out float __state, ref bool __result) { bool isVeinmined = false; MineRock5.HitArea hitArea = __instance.GetHitArea(hitAreaIndex); __state = hitArea.m_health; if (VeinMine.enableSpreadDamage.Value) { hit = SpreadDamage(hit); } if (Input.GetKey(VeinMine.veinMineKey.Value)) { isVeinmined = true; } ZLog.Log("hit mine rock " + hitAreaIndex); if (hitArea == null) { ZLog.Log("Missing hit area " + hitAreaIndex); __result = false; return(false); } __instance.LoadHealth(); if (hitArea.m_health <= 0f) { ZLog.Log("Already destroyed"); __result = false; return(false); } HitData.DamageModifier type; hit.ApplyResistance(__instance.m_damageModifiers, out type); float totalDamage = hit.GetTotalDamage(); if (hit.m_toolTier < __instance.m_minToolTier) { DamageText.instance.ShowText(DamageText.TextType.TooHard, hit.m_point, 0f, false); __result = false; return(false); } DamageText.instance.ShowText(type, hit.m_point, totalDamage, false); if (totalDamage <= 0f) { __result = false; return(false); } hitArea.m_health -= totalDamage; __instance.SaveHealth(); if (!VeinMine.removeEffects.Value) { __instance.m_hitEffect.Create(hit.m_point, Quaternion.identity, null, 1f); } Player closestPlayer = Player.GetClosestPlayer(hit.m_point, 10f); if (closestPlayer) { closestPlayer.AddNoise(100f); } if (hitArea.m_health <= 0f) { __instance.m_nview.InvokeRPC(ZNetView.Everybody, "SetAreaHealth", new object[] { hitAreaIndex, hitArea.m_health }); if (!VeinMine.removeEffects.Value) { __instance.m_destroyedEffect.Create(hit.m_point, Quaternion.identity, null, 1f); } foreach (GameObject gameObject in __instance.m_dropItems.GetDropList()) { if (isVeinmined) { Vector3 position = Player.m_localPlayer.GetTransform().position + new Vector3 { x = 0, y = 2, z = 0 } +UnityEngine.Random.insideUnitSphere * 0.3f; UnityEngine.Object.Instantiate <GameObject>(gameObject, position, Quaternion.identity); hit.m_point = Player.m_localPlayer.GetTransform().position + new Vector3 { x = 0, y = 2, z = 0 }; } else if (!isVeinmined) { Vector3 position = hit.m_point + UnityEngine.Random.insideUnitSphere * 0.3f; UnityEngine.Object.Instantiate <GameObject>(gameObject, position, Quaternion.identity); } } if (__instance.AllDestroyed()) { __instance.m_nview.Destroy(); } __result = true; return(false); } __result = false; return(false); }