Coder Social home page Coder Social logo

magneticflux- / fabric-mumblelink-mod Goto Github PK

View Code? Open in Web Editor NEW
50.0 6.0 13.0 404 KB

A Fabric mod that connects to the MumbleLink plugin.

License: GNU Lesser General Public License v3.0

Kotlin 78.44% Java 21.56%
fabric-mod mumble-urls player minecraft-mod minecraft mumble-client mumble-link jna hacktoberfest

fabric-mumblelink-mod's Introduction

fabric-mumblelink-mod

A Fabric mod that connects to the Mumble Link plugin.

Current features:

  • Positional audio link to Mumble
  • Separation between different dimensions
  • Automatic log-in to a server-provided Mumble server
  • Separation of team comms / server comms / etc.

Planned features:

  • None needed? Please open an issue if you have a use case not covered yet!

For players

Mumble

  1. Install and start Mumble
  2. Enable "Link to Game and Transmit Position" in Mumble
  3. Join a Mumble server
  4. Join a Minecraft world!

Troubleshooting (IMPORTANT)

If you have issues, try these steps first: https://github.com/magneticflux-/fabric-mumblelink-mod/wiki/Troubleshooting

TeamSpeak

  1. Install and start TeamSpeak
  2. Enable the CrossTalk plugin in TeamSpeak
  3. Join a Teamspeak server
  4. Join a Minecraft world!

For server operators

The plugin is not required on servers, but having it on the server will allow clients to automatically join a VoIP server of your choosing.

Configuration

Trivial

Trivial configuring of the server may be done by specifying the host and port. Clients will simply join the root of the VoIP server. For dimension, team, and server separation, see below.

Dimension separation may also be accomplished by users setting the "Y-Axis multiplier for dimension IDs" to a value above 512. This makes users in the Nether and End appear 512 blocks below and above users in the Overworld, respectively. This approach is not recommended for larger servers, but it may work fine for servers with < 5 people.

Non-trivial

Before going any further, make sure you understand RFC 3986! Most of the non-trivial configuration is done through the use of templated strings. The userinfo, path, query, and fragment strings of the URI sent to clients to be opened are template strings, so parts of them may be replaced by user- and server-specific information. Below is a table of available template values:

Template index Value source Example values
{0} Full dimension ID "Minecraft Overworld", "Minecraft The Nether", "Minecraft The End", "Simplevoidworld Void", "Ezwastelands Wastelands"
{1} Dimension namespace "Minecraft", "Simplevoidworld", "Ezwastelands"
{2} Dimension path "Overworld", "The Nether", "The End"
{3} Team name "Red Team", "Team 1", ""

Some example paths:

  • /My Server/{2}
    • This routes users to a root channel /My Server and a subchannel that matches their dimension. The server should have channels /My Server/Overworld, /My Server/The Nether, and /My Server/The End to support the vanilla Minecraft dimensions.
  • /PvP Teams/{2}/{3}
    • This routes users to a root channel /PvP Teams, a subchannel that matches the dimension, and a sub-subchannel that matches their team name. The server should have channels for all combinations of dimension and team.

If a server does not have a channel for a certain path, the user will remain in their previous channel until their client receives a path that exists.

For more reference on Mumble URIs, see their wiki page.

For more reference on TeamSpeak URIs, see their FAQ.

More Channel Path Details

In Mumble, the channel path should go in the URI path.

In TeamSpeak, the channel path should go in a query parameter called channel.

Security considerations

Servers with this mod will be able to open Mumble or TeamSpeak URIs through your client. Servers cannot open arbitrary URLs, because only the required information (userinfo, host, port, path, query, and fragment) is sent to the client. It is important to note that a full URL is not sent to the client; the scheme is hard-coded. Only vulnerabilities in Mumble or TeamSpeak may be exploited, and only by servers trusted by the player.

The client-side URI construction is this snippet from ClientMumbleLinkMod.kt:

val uri = URI(voipClient.scheme, userinfo, host, port, path, query, fragment)

If you feel generous or want to encourage my work, you can throw a few dollars my way here:

ko-fi

paypal

fabric-mumblelink-mod's People

Contributors

buiawpkgew1 avatar clrxbl avatar magneticflux- avatar shipkit-org avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

fabric-mumblelink-mod's Issues

Feature Request - ask users to join VoIP in chat when entering server

Currently users can either always open a provided server, or never, and switching between the two requires a restart. I think it would be more convenient if a request were sent over chat asking the user if they wish to join the VoIP server. Then they could click on the link if they want to join or ignore it if they don't.

Error when entering the world

