Skip to content

Commit 9ef6bd3

Browse files
committed
Added support for block sections, allowing extended block interaction depending on where on a blocks surface the player clicked.
1 parent d9d65e7 commit 9ef6bd3

File tree

14 files changed

+405
-65
lines changed

14 files changed

+405
-65
lines changed

fluids/src/main/java/sunsetsatellite/catalyst/fluids/impl/tiles/TileEntityFluidContainer.java

-3
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,6 @@ public void moveFluids(Direction dir, TileEntityFluidPipe tile) {
411411
if(getFluidInSlot(activeSlot) != null){
412412
give(dir);
413413
}
414-
/*if(getFluidInSlot(activeSlot) != null && (tile.getFluidInSlot(tile.getActiveFluidSlot(dir.getOpposite())) == null || (tile.getFluidInSlot(tile.getActiveFluidSlot(dir.getOpposite())) != null && tile.acceptedFluids.get(activeSlot).contains(getFluidInSlot(activeSlot).getLiquid())))){
415-
give(dir);
416-
}*/
417414
} else if(fluidConnections.get(dir) == Connection.BOTH || fluidConnections.get(dir) == Connection.INPUT){
418415
if(tile.getFluidInSlot(0) != null){
419416
take(tile.getFluidInSlot(0),dir);

multiblocks/src/main/java/sunsetsatellite/catalyst/multiblocks/Structure.java

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package sunsetsatellite.catalyst.multiblocks;
22

33
import com.mojang.nbt.*;
4-
import net.minecraft.client.Minecraft;
54
import net.minecraft.core.block.Block;
65
import net.minecraft.core.lang.I18n;
76
import net.minecraft.core.world.World;
@@ -10,8 +9,6 @@
109
import sunsetsatellite.catalyst.core.util.Direction;
1110
import sunsetsatellite.catalyst.core.util.Vec3i;
1211

13-
import java.io.File;
14-
import java.io.FileOutputStream;
1512
import java.io.IOException;
1613
import java.io.InputStream;
1714
import java.lang.reflect.Field;
@@ -170,11 +167,11 @@ public ArrayList<BlockInstance> getTileEntities(World world, Vec3i origin, Direc
170167
int meta = blockTag.getInteger("meta");
171168
if(meta != -1){
172169
if(dir == Direction.Z_NEG){
173-
meta = Direction.getDirectionFromSide(meta).getOpposite().getSide();
170+
meta = Direction.getDirectionFromSide(meta).getOpposite().getSideNumber();
174171
} else if (dir == Direction.X_NEG || dir == Direction.X_POS) {
175172
Direction blockDir = Direction.getDirectionFromSide(meta);
176173
blockDir = blockDir == Direction.X_NEG || blockDir == Direction.X_POS ? blockDir.rotate(1).getOpposite() : blockDir.rotate(1);
177-
meta = dir == Direction.X_NEG ? blockDir.getSide() : blockDir.getOpposite().getSide();
174+
meta = dir == Direction.X_NEG ? blockDir.getSideNumber() : blockDir.getOpposite().getSideNumber();
178175
}
179176
}
180177
int id = getBlockId(blockTag);
@@ -221,11 +218,11 @@ public ArrayList<BlockInstance> getBlocks(Vec3i origin, Direction dir){
221218
int meta = blockTag.getInteger("meta");
222219
if(meta != -1){
223220
if(dir == Direction.Z_NEG){
224-
meta = Direction.getDirectionFromSide(meta).getOpposite().getSide();
221+
meta = Direction.getDirectionFromSide(meta).getOpposite().getSideNumber();
225222
} else if (dir == Direction.X_NEG || dir == Direction.X_POS) {
226223
Direction blockDir = Direction.getDirectionFromSide(meta);
227224
blockDir = blockDir == Direction.X_NEG || blockDir == Direction.X_POS ? blockDir.rotate(1).getOpposite() : blockDir.rotate(1);
228-
meta = dir == Direction.X_NEG ? blockDir.getSide() : blockDir.getOpposite().getSide();
225+
meta = dir == Direction.X_NEG ? blockDir.getSideNumber() : blockDir.getOpposite().getSideNumber();
229226
}
230227
}
231228
int id = getBlockId(blockTag);
@@ -272,11 +269,11 @@ public ArrayList<BlockInstance> getSubstitutions(Vec3i origin, Direction dir){
272269
int meta = tileEntity.getInteger("meta");
273270
if(meta != -1){
274271
if(dir == Direction.Z_NEG){
275-
meta = Direction.getDirectionFromSide(meta).getOpposite().getSide();
272+
meta = Direction.getDirectionFromSide(meta).getOpposite().getSideNumber();
276273
} else if (dir == Direction.X_NEG || dir == Direction.X_POS) {
277274
Direction blockDir = Direction.getDirectionFromSide(meta);
278275
blockDir = blockDir == Direction.X_NEG || blockDir == Direction.X_POS ? blockDir.rotate(1).getOpposite() : blockDir.rotate(1);
279-
meta = dir == Direction.X_NEG ? blockDir.getSide() : blockDir.getOpposite().getSide();
276+
meta = dir == Direction.X_NEG ? blockDir.getSideNumber() : blockDir.getOpposite().getSideNumber();
280277
}
281278
}
282279
int id = getBlockId(tileEntity);

src/main/java/sunsetsatellite/catalyst/Catalyst.java

+46-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package sunsetsatellite.catalyst;
22

33
import net.fabricmc.api.ModInitializer;
4+
import net.minecraft.client.Minecraft;
45
import net.minecraft.client.gui.GuiChest;
6+
import net.minecraft.core.HitResult;
57
import net.minecraft.core.block.entity.TileEntity;
68
import net.minecraft.core.block.entity.TileEntityChest;
79
import net.minecraft.core.data.registry.Registry;
810
import net.minecraft.core.entity.player.EntityPlayer;
911
import net.minecraft.core.item.ItemStack;
1012
import net.minecraft.core.player.inventory.ContainerChest;
1113
import net.minecraft.core.player.inventory.IInventory;
14+
import net.minecraft.core.util.collection.Pair;
15+
import net.minecraft.core.util.helper.MathHelper;
16+
import net.minecraft.core.util.helper.Side;
17+
import net.minecraft.core.world.World;
1218
import org.slf4j.Logger;
1319
import org.slf4j.LoggerFactory;
14-
import sunsetsatellite.catalyst.core.util.IMpGui;
15-
import sunsetsatellite.catalyst.core.util.MpGuiEntry;
16-
import sunsetsatellite.catalyst.core.util.PacketOpenGui;
20+
import sunsetsatellite.catalyst.core.util.*;
1721
import turniplabs.halplibe.helper.NetworkHelper;
1822

1923

@@ -40,4 +44,43 @@ public static void displayGui(EntityPlayer player, IInventory inventory, ItemSta
4044
public static void displayGui(EntityPlayer player, TileEntity tileEntity, String id){
4145
((IMpGui)player).displayCustomGUI(tileEntity, id);
4246
}
47+
48+
public static Pair<Direction,BlockSection> getBlockSurfaceClickPosition(World world, EntityPlayer player){
49+
if (!world.isClientSide) {
50+
HitResult hit = Minecraft.getMinecraft(Catalyst.class).objectMouseOver;
51+
if(hit.hitType == HitResult.HitType.TILE){
52+
Direction dir = Direction.getDirectionFromSide(hit.side.getId());
53+
Vec3f vec3f = new Vec3f(hit.location.xCoord,hit.location.yCoord,hit.location.zCoord);
54+
Vec2f clickPosition = vec3f.subtract(vec3f.copy().floor()).abs().set(hit.side.getAxis(),0).toVec2f();
55+
switch (hit.side) {
56+
case NORTH:
57+
clickPosition.x = 1-clickPosition.x;
58+
break;
59+
case EAST: {
60+
double temp1 = clickPosition.y;
61+
double temp2 = clickPosition.x;
62+
clickPosition.x = 1-temp1;
63+
clickPosition.y = temp2;
64+
break;
65+
}
66+
case SOUTH:
67+
//no change needed
68+
break;
69+
case WEST: {
70+
double temp1 = clickPosition.y;
71+
double temp2 = clickPosition.x;
72+
clickPosition.x = temp1;
73+
clickPosition.y = temp2;
74+
break;
75+
}
76+
}
77+
return Pair.of(dir,BlockSection.getClosestBlockSection(clickPosition));
78+
}
79+
}
80+
return null;
81+
}
82+
83+
public static Side calculatePlayerFacing(float rotation) {
84+
return Side.values()[(2 + ((MathHelper.floor_double((double) ((rotation * 4F) / 360F) + 0.5D) + 2) & 3))];
85+
}
4386
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package sunsetsatellite.catalyst.core.mixin;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.client.Minecraft;
5+
import net.minecraft.client.render.RenderGlobal;
6+
import net.minecraft.client.render.tessellator.Tessellator;
7+
import net.minecraft.core.block.Block;
8+
import net.minecraft.core.util.phys.AABB;
9+
import org.lwjgl.opengl.GL11;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Redirect;
14+
import sunsetsatellite.catalyst.core.util.ISideInteractable;
15+
import sunsetsatellite.catalyst.core.util.IWrench;
16+
17+
@Mixin(value = RenderGlobal.class,remap = false)
18+
public class RenderGlobalMixin {
19+
20+
@Shadow
21+
private Minecraft mc;
22+
23+
@Redirect(method = "drawSelectionBox",at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderGlobal;drawOutlinedBoundingBox(Lnet/minecraft/core/util/phys/AABB;)V"))
24+
public void drawOutlinedSectionedBoundingBox(RenderGlobal instance, AABB aabb, @Local int j)
25+
{
26+
if(Block.blocksList[j] instanceof ISideInteractable && mc.thePlayer.getCurrentEquippedItem() != null && mc.thePlayer.getCurrentEquippedItem().getItem() instanceof ISideInteractable){
27+
double minX = aabb.minX;
28+
double minY = aabb.minY;
29+
double minZ = aabb.minZ;
30+
double maxX = aabb.maxX;
31+
double maxY = aabb.maxY;
32+
double maxZ = aabb.maxZ;
33+
Tessellator tessellator = Tessellator.instance;
34+
35+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
36+
tessellator.addVertex(minX, minY, minZ);
37+
tessellator.addVertex(maxX, minY, minZ);
38+
tessellator.addVertex(maxX, minY, maxZ);
39+
tessellator.addVertex(minX, minY, maxZ);
40+
tessellator.addVertex(minX, minY, minZ);
41+
tessellator.draw();
42+
43+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
44+
tessellator.addVertex(minX, maxY, minZ);
45+
tessellator.addVertex(maxX, maxY, minZ);
46+
tessellator.addVertex(maxX, maxY, maxZ);
47+
tessellator.addVertex(minX, maxY, maxZ);
48+
tessellator.addVertex(minX, maxY, minZ);
49+
tessellator.draw();
50+
51+
//bottom
52+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
53+
tessellator.addVertex(minX+0.3f, minY, minZ);
54+
tessellator.addVertex(maxX-0.3f, minY, minZ);
55+
tessellator.addVertex(maxX-0.3f, minY, maxZ);
56+
tessellator.addVertex(minX+0.3f, minY, maxZ);
57+
tessellator.addVertex(minX+0.3f, minY, minZ);
58+
tessellator.draw();
59+
60+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
61+
tessellator.addVertex(minX, minY, minZ+0.3f);
62+
tessellator.addVertex(maxX, minY, minZ+0.3f);
63+
tessellator.addVertex(maxX, minY, maxZ-0.3f);
64+
tessellator.addVertex(minX, minY, maxZ-0.3f);
65+
tessellator.addVertex(minX, minY, minZ+0.3f);
66+
tessellator.draw();
67+
68+
//top
69+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
70+
tessellator.addVertex(minX+0.3f, maxY, minZ);
71+
tessellator.addVertex(maxX-0.3f, maxY, minZ);
72+
tessellator.addVertex(maxX-0.3f, maxY, maxZ);
73+
tessellator.addVertex(minX+0.3f, maxY, maxZ);
74+
tessellator.addVertex(minX+0.3f, maxY, minZ);
75+
tessellator.draw();
76+
77+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
78+
tessellator.addVertex(minX, maxY, minZ+0.3f);
79+
tessellator.addVertex(maxX, maxY, minZ+0.3f);
80+
tessellator.addVertex(maxX, maxY, maxZ-0.3f);
81+
tessellator.addVertex(minX, maxY, maxZ-0.3f);
82+
tessellator.addVertex(minX, maxY, minZ+0.3f);
83+
tessellator.draw();
84+
85+
//sides
86+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
87+
tessellator.addVertex(minX, minY+0.3f, minZ);
88+
tessellator.addVertex(maxX, minY+0.3f, minZ);
89+
tessellator.addVertex(maxX, minY+0.3f, maxZ);
90+
tessellator.addVertex(minX, minY+0.3f, maxZ);
91+
tessellator.addVertex(minX, minY+0.3f, minZ);
92+
tessellator.draw();
93+
94+
tessellator.startDrawing(GL11.GL_LINE_STRIP);
95+
tessellator.addVertex(minX, maxY-0.3f, minZ);
96+
tessellator.addVertex(maxX, maxY-0.3f, minZ);
97+
tessellator.addVertex(maxX, maxY-0.3f, maxZ);
98+
tessellator.addVertex(minX, maxY-0.3f, maxZ);
99+
tessellator.addVertex(minX, maxY-0.3f, minZ);
100+
tessellator.draw();
101+
102+
tessellator.startDrawing(GL11.GL_LINES);
103+
tessellator.addVertex(minX+0.3f, minY, minZ);
104+
tessellator.addVertex(minX+0.3f, maxY, minZ);
105+
tessellator.addVertex(maxX-0.3f, minY, minZ);
106+
tessellator.addVertex(maxX-0.3f, maxY, minZ);
107+
tessellator.addVertex(minX+0.3f, minY, maxZ);
108+
tessellator.addVertex(minX+0.3f, maxY, maxZ);
109+
tessellator.addVertex(maxX-0.3f, minY, maxZ);
110+
tessellator.addVertex(maxX-0.3f, maxY, maxZ);
111+
tessellator.draw();
112+
113+
tessellator.startDrawing(GL11.GL_LINES);
114+
tessellator.addVertex(minX, minY, minZ+0.3f);
115+
tessellator.addVertex(minX, maxY, minZ+0.3f);
116+
tessellator.addVertex(maxX, minY, minZ+0.3f);
117+
tessellator.addVertex(maxX, maxY, minZ+0.3f);
118+
tessellator.addVertex(minX, minY, maxZ-0.3f);
119+
tessellator.addVertex(minX, maxY, maxZ-0.3f);
120+
tessellator.addVertex(maxX, minY, maxZ-0.3f);
121+
tessellator.addVertex(maxX, maxY, maxZ-0.3f);
122+
tessellator.draw();
123+
124+
//cube outline
125+
tessellator.startDrawing(GL11.GL_LINES);
126+
tessellator.addVertex(minX, minY, minZ);
127+
tessellator.addVertex(minX, maxY, minZ);
128+
tessellator.addVertex(maxX, minY, minZ);
129+
tessellator.addVertex(maxX, maxY, minZ);
130+
tessellator.addVertex(maxX, minY, maxZ);
131+
tessellator.addVertex(maxX, maxY, maxZ);
132+
tessellator.addVertex(minX, minY, maxZ);
133+
tessellator.addVertex(minX, maxY, maxZ);
134+
tessellator.draw();
135+
} else {
136+
instance.drawOutlinedBoundingBox(aabb);
137+
}
138+
}
139+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package sunsetsatellite.catalyst.core.util;
2+
3+
import net.minecraft.core.entity.player.EntityPlayer;
4+
import net.minecraft.core.util.helper.Side;
5+
import sunsetsatellite.catalyst.Catalyst;
6+
7+
public enum BlockSection {
8+
TOP_LEFT(new Vec2f(0.0,0.8),new Vec2f(0.2,0.1)),
9+
BOTTOM_LEFT(new Vec2f(0.0,0.0),new Vec2f(0.2,0.2)),
10+
CENTER_LEFT(new Vec2f(0.0,0.4),new Vec2f(0.2,0.6)),
11+
TOP_RIGHT(new Vec2f(0.8,0.8),new Vec2f(1,1)),
12+
BOTTOM_RIGHT(new Vec2f(0.8,0.0),new Vec2f(1,0.2)),
13+
CENTER_RIGHT(new Vec2f(0.8,0.4),new Vec2f(1,0.6)),
14+
UPPER_CENTER(new Vec2f(0.4,1),new Vec2f(0.6,0.8)),
15+
LOWER_CENTER(new Vec2f(0.4,0.0),new Vec2f(0.6,0.2)),
16+
CENTER(new Vec2f(0.4,0.4),new Vec2f(0.6,0.6)),
17+
;
18+
19+
public final Vec2f min;
20+
public final Vec2f max;
21+
22+
BlockSection(Vec2f min, Vec2f max) {
23+
this.min = min;
24+
this.max = max;
25+
}
26+
27+
public static BlockSection getClosestBlockSection(Vec2f vec) {
28+
double bestDistance = Double.MAX_VALUE;
29+
BlockSection bestSection = null;
30+
for (BlockSection section : BlockSection.values()) {
31+
double minDistance = vec.distanceTo(section.min);
32+
double maxDistance = vec.distanceTo(section.max);
33+
double currentMinimumDistance = Math.min(minDistance, maxDistance);
34+
if (currentMinimumDistance < bestDistance) {
35+
bestDistance = currentMinimumDistance;
36+
bestSection = section;
37+
}
38+
}
39+
return bestSection;
40+
}
41+
42+
public Direction toDirection(Direction blockSide, Side playerFacing){
43+
if(blockSide.getAxis().isVertical()){
44+
switch (this){
45+
case TOP_RIGHT:
46+
case BOTTOM_LEFT:
47+
case BOTTOM_RIGHT:
48+
case TOP_LEFT:
49+
return blockSide.getOpposite();
50+
case CENTER_LEFT:
51+
return Direction.X_NEG;
52+
case CENTER_RIGHT:
53+
return Direction.X_POS;
54+
case UPPER_CENTER:
55+
return Direction.Z_POS;
56+
case LOWER_CENTER:
57+
return Direction.Z_NEG;
58+
case CENTER:
59+
return blockSide;
60+
}
61+
} else {
62+
switch (this) {
63+
case TOP_RIGHT:
64+
case BOTTOM_LEFT:
65+
case BOTTOM_RIGHT:
66+
case TOP_LEFT:
67+
return blockSide.getOpposite();
68+
case CENTER_LEFT:
69+
switch (playerFacing) {
70+
case NORTH:
71+
return Direction.X_NEG;
72+
case EAST:
73+
return Direction.Z_NEG;
74+
case SOUTH:
75+
return Direction.X_POS;
76+
case WEST:
77+
return Direction.Z_POS;
78+
}
79+
break;
80+
case CENTER_RIGHT:
81+
switch (playerFacing) {
82+
case NORTH:
83+
return Direction.X_POS;
84+
case EAST:
85+
return Direction.Z_POS;
86+
case SOUTH:
87+
return Direction.X_NEG;
88+
case WEST:
89+
return Direction.Z_NEG;
90+
}
91+
break;
92+
case UPPER_CENTER:
93+
return Direction.Y_POS;
94+
case LOWER_CENTER:
95+
return Direction.Y_NEG;
96+
case CENTER:
97+
return blockSide;
98+
}
99+
}
100+
return null;
101+
}
102+
103+
}

0 commit comments

Comments
 (0)