Guten Tag,
ich benutze es_extended und habe das Script "MI-phone" hinzugefügt. Es funktioniert wunderbar, jedoch kann ich keinen anrufen. Ich habe das ganze unter die Lupe genommen und habe bemerkt, dass da standardmäßig tokovoip_script verwendet wird. Dies hab ich geändert, weil ich SaltyChat nutze und es weiterhin nutzen will.
CancelCall = function()
TriggerServerEvent('MI-phone:server:CancelCall', PhoneData.CallData)
if PhoneData.CallData.CallType == "ongoing" then
exports["saltychat"]:EndCall(PhoneData.CallData.CallId)
end
PhoneData.CallData.CallType = nil
PhoneData.CallData.InCall = false
PhoneData.CallData.AnsweredCall = false
PhoneData.CallData.TargetData = {}
PhoneData.CallData.CallId = nil
if not PhoneData.isOpen then
StopAnimTask(PlayerPedId(), PhoneData.AnimationData.lib, PhoneData.AnimationData.anim, 2.5)
deletePhone()
PhoneData.AnimationData.lib = nil
PhoneData.AnimationData.anim = nil
else
PhoneData.AnimationData.lib = nil
PhoneData.AnimationData.anim = nil
end
TriggerServerEvent('MI-phone:server:SetCallState', false)
if not PhoneData.isOpen then
SendNUIMessage({
action = "Notification",
NotifyData = {
title = Lang("PHONE_TITLE"),
content = Lang("PHONE_CALL_END"),
icon = "fas fa-phone",
timeout = 3500,
color = "#e84118",
},
})
else
SendNUIMessage({
action = "PhoneNotification",
PhoneNotify = {
title = Lang("PHONE_TITLE"),
text = Lang("PHONE_CALL_END"),
icon = "fas fa-phone",
color = "#e84118",
},
})
SendNUIMessage({
action = "SetupHomeCall",
CallData = PhoneData.CallData,
})
SendNUIMessage({
action = "CancelOutgoingCall",
})
end
end
RegisterNetEvent('MI-phone:client:CancelCall')
AddEventHandler('MI-phone:client:CancelCall', function()
if PhoneData.CallData.CallType == "ongoing" then
SendNUIMessage({
action = "CancelOngoingCall"
})
exports["saltychat"]:EndCall(PhoneData.CallData.CallId)
end
PhoneData.CallData.CallType = nil
PhoneData.CallData.InCall = false
PhoneData.CallData.AnsweredCall = false
PhoneData.CallData.TargetData = {}
if not PhoneData.isOpen then
StopAnimTask(PlayerPedId(), PhoneData.AnimationData.lib, PhoneData.AnimationData.anim, 2.5)
deletePhone()
PhoneData.AnimationData.lib = nil
PhoneData.AnimationData.anim = nil
else
PhoneData.AnimationData.lib = nil
PhoneData.AnimationData.anim = nil
end
TriggerServerEvent('MI-phone:server:SetCallState', false)
if not PhoneData.isOpen then
SendNUIMessage({
action = "Notification",
NotifyData = {
title = Lang("PHONE_TITLE"),
content = Lang("PHONE_CALL_END"),
icon = "fas fa-phone",
timeout = 3500,
color = "#e84118",
},
})
else
SendNUIMessage({
action = "PhoneNotification",
PhoneNotify = {
title = Lang("PHONE_TITLE"),
text = Lang("PHONE_CALL_END"),
icon = "fas fa-phone",
color = "#e84118",
},
})
SendNUIMessage({
action = "SetupHomeCall",
CallData = PhoneData.CallData,
})
SendNUIMessage({
action = "CancelOutgoingCall",
})
end
end)
RegisterNetEvent('MI-phone:client:GetCalled')
AddEventHandler('MI-phone:client:GetCalled', function(CallerNumber, CallId, AnonymousCall)
local RepeatCount = 0
local CallData = {
number = CallerNumber,
name = IsNumberInContacts(CallerNumber),
anonymous = AnonymousCall
}
print(AnonymousCall)
if AnonymousCall then
CallData.name = "Anoniem"
end
PhoneData.CallData.CallType = "incoming"
PhoneData.CallData.InCall = true
PhoneData.CallData.AnsweredCall = false
PhoneData.CallData.TargetData = CallData
PhoneData.CallData.CallId = CallId
TriggerServerEvent('MI-phone:server:SetCallState', true)
SendNUIMessage({
action = "SetupHomeCall",
CallData = PhoneData.CallData,
})
for i = 1, Config.CallRepeats + 1, 1 do
if not PhoneData.CallData.AnsweredCall then
if RepeatCount + 1 ~= Config.CallRepeats + 1 then
if PhoneData.CallData.InCall then
RepeatCount = RepeatCount + 1
TriggerServerEvent("InteractSound_SV:PlayOnSource", "ringing", 0.2)
if not PhoneData.isOpen then
SendNUIMessage({
action = "IncomingCallAlert",
CallData = PhoneData.CallData.TargetData,
Canceled = false,
AnonymousCall = AnonymousCall,
})
end
else
SendNUIMessage({
action = "IncomingCallAlert",
CallData = PhoneData.CallData.TargetData,
Canceled = true,
AnonymousCall = AnonymousCall,
})
TriggerServerEvent('MI-phone:server:AddRecentCall', "missed", CallData)
break
end
Citizen.Wait(Config.RepeatTimeout)
else
SendNUIMessage({
action = "IncomingCallAlert",
CallData = PhoneData.CallData.TargetData,
Canceled = true,
AnonymousCall = AnonymousCall,
})
TriggerServerEvent('MI-phone:server:AddRecentCall', "missed", CallData)
break
end
else
TriggerServerEvent('MI-phone:server:AddRecentCall', "missed", CallData)
break
end
end
end)
RegisterNUICallback('CancelOutgoingCall', function()
CancelCall()
end)
RegisterNUICallback('DenyIncomingCall', function()
CancelCall()
end)
RegisterNUICallback('CancelOngoingCall', function()
CancelCall()
end)
RegisterNUICallback('AnswerCall', function()
AnswerCall()
end)
function AnswerCall()
if (PhoneData.CallData.CallType == "incoming" or PhoneData.CallData.CallType == "outgoing") and PhoneData.CallData.InCall and not PhoneData.CallData.AnsweredCall then
PhoneData.CallData.CallType = "ongoing"
PhoneData.CallData.AnsweredCall = true
PhoneData.CallData.CallTime = 0
SendNUIMessage({ action = "AnswerCall", CallData = PhoneData.CallData})
SendNUIMessage({ action = "SetupHomeCall", CallData = PhoneData.CallData})
TriggerServerEvent('MI-phone:server:SetCallState', true)
if PhoneData.isOpen then
DoPhoneAnimation('cellphone_text_to_call')
else
DoPhoneAnimation('cellphone_call_listen_base')
end
Citizen.CreateThread(function()
while true do
if PhoneData.CallData.AnsweredCall then
PhoneData.CallData.CallTime = PhoneData.CallData.CallTime + 1
SendNUIMessage({
action = "UpdateCallTime",
Time = PhoneData.CallData.CallTime,
Name = PhoneData.CallData.TargetData.name,
})
else
break
end
Citizen.Wait(1000)
end
end)
TriggerServerEvent('MI-phone:server:AnswerCall', PhoneData.CallData)
exports["saltychat"]:EstablishCall(PhoneData.CallData.CallId, 'Phone')
else
PhoneData.CallData.InCall = false
PhoneData.CallData.CallType = nil
PhoneData.CallData.AnsweredCall = false
SendNUIMessage({
action = "PhoneNotification",
PhoneNotify = {
title = Lang("PHONE_TITLE"),
text = Lang("PHONE_NOINCOMING"),
icon = "fas fa-phone",
color = "#e84118",
},
})
end
end
Alles anzeigen
Diese 4 Zeilen habe ich ersetzt:
exports.tokovoip_script:removePlayerFromRadio(PhoneData.CallData.CallId) => exports["saltychat"]:EndCall(PhoneData.CallData.CallId)
exports.tokovoip_script:removePlayerFromRadio(PhoneData.CallData.CallId) => exports["saltychat"]:EndCall(PhoneData.CallData.CallId)
exports.tokovoip_script:addPlayerToRadio(PhoneData.CallData.CallId, 'Phone') => exports["saltychat"]:EstablishCall(PhoneData.CallData.CallId, 'Phone')
exports.tokovoip_script:addPlayerToRadio(PhoneData.CallData.CallId, 'Phone') => exports["saltychat"]:EstablishCall(PhoneData.CallData.CallId, 'Phone')
using System;
using System.Collections.Generic;
using System.Linq;
using SaltyShared;
using CitizenFX.Core;
using CitizenFX.Core.Native;
using Newtonsoft.Json;
namespace SaltyServer {
public class VoiceManager : BaseScript {
#region Properties / Fields
public static VoiceManager Instance { get; private set; }
public bool Enabled { get; private set; }
public string MinimumPluginVersion { get; private set; }
public Vector3[] RadioTowers { get; private set; } = new Vector3[0];
public VoiceClient[] VoiceClients => this._voiceClients.Values.ToArray();
private Dictionary<Player, VoiceClient> _voiceClients = new Dictionary<Player, VoiceClient>();
public RadioChannel[] RadioChannels => this._radioChannels.ToArray();
private List<RadioChannel> _radioChannels = new List<RadioChannel>();
#endregion
#region CTOR
public VoiceManager()
{
VoiceManager.Instance = this;
// General Exports
this.Exports.Add("SetPlayerAlive", new Action<int, bool>(this.SetPlayerAlive));
// Phone Exports
this.Exports.Add("EstablishCall", new Action<int, int>(this.EstablishCall));
this.Exports.Add("EndCall", new Action<int, int>(this.EndCall));
// Radio Exports
this.Exports.Add("SetPlayerRadioSpeaker", new Action<int, bool>(this.SetPlayerRadioSpeaker));
this.Exports.Add("SetPlayerRadioChannel", new Action<int, string, bool>(this.SetPlayerRadioChannel));
this.Exports.Add("RemovePlayerRadioChannel", new Action<int, string>(this.RemovePlayerRadioChannel));
this.Exports.Add("SetRadioTowers", new Action<dynamic>(this.SetRadioTowers));
}
#endregion
#region Server Events
[EventHandler("onResourceStart")]
private void OnResourceStart(string resourceName)
{
if (resourceName != API.GetCurrentResourceName())
return;
this.Enabled = API.GetResourceMetadata(resourceName, "VoiceEnabled", 0).Equals("true", StringComparison.OrdinalIgnoreCase);
if (this.Enabled)
{
this.MinimumPluginVersion = API.GetResourceMetadata(resourceName, "MinimumPluginVersion", 0);
}
}
[EventHandler("onResourceStop")]
private void OnResourceStop(string resourceName)
{
if (resourceName != API.GetCurrentResourceName())
return;
this.Enabled = false;
lock (this._voiceClients)
{
this._voiceClients.Clear();
}
lock (this._radioChannels)
{
foreach (RadioChannel radioChannel in this._radioChannels)
{
foreach (RadioChannelMember member in radioChannel.Members)
{
radioChannel.RemoveMember(member.VoiceClient);
}
}
this._radioChannels.Clear();
}
}
[EventHandler("playerDropped")]
private void OnPlayerDisconnected([FromSource] Player player, string reason)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient client))
return;
foreach (RadioChannel radioChannel in this.RadioChannels.Where(c => c.IsMember(client)))
{
radioChannel.RemoveMember(client);
}
lock (this._voiceClients)
{
this._voiceClients.Remove(player);
}
BaseScript.TriggerClientEvent(Event.SaltyChat_RemoveClient, player.Handle);
}
#endregion
#region RemoteEvents (Proximity)
[EventHandler(Event.SaltyChat_SetVoiceRange)]
private void OnSetVoiceRange([FromSource] Player player, float voiceRange)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient client))
return;
if (Array.IndexOf(SharedData.VoiceRanges, voiceRange) >= 0)
{
client.VoiceRange = voiceRange;
BaseScript.TriggerClientEvent(Event.SaltyChat_UpdateVoiceRange, player.Handle, client.VoiceRange);
}
}
#endregion
#region Exports (General)
private void SetPlayerAlive(int netId, bool isAlive)
{
Player player = this.Players[netId];
lock (this._voiceClients)
{
if (this._voiceClients.ContainsKey(player))
{
this._voiceClients[player].IsAlive = isAlive;
BaseScript.TriggerClientEvent(Event.SaltyChat_UpdateAlive, player.Handle, isAlive);
}
}
}
#endregion
#region Exports (Phone)
private void EstablishCall(int callerNetId, int partnerNetId)
{
Player caller = this.Players[callerNetId];
Player callPartner = this.Players[partnerNetId];
caller.TriggerEvent(Event.SaltyChat_EstablishCall, callPartner.Handle, JsonConvert.SerializeObject(callPartner.Character.Position));
callPartner.TriggerEvent(Event.SaltyChat_EstablishCall, caller.Handle, JsonConvert.SerializeObject(caller.Character.Position));
}
private void EndCall(int callerNetId, int partnerNetId)
{
Player caller = this.Players[callerNetId];
Player callPartner = this.Players[partnerNetId];
caller.TriggerEvent(Event.SaltyChat_EndCall, callPartner.Handle);
callPartner.TriggerEvent(Event.SaltyChat_EndCall, caller.Handle);
}
#endregion
#region Exports (Radio)
private void SetPlayerRadioSpeaker(int netId, bool toggle)
{
Player player = this.Players[netId];
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.SetRadioSpeaker(voiceClient, toggle);
}
private void SetPlayerRadioChannel(int netId, string radioChannelName, bool isPrimary)
{
Player player = this.Players[netId];
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.JoinRadioChannel(voiceClient, radioChannelName, isPrimary);
}
private void RemovePlayerRadioChannel(int netId, string radioChannelName)
{
Player player = this.Players[netId];
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.LeaveRadioChannel(voiceClient, radioChannelName);
}
private void SetRadioTowers(dynamic towers)
{
List<Vector3> towerPositions = new List<Vector3>();
foreach (dynamic tower in towers)
{
towerPositions.Add(new Vector3(tower[0], tower[1], tower[2]));
}
this.RadioTowers = towerPositions.ToArray();
BaseScript.TriggerClientEvent(Event.SaltyChat_UpdateRadioTowers, this.RadioTowers);
}
#endregion
#region Remote Events (Salty Chat)
[EventHandler(Event.SaltyChat_Initialize)]
private void OnInitialize([FromSource] Player player)
{
if (!this.Enabled)
return;
VoiceClient voiceClient;
lock (this._voiceClients)
{
voiceClient = new VoiceClient(player, this.GetTeamSpeakName(player), SharedData.VoiceRanges[1], true);
if (this._voiceClients.ContainsKey(player))
this._voiceClients[player] = voiceClient;
else
this._voiceClients.Add(player, voiceClient);
}
player.TriggerEvent(Event.SaltyChat_Initialize, voiceClient.TeamSpeakName, this.RadioTowers);
Vector3 voiceClientPosition = voiceClient.Player.Character != null ? voiceClient.Player.Character.Position : new Vector3(0.0f, 0.0f, 0.0f);
string clientJson = JsonConvert.SerializeObject(new SaltyShared.VoiceClient(voiceClient.Player.GetServerId(), voiceClient.TeamSpeakName, voiceClient.VoiceRange, true, new Position(voiceClientPosition.X, voiceClientPosition.Y, voiceClientPosition.Z)));
List<SaltyShared.VoiceClient> voiceClients = new List<SaltyShared.VoiceClient>();
foreach (VoiceClient client in this.VoiceClients.Where(c => c.Player != player))
{
Vector3 clientPosition = client.Player.Character != null ? client.Player.Character.Position : new Vector3(0.0f, 0.0f, 0.0f);
voiceClients.Add(new SaltyShared.VoiceClient(client.Player.GetServerId(), client.TeamSpeakName, client.VoiceRange, client.IsAlive, new Position(clientPosition.X, clientPosition.Y, clientPosition.Z)));
client.Player.TriggerEvent(Event.SaltyChat_UpdateClient, clientJson);
}
player.TriggerEvent(Event.SaltyChat_SyncClients, JsonConvert.SerializeObject(voiceClients));
}
[EventHandler(Event.SaltyChat_CheckVersion)]
private void OnCheckVersion([FromSource] Player player, string version)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient client))
return;
if (!this.IsVersionAccepted(version))
{
player.Drop($"[Salty Chat] Benötigte Version von SaltyChat: {this.MinimumPluginVersion}");
return;
}
}
#endregion
#region Commands (Radio)
#if DEBUG
[Command("speaker")]
private void OnSetRadioSpeaker(Player player, string[] args)
{
if (args.Length < 1)
{
player.SendChatMessage("Usage", "/speaker {true/false}");
return;
}
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
bool toggle = String.Equals(args[0], "true", StringComparison.OrdinalIgnoreCase);
this.SetRadioSpeaker(voiceClient, toggle);
player.SendChatMessage("Speaker", $"The speaker is now {(toggle ? "on" : "off")}.");
}
[Command("joinradio")]
private void OnJoinRadioChannel(Player player, string[] args)
{
if (args.Length < 1)
{
player.SendChatMessage("Usage", "/joinradio {radioChannelName}");
return;
}
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.JoinRadioChannel(voiceClient, args[0], true);
player.SendChatMessage("Radio", $"You joined channel \"{args[0]}\".");
}
[Command("joinsecradio")]
private void OnJoinSecondaryRadioChannel(Player player, string[] args)
{
if (args.Length < 1)
{
player.SendChatMessage("Usage", "/joinsecradio {radioChannelName}");
return;
}
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.JoinRadioChannel(voiceClient, args[0], false);
player.SendChatMessage("Radio", $"You joined secondary channel \"{args[0]}\".");
}
[Command("leaveradio")]
private void OnLeaveRadioChannel(Player player, string[] args)
{
if (args.Length < 1)
{
player.SendChatMessage("Usage", "/leaveradio {radioChannelName}");
return;
}
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.LeaveRadioChannel(voiceClient, args[0]);
player.SendChatMessage("Radio", $"You left channel \"{args[0]}\".");
}
#endif
#endregion
#region Remote Events (Radio)
[EventHandler(Event.SaltyChat_IsSending)]
private void OnSendingOnRadio([FromSource] Player player, string radioChannelName, bool isSending)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
RadioChannel radioChannel = this.GetRadioChannel(radioChannelName, false);
if (radioChannel == null || !radioChannel.IsMember(voiceClient))
return;
radioChannel.Send(voiceClient, isSending);
}
[EventHandler(Event.SaltyChat_SetRadioChannel)]
private void OnJoinRadioChannel([FromSource] Player player, string radioChannelName, bool isPrimary)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
this.LeaveRadioChannel(voiceClient, isPrimary);
if (!String.IsNullOrEmpty(radioChannelName))
{
this.JoinRadioChannel(voiceClient, radioChannelName, isPrimary);
}
}
#endregion
#region Remote Events(Megaphoone)
[EventHandler(Event.SaltyChat_IsUsingMegaphone)]
private void OnIsUsingMegaphone([FromSource] Player player, bool isSending)
{
if (!this._voiceClients.TryGetValue(player, out VoiceClient voiceClient))
return;
string positionJson = JsonConvert.SerializeObject(voiceClient.Player.Character.Position);
float range = 100f;
foreach (VoiceClient remoteClient in this.VoiceClients)
{
remoteClient.Player.TriggerEvent(Event.SaltyChat_IsUsingMegaphone, voiceClient.Player.Handle, range, isSending, positionJson);
}
}
#endregion
#region Methods (Radio)
public RadioChannel GetRadioChannel(string name, bool create)
{
RadioChannel radioChannel;
lock (this._radioChannels)
{
radioChannel = this.RadioChannels.FirstOrDefault(r => r.Name == name);
if (radioChannel == null && create)
{
radioChannel = new RadioChannel(name);
this._radioChannels.Add(radioChannel);
}
}
return radioChannel;
}
public IEnumerable<RadioChannelMember> GetPlayerRadioChannelMembership(VoiceClient voiceClient)
{
foreach (RadioChannel radioChannel in this.RadioChannels)
{
RadioChannelMember membership = radioChannel.Members.FirstOrDefault(m => m.VoiceClient == voiceClient);
if (membership != null)
{
yield return membership;
}
}
}
public void SetRadioSpeaker(VoiceClient voiceClient, bool toggle)
{
voiceClient.RadioSpeaker = toggle;
}
public void JoinRadioChannel(VoiceClient voiceClient, string radioChannelName, bool isPrimary)
{
foreach (RadioChannel channel in this.RadioChannels)
{
if (channel.Members.Any(v => v.VoiceClient == voiceClient && v.IsPrimary == isPrimary))
return;
}
RadioChannel radioChannel = this.GetRadioChannel(radioChannelName, true);
radioChannel.AddMember(voiceClient, isPrimary);
}
public void LeaveRadioChannel(VoiceClient voiceClient)
{
foreach (RadioChannelMember membership in this.GetPlayerRadioChannelMembership(voiceClient))
{
membership.RadioChannel.RemoveMember(voiceClient);
if (membership.RadioChannel.Members.Length == 0)
{
lock (this._radioChannels)
{
this._radioChannels.Remove(membership.RadioChannel);
}
}
}
}
public void LeaveRadioChannel(VoiceClient voiceClient, string radioChannelName)
{
foreach (RadioChannelMember membership in this.GetPlayerRadioChannelMembership(voiceClient).Where(m => m.RadioChannel.Name == radioChannelName))
{
membership.RadioChannel.RemoveMember(voiceClient);
if (membership.RadioChannel.Members.Length == 0)
{
lock (this._radioChannels)
{
this._radioChannels.Remove(membership.RadioChannel);
}
}
}
}
public void LeaveRadioChannel(VoiceClient voiceClient, bool primary)
{
foreach (RadioChannelMember membership in this.GetPlayerRadioChannelMembership(voiceClient).Where(m => m.IsPrimary == primary))
{
membership.RadioChannel.RemoveMember(voiceClient);
if (membership.RadioChannel.Members.Length == 0)
{
lock (this._radioChannels)
{
this._radioChannels.Remove(membership.RadioChannel);
}
}
}
}
#endregion
#region Methods (Misc)
public string GetTeamSpeakName(Player player)
{
string name;
do
{
name = $"[{player.Handle.PadLeft(3, '0')}] Saphir-Life";
if (name.Length > 30)
{
name = name.Remove(29, name.Length - 30);
}
}
while (this._voiceClients.Values.Any(c => c.TeamSpeakName == name));
return name;
}
public bool IsVersionAccepted(string version)
{
if (!String.IsNullOrWhiteSpace(this.MinimumPluginVersion))
{
try
{
string[] minimumVersionArray = this.MinimumPluginVersion.Split('.');
string[] versionArray = version.Split('.');
int lengthCounter = 0;
if (versionArray.Length >= minimumVersionArray.Length)
{
lengthCounter = minimumVersionArray.Length;
}
else
{
lengthCounter = versionArray.Length;
}
for (int i = 0; i < lengthCounter; i++)
{
int min = Convert.ToInt32(minimumVersionArray[i]);
int cur = Convert.ToInt32(versionArray[i]);
if (cur > min)
{
return true;
}
else if (min > cur)
{
return false;
}
}
}
catch
{
return false;
}
}
return true;
}
#endregion
}
}
Alles anzeigen
fx_version 'adamant'
game 'gta5'
ui_page 'NUI/SaltyWebSocket.html'
client_scripts {
'SaltyClient/bin/Debug/SaltyClient.net.dll'
}
server_scripts {
'SaltyServer/bin/Debug/netstandard2.0/SaltyServer.net.dll'
}
files {
'NUI/SaltyWebSocket.html',
'Newtonsoft.Json.dll',
}
exports {
'SetPlayerAlive',
'EstablishCall',
'EndCall',
'SetPlayerRadioSpeaker',
'SetPlayerRadioChannel',
'RemovePlayerRadioChannel',
'SetRadioTowers'
}
VoiceEnabled 'true'
ServerUniqueIdentifier '-'
RequiredUpdateBranch 'Stable'
MinimumPluginVersion '1.3.3'
SoundPack 'default'
IngameChannelId '-'
IngameChannelPassword '-'
SwissChannelIds '88678, 88868, 88869, 88867, 88871, 88682, 88873, 88874, 88852, 88863, 88858, 88876, 88857, 88877, 88753, 88879, 88848, 88849, 88850, 88851, 88853, 88679, 88680, 88681, 88840, 88841, 88842, 88843, 88900, 88901, 88902, 88903, 88904, 88905, 88906, 88907, 88908, 88909, 88910, 88911, 88912, 88884, 88882, 88883, 88899, 88885, 88844'
Alles anzeigen
https://github.com/saltminede/saltychat-fivem
Fehlermeldung: https://gyazo.com/09914e246b69ce1dfe2cba5ece091d32
Ich bedanke mich für jede Hilfe!
Ich sitze seit Tagen dran, leider ohne Erfolg!
Liebe Grüße