Failed to handle packet fabric-mumblelink-mod:broadcast_mumble_url! java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform! at java.desktop/java.awt.Desktop.checkActionSupport(Desktop.java:380) at java.desktop/java.awt.Desktop.browse(Desktop.java:524) at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.packetConsumer(ClientMumbleLinkMod.java:48) at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.access$packetConsumer(ClientMumbleLinkMod.java:35) at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$1.invoke(ClientMumbleLinkMod.java:56) at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$1.invoke(ClientMumbleLinkMod.java:35) at com.skaggsm.mumblelinkmod.ClientMumbleLinkModKt$sam$net_fabricmc_fabric_api_network_PacketConsumer$0.accept(ClientMumbleLinkModKt.java) at net.fabricmc.fabric.impl.networking.PacketRegistryImpl.accept(PacketRegistryImpl.java:192) at net.minecraft.class_634.handler$zzc000$onCustomPayload(class_634.java:2482) at net.minecraft.class_634.method_11152(class_634.java) at net.minecraft.class_2658.method_11457(class_2658.java:65) at net.minecraft.class_2658.method_11054(class_2658.java:10) at net.minecraft.class_2535.method_10759(class_2535.java:158) at net.minecraft.class_2535.method_10770(class_2535.java:149) at net.minecraft.class_2535.channelRead0(class_2535.java:54) at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) at io.netty.channel.local.LocalChannel.readInbound(LocalChannel.java:304) at io.netty.channel.local.LocalChannel.finishPeerRead0(LocalChannel.java:446) at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:51) at io.netty.channel.local.LocalChannel$5.run(LocalChannel.java:404) at io.netty.channel.DefaultEventLoop.run(DefaultEventLoop.java:54) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) at java.base/java.lang.Thread.run(Thread.java:834)

When I try to build this I get an error and I couldnt fix this

