Files
zzz_REBIRTH__Utils/Harmony/Harmony_ItemActionConnectPower.cs
2025-06-04 16:44:53 +09:30

289 lines
17 KiB
C#

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<ConnectionManager>.Instance.IsServer)
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendPackage(NetPackageManager.GetPackage<NetPackageWireToolActions>().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false, -1, -1, -1, null, 192);
}
else
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendToServer(NetPackageManager.GetPackage<NetPackageWireToolActions>().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<TagGroup.Global>.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<ConnectionManager>.Instance.IsServer)
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendPackage(NetPackageManager.GetPackage<NetPackageWireToolActions>().Setup(NetPackageWireToolActions.WireActions.RemoveWire, Vector3i.zero, _actionData.invData.holdingEntity.entityId), false, -1, -1, -1, null, 192);
}
else
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendToServer(NetPackageManager.GetPackage<NetPackageWireToolActions>().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<ConnectionManager>.Instance.IsServer)
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendPackage(NetPackageManager.GetPackage<NetPackageWireToolActions>().Setup(NetPackageWireToolActions.WireActions.AddWire, connectPowerData2.startPoint, holdingEntity2.entityId), false, -1, -1, -1, null, 192);
}
else
{
SingletonMonoBehaviour<ConnectionManager>.Instance.SendToServer(NetPackageManager.GetPackage<NetPackageWireToolActions>().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<WireNode>();
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;
}
}
}