using Audio; public class Harmony_ItemActionConnectPower_Init { public Harmony_ItemActionConnectPower_Init() { } [HarmonyPatch("OnHoldingUpdate")] [HarmonyPatch(typeof(ItemActionConnectPower))] public class OnHoldingUpdatePatch { public static MethodInfo HandleItemBreak = AccessTools.Method(typeof(ItemActionConnectPower), "HandleItemBreak", new Type[] { typeof(ItemActionData) }); public static MethodInfo GetPoweredBlockVector3i = AccessTools.Method(typeof(ItemActionConnectPower), "GetPoweredBlock", new Type[] { typeof(Vector3i) }); public static MethodInfo GetPoweredBlock = AccessTools.Method(typeof(ItemActionConnectPower), "GetPoweredBlock", new Type[] { typeof(ItemInventoryData) }); public static MethodInfo GetHandTransform = AccessTools.Method(typeof(ItemActionConnectPower), "GetHandTransform", new Type[] { typeof(EntityAlive) }); public static MethodInfo DecreaseDurability = AccessTools.Method(typeof(ItemActionConnectPower), "DecreaseDurability", new Type[] { typeof(ItemActionConnectPower.ConnectPowerData) }); private static bool Prefix(ItemActionConnectPower __instance, ItemActionData _actionData, Vector3 ___wireOffset ) { ItemActionConnectPower.ConnectPowerData connectPowerData = (ItemActionConnectPower.ConnectPowerData)_actionData; Vector3i blockPos = _actionData.invData.hitInfo.hit.blockPos; bool flag = true; if (connectPowerData.invData.holdingEntity is EntityPlayerLocal && connectPowerData.playerUI == null) { connectPowerData.playerUI = LocalPlayerUI.GetUIForPlayer(connectPowerData.invData.holdingEntity as EntityPlayerLocal); } if (connectPowerData.playerUI != null && !connectPowerData.invData.world.CanPlaceBlockAt(blockPos, connectPowerData.invData.world.gameManager.GetPersistentLocalPlayer(), false)) { connectPowerData.isFriendly = false; connectPowerData.playerUI.nguiWindowManager.SetLabelText(EnumNGUIWindow.PowerInfo, null); return false; } connectPowerData.isFriendly = true; if (_actionData.invData.hitInfo.bHitValid) { int num = (int)(Constants.cDigAndBuildDistance * Constants.cDigAndBuildDistance); if (_actionData.invData.hitInfo.hit.distanceSq <= (float)num) { BlockValue block = _actionData.invData.world.GetBlock(blockPos); BlockPowered blockPowered = block.Block as BlockPowered; if (blockPowered != null) { if (connectPowerData.playerUI != null) { int num2 = blockPowered.RequiredPower; Color col = Color.grey; if (blockPowered.isMultiBlock && block.ischild) { connectPowerData.playerUI.nguiWindowManager.SetLabelText(EnumNGUIWindow.PowerInfo, null); return false; } Vector3i vector3i = blockPos; ChunkCluster chunkCluster = _actionData.invData.world.ChunkClusters[_actionData.invData.hitInfo.hit.clrIdx]; if (chunkCluster != null) { Chunk chunk = (Chunk)chunkCluster.GetChunkSync(World.toChunkXZ(vector3i.x), vector3i.y, World.toChunkXZ(vector3i.z)); if (chunk != null) { TileEntityPowered tileEntityPowered = chunk.GetTileEntity(World.toBlock(vector3i)) as TileEntityPowered; if (tileEntityPowered != null) { col = (tileEntityPowered.IsPowered ? Color.yellow : Color.grey); num2 = tileEntityPowered.PowerUsed; } else { col = Color.grey; } } } connectPowerData.playerUI.nguiWindowManager.SetLabel(EnumNGUIWindow.PowerInfo, string.Format("{0}W", num2), col); } flag = false; } } } if (flag && connectPowerData.playerUI != null) { connectPowerData.playerUI.nguiWindowManager.SetLabelText(EnumNGUIWindow.PowerInfo, null); } if (connectPowerData.HasStartPoint) { if (connectPowerData.wireNode == null) { return false; } float num3 = Vector3.Distance(connectPowerData.startPoint.ToVector3(), _actionData.invData.holdingEntity.position); if (num3 < 20f) { connectPowerData.inRange = true; connectPowerData.wireNode.wireColor = new Color(0f, 0f, 0f, 0f); } if (num3 > 20f) { connectPowerData.inRange = false; connectPowerData.wireNode.wireColor = Color.red; } if (num3 > 25f) { connectPowerData.HasStartPoint = false; if (connectPowerData.wireNode != null) { WireManager.Instance.RemoveActiveWire(connectPowerData.wireNode); UnityEngine.Object.Destroy(connectPowerData.wireNode.gameObject); connectPowerData.wireNode = null; } Chunk chunk2 = connectPowerData.invData.world.GetChunkFromWorldPos(connectPowerData.startPoint) as Chunk; if (chunk2 == null) { return false; } if (connectPowerData.invData.world.GetTileEntity(chunk2.ClrIdx, connectPowerData.startPoint) is TileEntityPowered) { if (SingletonMonoBehaviour.Instance.IsServer) { SingletonMonoBehaviour.Instance.SendPackage(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false, -1, -1, -1, null, 192); } else { SingletonMonoBehaviour.Instance.SendToServer(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false); } } _actionData.invData.holdingEntity.RightArmAnimationUse = true; connectPowerData.invData.holdingEntity.PlayOneShot("ui_denied", false); } } if (!connectPowerData.StartLink || Time.time - connectPowerData.lastUseTime < AnimationDelayData.AnimationDelay[connectPowerData.invData.item.HoldType.Value].RayCast) { return false; } connectPowerData.StartLink = false; ItemActionConnectPower.ConnectPowerData connectPowerData2 = (ItemActionConnectPower.ConnectPowerData)_actionData; ItemInventoryData invData = _actionData.invData; Vector3i lastBlockPos = invData.hitInfo.lastBlockPos; if (!invData.hitInfo.bHitValid || invData.hitInfo.tag.StartsWith("E_")) { connectPowerData2.HasStartPoint = false; return false; } if (connectPowerData.invData.itemValue.MaxUseTimes > 0 && connectPowerData.invData.itemValue.UseTimes >= (float)connectPowerData.invData.itemValue.MaxUseTimes) { EntityPlayerLocal player = _actionData.invData.holdingEntity as EntityPlayerLocal; if (__instance.item.Properties.Values.ContainsKey(ItemClass.PropSoundJammed)) { Manager.PlayInsidePlayerHead(__instance.item.Properties.Values[ItemClass.PropSoundJammed], -1, 0f, false); } GameManager.ShowTooltip(player, "ttItemNeedsRepair"); return false; } if (connectPowerData.invData.itemValue.MaxUseTimes > 0) { _actionData.invData.itemValue.UseTimes += EffectManager.GetValue(PassiveEffects.DegradationPerUse, _actionData.invData.itemValue, 1f, invData.holdingEntity, null, (_actionData.invData.itemValue.ItemClass != null) ? _actionData.invData.itemValue.ItemClass.ItemTags : FastTags.none, true, true, true, true, true, 1); HandleItemBreak.Invoke(__instance, new object[] { _actionData }); } if (connectPowerData2.HasStartPoint) { if (connectPowerData2.startPoint == invData.hitInfo.hit.blockPos || !connectPowerData2.inRange) { return false; } if (Vector3.Distance(connectPowerData.startPoint.ToVector3(), invData.hitInfo.hit.blockPos.ToVector3()) > 25f) { return false; } TileEntityPowered poweredBlock = (TileEntityPowered)GetPoweredBlock.Invoke(__instance, new object[] { invData }); if (poweredBlock != null) { TileEntityPowered poweredBlock2 = (TileEntityPowered)GetPoweredBlockVector3i.Invoke(__instance, new object[] { connectPowerData2.startPoint }); if (poweredBlock2 != null) { if (!poweredBlock.CanHaveParent(poweredBlock2)) { GameManager.ShowTooltip(_actionData.invData.holdingEntity as EntityPlayerLocal, Localization.Get("ttCantHaveParent")); invData.holdingEntity.PlayOneShot("ui_denied", false); return false; } if (poweredBlock2.ChildCount > 8) { GameManager.ShowTooltip(_actionData.invData.holdingEntity as EntityPlayerLocal, Localization.Get("ttWireLimit")); invData.holdingEntity.PlayOneShot("ui_denied", false); return false; } poweredBlock.SetParentWithWireTool(poweredBlock2, invData.holdingEntity.entityId); _actionData.invData.holdingEntity.RightArmAnimationUse = true; connectPowerData2.HasStartPoint = false; if (SingletonMonoBehaviour.Instance.IsServer) { SingletonMonoBehaviour.Instance.SendPackage(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false, -1, -1, -1, null, 192); } else { SingletonMonoBehaviour.Instance.SendToServer(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false); } EntityAlive holdingEntity = _actionData.invData.holdingEntity; string name = "wire_tool_" + (poweredBlock2.IsPowered ? "sparks" : "dust"); Transform handTransform = (Transform)GetHandTransform.Invoke(__instance, new object[] { holdingEntity }); GameManager.Instance.SpawnParticleEffectServer(new ParticleEffect(name, handTransform.position + Origin.position, handTransform.rotation, holdingEntity.GetLightBrightness(), Color.white), invData.holdingEntity.entityId); if (connectPowerData.wireNode != null) { WireManager.Instance.RemoveActiveWire(connectPowerData.wireNode); UnityEngine.Object.Destroy(connectPowerData.wireNode.gameObject); connectPowerData.wireNode = null; } DecreaseDurability.Invoke(__instance, new object[] { connectPowerData }); return false; } } } else { TileEntityPowered poweredBlock3 = (TileEntityPowered)GetPoweredBlock.Invoke(__instance, new object[] { invData }); ; if (poweredBlock3 != null) { _actionData.invData.holdingEntity.RightArmAnimationUse = true; connectPowerData2.startPoint = invData.hitInfo.hit.blockPos; connectPowerData2.HasStartPoint = true; EntityAlive holdingEntity2 = _actionData.invData.holdingEntity; if (SingletonMonoBehaviour.Instance.IsServer) { SingletonMonoBehaviour.Instance.SendPackage(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.AddWire, connectPowerData2.startPoint, holdingEntity2.entityId), false, -1, -1, -1, null, 192); } else { SingletonMonoBehaviour.Instance.SendToServer(NetPackageManager.GetPackage().Setup(NetPackageWireToolActions.WireActions.AddWire, connectPowerData2.startPoint, holdingEntity2.entityId), false); } Manager.BroadcastPlay(poweredBlock3.ToWorldPos().ToVector3(), poweredBlock3.IsPowered ? "wire_live_connect" : "wire_dead_connect", 0f); Transform handTransform2 = (Transform)GetHandTransform.Invoke(__instance, new object[] { holdingEntity2 }); if (handTransform2 != null) { Transform transform = handTransform2.FindInChilds("wire_mesh", false); if (transform == null) { return false; } if (connectPowerData2.wireNode != null) { WireManager.Instance.RemoveActiveWire(connectPowerData.wireNode); UnityEngine.Object.Destroy(connectPowerData2.wireNode.gameObject); connectPowerData2.wireNode = null; } WireNode component = ((GameObject)UnityEngine.Object.Instantiate(Resources.Load("Prefabs/WireNode"))).GetComponent(); component.LocalPosition = invData.hitInfo.hit.blockPos.ToVector3() - Origin.position; component.localOffset = poweredBlock3.GetWireOffset(); WireNode wireNode = component; wireNode.localOffset.x = wireNode.localOffset.x + 0.5f; WireNode wireNode2 = component; wireNode2.localOffset.y = wireNode2.localOffset.y + 0.5f; WireNode wireNode3 = component; wireNode3.localOffset.z = wireNode3.localOffset.z + 0.5f; component.Source = transform.gameObject; component.sourceOffset = ___wireOffset; component.TogglePulse(false); component.SetPulseSpeed(360f); connectPowerData2.wireNode = component; WireManager.Instance.AddActiveWire(component); string name2 = "wire_tool_" + (poweredBlock3.IsPowered ? "sparks" : "dust"); GameManager.Instance.SpawnParticleEffectServer(new ParticleEffect(name2, handTransform2.position + Origin.position, handTransform2.rotation, holdingEntity2.GetLightBrightness(), Color.white), invData.holdingEntity.entityId); } } } return false; } } }