I'm trying to build this because I tried to modify it a bit trying to make it compitable with forge version of this mod but when I try to build it it just gives me an error, I googled it a lot but couldn't find anything on google so I wanted to make an issue here because I don't know what to do

    @Inject(method = "onPlayerConnect", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
    ^
C:\Users\.\Downloads\Compressed\fabric-mumblelink-mod-develop\fabric-mumblelink-mod-0.7.5\src\main\java\com\skaggsm\mumblelinkmod\mixin\MixinServerPlayerEntity.java:17: error: No obfuscation mapping for @Inject target moveToWorld
    @Inject(method = "moveToWorld", at = @At(value = "RETURN"))
    ^
C:\Users\.\Downloads\Compressed\fabric-mumblelink-mod-develop\fabric-mumblelink-mod-0.7.5\src\main\java\com\skaggsm\mumblelinkmod\mixin\MixinServerScoreboard.java:24: error: No obfuscation mapping for @Inject target addPlayerToTeam
    @Inject(method = "addPlayerToTeam", at = @At(value = "RETURN", ordinal = 0))
    ^
C:\Users\.\Downloads\Compressed\fabric-mumblelink-mod-develop\fabric-mumblelink-mod-0.7.5\src\main\java\com\skaggsm\mumblelinkmod\mixin\MixinServerScoreboard.java:29: error: No obfuscation mapping for @Inject target removePlayerFromTeam
    @Inject(method = "removePlayerFromTeam", at = @At("TAIL"))
    ^
C:\Users\.\Downloads\Compressed\fabric-mumblelink-mod-develop\fabric-mumblelink-mod-0.7.5\src\main\java\com\skaggsm\mumblelinkmod\mixin\MixinServerScoreboard.java:34: error: No obfuscation mapping for @Inject target updateRemovedTeam
    @Inject(method = "updateRemovedTeam", at = @At("TAIL"))
    ^
C:\Users\.\Downloads\Compressed\fabric-mumblelink-mod-develop\fabric-mumblelink-mod-0.7.5\src\main\java\com\skaggsm\mumblelinkmod\mixin\MixinServerScoreboard.java:20: warning: Unable to locate obfuscation mapping for @Shadow field
    @Shadow
    ^

Mumble positional audio settings

Does the mod override mumble's settings for positional audio, or do you have to configure the max audio distance per-client? If the latter is the case, people could easily "cheat" by hearing everyone.
If you do have to configure it manually, what are the recommended settings?

(screenshot of the default settings)
image

mumbleAutoLaunchOption argument crashes on MacOS

I installed the mod onto my server, and setup where users will automatically connect to my mumble server when connecting to my minecraft server... Except my friends who are on mac will crash because of how it handles auto launching. Their game will just freeze when it says "Joining world". So far this is only a mac issue, as I am running linux (Arch Linux), and my other friends who are using windows 10 are fine. This is his log (He had to kill his minecraft process as it was stuck):

[19:46:25] [main/INFO]: Loading for game Minecraft 1.16.1
[19:46:26] [main/INFO]: [FabricLoader] Loading 57 mods: [email protected]+eae12eb802, [email protected], [email protected]+3fa9f7c502, [email protected]+build.204, [email protected], [email protected], [email protected]+045df74f02, [email protected]+a2d21ddd02, [email protected]+a71b305302, [email protected]+fe81e12502, [email protected]+12a8474c02, [email protected]+b7f9825d02, [email protected]+eae12eb802, [email protected]+b7084faa02, [email protected], [email protected]+c6a8ea8902, [email protected]+013e49d202, [email protected], [email protected]+5a0f9a6002, [email protected], [email protected]+386eb69e02, [email protected]+build.384-1.16.1, [email protected]+0a6f2a7002, [email protected]+e00ecb5f02, [email protected], [email protected]+97324d1102, [email protected]+b50ffc7b02, [email protected], [email protected]+5ce5339802, [email protected]+build.7, [email protected]+55e0cc5f02, [email protected], [email protected]+34d6c87102, [email protected]+059ea86602, [email protected]+b7f9825d02, [email protected]+16acbe5b02, [email protected]+7066030f02, [email protected]+build.1, [email protected]+5341049002, [email protected]+346247d702, [email protected]+f404f3be02, [email protected], [email protected], [email protected], [email protected]+f41e209802, [email protected], [email protected]+059ea86602, [email protected]+a4c57d8e02, [email protected]+7dba2d6c02, [email protected]+52d3083602, [email protected]+b764ce9902, [email protected]+16acbe5b02, [email protected]+dfdb52d602, [email protected]+438f963602, [email protected]+a2d21ddd02, [email protected], [email protected]
[19:46:26] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8 Source=file:/Applications/MultiMC.app/Contents/MacOS/libraries/net/fabricmc/sponge-mixin/0.8+build.18/sponge-mixin-0.8+build.18.jar Service=Knot/Fabric Env=CLIENT
[19:46:26] [main/INFO]: Loaded configuration file for Sodium (38 options available, 0 user overrides)
[19:46:26] [main/INFO]: Sodium has been successfully discovered and initialized -- your game is now faster!
[19:46:26] [main/INFO]: Loaded configuration file for Lithium: 54 options available, 0 override(s) found
[19:46:26] [main/WARN]: @Mixin target net/minecraft/class_3898$class_3208 is public in fabric-networking-v0.mixins.json:MixinEntityTracker and should be specified in value
[19:46:31] [main/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', name='PROD'
[19:46:31] [main/INFO]: Setting user: Scarytheglitch
[19:46:32] [main/INFO]: [Indigo] Different rendering plugin detected; not applying Indigo.
[19:46:32] [main/INFO]: Backend library: LWJGL version 3.2.2 build 10
[19:46:34] [main/INFO]: Reloading ResourceManager: Default, Fabric Renderer API (v1), Logical Zoom, Fabric Key Bindings (v0), Fabric Loader, Lithium, Fabric Containers (v0), Fabric Object Builder API (v1), Fabric Game Rule API (v1), Fabric API Base, Fabric Rendering Data Attachment (v1), Fabric Textures (v0), Fabric Rendering Fluids (v1), Fabric BlockRenderLayer Registration (v1), Fabric Lifecycle Events (v1), Sodium, Fabric Renderer Registries (v1), Fabric Loot Tables (v1), Fabric API, Fabric Networking (v0), Fabric Screen Handler API (v1), Fabric Networking Block Entity (v0), Phosphor, Fabric Tool Attribute API (v1), Fabric Renderer - Indigo, Fabric Biomes (v1), Fabric Crash Report Info (v1), Fabric Item API (v1), Fabric Events Interaction (v0), Fabric Language Kotlin, Fabric Rendering (v0), Fabric Rendering (v1), Fabric Key Binding API (v1), Cloth Config v4, Auto Config v1 Updated, Fabric Resource Loader (v0), Fabric Content Registries (v0), Fabric Tag Extensions (v0), Fabric Registry Sync (v0), Fabric Mining Levels (v0), Fabric Events Lifecycle (v0), Fabric Models (v0), Fabric Item Groups (v0), Fabric Object Builders (v0), MumbleLink
[19:46:49] [main/INFO]: OpenAL initialized.
[19:46:49] [main/INFO]: Sound engine started
[19:46:50] [main/INFO]: Created: 1024x1024x4 minecraft:textures/atlas/blocks.png-atlas
[19:46:50] [main/INFO]: Created: 256x128x4 minecraft:textures/atlas/signs.png-atlas
[19:46:50] [main/INFO]: Created: 1024x512x4 minecraft:textures/atlas/banner_patterns.png-atlas
[19:46:50] [main/INFO]: Created: 1024x512x4 minecraft:textures/atlas/shield_patterns.png-atlas
[19:46:50] [main/INFO]: Created: 256x256x4 minecraft:textures/atlas/chest.png-atlas
[19:46:50] [main/INFO]: Created: 512x256x4 minecraft:textures/atlas/beds.png-atlas
[19:46:50] [main/INFO]: Created: 512x256x4 minecraft:textures/atlas/shulker_boxes.png-atlas
[19:46:51] [main/INFO]: Created: 256x256x0 minecraft:textures/atlas/particles.png-atlas
[19:46:51] [main/INFO]: Created: 256x256x0 minecraft:textures/atlas/paintings.png-atlas
[19:46:51] [main/INFO]: Created: 256x128x0 minecraft:textures/atlas/mob_effects.png-atlas
[19:47:01] [main/INFO]: Connecting to smp.wigoftime.net, 25608
[19:47:03] [main/INFO]: Started 8 worker threads
[19:47:03] [main/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', name='PROD'
Process was killed by user.

[Question] Enable on TeamSpeak ?

Hello,
I have read your documentation which is very complete, however I am asking myself a question to which I still do not have the answer: Does the MumbleLink mod work for us TeamSpeak?

Thank you for your help ! And congratulations to you for this work !

  • TheCalypso -

Mumblelink fabric and mumblelink forge

Hello,
I play with friends on a minecraft server with mumblelink.
But I have a problem. "Positional audio" only work between two versions of mumblelink fabric or two versions of mumblelink forge but not between fabric and forge. Is this an issue or is it on purpose?

Crash Upon Loading Singleplayer World

Describe The Bug
Whenever I start a singleplayer world (newly created or old world), my game crashes because "Desktop API is not supported on the current platform"

To Reproduce Steps

  • Start Minecraft
  • Open a singleplayer world
  • Game will crash with the outputted error

Version Information

  • OS: Windows 10 Pro (10.0.19042)
  • Java Version: AdoptOpenJDK 11.0.10 amd64
  • Minecraft Version: 1.16.5
  • Minecraft Fabric Loader Version: 0.11.1
  • Mod Version: 0.7.5

My Mods

  • 5zig-Reborn-1.16.1-b251
  • architectury-1.5.112-fabric
  • authme-1.16.3-1.4.0
  • betterf3-1.1.2+1.16.2
  • cloth-api-1.4.9
  • config-2-4.8.3
  • CraftPresence-Fabric-1.16.5-Release-1.7.6 (1)
  • fabric-api-0.30.0+1.16
  • fabric-mumblelink-mod-0.7.5
  • light-overlay-5.6.1
  • MinecraftCapes+Fabric+1.16.5-v10
  • modmenu-1.16.7
  • multiconnect-1.3.34
  • okzoomer-4.0.1+1.16.2
  • optifabric-1.9.2
  • preview_OptiFine_1.16.5_HD_U_G7_pre8
  • RoughlyEnoughItems-5.9.173
  • ViaBackwards-3.3.0-21w06b
  • ViaFabric-0.3.1-SNAPSHOT+build-708.1-mc-1.16
  • ViaRewind-1.5.3
  • ViaVersion-3.3.0-21w06b

Additional Context
All of my mods work together when MumbleLink is not loaded. I can go through each mod to see if I can find the problem, but that will take quite a bit of time, which I do not have at the time of writing this issue. The outputted error link is: https://paste.ee/p/Ncttt

Crash in 1.16 Pre8

OS: Fedora 32
Minecraft Version: 1.16-pre8
Mod Version: 0.6.1
Fabric API Version: 0.12.4+build.365-1.16
Fabric Loader Version: 0.8.7+build.201

Crash Report:

[17:36:29] [main/FATAL]: Mixin apply failed fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity -> net.minecraft.class_3222: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException Critical injection failure: @Inject annotation on onChangeDimension could not find any targets matching 'Lnet/minecraft/class_3222;method_5731(Lnet/minecraft/class_2874;)Lnet/minecraft/class_1297;' in net.minecraft.class_3222. Using refmap fabric-mumblelink-mod-refmap.json [PREINJECT Applicator Phase -> fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity -> Prepare Injections ->  -> handler$zen000$onChangeDimension(Lnet/minecraft/class_2874;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfoReturnable;)V -> Parse]
org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @Inject annotation on onChangeDimension could not find any targets matching 'Lnet/minecraft/class_3222;method_5731(Lnet/minecraft/class_2874;)Lnet/minecraft/class_1297;' in net.minecraft.class_3222. Using refmap fabric-mumblelink-mod-refmap.json [PREINJECT Applicator Phase -> fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity -> Prepare Injections ->  -> handler$zen000$onChangeDimension(Lnet/minecraft/class_2874;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfoReturnable;)V -> Parse]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.findMethods(InjectionInfo.java:543) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:280) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:267) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:259) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.injection.struct.CallbackInjectionInfo.<init>(CallbackInjectionInfo.java:46) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_252]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_252]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:139) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:595) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1236) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:1033) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:388) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:320) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:345) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:570) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:191) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:178) ~[sponge-mixin-0.8+build.18.jar:0.8+build.18+unknown-b18.git-unknown]
	at org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy.transformClassBytes(FabricMixinTransformerProxy.java:23) ~[fabric-loader-0.8.7+build.201.jar:0.8+build.18+unknown-b18.git-unknown]
	at net.fabricmc.loader.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:157) ~[fabric-loader-0.8.7+build.201.jar:?]
	at net.fabricmc.loader.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:143) ~[fabric-loader-0.8.7+build.201.jar:?]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_252]
	at java.lang.invoke.MethodHandleNatives.resolve(Native Method) ~[?:1.8.0_252]
	at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975) ~[?:1.8.0_252]
	at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000) ~[?:1.8.0_252]
	at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394) ~[?:1.8.0_252]
	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750) ~[?:1.8.0_252]
	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477) ~[?:1.8.0_252]
	at net.minecraft.class_1299.<clinit>(class_1299.java:169) ~[intermediary-minecraft-1.16-pre8-client.jar:?]
	at net.minecraft.class_2378.method_10252(class_2378.java:171) ~[intermediary-minecraft-1.16-pre8-client.jar:?]
	at net.minecraft.class_2378.method_29110(class_2378.java:220) ~[intermediary-minecraft-1.16-pre8-client.jar:?]
	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) [?:1.8.0_252]
	at net.minecraft.class_2378.<clinit>(class_2378.java:219) [intermediary-minecraft-1.16-pre8-client.jar:?]
	at net.minecraft.class_2966.method_12851(class_2966.java:41) [intermediary-minecraft-1.16-pre8-client.jar:?]
	at net.minecraft.client.main.Main.main(Main.java:137) [intermediary-minecraft-1.16-pre8-client.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_252]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_252]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_252]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_252]
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:192) [fabric-loader-0.8.7+build.201.jar:?]
	at net.fabricmc.loader.launch.knot.Knot.init(Knot.java:140) [fabric-loader-0.8.7+build.201.jar:?]
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:26) [fabric-loader-0.8.7+build.201.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_252]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_252]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_252]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_252]
	at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:196) [NewLaunch.jar:?]
	at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:231) [NewLaunch.jar:?]
	at org.multimc.EntryPoint.listen(EntryPoint.java:143) [NewLaunch.jar:?]
	at org.multimc.EntryPoint.main(EntryPoint.java:34) [NewLaunch.jar:?]
