Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.4]Best practice to get Gametype in EventHandler


Recommended Posts

Hello,

coming from 1.7.2, and 1.12.2 I figured the "old" way of getting game type does no longer work. It took a while and a bit of searching to find an old 2019 thread, were @diesieben07 is giving instructions, that did not work out of the box, but finally did with a bit of fiddling. This is the code block in my event handler:

	    @SubscribeEvent
    public static void onBlockBreak(BlockEvent.BreakEvent event) {
	        //Entity playerRef = event.getPlayer();
        @SuppressWarnings("resource")
        GameType gameType = Minecraft.getInstance().playerController.getCurrentGameType();
        System.out.println(gameType);
    }  

It does work, but I'm concerned about the warning suppression Eclipse forced on me to fix the logic. If anyone has some input share if there is a different way, or can confirm that my way is valid as well, I'd appreciate it.

Link to post
Share on other sites
  • The warning is eclipse being stupid.
  • You are reaching across logical sides. You have to use ServerPlayerEntity#gameMode and then PlayerInteractionManager#getGameModeForPlayer to get the game mode.
Link to post
Share on other sites
1 hour ago, diesieben07 said:
  • The warning is eclipse being stupid.
  • You are reaching across logical sides. You have to use ServerPlayerEntity#gameMode and then PlayerInteractionManager#getGameModeForPlayer to get the game mode.

Sorry, I'm out of practice. It's hard for me to comprehend what you're saying. With "reaching across logical sides" you mean I'm utilizing server and client in one sentence?

Also, why gameMode? What's the difference to gameType?

I was actually referring to this thread, were you gave that example...

For the main client player: Minecraft#playerController.getCurrentGameType()

...to get the client side gameType. I want the client side.

Link to post
Share on other sites
4 minutes ago, Cratthorax said:

Sorry, I'm out of practice. It's hard for me to comprehend what you're saying. With "reaching across logical sides" you mean I'm utilizing server and client in one sentence?

Minecraft#getInstance -> is client side
and the BlockEvent$BreakEvent is only executed on the server

 

6 minutes ago, Cratthorax said:

Also, why gameMode? What's the difference to gameType?

GameType = GameMode

the player's game mode is saved in the PlayerInteractionManager.
if you need your gamemode of the player do something like this:
Note: this is only on server side, so you need to check if the Player you get, an instance of ServerPlayerEntity is

player.gameMode.getGameModeForPlayer();

 

Link to post
Share on other sites
10 minutes ago, Cratthorax said:

With "reaching across logical sides" you mean I'm utilizing server and client in one sentence?

Reaching across logical sides means: You are on the server thread (in single player) and "reaching over" into client territory. This "works" in SP because the server and client are just two threads running in the same JVM. But this will hard-crash on an actual server (because it has no idea what the Minecraft class even is) and it will cause hard to trace bugs in single player because the code is not designed for multi threaded access.

11 minutes ago, Cratthorax said:

Also, why gameMode? What's the difference to gameType?

Forge recently switched to Mojang names for methods and fields (class names still MCP, this will change with 1.17). Mojang calls it GameMode.

12 minutes ago, Cratthorax said:

I was actually referring to this thread, were you gave that example...

 


For the main client player: Minecraft#playerController.getCurrentGameType()

 

...to get the client side gameType. I want the client side.

BlockEvent.BreakEvent is a server side event, so you cannot do anything client side there.

Link to post
Share on other sites
Posted (edited)

Better?

	    @SubscribeEvent
    public static void onBlockBreak(BlockEvent.BreakEvent event) {
        
        PlayerEntity playerRef = event.getPlayer();        
        ServerPlayerEntity playerMain = (ServerPlayerEntity) playerRef;
        GameType gameMode = playerMain.interactionManager.getGameType();
	        //@SuppressWarnings("resource")
        //GameType gameType = Minecraft.getInstance().playerController.getCurrentGameType();
        ItemStack heldItems = event.getPlayer().getHeldItemMainhand();
        Item toolRef = heldItems.getItem();        
        if(!gameMode.isCreative()) {

            
        }
    } 
