buildscript {
repositories {
jcenter()
- maven { url 'https://repo.spongepowered.org/maven' }
- maven { url 'https://jitpack.io' }
maven { url 'https://files.minecraftforge.net/maven' }
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
- classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT'
}
}
-apply plugin: 'net.minecraftforge.gradle.tweaker-client'
+apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'java'
-apply plugin: 'org.spongepowered.mixin'
group 'com.irtimaled'
version project.buildVersion + '-' + project.mcVersion
sourceCompatibility = 1.8
targetCompatibility = 1.8
-repositories {
- mavenCentral()
- maven { url 'https://libraries.minecraft.net/' }
- maven { url 'https://repo.spongepowered.org/maven/' }
- maven { url 'https://jitpack.io' }
-}
-
-dependencies {
- implementation('org.spongepowered:mixin:0.7.11-SNAPSHOT') { transitive = false }
- implementation('net.minecraft:launchwrapper:1.12') { transitive = false }
- implementation 'org.ow2.asm:asm:6.2'
- implementation 'org.ow2.asm:asm-commons:6.2'
-}
minecraft {
- version = project.mcVersion
+ version = '1.12.2-14.23.5.2838'
mappings = 'snapshot_20171003'
runDir = 'run'
- tweakClass = 'com.irtimaled.bbor.launch.ClientTweaker'
makeObfSourceJar = false
replace "@VERSION@", project.version
- replaceIn "com/irtimaled/bbor/Main.java"
+ replaceIn "com/irtimaled/bbor/forge/ForgeMod.java"
replace "@MC_VERSION@", project.mcVersion
- replaceIn "com/irtimaled/bbor/Main.java"
-}
-
-mixin {
- defaultObfuscationEnv notch
- add sourceSets.main, 'mixins.bbor.refmap.json'
+ replaceIn "com/irtimaled/bbor/forge/ForgeMod.java"
}
sourceSets {
}
processResources {
- filesMatching('profile.json') {
+ filesMatching('mcmod.info') {
expand([
- 'version' : project.version,
- 'mcVersion' : project.mcVersion,
- 'tweakClass' : project.minecraft.tweakClass,
- 'formattedTime': new Date().format("yyyy-MM-dd'T'HH:mm:ss'-08:00'")
+ 'version': project.version,
+ 'mcVersion': project.mcVersion,
+ 'formattedTime': new Date().format("yyyy-MM-dd'T'HH:mm:ss'-08:00'")
])
}
jar {
finalizedBy reobfJar
- manifest.attributes(
- 'Main-Class': 'com.irtimaled.bbor.Main'
- )
- classifier = 'vanilla'
+ classifier = 'forge'
}
artifacts {
+++ /dev/null
-package com.irtimaled.bbor;
-
-import com.irtimaled.bbor.install.Installer;
-
-public class Main {
- public static void main(String... args) {
- Installer.install("@VERSION@", "@MC_VERSION@");
- }
-}
private String title;
private Set<IRenderableControl> controls = new HashSet<>();
- SettingsScreen(GuiScreen lastScreen, int tabIndex) {
+ public SettingsScreen(GuiScreen lastScreen, int tabIndex) {
this.lastScreen = lastScreen;
this.tabIndex = tabIndex;
}
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.client.interop.ClientInterop;
+import com.irtimaled.bbor.common.EventBus;
+import com.irtimaled.bbor.common.messages.*;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.network.play.server.SPacketCustomPayload;
+import net.minecraft.network.play.server.SPacketSpawnPosition;
+
+public class ForgeClientChannelHandler extends SimpleChannelInboundHandler<Packet<?>> {
+ private final NetworkManager networkManager;
+
+ ForgeClientChannelHandler(NetworkManager networkManager) {
+ this.networkManager = networkManager;
+ }
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, Packet<?> msg) {
+ if (msg instanceof SPacketCustomPayload && handle((SPacketCustomPayload) msg)) {
+ return;
+ }
+ if (msg instanceof SPacketSpawnPosition) {
+ handle((SPacketSpawnPosition) msg);
+ }
+ ctx.fireChannelRead(msg);
+ }
+
+ private boolean handle(SPacketCustomPayload msg) {
+ String channelName = msg.getChannelName();
+ if (!channelName.startsWith("bbor")) {
+ return false;
+ }
+ PacketBuffer data = null;
+ try {
+ data = msg.getBufferData();
+ PayloadReader reader = new PayloadReader(data);
+ switch (channelName) {
+ case AddBoundingBox.NAME: {
+ EventBus.publish(AddBoundingBox.getEvent(reader));
+ break;
+ }
+ case RemoveBoundingBox.NAME: {
+ EventBus.publish(RemoveBoundingBox.getEvent(reader));
+ break;
+ }
+ case InitializeClient.NAME: {
+ EventBus.publish(InitializeClient.getEvent(reader));
+ networkManager.sendPacket(SubscribeToServer.getPayload().build());
+ break;
+ }
+ }
+
+ } finally {
+ if (data != null)
+ data.release();
+ }
+ return true;
+ }
+
+ private void handle(SPacketSpawnPosition msg) {
+ ClientInterop.updateWorldSpawnReceived(msg.getSpawnPos());
+ }
+}
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.client.ClientProxy;
+import com.irtimaled.bbor.client.interop.ClientInterop;
+import com.irtimaled.bbor.client.keyboard.KeyListener;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.network.NetworkManager;
+import net.minecraftforge.client.event.ClientChatEvent;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.InputEvent;
+import net.minecraftforge.fml.common.network.FMLNetworkEvent;
+import org.apache.commons.lang3.ArrayUtils;
+import org.lwjgl.input.Keyboard;
+
+public class ForgeClientProxy extends ForgeCommonProxy {
+ private ClientProxy clientProxy;
+
+ @Override
+ void init() {
+ clientProxy = new ClientProxy();
+ clientProxy.init();
+ Minecraft.getMinecraft().gameSettings.keyBindings = ArrayUtils.addAll(Minecraft.getMinecraft().gameSettings.keyBindings, KeyListener.keyBindings());
+ }
+
+ @SubscribeEvent
+ public void onKeyInputEvent(InputEvent.KeyInputEvent evt) {
+ int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
+ boolean down = Keyboard.getEventKeyState();
+ KeyListener.setKeyBindState(keyCode, down);
+ }
+
+ @SubscribeEvent
+ public void renderWorldLastEvent(RenderWorldLastEvent event) {
+ EntityPlayerSP player = Minecraft.getMinecraft().player;
+ ClientInterop.render(event.getPartialTicks(), player);
+ }
+
+ @SubscribeEvent
+ public void clientConnectionToServerEvent(FMLNetworkEvent.ClientConnectedToServerEvent evt) {
+ NetworkManager networkManager = evt.getManager();
+ networkManager.channel().pipeline().addBefore("packet_handler", "bbor", new ForgeClientChannelHandler(networkManager));
+
+ ClientInterop.connectedToRemoteServer(networkManager);
+ }
+
+ @SubscribeEvent
+ public void clientDisconnectionFromServerEvent(FMLNetworkEvent.ClientDisconnectionFromServerEvent evt) {
+ ClientInterop.disconnectedFromRemoteServer();
+ }
+
+ @SubscribeEvent
+ public void clientChatEvent(ClientChatEvent event) {
+ String message = event.getMessage();
+ if (ClientInterop.interceptChatMessage(message))
+ event.setMessage("");
+ }
+}
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.common.CommonProxy;
+import com.irtimaled.bbor.common.interop.CommonInterop;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.event.world.ChunkEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.PlayerEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+public class ForgeCommonProxy {
+ void init() {
+ new CommonProxy().init();
+ }
+
+ @SubscribeEvent
+ public void worldEvent(WorldEvent.Load event) {
+ World world = event.getWorld();
+ if (world instanceof WorldServer) {
+ CommonInterop.loadWorld((WorldServer) world);
+ }
+ }
+
+ @SubscribeEvent
+ public void chunkEvent(ChunkEvent.Load event) {
+ if (event.getWorld() instanceof WorldServer) {
+ CommonInterop.chunkLoaded(event.getChunk());
+ }
+ }
+
+ @SubscribeEvent
+ public void playerLoggedInEvent(PlayerEvent.PlayerLoggedInEvent evt) {
+ if (evt.player instanceof EntityPlayerMP) {
+ EntityPlayerMP player = (EntityPlayerMP) evt.player;
+ NetworkManager networkManager = player.connection.netManager;
+ networkManager.channel().pipeline().addBefore("packet_handler", "bbor", new ForgeServerChannelHandler(player));
+
+ CommonInterop.playerLoggedIn(player);
+ }
+ }
+
+ @SubscribeEvent
+ public void playerLoggedOutEvent(PlayerEvent.PlayerLoggedOutEvent evt) {
+ EntityPlayer player = evt.player;
+ if (player instanceof EntityPlayerMP) {
+ CommonInterop.playerLoggedOut((EntityPlayerMP) player);
+ }
+ }
+
+ @SubscribeEvent
+ public void worldTickEvent(TickEvent.WorldTickEvent event) {
+ if (event.phase == TickEvent.Phase.END &&
+ event.world instanceof WorldServer) {
+ CommonInterop.worldTick((WorldServer) event.world);
+ }
+ }
+
+ @SubscribeEvent
+ public void serverTickEvent(TickEvent.ServerTickEvent event) {
+ if (event.phase == TickEvent.Phase.END)
+ CommonInterop.tick();
+ }
+
+ @SubscribeEvent
+ public void blockBreakEvent(BlockEvent.BreakEvent event) {
+ Block block = event.getState().getBlock();
+ CommonInterop.tryHarvestBlock(block, event.getPos(), event.getWorld());
+ }
+}
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.client.gui.SettingsScreen;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraftforge.fml.client.IModGuiFactory;
+
+import java.util.Set;
+
+public class ForgeConfigFactory implements IModGuiFactory {
+ @Override
+ public void initialize(Minecraft minecraft) {
+ }
+
+ @Override
+ public boolean hasConfigGui() {
+ return true;
+ }
+
+ @Override
+ public GuiScreen createConfigGui(GuiScreen guiScreen) {
+ return new SettingsScreen(guiScreen, 0);
+ }
+
+ @Override
+ public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
+ return null;
+ }
+}
\ No newline at end of file
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.common.interop.CommonInterop;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.common.SidedProxy;
+import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+
+@Mod(modid = ForgeMod.MODID, name = ForgeMod.NAME, version = ForgeMod.VERSION, acceptedMinecraftVersions = ForgeMod.MCVERSION, acceptableRemoteVersions = "*", guiFactory = "com.irtimaled.bbor.forge.ForgeConfigFactory")
+public class ForgeMod {
+ static final String MODID = "bbor";
+ static final String NAME = "BoundingBoxOutlineReloaded";
+ static final String VERSION = "@VERSION@";
+ static final String MCVERSION = "@MC_VERSION@";
+
+ @Mod.Instance()
+ public static ForgeMod instance;
+
+ @SidedProxy(clientSide = "com.irtimaled.bbor.forge.ForgeClientProxy", serverSide = "com.irtimaled.bbor.forge.ForgeCommonProxy")
+ public static ForgeCommonProxy proxy;
+
+ @Mod.EventHandler
+ public void load(FMLInitializationEvent evt) {
+ MinecraftForge.EVENT_BUS.register(proxy);
+ CommonInterop.init();
+ proxy.init();
+ }
+}
--- /dev/null
+package com.irtimaled.bbor.forge;
+
+import com.irtimaled.bbor.common.interop.CommonInterop;
+import com.irtimaled.bbor.common.messages.SubscribeToServer;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.client.CPacketCustomPayload;
+
+public class ForgeServerChannelHandler extends SimpleChannelInboundHandler<Packet<?>> {
+ private final EntityPlayerMP player;
+
+ ForgeServerChannelHandler(EntityPlayerMP player) {
+ this.player = player;
+ }
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext ctx, Packet<?> msg) {
+ if (msg instanceof CPacketCustomPayload && handle((CPacketCustomPayload) msg)) {
+ return;
+ }
+ ctx.fireChannelRead(msg);
+
+ }
+
+ private boolean handle(CPacketCustomPayload msg) {
+ if (!msg.getChannelName().equals(SubscribeToServer.NAME))
+ return false;
+
+ CommonInterop.playerSubscribed(player);
+ return true;
+ }
+}
+++ /dev/null
-package com.irtimaled.bbor.install;
-
-import javax.swing.*;
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-public class Installer {
- public static void install(final String version, final String mcVersion) {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Throwable t) {
- t.printStackTrace();
- }
-
- try {
- String osName = getOsName();
- File minecraftFolder = getMinecraftFolder(osName);
- File versionFolder = new File(minecraftFolder, "versions/BBOR-" + version + "/");
- versionFolder.mkdirs();
-
- File versionJson = new File(versionFolder, "BBOR-" + version + ".json");
- Files.copy(Installer.class.getResourceAsStream("/profile.json"), versionJson.toPath(), StandardCopyOption.REPLACE_EXISTING);
-
- try {
- File profilesJson = new File(minecraftFolder, "launcher_profiles.json");
- if (profilesJson.exists()) { // TODO: use gson instead
- String identifier = "\"bbor-" + mcVersion + "\"";
- String contents = new String(Files.readAllBytes(profilesJson.toPath()));
- if (contents.contains(identifier)) {
- contents = contents.replaceAll(",\n *" + identifier + ": \\{[^}]*},", ",");
- contents = contents.replaceAll(",?\n *" + identifier + ": \\{[^}]*},?", "");
- }
-
- String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
-
- contents = contents.replaceAll("(\n\\s*\"profiles\"\\s*:\\s*\\{)", "$1\n" +
- " " + identifier + ": {\n" +
- " \"name\": \"Bounding Box Outline Reloaded\",\n" +
- " \"type\": \"custom\",\n" +
- " \"created\": \"" + date + "T00:00:00.000Z\",\n" +
- " \"lastUsed\": \"2100-01-01T00:00:00.000Z\",\n" +
- " \"lastVersionId\": \"BBOR-" + version + "\"\n" +
- " },");
-
- Files.write(profilesJson.toPath(), contents.getBytes());
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
-
- try {
- String source = Installer.class.getProtectionDomain().getCodeSource().getLocation().getPath();
- if (source.startsWith("/") && osName.contains("win")) {
- source = source.substring(1);
- }
- File mainJar = new File(minecraftFolder, "libraries/com/irtimaled/bbor/" + version + "/bbor-" + version + ".jar");
- mainJar.getParentFile().mkdirs();
- Files.copy(Paths.get(source), mainJar.toPath(), StandardCopyOption.REPLACE_EXISTING);
- } catch (Throwable t) {
- t.printStackTrace();
- }
-
- JOptionPane.showMessageDialog(null,
- "Bounding Box Outline Reloaded " + version + " has been successfully installed!\n" +
- "\n" +
- "Re-open the Minecraft Launcher to see it in the dropdown.",
- "Bounding Box Outline Reloaded Installer", JOptionPane.INFORMATION_MESSAGE);
- } catch (Throwable t) {
- StringWriter w = new StringWriter();
- t.printStackTrace(new PrintWriter(w));
- JOptionPane.showMessageDialog(null,
- "An error occured while installing Bounding Box Outline Reloaded, please report this to the issue\n" +
- "tracker (https://github.com/irtimaled/BoundingBoxOutlineReloaded/issues):\n" +
- "\n" +
- w.toString().replace("\t", " "), "Bounding Box Outline Reloaded Installer", JOptionPane.ERROR_MESSAGE);
- }
- }
-
- private static File getMinecraftFolder(String osName) {
- File minecraftFolder;
- if (osName.contains("win")) {
- minecraftFolder = new File(System.getenv("APPDATA") + "/.minecraft");
- } else if (osName.contains("mac")) {
- minecraftFolder = new File(System.getProperty("user.home") + "/Library/Application Support/minecraft");
- } else {
- minecraftFolder = new File(System.getProperty("user.home") + "/.minecraft");
- }
- return minecraftFolder;
- }
-
- private static String getOsName() {
- return System.getProperty("os.name").toLowerCase(Locale.ROOT);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.launch;
-
-import java.io.File;
-import java.util.List;
-
-public class ClientTweaker extends Tweaker {
- @Override
- protected void addOptions(List<String> args, File gameDir, File assetsDir, String profile) {
- addArg("--assetsDir", assetsDir.getPath());
- }
-
- @Override
- public String getLaunchTarget() {
- return "net.minecraft.client.main.Main";
- }
-
- @Override
- protected boolean isClient() {
- return true;
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.launch;
-
-public class ServerTweaker extends Tweaker {
- @Override
- protected boolean isClient() {
- return false;
- }
-
- @Override
- public String getLaunchTarget() {
- return "net.minecraft.server.MinecraftServer";
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.launch;
-
-import net.minecraft.launchwrapper.ITweaker;
-import net.minecraft.launchwrapper.LaunchClassLoader;
-import org.spongepowered.asm.launch.MixinBootstrap;
-import org.spongepowered.asm.mixin.MixinEnvironment;
-import org.spongepowered.asm.mixin.Mixins;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-public abstract class Tweaker implements ITweaker {
- public List<String> args;
-
- @Override
- public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
- this.args = new ArrayList<>(args);
- addArg("--version", profile);
- addOptions(args, gameDir, assetsDir, profile);
- }
-
- protected void addArg(String name, String value) {
- args.add(name);
- if (value != null) {
- args.add(value);
- }
- }
-
- protected void addOptions(List<String> args, File gameDir, File assetsDir, String profile) {
- }
-
- @Override
- public void injectIntoClassLoader(LaunchClassLoader classLoader) {
- MixinBootstrap.init();
- Mixins.addConfiguration("mixins.bbor.json");
- MixinEnvironment.getDefaultEnvironment().setSide(isClient() ? MixinEnvironment.Side.CLIENT : MixinEnvironment.Side.SERVER);
-
- }
-
- protected abstract boolean isClient();
-
- @Override
- public String[] getLaunchArguments() {
- return args.toArray(new String[0]);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client;
-
-import com.irtimaled.bbor.client.ClientProxy;
-import com.irtimaled.bbor.client.keyboard.KeyListener;
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.main.GameConfiguration;
-import net.minecraft.client.settings.KeyBinding;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.Redirect;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(Minecraft.class)
-public class MixinMinecraft {
- private ClientProxy clientProxy;
-
- @Inject(method = "<init>", at = @At("RETURN"))
- private void constructor(GameConfiguration configuration, CallbackInfo ci) {
- CommonInterop.init();
- clientProxy = new ClientProxy();
- }
-
- @Inject(method = "init", at = @At("RETURN"))
- private void init(CallbackInfo ci) {
- clientProxy.init();
- }
-
- @Redirect(method = "runTickKeyboard", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/settings/KeyBinding;setKeyBindState(IZ)V"))
- private void setKeyBindState(int keyCode, boolean pressed) {
- if (!KeyListener.setKeyBindState(keyCode, pressed)) {
- KeyBinding.setKeyBindState(keyCode, pressed);
- }
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.entity;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.client.entity.EntityPlayerSP;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(EntityPlayerSP.class)
-public abstract class MixinEntityPlayerSP {
- @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true)
- private void sendChatMessage(String message, CallbackInfo ci) {
- if (ClientInterop.interceptChatMessage(message))
- ci.cancel();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.gui;
-
-import com.irtimaled.bbor.client.gui.SettingsScreenButton;
-import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiOptions;
-import net.minecraft.client.gui.GuiScreen;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(GuiOptions.class)
-public class MixinGuiOptions extends GuiScreen {
- @Inject(method = "initGui", at = @At("RETURN"))
- private void initGui(CallbackInfo ci) {
- //shuffle middle buttons up by 12 px to make space
- int top = this.height / 6 + 42;
- int bottom = this.height / 6 + 168;
- for (GuiButton button : buttonList) {
- if (button.y >= top && button.y < bottom)
- button.y -= 12;
- }
- this.addButton(new SettingsScreenButton(199, this.width / 2 - 155, top + 84, 150, "BBOR", this));
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.multiplayer;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.client.multiplayer.WorldClient;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(WorldClient.class)
-public class MixinWorldClient {
- @Inject(method = "sendQuittingDisconnectingPacket", at = @At("RETURN"))
- private void sendQuittingDisconnectingPacket(CallbackInfo ci) {
- ClientInterop.disconnectedFromRemoteServer();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.network;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.client.network.NetHandlerLoginClient;
-import net.minecraft.network.NetworkManager;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(NetHandlerLoginClient.class)
-public abstract class MixinNetHandlerLoginClient {
- @Shadow
- @Final
- private NetworkManager networkManager;
-
- @Inject(method = "handleLoginSuccess", at = @At(value = "RETURN"))
- private void handleLoginSuccess(CallbackInfo ci) {
- ClientInterop.connectedToRemoteServer(networkManager);
- }
-
- @Inject(method = "onDisconnect", at = @At("HEAD"))
- private void onDisconnect(CallbackInfo ci) {
- ClientInterop.disconnectedFromRemoteServer();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.network;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.client.network.NetHandlerPlayClient;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(NetHandlerPlayClient.class)
-public class MixinNetHandlerPlayClient {
- @Inject(method = "onDisconnect", at = @At("HEAD"))
- private void onDisconnect(CallbackInfo ci) {
- ClientInterop.disconnectedFromRemoteServer();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.renderer;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.EntityRenderer;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(EntityRenderer.class)
-public class MixinEntityRenderer {
- @Shadow
- @Final
- private Minecraft mc;
-
- @Inject(method = "renderWorldPass", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V", args = "ldc=hand", shift = At.Shift.BEFORE))
- private void render(int pass, float partialTicks, long finishTimeNano, CallbackInfo ci) {
- if (pass % 2 == 0) {
- ClientInterop.render(partialTicks, this.mc.player);
- }
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.settings;
-
-import com.irtimaled.bbor.client.keyboard.KeyListener;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.settings.GameSettings;
-import net.minecraft.client.settings.KeyBinding;
-import org.apache.commons.lang3.ArrayUtils;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.io.File;
-
-@Mixin(GameSettings.class)
-public abstract class MixinGameSettings {
- @Shadow
- public KeyBinding[] keyBindings;
-
- @Shadow
- public abstract void loadOptions();
-
- @Inject(method = "<init>(Lnet/minecraft/client/Minecraft;Ljava/io/File;)V", at = @At("RETURN"))
- private void init(Minecraft minecraft, File file, CallbackInfo ci) {
- keyBindings = ArrayUtils.addAll(keyBindings, KeyListener.keyBindings());
- this.loadOptions();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.client.settings;
-
-import com.irtimaled.bbor.client.ClientProxy;
-import net.minecraft.client.settings.KeyBinding;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-import java.util.Map;
-
-@Mixin(KeyBinding.class)
-public class MixinKeyBinding {
- @Final
- @Shadow
- private static Map<String, Integer> CATEGORY_ORDER;
-
- static {
- CATEGORY_ORDER.put(ClientProxy.Name, 0);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.network.play.client;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import com.irtimaled.bbor.common.messages.SubscribeToServer;
-import net.minecraft.network.NetHandlerPlayServer;
-import net.minecraft.network.play.INetHandlerPlayServer;
-import net.minecraft.network.play.client.CPacketCustomPayload;
-import net.minecraft.util.ResourceLocation;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-@Mixin(CPacketCustomPayload.class)
-public class MixinCPacketCustomPayload {
- @Shadow
- private String channel;
-
- @Redirect(method = "processPacket", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/play/INetHandlerPlayServer;processCustomPayload(Lnet/minecraft/network/play/client/CPacketCustomPayload;)V"))
- private void processPacket(INetHandlerPlayServer netHandlerPlayServer, CPacketCustomPayload packet) {
- if (this.channel.equals(SubscribeToServer.NAME)) {
- CommonInterop.playerSubscribed(((NetHandlerPlayServer) netHandlerPlayServer).player);
- } else {
- netHandlerPlayServer.processCustomPayload(packet);
- }
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.network.play.server;
-
-import com.irtimaled.bbor.common.EventBus;
-import com.irtimaled.bbor.common.messages.*;
-import net.minecraft.client.network.NetHandlerPlayClient;
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.network.play.INetHandlerPlayClient;
-import net.minecraft.network.play.server.SPacketCustomPayload;
-import net.minecraft.util.ResourceLocation;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-@Mixin(SPacketCustomPayload.class)
-public abstract class MixinSPacketCustomPayload {
- @Shadow
- private String channel;
-
- @Redirect(method = "processPacket", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/play/INetHandlerPlayClient;handleCustomPayload(Lnet/minecraft/network/play/server/SPacketCustomPayload;)V"))
- private void processPacket(INetHandlerPlayClient netHandlerPlayClient, SPacketCustomPayload packet) {
- if (this.channel.startsWith("bbor:")) {
- PacketBuffer data = null;
- try {
- data = packet.getBufferData();
- PayloadReader reader = new PayloadReader(data);
- switch (this.channel) {
- case InitializeClient.NAME: {
- EventBus.publish(InitializeClient.getEvent(reader));
- ((NetHandlerPlayClient) netHandlerPlayClient).sendPacket(SubscribeToServer.getPayload().build());
- break;
- }
- case AddBoundingBox.NAME: {
- EventBus.publish(AddBoundingBox.getEvent(reader));
- break;
- }
- case RemoveBoundingBox.NAME: {
- EventBus.publish(RemoveBoundingBox.getEvent(reader));
- break;
- }
- }
- } finally {
- if (data != null)
- data.release();
- }
- } else {
- netHandlerPlayClient.handleCustomPayload(packet);
- }
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.network.play.server;
-
-import com.irtimaled.bbor.client.interop.ClientInterop;
-import net.minecraft.network.play.server.SPacketSpawnPosition;
-import net.minecraft.util.math.BlockPos;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(SPacketSpawnPosition.class)
-public abstract class MixinSPacketSpawnPosition {
- @Shadow
- private BlockPos spawnBlockPos;
-
- @Inject(method = "processPacket", at = @At("RETURN"))
- private void afterProcessPacket(CallbackInfo ci) {
- ClientInterop.updateWorldSpawnReceived(spawnBlockPos);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.server;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.world.WorldServer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftServer.class)
-public class MixinMinecraftServer {
- @Shadow
- public WorldServer[] worlds;
-
- @Inject(method = "initialWorldChunkLoad", at = @At("HEAD"))
- private void initialWorldChunkLoad(CallbackInfo ci) {
- CommonInterop.loadWorlds(worlds);
- }
-
- @Inject(method = "tick", at = @At("RETURN"))
- private void tick(CallbackInfo ci) {
- CommonInterop.tick();
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.server.management;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.block.Block;
-import net.minecraft.server.management.PlayerInteractionManager;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.World;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-@Mixin(PlayerInteractionManager.class)
-public class MixinPlayerInteractionManager {
- @Shadow
- public World world;
-
- @Inject(method = "tryHarvestBlock", at = @At("HEAD"))
- private void tryHarvestBlock(BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
- Block block = this.world.getBlockState(pos).getBlock();
- CommonInterop.tryHarvestBlock(block, pos, world);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.server.management;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.server.management.PlayerList;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(PlayerList.class)
-public class MixinPlayerList {
- @Inject(method = "playerLoggedIn", at = @At("RETURN"))
- private void playerLoggedIn(EntityPlayerMP player, CallbackInfo ci) {
- CommonInterop.playerLoggedIn(player);
- }
-
- @Inject(method = "playerLoggedOut", at = @At("HEAD"))
- private void playerLoggedOut(EntityPlayerMP player, CallbackInfo ci) {
- CommonInterop.playerLoggedOut(player);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.world;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.world.WorldServer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(WorldServer.class)
-public class MixinWorldServer {
- @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/village/VillageCollection;tick()V", shift = At.Shift.AFTER))
- private void afterVillageTick(CallbackInfo ci) {
- CommonInterop.worldTick((WorldServer) (Object) this);
- }
-}
+++ /dev/null
-package com.irtimaled.bbor.mixin.world.chunk;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.world.chunk.Chunk;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(Chunk.class)
-public class MixinChunk {
- @Inject(method = "onLoad", at = @At("RETURN"))
- private void onLoad(CallbackInfo ci) {
- CommonInterop.chunkLoaded((Chunk) (Object) this);
- }
-}
--- /dev/null
+[
+ {
+ "modid": "bbor",
+ "name": "BoundingBoxOutlineReloaded",
+ "description": "Shows the bounding boxes of structures and features.",
+ "version": "${version}",
+ "mcversion": "${mcVersion}",
+ "url": "https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/2345401",
+ "updateUrl": "",
+ "authorList": [
+ "irtimaled"
+ ],
+ "credits": "Thanks to 4poc & KaboPC.",
+ "logoFile": "",
+ "screenshots": [],
+ "dependencies": []
+ }
+]
+++ /dev/null
-{
- "required": true,
- "minVersion": "0.7.11",
- "compatibilityLevel": "JAVA_8",
- "target": "@env(DEFAULT)",
- "package": "com.irtimaled.bbor.mixin",
- "refmap": "mixins.bbor.refmap.json",
- "mixins": [
- "network.play.client.MixinCPacketCustomPayload",
- "server.MixinMinecraftServer",
- "server.management.MixinPlayerInteractionManager",
- "server.management.MixinPlayerList",
- "world.MixinWorldServer",
- "world.chunk.MixinChunk"
- ],
- "client": [
- "client.MixinMinecraft",
- "client.entity.MixinEntityPlayerSP",
- "client.gui.MixinGuiOptions",
- "client.multiplayer.MixinWorldClient",
- "client.network.MixinNetHandlerLoginClient",
- "client.network.MixinNetHandlerPlayClient",
- "client.renderer.MixinEntityRenderer",
- "client.settings.MixinGameSettings",
- "client.settings.MixinKeyBinding",
- "network.play.server.MixinSPacketCustomPayload",
- "network.play.server.MixinSPacketSpawnPosition"
- ]
-}
+++ /dev/null
-{
- "inheritsFrom": "${mcVersion}",
- "id": "BBOR-${version}",
- "jar": "${mcVersion}",
- "time": "${formattedTime}",
- "type": "release",
- "arguments": {
- "game": [
- "--tweakClass",
- "${tweakClass}"
- ]
- },
- "mainClass": "net.minecraft.launchwrapper.Launch",
- "libraries": [
- {
- "name": "com.irtimaled:bbor:${version}",
- "url": "https://github.com/irtimaled/maven/releases/download/"
- },
- {
- "name": "org.spongepowered:mixin:0.7.11-SNAPSHOT",
- "url": "https://github.com/irtimaled/maven/releases/download/"
- },
- {
- "name": "org.ow2.asm:asm:6.2",
- "url": "http://repo1.maven.org/maven2/"
- },
- {
- "name": "org.ow2.asm:asm-commons:6.2",
- "url": "http://repo1.maven.org/maven2/"
- },
- {
- "name": "net.minecraft:launchwrapper:1.12"
- }
- ]
-}
\ No newline at end of file