-
Notifications
You must be signed in to change notification settings - Fork 31
/
BlockToggle.cs
93 lines (76 loc) · 3.47 KB
/
BlockToggle.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System.Linq;
using Vintagestory.API.Common;
using Vintagestory.API.MathTools;
namespace Vintagestory.GameContent.Mechanics
{
public class BlockToggle : BlockMPBase
{
public bool IsOrientedTo(BlockFacing facing)
{
string dirs = LastCodePart();
return dirs[0] == facing.Code[0] || (dirs.Length > 1 && dirs[1] == facing.Code[0]);
}
public override bool HasMechPowerConnectorAt(IWorldAccessor world, BlockPos pos, BlockFacing face)
{
return IsOrientedTo(face);
}
public override bool TryPlaceBlock(IWorldAccessor world, IPlayer byPlayer, ItemStack itemstack, BlockSelection blockSel, ref string failureCode)
{
if (!CanPlaceBlock(world, byPlayer, blockSel, ref failureCode))
{
return false;
}
foreach (BlockFacing face in BlockFacing.HORIZONTALS)
{
BlockPos pos = blockSel.Position.AddCopy(face);
IMechanicalPowerBlock block = world.BlockAccessor.GetBlock(pos) as IMechanicalPowerBlock;
if (block != null)
{
if (block.HasMechPowerConnectorAt(world, pos, face.Opposite))
{
AssetLocation loc = new AssetLocation(FirstCodePart() + "-" + face.Opposite.Code[0] + face.Code[0]);
Block toPlaceBlock = world.GetBlock(loc);
if (toPlaceBlock == null)
{
loc = new AssetLocation(FirstCodePart() + "-" + face.Code[0] + face.Opposite.Code[0]);
toPlaceBlock = world.GetBlock(loc);
}
if (toPlaceBlock.DoPlaceBlock(world, byPlayer, blockSel, itemstack))
{
block.DidConnectAt(world, pos, face.Opposite);
WasPlaced(world, blockSel.Position, face);
return true;
}
}
}
}
if (base.TryPlaceBlock(world, byPlayer, itemstack, blockSel, ref failureCode))
{
WasPlaced(world, blockSel.Position, null);
return true;
}
return false;
}
public override void OnNeighbourBlockChange(IWorldAccessor world, BlockPos pos, BlockPos neibpos)
{
BEBehaviorMPToggle bemptoggle = world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior<BEBehaviorMPToggle>();
if (bemptoggle != null && !bemptoggle.IsAttachedToBlock())
{
foreach (BlockFacing face in BlockFacing.HORIZONTALS)
{
BlockPos npos = pos.AddCopy(face);
BlockAngledGears blockagears = world.BlockAccessor.GetBlock(npos) as BlockAngledGears;
if (blockagears == null) continue;
if (blockagears.Facings.Contains(face.Opposite) && blockagears.Facings.Length == 1)
{
world.BlockAccessor.BreakBlock(npos, null);
}
}
}
base.OnNeighbourBlockChange(world, pos, neibpos);
}
public override void DidConnectAt(IWorldAccessor world, BlockPos pos, BlockFacing face)
{
}
}
}