jakobkmar / pacmc Goto Github PK
View Code? Open in Web Editor NEWAn easy-to-use package manager (and soon to be launcher) for Minecraft mods.
License: GNU Affero General Public License v3.0
An easy-to-use package manager (and soon to be launcher) for Minecraft mods.
License: GNU Affero General Public License v3.0
Display new releases of pacmc or modding related stuff in the news tab
(Maybe, if its not too hard to implement, a preview of the resourcepack in the gui)
To support more linux distros, it would be helpful to provide a flatpak image for pacmc.
Stacktrace :
Failed to deserialize the response to the following request: https://api.modrinth.com/api/v1/mod/charmonium/version
Error message: Unexpected JSON token at offset 839: Unexpected 'null' value instead of string literal
JSON input: .....endencies":[{"version_id":null,"project_id":"pOQTcQmj","depe.....
Please open an issue with the above error message at https://github.com/jakobkmar/pacmc/issues/new
Failed to deserialize the response to the following request: https://api.modrinth.com/api/v1/mod/bpii4Xsa/version
Error message: Unexpected JSON token at offset 839: Unexpected 'null' value instead of string literal
JSON input: .....endencies":[{"version_id":null,"project_id":"pOQTcQmj","depe.....
Please open an issue with the above error message at https://github.com/jakobkmar/pacmc/issues/new
pacmc
crashes when trying to install the Charmonium mod in 1.18.2.
I am trying to build this project on IntelliJ IDEA 2021.1.3 on Windows 11.
Unable to delete directory 'D:\files\src\pacmc\packages'
Failed to delete some children. This might happen because a process has files open or has its working directory set in the target directory.
- D:\files\src\pacmc\packages\aur\pacmc\.SRCINFO
- D:\files\src\pacmc\packages\aur\pacmc
- D:\files\src\pacmc\packages\aur
"Please open an issue with the above error message" :
The mod curseforge/WorldEdit is up to date
The mod curseforge/Deepslate Instamine - Fabric/Forge is up to date
The mod curseforge/Fabric Language Kotlin is up to date
The mod curseforge/spark is outdated
The mod curseforge/Cloth API (Fabric) is up to date
The mod curseforge/Carpet is up to date
The mod curseforge/Simple Voice Chat is up to date
The mod curseforge/Carpet Extra is up to date
Got a Gateway Time-out answer (code 504) for the following request: https://addons-ecs.forgesvc.net/api/v2/addon/306612/files
As shown in the image, attempting to install multiple mods at once will throw an 'Extra Argument' error.
Currently, as somebody who does a lot of bulk installation as I migrate my server around different versions, I think this feature would be very handy as a time saver.
Sort of like how you can do this with pacman:
pacman -S base base-devel linux-zen vim vi xorg
It doesn't seem like there's anything stopping this from being a feature, as extra forms of the install command are achieved using flags, instead of multiple arguments.
It seems "update" command can't always find the newest version of the mod (at least for curseforge mods), for example:
I have version 3.4.1 of curseforge/357540
installed (1.18.1).
But the latest version is 3.4.2:
I suspect it might be because this version is marked as "beta". Unfortunately there is no way to select which release type should be installed.
If a mod depending on FabricAPI is outdated, it gets removed before a new version will be downloaded.
That's ok but this causes pacmc to flag Fabric API as unneeded.
Removing the dependency Fabric API because it is no longer needed
Suggestion: move the dependency check to appear after Updating mods
one and eventually run Deleting old files
again to flush actually unneeded dependencies.
title says it
Example:
Do you want to install any optional dependencies?
1) modrinth/modmenu
2) modrinth/clothconfig
3) modrinth/fabric-api
List the dependencies that you want to install (provide the numbers): 2,3
^^^
this would install clothconfig and fabric api but not modmenu
When i performed pacmc install entityculling
a exception was thrown:
kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 406: Expected string literal but 'null' literal was found. Use 'coerceInputValues = true' in 'Json {} builder to coerce nulls to default values. JSON input: .....ownloadCount":0,"downloadUrl":null,"gameVersions":["1.16.3",..... at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:24) at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:32) at kotlinx.serialization.json.internal.AbstractJsonLexer.fail(AbstractJsonLexer.kt:524) at kotlinx.serialization.json.internal.AbstractJsonLexer.unexpectedToken(AbstractJsonLexer.kt:202) at kotlinx.serialization.json.internal.StringJsonLexer.consumeNextToken(StringJsonLexer.kt:74) at kotlinx.serialization.json.internal.StringJsonLexer.consumeKeyString(StringJsonLexer.kt:85) at kotlinx.serialization.json.internal.AbstractJsonLexer.consumeString(AbstractJsonLexer.kt:310) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeString(StreamingJsonDecoder.kt:256) at kotlinx.serialization.encoding.AbstractDecoder.decodeStringElement(AbstractDecoder.kt:58) at net.axay.pacmc.repoapi.curseforge.model.File$$serializer.deserialize(File.kt:6) at net.axay.pacmc.repoapi.curseforge.model.File$$serializer.deserialize(File.kt:6) at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36) at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43) at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70) at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535) at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80) at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51) at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36) at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43) at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36) at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43) at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70) at net.axay.pacmc.repoapi.curseforge.model.CurseforgeDataWrapper$$serializer.deserialize(CurseforgeDataWrapper.kt:5) at net.axay.pacmc.repoapi.curseforge.model.CurseforgeDataWrapper$$serializer.deserialize(CurseforgeDataWrapper.kt:5) at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36) at kotlinx.serialization.internal.NullableSerializer.deserialize(NullableSerializer.kt:30) at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36) at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100) at net.axay.pacmc.repoapi.curseforge.CurseforgeApi$getProjectVersions$2$1$1.invokeSuspend(CurseforgeApi.kt:116) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:749) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
I ran pacmc archive version 1.18.2 fabric118
(fabric118
being the name of my archive) and got
Trying to change the version of the archive 'fabric118' to '1.18.2'
Changed the version in the database
Redownloading all mods in the archive for the new version...
Retrieving updated file data...
java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
at net.axay.pacmc.commands.Refresh$refreshArchive$2$1$1.invokeSuspend(Refresh.kt:117)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:43)
at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:106)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
An error occured, Please open an issue with the above stack trace at https://github.com/jakobkmar/pacmc/issues/new
OS: Windows 11 Build 21H2
Hi, I think it would be nice, if the filename of the .jar would contain the actual mod's name instead of a string of characters (for example pacmc_modrinth_indium.jar
instead of pacmc_modrinth_Orvt0mRa_1ApUEVoW_0.jar
.
It just comes up with an empty list and won't execute operations
Hi, im getting this error when running pacmc list
or pacmc install <mod>
Im on manjaro linux with java 16
Exception in thread "main" java.lang.ExceptionInInitializerError
at javassist.util.proxy.DefineClassHelper.<clinit>(DefineClassHelper.java:216)
at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:128)
at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:552)
at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:475)
at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:444)
at javassist.util.proxy.ProxyFactory.create(ProxyFactory.java:721)
at kotlinx.dnq.util.XdHierarchyNode$naturalPersistentClassInstance$2.invoke(XdHierarchyNode.kt:96)
at kotlinx.dnq.util.XdHierarchyNode$naturalPersistentClassInstance$2.invoke(XdHierarchyNode.kt:33)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at kotlinx.dnq.util.XdHierarchyNode.getNaturalPersistentClassInstance(XdHierarchyNode.kt)
at kotlinx.dnq.util.DNQMetaDataUtilKt.initMetaData(DNQMetaDataUtil.kt:46)
at net.axay.pacmc.storage.Xodus.<clinit>(Xodus.kt:28)
at net.axay.pacmc.commands.Archive$List.run(Archive.kt:54)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:204)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:213)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:213)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:17)
at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:396)
at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:393)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:411)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:436)
at net.axay.pacmc.ManagerKt.main(Manager.kt:10)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5fb2de77
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at javassist.util.proxy.SecurityActions$3.run(SecurityActions.java:94)
at javassist.util.proxy.SecurityActions$3.run(SecurityActions.java:90)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
at javassist.util.proxy.SecurityActions.getMethodHandle(SecurityActions.java:89)
at javassist.util.proxy.DefineClassHelper$SecuredPrivileged$2.getDefineClassMethodHandle(DefineClassHelper.java:143)
at javassist.util.proxy.DefineClassHelper$SecuredPrivileged$2.<init>(DefineClassHelper.java:136)
at javassist.util.proxy.DefineClassHelper$SecuredPrivileged.<clinit>(DefineClassHelper.java:134)
... 22 more````
$ pacmc init
Exception in thread "main" java.lang.ExceptionInInitializerError
at net.axay.pacmc.commands.Init$run$1.invokeSuspend(Init.kt:25)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
Caused by: org.kodein.db.leveldb.LevelDBException: NotFound: D:\files\app\games\Minecraft\.minecraft\null\axay\pacmc\data\db1/LOCK: ?????????
at org.kodein.db.leveldb.jni.Native.dbOpen(Native Method)
at org.kodein.db.leveldb.jni.LevelDBJNI$Factory.open(LevelDBJNI.kt:29)
at org.kodein.db.leveldb.jvm.LevelDBJvm.open(LevelDBJvm.kt)
at org.kodein.db.impl.kv.AbstractKeyValueDBFactory.open(AbstractKeyValueDBFactory.kt:20)
at org.kodein.db.impl.kv.AbstractKeyValueDBFactory.open(AbstractKeyValueDBFactory.kt:12)
at org.kodein.db.impl.data.AbstractDataDBFactory.open(AbstractDataDBFactory.kt:20)
at org.kodein.db.impl.data.AbstractDataDBFactory.open(AbstractDataDBFactory.kt:12)
at org.kodein.db.impl.model.AbstractModelDBFactory.open(AbstractModelDBFactory.kt:29)
at org.kodein.db.impl.model.AbstractModelDBFactory.open(AbstractModelDBFactory.kt:9)
at org.kodein.db.impl.AbstractDBFactory.open(AbstractDBFactory.kt:25)
at org.kodein.db.impl.AbstractDBFactory.open(AbstractDBFactory.kt:10)
at org.kodein.db.impl.DefaultKt.open(default.kt:7)
at net.axay.pacmc.storage.DatabaseKt.<clinit>(Database.kt:14)
... 7 more
Pacmc version:
$ scoop update pacmc
pacmc: 0.2.1 (latest version)
JDK version:
$ java --version
openjdk 16.0.1 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-24)
OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
If I use
pacmc archive remove {archive}
the archive is still listed at
pacmc archive list
Add unstable versions like 1.19-rc2 to pacmc.
It would be really nice to be able to move the location of an archive, including all the mods currently installed. For instance, you get a new hard drive and want to move it there, currently you have to delete and recreate the archive.
Would it be possible to see what version of the mod is available in the "repos" before installing it?
Ideally it would show with the search
command when listing packages.
It would be also nice when listing already downloaded mods with list
.
Additionally when using search
. an indication if the mod is already installed would be realy nice too.
I'm gonna attach a screenshot as an example of how does it work with pacman.
It seems the new version of pacmc doesn't support installing by Project ID:
$ pacmc install 394468
Resolving versions and dependencies...
[✓] resolved slugs
The project 394468 could not be found
Adding curseforge/
doesn't help. (394468 is a valid ID)
This worked previously.
If this feature is being dropped in new pacmc, README should be updated as it still mentions this method in the "Install a mod" section.
It would be nice if this was possible though. Example use case is migration from the old pacmc to the new one: I saved list of IDs from old mods directory and now would like to just pass those IDs to new pacmc.
Yea, the title says it. I think it could be easy to implement because the addonId and fileId is given in the url. Example: curseforge://install?addonId=409301&fileId=3686441
This is a super useful feature I use a lot with pip in python development. Being able to send a friend a small requirements.txt file and have them run a simple "pacmc install -r requirements.txt" to download all required mods in their required versions for our private server would be incredibly helpful.
Hello, first off I want to say I am impressed and extremely happy with this project.
I am setting up a new fabric server for my friends and I, and am planning to use pacmc to automate the mod-updating process at every morning restart. One small issue, is that for mods I know work for 1.18.1, but just haven't updated on curseforge or modrinth to say that they do, there is no way for me to install them with pacmc. My suggestion is adding a --force
or similar flag to the install command, and possibly issuing a warning to the user about reliability when using it.
Another small request while I'm here is to add support for mods from github repos, like carpetmod for example.
Other than that, keep up the amazing work, and have a wonderful holiday!
This would be useful with Quilt since some mods report FAPI as a dependency when QSL serves FAPI.
You can only search
for mods for a specific version of Minecraft with the -g
option.
The -g
option should also work when installing mods.
Archive name: "client"
Example:
> pacmc search journeymap -a client
Here is a List of all "journeymap" related mods that are compatible with your "client" archive version (1.12.2)
...
I'd like to set my default archive to $HOME/.local/share/multimc/instances/1.18.2/.minecraft
, so that when I run pacmc install sodium
the jar will automatically be placed in $HOME/.local/share/multimc/instances/1.18.2/.minecraft/mods
. I am unsure how to do this in pacmc's current state.
I believe this would require some kind of change to line 59 in pacmc/pacmc-cli/src/main/kotlin/net/axay/pacmc/commands/Install.kt
:
private val archiveName by option("-a", "--archive", help = "The archive where the mod should be installed").default(".minecraft")
This requires an intermediate representation of file and project responses - because the two APIs are different.
The troublesome mod from #41 is now available from Modrinth. Installing it gives:
+ add modrinth/entityculling (1.5.1-fabric-1.18)
+ add modrinth/fabric-api (0.53.4+1.18.2) (dependency)
Which is kinda correct but not really, because I already have fabric-api
installed from curseforge as a dependency of other mods from there. I think it might not even be possible to accurately say if two mods from different sources are in fact the same mod. (Well, mod name will be most likely the same, but you never know)
Moreover, pacmc doesn't allow to uninstall this additional mod afterwards, as it's a required dependency.
This is somewhat related to #20.
Pacmc now asks if the list of the mods to be installed is correct. If it asked after resolving dependencies it would be possible to select which mods from the list should actually be installed. (That would of course require additional feature to select mods, now you can only answer y/n)
When installing a mod from modrinth, i get this error
Failed to deserialize the response to the following request: https://api.modrinth.com/api/v1/mod/aXf2OSFU/version
Unexpected JSON token at offset 867: Unexpected 'null' value instead of string literalJSON input: .....endencies":[{"version_id":null,"project_id":"mOgUt4GM","depe.....
(in this case i used pacmc install "ok zoomer"
)
The instructions in the README to install pacmc using paru are incorrect and will not work. paru install pacmc
will search the Arch and AUR repositories for a package with the keywords "install" and "pacmc", of which there are none. The correct command would be either paru pacmc
, which would interactively search and install pacmc with similar behavior to pacmc itself, or paru -S pacmc
which would install pacmc directly similar to how pacmc will install mods using a mod ID.
e.g. installing All of Fabric 5 through pacmc
A command which disabled or enables mods
Got a timeout installing Presence Footsteps 1.4.0
❯ pacmc install Presence
Searching for installable mods matching 'Presence'
1) modrinth/Presence Footsteps [rcTfTZr3] by Sollace
..An Overly complicated Sound Mod...
2) modrinth/Fabripresence [vIWqtF8n] by arencos not available for 1.18.1
Configurable Discord Rich Presence for Fabric
3) modrinth/MoreCommands [duhqx1QT] by planetteamspeakk not available for 1.18.1
Adds 79 commands, many tweaks, Discord Rich Presence support, the ability to sit on stairs, really cool RAINBOWS and more!
4) curseforge/Rich Presence Mod [509434] by hotlava02 not available for 1.18.1
Highly customizable fabric mod to show rich presence in Discord with Minecraft info.
5) curseforge/Presence Footsteps [334259] by S0llace
An overly complicated sound mod
Which mod do you want to install? (1, 2, 3, 4, 5) 1
Installing the mod at /home/cameron/.minecraft/mods
Downloading modrinth/Presence Footsteps 1.4.0
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 15000 ms
at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:191)
at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:161)
at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:507)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
at kotlinx.coroutines.DefaultExecutor.run(DefaultExecutor.kt:69)
at java.base/java.lang.Thread.run(Thread.java:833)
An error occured, Please open an issue with the above stack trace at https://github.com/jakobkmar/pacmc/issues/new
❯ pacmc debug
pacmc version 0.4.2
dataLocalDir: /home/cameron/.local/share/pacmc
databaseDir: /home/cameron/.local/share/pacmc/db1
databaseDir (canonical): /home/cameron/.local/share/pacmc/db1
Your OS: LINUX
Java version: 17.0.1+12
❯ pacmc list
The archive '.minecraft' at /home/cameron/.minecraft/mods contains the following mods:
→ Illuminations 🔥 [curseforge/292908]
A client mod that adds fireflies and various glow-in-the-dark ambient particles to your world.
→ Physics Mod [curseforge/442735]
Adds physics to Mobs and Blocks!
→ Farsight[Forge/Fabric] [curseforge/495693]
See far chunks on clientside, even if the server has low view distance
→ Effective 💦 [curseforge/556381]
A client-side mod adding ambient and environmental interaction effects to enhance immersion.
→ Sodium [modrinth/AANobbMI]
Modern rendering engine and client-side optimization mod for Minecraft
→ Iris Shaders [modrinth/YL57xq9U]
A modern shaders mod for Minecraft intended to be compatible with existing OptiFine shader packs
→ Presence Footsteps [modrinth/rcTfTZr3]
..An Overly complicated Sound Mod...
→ LambDynamicLights [modrinth/yBW8D80W]
A dynamic lights mod for Fabric.
→ Fabric API [curseforge/306612] (dependency)
Core API library for the Fabric toolchain
Sometimes the dependencies of mods are just wrong. For example the mod Syncmatica has Malilib and Litematica as dependencies, but both of those are not required on a server just like the setup instructions say. I'm sure there are many more cases of mods dependencies being wrong with mods that are for both the client and the server.
The optimal solution for this would be adding an option to disable dependency management per mod. Just having an option to disable dependency management completely would be a really good solution as well. I think that managing mods' dependencies manually is really easy, because most mods have 0-2 dependencies.
Edit: Removed paragraph about my dumb old way to manage server and client mods.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/elvispereira/.cache/Kodein-DB/0.9.0-beta/libkodein-leveldb-jni.so: /home/elvispereira/.cache/Kodein-DB/0.9.0-beta/libkodein-leveldb-jni.so: cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64 .so on a AARCH64 platform)
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389)
at java.base/java.lang.Runtime.load0(Runtime.java:755)
at java.base/java.lang.System.load(System.java:1953)
at org.kodein.db.leveldb.jvm.AbstractLevelDBJvmLoader.load(AbstractLevelDBJvmLoader.kt:78)
at org.kodein.db.leveldb.jvm.LevelDBJvm.<clinit>(LevelDBJvm.kt:29)
at org.kodein.db.impl.kv.KeyValueDBJvm.getLdbFactory(KeyValueDBJvm.kt:11)
at org.kodein.db.impl.kv.AbstractKeyValueDBFactory.open(AbstractKeyValueDBFactory.kt:20)
at org.kodein.db.impl.kv.AbstractKeyValueDBFactory.open(AbstractKeyValueDBFactory.kt:12)
at org.kodein.db.impl.data.AbstractDataDBFactory.open(AbstractDataDBFactory.kt:20)
at org.kodein.db.impl.data.AbstractDataDBFactory.open(AbstractDataDBFactory.kt:12)
at org.kodein.db.impl.model.AbstractModelDBFactory.open(AbstractModelDBFactory.kt:29)
at org.kodein.db.impl.model.AbstractModelDBFactory.open(AbstractModelDBFactory.kt:9)
at org.kodein.db.impl.AbstractDBFactory.open(AbstractDBFactory.kt:26)
at org.kodein.db.impl.AbstractDBFactory.open(AbstractDBFactory.kt:10)
at org.kodein.db.impl.DefaultKt.open(default.kt:7)
at net.axay.pacmc.storage.DatabaseKt.<clinit>(Database.kt:14)
at net.axay.pacmc.commands.Init$run$1.invokeSuspend(Init.kt:25)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
That's the result of using pacmc init
version 0.4.2 on Ubuntu 20.04.3 (aarch64)
JDK
java -version
openjdk version "17" 2021-09-14 LTS
OpenJDK Runtime Environment Zulu17.28+13-CA (build 17+35-LTS)
OpenJDK 64-Bit Server VM Zulu17.28+13-CA (build 17+35-LTS, mixed mode)
The first mod I tried searching for was https://www.curseforge.com/minecraft/mc-mods/playerex, however pacmc search playerex
gives no results. Other search queries (like pacmc search minihud
) do work, though.
My archive name: "client"
Subcommand in question: "list"
Expectation:
Upon specifying archive to list the contents of, receive a list of contents of archive. basic. simple. intuitive.
What happens instead:
> pacmc list client
Usage: pacmc list [OPTIONS]
Error: Got unexpected extra argument (client)
> pacmc list
The archive '.minecraft' contains the following content:
The given archive '.minecraft' does not exist
Try running pacmc archive init to automatically detect the '.minecraft' folder.
In yay
, all the user has to do to install a package is type yay [package]
, then select one of the packages listed by typing its respective number.
For example:
yay minecraft
yields:
Notice: the first search result is displayed last, at the bottom.
In the current version of pacmc
, users must first find the mod ID of the mod they are looking for with pacmc search [mod-name]
, then actually install it by running pacmc install [mod-id]
.
If users could simply install a mod in one step with something like pacmc get [mod-name]
, it would make pacmc
much easier to use.
Is this already planned? I noticed the markup for the output of pacmc search
does look very similar to yay's output.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.