diff --git a/ReallifeGamemode.Client/Voice/main.ts b/ReallifeGamemode.Client/Voice/main.ts new file mode 100644 index 00000000..302f8c79 --- /dev/null +++ b/ReallifeGamemode.Client/Voice/main.ts @@ -0,0 +1,83 @@ +import playerInteraction from "Interaction/playerinteraction"; + +/** + * @overview Life of German Reallife - Voice Main main.ts + * @author Zeuto + * @copyright (c) 2008 - 2019 Life of German + */ + +export default function voice() { + + const Use3d = true; + const UseAutoVolume = false; + const MaxRange = 30.0; + + mp.voiceChat.muted = true; // initialize muted + + var listeners: Array = new Array(); + + mp.keys.bind(0x73, false, _ => { + mp.voiceChat.muted = !mp.voiceChat.muted; + + mp.game.graphics.notify("[" + new Date().toLocaleTimeString() + "] Voice-Chat: " + (mp.voiceChat.muted ? '~g~aktiviert' : '~r~deaktiviert')); + }); + + function addListener(target: PlayerMp) { + + listeners.push(target); + mp.events.callRemote("CLIENT:AddVoiceListener", target); + + if (UseAutoVolume) { + target.voiceAutoVolume = true; + } else { + target.voiceVolume = 1.0; + } + if (Use3d) { + target.voice3d = true; + } + } + + function removeListener(target: PlayerMp) { + let idx = listeners.indexOf(target) + + if (idx !== -1) { + listeners.splice(idx, 1); + } + + mp.events.callRemote("CLIENT:RemoveVoiceListener"); + } + + setInterval(() => { + let localPlayer = mp.players.local; + let localPos = localPlayer.position; + + mp.players.forEachInStreamRange(player => { + if (player != localPlayer) { + if (!listeners.includes(player)) { + const playerPos = player.position; + let dist = mp.game.system.vdist(playerPos.x, playerPos.y, playerPos.z, localPos.x, localPos.y, localPos.z); + + if (dist <= MaxRange) { + addListener(player); + } + } + } + }); + + listeners.forEach((player: PlayerMp) => { + if (player.handle !== 0) { + const playerPos = player.position; + let dist = mp.game.system.vdist(playerPos.x, playerPos.y, playerPos.z, localPos.x, localPos.y, localPos.z); + + if (dist > MaxRange) { + removeListener(player); + } else if (!UseAutoVolume) { + player.voiceVolume = 1 - (dist / MaxRange); + } + } + else { + removeListener(player); + } + }) + }, 500) +} diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 019c75d9..5224bf29 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -11,6 +11,9 @@ let globalData: GlobalData = { InChat: false, }; +import voice from './Voice/main'; +voice(); + import handMoney from './Gui/handmoney' handMoney(); diff --git a/ReallifeGamemode.Server/Events/Voice.cs b/ReallifeGamemode.Server/Events/Voice.cs new file mode 100644 index 00000000..3e1318ce --- /dev/null +++ b/ReallifeGamemode.Server/Events/Voice.cs @@ -0,0 +1,25 @@ +using GTANetworkAPI; + +/** +* @overview Life of German Reallife - Event Voice (Voice.cs) +* @author Zeuto +* @copyright (c) 2008 - 2019 Life of German +*/ + +namespace ReallifeGamemode.Server.Events +{ + class Voice : Script + { + [RemoteEvent("CLIENT:AddVoiceListener")] + public void AddPlayerVoiceListenerEvent(Client player, Client target) + { + player.EnableVoiceTo(target); + } + + [RemoteEvent("CLIENT:RemoveVoiceListener")] + public void RemovePlayerVoiceListenerEvent(Client player, Client target) + { + player.DisableVoiceTo(target); + } + } +}