Jump to content

TheMCJavaFre4k

Members
  • Posts

    84
  • Joined

  • Last visited

Everything posted by TheMCJavaFre4k

  1. My repository if found here: https://bitbucket.org/TheMCJavaFre4k/mcdjmod/src/master/ Will probably swap to using a better ID system for my entities but just thought 0 would suffice for the single entity in testing.
  2. Ive now moved to EntityEntryBuilder for entity registration, but as expected, it has not changed the situation. The entity still doesn't have a bounding box or is rendered in any way but is being spawned. New Entity registration code: public static void registerEntity(RegistryEvent.Register<EntityEntry> reg){ EntityEntry entityScreen = EntityEntryBuilder.create().entity(EntityScreen.class).id(new ResourceLocation(MCDJMod.modId, "screenentity"), 0).name("screenentity").tracker(160, Integer.MAX_VALUE, true).build(); reg.getRegistry().register(entityScreen); } Any suggestions are appreciated.
  3. Hi There Ive been trying to create a identical painting item to default minecraft to later modify with custom rendering. Currently I've made a copy of the Entity, Render and Item classes and registered them(See below). With this code how it is, The entity seems to spawn as it has the behaviour of a minecraft painting, ie - breaks off the wall if a block behind is removed, but has no hitbox and is not rendered. I have tried finding information on this topic but since a custom painting item is such a niche thing to need, I haven't had much luck. Im hoping its just a registration problem and a simple fix. Any suggestions are welcome! EntityScreen: RenderScreen: ItemScreen: Renderer Registration in ClientProxy: RenderingRegistry.registerEntityRenderingHandler(EntityScreen.class, new RenderScreenFactory()); RenderScreenFactory: public class RenderScreenFactory implements IRenderFactory<EntityScreen> { @Override public Render<? super EntityScreen> createRenderFor(RenderManager manager) { return new RenderScreen(manager); } } Entity Registration called in PreInit: EntityRegistry.registerModEntity(new ResourceLocation("mcdj", "screenentity"), EntityScreen.class, "screenEntity", 0, MCDJMod.instance, 160, Integer.MAX_VALUE, false); If any more information is required, let me know.
  4. I totally forgot to check if I could use the sound to stop itself. I guess I just had tunnel vision when looking at the problem. Considering my custom sound is a tickable sound, this works flawlessly. Thanks heaps!
  5. Indeed, probably should have worded it with int so to not confuse it with the class.
  6. By counter, I believe DavidM is suggesting you use a type such as an Integer which is incremented by 1(int++) within update(). You would then have the if statement check the value of this Integer and if it reaches 5, set it back to 0.
  7. I haven't dealt with any Events thus far other than the standard registration ones so I wouldn't know where to begin. They current way I'm dealing with sounds is by using a custom MovingSound class(So to update positioning) being played by Minecraft.getMinecraft().getSoundHandler().playSound(). I can then stop it by passing in the exact same sound. This allows me to differentiate the exact same sound being played from 2 TileEntities and stop them independent of one another. Is this same functionality obtainable using a @SubscribeEvent and subscribing to the PlaySoundEvent class?
  8. My tile entity has a few methods responsible for stopping sound playback. The packet is used to update all nearby clients to stop any sound the TileEntity is making before it is removed. So in the packet handler I'm getting the TileEntity from the position sent over the packet and calling my methods on the client from there.
  9. Hi There Im wanting to prevent the tile entity of a block from being removed until after Ive executed some code within the tile entity via a custom packet. Im able to get this working in survival mode by sending the packet within the getDrops method and delaying removal until the harvestBlock method(Similar to blockFlowerPot) as so: Currently when broken in creative, nothing happens(Only breaking particles). I was initially using breakBlock but that didn't provide enough time for the packet to be read and when it was, the tile entity at the BlockPos was already removed. Im just not sure what methods would provide the necessary time or how i would modify the above setup to work for creative mode.
  10. Ive just used my container class to get the tile entity into the gui. Using: container.tileEntity.variables I just grab the variables I need straight from the tile entity. Not sure if this is the most correct way to do it but it works on both logical and physical servers with no issue.
  11. Thanks heaps for the reply, that would be the issue. Its now working as intended.
  12. Hi There Im currently sending packets from a tile entity to all nearby clients to play sounds(This is necessary over traditional playSound methods due to high control over the sound). On a single player world, everything works as expected and the debug printouts within the code come from the expected sides. When running on a dedicated server, the packet constructor and toBytes() are both called with correct data but nothing happens following that. No code within the Packet Handler is executed and neither is fromBytes(). PacketPlaySoundOnClient: ClientSoundHandler: Registering packet in my ClientProxy(Only packet with id 11): MCDJMod.network.registerMessage(ClientSoundHandler.class, PacketPlaySoundOnClient.class, 11, Side.CLIENT); Calling send method: On a side not, If i leave out the instruction integer from my packet, I get the following IndexOutOfBoundException from the client followed by disconnection from the server: readerIndex(11) + length(2) exceeds writerIndex(12): UnpooledSlicedByteBuf(ridx: 11, widx: 12, cap: 12/12, unwrapped: PooledUnsafeDirectByteBuf(ridx: 0, widx: 13, cap: 13)) Not sure if this may have something to do with the issue.
  13. Thanks so much for sharing that. I added the INBTInventory implementation to handle the NBT tags and everything is working perfectly now. Couldn't thank you enough!
  14. The only real similar one i found was the one i referenced in the post. All others seem to be regarding tile entities with the same issues. Will have another look though.
  15. Hi there My aim was to create a single slot inventory when an item was right clicked. Im good with all the gui stuff but can seem to nail the capabilities and NBT. I found this post( I also don't know using the current setup how I would go about accessing the contents of the slot from within the item class. Any guidance is appreciated. Code: ItemClass: package net.themcjavafre4k.mcdj.item.headphones; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.themcjavafre4k.mcdj.MCDJGuiHandler; import net.themcjavafre4k.mcdj.MCDJMod; import net.themcjavafre4k.mcdj.item.CustomRecord; import net.themcjavafre4k.mcdj.item.MCDJItems; public class ItemHeadphones extends ItemArmor{ private String title; public ItemHeadphones(String name){ super(MCDJItems.headphoneMaterial, 1, EntityEquipmentSlot.HEAD); this.title = name; setUnlocalizedName(name); setRegistryName(name); setCreativeTab(MCDJMod.creativeTab); INSTANCE = this; } public void registerItemModel(){ MCDJMod.proxy.registerItemRenderer(this, 0, title, "mcdj"); } @Override public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){ ItemStack itemstack = player.getHeldItem(hand); if (!world.isRemote){ player.openGui(MCDJMod.instance, MCDJGuiHandler.HEADPHONES, world, (int)player.posX, (int)player.posY, (int)player.posZ); //LogHelper.info("Succesfully opened GUI"); } return new ActionResult<ItemStack>(EnumActionResult.PASS, player.getHeldItemMainhand()); } @Override public ICapabilityProvider initCapabilities( ItemStack item, NBTTagCompound nbt ) { return new HeadphonesProvider(); } } Provider: package net.themcjavafre4k.mcdj.item.headphones; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.ItemStackHandler; public class HeadphonesProvider implements ICapabilityProvider, ICapabilitySerializable<NBTTagCompound>{ private ItemStackHandler inventory; public HeadphonesProvider() { inventory = new ItemStackHandler(1); } @Override public NBTTagCompound serializeNBT() { return inventory.serializeNBT(); } @Override public void deserializeNBT( NBTTagCompound nbt ) { // nbt = new NBTTagCompound(); inventory.deserializeNBT(nbt); } @Override public boolean hasCapability( Capability<?> capability, EnumFacing facing ) { if( capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ) { return true; } return false; } @Override public <T> T getCapability( Capability<T> capability, EnumFacing facing ) { if( capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY ) { return (T) inventory; } return null; } } Container: package net.themcjavafre4k.mcdj.item.headphones; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.IItemHandler; import net.themcjavafre4k.mcdj.inventory.SlotInput; import net.themcjavafre4k.mcdj.item.CustomRecord; import net.themcjavafre4k.mcdj.item.MCDJItems; public class ContainerHeadphones extends Container{ public IItemHandler inv; public ContainerHeadphones(IItemHandler itemHandler, EntityPlayer player ) { this.inv = itemHandler; addSlotToContainer(new SlotInput(itemHandler, 0, 44, 35)); for(int i = 0; i < 3; i++){ for(int j = 0; j < 9; j++){ addSlotToContainer(new Slot(player.inventory, j+i*9+9, 8+j*18, 84+i*18)); } } for(int i = 0; i < 9; i++){ addSlotToContainer(new Slot(player.inventory, i, 8+i*18, 142)); } } @Override public boolean canInteractWith(EntityPlayer playerIn) { return true; } //Crashing game // @Nullable // @Override // public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) // { // ItemStack itemstack = ItemStack.EMPTY; // Slot slot = this.inventorySlots.get(index); // // if (slot != null && slot.getHasStack()) // { // ItemStack itemstack1 = slot.getStack(); // itemstack = itemstack1.copy(); // // if (index == 2) // { // if (!this.mergeItemStack(itemstack1, 3, 39, true)) // { // return ItemStack.EMPTY; // } // // slot.onSlotChange(itemstack1, itemstack); // } // else if (!this.mergeItemStack(itemstack1, 3, 39, false)) // { // return ItemStack.EMPTY; // } // // if (itemstack1.isEmpty()) // { // slot.putStack(ItemStack.EMPTY); // } // else // { // slot.onSlotChanged(); // } // // if (itemstack1.getCount() == itemstack.getCount()) // { // return ItemStack.EMPTY; // } // // slot.onTake(playerIn, itemstack1); // } // // return itemstack; // } } SlotInput: package net.themcjavafre4k.mcdj.inventory; import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.SlotItemHandler; import net.themcjavafre4k.mcdj.item.CustomRecord; import net.themcjavafre4k.mcdj.item.MCDJItems; public class SlotInput extends SlotItemHandler { public SlotInput(IItemHandler inventory, int par2, int par3, int par4) { super(inventory, par2, par3, par4); } @Override public boolean isItemValid(ItemStack itemstack) { return itemstack.getItem() instanceof CustomRecord; //return true; } @Override public int getSlotStackLimit() { return 1; } } Gui: package net.themcjavafre4k.mcdj.item.headphones; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.themcjavafre4k.mcdj.MCDJMod; import net.themcjavafre4k.mcdj.SoundHandler; import net.themcjavafre4k.mcdj.item.MCDJItems; @SideOnly(Side.CLIENT) public class GuiHeadphones extends GuiContainer{ private static final ResourceLocation BG_TEXTURE = new ResourceLocation(MCDJMod.modId, "textures/gui/headphonegui.png"); public GuiHeadphones(Container container, InventoryPlayer inventory) { super(container); } @Override public void initGui(){ super.initGui(); } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawDefaultBackground(); super.drawScreen(mouseX, mouseY, partialTicks); this.renderHoveredToolTip(mouseX, mouseY); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY){ GlStateManager.color(1, 1, 1, 1); mc.getTextureManager().bindTexture(BG_TEXTURE); int x = (width - xSize) / 2; int y = (height - ySize) / 2; drawTexturedModalRect(x, y, 0, 0, xSize, ySize); } @Override protected void drawGuiContainerForegroundLayer(int mousX, int mouseY){ String name = I18n.format(MCDJItems.headphones.getUnlocalizedName()); //fontRenderer.drawString("Search For Songs", 195, 4, 0xFFFFFF); fontRenderer.drawString("Headphone Player", (xSize/2 - fontRenderer.getStringWidth(name)/2), 5, 0xFFFFFF); //fontRenderer.drawString(invPlayer.getDisplayName().getUnformattedText(), 8, ySize/2 - 10, 0xFFFFFF); } } If any more information is needed I will provide.
  16. Thanks heaps for your suggestions, It worked. It turns out it was the missing domain for the resourcelocation. Its interesting that it would still play via /playSound command but not using world.playSound method.
  17. Ive double checked with the documentation(found https://mcforge.readthedocs.io/en/latest/effects/sounds/) and it looks like it should be working since I am using the second method under World option. This should play to all players and if the passed in player is the client, it should play to them aswell. The Method I have at the moment: player.world.playSound(player, pos, SoundHandler.record1, SoundCategory.RECORDS, 1.0f, 1.0f);
  18. I’ve just recently changed my item class to extend ItemRecord and removed the onItemUse function to see if it is the way I am implementing playSound. I pass in the sound event when creating the item but still the same result. No errors return and the jukebox displays the correct sound event.desc(as I haven’t added it in Lang) but still doesn’t play the audio. playing through a command still plays the audio after this change. any ideas are welcome.
  19. Still no sound using updated play method. But same thing, I can use default Minecraft sounds and it works and I can also play the required sound via command. Thanks for the heads up about no need for the extension. Makes everything a little neater.
  20. I can't seem to figure out why I'm able to play my custom sound through the command /playsound... but not when calling the function world.play(...); I know the code is correctly firing on right click and will even work with playing default sounds but not custom ones. Trigger Code: @Override public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { IBlockState iblockstate = worldIn.getBlockState(pos); if (iblockstate.getBlock() == Blocks.JUKEBOX && !((Boolean)iblockstate.getValue(BlockJukebox.HAS_RECORD)).booleanValue()) { if (!worldIn.isRemote) { ItemStack itemstack = player.getHeldItem(hand); ((BlockJukebox)Blocks.JUKEBOX).insertRecord(worldIn, pos, iblockstate, itemstack); player.world.playSound((EntityPlayer)null, pos, SoundHandler.record1, SoundCategory.RECORDS, 1.0f, 1.0f); itemstack.setCount(0); player.addStat(StatList.RECORD_PLAYED); } return EnumActionResult.SUCCESS; } else { return EnumActionResult.PASS; } } SoundHandler class(SoundHandler() called in preInit() to set record1 but can easily be moved up to declaration): public final class SoundHandler { public static SoundEvent record1; public SoundHandler(){ record1 = createSoundEvent2("record1"); } private static SoundEvent createSoundEvent2(String soundName){ final ResourceLocation sound = new ResourceLocation(soundName + ".ogg"); System.out.println("Create Sound2"); return new SoundEvent(sound).setRegistryName(soundName); } @Mod.EventBusSubscriber public static class Registration{ @SubscribeEvent public static void registerSoundEvents(RegistryEvent.Register<SoundEvent> e){ e.getRegistry().register(record1); } } } sounds.json { "record1": { "category": "record", "sounds": [ { "name": "testsoundmod:record1", "stream": true } ] } } Any help would be appreciated. Thanks
  21. Thanks for mentioning IResourcePack. Was able to use a FolderResourcePack and everything Is working as supposed to. Thanks again
  22. Ill add some context on what I'm trying to achieve. Im hoping to be able to allow a user to dump mainly sounds but possibly images into a file in the .minecraft directory which the mod will be able to read. The files then have the corresponding .json file created, so for custom sounds the sounds.json would be written by the mod, and since it is obviously impossible if not very unadvisable to try editing files within a bundled jar file I'm looking for ways to get around this. If there is a location i can create a resource pack based structure then have forge look in that domain instead of the jar resources or treat it as a resource pack and automatically load it that would be perfect. Thanks
  23. Would forge be able to load and apply a resource pack internally without the user having to select it manually in the menu?
  24. Hi There I would like to be able to load sounds and the sounds.json from another folder within the .minecraft folder so they can be easily changed even when the mod has been bundled into a jar. Is this something that is possible with Forge and if so where would be a good starting point? Thanks
  25. I believe i have it all working now, thanks everyone for there help.
×
×
  • Create New...

Important Information

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