Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
# Mumble Walkie
<!--- Pending --->
In development
# Mumble Walkie (in development)
<!--- Pending --->
Mumble Walkie is a Minecraft Modification for Fabric that brings real-time voice communication to the game. This mod integrates with Mumble, a voice chat platform, allowing players to communicate via a virtual radio channel.

### Key Features:
- **Walkie-Talkie Item:** A custom item that players can hold in their hands to communicate with others.
- **Real-time Voice Chat:** Integrates with Mumble to enable voice chat between players within the proximity of the radio signal.
- **Sound Effects:** Realistic radio sound effects such as static, tuning, and voice transmission when interacting with the radio.
- **Voice Proximity:** Volume and voice distance are adjusted based on the player's position in the game world.
- **Interference Sounds:** When there is a storm, rain, or snow, players will hear radio interference to add to the immersion.
- **Easy Setup:** Configure your Mumble server and connection settings with ease, allowing for a smooth and intuitive setup.

### Installation
1. Download and install Fabric mod loader.
2. Download the Mumble Walkie mod and place it in the `mods` folder.
3. Configure the Mumble server through the in-game settings or edit the `mbradio_config.json` file in the `config` folder.

### Usage
- Equip the Walkie-Talkie item and hold the configured key ("V" key is default) to start speaking.
- Adjust the Mumble server settings if needed from the in-game menu or through the `mbradio_config.json` file.

### Compatibility
- Compatible with other Minecraft mods and supports integration with additional communication tools or systems.
- Designed to work seamlessly on both client and server-side.
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ dependencies {

// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"


modImplementation "net.java.dev.jna:jna:5.17.0"

}

processResources {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/andrewdotdev/mbwalkie/MumbleWalkie.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.andrewdotdev.mbwalkie;

import com.andrewdotdev.mbwalkie.commands.WalkieCommands;
import com.andrewdotdev.mbwalkie.config.ConfigManager;
import com.andrewdotdev.mbwalkie.item.ModItems;
import net.fabricmc.api.ModInitializer;
import org.slf4j.Logger;
Expand All @@ -11,6 +13,8 @@ public class MumbleWalkie implements ModInitializer {

@Override
public void onInitialize() {
ConfigManager.loadConfig();
WalkieCommands.register();
ModItems.registerModItems();
LOGGER.info("Mumble Walkie initialized!");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.andrewdotdev.mbwalkie;

import com.andrewdotdev.mbwalkie.client.ClientEvents;
import com.andrewdotdev.mbwalkie.client.Keybinds;
import net.fabricmc.api.ClientModInitializer;

public class MumbleWalkieClient implements ClientModInitializer {
@Override
public void onInitializeClient() {

Keybinds.register();
ClientEvents.register();
}
}
71 changes: 71 additions & 0 deletions src/main/java/com/andrewdotdev/mbwalkie/client/ClientEvents.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.andrewdotdev.mbwalkie.client;

import com.andrewdotdev.mbwalkie.mumble.MumbleClient;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.item.ItemStack;
import net.minecraft.registry.Registry;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;

import java.util.Optional;

import static com.andrewdotdev.mbwalkie.item.ModItems.WALKIE_TALKIE;

public class ClientEvents {
private static boolean isTalking = false;

public static void register() {

ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> MumbleClient.connect());

ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (hasWalkieTalkie(client)) {
if (Keybinds.radioKey.isPressed() && !isTalking) {
startTalking(client);
isTalking = true;
} else if (!Keybinds.radioKey.isPressed() && isTalking) {
stopTalking(client);
isTalking = false;
}
} else if (!hasWalkieTalkie(client) && isTalking) {
stopTalking(client);
isTalking = false;
}
});
}

private static boolean hasWalkieTalkie(MinecraftClient client) {
if (client.player == null) return false;

ItemStack mainHand = client.player.getMainHandStack();
ItemStack offHand = client.player.getOffHandStack();

return mainHand.isOf(WALKIE_TALKIE) || offHand.isOf(WALKIE_TALKIE);
}

private static void startTalking(MinecraftClient client) {
playSound(client, "mbwalkie:walkie_start");
MumbleClient.startTalking();
System.out.println("🎙️ Started Talking...");
}

private static void stopTalking(MinecraftClient client) {
playSound(client, "mbwalkie:walkie_end");
MumbleClient.stopTalking();
System.out.println("📻 Stopped Talking.");
}

private static void playSound(MinecraftClient client, String soundId) {
if (client.player == null) return;

SoundEvent soundEvent = new SoundEvent(Identifier.of(soundId), Optional.of(8F));
if (soundEvent != null) {
client.getSoundManager().play(
PositionedSoundInstance.master(soundEvent, 1.0F)
);
}
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/andrewdotdev/mbwalkie/client/Keybinds.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.andrewdotdev.mbwalkie.client;

import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import org.lwjgl.glfw.GLFW;

public class Keybinds {
public static KeyBinding radioKey;

public static void register() {
radioKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"Talk", // Nombre en el archivo de traducción
InputUtil.Type.KEYSYM,
GLFW.GLFW_KEY_V, // Tecla por defecto (puede cambiarse en ajustes)
"Mumble Walkie Talkie" // Categoría en los controles
));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.andrewdotdev.mbwalkie.commands;

import com.andrewdotdev.mbwalkie.config.ConfigManager;
import com.andrewdotdev.mbwalkie.mumble.MumbleClient;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text;

import java.util.function.Supplier;

public class WalkieCommands {
public static void register() {
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("reconnect")
.executes(context -> {
reconnectToMumble(context.getSource());
return Command.SINGLE_SUCCESS;
})
);
});
}

