Skip to content

Commit a988294

Browse files
authored
Enhance Keybindings (#340)
* extract ReloadKey * modify Info Parse Package, extract some logic * add copy key * suppress warning * only enable keybinds by default in debug * make mouse keys work in guis * make mouse only work on click, not movement * rename field * check conflict on press * mouse in world state check * adjust category
1 parent a19b7a5 commit a988294

File tree

11 files changed

+394
-104
lines changed

11 files changed

+394
-104
lines changed

src/main/java/com/cleanroommc/groovyscript/GroovyScript.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
import com.cleanroommc.groovyscript.event.EventHandler;
1616
import com.cleanroommc.groovyscript.helper.JsonHelper;
1717
import com.cleanroommc.groovyscript.helper.StyleConstant;
18+
import com.cleanroommc.groovyscript.keybinds.GroovyScriptKeybinds;
1819
import com.cleanroommc.groovyscript.mapper.AbstractObjectMapper;
1920
import com.cleanroommc.groovyscript.mapper.ObjectMapperManager;
20-
import com.cleanroommc.groovyscript.network.CReload;
2121
import com.cleanroommc.groovyscript.network.NetworkHandler;
22-
import com.cleanroommc.groovyscript.network.NetworkUtils;
2322
import com.cleanroommc.groovyscript.registry.ReloadableRegistryManager;
2423
import com.cleanroommc.groovyscript.sandbox.*;
2524
import com.cleanroommc.groovyscript.sandbox.mapper.GroovyDeobfMapper;
@@ -30,19 +29,15 @@
3029
import groovy.lang.GroovySystem;
3130
import net.minecraft.client.Minecraft;
3231
import net.minecraft.client.gui.GuiScreen;
33-
import net.minecraft.client.settings.KeyBinding;
3432
import net.minecraft.command.ICommandSender;
3533
import net.minecraft.item.Item;
3634
import net.minecraft.util.text.Style;
3735
import net.minecraft.util.text.TextComponentString;
3836
import net.minecraft.util.text.TextComponentTranslation;
3937
import net.minecraft.util.text.TextFormatting;
40-
import net.minecraftforge.client.settings.KeyConflictContext;
41-
import net.minecraftforge.client.settings.KeyModifier;
4238
import net.minecraftforge.common.MinecraftForge;
4339
import net.minecraftforge.event.RegistryEvent;
4440
import net.minecraftforge.fluids.FluidRegistry;
45-
import net.minecraftforge.fml.client.registry.ClientRegistry;
4641
import net.minecraftforge.fml.common.Loader;
4742
import net.minecraftforge.fml.common.Mod;
4843
import net.minecraftforge.fml.common.ModContainer;
@@ -52,14 +47,14 @@
5247
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
5348
import net.minecraftforge.fml.common.eventhandler.EventPriority;
5449
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
55-
import net.minecraftforge.fml.common.gameevent.InputEvent;
5650
import net.minecraftforge.fml.relauncher.FMLInjectionData;
5751
import net.minecraftforge.fml.relauncher.FMLLaunchHandler;
52+
import net.minecraftforge.fml.relauncher.Side;
53+
import net.minecraftforge.fml.relauncher.SideOnly;
5854
import org.apache.logging.log4j.LogManager;
5955
import org.apache.logging.log4j.Logger;
6056
import org.jetbrains.annotations.ApiStatus;
6157
import org.jetbrains.annotations.NotNull;
62-
import org.lwjgl.input.Keyboard;
6358

6459
import java.io.File;
6560
import java.io.IOException;
@@ -94,9 +89,6 @@ public class GroovyScript {
9489
private static ModContainer scriptMod;
9590
private static Thread languageServerThread;
9691

97-
private static KeyBinding reloadKey;
98-
private static long timeSinceLastUse;
99-
10092
public static final Random RND = new Random();
10193

10294
@Mod.EventHandler
@@ -116,21 +108,28 @@ public void onConstruction(FMLConstructionEvent event) {
116108
GroovyScript.sandbox = new GroovyScriptSandbox();
117109
ModSupport.INSTANCE.setup(event.getASMHarvestedData());
118110

119-
if (NetworkUtils.isDedicatedClient()) {
120-
// this resource pack must be added in construction
121-
((DefaultResourcePackAccessor) Minecraft.getMinecraft()).get().add(new GroovyResourcePack());
122-
reloadKey = new KeyBinding("key.groovyscript.reload", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, Keyboard.KEY_R, "key.categories.groovyscript");
123-
ClientRegistry.registerKeyBinding(reloadKey);
124-
}
125-
126111
FluidRegistry.enableUniversalBucket();
127112
getRunConfig().initPackmode();
128113
}
129114

115+
@Mod.EventHandler
116+
@SideOnly(Side.CLIENT)
117+
public void onClientConstruction(FMLConstructionEvent event) {
118+
MinecraftForge.EVENT_BUS.register(GroovyScriptKeybinds.class);
119+
// this resource pack must be added in construction
120+
((DefaultResourcePackAccessor) Minecraft.getMinecraft()).get().add(new GroovyResourcePack());
121+
}
122+
130123
@Mod.EventHandler
131124
public void onInit(FMLInitializationEvent event) {
132125
if (ModSupport.TINKERS_CONSTRUCT.isLoaded()) TinkersConstruct.init();
133-
if (event.getSide().isClient() && Boolean.parseBoolean(System.getProperty("groovyscript.run_ls"))) {
126+
}
127+
128+
@Mod.EventHandler
129+
@SideOnly(Side.CLIENT)
130+
public void onClientInit(FMLInitializationEvent event) {
131+
GroovyScriptKeybinds.initialize();
132+
if (Boolean.parseBoolean(System.getProperty("groovyscript.run_ls"))) {
134133
runLanguageServer();
135134
}
136135
}
@@ -194,15 +193,6 @@ public void onServerLoad(FMLServerStartingEvent event) {
194193
VanillaModule.INSTANCE.command.onStartServer(event.getServer());
195194
}
196195

197-
@SubscribeEvent
198-
public static void onInput(InputEvent.KeyInputEvent event) {
199-
long time = Minecraft.getSystemTime();
200-
if (Minecraft.getMinecraft().isIntegratedServerRunning() && reloadKey.isPressed() && time - timeSinceLastUse >= 1000 && Minecraft.getMinecraft().player.getPermissionLevel() >= 4) {
201-
NetworkHandler.sendToServer(new CReload());
202-
timeSinceLastUse = time;
203-
}
204-
}
205-
206196
public static @NotNull String getScriptPath() {
207197
return getScriptFile().getPath();
208198
}

src/main/java/com/cleanroommc/groovyscript/api/infocommand/InfoParserPackage.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package com.cleanroommc.groovyscript.api.infocommand;
22

3+
import com.cleanroommc.groovyscript.event.GsHandEvent;
34
import net.minecraft.block.Block;
45
import net.minecraft.block.state.IBlockState;
56
import net.minecraft.client.Minecraft;
67
import net.minecraft.entity.Entity;
78
import net.minecraft.entity.player.EntityPlayer;
9+
import net.minecraft.item.ItemBlock;
810
import net.minecraft.item.ItemStack;
911
import net.minecraft.server.MinecraftServer;
1012
import net.minecraft.tileentity.TileEntity;
1113
import net.minecraft.util.math.BlockPos;
1214
import net.minecraft.util.text.ITextComponent;
15+
import net.minecraftforge.common.MinecraftForge;
1316
import org.jetbrains.annotations.NotNull;
1417
import org.jetbrains.annotations.Nullable;
1518

@@ -103,6 +106,10 @@ public InfoParserPackage(
103106

104107
public void setStack(@NotNull ItemStack stack) {
105108
this.stack = stack;
109+
if (!stack.isEmpty() && stack.getItem() instanceof ItemBlock itemBlock) {
110+
setBlock(itemBlock.getBlock());
111+
setBlockState(itemBlock.getBlock().getStateFromMeta(stack.getMetadata()));
112+
}
106113
}
107114

108115
public boolean isPrettyNbt() {
@@ -165,6 +172,8 @@ public void parse() {
165172
}
166173

167174
public void parse(boolean enabled) {
175+
MinecraftForge.EVENT_BUS.post(new GsHandEvent(this));
176+
168177
InfoParserRegistry.getInfoParsers().forEach(x -> x.parse(this, enabled));
169178
}
170179
}

src/main/java/com/cleanroommc/groovyscript/command/BaseInfoCommand.java

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,14 @@
22

33
import com.cleanroommc.groovyscript.api.infocommand.InfoParserPackage;
44
import com.cleanroommc.groovyscript.api.infocommand.InfoParserRegistry;
5-
import com.cleanroommc.groovyscript.event.GsHandEvent;
65
import com.cleanroommc.groovyscript.helper.StyleConstant;
7-
import com.google.common.base.Predicates;
86
import net.minecraft.command.CommandBase;
97
import net.minecraft.command.ICommandSender;
10-
import net.minecraft.entity.Entity;
118
import net.minecraft.entity.player.EntityPlayer;
129
import net.minecraft.server.MinecraftServer;
13-
import net.minecraft.util.EntitySelectors;
14-
import net.minecraft.util.math.AxisAlignedBB;
1510
import net.minecraft.util.math.BlockPos;
16-
import net.minecraft.util.math.RayTraceResult;
17-
import net.minecraft.util.math.Vec3d;
1811
import net.minecraft.util.text.ITextComponent;
1912
import net.minecraft.util.text.TextComponentString;
20-
import net.minecraftforge.common.MinecraftForge;
2113
import org.jetbrains.annotations.NotNull;
2214
import org.jetbrains.annotations.Nullable;
2315

@@ -28,56 +20,6 @@
2820

2921
public abstract class BaseInfoCommand extends CommandBase {
3022

31-
/**
32-
* gets the block being looked at, stopping on fluid blocks
33-
*/
34-
protected static BlockPos getBlockLookingAt(EntityPlayer player) {
35-
double distance = player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue();
36-
Vec3d eyes = player.getPositionEyes(0.0F);
37-
Vec3d look = player.getLook(0.0F);
38-
Vec3d end = eyes.add(look.x * distance, look.y * distance, look.z * distance);
39-
40-
RayTraceResult result = player.getEntityWorld().rayTraceBlocks(eyes, end, true);
41-
if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK) {
42-
return result.getBlockPos();
43-
}
44-
return null;
45-
}
46-
47-
/**
48-
* gets the closest entity being looked at
49-
*/
50-
protected static Entity getEntityLookingAt(EntityPlayer player) {
51-
Entity entity = null;
52-
double d0 = 0.0D;
53-
54-
double distance = player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue();
55-
Vec3d eyes = player.getPositionEyes(0.0F);
56-
Vec3d look = player.getLook(0.0F);
57-
Vec3d end = eyes.add(look.x * distance, look.y * distance, look.z * distance);
58-
59-
List<Entity> list = player.world.getEntitiesInAABBexcluding(
60-
player,
61-
player.getEntityBoundingBox()
62-
.expand(look.x * distance, look.y * distance, look.z * distance)
63-
.grow(1.0D, 1.0D, 1.0D),
64-
Predicates.and(EntitySelectors.NOT_SPECTATING, e -> e != null && e.canBeCollidedWith()));
65-
66-
for (Entity entity1 : list) {
67-
AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().grow(0.3);
68-
RayTraceResult raytraceresult = axisalignedbb.calculateIntercept(eyes, end);
69-
70-
if (raytraceresult != null) {
71-
double d1 = eyes.squareDistanceTo(raytraceresult.hitVec);
72-
if (d1 < d0 || d0 == 0.0D) {
73-
entity = entity1;
74-
d0 = d1;
75-
}
76-
}
77-
}
78-
return entity;
79-
}
80-
8123
@Override
8224
public @NotNull String getUsage(@NotNull ICommandSender sender) {
8325
return String.format(
@@ -141,9 +83,6 @@ public void execute(@NotNull MinecraftServer server, @NotNull ICommandSender sen
14183
// add different data to the info parser depending on the command being used
14284
gatherInfo(info, player);
14385

144-
GsHandEvent event = new GsHandEvent(info);
145-
MinecraftForge.EVENT_BUS.post(event);
146-
14786
info.parse(enabled);
14887
print(player, messages, argList);
14988
}

src/main/java/com/cleanroommc/groovyscript/command/InfoHandCommand.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.cleanroommc.groovyscript.api.infocommand.InfoParserPackage;
44
import net.minecraft.entity.player.EntityPlayer;
5-
import net.minecraft.item.ItemBlock;
65
import net.minecraft.util.EnumHand;
76
import org.jetbrains.annotations.NotNull;
87

@@ -22,10 +21,5 @@ protected String targetDescription() {
2221
void gatherInfo(InfoParserPackage info, EntityPlayer player) {
2322
info.setStack(player.getHeldItem(EnumHand.MAIN_HAND));
2423
if (info.getStack().isEmpty()) info.setStack(player.getHeldItem(EnumHand.OFF_HAND));
25-
26-
if (info.getStack().getItem() instanceof ItemBlock itemBlock) {
27-
info.setBlock(itemBlock.getBlock());
28-
info.setBlockState(itemBlock.getBlock().getStateFromMeta(info.getStack().getMetadata()));
29-
}
3024
}
3125
}

src/main/java/com/cleanroommc/groovyscript/command/InfoInfoCommand.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.cleanroommc.groovyscript.command;
22

33
import com.cleanroommc.groovyscript.api.infocommand.InfoParserPackage;
4+
import com.cleanroommc.groovyscript.helper.RayTracingHelper;
45
import net.minecraft.entity.player.EntityPlayer;
5-
import net.minecraft.item.ItemBlock;
66
import net.minecraft.util.EnumHand;
77
import org.jetbrains.annotations.NotNull;
88

@@ -26,16 +26,13 @@ void gatherInfo(InfoParserPackage info, EntityPlayer player) {
2626
// if there's nothing in the player's hands, get the entity being looked at and then the block position
2727
// because entity should be preferred
2828
if (info.getStack().isEmpty()) {
29-
info.setEntity(getEntityLookingAt(player));
29+
info.setEntity(RayTracingHelper.getEntityLookingAt(player));
3030
if (info.getEntity() == null) {
31-
info.copyFromPos(getBlockLookingAt(player));
31+
info.copyFromPos(RayTracingHelper.getBlockLookingAt(player));
3232
if (info.getPos() == null) {
3333
info.setEntity(player);
3434
}
3535
}
36-
} else if (info.getStack().getItem() instanceof ItemBlock itemBlock) {
37-
info.setBlock(itemBlock.getBlock());
38-
info.setBlockState(itemBlock.getBlock().getStateFromMeta(info.getStack().getMetadata()));
3936
}
4037
}
4138
}

src/main/java/com/cleanroommc/groovyscript/command/InfoLookingCommand.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.cleanroommc.groovyscript.command;
22

33
import com.cleanroommc.groovyscript.api.infocommand.InfoParserPackage;
4+
import com.cleanroommc.groovyscript.helper.RayTracingHelper;
45
import net.minecraft.entity.player.EntityPlayer;
56
import org.jetbrains.annotations.NotNull;
67

@@ -19,9 +20,9 @@ protected String targetDescription() {
1920
@Override
2021
void gatherInfo(InfoParserPackage info, EntityPlayer player) {
2122
// get the entity being looked at and then the block position because entity should be preferred
22-
info.setEntity(getEntityLookingAt(player));
23+
info.setEntity(RayTracingHelper.getEntityLookingAt(player));
2324
if (info.getEntity() == null) {
24-
info.copyFromPos(getBlockLookingAt(player));
25+
info.copyFromPos(RayTracingHelper.getBlockLookingAt(player));
2526
}
2627
}
2728
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.cleanroommc.groovyscript.helper;
2+
3+
import com.google.common.base.Predicates;
4+
import net.minecraft.entity.Entity;
5+
import net.minecraft.entity.player.EntityPlayer;
6+
import net.minecraft.util.EntitySelectors;
7+
import net.minecraft.util.math.AxisAlignedBB;
8+
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.util.math.RayTraceResult;
10+
import net.minecraft.util.math.Vec3d;
11+
12+
import java.util.List;
13+
14+
public class RayTracingHelper {
15+
16+
/**
17+
* gets the block being looked at, stopping on fluid blocks
18+
*/
19+
public static BlockPos getBlockLookingAt(EntityPlayer player) {
20+
double distance = player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue();
21+
Vec3d eyes = player.getPositionEyes(0.0F);
22+
Vec3d look = player.getLook(0.0F);
23+
Vec3d end = eyes.add(look.x * distance, look.y * distance, look.z * distance);
24+
25+
RayTraceResult result = player.getEntityWorld().rayTraceBlocks(eyes, end, true);
26+
if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK) {
27+
return result.getBlockPos();
28+
}
29+
return null;
30+
}
31+
32+
/**
33+
* gets the closest entity being looked at
34+
*/
35+
public static Entity getEntityLookingAt(EntityPlayer player) {
36+
Entity entity = null;
37+
double d0 = 0.0D;
38+
39+
double distance = player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue();
40+
Vec3d eyes = player.getPositionEyes(0.0F);
41+
Vec3d look = player.getLook(0.0F);
42+
Vec3d end = eyes.add(look.x * distance, look.y * distance, look.z * distance);
43+
44+
List<Entity> list = player.world.getEntitiesInAABBexcluding(
45+
player,
46+
player.getEntityBoundingBox()
47+
.expand(look.x * distance, look.y * distance, look.z * distance)
48+
.grow(1.0D, 1.0D, 1.0D),
49+
Predicates.and(EntitySelectors.NOT_SPECTATING, e -> e != null && e.canBeCollidedWith()));
50+
51+
for (Entity entity1 : list) {
52+
AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().grow(0.3);
53+
RayTraceResult raytraceresult = axisalignedbb.calculateIntercept(eyes, end);
54+
55+
if (raytraceresult != null) {
56+
double d1 = eyes.squareDistanceTo(raytraceresult.hitVec);
57+
if (d1 < d0 || d0 == 0.0D) {
58+
entity = entity1;
59+
d0 = d1;
60+
}
61+
}
62+
}
63+
return entity;
64+
}
65+
}

0 commit comments

Comments
 (0)