Edited by Cratthorax
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
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

    • 1.12 is no longer supported on this forum. Please update to a modern version of Minecraft to receive support.
    • In my code I'm trying to teleport the player to my custom dimension when they interact with an entity. It all works up until the teleporting part of the code. It always crashes the game when I interact with the entity. Thank you in advance! The code: @Override public ActionResultType applyPlayerInteraction(PlayerEntity player, Vec3d vec, Hand hand) { ItemStack stack = player.getHeldItem(hand); if (stack == ItemStack.EMPTY) { player.changeDimension(DimensionType.byName(MyMod.MINING_DIM_TYPE)); }else { player.sendMessage(new TranslationTextComponent("mymod.message.emptyHand")); } return ActionResultType.SUCCESS; }   public static final String MOD_ID = "mymod"; public static final ResourceLocation MINING_DIM_TYPE = new ResourceLocation(MOD_ID, "mining_dim");  
    • don't use this in separate classes, use the EventBusSubscriber annotation instead https://mcforge.readthedocs.io/en/latest/events/intro/#events
    • Im playing with MultiMC. I get to the "Loading world, Bulding Terrain..." screen and then it goes to minecraft dindn't respond. I've been at this for two hour now. I can't find any articles that deal with this error. I also have OptiFine installed, I tried deleting the options text file and restarting but still no luck. I dunno which information is important so I'll post the full log. ---- Minecraft Crash Report ---- WARNING: coremods are present:   LucraftCoreCoreMod (LucraftCore-1.12.2-2.4.16.jar)   MalisisCorePlugin (malisiscore-1.12.2-6.5.1.jar) Contact their authors BEFORE contacting forge // My bad. Time: 7/23/21 5:25 PM Description: Ticking player java.lang.NoSuchMethodError: lucraft.mods.lucraftcore.superpowers.abilities.Ability.getCurrentPlayerAbilities(Lnet/minecraft/entity/player/EntityPlayer;)Ljava/util/List;     at lucraft.mods.speedsterheroes.abilities.AbilityPhasing$EventHandler.onLivingUpdate(AbilityPhasing.java:82)     at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_54_EventHandler_onLivingUpdate_LivingUpdateEvent.invoke(.dynamic)     at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)     at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)     at net.minecraftforge.common.ForgeHooks.onLivingUpdate(ForgeHooks.java:581)     at net.minecraft.entity.EntityLivingBase.func_70071_h_(EntityLivingBase.java:2095)     at net.minecraft.entity.player.EntityPlayer.func_70071_h_(EntityPlayer.java:234)     at net.minecraft.entity.player.EntityPlayerMP.func_71127_g(EntityPlayerMP.java:382)     at net.minecraft.network.NetHandlerPlayServer.func_73660_a(NetHandlerPlayServer.java:173)     at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher$1.func_73660_a(NetworkDispatcher.java:209)     at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:285)     at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:180)     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:790)     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668)     at net.minecraft.server.integrated.IntegratedServer.func_71217_p(IntegratedServer.java:279)     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)     at java.lang.Thread.run(Unknown Source) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace:     at lucraft.mods.speedsterheroes.abilities.AbilityPhasing$EventHandler.onLivingUpdate(AbilityPhasing.java:82)     at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_54_EventHandler_onLivingUpdate_LivingUpdateEvent.invoke(.dynamic)     at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)     at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)     at net.minecraftforge.common.ForgeHooks.onLivingUpdate(ForgeHooks.java:581)     at net.minecraft.entity.EntityLivingBase.func_70071_h_(EntityLivingBase.java:2095)     at net.minecraft.entity.player.EntityPlayer.func_70071_h_(EntityPlayer.java:234) -- Player being ticked -- Details:     Entity Type: null (net.minecraft.entity.player.EntityPlayerMP)     Entity ID: 1844     Entity Name: RedcreeperYT_     Entity's Exact location: 453.50, 4.00, 91.50     Entity's Block location: World: (453,4,91), Chunk: (at 5,0,11 in 28,5; contains blocks 448,0,80 to 463,255,95), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)     Entity's Momentum: 0.00, 0.00, 0.00     Entity's Passengers: []     Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace:     at net.minecraft.entity.player.EntityPlayerMP.func_71127_g(EntityPlayerMP.java:382)     at net.minecraft.network.NetHandlerPlayServer.func_73660_a(NetHandlerPlayServer.java:173)     at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher$1.func_73660_a(NetworkDispatcher.java:209)     at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:285) -- Ticking connection -- Details:     Connection: net.minecraft.network.NetworkManager@29c7e996 Stacktrace:     at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:180)     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:790)     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668)     at net.minecraft.server.integrated.IntegratedServer.func_71217_p(IntegratedServer.java:279)     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)     at java.lang.Thread.run(Unknown Source) -- System Details -- Details:     Minecraft Version: 1.12.2     Operating System: Windows 10 (amd64) version 10.0     Java Version: 1.8.0_291, Oracle Corporation     Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation     Memory: 1306579696 bytes (1246 MB) / 2693267456 bytes (2568 MB) up to 3817865216 bytes (3641 MB)     JVM Flags: 3 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xms512m -Xmx4096m     IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0     FML: MCP 9.42 Powered by Forge 14.23.5.2855 Optifine OptiFine_1.12.2_HD_U_G6_pre1 19 mods loaded, 19 mods active     States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored     | State  | ID              | Version               | Source                                   | Signature                                |     |:------ |:--------------- |:--------------------- |:---------------------------------------- |:---------------------------------------- |     | LCHIJA | minecraft       | 1.12.2                | minecraft.jar                            | None                                     |     | LCHIJA | mcp             | 9.42                  | minecraft.jar                            | None                                     |     | LCHIJA | FML             | 8.0.99.99             | forge-1.12.2-14.23.5.2855-universal.jar  | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | forge           | 14.23.5.2855          | forge-1.12.2-14.23.5.2855-universal.jar  | e3c3d50c7c986df74c645c0ac54639741c90a557 |     | LCHIJA | securitycraft   | v1.8.22.2             | [1.12.2]+SecurityCraft+v1.8.22.2.jar     | None                                     |     | LCHIJA | customspawner   | 3.11.4                | Custom-Mob-Spawner-Mod-1.12.2.jar        | None                                     |     | LCHIJA | ptrmodellib     | 1.0.4                 | PTRLib-1.0.4.jar                         | None                                     |     | LCHIJA | props           | 2.6.3                 | Decocraft-2.6.3_1.12.2.jar               | None                                     |     | LCHIJA | jei             | 4.16.1.302            | jei_1.12.2-4.16.1.302.jar                | None                                     |     | LCHIJA | speedsterheroes | 1.12.2-2.0.7          | Quicksilver-Mod-1.12.2.jar               | None                                     |     | LCHIJA | lucraftcore     | 1.12.2-2.4.16         | LucraftCore-1.12.2-2.4.16.jar            | None                                     |     | LCHIJA | malisiscore     | 1.12.2-6.5.1-SNAPSHOT | malisiscore-1.12.2-6.5.1.jar             | None                                     |     | LCHIJA | malisisdoors    | 1.12.2-7.3.0          | malisisdoors-1.12.2-7.3.0.jar            | None                                     |     | LCHIJA | mocreatures     | 12.0.5                | Mo-Creatures-Mod-1.12.2.jar              | None                                     |     | LCHIJA | movingelevators | 1.2.34                | movingelevators-1.2.34-mc1.12.jar        | None                                     |     | LCHIJA | scp             | 2.4.0                 | SCP_Lockdown-1.12.2-2.4.0-hotfix.jar     | None                                     |     | LCHIJA | scple           | 1.0                   | scple-1.0.jar                            | None                                     |     | LCHIJA | thejungle       | 1.2006.1222           | Welcome-to-the-Jungle-Mod-1.12.2.jar     | None                                     |     | LCHIJA | worldedit       | 6.1.10                | worldedit-forge-mc1.12.2-6.1.10-dist.jar | None                                     |     Loaded coremods (and transformers):  LucraftCoreCoreMod (LucraftCore-1.12.2-2.4.16.jar)   lucraft.mods.lucraftcore.core.LCTransformer MalisisCorePlugin (malisiscore-1.12.2-6.5.1.jar)        GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.     Profiler Position: N/A (disabled)     Player Count: 1 / 8; [EntityPlayerMP['RedcreeperYT_'/1844, l='New World', x=453.50, y=4.00, z=91.50]]     Type: Integrated Server (map_client.txt)     Is Modded: Definitely; Client brand changed to 'fml,forge'     OptiFine Version: OptiFine_1.12.2_HD_U_G6_pre1     OptiFine Build: 20210323-161358     Render Distance Chunks: 8     Mipmaps: 4     Anisotropic Filtering: 1     Antialiasing: 0     Multitexture: false     Shaders: null     OpenGlVersion: 4.6.0 NVIDIA 466.27     OpenGlRenderer: NVIDIA GeForce GTX 1650 SUPER/PCIe/SSE2     OpenGlVendor: NVIDIA Corporation     CpuCount: 4
    • Goal: when Entity attacks player, it dies. Code: public class EventHandler { @SubscribeEvent public static void onLivingAttackEvent(LivingAttackEvent event) { if (event.getEntityLiving().getItemStackFromSlot(EquipmentSlotType.HEAD).getItem() == ItemInit.LAVA_HELMET.get() && event.getEntityLiving().getItemStackFromSlot(EquipmentSlotType.CHEST).getItem() == ItemInit.LAVA_CHEST.get() && event.getEntityLiving().getItemStackFromSlot(EquipmentSlotType.LEGS).getItem() == ItemInit.LAVA_LEGGINGS.get() && event.getEntityLiving().getItemStackFromSlot(EquipmentSlotType.FEET).getItem() == ItemInit.LAVA_BOOTS.get()) { if (event.getSource().getTrueSource().getEntity() instanceof MobEntity) { event.getSource().getTrueSource().getEntity().onKillCommand(); } } } } And: @Mod(LavaArmor.MODID) public class LavaArmor { public static final String MODID = "lavaarmor"; public LavaArmor() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); bus.addListener(this::setup); ItemInit.ITEMS.register(bus); MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(EventHandler.class); } @SuppressWarnings("deprecation") private void setup(final FMLCommonSetupEvent event) { } } I think I've done everything I've needed. Moreover, the exact same code works fine in my another project. What's wrong?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.