Upload from upload_mods.ps1
This commit is contained in:
289
Harmony/Harmony_ItemActionConnectPower.cs
Normal file
289
Harmony/Harmony_ItemActionConnectPower.cs
Normal file
@@ -0,0 +1,289 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user