private static void reconnectToMumble(ServerCommandSource source) {
source.sendFeedback(() -> Text.literal("🔄 Reconectando a Mumble..."), false);

// Desconectar y recargar la configuración
MumbleClient.disconnect();
ConfigManager.loadConfig();
MumbleClient.connect();

source.sendFeedback(() -> Text.literal("✅ Reconectado a " + ConfigManager.getMumbleIP() + ":" + ConfigManager.getMumblePort()), false);
}
}
47 changes: 47 additions & 0 deletions src/main/java/com/andrewdotdev/mbwalkie/config/ConfigManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.andrewdotdev.mbwalkie.config;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ConfigManager {
private static final File CONFIG_FILE = new File("config/mbwalkie_config.json");
private static JsonObject configData;
private static final Gson GSON = new Gson();

public static void loadConfig() {
if (!CONFIG_FILE.exists()) {
saveDefaultConfig();
}

try (FileReader reader = new FileReader(CONFIG_FILE)) {
configData = GSON.fromJson(reader, JsonObject.class);
} catch (IOException e) {
e.printStackTrace();
}
}

private static void saveDefaultConfig() {
JsonObject defaultConfig = new JsonObject();
defaultConfig.addProperty("mumble_ip", "127.0.0.1");
defaultConfig.addProperty("mumble_port", 64738);

try (FileWriter writer = new FileWriter(CONFIG_FILE)) {
GSON.toJson(defaultConfig, writer);
} catch (IOException e) {
e.printStackTrace();
}
}

public static String getMumbleIP() {
return configData.get("mumble_ip").getAsString();
}

public static int getMumblePort() {
return configData.get("mumble_port").getAsInt();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"mumble_ip": "127.0.0.1",
"mumble_port": 64738
}
89 changes: 89 additions & 0 deletions src/main/java/com/andrewdotdev/mbwalkie/mumble/MumbleClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.andrewdotdev.mbwalkie.mumble;

import com.andrewdotdev.mbwalkie.config.ConfigManager;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;

import java.io.IOException;
import java.net.Socket;
import java.util.Optional;

public class MumbleClient {
private static Socket socket;
private static boolean connected = false;
private static final double MAX_RANGE = 50.0;
private static boolean transmitting = false;

public static void startTalking() {
transmitting = true;
updateVolume();
System.out.println("🎙 Transmitiendo voz...");
}

public static void stopTalking() {
transmitting = false;
System.out.println("🔇 Voz detenida.");
}

private static void updateVolume() {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player == null) return;

assert client.world != null;
boolean isStormy = client.world.isThundering() || client.world.isRaining();

for (PlayerEntity otherPlayer : client.world.getPlayers()) {
if (otherPlayer == client.player) continue;

double distance = client.player.getPos().distanceTo(otherPlayer.getPos());
float volume = calculateVolume(distance);

if (isStormy || distance > 30) {
playInterferenceSound();
}

System.out.println("🔊 Ajustando volumen para " + otherPlayer.getName().getString() + ": " + volume);
}
}

private static void playInterferenceSound() {
MinecraftClient client = MinecraftClient.getInstance();
assert client.player != null;
client.player.playSound(new SoundEvent(Identifier.of("mbwalkie:walkie_static"), Optional.of(8F)), 1.0f, 1.0f);
}

private static float calculateVolume(double distance) {
if (distance > MAX_RANGE) return 0.0f;
return 1.0f - (float) (distance / MAX_RANGE);
}


public static void connect() {
if (connected) return;

try {
String ip = ConfigManager.getMumbleIP();
int port = ConfigManager.getMumblePort();

socket = new Socket(ip, port);
connected = true;
System.out.println("✅ Connected in " + ip + ":" + port);
} catch (IOException e) {
System.err.println("❌ Error while trying to connect Mumble: " + e.getMessage());
}
}

public static void disconnect() {
if (!connected) return;

try {
socket.close();
connected = false;
System.out.println("🔴 Mumble Disconnected");
} catch (IOException e) {
System.err.println("⚠️ Error while trying to disconnect Mumble: " + e.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"credit": "Made with Blockbench",
"credit": "Made by @andrewdotdev",
"texture_size": [64, 64],
"textures": {
"0": "mbwalkie:item/walkie_talkie",
Expand Down
11 changes: 11 additions & 0 deletions src/main/resources/assets/mbwalkie/sounds.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"walkie_start": {
"sounds": ["mbwalkie:walkie_start"]
},
"walkie_end": {
"sounds": ["mbwalkie:walkie_end"]
},
"walkie_static": {
"sounds": ["mbwalkie:walkie_static"]
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.