Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

javaarchive/rpeng2007

Members
  • Joined

  • Last visited

  1. Thanks for that. It was very helpful. Can this event fire when other players break a block, just curious.
  2. That's annoying, any way to log when I break/place a block on the client without putting stuff on the server?
  3. Thanks for explaining this. This is my third attempt to make an minecraft mod, so I tend to not be able to find the best way to do things. Which event can I listen for on the client side, so I know when some player breaks/places a block that I can see?
  4. Not sure by what you mean by that, could you elaborate a bit more. The mod is meant to be run on client side only. I only found this by accident when I was looking for where somebody was obtaining their mc variable from. If this is not the right way to do it, please tell me the correct way. I think the only thing I'm using it for is to get the current player's username.
  5. I'd like to join. Pretty much all I do in my other server I play in is afk. My discord is smashmaster#0045. Also is there claimming in the server or is it pretty much everyone trusts each other. I might not be active until after next saturday since I need to afk for rockets this week.
  6. This is my first forum post so I aplogize if I do anything wrong or assume this is markdown somewhere since I'm used to it. I'm building a mod to detect block changes, when people start raids, ...etc to prevent griefing while you afk. Here is my code package io.github.javaarchive.logitmod; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nullable; import javax.imageio.ImageIO; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.main.Main; import net.minecraft.client.renderer.texture.NativeImage; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.ScreenShotHelper; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.Style; import net.minecraft.util.text.TextComponent; import net.minecraft.world.World; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.ForgeConfig.Client; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.TextComponentMessageFormatHandler; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; // The value here should match an entry in the META-INF/mods.toml file @Mod("logit") @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.FORGE) public class LogitMod { // Directly reference a log4j logger. private static final Logger LOGGER = LogManager.getLogger(); public boolean DONOTDOUBLEEVENT = true; PrintWriter pw; public String EVIDENCE_DIR = "evidence"; public LogitMod() { // Register the setup method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); // Register the enqueueIMC method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC); // Register the processIMC method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC); // Register the doClientStuff method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } public String getFormattedTime() { SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss"); Date date = new Date(); return formatter.format(date); } private void setup(final FMLCommonSetupEvent event) { // some preinit code LOGGER.info("HELLO FROM PREINIT"); try { pw = new PrintWriter(new BufferedWriter(new FileWriter("log-"+this.getFormattedTime()+".txt"))); File evidenceDir = new File(EVIDENCE_DIR); if(!evidenceDir.isDirectory()) { evidenceDir.mkdir(); } }catch(IOException ex) { ex.printStackTrace(); } Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { pw.close(); } }); LOGGER.info("The DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); } private void doClientStuff(final FMLClientSetupEvent event) { // do something that can only be done on the client LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings); } private void enqueueIMC(final InterModEnqueueEvent event) { // some example code to dispatch IMC to another mod InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";}); } private void processIMC(final InterModProcessEvent event) { // some example code to receive and process InterModComms from other mods LOGGER.info("Got IMC {}", event.getIMCStream(). map(m->m.getMessageSupplier().get()). collect(Collectors.toList())); } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(FMLServerStartingEvent event) { // do something when the server starts LOGGER.info("HELLO from server starting"); } public boolean isValuable(String name) { if(name.contains("diamond")) { return true; } return false; } @SubscribeEvent public void ItemTossEvent(net.minecraftforge.event.entity.item.ItemTossEvent event) { //System.out.println("Item picked up!"); if(isValuable(event.getEntityItem().getName().getString().toLowerCase())){ Minecraft mc = Minecraft.getInstance(); ITextComponent tc = new StringTextComponent("You have dropped a valuable item. It's name is "+event.getEntityItem().getName().getString()+" and it is waiting for you at "+Math.floor(event.getEntityItem().getPosX())+", "+Math.floor(event.getEntityItem().getPosY())+", "+Math.floor(event.getEntityItem().getPosZ())); mc.player.sendMessage(tc); //mc.getConnection() //ScreenshotHelper. /* ScreenShotHelper.saveScreenshot(new File(EVIDENCE_DIR+"/"+getFormattedTime()+".jpg"), mc.currentScreen.width, mc.currentScreen.height, mc.getFramebuffer(), new Consumer<ITextComponent>() { @Override public void accept(ITextComponent arg0) { // TODO Auto-generated method stub }}); */ /*try { //screenshot.write(new File(EVIDENCE_DIR+"/"+getFormattedTime()+".jpg")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ pw.println("ALERT: You dropped a "+event.getEntityItem().getName().getString()); } pw.println("You dropped a "+event.getEntityItem().getName().getString()+" at "+Math.floor(event.getEntityItem().getPosX())+", "+Math.floor(event.getEntityItem().getPosY())+", "+Math.floor(event.getEntityItem().getPosZ())); } // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { if(player.getName().getString().equals(Minecraft.getInstance().player.getName().getString()) && DONOTDOUBLEEVENT) { return; // We have our own handler for this } Block block = state.getBlock(); pw.println("The player "+player.getName().getString()+" broke(harvested) a "+block.getNameTextComponent().getString()+" block at "+pos.getX()+", "+pos.getY()+", "+pos.getZ()); } public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { if(placer.getName().getString().equals(Minecraft.getInstance().player.getName().getString()) && DONOTDOUBLEEVENT) { return; // We have our own handler for this } pw.println(placer.getName()+" placed a "+state.getBlock().getNameTextComponent().getString()+" block at "+" at "+pos.getX()+", "+pos.getY()+", "+pos.getZ()); } public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { pw.println("Block activated by "+player.getName().getString()+" at "+pos.getX()+", "+pos.getY()+", "+pos.getZ()); if(worldIn.isRemote) { return true; }else { return false; } } public void onBlockClicked(BlockState state, World worldIn, BlockPos pos, PlayerEntity player) { if(player.getName().getString().equals(Minecraft.getInstance().player.getName().getString()) && DONOTDOUBLEEVENT) { return; // We have our own handler for this } Block block = state.getBlock(); pw.println("The player "+player.getName().getString()+" left-clicked a "+block.getNameTextComponent().getString()+" block at "+pos.getX()+", "+pos.getY()+", "+pos.getZ()); } @SubscribeEvent public void GuiOpenEvent(GuiScreenEvent gui) { //gui.getClass() pw.flush(); } @SubscribeEvent public void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { pw.println("You placed a "+event.getPlacedBlock().getBlock().getNameTextComponent().getString()+" at "+event.getPos().getX()+", "+event.getPos().getY()+", "+event.getPos().getZ()); } @SubscribeEvent public void onBreakBlock(BreakEvent event) { PlayerEntity player = event.getPlayer(); BlockPos pos = event.getPos(); Block block = event.getState().getBlock(); if(player.getName().getString().equals(Minecraft.getInstance().player.getName().getString()) && DONOTDOUBLEEVENT) { //return; // We have our own handler for this } pw.println("The player "+player.getName().getString()+" left-clicked a "+block.getNameTextComponent().getString()+" block at "+pos.getX()+", "+pos.getY()+", "+pos.getZ()); } @SubscribeEvent public void onBlockBreakEvent(BlockEvent.BreakEvent event) { // Check if a spawner broke if(event.getState().getBlock() == Blocks.SPAWNER) { pw.println("ALERT: YOU BROKE A SPAWNER"); } pw.println("Broke the block "+event.getState().getBlock().getNameTextComponent().getString()+" at "+event.getPos().getX()+", "+event.getPos().getY()+", "+event.getPos().getZ()); } @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); } } } This works when I play in a singleplayer world however when I build it, and copy it into a standard forge minecraft 1.15.2 client and run it none of the events are triggered. The log file is created but is empty. I know it's probaly a bad idea to flush the file when the inventory opens but that's just temporary testing. Second question: Since I'm not able to test yet but does my code detect other players breaking/placing blocks. If so how can I make it detect those events?

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.