Jump to content

Simon_kungen

Members
  • Posts

    151
  • Joined

  • Last visited

Everything posted by Simon_kungen

  1. MessageIdentityHidden.java public class MessageIdentityHidden { private final boolean hidden; private final int playerID; public MessageIdentityHidden(int playerID, boolean hidden) { this.hidden = hidden; this.playerID = playerID; } public static void encode(final MessageIdentityHidden message, final PacketBuffer buffer) { buffer.writeInt(message.playerID); buffer.writeBoolean(message.hidden); } public static MessageIdentityHidden decode(final PacketBuffer buffer) { return new MessageIdentityHidden(buffer.readInt(), buffer.readBoolean()); } public static void handle(MessageIdentityHidden message, Supplier<NetworkEvent.Context> ctx) { ctx.get().enqueueWork(() -> { if (message.playerID == Minecraft.getInstance().player.getEntityId()) return; PlayerEntity player = (PlayerEntity) Minecraft.getInstance().player.world.getEntityByID(message.playerID); IIdentityHidden hidden = player.getCapability(IdentityHiddenProvider.HID_CAP).orElseThrow(NullPointerException::new); hidden.setHidden(message.hidden); }); ctx.get().setPacketHandled(true); } }
  2. Ok. Looks like it is finally working, I had some issues with the playerID being 0. The decoder has to write the values in the same order they are read, which I presumed didn't matter due to them being two different primitive types (int and boolean). Then I had a simple filter as to not change the value of the client's just in case.
  3. I don't know where you got this idea from. It's not what I said.  You can't. You are on the client. There is no server world on the client. Ok, sorry. In that case, how to get the player from the playerID? MessageIdentityHidden.java public static void handle(MessageIdentityHidden message, Supplier<NetworkEvent.Context> ctx) { ctx.get().enqueueWork(() -> { PlayerEntity player = message.playerID// How do I get the target player by the ID here? IIdentityHidden hidden = player.getCapability(IdentityHiddenProvider.HID_CAP).orElseThrow(NullPointerException::new); hidden.setHidden(message.hidden); }); ctx.get().setPacketHandled(true); }
  4. Ok, so. If the in the handle function message's playerID is the sender, who's capability am I supposed to change? Alright. If the playerID is not the right player who's capability I'm not supposed to change, who's should I do? And in that case how do I get the server world in the handle function? And does that even make sense to do it like that? Get the capability in the function and change it to the message's value. Should I scrap completely the playerID parameter for the setHidden() function and not send a message when I change the value? Please elaborate. Now when I join a server or start a server world it appears to not find the IdentityHidden capability of the target player and therefore throws the NullPointerException error. @SubscribeEvent public static void onPlayerStartTracking(final PlayerEvent.StartTracking event) { IIdentityHidden hiddenTarget = event.getTarget().getCapability(IdentityHiddenProvider.HID_CAP).orElseThrow(NullPointerException::new); // <-- doesn't find the capability and throws a error. IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(event.getPlayer().getEntityId(),hiddenTarget.getHidden())); } The last one is what confuses me the most. Before it worked fine with the .orElseThrow fix you told me to change due to it not making sense because it should put it on all players. But I'm not even sure if I'm even attaching capabilities correctly. I thought it simply needed to have the @SubscribeEvent annotation in my Event Handler class which has the @Mod.EventBusSubscriber annotation to the class, which ended up not firing. So in my main mod class I just attached it as a listener to MinecraftForge.EVENT_BUS. IntercraftCore.java MinecraftForge.EVENT_BUS.addListener(IntercraftEventHandler::attachCapabilityEntity); It worked, so I left it at that.
  5. Ok, I had so if you want to sync to other clients you have to specify a player. But now the problem is that it doesn't find the capability on the player anymore in onPlayerStartTracking: public static void onPlayerStartTracking(final PlayerEvent.StartTracking event) { IIdentityHidden hiddenTarget = event.getTarget().getCapability(IdentityHiddenProvider.HID_CAP).orElseThrow(NullPointerException::new); IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(event.getPlayer().getEntityId(),hiddenTarget.getHidden())); } IdentityHidden.java public class IdentityHidden implements IIdentityHidden { private boolean hidden; public IdentityHidden(boolean hidden) { this.hidden = hidden; } public IdentityHidden() { this.hidden = false; } @Override public boolean getHidden() { return hidden; } @Override public void setHidden(PlayerEntity player,boolean hidden) // For client syncing. { this.hidden = hidden; IntercraftCore.NETWORK.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> player), new MessageIdentityHidden(player.getEntityId(), hidden)); } @Override public void setHidden(boolean hidden) { this.hidden = hidden; // For server reading. } } MessageIdentityHidden.java public class MessageIdentityHidden { private final boolean hidden; private final int playerID; public MessageIdentityHidden(int playerID, boolean hidden) { this.hidden = hidden; this.playerID = playerID; } public MessageIdentityHidden(int playerID) { this.hidden = false; this.playerID = playerID; } public static void encode(final MessageIdentityHidden message, final PacketBuffer buffer) { buffer.writeBoolean(message.hidden); buffer.writeInt(message.playerID); } public static MessageIdentityHidden decode(final PacketBuffer buffer) { return new MessageIdentityHidden(buffer.readInt(), buffer.readBoolean()); } public static void handle(MessageIdentityHidden message, Supplier<NetworkEvent.Context> ctx) { ctx.get().enqueueWork(() -> { PlayerEntity player = (PlayerEntity) ctx.get().getSender().getServerWorld().getEntityByID(message.playerID); IIdentityHidden hidden = player.getCapability(IdentityHiddenProvider.HID_CAP).orElseThrow(NullPointerException::new); hidden.setHidden(player, message.hidden); }); ctx.get().setPacketHandled(true); } }
  6. Ok, updated so it uses a throws a NullPointerException instead of a default implementation. And you're right about me not having the Package class correct, which is something I forgot to show, so here it is updated with player UUID as the second argument: MessageIdentityHidden.java public class MessageIdentityHidden { private final boolean hidden; private final UUID playerUUID; public MessageIdentityHidden(UUID playerUUID, boolean hidden) { this.hidden = hidden; this.playerUUID = playerUUID; } public MessageIdentityHidden(UUID playerUUID) { this.hidden = false; this.playerUUID = playerUUID; } public static void encode(final MessageIdentityHidden message, final PacketBuffer buffer) { buffer.writeBoolean(message.hidden); buffer.writeUniqueId(message.playerUUID); } public static MessageIdentityHidden decode(final PacketBuffer buffer) { return new MessageIdentityHidden(buffer.readUniqueId(), buffer.readBoolean()); } public static void handle(MessageIdentityHidden message, Supplier<NetworkEvent.Context> ctx) { ctx.get().enqueueWork(() -> { // No idea what to do here. }); ctx.get().setPacketHandled(true); } } I have mostly looked at ToasterMod-1.14's code as I have no idea how to do this. And as he left his handle function empty I did the same with mine.
  7. Ok, so, umm. I changed IdentityHidden.java to this: public class IdentityHidden implements IIdentityHidden { private boolean hidden; public IdentityHidden() { this.hidden = false; } @Override public boolean getHidden() { return hidden; } @Override public void setHidden(boolean hidden) { this.hidden = hidden; IntercraftCore.NETWORK.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.noArg(), new MessageIdentityHidden(hidden)); } } And in IntercraftEventHandler.java I added this: @SubscribeEvent public static void onPlayerLoggedIn(final PlayerEvent.PlayerLoggedInEvent event) { IIdentityHidden hidden = event.getEntity().getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(hidden.getHidden())); } @SubscribeEvent public static void onPlayerRespawn(final PlayerEvent.PlayerRespawnEvent event) { IIdentityHidden hidden = event.getEntity().getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(hidden.getHidden())); } @SubscribeEvent public static void onPlayerChangedDimension(final PlayerEvent.PlayerChangedDimensionEvent event) { IIdentityHidden hidden = event.getEntity().getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(hidden.getHidden())); } @SubscribeEvent public static void onPlayerStartTracking(final PlayerEvent.StartTracking event) { IIdentityHidden hiddenTarget = event.getTarget().getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); IntercraftCore.NETWORK.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()),new MessageIdentityHidden(hiddenTarget.getHidden())); } Is there something I missed? I have it send the updated value in the setter function of my capability class so I can more easily use it in other places such as my debug command and in the item that changes that value when worn (CuriosAPI Item). ItemMask.java ... @Override public void onEquipped(String identifier, LivingEntity entityLivingBase) { ItemMask.this.onEquipped(identifier, entityLivingBase); playEquipSound(entityLivingBase); if (hidesIdentity()) { if (entityLivingBase instanceof PlayerEntity) { entityLivingBase.sendMessage(new TranslationTextComponent("info."+Reference.MODID+".identity.hidden")); IIdentityHidden hidden = entityLivingBase.getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); if (!hidden.getHidden()) hidden.setHidden(true); } } } @Override public void onUnequipped(String identifier, LivingEntity entityLivingBase) { ItemMask.this.onUnequipped(identifier,entityLivingBase); if (hidesIdentity()) { if (entityLivingBase instanceof PlayerEntity) { entityLivingBase.sendMessage(new TranslationTextComponent("info."+Reference.MODID+".identity.shown")); IIdentityHidden hidden = entityLivingBase.getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); if (hidden.getHidden()) hidden.setHidden(false); } } } ...
  8. Ok, not sure what the heck is going on with spoilers. For some reason, they make a huge blank page in the beginning, no matter what I do that does not show up while editing.
  9. Hi I have this one-variable-capability that needs to sync to all clients on the server in order for them to check in their event handler what to render: IntercraftEventHandler.java ... @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void onRenderEntity(RenderLivingEvent.Specials.Pre event) { if (event.getEntity() instanceof PlayerEntity) { if (event.isCancelable()) { IIdentityHidden hidden = event.getEntity().getCapability(IdentityHiddenProvider.HID_CAP).orElse(IdentityHiddenProvider.HID_CAP.getDefaultInstance()); if (hidden.getHidden()) { // If true, cancel this event. event.setCanceled(true); } } } } ... Here are the capability files that store a single boolean value: Then I register it like so: IntercraftCore.java ... public void onCommonSetup(final FMLCommonSetupEvent event) { CapabilityManager.INSTANCE.register(IIdentityHidden.class, new IdentityHiddenStorage(), new IdentityHiddenStorage.Factory()); } ... The problem is that the capability is stored on the server and therefore nothing happens. So I created a message to send to all clients when that value changed in my network.. IntercraftPacketHandler.java .. and stored it like this in IntercraftCore.java: public static final SimpleChannel NETWORK = IntercraftPacketHandler.getNetworkChannel(); Problem Ok, that's the code I have, and I wouldn't be here if it worked. I have 0 experience with this and last time it didn't work at all. So if its a common mistake I'll listen. I have no problem with starting a singleplayer world, but when I log in on a server or log in to a LAN world the client that logs in crashes with a NullPointerException. ---- Minecraft Crash Report ---- // I just don't know what went wrong :( Time: 10/30/19 11:16 AM Description: Unexpected error java.lang.NullPointerException: Unexpected error at net.minecraft.client.multiplayer.PlayerController.func_78750_j(PlayerController.java:251) ~[?:?] {pl:runtimedistcleaner:A} at net.minecraft.client.multiplayer.PlayerController.func_78765_e(PlayerController.java:231) ~[?:?] {pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1283) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.func_195542_b(Minecraft.java:866) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:384) ~[?:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(SourceFile:155) ~[1.14.4-forge-28.1.1.jar:?] {} at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181] {} at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181] {} at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181] {} at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181] {} at net.minecraftforge.fml.loading.FMLClientLaunchProvider.lambda$launchService$0(FMLClientLaunchProvider.java:56) ~[forge-1.14.4-28.1.1.jar:28.1] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-3.2.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:50) [modlauncher-3.2.0.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:68) [modlauncher-3.2.0.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:80) [modlauncher-3.2.0.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-3.2.0.jar:?] {} ... Full + download:
  10. Hi As you guys can see in the gif it does not render the top or the bottom when there is no other of the same kind beside it. I would like to render all sides of the block at all time (so it renders it like a cage or something (note I said "like a cage" as it would explain it the best, it is not a literal cage)).
      • 1
      • Like
  11. Ah, ok. Do you have any ideas what could be used otherwise? I'm looking into tags now: if (event.getEntity().getTags().contains(Reference.MODID+":feature")) // Stuff .. entityLivingBase.addTag(Reference.MODID+":feature"); entityLivingBase.removeTag(Reference.MODID+":feature"); This appears to not be working in case you're wondering. I did try and just print out to the console all the tags, but it didn't print out anything. Either there are no tags normally on the player and .addTag() does not fire on the server which I thought it would or I do not add it correctly. Note that I do not need to add any data to the tag itself and just need to check if the player has it or not.
  12. Hi Going to be a bit vague what I'm trying to do to make this post more general, so we'll see how good an idea that is. I would like when a player does something (equips an item, picks up an item, struck by lightning, etc) a tag or something would switch to True allowing for special conditions in the event handler. I can probably make a convoluted solution with Capabilities, but I'm sure there is a better solution, that's when I noticed Stats. I first thought of just trying to create one and see what it does, but as I'm having a little problem with that I thought it would be better to make sure I know what it is. So the idea was when I do a thing with my player, the stat gets added to me, and when doing something else it removes it again.
  13. Introduction: This is not really a tutorial per se, but as this fits the bill the best, here we are. I got sick of having to manually create new lines for, and every, new item and block in the language file. Sure copy-pasting and run a replace search did kind of solve the issue, but it was still very tedious. So I sat down and made a generator tool written in JavaScript for Node.js. And that is what this post is about. Requirements: You will need Node.js installed on your system if you want to run it locally, but I'm sure there is an online version you can run from too. Anyways, the program needs a Json blueprint from which it will generate all the finished language translations. A generic one is in a spoiler down here: Tutorial: { "domain": "examplemod", "types": [ { "ingot" : "%s Ingot" }, { "nugget" : "%s Nugget" }, { "dust" : "%s Dust" }, { "plate" : "%s Plate" }, { "gear" : "%s Gear" }, { "block" : "%s Block", "flag" : "block" }, { "frame" : "%s Frame", "flag" : "block" }, { "ore" : "%s Ore", "flag" : "ore" } ], "elements": [ { "silver" : "Silver" }, { "gold" : "Gold", "filter": [ "ingot","nugget","block","ore" ] }, { "copper" : "Copper" }, { "iron" : "Iron", "filter": [ "ingot","nugget","block","ore" ] }, { "lead" : "Lead" }, { "tin" : "Tin" } ] } Ok, so what's going on here? The "domain" is your mod's name, that can be anything. Then there are the array "types", it is what type of item you want to make a translation of off. It first needs a name as the key, and then the translation. It is important you have the "%s" symbol in there as that is what is going to be replaced with an entry in the "types" array. You can change however you want of the translated key, as long as it has the "%s" in it. A second optional argument called "flag" can be used. Not sure if you're like me, but I do like to have some structure in my language files, so types with the same flag will be grouped in the output file (if enabled). And if you have it be the same in the program options' blockKeywords array it will automatically make it a block contrary to item. By default, it will make types with the flag "block" or "ore" to be blocks in the output file. In the "elements" array is what materials you want them in. It first needs a key and then a translated version of it. There is an optional argument too called "filter". It is an array of types you don't want translated, ex. you might not want to make a translation for Iron Ingot as Minecraft already adds that, so adding "ingot" in the filter array it will not generate in the output file. Something to note is if it has the keyword "none" it will skip over it entirely, might only be useful in very particular cases like if you go by a pre-decided dictionary. In the program (index.js) there are a few options you can tweak, but I have already explained what they do in the file so I'm going to skip that and explain how on to set up the program: After you've extracted the program you should just have to open the command prompt and type "node .". "node" is the program, and the "." tells it to use the package.json in that directory. If everything worked as intended it should have created a new file in "output/" with the same name as the input file in "input/". Technical part: When creating the language key, it first decides between using "item." or "block.", thereafter the domain. The item/block key name is generated by first using the key name, then dividing it with a "_" and the type key. Example: Domain: "buildcraftcore" Type: "gear" Element: "gold" "item.buildcraftcore.gold_gear" : "Gold Gear" Download: LangGen.zip The plain index.js file /** * A tool to generate language translations for blocks and items for my Minecraft mods * with similar names from a Json file blueprint. A high degree of customization of the Json * is possible to generate a large amount of different translations with language keys in specified order * ready for file transfer or manually copy-paste into desired language file, written in JavaScript in Node.js. * * By Simon */ const fs = require('fs'); const lang = 'en_us.json'; // Change this to the desired language file name in input/. const spacing = 2; // The desired spacing in the output file (recom. 2 or 4). const separated = true; // If the flagged types should be separated or mixed in the output file. const logging = false; // Whenever it should write out the language key to the console. const blockKeywords = [ // If a flag matches a word here it will change the language key to be a block. 'block', 'ore' ] //////////////////////// Don't edit below this unless you know what you're doing //////////////////////// fs.readFile('input/' + lang, (err,data) => { if (err) throw err; const json = JSON.parse(data); let JSONObjects = [{}]; json.elements.forEach(element => { for (let i in json.types) { let shouldSkip = false; if (element.filter) for (var j=0;j<element.filter.length;j++) { if (element.filter[j] == Object.keys(json.types[i])[0] || element.filter[j] == 'none') { shouldSkip = true; break; } } if (shouldSkip) continue; let translation = json.types[i][Object.keys(json.types[i])[0]]; let keyword = json.domain + "." + Object.keys(element)[0] + "_" + Object.keys(json.types[i])[0]; translation = translation.replace("%s", element[Object.keys(element)[0]]); let t = blockKeywords.includes(json.types[i].flag) ? 'block.' : 'item.'; if (logging) { console.log(line(t + keyword, translation)); } if (separated) { let index = 0; if (json.types[i].flag) { index = json.types[i].flag; if (JSONObjects[index] == undefined) { JSONObjects[index] = {}; } } JSONObjects[index][t + keyword] = translation; } else JSONObjects[0][t + keyword] = translation; } }); fs.readFile('output/' + lang, (err, data) => { const text = JSON.stringify(separated ? merge(JSONObjects) : JSONObjects[0], null, spacing); if (!err) if (text == data.toString()) { console.log('No changes to output/' + lang); return; } fs.writeFileSync('output/' + lang, text); console.log('Wrote to output/' + lang); }); }); function line(a,b) { return "\"" + a + "\" : \"" + b + "\"" } function merge(a) { const r = {};Object.keys(a).forEach(j => Object.keys(a[j]).forEach(key => r[key] = a[j][key]));return r; }
  14. So, it seems like this thread died right when it was born. So let me reformulate: Read custom Json files in the data/ directory and do stuff with that. Does Minecraft have a static function to read the Json files and get the values inside that?
  15. Hi I got really intrigued by Panda4994's video about making Sand renewable fitting into the style of vanilla: So I was thinking of trying to make a mod out of that (or in this case a part of my ever-growing mod) idea as a feature of Anvils. (tl;dr Anvils landing on blocks can damage the block it lands on turning it into a different block. Cobblestone -> Gravel -> Sand, Stone Bricks -> Cracked Stone Bricks, etc. Blocks such as glass gets destroyed completely) But I'm having a bit of an issue finding a way of detecting an Anvil landing. As I couldn't find an event of that I tried the next best way, looking for an event fired when an Entity is removed (FallingBlockEntity). But that does not exist either, but there is a construction event for Entities and the CapabilityAttach with Entities event. I can find new falling Entities, but I can't detect them turning back into blocks. My new idea is to maybe use a Capability attached to falling Anvils, but I don't know how to proceed from there. I need to check if it's is going to land on a block while keeping it as a FallingBlockEntity and decide if it can destroy the block or not, and otherwise do the block conversion check when it lands and turn back into a block and at the same time do the block it landed into its conversion type (ex. Gravel -> Sand). For now, the mechanic is the most important, so the conversion types are most likely be hard-coded for the time being. But later on I would like to have it be configured with the use of JSON files, example: data/<namespace>/block_conversion/anvil/cracked_stone_brick.json { "replace": false, "values": [ "minecraft:stone_bricks" ], "replacing" : "minecraft:cracked_stone_bricks" } It would follow the ordinary tag JSON format but have an additional parameter ("replacing") what the matching block will turn into. Not sure how I would go about that part, but as I said, that is a lower priority right now, so it is most likely going to be the discussion in this thread later.
  16. I interpret the silence as a "no".
  17. Ok, so I have made so it uses the parent models of the original vanilla block + item. How do I replace an item in its Creative Tab with my version? So players will be encouraged to use my version.
  18. Hmm... so my best bet is to just make a new block under my mod id and replace the vanilla block recipe to give my block instead?
  19. Or do you mean by that I can't add new properties to it? I thought you meant I can't remove existing block properties or change how they behave and the range of example an int range.
  20. Ok, so tried that, but it ended up with it complaining that I can't change the order of block properties, so I changed the order of it, same thing. Then I removed it just to see what it said then and then the game crashed due to it not finding the waterlogged property on the block. @Override protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) { super.fillStateContainer(builder); // Doesn't matter which order they are in, still complains. Removing WATERLOGGED crashes the game. builder.add(WATERLOGGED); } How do I avoid that?
  21. Hi I would like to make some vanilla blocks water loggable, how would I go about doing that? I have to add the property WATERLOGGED to the block first, then I have to add the IWaterLoggable interface together with its methods. Making my own block class adding that is super easy, but adding it to vanilla blocks I have no idea how to do.
  22. Alright, looks like it loads the mod into the game now. It crashes on world load, but that is out of scope for this and is more likely an issue on JEI's end on the looks of things.
  23. So I got a different error message this time around: BUILD FAILED in 7s 6 actionable tasks: 2 executed, 4 up-to-date Could not find mezz.jei:jei-1.14.4:6.0.0.11_mapped_snapshot_20190806-1.14.3. Searched in the following locations: - https://files.minecraftforge.net/maven/mezz/jei/jei-1.14.4/6.0.0.11_mapped_snapshot_20190806-1.14.3/jei-1.14.4-6.0.0.11_mapped_snapshot_20190806-1.14.3.pom - https://files.minecraftforge.net/maven/mezz/jei/jei-1.14.4/6.0.0.11_mapped_snapshot_20190806-1.14.3/jei-1.14.4-6.0.0.11_mapped_snapshot_20190806-1.14.3.jar - https://libraries.minecraft.net/mezz/jei/jei-1.14.4/6.0.0.11_mapped_snapshot_20190806-1.14.3/jei-1.14.4-6.0.0.11_mapped_snapshot_20190806-1.14.3.jar - https://repo.maven.apache.org/maven2/mezz/jei/jei-1.14.4/6.0.0.11_mapped_snapshot_20190806-1.14.3/jei-1.14.4-6.0.0.11_mapped_snapshot_20190806-1.14.3.pom - https://repo.maven.apache.org/maven2/mezz/jei/jei-1.14.4/6.0.0.11_mapped_snapshot_20190806-1.14.3/jei-1.14.4-6.0.0.11_mapped_snapshot_20190806-1.14.3.jar Required by: project : 18:55:48: Task execution finished 'runClient'. runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.11")
  24. Ok, I missed that comment. Sorry about that. So should I add the dependencies somewhere else?
  25. Nope, I just took that from the Forge SDK.
×
×
  • Create New...

Important Information

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