Exiting with -1
org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity] from phase [DEFAULT] in config [fabric-mumblelink-mod.mixins.json] FAILED during APPLY
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:643)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:595)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:356)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:191)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:178)
	at org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy.transformClassBytes(FabricMixinTransformerProxy.java:23)
	at net.fabricmc.loader.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:157)
	at net.fabricmc.loader.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:143)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
	at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975)
	at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000)
	at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394)
	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750)
	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
	at net.minecraft.class_1299.<clinit>(class_1299.java:169)
	at net.minecraft.class_2378.method_10252(class_2378.java:171)
	at net.minecraft.class_2378.method_29110(class_2378.java:220)
	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
	at net.minecraft.class_2378.<clinit>(class_2378.java:219)
	at net.minecraft.class_2966.method_12851(class_2966.java:41)
	at net.minecraft.client.main.Main.main(Main.java:137)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:192)
	at net.fabricmc.loader.launch.knot.Knot.init(Knot.java:140)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:26)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:196)
	at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:231)
	at org.multimc.EntryPoint.listen(EntryPoint.java:143)
	at org.multimc.EntryPoint.main(EntryPoint.java:34)
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @Inject annotation on onChangeDimension could not find any targets matching 'Lnet/minecraft/class_3222;method_5731(Lnet/minecraft/class_2874;)Lnet/minecraft/class_1297;' in net.minecraft.class_3222. Using refmap fabric-mumblelink-mod-refmap.json [PREINJECT Applicator Phase -> fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity -> Prepare Injections ->  -> handler$zen000$onChangeDimension(Lnet/minecraft/class_2874;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfoReturnable;)V -> Parse]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.findMethods(InjectionInfo.java:543)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:280)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:267)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:259)
	at org.spongepowered.asm.mixin.injection.struct.CallbackInjectionInfo.<init>(CallbackInjectionInfo.java:46)
	at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:139)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:595)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1236)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:1033)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:388)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:345)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:570)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	... 34 more
