Ok, I will update this post with some calculations which should allow for the power to be transmitted an arbitrary distance, depending on your choice of angle. the simplest way to implement this would only allow for power to be transmitted along the x and z axes, but if you have some way to do rotations, then you should be able to send it any direction.
If you do this, you might need to put a restriction on how close together the receivers can be, say by having them take up slighly more than 1 block (maybe even have them something like the ICBM radar dishes in size, but only collect from 1 block worth of area?)
Needed Mathematics:
Note: I will probably use z as vertical and y as horizontal for these calculations, as that is what I am more comfortable using.
first I should mention that I know very little about java syntax and coding (only ever used C and lua, have looked at java a couple times, not much more), so hopefully you can convert this into the needed format
Let the transmitter be at location (x0,y0,z0) and the receiver at (x1,y1,z1)
Let θ be the total angle spread of the transmission (I will use units of radians for this, an example in degrees would say be 15% for short range)
Let PT be the power transmitted and PR be the power received.
The distance from the transmitter to the receiver would then be r = |(x1,y1,z1)-(x0,y0,z0)| (I assume there is a vector maths library or similar?)
The basic calculation needed would then be:
PR = Min(PT, PT/(rθ))
You would also need to check that (x1,y1,z1) falls within the cone of power transmitted.
This can be used to check that:
Let φ be the angle counter-clockwise from the x axis (if only transmitting along and axis, will be much simpler than this, also, I am using y as the other horizontal axis for this calculation)
Let ω be the angle down, starting from straight up (so vertically up is 0, straight down is pi)
The midpoint of the beam at distance r would be:
(x2,y2,z2) = (x0+r*sin(ω)*cos(φ), y0+r*sin(ω)*sin(φ),z0+cos(ω)).
To check that the receiver is inside the cone, then check:
|(x2,y2,z2) - (x1,y1,z1)| < r*sin(θ/2)
Rounding down the distances between points at each step would then add some nice amounts of loss.
You should also check that the line from the transmitter to receiver has no other receivers between, or this could be exploited (if you only check loaded chunks, then you could have power transmitted over unloaded areas. If you want to make certain things block the signal, you can start the check from the transmitter, and disallow anything after whatever blocks it from receiving power)
Note: Depending on how forge handles directions, you should convert whatever it uses to radians before applying the above formulae. Also, these equations will technically work even if you go and swap around x,y and z, so you might not need to modify them much to work in MC's rotated frame.
On implementing this for different ranges:
I suggest having a range of upgrades for the transmitter, preferably quite expensive, which serve to narrow the beam. You should probably also have something that automatically points the transmitter in the direction of a receiver (say you right click receiver first, then right click transmitter and it orients itself).
For the transmitter upgrades, Maybe have each one decrease the angle by a factor of 2, with the base angle being pi/6 or pi/12 radians (30 or 15 degrees). As shown in my previous post, a 15 degree spread will lose over 50% of the power after 8 blocks, so probably start there.
with this, 4 upgrades will result in transmitting 128 blocks for the same loss.
8 upgrades would allow for a transmission of 2048 blocks.
PR = min(PT, PT/(rθ/2n)), where n is the number of upgrades
To balance this, Maybe have it harder to add more upgrades, or have multiple upgrades for range orders (say tier 2 upgrade is made with 16 or 64 tier 1 upgrades?)
You could also then have an upgrade which increases the power transmitted.