TheVadiaCool Posted June 10, 2020 Share Posted June 10, 2020 В общем, написал скрипт на работу грузчика, основная часть написана на клиенте. Суть такая: спавнится точка, игрок встает на неё, берёт "груз", затем несёт его в здание. Суть проблемы: спавнится метка у двоих игроков в одном месте (от лица одного игрока она в одном месте и от лица того же в том же), и если её заберёт один игрок, то она пропадёт и у второго игрока и у обоих сработает хитКлиентМаркер. Кто знает, что нужно сделать, чтобы исправить это? Может быть как-то присвоить каждому игроку свой маркер или что? Пожалуйста, помогите. Скрипт и демонстрационное видео оставлю ниже. Сервер: pickup = createPickup(131.72089, -155.40170, 141.00000, 3, 1275, 0) jobBlip = createBlip(131.72089, -155.40170, 141.00000, 11, 0, 0, 0, 255) function jobCheck(source) if not getElementData(source, "job") then setElementData(source, "job", true) outputChatBox("#00FF00Вы устроились на работу грузчика.", source, 255, 255, 255, true) playerSkin = getPlayerSkin(source) setElementData(source, "skin", playerSkin) setPlayerSkin(source, 27) setTimer(function() triggerClientEvent(source, "createPickStart", source) end, 100, 1) else setElementData(source, "job", nil) outputChatBox("#00FF00Вы закончили работу грузчика.", source, 255, 255, 255, true) setPlayerSkin(source, getElementData(source, "skin")) triggerClientEvent(source, "endJ", source) end end addEventHandler("onPickupHit", pickup, jobCheck) Клиент: pickMarkers = { {141.09631, -162.59451, 141.00000}, {141.55725, -156.79323, 141.00000}, {143.05446, -150.61909, 141.00000} } putMarkers = { {145.51653, -168.54268, 142.50313}, {145.38332, -179.90881, 142.49567}, {136.64456, -175.62262, 142.50313}, {145.56894, -207.79187, 142.50313}, {136.34845, -199.31641, 142.50082}, {136.86980, -184.26260, 142.50313}, {136.42323, -167.00807, 142.50313} } zpMin = 50 zpMax = 150 function createPickMarker(source, hitPlayer, matchingDimension) local x,y,z = pickMarkers[math.random(1, #pickMarkers)][1],pickMarkers[math.random(1, #pickMarkers)][2],pickMarkers[math.random(1, #pickMarkers)][3]-1 pickMarker = createMarker(x,y,z, "cylinder", 1.5, 0, 150, 150, 155) plr = getLocalPlayer() outputChatBox("#00FF00Возьмите стройматериалы со склада.", 255, 255, 255, true) if not getElementData(source, "zp") then else local money = math.random(zpMin,zpMax) givePlayerMoney(money) outputChatBox("#00FF00Заработано: ".. money .."", 255, 255, 255, true) end if isElement(putMarker) then destroyElement(putMarker) end addEventHandler("onClientMarkerHit", pickMarker, createPutMarker) end function createPutMarker(source, hitPlayer, matchingDimension) local x,y,z = putMarkers[math.random(1, #putMarkers)][1],putMarkers[math.random(1, #putMarkers)][2],putMarkers[math.random(1, #putMarkers)][3]-1 putMarker = createMarker(x,y,z, "cylinder", 1.5, 0, 150, 150, 155) outputChatBox("#00FF00Отнесите стройматериалы в здание.", 255, 255, 255, true) if isElement(pickMarker) then destroyElement(pickMarker) end setElementData(source, "zp", true) addEventHandler("onClientMarkerHit", putMarker, createPickMarker) end addEvent("createPickStart", true) addEventHandler("createPickStart", root, createPickMarker) function endJob(source) if isElement(pickMarker) then destroyElement(pickMarker) end if isElement(putMarker) then destroyElement(putMarker) end end addEvent("endJ", true) addEventHandler("endJ", root, endJob) Мета: <meta> <info author="TheVadiaCool" type="script" name="Job" description="Gruzchik" /> <script src="server.Lua" type="server" /> <script src="client.Lua" type="client" /> </meta> Link to comment
Scripting Moderators Sarrum Posted June 10, 2020 Scripting Moderators Share Posted June 10, 2020 . Необходимо добавить проверку в событие, тогда маркер будет срабатывать только для локального игрока. if ( hitPlayer == localPlayer ) then Но по коду есть проблема. Событие onClientMarkerHit имеет неверный набор параметров. Если посмотреть на вики, то там их 2: hitPlayer и matchingDimension. В вашем коде source (источник события, которым является маркер) указан первым аргументом, тем самым переопределяется и становится элементом, который попал в маркер (hitPlayer). Соответственно идёт сдвиг, и hitPlayer становится matchingDimension. Формально это ни на что не влияет и можно называть параметры как душе угодно, но в данном случае налицо ошибка, которая лишает нас источника события (source) и путает неверным визуальным набором параметров. Главное понимать, что не названия параметров имеют значение, а их порядок. Пример того, как это должно быть: function createPickMarker ( hitPlayer, matchingDimension ) -- source - маркер -- hitPlayer - игрок, который попал в маркер -- matchingDimension - логический тип, true - если игрок находится в одном измерении с маркером if ( hitPlayer == localPlayer ) then -- проверка, если элемент это локальный игрок if ( matchingDimension ) then -- если измерение игрока с маркером совпадает (опционально) -- ... end end end Link to comment
TheVadiaCool Posted June 11, 2020 Author Share Posted June 11, 2020 9 hours ago, Sarrum said: . Необходимо добавить проверку в событие, тогда маркер будет срабатывать только для локального игрока. if ( hitPlayer == localPlayer ) then Но по коду есть проблема. Событие onClientMarkerHit имеет неверный набор параметров. Если посмотреть на вики, то там их 2: hitPlayer и matchingDimension. В вашем коде source (источник события, которым является маркер) указан первым аргументом, тем самым переопределяется и становится элементом, который попал в маркер (hitPlayer). Соответственно идёт сдвиг, и hitPlayer становится matchingDimension. Формально это ни на что не влияет и можно называть параметры как душе угодно, но в данном случае налицо ошибка, которая лишает нас источника события (source) и путает неверным визуальным набором параметров. Главное понимать, что не названия параметров имеют значение, а их порядок. Пример того, как это должно быть: function createPickMarker ( hitPlayer, matchingDimension ) -- source - маркер -- hitPlayer - игрок, который попал в маркер -- matchingDimension - логический тип, true - если игрок находится в одном измерении с маркером if ( hitPlayer == localPlayer ) then -- проверка, если элемент это локальный игрок if ( matchingDimension ) then -- если измерение игрока с маркером совпадает (опционально) -- ... end end end Большое спасибо за ответ! Понял свою ошибку, но до сих пор не могу понять, на что влияют аргументы. Link to comment
Scripting Moderators Sarrum Posted June 11, 2020 Scripting Moderators Share Posted June 11, 2020 7 hours ago, TheVadiaCool said: Большое спасибо за ответ! Понял свою ошибку, но до сих пор не могу понять, на что влияют аргументы. Конкретизируйте вопрос. С чем конкретно возникли трудности в понимании? Link to comment
TheVadiaCool Posted June 11, 2020 Author Share Posted June 11, 2020 41 minutes ago, Sarrum said: Конкретизируйте вопрос. С чем конкретно возникли трудности в понимании? Всё, спасибо Вам огромное, вопросов уж нет по данной теме. Но при написании другого скрипта, у меня возникли определённые проблемы. Не могли бы помочь? https://forum.multitheftauto.com/topic/125436-помогите-пожалуйста/?tab=comments#comment-981807 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