Failed to start Minecraft:
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:196)
	at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:231)
	at org.multimc.EntryPoint.listen(EntryPoint.java:143)
	at org.multimc.EntryPoint.main(EntryPoint.java:34)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:194)
	at net.fabricmc.loader.launch.knot.Knot.init(Knot.java:140)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:26)
	... 8 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:192)
	... 10 more
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:364)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:191)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:178)
	at org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy.transformClassBytes(FabricMixinTransformerProxy.java:23)
	at net.fabricmc.loader.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:157)
	at net.fabricmc.loader.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:143)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
	at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975)
	at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000)
	at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394)
	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750)
	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
	at net.minecraft.class_1299.<clinit>(class_1299.java:169)
	at net.minecraft.class_2378.method_10252(class_2378.java:171)
	at net.minecraft.class_2378.method_29110(class_2378.java:220)
	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
	at net.minecraft.class_2378.<clinit>(class_2378.java:219)
	at net.minecraft.class_2966.method_12851(class_2966.java:41)
	at net.minecraft.client.main.Main.main(Main.java:137)
	... 15 more
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity] from phase [DEFAULT] in config [fabric-mumblelink-mod.mixins.json] FAILED during APPLY
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:643)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:595)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:356)
	... 34 more
Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @Inject annotation on onChangeDimension could not find any targets matching 'Lnet/minecraft/class_3222;method_5731(Lnet/minecraft/class_2874;)Lnet/minecraft/class_1297;' in net.minecraft.class_3222. Using refmap fabric-mumblelink-mod-refmap.json [PREINJECT Applicator Phase -> fabric-mumblelink-mod.mixins.json:MixinServerPlayerEntity -> Prepare Injections ->  -> handler$zen000$onChangeDimension(Lnet/minecraft/class_2874;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfoReturnable;)V -> Parse]
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.findMethods(InjectionInfo.java:543)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:280)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:267)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.<init>(InjectionInfo.java:259)
	at org.spongepowered.asm.mixin.injection.struct.CallbackInjectionInfo.<init>(CallbackInjectionInfo.java:46)
	at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:139)
	at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:595)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1236)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:1033)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:388)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:345)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:570)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	... 34 more
Process exited with code 255.

Gracefully handle invalid MumbleLink packet

Log spam:

[19:37:14] [Netty Local Client IO #0/WARN]: Failed to handle packet fabric-mumblelink-mod:broadcast_mumble_url!
java.net.URISyntaxException: Expected authority at index 9: mumble://
	at java.net.URI$Parser.fail(URI.java:2936) ~[?:?]
	at java.net.URI$Parser.failExpecting(URI.java:2942) ~[?:?]
	at java.net.URI$Parser.parseHierarchical(URI.java:3186) ~[?:?]
	at java.net.URI$Parser.parse(URI.java:3137) ~[?:?]
	at java.net.URI.<init>(URI.java:708) ~[?:?]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$1.accept(ClientMumbleLinkMod.kt:39) ~[fabric-mumblelink-mod-0.4.0.jar:?]
	at net.fabricmc.fabric.impl.network.PacketRegistryImpl.accept(PacketRegistryImpl.java:173) [1563bb23-ebda-44bf-b6d8-1005d07d31d2.jar:?]
	at net.minecraft.class_634.handler$zzc000$onCustomPayload(class_634.java:2321) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_634.method_11152(class_634.java) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_2658.method_11457(class_2658.java:62) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_2658.method_11054(class_2658.java:10) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_2535.method_10759(class_2535.java:157) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_2535.method_10770(class_2535.java:148) [intermediary-minecraft-1.14.4-client.jar:?]
	at net.minecraft.class_2535.channelRead0(class_2535.java:53) [intermediary-minecraft-1.14.4-client.jar:?]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.local.LocalChannel.readInbound(LocalChannel.java:304) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.local.LocalChannel.finishPeerRead0(LocalChannel.java:446) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:51) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.local.LocalChannel$5.run(LocalChannel.java:404) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.DefaultEventLoop.run(DefaultEventLoop.java:54) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at java.lang.Thread.run(Thread.java:835) [?:?]

