YND
Members-
Posts
34 -
Joined
-
Last visited
Everything posted by YND
-
Что в таком случае делать? isLineOfSightClear говорит, что все чисто, на внешний вид препятствий нет, но пули летят в стол. UPD: дело даже не в столе, он и впритык стреляет, но не попадает. Буду искать причину.. function sellerAim(player, ped) if getElementType(player) == "player" and getElementType(ped) == "ped" then local pedhp = getElementHealth ( ped ) if pedhp > 0 and (isPlayerDead(player) == false) then local x,y,z = getElementPosition( player ) local ex,ey,ez = getElementPosition( ped ) local isclear = isLineOfSightClear (ex, ey, ez+.5, x, y, z+.5, true, false, false, true, false, false, false) if (isclear == true) then if isPedDucked(player) then setPedAimTarget ( ped, x, y, z-.2 ) dxDrawLine3D (ex, ey, ez+.5, x, y, z-.2) else setPedAimTarget ( ped, x, y, z ) dxDrawLine3D (ex, ey, ez+.5, x, y, z+.5) end end setTimer ( sellerAim, 80, 1, player, ped ) else setPedControlState(getElementByID("Ammo1Seller"), "fire", false) end end end setPedAimTarget лучше вызывать с помощью setTimer (каждые n миллисекунд) или с помощью onClientPreRender? Просто событие, по-идее, будет срабатывать для каждого элемента, а не только для педов (а уж потом в функции проверять, пед ли это), коих довольно-таки много.
-
Спасибо. Но если отменить эвент, то анимация один раз применится и больше эта функция никогда не вызовется; это же лучше, чем если она будет вызываться каждый раз, когда пед в стриме, ведь анимация все равно остается. Разве не так? function startPeds( ) if getElementType( source ) == "ped" then setPedAnimation( source, "SHOP", "SHP_Serve_Idle" ) removeEventHandler("onClientElementStreamIn", source, startPeds) end end addEventHandler("onClientElementStreamIn", resourceRoot, startPeds) И еще: есть ли вместо "resourceRoot" какой-нибудь "элемент-родитель", который указывал бы на всех педов ресурса? Чтобы заставить педа атаковать игрока, нужно ручками направлять прицел не игрока, пускать огонь и т.д.? Или есть какая-нибудь функция? Понял, ручками.
-
Помогите же Если до вызова функции я не видел в лицо педа, независимо от задержки её выполнения/рестарта ресурса, то к нему анимация не применяется. Почему так? Что делать? Не выполнять же эту функцию, когда кто-нибудь увидит этого педа, а потом отменять евент, ерунда же..
-
Продублирую тут, так как в "Примеры" никто, видимо, не заходит. Нужно заменить текстуру объекта: addEventHandler ( 'onClientResourceStart', resourceRoot, function() txd_deletedAmmo = engineLoadTXD ( "txd/2notherbuildsfe.txd" ) engineImportTXD ( txd_deletedAmmo, 18034 ) if engineImportTXD ( txd_deletedAmmo, 18041 ) == true then outputChatBox "Текстура загрузилась" else outputChatBox "ТЕКСТУРА НЕ ЗАГРУЗИЛАСЬ" end end ) <meta> <info author="noob" name="ammoResource" version="1.0" type="script" /> <oop>true</oop> <script src="buyammo.lua" type="client" /> <file src="txd/2notherbuildsfe.txd" type="client" /> </meta> Рядом с "meta.xml" папка "txd", в которой файл "2notherbuildsfe.txd". В чат выводит, что "Текстура загрузилась", но на самом деле изменений нет. id проверял. Что я делаю не так? UPD: что за.., ничего не работает: addEventHandler("onResourceStart", resourceRoot, function() for _, ammoSeller in ipairs ( getElementsByType ( "ped" ) ) do outputChatBox (getElementData(ammoSeller, "id")) --выводит id ammoSeller'a setPedAnimation ( ammoSeller, "SHOP", "SHP_Serve_Idle" ) end end ) Файл серверный, id педа выводит, а анимация не применяется, ровно как и оружие не дается..
-
addEventHandler ( 'onClientResourceStart', resourceRoot, function() txd_deletedAmmo = engineLoadTXD ( "txd/2notherbuildsfe.txd" ) engineImportTXD ( txd_deletedAmmo, 18034 ) if engineImportTXD ( txd_deletedAmmo, 18041 ) == true then outputChatBox "Текстура загрузилась" else outputChatBox "ТЕКСТУРА НЕ ЗАГРУЗИЛАСЬ" end end ) <meta> <info author="noob" name="ammoResource" version="1.0" type="script" /> <oop>true</oop> <script src="buyammo.lua" type="client" /> <file src="txd/2notherbuildsfe.txd" type="client" /> </meta> Рядом с "meta.xml" папка "txd", в которой файл "2notherbuildsfe.txd". В чат выводит, что "Текстура загрузилась", но на самом деле изменений нет. id проверял. Что я делаю не так?
-
Strix, благодарю.
-
У меня есть таблица созданных пикапов pickup[1]; pickup[2]...pickup[n]. Как прикрепить к ним событие "onPickupHit"? Прицепить его к "pickup" не вышло. Прицеплять к каждому - не вариант. Прицепить к руту - есть пикапы, для которых не нужно, чтобы срабатывало событие, а делать так, наверное, глупо. Что тогда делать? for i=1, ido if source == pickup[i] then --code return end end Табуляцию не могу сделать, так как пишу прямо тут. UPD: Как сделать видимым пикап, лишь для одного игрока? gamePickup[1] = createPickup (830.70001, -872.79999, 68.8, 107.9, 3, 1247); setElementVisibleTo (gamePickup[1], root, false); setElementVisibleTo (gamePickup[1], thePlayer, true); Так жалуется, что первый аргумент - bool, но почему так?
-
Снимаю шляпу перед вами. Очень хорошо все расписано. ИМХО, стоит подредактировать и добавить в уроки.
-
Так работает: local cars = {} local cars_meta = { __call = function(self, car) --<<<<<< setVehiclePaintjob (car, 2) --<<<<<< end } setmetatable(cars, cars_meta) addCommandHandler("mt", function() cars(cars[1]) -- тут я cars[1] передаю в качестве аргумента end) А так выдает, что "call method 'cars' - nil". local cars = {} local cars_meta = { __call = function(self) --<<<<<< setVehiclePaintjob (self, 2) --<<<<<< end } setmetatable(cars, cars_meta) addCommandHandler("mt", function() cars[1]:cars() -- а тут пытаюсь переда, как self end) Этот код мне самому непонятен, но ошибка такая, что первый аргумент setVehiclePaintjob - таблица. Т.е. функция вызывается, но self != cars[2] local cars = {} local cars_meta = {__call = function(returncar) return returncar end} --<<<<<< setmetatable(cars, cars_meta) function cars:Nulled() setVehiclePaintjob (self, 2) end addCommandHandler("mt", function() cars[1] = cars(cars[1) --<<<<<< cars[1]:Nulled() end) Так же непонятно, почему без строки "vec1 = Vector3( 192, 168, 0 );" ваша функция "Vector3:Nulled" не вызовется, а с ней - вызывается?
-
Это понятно, непонятно то, как сделать одну функцию для n объектов. Т.е. есть, например, функция: function cars:delDoor(args) --body end Для конкретного объекта можно её вызвать так (но в данном случае self = cars): cars:delDoor(carMustang) cars:delDoor(carBus) cars:delDoor(carBullet) Но как её вызвать так?: carMustang:delDoor() carBus:delDoor() carBullet:delDoor()
-
cars = {} cars_prototype = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"} cars_meta = {__index = cars_prototype} function cars:new (o) o = o or {} setmetatable(o, cars_meta) return createVehicle(o.model,o.x,o.y,o.z,o.rx,o.ry,o.rz,o.carText) end function cars:paintjob setVehiclePaintjob (self, 2) end addCommandHandler("mtcv", function() for i=1, 2 do cars[i] = cars:new{model = 560, carText = "Sultan"} end end) addCommandHandler("mt", function cars[1]:paintjob end) Восьмой час уже пытаюсь разобраться в мета-таблицах, ООП и пр. Сдаюсь. Допустим мне нужно поменять Paintjob конкретной машины. Как вызвать функцию cars:paintjob так, чтобы self был cars[1] ? Передавать отдельным аргументом не вариант. Возможно ли?
-
А чем он небезопасен? Просто если делать по вашему примеру, то придется каждый раз проверять все (100-1000) маркеров на "isElementWithinMarker()", что, как мне кажется, более ресурсоёмко, чем 2 лишних эвента, не так ли?
-
Спасибо за ответ, но как я понял, каждый раз придется проверять каждый маркер на "isElementWithinMarker()". Поэтому, буду использовать эвенты onClientMarkerHit и onClientMarkerLeave, и записывать их с помощью setElementData(localPlayer, "inMarker", source) Если так делать не стоит, напишите, пожалуйста.
-
"idMarkerGet" равен ведь "test text", значит getMarkers должен вернуть "test text", но, не возвращает.
-
Спасибо. Не будет ли это слишком ресурсоёмко, при большом количестве маркеров? UPD: В серверном файле, где создаются маркеры, в консоль выводит "corona", а в клиентском файле, не выводит "так как outputDebugString - bollean ". outputDebugString(getMarkerIcon(getElementByID("marker name"))) UPD2: И мой первый вариант не работает. В "Ybuilding/meta.xml" прописано: function="getMarkers" type="server" /> В серверном файле: function getMarkers ( idMarkerGet ) return idMarkerGet end И при вызове функции из клиентского файла outputDebugString(getMarkers("test text")) выдает, мол "глобальный getMarkers возвращает nil"
-
function getMarkers ( idMarkerGet ) return markers[idMarkerGet] end UPD: Но, не хочет работать...
-
В серверном файле находится массив из маркеров. А в клиентском файле мне нужно узнать, стоит ли игрок в маркере ( isElementWithinMarker() ). Как передать элемент маркера (массив элементов) из серверного файла в клиентский? + Функция, в которой находится isElementWithinMarker(), вызывается из другого ресурса через call.
-
Просто из вас учитель никакой.. Из одного поста Kernell я многое понял, а вы лишь пишите, что код ужасен, что у меня знания нулевые, да и к тому же не читаете предыдущие комментарии. Такой "учитель" ни одному новичку не нужен, ибо вот из-за такого "учителя" они подумают что это не ихнее и забросят сие дело.
-
Да, но у вас вроде наоборот клиент посылает пакет на сервер, клиент не может за всех игроков отправить (поэтому там и нет этого "первого" аргумента). Да. Ещё обратите внимание, что событие не может быть вызвано, если source выходит за пределы дерева указанного в addEventHandler. Ну насколько я понял, то функция будет работать только у тех, кто ниже елемента указанного в addEventHandler.. (Ну и самого этого указанного елемента) Спасибо.
-
Полного прозрения не нашло, но это пока самый полезный пост в этой теме Спасибо. Если я первым аргументом в triggerClientEvent укажу root, то когда кто-нибудь введет (в моем случае) комманду /spwcar и выберет автомобиль, то он заспавнится около каждого игрока ? Чтобы sourc'ом был игрок - какой надо указать второй аргумент ? localPlayer ?
-
https://wiki.multitheftauto.com/index.ph ... ement_tree Что нужно указать вместо root, чтобы source был клиентом ? ЧТо такое дерево я понимаю, но в каком случае использовать root, а в каком что-то иное - не очень..
-
Не копипастну, ибо этот спавн каров начал лишь для того, чтобы учить lua, а так он мне не нужен .. Если бы вы мне внятно пояснили где использовать root, а где что-то другое... И что все же ужасного в моем коде ?
-
Откуда localPlayer ? Я его через триггер передал, сколько раз писать... Kenix предлагал мне использовать source - его то я и использовал, но он не работает.. По идее, если source - это игрок который передал через триггер переменные, то source должен быть равен localPlayer.. На клиенте вы дописали local .. На сервере: Как же tonumber(idspwcar) , он же в текстовом виде передается.. vehicleNamespw вы убрали.. В итоге вы просто уменьшили код (я, как любой начинающий растянул код) и убрали переменную vehicleNamespw.. Спасибо за "client" (если работает..), так как source не работает.. Ужасного кода у себя я не вижу..
-
Клиент: --Передаем id на серв < function carspawnguispw ( button ) if button == "left" then selectgridlist = guiGridListGetSelectedItem (GUIEditor.gridlist[1]) idspwcar = guiGridListGetItemText (GUIEditor.gridlist[1], selectgridlist, GUIEditor.addcol[1]) triggerServerEvent("zaspwcar", getRootElement(), localPlayer, idspwcar) -- outputChatBox(idspwcar) guiSetVisible(GUIEditor.window[1], false) showCursor(false) -- guiSetInputEnabled(false) end end --Передаем id на серв > Сервер: function zaspwncarto(localPlayer, idspwcar) outputChatBox(source) -- 00000001 outputChatBox(localPlayer) -- 0000002F local spwcarid = tonumber(idspwcar) local px,py,pz = getElementPosition(source) px = px + 5 local createdVehicle = createVehicle(spwcarid,px,py,pz) local vehicleNamespw = getVehicleNameFromModel (spwcarid) if (createdVehicle == false) then outputChatBox(vehicleNamespw.." не заспавнен.",source) else outputChatBox(vehicleNamespw.." заспавнен.",source) end end addEvent("zaspwcar",true) addEventHandler("zaspwcar",root,zaspwncarto) source выводит 00000001, а localPlayer - 0000002F.. Координаты у source выходят 0 0 0
-
Что такое дерево я понимаю.. Только что посмотрел множество примеров с евентами - всюду использовать root ?? (Кроме всяких GUIroot).. Если нет, то покажите, пожалуйста, пример, где евент с root'ом и где евент с другим значением и почему там другое значение.. P.s. getRootElement и root - одно и тоже же ?