Jump to content

[1.15.2-31.1.0] Intellij and Gradlew Forge Hotswap and DCEVM Tutorial


Recommended Posts

This is a small guide for people how want to Speed up their development by swapping changed code during run time, which eliminates the need to constantly restart the Minecraft-Client.

 

To reach our goal we need to install Hotswap and DCEVM.

 

To install DCEVM you first need to download the newest release for java 8 form this link:

https://github.com/dcevm/dcevm/releases

 

Before you continue installing DCEVM you need to first install the right java version that matches your download. Most likely this will be the version 1.8.0_181.

The download list can be found here:

https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

 

To now install DCEVM run java -jar "path_to_the_installer/DCEVM-8u181-installer.jar" as Administrator in your console.

 

In the UI that pops up you need to select the java version you just installed and click on Install DCEVM as altjvm. You probably need to do this for the jdk and jre.

 

Next download the hotswap-agent and place the jar file in an appropriate folder.

https://github.com/HotswapProjects/HotswapAgent/releases

 

 

Now the Basic setup is finished, our next step is too setup Intellij and gradle two run correctly.

 

First thing you need to do is to install the HotswapAgent plugin for Intellij.

Plugins can be install under: Settings -> Plugins -> Marketplace

Search for hotswapagent.

 

Now under Tools -> HotswapAgent select Enable HotswapAgent in all configurations

 

Under Keymap search for "Reload Changed Classes" and assign a Keyboard shortcut.

 

Now press double shift and search for "Registry..."

and enable compiler.automake.allow.when.app.running

 

Finally to run the Minecraft client create a new gradle configuration 

with task = "runClient"

and VM options = "-Xmx3G
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5010
-XXaltjvm=dcevm
-XX:+UnlockExperimentalVMOptions
-javaagent:path_to_your\hotswap-agent-1.4.0.jar"

 

Now your good to go.

If you have any questions or suggestions feel free to comment below this is my first tutorial so 

if you have any advise it would be more than welocome.

I hope this is helpful for you have a nice Day.

 

 

  • Thanks 3
Link to comment
Share on other sites

  • 4 weeks later...

Thanks for the how-to. Took a while to get it working even when reading this. I don't know if I would have had the patience to figure it out without it. XD Just a few notes.

 

1. You need to press 'Ok' on Intellij to apply changes to plugins. I definitely didn't spend 20 minutes trying to figure this out.

2. The vm option doesn't seem to be needed. The hot swap plugin didn't seem needed either. Was able to hotswap without both, but DCEVM needs to be installed.

3. Under Build the 'Build Project' and 'Recompile' option (and their shortcuts) works just fine, so no need to remap keys.

4. Everything other than installing DCEVM is unnecessary.

Link to comment
Share on other sites

Hey TheZombie1999, thanks for the guide but I'm really new to modding and I've just setup my development environment yesterday for the first time and I really need to be able to hotswap, it's really slowing me down to restart minecraft over and over again..

 

But I couldn't work this out, then I saw ZDoctor's comment then start over from scratch, removed everything I've installed and just installed DCVEM for java jdk 1.8.0_181 and jre 1.8.0_181. It is now installed but what's next? I should have to do something in order hotswap to work right? Something is missing and I don't know what to do. Even if It's correct I don't know how to hotswap either, I mean when I run the client if I make any changes how can I hotswap? Nothing happens when I click rebuild.

 

Sorry if this is a very dumb question but as I've said I'm pretty new to these things.

 

I've attached my runClient config.

 

Screenshot_14.png

Link to comment
Share on other sites

  • 1 month later...
On 4/22/2020 at 12:55 PM, RepubliCity said:

Hey TheZombie1999, thanks for the guide but I'm really new to modding and I've just setup my development environment yesterday for the first time and I really need to be able to hotswap, it's really slowing me down to restart minecraft over and over again..

 

But I couldn't work this out, then I saw ZDoctor's comment then start over from scratch, removed everything I've installed and just installed DCVEM for java jdk 1.8.0_181 and jre 1.8.0_181. It is now installed but what's next? I should have to do something in order hotswap to work right? Something is missing and I don't know what to do. Even if It's correct I don't know how to hotswap either, I mean when I run the client if I make any changes how can I hotswap? Nothing happens when I click rebuild.

 

Sorry if this is a very dumb question but as I've said I'm pretty new to these things.

 

I've attached my runClient config.

 

Screenshot_14.png

 

