LoveFist Posted September 24, 2017 Share Posted September 24, 2017 On 19.09.2017 at 18:13, Jonathan.P said: Вопрос: что лучше и в каких случаях? Вопрос не касается самой системы AFK, а лишь архитектурной реализации системы "кустомных характеристик" на подобии встроенных "setElementModel", "setPedSkin". Для начала я бы руководствовался принципом KISS (Принцип KISS утверждает, что большинство систем работают лучше всего, если они остаются простыми, а не усложняются). Пока что у тебя нет проблемы и не факт что возникнет. Возможно тебе будет достаточно и стандартных механизмов. В теории можно много вариантов придумать. Чтобы понять какой из них более эффективный нужно тестировать и отслеживать ключевые метрики. На начальном этапе я бы не сказал что второй вариант архитектурно правильнее, т. к. он не решает никакой реальной проблемы и усложняет код. On 21.09.2017 at 19:09, Markn1 said: Помогите с сохранением. К примеру хочу сохранить ак 47 навык, плохо разбираюсь, первый раз работаю с бд В мета: <oop>true</oop> прописал. В дебаге ошибок нету. Получилось сделать сохранение с жизней и броней, а вот с навыками - нет А в базу записывается значение? А setData ID устанавливается? А что возвращает setPedStat? Может быть игрок не заспавнен, а ты ему устанавливаешь стату. Не уверен что в таком случае не сработает, но стоит проверить. Link to comment
Markn1 Posted November 7, 2017 Share Posted November 7, 2017 (edited) Йоу, ребят почему снимаются деньги при нажатие любой кнопки или элемента гуи? Даже если в админ панели нажимать кнопки снимаются деньги что не так сделал? * У меня имеется панель. При нажатия из списка убирается капот на автомобиле и снимаются деньги. Вот часть кода:client: function onClickRow ( btn, vehicle ) if btn ~= 'left' then return false; end; local theply = getLocalPlayer (); local vehicle = getPedOccupiedVehicle( theply ); local row, col = guiGridListGetSelectedItem ( vehList ); if vehicle then if ( row == 0 ) and ( col == 1 ) then triggerServerEvent ( "capot", theply, vehicle ); setVehicleComponentVisible ( vehicle, "bonnet_dummy", false ) end end end addEventHandler("onClientGUIClick", root, onClickRow) server: money = 500 addEvent("capot", true) addEventHandler("capot", root, function (vehicle, theply) if getPlayerMoney(source) > money then takePlayerMoney ( source, tonumber(money) ); setVehicleDoorState ( vehicle, 0, 4 ) else triggerClientEvent ( source, "sendMsg", source, "#ff3333Недостаточно денег!" ); end end ) Edited November 7, 2017 by Markn1 Link to comment
LoveFist Posted November 7, 2017 Share Posted November 7, 2017 У тебя обработчик события addEventHandler привязан к корневому элементу root. Соответственно будет срабатывать для всего Вместо root там должен быть элемент кнопки. Для примера фрагмент с вики: -- Create our button btnOutput = guiCreateButton( 0.7, 0.1, 0.2, 0.1, "Output!", true ) -- And attach our button to the outputEditBox function addEventHandler ( "onClientGUIClick", btnOutput, outputEditBox, false ) Link to comment
K1parik Posted December 20, 2017 Share Posted December 20, 2017 Подскажите как в guiCreateEdit разрешить использовать только латиницу? Link to comment
TheNormalnij Posted December 20, 2017 Share Posted December 20, 2017 56 minutes ago, K1parik said: Подскажите как в guiCreateEdit разрешить использовать только латиницу? Шаблоны в Lua. string.gsub + %W 1 Link to comment
K1parik Posted February 2, 2018 Share Posted February 2, 2018 помогите решить следующую задачу. например есть предложение "я иду гулять на улицу". нужно в нем найти слог "ля" и от него вырезать/заменить все слово от пробела до пробела. как это сделать? Link to comment
nikitafloy Posted February 2, 2018 Share Posted February 2, 2018 7 minutes ago, K1parik said: помогите решить следующую задачу. например есть предложение "я иду гулять на улицу". нужно в нем найти слог "ля" и от него вырезать/заменить все слово от пробела до пробела. как это сделать? Ищем вхождение в слово с помощью string.find Мы узнали какую позицию в строке занимает первое совпадение. Пробелы до и после текста ищем перебирая каждый символ в строке. Если совпадение найдено - отмечаем его. Если найдено еще одно совпадение, но позицию (которую нашли) мы еще не прошли - значит это не искомое слово, присваиваем ему позицию нашего нового пробела. Так ищем то самое слово - отмечаем пробел до и после него. И заменяем. Все делается циклом и строковыми функциями. 1 Link to comment
Erema93 Posted February 6, 2018 Share Posted February 6, 2018 Есть скрипт системы уровня. (http://www.mta-resource.ru/load/resource/id/3653). Как сделать зависимость работы от уровня игрока? На данном этапе сделал экспортс, в мета прописал <export function="getLevelXP" type="shared"/> Теперь пытаюсь поставить условие в client и server, но не получается. if exports.levelsystem:getLevelXP(thePlayer) >5 then -- если уровень больше 50, то else -- если нет, то outputChatBox ("Требуется уровень", source) end Вот коды без условия: client function postmanGui () postWindow = guiCreateWindow(0.25,0.35,0.4,0.4, "Почта России", true) postLabel = guiCreateLabel(0.09,0.09,0.8,0.5,[[Добро пожаловать! Здесь вы можете устроиться на работу курьером. Ваша задача доставлять посылки по адресам. Место доставки смотрите на карте (F11), ищите значок 'КРАСНЫй КРЕСТ'. Удачи!]], true,postWindow) guiCreateStaticImage(0.3,0.3,0.4,0.4,"logo.png",true, postWindow) guiLabelSetHorizontalAlign(postLabel,"center",true) btnAccept = guiCreateButton(0.115,0.7,0.25,0.2, "Работать",true, postWindow) addEventHandler("onClientGUIClick",btnAccept,postAccept) btnReject = guiCreateButton(0.615,0.7,0.25,0.2, "Выйти", true, postWindow) addEventHandler("onClientGUIClick",btnReject,postReject) guiSetVisible(postWindow, false) end addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), function () postmanGui () end ) function markerhit(thePlayer) if ( thePlayer == getLocalPlayer() ) then guiSetVisible(postWindow, true) showCursor(true) end end addEvent("showGui",true) addEventHandler("showGui", root, markerhit) function postReject () guiSetVisible(postWindow, false) showCursor(false) end function postAccept () triggerServerEvent("giveptJob", getLocalPlayer(), getLocalPlayer() ) postReject() end server local ptMarker = createMarker(2445.3193359375,2376.3627929688,12.163512229919, "cylinder", 1.0,0,246,255,50) createBlipAttachedTo(ptMarker,62) local ptLocations = { {2374.6892089844,2453.8020019531,9.8203125,2386.5104980469,2466.0422363281,9.8203125}, {2285.9223632813,2420.5947265625,9.8203125,2290.1352539063,2429.3674316406,9.8203125}, {2361.6052246094,2168.8100585938,9.728175163269,2371.3464355469,2166.7875976563,9.826180458069}, {2490.9536132813,2057.4877929688,9.671875,2489.5717773438,2061.8898925781,9.8203125}, {2217.6174316406,1879.0073242188,9.8203125,2225.0686035156,1840.8856201172,9.8203125}, {2159.8227539063,1681.1500244141,9.69529914856,2192.9865722656,1676.9221191406,11.3671875}, {2038.6607666016,1700.6901855469,9.671875,1968.5078125,1623.4499511719,11.860525131226}, {2034.4288330078,1915.4116210938,9.177909851074,2021.5031738281,1919.8021240234,11.340227127075}, {2126.4672851563,2355.6840820313,9.671875,2127.4155273438,2375.6845703125,9.8203125}, {2039.5809326172,1007.473449707,9.671875,2023.4976806641,1007.5405273438,9.8203125}} local ptNumber = {} addEventHandler("onMarkerHit",ptMarker, function(hitElement,matchingDimension) if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before triggerClientEvent("showGui", hitElement, hitElement) else outputChatBox("Садитесь в машину и везети посылки по адресу!", hitElement,100,100,100) end end end) ptVehicle = {} ptVehicleBlip = {} ptJobMarker = {} ptJobBlip = {} newMarker = {} nMBlip = {} function startptJob(thePlayer) setElementData(thePlayer,"AGJob","postman") ptVehicle[thePlayer] = createVehicle(440, 2434.855468,2376.087890,10.820312) ptVehicleBlip[thePlayer] = createBlipAttachedTo(ptVehicle[thePlayer],51) setElementVisibleTo(ptVehicleBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptVehicleBlip[thePlayer],thePlayer,true) setElementData(ptVehicle[thePlayer],"JobOwner", getPlayerName(thePlayer)) setElementData(ptVehicle[thePlayer],"AGJob","postman") warpPedIntoVehicle(thePlayer,ptVehicle[thePlayer]) ptMarkerJob(thePlayer) end addEvent("giveptJob",true) addEventHandler("giveptJob", root,startptJob) function ptMarkerJob(thePlayer) if ptNumber[thePlayer] then --outputChatBox("ptnumber") if ptNumber[thePlayer] == 1 then ptNumber[thePlayer] = ptNumber[thePlayer] + 1 --outputChatBox("ptnumber == 1, so + 1") elseif ptNumber[thePlayer] == 5 then ptNumber[thePlayer] = ptNumber[thePlayer] - math.random(1,3) --outputChatBox("ptnumber - ") else ptNumber[thePlayer] = ptNumber[thePlayer] + 1 --outputChatBox("ptnumber + 1") end ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200) ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41) setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer)) setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true) setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true) addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker) else ptNumber[thePlayer] = math.random(1,5) --outputChatBox("no ptnumber") --outputChatBox(ptNumber[thePlayer]) ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200) setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer)) ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41) setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true) setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true) addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker) end end function hitMarker(hitElement,matchingDimension) if (getElementType(hitElement) == "player" and getElementData(hitElement,"AGJob")== "postman" and isPedInVehicle(hitElement)) then --outputChatBox("first step") if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then --outputChatBox("second step") local vehicle = getPedOccupiedVehicle(hitElement) if (getElementData(vehicle,"JobOwner") == getElementData(source,"JobOwner" )) then --outputChatBox("third step") setElementFrozen(vehicle,true) outputChatBox("Выйдите из автомобиля! И донесите письмо.", hitElement,0,246,255) newMarker[hitElement] = createMarker(ptLocations[ptNumber[hitElement]][4],ptLocations[ptNumber[hitElement]][5],ptLocations[ptNumber[hitElement]][6],"cylinder",2,100,0,100,200) nMBlip[hitElement] = createBlipAttachedTo(newMarker[hitElement],44) setElementData(newMarker[hitElement],"JobOwner",getPlayerName(hitElement)) destroyElement(ptJobMarker[hitElement]) destroyElement(ptJobBlip[hitElement]) setElementVisibleTo(newMarker[hitElement],getRootElement(),false) setElementVisibleTo(nMBlip[hitElement],getRootElement(),false) setElementVisibleTo(newMarker[hitElement],hitElement,true) setElementVisibleTo(nMBlip[hitElement],hitElement,true) addEventHandler("onMarkerHit", newMarker[hitElement], hitMarker2) end end end end function hitMarker2(hitElement,_) if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then setElementFrozen(hitElement,true) outputChatBox("Письмо доставлено!",hitElement,3,229,250) destroyElement(newMarker[hitElement]) destroyElement(nMBlip[hitElement]) setTimer(unfreeze,3000,1,hitElement) end else local driver = getVehicleOccupant(hitElement) outputChatBox("Выйдите из автомобиля! И донесите письмо.",driver,229,250,2) end end function unfreeze(thePlayer) setElementFrozen(thePlayer, false) setElementFrozen(ptVehicle[thePlayer],false) givePlayerMoney(thePlayer,1000) ptMarkerJob(thePlayer) end function destroy() if getElementData(source,"AGJob") == "postman" then if isElement(ptVehicle[source]) then destroyElement(ptVehicle[source]) end if isElement(ptVehicleBlip[source]) then destroyElement(ptVehicleBlip[source]) end if isElement(ptJobMarker[source]) then destroyElement(ptJobMarker[source]) end if isElement(ptJobBlip[source]) then destroyElement(ptJobBlip[source]) end if isElement(newMarker[source]) then destroyElement(newMarker[source]) end if isElement(nMBlip[source]) then destroyElement(nMBlip[source]) end ptNumber[source] = nil end end addEventHandler("onPlayerQuit",getRootElement(), destroy) addEventHandler("onVehicleExplode", getRootElement(), function() if getElementData(source,"AGJob") == "postman" then local player = getPlayerFromName(getElementData(source,"JobOwner")) if isElement(ptVehicle[player]) then destroyElement(ptVehicle[player]) end if isElement(ptVehicleBlip[player]) then destroyElement(ptVehicleBlip[player]) end if isElement(ptJobMarker[player]) then destroyElement(ptJobMarker[player]) end if isElement(ptJobBlip[player]) then destroyElement(ptJobBlip[player]) end if isElement(newMarker[player]) then destroyElement(newMarker[player]) end if isElement(nMBlip[player]) then destroyElement(nMBlip[player]) end ptNumber[player] = nil setElementData(player,"AGJob",nil) end end) function allVehiclesAreDoomed () vehicles = getElementsByType("vehicle") for i, v in ipairs(vehicles) do destroyElement(v) end end addCommandHandler("fayagong",allVehiclesAreDoomed) addEventHandler("onVehicleStartEnter",getRootElement(), function(player,seat,jacked,door) if (getElementData(source,"AGJob") and getElementData(source,"AGJob")=="postman") then if (getElementData(source,"JobOwner") ~= getPlayerName(player)) then cancelEvent(true) outputChatBox("Это не ваш автомобиль!",player,200,0,50) end end end) addEventHandler("onElementDataChange",getRootElement(), function(dataName,oldValue) if getElementType(source) == "player" then if dataName == "AGJob" then if oldValue == "postman" then if isElement(ptVehicle[source]) then destroyElement(ptVehicle[source]) end if isElement(ptVehicleBlip[source]) then destroyElement(ptVehicleBlip[source]) end if isElement(ptJobMarker[source]) then destroyElement(ptJobMarker[source]) end if isElement(ptJobBlip[source]) then destroyElement(ptJobBlip[source]) end if isElement(newMarker[source]) then destroyElement(newMarker[source]) end if isElement(nMBlip[source]) then destroyElement(nMBlip[source]) end ptNumber[source] = nil end end end end) Пробовал весь код в условие поставить или выбрать отдельные функции, ничего не получалось. Помогите с кодом. Link to comment
K1parik Posted February 6, 2018 Share Posted February 6, 2018 мб в дебаге показывает какие ошибки? Link to comment
Erema93 Posted February 7, 2018 Share Posted February 7, 2018 call: failed to call 'levelsystem:getLevelXP [ string "?" ] - ошибка вызова attempt to compare boolean with number - попытка сравнить логическое с числовым Вот что в дебаге Link to comment
K1parik Posted February 7, 2018 Share Posted February 7, 2018 (edited) у тебя 53 minutes ago, Eema93 said: call: failed to call 'levelsystem:getLevelXP [ string "?" ] - ошибка вызова attempt to compare boolean with number - попытка сравнить логическое с числовым Вот что в дебаге у тебя функция вот така function getLevelXP (level) return level*xpPerLevel end ты передаешь в нее игрока thePlayer, а нужно число проверяй так if getElementData ( source, "player:xp" ) > 5 then -- если уровень больше 5, то else -- если нет, то outputChatBox ("Требуется уровень", source) end Edited February 7, 2018 by K1parik Link to comment
Erema93 Posted February 7, 2018 Share Posted February 7, 2018 (edited) Эта функция в самом скрипте системы уровней. А сделать exports.levelsystem:getLevelXP(thePlayer) мне сказал nikitafloy Проверил, теперь так Bad argument @ 'getElementData' [Expected element at argument 1, got nil] attempt to compare number with boolean Edited February 7, 2018 by Eema93 Link to comment
K1parik Posted February 7, 2018 Share Posted February 7, 2018 41 minutes ago, Eema93 said: Эта функция в самом скрипте системы уровней. А сделать exports.levelsystem:getLevelXP(thePlayer) мне сказал nikitafloy Проверил, теперь так Bad argument @ 'getElementData' [Expected element at argument 1, got nil] attempt to compare number with boolean скинь саму функцию в которую вставляешь это условие Link to comment
Erema93 Posted February 7, 2018 Share Posted February 7, 2018 Выше я выкладывал все коды (скрипта работы), в котором я пробовал брать как и весь код, так и в отдельные функции. Нужно, чтобы,если игрок нужного уровня встает на маркер, то срабатывает скрипт работы, иначе ему выдаст в чате сообщение "Требуется такой-то уровень" Link to comment
K1parik Posted February 7, 2018 Share Posted February 7, 2018 (edited) 5 minutes ago, Eema93 said: addEventHandler("onMarkerHit",ptMarker, function(hitElement,matchingDimension) if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then local lvl = getElementData ( hitElement, "player:level" ) or 0 if lvl >= 5 then if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before triggerClientEvent("showGui", hitElement, hitElement) else outputChatBox("Садитесь в машину и везети посылки по адресу!", hitElement,100,100,100) end else outputChatBox ("Требуется уровень 5 или выше. У вас "..lvl.." увроень", hitElement) end end end) Edited February 7, 2018 by K1parik 1 Link to comment
Erema93 Posted February 7, 2018 Share Posted February 7, 2018 Работает, спасибо K1parik. Вопрос решен, с остальными работами буду пробовать сам. Link to comment
Erema93 Posted February 7, 2018 Share Posted February 7, 2018 Теперь вот вопрос: как правильно экспортировать (используя я эту же систему уровней) начисление опыта? Нужно, чтобы когда игрок доставил посылку, то ему дали очки опыта. Link to comment
K1parik Posted February 7, 2018 Share Posted February 7, 2018 1 hour ago, Eema93 said: Теперь вот вопрос: как правильно экспортировать (используя я эту же систему уровней) начисление опыта? Нужно, чтобы когда игрок доставил посылку, то ему дали очки опыта. в скрипте есть функция givePlayerXP (на серверной части) вот для нее сделай экспорт и давай опыт. типа givePlayerXP ( игрок, число_опыта ) Link to comment
Erema93 Posted February 8, 2018 Share Posted February 8, 2018 Какой из этих вариантов правильный будет в данном коде: exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100) exports [ "levelsystem" ]:givePlayerXP (hitElement, 100) exports [ "levelsystem" ]:givePlayerXP (source, 100) ? Link to comment
K1parik Posted February 8, 2018 Share Posted February 8, 2018 6 hours ago, Eema93 said: Какой из этих вариантов правильный будет в данном коде: exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100) exports [ "levelsystem" ]:givePlayerXP (hitElement, 100) exports [ "levelsystem" ]:givePlayerXP (source, 100) ? зависит от того какой переменной передается игрок в функцию в которую ты будешь это вставлять Link to comment
Erema93 Posted February 8, 2018 Share Posted February 8, 2018 (edited) 1 hour ago, K1parik said: зависит от того какой переменной передается игрок в функцию в которую ты будешь это вставлять Ну в том коде, который я выше показывал. Попробовал exports [ "levelsystem" ]:givePlayerXP (thePlayer, 100), выдает ошибку call: failed to call 'levelsystem:givePlayerXP' [string "?"] Попробовал exports [ "levelsystem" ]:givePlayerXP (hitElement, 100), выдает такую же ошибку Попробовал exports [ "levelsystem" ]:givePlayerXP (source, 100), выдает тоже самую ошибку local ptMarker = createMarker(2445.3193359375,2376.3627929688,12.163512229919, "cylinder", 1.0,0,246,255,50) createBlipAttachedTo(ptMarker,62) local ptLocations = { {2374.6892089844,2453.8020019531,9.8203125,2386.5104980469,2466.0422363281,9.8203125}, {2285.9223632813,2420.5947265625,9.8203125,2290.1352539063,2429.3674316406,9.8203125}, {2361.6052246094,2168.8100585938,9.728175163269,2371.3464355469,2166.7875976563,9.826180458069}, {2490.9536132813,2057.4877929688,9.671875,2489.5717773438,2061.8898925781,9.8203125}, {2217.6174316406,1879.0073242188,9.8203125,2225.0686035156,1840.8856201172,9.8203125}, {2159.8227539063,1681.1500244141,9.69529914856,2192.9865722656,1676.9221191406,11.3671875}, {2038.6607666016,1700.6901855469,9.671875,1968.5078125,1623.4499511719,11.860525131226}, {2034.4288330078,1915.4116210938,9.177909851074,2021.5031738281,1919.8021240234,11.340227127075}, {2126.4672851563,2355.6840820313,9.671875,2127.4155273438,2375.6845703125,9.8203125}, {2039.5809326172,1007.473449707,9.671875,2023.4976806641,1007.5405273438,9.8203125}} local ptNumber = {} addEventHandler("onMarkerHit",ptMarker, function(hitElement,matchingDimension) if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then local lvl = getElementData ( hitElement, "player:level" ) or 0 if lvl >= 1 then if not (getElementData(hitElement,"AGJob") == "postman") then -- we use this to check if the player did not take the job before triggerClientEvent("showGui", hitElement, hitElement) else outputChatBox("Садитесь на велосипед и везети посылки по адресу!", hitElement,100,100,100) end else outputChatBox ("Требуется уровень 5 или выше. У вас "..lvl.." уровень", hitElement) end end end) ptVehicle = {} ptVehicleBlip = {} ptJobMarker = {} ptJobBlip = {} newMarker = {} nMBlip = {} function startptJob(thePlayer) setElementData(thePlayer,"AGJob","postman") ptVehicle[thePlayer] = createVehicle(510, 2434.855468,2376.087890,10.820312) ptVehicleBlip[thePlayer] = createBlipAttachedTo(ptVehicle[thePlayer],51) setElementVisibleTo(ptVehicleBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptVehicleBlip[thePlayer],thePlayer,true) setElementData(ptVehicle[thePlayer],"JobOwner", getPlayerName(thePlayer)) setElementData(ptVehicle[thePlayer],"AGJob","postman") warpPedIntoVehicle(thePlayer,ptVehicle[thePlayer]) ptMarkerJob(thePlayer) end addEvent("giveptJob",true) addEventHandler("giveptJob", root,startptJob) function ptMarkerJob(thePlayer) if ptNumber[thePlayer] then --outputChatBox("ptnumber") if ptNumber[thePlayer] == 1 then ptNumber[thePlayer] = ptNumber[thePlayer] + 1 --outputChatBox("ptnumber == 1, so + 1") elseif ptNumber[thePlayer] == 5 then ptNumber[thePlayer] = ptNumber[thePlayer] - math.random(1,3) --outputChatBox("ptnumber - ") else ptNumber[thePlayer] = ptNumber[thePlayer] + 1 --outputChatBox("ptnumber + 1") end ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200) ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41) setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer)) setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true) setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true) addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker) else ptNumber[thePlayer] = math.random(1,5) --outputChatBox("no ptnumber") --outputChatBox(ptNumber[thePlayer]) ptJobMarker[thePlayer] = createMarker(ptLocations[ptNumber[thePlayer]][1],ptLocations[ptNumber[thePlayer]][2],ptLocations[ptNumber[thePlayer]][3],"cylinder",2,100,100,0,200) setElementData(ptJobMarker[thePlayer],"JobOwner",getPlayerName(thePlayer)) ptJobBlip[thePlayer] = createBlipAttachedTo(ptJobMarker[thePlayer],41) setElementVisibleTo(ptJobMarker[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobBlip[thePlayer],getRootElement(),false) setElementVisibleTo(ptJobMarker[thePlayer],thePlayer,true) setElementVisibleTo(ptJobBlip[thePlayer],thePlayer,true) addEventHandler("onMarkerHit", ptJobMarker[thePlayer], hitMarker) end end function hitMarker(hitElement,matchingDimension) if (getElementType(hitElement) == "player" and getElementData(hitElement,"AGJob")== "postman" and isPedInVehicle(hitElement)) then --outputChatBox("first step") if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then --outputChatBox("second step") local vehicle = getPedOccupiedVehicle(hitElement) if (getElementData(vehicle,"JobOwner") == getElementData(source,"JobOwner" )) then --outputChatBox("third step") setElementFrozen(vehicle,true) outputChatBox("Выйдите из автомобиля! И донесите письмо.", hitElement,0,246,255) newMarker[hitElement] = createMarker(ptLocations[ptNumber[hitElement]][4],ptLocations[ptNumber[hitElement]][5],ptLocations[ptNumber[hitElement]][6],"cylinder",2,100,0,100,200) nMBlip[hitElement] = createBlipAttachedTo(newMarker[hitElement],44) setElementData(newMarker[hitElement],"JobOwner",getPlayerName(hitElement)) destroyElement(ptJobMarker[hitElement]) destroyElement(ptJobBlip[hitElement]) setElementVisibleTo(newMarker[hitElement],getRootElement(),false) setElementVisibleTo(nMBlip[hitElement],getRootElement(),false) setElementVisibleTo(newMarker[hitElement],hitElement,true) setElementVisibleTo(nMBlip[hitElement],hitElement,true) addEventHandler("onMarkerHit", newMarker[hitElement], hitMarker2) end end end end function hitMarker2(hitElement,_) if (hitElement and getElementType(hitElement) == "player" and not isPedInVehicle(hitElement)) then if (getElementData(source,"JobOwner") == getPlayerName(hitElement)) then setElementFrozen(hitElement,true) outputChatBox("Письмо доставлено!",hitElement,3,229,250) destroyElement(newMarker[hitElement]) destroyElement(nMBlip[hitElement]) setTimer(unfreeze,3000,1,hitElement) end else local driver = getVehicleOccupant(hitElement) outputChatBox("Выйдите из автомобиля! И донесите письмо.",driver,229,250,2) end end function unfreeze(thePlayer) setElementFrozen(thePlayer, false) setElementFrozen(ptVehicle[thePlayer],false) exports [ "levelsystem" ]:givePlayerXP (thePlayer, 10) givePlayerMoney(thePlayer,1000) ptMarkerJob(thePlayer) end function destroy() if getElementData(source,"AGJob") == "postman" then if isElement(ptVehicle[source]) then destroyElement(ptVehicle[source]) end if isElement(ptVehicleBlip[source]) then destroyElement(ptVehicleBlip[source]) end if isElement(ptJobMarker[source]) then destroyElement(ptJobMarker[source]) end if isElement(ptJobBlip[source]) then destroyElement(ptJobBlip[source]) end if isElement(newMarker[source]) then destroyElement(newMarker[source]) end if isElement(nMBlip[source]) then destroyElement(nMBlip[source]) end ptNumber[source] = nil end end addEventHandler("onPlayerQuit",getRootElement(), destroy) addEventHandler("onVehicleExplode", getRootElement(), function() if getElementData(source,"AGJob") == "postman" then local player = getPlayerFromName(getElementData(source,"JobOwner")) if isElement(ptVehicle[player]) then destroyElement(ptVehicle[player]) end if isElement(ptVehicleBlip[player]) then destroyElement(ptVehicleBlip[player]) end if isElement(ptJobMarker[player]) then destroyElement(ptJobMarker[player]) end if isElement(ptJobBlip[player]) then destroyElement(ptJobBlip[player]) end if isElement(newMarker[player]) then destroyElement(newMarker[player]) end if isElement(nMBlip[player]) then destroyElement(nMBlip[player]) end ptNumber[player] = nil setElementData(player,"AGJob",nil) end end) function allVehiclesAreDoomed () vehicles = getElementsByType("vehicle") for i, v in ipairs(vehicles) do destroyElement(v) end end addCommandHandler("fayagong",allVehiclesAreDoomed) addEventHandler("onVehicleStartEnter",getRootElement(), function(player,seat,jacked,door) if (getElementData(source,"AGJob") and getElementData(source,"AGJob")=="postman") then if (getElementData(source,"JobOwner") ~= getPlayerName(player)) then cancelEvent(true) outputChatBox("Это не ваш автомобиль!",player,200,0,50) end end end) addEventHandler("onElementDataChange",getRootElement(), function(dataName,oldValue) if getElementType(source) == "player" then if dataName == "AGJob" then if oldValue == "postman" then if isElement(ptVehicle[source]) then destroyElement(ptVehicle[source]) end if isElement(ptVehicleBlip[source]) then destroyElement(ptVehicleBlip[source]) end if isElement(ptJobMarker[source]) then destroyElement(ptJobMarker[source]) end if isElement(ptJobBlip[source]) then destroyElement(ptJobBlip[source]) end if isElement(newMarker[source]) then destroyElement(newMarker[source]) end if isElement(nMBlip[source]) then destroyElement(nMBlip[source]) end ptNumber[source] = nil end end end end) Edited February 8, 2018 by Eema93 Link to comment
K1parik Posted February 8, 2018 Share Posted February 8, 2018 вроде как у тебя функция почему то не вызывается. мб не правильно сделал экспорт Link to comment
Erema93 Posted February 8, 2018 Share Posted February 8, 2018 Да, уже сам разобрался где ошибки и исправил Link to comment
Fabervox Posted February 20, 2018 Share Posted February 20, 2018 (edited) @K1parik , для твоей задачи, регулярка должна выполнять условие: пробел, любые буквы, ля, любые буквы, пробел. Этот захват заменять на один пробел. Edited February 20, 2018 by Fabervox Link to comment
Kail_Flin Posted March 30, 2018 Share Posted March 30, 2018 Доброго времени суток, помогите с такой задачкой. я создаю ComboBox в нем список интерьеров, выбрав нужный интерьер я индексирую массив с координатами и номером интерьером, как правильно создать Event на стороне сервера и переместить игрока по координатам из массива? (я пытался делать так как в коде ниже, но не выходит сервер сообщает об ошибке) --Клиентская часть hc_edit['combo_box'] = guiCreateComboBox ( 0.05, 0.08, 0.39, 0.3, "Интерьер", true, hc_gui['main'] ); for index, value in ipairs (ints) do -- We loop through all vehicles. guiComboBoxAddItem ( hc_edit['combo_box'], 'int '..index ); -- We add the vehicle name to our combo box. end; addEventHandler( 'onClientGUIClick', hc_edit['combo_box'], function( btn ) local item = guiComboBoxGetSelected(hc_edit['combo_box']); outputChatBox("Координаты X:" .. ints[item+1][1] .. "Y: " .. ints[item+1][2] .. "Z: " .. ints[item+1][3] .. "INT: " .. ints[item+1][4]); setElementData( item, 'tp_info', { ints[item+1][1], ints[item+1][2], ints[item+1][3], ints[item+1][4]} ); triggerServerEvent( 'interior_teleport', me ); end); -- Серверная часть addEvent( 'interior_teleport', true ); addEventHandler( 'interior_teleport', root, function() setElementFrozen( client, false ); local t = {}; for i = 1, 5 do t[i] = getElementData( item, 'tp_info' )[i]; end; fadeCamera( client, false ); toggleAllControls( client, false ); setTimer( function( player, t ) if getPedOccupiedVehicle( player ) then removePedFromVehicle( player ); end; setElementInterior( player, t[4], t[1], t[2], t[3] ); setElementDimension( player, t[5] ); toggleAllControls( player, true ); fadeCamera( player, true ); end, 1200, 1, client, t ); end ); Я брал за основу house system. Ошибка в строке t = getElementData( item, 'tp_info' ); Error: attempt to index a boolean value Заранее спасибо. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now