Crashes/Doesn't Open

The game crashed whilst initializing game
Error: java.lang.RuntimeException: Could not execute entrypoint stage 'client' due to errors!

I get this message when trying to open Minecraft

The mod its not working.

So, I setup everything right, I checked many times and many tutorials, It worked fine once and now it just stopped working, I am using the fabric version but I am not getting any link message on mumble too.

Crash when Loading World

Everything seemed to be going fine (I was able to edit the settings and such), until I tried to load a world, where it crashed with mouseclick and rendering errors?

https://pastebin.com/ZTrWWRPc

Something I found odd was that, upon adding Mumble Link, I apparently gained an extra 8 mods to my load order, as the loaded mods went from 36 to 44.

Support dimension channel switching on client-side

The client should be able to send dimension switching URIs by itself if the server doesn't send them. This would require per-client setup instead of a centralized server setup, but it wouldn't depend on ownership of the server.

Not working with OptiFine + OptiFabric

Game hangs for several minutes when launching this mod with OptiFine + OptiFabric (and never finishes from what I can tell). Here are the logs. Running macOS using MultiMC as the launcher. Game runs after disabling MumbleLink or after disabling OptiFine + OptiFabric.

1.16 crashes on startup

When loading up minecraft fabric with the mumble link mod installed, I'm met with this error message.

Could not find required mod: fabric-mumblelink-mod requires {fabric @ [*]}
Creating Empty clause ?

Is there a way of fixing this?

Request - Port to Spigot

Hi,
I wanted to ask, if you could make a port to spigot aswell.
I love your plugin and use it with pleasure but I also have spigot servers and there are no plugins out there for it which works. All plugins are only for Dirscord. I knew a bunch of server owners which would very happy if you could port it to spigot.

Thank you.

Regards X00LA

"Invalid payload" error while connecting to Spigot server

Hi first I'm glad to see an active repo for MumbleLink on MC even more using Fabric ๐Ÿ‘

"Bukkit" is complaining about message size over 32 characters, any idea where does it come from ?
I don't understand how this mod could throw an error on the server side given that it doesn't need that many informations outside of position, right ?

Also of course it works properly on solo but I didn't tried it on LAN...

Logs are attached

client.log
server.log

I can hear everyone

I can hear everyone in mumble, but everyone else can only hear me when im next to them The mumblink mod is linking, so i know it's not that issue. Can't figure out why it's doing this.

Mod seems very temperamental with Teamspeak.

A friend and I have been testing this and trying to get it to work on a server for a while now. The mod is installed both in the server and in our clients. It's set up to connect to the host server and host port and is set to connect to Teamspeak. Teamspeak has 3D audio enabled and any mic modification settings disabled. Sometimes it works, sometimes it doesn't. But it only ever works for me if it does work. Usually restarting the game and Teamspeak, then joining the server and opening and joining the Teamspeak server after joining the server is what makes it work, but not always. If we get it working and my friend then disconnects from the server and then Teamspeak and launches back into both, it breaks it and takes a long time to get it to work again. Are we doing something wrong? I've attached screenshots of CrossTalk settings, relevant TS options and mod options.

EDIT: My friend's settings are the EXACT same as mine

Screenshot_676
Screenshot_677
Screenshot_678
Screenshot_679
Screenshot_680
Screenshot_681

Non connect

Mumble doesn't connect properly to fabric for me, only forge. I have even deleted the forge mod to help, but no luck

Default config file missing lines.

Ahhh I just spent 3 hours trying to figure out if I was using the wrong mod or something because the configuration file had nothing, so I was stuck staring at the template values with 0 idea on what to do and how to implement them. After installing ModMenu, filling in values, and then hitting save the updated config file adds the missing lines. Just throwing this piece of info out there in hopes that default config file adds the missing lines.
As it stands default config file only has:

mumbleAutoLaunchOption = "ACCEPT"
mumbleDimensionYAxisAdjust = 0.0
voipClient = "MUMBLE"

All is working fine now on my end after the fix mentioned above so no concern there!

Dimension Switching doesn't Work

I can't seem to get the dimension switching feature to work, nor can any of my friends.

I have my server set up as follows in screenshot 1, and my fabric mod settings are in screenshot 2
image
image

Please let me know if any of the setup is wrong.
If it is not, I will add one other thing: I switched to a forge version of this idea and it worked fine, but every time I switched dimensions I would get a message that says Opening URL mumble://127.0.0.1:64738/Minecraft/Overworld and likewise for each dimension. This does not appear when switching dimensions with this mod. Therefore, I think a possible lead is that the mod never sends the URI to Mumble, but I'm not sure, I can't read kotlin very well.

Thank you for the help.

Crash upon joining sever

Whenever I join a server it says this as a crash error