same nothing happened :(

Link to comment
Share on other sites

  • 2 weeks later...

Hi, I'm current dcevm8/11 maintainer and my son is keen Minecraft player. Is the java8 edition still relevant for Minecraft developers? I can port G1 garbage collector with some hotswap performance optimizations from java11(dcevm11) to java8(dcevm8), if the community is interested in.

 

Btw, current dcevm11 is at https://github.com/TravaOpenJDK/trava-jdk-11-dcevm , optimized with another new features at https://github.com/TravaOpenJDK/trava-jdk-11-dcevm-staged

Link to comment
Share on other sites

  • 4 weeks later...
On 6/26/2020 at 4:07 PM, skybber said:

Hi, I'm current dcevm8/11 maintainer and my son is keen Minecraft player. Is the java8 edition still relevant for Minecraft developers? I can port G1 garbage collector with some hotswap performance optimizations from java11(dcevm11) to java8(dcevm8), if the community is interested in.

 

Btw, current dcevm11 is at https://github.com/TravaOpenJDK/trava-jdk-11-dcevm , optimized with another new features at https://github.com/TravaOpenJDK/trava-jdk-11-dcevm-staged

It's definitely still relevant for Minecraft mod development. I don't think Minecraft Forge officially supports anything newer than Java 8 yet.

Edited by EmberQuill
Link to comment
Share on other sites

  • 2 months later...
On 4/22/2020 at 6:55 AM, RepubliCity said:

I mean when I run the client if I make any changes how can I hotswap? Nothing happens when I click rebuild.

Same thing for me... I've tried with both the hotswap plugin and without, and no changes occur. I've verified everything is setup correctly. Also not sure of the difference between "Recompile" under Build, and "Reload Changed Classes" under debug actions (I assume it makes no difference in debug mode?). Or if only certain changes are detected during runtime. 

Link to comment
Share on other sites

  • 3 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • ROTER88 : Waspada Situs Scam dengan Withdraw Tidak Dibayar Di era digital saat ini, banyak orang yang mencari keberuntungan melalui situs perjudian online. Namun, dibalik gemerlap janji-janji manis kemenangan, ada bahaya yang mengintai. Salah satu situs yang patut diwaspadai adalah ROTER88. Situs ini mendapat reputasi buruk karena banyak laporan dari pengguna yang mengklaim bahwa mereka tidak bisa menarik dana kemenangan mereka. Dalam artikel ini, kita akan membahas mengapa ROTER88 dianggap sebagai situs scam dan bagaimana Anda bisa melindungi diri dari penipuan serupa. Pengalaman Pengguna: Penarikan Tidak Dibayar Beberapa pengguna telah melaporkan pengalaman buruk mereka dengan ROTER88. Mereka mengaku bahwa setelah memenangkan sejumlah uang dan mencoba menariknya, proses penarikan mereka ditolak tanpa alasan yang jelas. Bahkan, beberapa pengguna melaporkan bahwa akun mereka tiba-tiba diblokir setelah mencoba melakukan penarikan, sehingga mereka kehilangan akses ke dana mereka sama sekali.
    • Hello! Im trying to get biome on player's position, if the player is in desert biome the variable "temperature" should increase but it doesn't. am i missing something? package net.mcreator.drowningbelow.procedures; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.event.TickEvent; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.mcreator.drowningbelow.network.DrowningbelowModVariables; import javax.annotation.Nullable; import net.minecraft.world.level.LevelAccessor; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.biome.Biome; import java.io.Console; @Mod.EventBusSubscriber public class TemperaturaProcedure { private static final int TICKS_INTERVAL = 60; // 60 ticks = 3 segundos private static int tickCounter = 0; private static final int TICK_BIOME_INTERVAL = 60; private static int tickBiomeCounter = 0; @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == TickEvent.Phase.END) { tickCounter++; tickBiomeCounter++; if (tickCounter >= TICKS_INTERVAL) { tickCounter = 0; checkAndUpdateTemperature(event.player); } if (tickBiomeCounter >= TICK_BIOME_INTERVAL) { tickBiomeCounter = 0; execute(event, event.player.level(), event.player); } displayTemperature(event.player); } } private static void checkAndUpdateTemperature(Entity entity) { if (entity == null) return; if (entity.isInWaterRainOrBubble()) { double newTemperature = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null) .orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura - 2; entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { capability.Temperatura = newTemperature; capability.syncPlayerVariables(entity); }); } } private static void displayTemperature(Entity entity) { if (entity == null) return; if (entity instanceof Player _player && !_player.level().isClientSide()) { double temperatura = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null) .orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura; _player.displayClientMessage(Component.literal("\u00A76\u00A7l\u2600\u00A7e\u00A7l Temperatura \u00A76\u00A7l\u2600 \u00A7e\u00A7l" + temperatura + "\u00B0"), true); } } private static void execute(@Nullable Event event, LevelAccessor world, Entity entity) { System.out.println("Esto si se mando 2"); if (world.getBiome(BlockPos.containing(entity.getX(), entity.getY(), entity.getX())).is(new ResourceLocation("desert"))) { System.out.println("Esto si se mando 3"); double _setval = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura + 2; entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { capability.Temperatura = _setval; capability.syncPlayerVariables(entity); }); System.out.println("Esto si se mando 4"); } } }  
    • Also, before he disconnects this appears on the log:  [18:07:30] [Render thread/WARN]: Failed to get file path of mod fastpaintings: / 2648[18:07:30] [Render thread/WARN]: Failed to get file path of mod moonlight: / 2649[18:07:30] [Render thread/WARN]: Failed to get file path of mod dummmmmmy: / 2650[18:07:30] [Render thread/WARN]: Failed to get file path of mod amendments: / 2651[18:07:30] [Render thread/WARN]: Failed to get file path of mod supplementaries: / Does this have anything to do with the error?
    • Then it is an issue or conflict with ad_astra_giselle_addon and modmenu Invalid mod icon for icon source ad_astra_giselle_addon: icon.png java.nio.file.NoSuchFileException: /icon.png I have no idea how to fix it - maybe try other builds  
    • i have kinda simillar stuff with mods.toml. every time launching my modpack these logs are typinbg off: - fastpaintings 1.20-1.2.7 |-- apoli 1.20.1-2.9.0.8 \-- calio 1.20.1-1.11.0.5 - playeranimator 1.0.2-rc1+1.20 - puzzleslib 8.1.20 - quad 1.2.5 - ramcompat 0.1.3 - rare_ice 0.0NONE - reignitedhud 1.1.0 - relics 0.6.5.1 - repurposed_structures 7.1.15+1.20.1-forge - resourcefulconfig 2.1.2 - resourcefullib 2.1.25 - rotten_flesh_to_leather 2.0.0 - rrls 4.0.6.1+mc1.20.1-forge - saturn 0.1.3 - sereneseasons 9.0.0.46 - silverbirch 1.1.1 - smoothboot 0.0.4 - snowundertrees 1.4.4 - spelunkery 1.20.1-0.3.5 - strictly_origins 1 - terrablender 3.0.1.7 - terralith 2.5.1 - travelersbackpack 9.1.14 - treechop 0.18.8 - trulytreasures 1.20-3.0.0 - vtweaks 4.0.13.fix1 - walkers 4.5.1 - walljump 1.20.1-1.1.6-forge - wizards_reborn 1.20.1-0.1.4 - yungsapi 1.20-Forge-4.0.5 - yungsbridges 1.20-Forge-4.0.3 - yungsextras 1.20-Forge-4.0.3 - yungsmenutweaks 1.20.1-Forge-1.0.2 [16���.2024 20:42:56.008] [main/INFO] [BadOptimizations/]: Loading config from C:\Users\{COMPUTER_USERNAME}\AppData\Roaming\com.modrinth.theseus\profiles\ExoRodemIII\config\badoptimizations.txt [16���.2024 20:42:56.009] [main/INFO] [BadOptimizations/]: Config version: 3 [16���.2024 20:42:56.010] [main/INFO] [BadOptimizations/]: BadOptimizations config dump: [16���.2024 20:42:56.011] [main/INFO] [BadOptimizations/]: enable_toast_optimizations: true [16���.2024 20:42:56.012] [main/INFO] [BadOptimizations/]: ignore_mod_incompatibilities: false [16���.2024 20:42:56.013] [main/INFO] [BadOptimizations/]: lightmap_time_change_needed_for_update: 80 [16���.2024 20:42:56.013] [main/INFO] [BadOptimizations/]: enable_lightmap_caching: true [16���.2024 20:42:56.013] [main/INFO] [BadOptimizations/]: enable_particle_manager_optimization: true [16���.2024 20:42:56.013] [main/INFO] [BadOptimizations/]: enable_entity_renderer_caching: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: log_config: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_remove_redundant_fov_calculations: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: config_version: 3 [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_sky_angle_caching_in_worldrenderer: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_block_entity_renderer_caching: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: skycolor_time_change_needed_for_update: 3 [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_entity_flag_caching: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_debug_renderer_disable_if_not_needed: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_sky_color_caching: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: enable_remove_tutorial_if_not_demo: true [16���.2024 20:42:56.014] [main/INFO] [BadOptimizations/]: show_f3_text: true [16���.2024 20:42:57.417] [main/WARN] [mixin/]: Error loading class: dev/emi/emi/screen/EmiScreenManager (java.lang.ClassNotFoundException: dev.emi.emi.screen.EmiScreenManager) [16���.2024 20:42:57.422] [main/WARN] [mixin/]: Error loading class: me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl (java.lang.ClassNotFoundException: me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl) [16���.2024 20:42:58.657] [main/WARN] [mixin/]: Error loading class: vazkii/quark/base/module/ModuleFinder (java.lang.ClassNotFoundException: vazkii.quark.base.module.ModuleFinder) [16���.2024 20:42:58.942] [main/INFO] [fpsreducer/]: bre2el.fpsreducer.mixin.RenderSystemMixin will be applied. [16���.2024 20:42:58.943] [main/INFO] [fpsreducer/]: bre2el.fpsreducer.mixin.WindowMixin will be applied. [16���.2024 20:42:59.109] [main/WARN] [mixin/]: Error loading class: com/illusivesoulworks/colytra/client/ColytraLayer (java.lang.ClassNotFoundException: com.illusivesoulworks.colytra.client.ColytraLayer) [16���.2024 20:42:59.119] [main/WARN] [mixin/]: Error loading class: com/illusivesoulworks/elytraslot/client/ElytraSlotLayer (java.lang.ClassNotFoundException: com.illusivesoulworks.elytraslot.client.ElytraSlotLayer) [16���.2024 20:43:01.569] [main/INFO] [memoryleakfix/]: [MemoryLeakFix] Will be applying 3 memory leak fixes! [16���.2024 20:43:01.569] [main/INFO] [memoryleakfix/]: [MemoryLeakFix] Currently enabled memory leak fixes: [targetEntityLeak, biomeTemperatureLeak, hugeScreenshotLeak] [16���.2024 20:43:02.459] [main/INFO] [MixinExtras|Service/]: Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.3.6). [16���.2024 20:43:03.003] [main/WARN] [mixin/]: Injection warning: LVT in net/minecraft/client/gui/GuiGraphics::m_280497_(Lnet/minecraft/client/gui/Font;Ljava/util/List;IILnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;)V has incompatible changes at opcode 346 in callback relics.mixins.json:GuiGraphicsMixin->@Inject::onTooltipRender(Lnet/minecraft/client/gui/Font;Ljava/util/List;IILnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;Lnet/minecraftforge/client/event/RenderTooltipEvent$Pre;IIIILorg/joml/Vector2ic;)V. Expected: [Lnet/minecraftforge/client/event/RenderTooltipEvent$Pre;, I, I, I, I, Lorg/joml/Vector2ic;] Found: [Ljava/lang/Object;, I, I, I, I, Lorg/joml/Vector2ic;] Available: [Ljava/lang/Object;, I, I, I, I, Lorg/joml/Vector2ic;, I, I, I, Lnet/minecraft/client/gui/Font;, I, I, Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent;] [16���.2024 20:43:03.735] [main/INFO] [Smooth Boot (Reloaded)/]: Smooth Boot (Reloaded) config initialized [16���.2024 20:43:05.500] [main/WARN] [mixin/]: Static binding violation: PRIVATE @Overwrite method m_172993_ in embeddium.mixins.json:core.render.world.WorldRendererMixin cannot reduce visibiliy of PUBLIC target method, visibility will be upgraded. [16���.2024 20:43:05.500] [main/WARN] [mixin/]: Static binding violation: PRIVATE @Overwrite method m_109501_ in embeddium.mixins.json:core.render.world.WorldRendererMixin cannot reduce visibiliy of PUBLIC target method, visibility will be upgraded. [16���.2024 20:43:05.571] [main/WARN] [mixin/]: @Redirect conflict. Skipping forge-badoptimizations.mixins.json:MixinWorldRenderer->@Redirect::getSkyAngle(Lnet/minecraft/client/multiplayer/ClientLevel;F)F with priority 700, already redirected by citadel.mixins.json:client.LevelRendererMixin->@Redirect::citadel_getTimeOfDay(Lnet/minecraft/client/multiplayer/ClientLevel;F)F with priority 1000   i feel very stupid, but, can someone help me? i would really appreciatte that
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.