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

[1.12.2][SOLVED!] Capabilities and networking


Recommended Posts

I do admit the isRemote thing was very dumb. I do return success tho. This is the end of the code (It's not the whole code):

 

if (axisalignedbb != Block.NULL_AABB && worldIn.checkNoEntityCollision(axisalignedbb.offset(blockpos))
     && worldIn.setBlockState(blockpos, iblockstate1, 10)) {
    SoundType soundtype = this.block.getSoundType(iblockstate1, worldIn, blockpos, player);
    worldIn.playSound(player, blockpos, soundtype.getPlaceSound(), SoundCategory.BLOCKS,
      (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
    if (player instanceof EntityPlayerMP) {
     CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, blockpos, itemstack);
    }
    itemstack.shrink(amount);
    return EnumActionResult.SUCCESS;
   }
 
EDIT:
printing out "PLACED" with my debugger prints this:
[16:27:31] [main/WARN] [ml]: PLACED
[16:27:31] [Server thread/WARN] [ml]: PLACED
 
Why aren't those two messages the same?
Edited by MCrafterzz
Link to post
Share on other sites

It works like snow layers so you can build apon the block. Also I added the ability to place a four layers at the same time when clicking + CTRL. It's just so wierd as it is based on ItemBlockSnow but randomly workes differently (triggers two times instead of one). Here's the full code:

https://pastebin.com/fys1Mb4G

Edited by MCrafterzz
Link to post
Share on other sites

I guess I'll have to look into that. The block setting methoud is the same as the vanilla itemblock tho so what do you mean with only place it on the server? Also I still don't understand the reasoning for it triggering twice as the canplayeredit methoud should prevent it.

 

Is there any easier way to detect the press of CTRL without using packets?

Edited by MCrafterzz
Link to post
Share on other sites

Seems vanilla's ItemBlock actually does the placement on the client as well, very strange. At this point I suspect it triggering twice is not actually the two hands but server and client. Did you check which thread is calling the method?

 

10 minutes ago, MCrafterzz said:

Is there any easier way to detect the press of CTRL without using packets?

No, the server has no idea about the client's keyboard. The server may be located on the other side of the globe, the only way to communicate with it is packets.

And nothing about packets is hard.

Link to post
Share on other sites
3 hours ago, MCrafterzz said:

Is there any easier way to detect the press of CTRL without using packets?

Isn't CTRL the key used to sneak?
Check if the player is sneaking.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to post
Share on other sites

You might be right. I haven't actually played in a while.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to post
Share on other sites
2 minutes ago, MCrafterzz said:

It still activates twice even tho I use worldIn.isRemote = false

If vanilla does not have the isRemote check, you do not need it either. It will active twice then, that is to be expected.

Please give more information about where these two activations are coming from (use the debugger): What hand? What logical side?

Link to post
Share on other sites

Changing stuff eventually got it to work so now I just have to get the packages setup. Here is what I have so far:

public class KeybindMessage implements IMessage {

	private boolean keybindDown;

	public KeybindMessage(boolean keybindDown) {
		this.keybindDown = keybindDown;
	}

	@Override
	public void fromBytes(ByteBuf buf) {
		buf.readBoolean();
	}

	@Override
	public void toBytes(ByteBuf buf) {
		buf.writeBoolean(keybindDown);
	}

}
public class KeybindMessageHandler implements IMessageHandler<KeybindMessage, IMessage> {

	@Override
	public IMessage onMessage(KeybindMessage message, MessageContext ctx) {
		return null;
	}

}

What should be in the onMessage methoud?

Main class (some stuff has been removed)

@Mod(modid = "ml", name = "More Layers", version = "1.1.0", acceptedMinecraftVersions = "1.12,1.12.1,1.12.2")
@EventBusSubscriber
public class Main {

	public static final SimpleNetworkWrapper networkInstance = NetworkRegistry.INSTANCE.newSimpleChannel("ml");

	@EventHandler
	public static void preInit(FMLPreInitializationEvent event) {
		networkInstance.registerMessage(KeybindMessageHandler.class, KeybindMessage.class, 0, Side.SERVER);
	}

}

I know that I should call Main.networkInstance.sendToServer but where should I call this and how should I get the result?

 

Link to post
Share on other sites
2 hours ago, MCrafterzz said:

Bump

No.

 

  • Your IMessage classes must have a public no-parameters constructor.
  • You need to remember on the server for each player whether they are currently pressing the button or not. You can do this using capabilities.
  • When the packet arrives, you store the current state in the player's capability.
  • In your ItemBlock you can then access the capability of the player placing the block.
  • "ml" is a terrible mod ID (and network channel). It should be "morelayers".
  • Thanks 1
Link to post
Share on other sites

I think I got it working but where should I call the capability to update it? Is there a key press event?:

KeybindInterface keybindInterface = event.getEntityPlayer().getCapability(KeybindProvider.capability, event.getFace());
  keybindInterface.setKeybindDown(Minecraft.getMinecraft().gameSettings.keyBindSprint.isKeyDown());

Edited by MCrafterzz
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

    • i currently try to find out how the world gen works, at the moment im working on a structure but i have some problems with the generation. i use this  as an example, i created everything for the generation, but the structure is not generating this is my structure this is the structure registry this is my world load event and this my biome loading event thanks for replies
    • I'm currently trying to make a new cauldron-type block, and I'm having difficulty implementing blockstates. Here's the relevant part of the alchemical cauldron's code:   public class AlchemicalCauldronBlock extends Block { public static final IntegerProperty LEVEL = IntegerProperty.create("level", 1, 3); private static final VoxelShape INSIDE = box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D); protected static final VoxelShape SHAPE = VoxelShapes.join(VoxelShapes.block(), VoxelShapes.or(box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D), box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D), box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D), INSIDE), IBooleanFunction.ONLY_FIRST); public AlchemicalCauldronBlock() { super(Properties.of(Material.METAL).sound(SoundType.METAL).harvestLevel(3).strength(2F,2F)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, 0)); // this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0))); } ... When I try to run this with either of the two attempts at registerDefaultState uncommented, I get this error: https://pastebin.com/vPf3UryC. For convenience, I believe this part is most relevant: How can I avoid this? My registry classes look like this, if it helps: public class registry { public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AlchemyPlus.MODID); public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AlchemyPlus.MODID); public static void register() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); registerItems.register(); registerBlocks.register(); } } public class registerBlocks { public static final RegistryObject<Block> ALCHEMICAL_CAULDRON = register("alchemical_cauldron", AlchemicalCauldronBlock::new); static void register() {} private static <T extends Block> RegistryObject<T> registerNoItem(String name, Supplier<T> block) { return registry.BLOCKS.register(name, block); } private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) { RegistryObject<T> ret = registerNoItem(name, block); registry.ITEMS.register(name, () -> new BlockItem(ret.get(), new Item.Properties().tab(ItemGroup.TAB_BREWING))); return ret; } } Full GitHub repository available here.   (Other minor problem(?):  I copied the methods getShape and getInteractionShape from net.minecraft.block.CauldronBlock and I'm getting these weird warnings. What's up with that? Do I need to worry about it?)  
    • Personally I use IForgeRegistryEntry#getRegistryName and then ResourceLocation#getNameSpace to get the id of the object.
    • you can get a block form a ResourceLocation, take a look at NBTUtil#readBlockState, do somthing like that
    • I am running forge version 1.16.5 36.1.31 on a server with a lot of mods and when a player refreshes the server list, it sends a long error in the server console. Additionally, the server list displays "Can't connect to server", despite refreshing and actually being able to connect to the server. here's the links to the logs: https://gist.github.com/WaffleTraits/83885b1539d5711fabff73a91924e665 https://gist.github.com/WaffleTraits/5ae78e6eaa330422bbc9f7226faf60ce Here's what's displayed in console when a player refreshes server listing: https://hastebin.com/ativexeyoy.properties server is running on ubuntu 20.04 and is using java 8 for this forge instance.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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