java.lang.LinkageError: loader constraint violation: when resolving interface method "com.sun.jna.platform.win32.Kernel32.MapViewOfFile(Lcom/sun/jna/platform/win32/WinNT$HANDLE;IIII)Lcom/sun/jna/Pointer;" the class loader (instance of net/fabricmc/loader/launch/knot/KnotClassLoader) of the current class, com/skaggsm/mumblelinkmod/shaded/sharedmemory/win32/SharedMemoryWin32, and the class loader (instance of java/net/URLClassLoader) for the method's defining class, com/sun/jna/platform/win32/WinNT, have different Class objects for the type com/sun/jna/Pointer used in the signature
	at com.skaggsm.mumblelinkmod.shaded.sharedmemory.win32.SharedMemoryWin32.<init>(SharedMemoryWin32.java:30)
	at com.skaggsm.mumblelinkmod.shaded.sharedmemory.SharedMemory.getSharedMemory(SharedMemory.java:32)
	at com.skaggsm.mumblelinkmod.shaded.jmumblelink.MumbleLinkImpl.<init>(MumbleLinkImpl.java:16)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.ensureLinked(ClientMumbleLinkMod.java:109)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.access$ensureLinked(ClientMumbleLinkMod.java:35)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$2.onStartTick(ClientMumbleLinkMod.java:68)
	at net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents.lambda$static$0(ClientTickEvents.java:43)
	at net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents$$Lambda$5251/1706854837.onStartTick(Unknown Source)
	at net.minecraft.class_310.handler$ecb000$onStartTick(class_310.java:23381)
	at net.minecraft.class_310.method_1574(class_310.java)
	at net.minecraft.class_310.method_1523(class_310.java:1021)
	at net.minecraft.class_310.method_1514(class_310.java:681)
	at net.minecraft.client.main.Main.main(Main.java:215)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:226)
	at net.fabricmc.loader.launch.knot.Knot.launch(Knot.java:146)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at link.infra.jumploader.Jumploader.onLoad(Jumploader.java:171)
	at cpw.mods.modlauncher.TransformationServiceDecorator.onLoad(TransformationServiceDecorator.java:53)
	at cpw.mods.modlauncher.TransformationServicesHandler.lambda$loadTransformationServices$11(TransformationServicesHandler.java:131)
	at cpw.mods.modlauncher.TransformationServicesHandler$$Lambda$58/1364913072.accept(Unknown Source)
	at java.util.HashMap$Values.forEach(HashMap.java:972)
	at cpw.mods.modlauncher.TransformationServicesHandler.loadTransformationServices(TransformationServicesHandler.java:131)
	at cpw.mods.modlauncher.TransformationServicesHandler.initializeTransformationServices(TransformationServicesHandler.java:56)
	at cpw.mods.modlauncher.Launcher.run(Launcher.java:76)
	at cpw.mods.modlauncher.Launcher.main(Launcher.java:66)

ClassLoader loading order issue(?)

From CurseForge: https://www.curseforge.com/minecraft/mc-mods/mumble-link-fabric?comment=175

Log: https://pastebin.com/raw/UWz4ppgm

Stack trace:

java.lang.LinkageError: loader constraint violation: when resolving interface method "com.sun.jna.platform.win32.Kernel32.MapViewOfFile(Lcom/sun/jna/platform/win32/WinNT$HANDLE;IIII)Lcom/sun/jna/Pointer;" the class loader (instance of net/fabricmc/loader/launch/knot/KnotClassLoader) of the current class, com/skaggsm/mumblelinkmod/shaded/sharedmemory/win32/SharedMemoryWin32, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, com/sun/jna/platform/win32/WinNT, have different Class objects for the type com/sun/jna/Pointer used in the signature
	at com.skaggsm.mumblelinkmod.shaded.sharedmemory.win32.SharedMemoryWin32.<init>(SharedMemoryWin32.java:30)
	at com.skaggsm.mumblelinkmod.shaded.sharedmemory.SharedMemory.getSharedMemory(SharedMemory.java:32)
	at com.skaggsm.mumblelinkmod.shaded.jmumblelink.MumbleLinkImpl.<init>(MumbleLinkImpl.java:16)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.ensureLinked(ClientMumbleLinkMod.java:109)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.access$ensureLinked(ClientMumbleLinkMod.java:35)
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$2.onStartTick(ClientMumbleLinkMod.java:68)
	at net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents.lambda$static$0(ClientTickEvents.java:43)
	at net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents$$Lambda$4989/1221502511.onStartTick(Unknown Source)
	at net.minecraft.class_310.handler$dne000$onStartTick(class_310.java:20381)
	at net.minecraft.class_310.method_1574(class_310.java)
	at net.minecraft.class_310.method_1523(class_310.java:1021)
	at net.minecraft.class_310.method_1514(class_310.java:681)
	at net.minecraft.client.main.Main.main(Main.java:215)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:226)
	at net.fabricmc.loader.launch.knot.Knot.launch(Knot.java:146)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)

Doesn't work

It's just not working for me I have no clue why...

I can hear everyone

Link to game and transmit position is ticked.

I have the mods in the mod folder

Have all the positional Audio set up below and ticked inthe interface.

Now sure whats up
f941dd38cb6464373968469106799c7a

Missing mods.toml

First of all, I'm very happy to see a mod for Mumble and actually updated, with the amount of dead mods I'm really surprised you're still active, thank you!

