2015-01-11 4 views
0

Я пытаюсь создать Lua-аддон для Garry's Mod, но я продолжаю сталкиваться с ошибкой в ​​своем коде. Это мой код:Lua пытается вызвать поле 'PlayFile' (значение nil)

function say (Player, text, ent) 
    s = "/misc/custom/"..text 
    s2 = s..".mp3" 
    sound.PlayFile(s2) 
end 
hook.Add("PlayerSay", "Say", say) 

И это результирующая ошибка.

[saysoundtest25] lua/autorun/chatsounds.lua:4: attempt to call field 'PlayFile' (a nil value) 
1. v - lua/autorun/chatsounds.lua:4 
2. unknown - lua/includes/modules/hook.lua:84 

Любые идеи?

+0

Это означает, что 'sound' существует как объект, но у него нет члена, называемого' PlayFile'. Я никогда не использовал gmod, поэтому из того, что вы показываете, может быть, что какой-то код, который вы запускаете в другом месте, имеет «звук = что-то»? Или, что менее вероятно (потому что Lua не жалуется, что 'sound' не существует, просто что у него нет поля' PlayFile' как поля), может быть, вам нужно активировать что-то в интерфейсе gmod или config, чтобы сделать доступен звуковой модуль? – Schollii

ответ

0

Пользователь Robotboy655 на Facepunch помог мне решить эту проблему! Окончательный код:

hook.Add("PlayerSay", "Say", function(ply, text, team) 
BroadcastLua('surface.PlaySound("misc/custom/' .. text .. '.mp3")') 
end) 

Спасибо всем за помощь!

0

Файл /lua/autorun является сервером и существует переменная sound серверная сторона Lua, однако только на стороне клиента существует sound.PlayFile.

if SERVER then 
    AddCSLuaFile() -- We're the server running this code! Let's send it to the client 
else -- We're a client! 
-- Your code here, only ran by the client! 
end 

Смотрите the Garry's Mod wiki для получения дополнительной информации и обратите внимание на оранжевый ящик на странице, которая означает, что он на стороне клиента.

Пожалуйста, не забудьте проверить, что функция принимает также:

sound.PlayFile(string path, string flags, function callback)

Пример (из вики)

sound.PlayFile("sound/music/vlvx_song22.mp3", "", function(station) 
    if (IsValid(station)) then station:Play() end 
end) 

также более легкий способ поиска в документации:

http://glua.me/

http://glua.me/docs/#?q=sound.PlayFile

Как DarkRP обрабатывает это:

https://github.com/FPtje/DarkRP/blob/master/gamemode/modules/chatsounds.lua#L275

+0

@Schollii это игра, и есть только функции на стороне сервера и функции клиентской стороны ... в этом случае 'sound.PlayFile' только на стороне клиента, а папка autorun - исключительно серверная. – Codingale

+0

Также обязательно отметьте это как принятое, если оно исправит вашу проблему! – Codingale

+0

Я видел предложение использовать surface.PlaySound. Код: 'BroadcastLua ('surface.PlaySound (s2)')' почти работает, но в итоге я получаю сообщение об ошибке «PlaySound» (строка, ожидаемая, полученная нуль). «Если я знаю точный файл для воспроизведения, например "hello.mp3", тогда код 'BroadcastLua ('surface.PlaySound ("/misc/custom/hello.mp3 ")')' будет воспроизводить звук всякий раз, когда текст вводится в чат. Сложная часть делает его динамическим для разных входов. –

Смежные вопросы