So I set up a fresh FML server for Minecraft 1.15.1, and dropped the jar file in the mods folder. However, when I boot the FML server, I get this warning, and the mod is not loaded:

[16:54:50] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file Mod File: /home/gamenight/minecraft_server/mods/fabric-mumblelink-mod-0.6.1.jar is missing mods.toml file
[16:54:50] [main/WARN] [ne.mi.fm.lo.mo.ModDiscoverer/SCAN]: File /home/gamenight/minecraft_server/mods/fabric-mumblelink-mod-0.6.1.jar has been ignored - it is invalid

Since the mod is listed as compatible for >1.12, I guess I'm just missing the file, but I can't find it, nor on curseforge, nor on Github. Where can I find that?

Positional audio not working with Mumble

Hey, so I'm using this plugin and it isn't working, i don't know what im doing wrong, i connected to my mumble server and the proximity isn't working, i tested this multiple times it just didn't work, but as soon as i switched to Badlion Client, the badlion mod worked... i have no idea whats wrong?

Allow username to be templated

It could replace {0}:password with the user's in-game name or UUID

This would probably include separating the userinfo component into a separate config entry to keep things clean.

Server does not switch users' dimensional voice channel on death

Unfortunately I'm currently unable to test more thoroughly, but from what I observed, when players died in the nether and respawned in the overworld, they were not switched to the overworld dimension voice channel until they exit the overworld and enter the overworld again.

Versions of mumblelink on all clients were downloaded today, so that should be the most recent version, 0.7.5, on all connecting clients. Nothing was using optifine or any mods that I would assume would interfere with this, aside from maybe lithium on the server.

Tomorrow I should be able to provide whatever information is needed to investigate this more fully.

Prevented from joining server if BROWSE action does not work

I get a 'connection lost' screen in my client shortly after trying to connect to the server. I never get as far as seeing the in-game world. Completely blocks me. Possibly similar to #35

  • Mumblelink 0.7.5
  • Fabric loader 0.11.1
  • MC 1.16.5
  • Linux 5.10.8_1
  • openjdk version "1.8.0_272"

I'm not using a full-blown desktop environment, I'm instead using a standalone window manager (i3wm) and my own collection of programs. I've never had issues like this before, stuff like xdg-open works fine.

Maybe I have a missing protocol (eg mumble://) in my conf file?

My config (on the server side):

mumbleAutoLaunchOption = "ACCEPT"
mumbleDimensionYAxisAdjust = 0.0
voipClient = "MUMBLE"
mumbleServerHost = "my.domain.of.evil"
mumbleServerPort = 64738

Errors in client:

[20:27:01] [Netty Epoll Client IO #0/ERROR]: Encountered exception while handling in channel with name "fabric-mumblelink-mod:broadcast_mumble_url"
java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
	at java.awt.Desktop.checkActionSupport(Desktop.java:221) ~[?:1.8.0_272]
	at java.awt.Desktop.browse(Desktop.java:380) ~[?:1.8.0_272]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.packetConsumer(ClientMumbleLinkMod.java:50) ~[fabric-mumblelink-mod-0.7.5.jar:?]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod.access$packetConsumer(ClientMumbleLinkMod.java:35) ~[fabric-mumblelink-mod-0.7.5.jar:?]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$1.invoke(ClientMumbleLinkMod.java:58) ~[fabric-mumblelink-mod-0.7.5.jar:?]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkMod$onInitializeClient$1.invoke(ClientMumbleLinkMod.java:35) ~[fabric-mumblelink-mod-0.7.5.jar:?]
	at com.skaggsm.mumblelinkmod.ClientMumbleLinkModKt$sam$net_fabricmc_fabric_api_network_PacketConsumer$0.accept(ClientMumbleLinkModKt.java) ~[fabric-mumblelink-mod-0.7.5.jar:?]
	at net.fabricmc.fabric.impl.networking.ClientSidePacketRegistryImpl.lambda$register$0(ClientSidePacketRegistryImpl.java:65) ~[0568dc96-7ffd-4458-b738-b0d979971f00.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientPlayNetworkAddon.receive(ClientPlayNetworkAddon.java:97) ~[d5dabcff-f3e3-4116-921b-62745ffebf8d.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientPlayNetworkAddon.receive(ClientPlayNetworkAddon.java:39) ~[d5dabcff-f3e3-4116-921b-62745ffebf8d.jar:?]
	at net.fabricmc.fabric.impl.networking.AbstractChanneledNetworkAddon.handle(AbstractChanneledNetworkAddon.java:100) [d5dabcff-f3e3-4116-921b-62745ffebf8d.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientPlayNetworkAddon.handle(ClientPlayNetworkAddon.java:89) [d5dabcff-f3e3-4116-921b-62745ffebf8d.jar:?]
	at net.minecraft.class_634.handler$cid000$handleCustomPayload(class_634.java:2474) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_634.method_11152(class_634.java) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_2658.method_11457(class_2658.java:65) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_2658.method_11054(class_2658.java:10) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_2535.method_10759(class_2535.java:156) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_2535.method_10770(class_2535.java:147) [intermediary-minecraft-1.16.5-client.jar:?]
	at net.minecraft.class_2535.channelRead0(class_2535.java:52) [intermediary-minecraft-1.16.5-client.jar:?]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:297) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:413) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:808) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1.run(AbstractEpollChannel.java:387) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:313) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-all-4.1.25.Final.jar:4.1.25.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_272]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.