Leaderboard
Popular Content
Showing content with the highest reputation on 19/04/17 in all areas
-
في بداية الموضوع اريد ان اسأل سؤال مهم عندما تطلب المساعدة في موضوع ما مثلاً ويجيبك احد المساعدين بوضع بعض الاكواد بألوان مختلفة هل تستفيد اي شي من هذه الاكواد ؟ هل تعرف ما هي وظيفة الاكواد ؟ هل تعتقد انه اذا وضعت الاكواد في السكربت سيشتغل بدون مشاكل ؟ هذه هي اسألة الاشخاص الذين لم يعرفو الويكي بعد طيب ... ما هي فائدة الالوان الخاصة بالأكواد ؟ مثال givePlayerMoney -- ازرق getPlayerAccount -- اصفر playSound -- احمر في بداية شرح هذه الاكواد يجب ان تعرف ان السكربت مكون من ثلاث ملفات meta.xml client.lua server.lua اذا كنت تريد شرح لملف الميتا اضفط هنا طبعاً من المعروف ان ملف الميتا هو الملف الرئيسي في السكربت بأكمله وفي حالة حذفه فإنه لا يوجد سكربت بالنسبة الى ملف كلينت وملف سيرفر يوجد اكواد خاصة بملف كلينت واكواد خاصة بملف سيرفر واكواد خاصة بأي من الملفين فعلا سبيل المثال playSound -- احمر .. الاكواد ذات اللون الاحمر .. هذه لملف كلينت فقط getPlayerAccount -- اصفر .. الاكواد ذات اللون الاصفر .. هذه لملف سيرفر فقط givePlayerMoney -- ازرق وهذه الاكواد التي لها اللون الازرق يمكن كتابتها في كلاً من الملفين .. كلينت وسيرفر لم استفد شئ حتى الآن ما هو الكود وكيف استطيع ان احضر مثال عليه ؟ بكل بساطة اذا كان الكود موجود بالفعل فقط يمكنك الضغط عليه وسيقوم المتصفح بنقلك مباشرة الى صفحة الويكي وستجد هناك كلاً من .. شرح مفصل للكود مثال او اكثر كيف تعرف اذا كان الكود كلينت ام سيرفر ام لأي من الملفين ستجد كلمات دلالية مثل Client-only function او Server-only function او Shared function اين موقع الكلمة ؟ انظر الصورة وستعرف اين موقع الكلمة الآن حان وقت الشرح المهم اذا ضغط على هذا الكود مثلاً playSound -- client only فـ رح تجيك بهذا الشكل طيب اذا ضغط على هذا الكود مثلاً getPlayerAccount -- server only -- and getAccountName -- server only طبعاً رح تفتح لك صفحة بها شرح وامثلة وما الى غيره طيب كيف تقوم بإنشاء امر function هذا يعتمد على الكود الذي تريد انشاء الامر له فمثلاً الكود السابق getPlayerAccount بيكون كالتالي function test () acc = getPlayerAccount ( thePlayer ) end -- حيث -- test اسم الامر -- thePlayer اللاعب المراد احضار الحساب الخاص به طيب بالنسبة للحدث والامر الخاص بالحدث ؟ -- Ex "onClientPlayerWasted" "onPlayerWasted" "onPlayerJoin" طبعاً نفس الشئ رح تعرف امثلة و شرح للحدث عن طريق الضغط عليه طيب وش هو الـ source ? هو source الـ الشئ او الشخص او المركبة الذي قام بالحدث او الذي وقع عليه الحدث فعلا سبيل المثال الحدث التالي يوضح ان السورس هو اللاعب الذي مات "onPlayerWasted" وعلا سبيل المثال هذا السورس هو السيارة التي تم تفجيرها "onVehicleExplode" طيب شرح الحدث كالتالي انشاء حدث و امر ووضع الارجمنتات الخاصة بالحدث بداخل الامر فعلا سبيل المثال function killerProject ( _, killer, killerweapon ) if killer then if getElementType ( killer ) == "player" then outputChatBox ( " [ the killer "..getPlayerName(killer).." killer weapon "..killerweapon.." ] ", source ) end end end addEventHandler ( "onPlayerWasted", root, killerProject ) --[[ -- حيث killer: القاتل killerweapon: سلاح القاتل source: الشخص الذي مات --]] حتى الآن لم افهم من اين جاء كل من killerweapon و killer و source هذه الصورة توضح من اين اتى القاتل وسلاحه و السورس طيب كيف تعرف اذا كان الحدث كلينت ام سيرفر ام لأي ملف فيهم ؟ في حالة دخولك للويكي ستجد الصفحة اما ذات لون احمر او اصفر وستجد كلمة Clientside event او Serverside event طبعاً الكلمة الاولى باللون الاحمر ومكتوب فيها كلينت والكلمة الثانية باللون الاصفر ومكتوب فيها سيرفر اين موقع الكلمات ؟ انظر في هذه الصورة وسوف تعرف ...................................................................................................................... ملاحظة هذا الشرح سليم ما دام الويكي مفتوح وبه شروحات برمجة اللعبة ...................................................................................................................... هذا شرح لمن لا يعرف ماهي الاكواد او كيف يستعملها او ما هي اهميتها عندما يكتبها له احد المبرمجين او المساعدين له ذا اللي عندي اتمنى افدتكم بأي شي والسلام عليكم ورحمة الله وبركاته5 points
-
يالحبيب انت عوز تصنع شوق لنفسك يعنى كنت قول كلمتين ونص وخلاص مش لازم تفهمنا انك فاهم لما انت جامد فى البرمجه كده دخلت ليه اصلا الموضوع ....الموضوع دا للناس الى بتتعلم فى خطاء بسيط خلاص رد بأدب وقول الخطاء اصلا هوا مش مجبور الراجل يشكر على انو عوز يساعد وكلير معروف يعنى مش انت الى هتعرفو البرمجه .....2 points
-
2 points
-
To actually use the data which was retrieved by dbQuery, you'll have to use dbPoll, which returns a table from the dbQuery's userdata. You'll want to know, if you got any data, because that table can be empty. (There is no data selected from the SQL table, and it's possible if you do a SELECT with WHERE = ?) local dbConnection = dbConnect(...) local nrQuery = dbQuery(dbConnection, "SELECT phoneNumber WHERE accID=?", playerData[thePlayer]["accID"]) -- Getting a data from the SQL table with a WHERE. local rQuery = dbPoll(nrQuery, -1) -- You can set a timeout here, if you are worried about timing out. if #rQuery > 0 then -- Do some work with the phone number. local phoneNumber = rQuery[1]["phoneNumber"] -- This would work only, if the player cannot buy more than one phone numbers, if he can, you'll have to cycle through the table. You can only access data got from a dbPoll's table by indexing it with the SQL Table's structure. end2 points
-
mtasa://62.210.169.214:22006 http://wssrpg.net/ ------ About Us ------ Why So Serious (WSS) RPG has been around for a while and the servers main aims are to bring a fun, relaxed but well-run server. Although we’re a RPG server, the main focus is not on roleplaying. The server consists of various roleplaying groups which you can get involved with if you do enjoy roleplaying, but you can also take on other things such as being a criminal, cop, or playing as one of our many fun civilian classes like Quarry Worker and Computer Technician. Whilst being a criminal there is many things you can do to occupy your time, where public criminal groups allow you to participate in house robberies, sell weapons and drugs, rob cars, smuggle drugs into the country, whatever you want! Gangs are also an option and if you manage to join one of the big gangs, you can do special scripts such as deliveries, participate in turfing wars or fight against your sworn enemies. New gangs are also easy to set up; you can apply for a Term which means your gang can receive points for their activity, presence in the server and overall attitude. Civilians are also an exciting part of the server and with unique and fun jobs created by the developers, what is there not to enjoy? We have quarry workers, computer technicians, news reporters, truckers, pilots, skateboarders, pizza makers, pizza delivery men, adrenaline junkies and even an ice cream man! There are much more civilian classes but we’ll leave that for you to find out. The news reporter class allows you take photographs with the camera and upload your images to the website to show off your masterpiece. Cops are also a part of the server and like criminals they can participate in House Robbery, which works off a percentage. As a cop, you must get the marker to reach the blue 100%, where as criminals much make it reach the red 100%. If it is in the red, cops fight to reduce it, if it is in the blue, criminals fight to reduce it. They can also arrest people for money as well as rank up through the department, earning extra spawns which will include more weapons depending on how many arrests you have. ------ Key Information ------• Active playerbase • Friendly & fun community • Active & helpful staff members • Often backups to prevent rollbacks • Teamspeak Server (wssrpg.co.uk) • mIRC Server • Variety of jobs and activities • Report Centre for any issues • Updated Roster • Regularly held events • Civil War group, allowing you to fight with other members as the Confederate or the United States Armed Forces. • Great reward system for Gangs and RP groups JOIN US TODAY mtasa://62.210.169.214:22006 http://wssrpg.net/1 point
-
Данный урок предполагает, что вы уже знаете, что такое MySQL, как это работает и зачем это нужно, если же нет - ознакомитесь с данным уроком и вернитесь сюда! Цель данного урока - донести до вас некоторые вещи, которые вы, возможно, не понимаете или даже не задумывались о них. Немного теории MySQL - свободная реляционная система управления базами данных. Для работы с базой используется язык структурированных запросов(он же SQL). Более подробную и интересующую Вас информацию об SQL, Вы сможете найти на просторах интернета. Мы же поговорим о ключевых моментах работы с MySQL. SQL имеет 4 основных оператора для манипуляции с данными. SELECT - выбор данных, удовлетворяющих заданные условия. INSERT - добавление новых данных. UPDATE - изменение существующих данных. DELETE - удаление указанных данных Я не буду рассказывать вам о существующих типах данных MySQL, как создавать или удалять таблицы, я лишь хочу поделиться с вами ключевыми вещами, которые помогут вам оптимизировать работу вашего сервера и уменьшить нагрузку на него. Рассмотрим на основе примера В качестве примера для данного урока будет использоваться таблица с названием players, имеющая следующие столбцы: `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `surname` varchar(255) NOT NULL, `age` tinyint(3) NOT NULL, `adminLevel` tinyint(3) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) Тут я думаю все понятно, никаких проблем быть не должно. Для примера рассмотрим несколько запросов. Получаем всех игроков: SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` Получаем игрока с конкретным id: SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` WHERE id=117 Получаем всех игроков, имя которых равно какому-то конкретному значению: SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` WHERE name="Bobby" Получаем первых 10 игроков, возраст которых равен 19 лет: SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` WHERE age=19 LIMIT 10 Получаем всех игроков, возраст которых больше или равен 18 годам: SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` WHERE age >= 18 Ну тут все просто, пришло время рассмотреть все на основе конкретных примеров и указать ключевые особенности. Неправильный выбор функции для формирования запроса Это первая и наиболее часто встречающаяся ошибка, которую я вижу в коде различных разработчиков. Для формирования запроса к MySQL в МТА существует 2 функции, а именно: dbExec и dbQuery. Обе функции выполняют запрос, но их главная особенность заключается в том, что dbQuery возвращает какой-либо результат и тем самым занимает оперативную память сервера, а dbExec нет. Очень часто разработчики забывают использовать dbFree после запроса, для создания, редактирования или удаления какой-то записи. Рассмотрим на основе простого примера создания нового пользователя: local Name = "Bobby" local Surname = "Raily" local Age = 23 dbExec(dbConnection, "INSERT INTO `players` (name, surname, age) VALUES(?, ?, ?)", Name, Surname, Age) Опять же, все просто, сформировали простой запрос, создали новую запись в таблице players с заданными значениями. Можно, конечно, реализовать это с помощью dbQuery, но обязательно не стоит забывать про dbFree! Казалось бы, а что такого? Но все дело в том, что если у вас на сервере зарегистрируется большое количество игроков, то это порядком забьет память ненужной ерундой, проще говоря мусором, который хранить на сервере нет никакой необходимости. local Name = "Bobby" local Surname = "Raily" local Age = 23 local Query = dbQuery(dbConnection, "INSERT INTO `players` (name, surname, age) VALUES(?, ?, ?)", Name, Surname, Age) dbFree(Query) Я надеюсь, что вы четко и ясно уяснили для себя этот пункт, на это стоит обратить особое внимание. Некорректное использование dbQuery для получения результата запроса Очень часто вам необходимо получить какие-то данные из базы данных. В этом нам помогают dbQuery и dbPoll. Если внимательно посмотреть на синтаксис функции dbQuery, то вы увидите, что в качестве первого необязательного аргумента она принимает callback функцию. Что же это такое и зачем это нужно? Я настоятельно рекомендую вам как можно внимательнее и ответственнее подойти к этому вопросу, т.к. многие разработчики до сих пор не до конца уловили суть данного аргумента и не понимают из-за чего происходят "фризы" во время работы того или иного скрипта. Предположим, что у нас зарегистрировано 100 000 уникальных игроков(для крупного проекта - вполне себе реально, но мы рассматриваем все в теории). Нам необходимо получить список всех имеющихся игроков. Вы должны понимать, что это не произойдет моментально, в любом случае на данную операцию будет затрачено какое-то количество времени. Рассмотрим два примера, использование запроса без callback функции и с ней соответственно: local Players = dbPoll(dbQuery(dbConnection, "SELECT * FROM `players`"), -1) for Index, PlayerData in ipairs(Players) do print(PlayerData.name) end function CallbackFunction(qh, tag, score) local Players = dbPoll(qh, 0) for Index, PlayerData in ipairs(Players) do print(PlayerData.name) end end dbQuery(CallbackFunction, dbConnection, "SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players`") Время, занявшее на выполнение данного запроса, составило 489 мс. Так в чем же характерная особенность между первым и вторым способом? Особенность заключается в том, что пока выполняется получение данных из базы первым способом, то работа нашего сервера приостановиться на время, которое необходимо для выполнения данного запроса, что может негативно повлиять на всех игроков, в результате могут возникнуть такие вещи как фризы, рассинхронизация и т.д. Поэтому вы четко должны понимать для себя нужно вам это или нет. Если же вам необходимо, чтобы работа сервера была приостановлена на время выполнения запроса - используйте первый вариант, если же нет - второй. Если же вы до этого имели опыт с другими ЯП, то вероятнее всего понимаете, что такое синхронное и асинхронное выполнение. Первый вариант - это синхронное выполнение, второй - асинхронное. Выполнение лишней работы посредством Lua Так же очень часто наблюдаю картину, когда многие разработчики выполняют лишнюю работу, а именно предпринимают лишние действия, которые можно было сформировать в результате SQL запроса. SQL существует довольно большое количество времени и за это время овладел всеми необходимыми функциями, операторами и прочими вещами для формирование корректного запроса. К примеру мы хотим получить id всех игроков, adminLevel которых выше или равен 2. Как видно из запроса - мы сразу же получаем список игроков, уровень которых равен или больше 2 function CallbackFunction(qh, tag, score) local Players = dbPoll(qh, 0) for Index, PlayerData in ipairs(Players) do print(PlayerData.id) end end dbQuery(CallbackFunction, dbConnection, "SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players` WHERE adminLevel >= 2") Но иногда мне приходится видеть, как некоторые разработчики получают список всех игроков и начинают проверь их adminLevel посредством Lua, что само по себе не имеет никакого смысла, т.к это выполнение лишней работы. function CallbackFunction(qh, tag, score) local Players = dbPoll(qh, 0) for Index, PlayerData in ipairs(Players) do if PlayerData.adminLevel >= 2 then print(PlayerData.id) end end end dbQuery(CallbackFunction, dbConnection, "SELECT `id`, `name`, `surname`, `age`, `adminLevel` FROM `players`") Заключение Надеюсь, что вы не зря потратили свое время и подчеркнули для себя какие-то полезные вещи, которые в последствии помогут вам при разработке собственного игрового режима или мода. Если же у вас остались какие то вопросы или вам что-то непонятно - вы можете оставлять свои вопросы в данной теме.1 point
-
local foundRestricted = false for k,v in ipairs(restrictedusernamewords) do if string.match(usernameregister, v) then outputChatBox ( "Please don't include vulgar words in your username!", client ) foundRestricted = true break end end if not foundRestricted then -- Do register end1 point
-
1 point
-
مع الاسف يب .. المهم يا ايكو نصيحة لا تسوي مواضيع كثيرة في اشياء مارح تفيدك ميشان ما يجيك تنبيه وما الى غيره1 point
-
خالاص ي كيلر ، احنا زهئناه هو احسن منا كتييير هو مبرمج حلو واحنا مش مناح ، لك احنا ما نعرف معنى lua اسفين كتير انا وكيلر وبالتوفيء1 point
-
1 point
-
اششششششششششششش ، كيف الاحداث فنكشنات ؟ لما ودي اعطي لاعب دم setElementHealth ( element , 0 ) احطه بالايفنت ؟ addEventHandler ("setElementHealth",function ( element , 100 ) ) ههههههههههههههههههههههههههه ، اصحا من الآجو الي تشمه1 point
-
You can change the GUI size by just changing the mainW and mainH value in the first lines.1 point
-
local playerBlips = {} local playerNames = {} local sX, sY = guiGetScreenSize() local mainW, mainH = 700, 600 local mainX, mainY = (sX-mainW)/2, (sY-mainH)/2 local multX, multY = 1366/sX, 768/sY function removeHex (name) return type (name) == "string" and string.gsub (name, "#%x%x%x%x%x%x", "") or name end addEventHandler("onClientResourceStart", root, function() mainWindow = guiCreateWindow(mainX, mainY, mainW, mainH, "Teleport", false) guiWindowSetSizable(mainWindow, false) mapImg = guiCreateStaticImage(5, 20, mainW, mainH-60, ":freeroam/map.png", false, mainWindow) teleportButton = guiCreateButton(5, mainH-35, mainW-10, 30, "Teleport me", false, mainWindow) playerBlip = guiCreateStaticImage(0, 0, 10, 10, ":freeroam/localplayerblip.png", false, mapImg) end) bindKey("m", "down", function() showCursor(not isCursorShowing()) end) addEventHandler("onClientRender", getRootElement(), function() for i, k in ipairs(getElementsByType("player")) do local pX, pY = getElementPosition(k) local xPerc, yPerc = (pX+3000)/6000, (3000-pY)/6000 --outputChatBox(xPerc .. " " .. yPerc) guiSetPosition(playerBlip, xPerc-10/mainW/2, yPerc-10/mainH/2, true) end end) addEventHandler("onClientGUIDoubleClick", getRootElement(), function() if source == mapImg then local tW, tH = guiGetSize(mapImg, false) local tX, tY = guiGetPosition(mapImg, false) local mainX, mainY = guiGetPosition(mainWindow, false) outputChatBox("Map size", 255, 0, 0) outputChatBox(tW .. " " .. tH) local cX, cY = getCursorPosition() local cX, cY = cX*sX, cY*sY outputChatBox("Click position", 255, 0, 0) outputChatBox(cX .. " " .. cY) outputChatBox("Image position", 255, 0, 0) outputChatBox(mainX+tX .. " " .. mainY+tY) local cX, cY = cX-(mainX+tX), cY-(mainY+tY) outputChatBox("Click position on image", 255, 0, 0) outputChatBox(cX .. " " .. cY) local aX, aY = cX/tW, cY/tH outputChatBox("Relative values", 255, 0, 0) outputChatBox(aX .. " " .. aY) local mapX, mapY = math.floor(aX*6000-3000), math.floor(3000-aY*6000) outputChatBox("Map position", 255, 0, 0) outputChatBox(mapX .. " " .. mapY) setElementFrozen(localPlayer, true) setElementPosition(localPlayer, mapX, mapY, 0) setTimer(function() local _, _, _, foundZ = processLineOfSight(mapX, mapY, 3000, mapX, mapY, -3000) setElementPosition(localPlayer, mapX, mapY, foundZ) setElementFrozen(localPlayer, false) end, 100, 1) end end) addEventHandler("onClientGUIClick", getRootElement(), function() if source == mapImg then local tW, tH = guiGetSize(mapImg, false) local tX, tY = guiGetPosition(mapImg, false) local mainX, mainY = guiGetPosition(mainWindow, false) outputChatBox("Map size", 255, 0, 0) outputChatBox(tW .. " " .. tH) local cX, cY = getCursorPosition() local cX, cY = cX*sX, cY*sY outputChatBox("Click position", 255, 0, 0) outputChatBox(cX .. " " .. cY) outputChatBox("Image position", 255, 0, 0) outputChatBox(mainX+tX .. " " .. mainY+tY) local cX, cY = cX-(mainX+tX), cY-(mainY+tY) outputChatBox("Click position on image", 255, 0, 0) outputChatBox(cX .. " " .. cY) local aX, aY = cX/tW, cY/tH outputChatBox("Relative values", 255, 0, 0) outputChatBox(aX .. " " .. aY) mapX, mapY = math.floor(aX*6000-3000), math.floor(3000-aY*6000) outputChatBox("Map position", 255, 0, 0) outputChatBox(mapX .. " " .. mapY) elseif source == teleportButton and mapX then setElementFrozen(localPlayer, true) setElementPosition(localPlayer, mapX, mapY, 0) setTimer(function() local _, _, _, foundZ = processLineOfSight(mapX, mapY, 3000, mapX, mapY, -3000) setElementPosition(localPlayer, mapX, mapY, foundZ) setElementFrozen(localPlayer, false) mapX, mapY = nil, nil, nil end, 100, 1) end end) Fixed. Next time try not to use 9999 font size, if he is not using a function, it's because he doesn't want to use it.1 point
-
1 point
-
1 point
-
function SetSpeed() for k,v in ipairs(getElementsByType("vehicle")) do vehs = getElementModel(v) setModelHandling(vehs, "maxVelocity", 900) end end addEventHandler("onResourceStart", resourceRoot,SetSpeed) not tested but it sould work1 point
-
اوك يالغالي اسف بس انا حبيت افيد الشخص هاد + حبيت اكتب اسمي من باب التسلية عل عموم اتعلمت شكرا يالطيب حياك الله1 point
-
القسم صار كله لوح ض2 أسف بس الايديت وين تكتب الباس والاسم ماعجبني عجبني المنطاد اللي يتحرك لا تتقبل مروري1 point
-
1 point
-
1 point
-
اووووووووه اخوي اوف انت صح انا خطا ماشاء الله عليك فنان بالتوفيق لصاحب الموضوع ومبين انك حاطط التحقق صح؟ ماشاء الله عليك الفن يغنيلك1 point
-
1 point
-
what? makes no sense. Try replacing updateWantedList with this one function updateWantedList() guiGridListClear(wantedlistgui.grid[1]); for _,v in pairs(getElementsByType("player")) do if (getPlayerWantedLevel(v) > 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,getPlayerName(v):gsub("#%x%x%x%x%x%x",""),false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,getPlayerWantedLevel(v),false,false) end end if (guiGridListGetRowCount(wantedlistgui.grid[1]) == 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,"no players found with wanted levels",false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,"",false,false) end end1 point
-
1 point
-
كان استفاد اكثر من الويكي , بس يعطيك العافية علي كل حــأل بالتوفيق1 point
-
btw i added buttons to the panel, i think you'd have easier use with this one. local sW,sH = guiGetScreenSize(); local wantedlistgui = {window={},grid={},button={}} local mwW,mwH = 500,500; wantedlistgui.window[1] = guiCreateWindow(sW*0.5-mwW/2,sH*0.5-mwH/2,mwW,mwH,"players with wanted stars",false); wantedlistgui.grid[1] = guiCreateGridList(0,25,mwW-5,mwH-65,false,wantedlistgui.window[1]); wantedlistgui.button[1] = guiCreateButton(0,mwH-40,mwW/2-17,30,"update gridlist",false,wantedlistgui.window[1]); wantedlistgui.button[2] = guiCreateButton(mwW/2-5,mwH-40,mwW/2+17,30,"close gui",false,wantedlistgui.window[1]); guiSetVisible(wantedlistgui.window[1],false) guiGridListAddColumn(wantedlistgui.grid[1],"Player",0.5); guiGridListAddColumn(wantedlistgui.grid[1],"Wanted Level",0.4); function updateWantedList() guiGridListClear(wantedlistgui.grid[1]); for _,v in pairs(getElementsByType("player")) do local wantedlevel = getPlayerWantedLevel(v); if (wantedlevel > 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,getPlayerName(v):gsub("#%x%x%x%x%x%x",""),false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,wantedlevel,false,false) end end if (guiGridListGetRowCount(wantedlistgui.grid[1]) == 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,"no players found with wanted levels",false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,"",false,false) end end addEventHandler("onClientGUIClick",root,function() if (source == wantedlistgui.button[1]) then updateWantedList(); elseif (source == wantedlistgui.button[2]) then guiSetVisible(wantedlistgui.window[1],false); showCursor(false); end end); addCommandHandler("wantedplayers",function() if not guiGetVisible(wantedlistgui.window[1]) then guiSetVisible(wantedlistgui.window[1],true); showCursor(true); updateWantedList(); end end);1 point
-
1 point
-
function getPosNearPlr(plr) local sorted = {} local cartable={} for k,v in ipairs(getElementsByType('vehicle'))do local xv,yv,zv=getElementPosition(v) table.insert(cartable,{xv,yv,zv}) end local x, y, z = getElementPosition(plr) for i, v in ipairs(cartable) do local d = getDistanceBetweenPoints3D(x, y, z, v[1], v[2], v[3]) sorted[i] = {pos = v, dist = d} end table.sort(sorted, function(a, b) return a.dist < b.dist end) for i=1, #sorted do cartable[i] = sorted[i].pos end return sorted[1].pos end addCommandHandler('setcarblip',function(plr) local carpos=getPosNearPlr(plr) createBlip(carpos[1],carpos[2],carpos[3],15) outputChatBox(carpos[1]..','..carpos[2]..','..carpos[3],plr) end) بالتوفيق غير مجرب1 point
-
1 point
-
Hello my name is Wachon and I started playing MTA in 2007 in a cyber coffee, I played in varieties of servers, many styles. But more I was in tactics, CnR, Gangwars, I played servers like CIT. Well without more to say, I turned 10 years in this wonderful game and as I never registered to the forum, I didn't care to register, but I do not play much, so I come to say that you can enter to my youtube channel, if you like. You can watch my videos, I started editing in 2015. I'm looking for a team to edit videos in GTA, I back to edit again. I had my team Urban Edits (Already inactive) but if anyone interested I can re-open it. Here ill show u my last video: Thanks for watching, leave a comment if u want Urban Edits CHANNEL: https://www.youtube.com/channel/UCI1t-ojq_D4uxS2tSoQosxQ1 point
-
lol accidently put 2 variables as local even tho they souldn't been local here is fixed code + added one more thing local sW,sH = guiGetScreenSize(); local wantedlistgui = {window={},grid={}} local mwW,mwH = 500,500; wantedlistgui.window[1] = guiCreateWindow(sW*0.5-mwW/2,sH*0.5-mwH/2,mwW,mwH,"players with wanted stars",false); wantedlistgui.grid[1] = guiCreateGridList(0,25,mwW-5,mwH-30,false,wantedlistgui.window[1]); guiSetVisible(wantedlistgui.window[1],false) guiGridListAddColumn(wantedlistgui.grid[1],"Player",0.5); guiGridListAddColumn(wantedlistgui.grid[1],"Wanted Level",0.4); function updateWantedList() guiGridListClear(wantedlistgui.grid[1]); for _,v in pairs(getElementsByType("player")) do local wantedlevel = getPlayerWantedLevel(v); if (wantedlevel > 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,getPlayerName(v):gsub("#%x%x%x%x%x%x",""),false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,wantedlevel,false,false) end end if (guiGridListGetRowCount(wantedlistgui.grid[1]) == 0) then local row = guiGridListAddRow(wantedlistgui.grid[1]); guiGridListSetItemText(wantedlistgui.grid[1],row,1,"no players found with wanted levels",false,false) guiGridListSetItemText(wantedlistgui.grid[1],row,2,"",false,false) end end addCommandHandler("wantedplayers",function() if guiGetVisible(wantedlistgui.window[1]) then guiSetVisible(wantedlistgui.window[1],false); else guiSetVisible(wantedlistgui.window[1],true); updateWantedList(); end end);1 point
-
will you ever learn how to do something by yourself ? This is dozen topic of you asking simple :~. but anyway this should work, not tested tho. local sW,sH = guiGetScreenSize(); local wantedlist = {window={},grid={}}; local mwW,mwH = 500,500; local wantedlist.window[1] = guiCreateWindow(sW*0.5-mwW/2,sH*0.5-mwH/2,mwW,mwH,"players with wanted stars",false); local wantedlist.grid[1] = guiCreateGridList(0,0,mwW-5,mwH-5,false,wantedlist.window[1]); guiGridListAddColumn(wantedlist.grid[1],"Player",0.5); guiGridListAddColumn(wantedlist.grid[1],"Wanted Level",0.4); function updateWantedList() guiGridListClear(wantedlist.grid[1]); for _,v in pairs(getElementsByType("player")) do local wantedlevel = getPlayerWantedLevel(v); if (wantedlevel > 0) then local row = guiGridListAddRow(wantedlist.grid[1]); guiGridListSetItemText(wantedlist.grid[1],row,1,getPlayerName(v):gsub("#%x%x%x%x%x%x",""),false,false) guiGridListSetItemText(wantedlist.grid[1],row,1,wantedlevel,false,false) end end end addCommandHandler("wantedplayers",function() if guiGetVisible(wantedlist.window[1]) then guiSetVisible(wantedlist.window[1],false); else guiSetVisible(wantedlist.window[1],true); updateWantedList(); end end);1 point
-
Между двумя векторами есть угол и ось вращения. Повернув один вектор вокруг оси на угол ты совмещаешь его со вторым. То что ты написал нужно только для кватернионов и систем координат. Как найти угол между векторами - гугл в помощь. Ось вращения - векторное произведения этих векторов. Что такое векторное произведение - гугл в помощь. Как повернуть вектор вокруг оси - перемножаешь его на матрицу поворота. Как составить матрицу поворота - ну ты понял...1 point
-
create a grid list and loop players and check they have a wanted level more than 0 and add them to rows1 point
-
1 point
-
https://community.multitheftauto.com/index.php?p=resources&s=details&id=14318 Contains just a link to another forum with an illegal copy of FFS resources.1 point
-
DOWNLOAD: https://community.multitheftauto.com/index.php?p=resources&s=details&id=14306 This countdown script draws digits in DX locally, it detects who is in the direct area of the player who triggers the countdown. Assuming these are participants of the race/event, they will get the DX '3, 2, 1' (or chosen lenght) on their screens.DEMONSTRATION: (7 seconds, = /cd 7 for my demo)Use: /cd [lenght in secs] for example 3 seconds: /cd 3= 3, 2, 1, GO! (including beep sounds like classic countdown)alt: /countdown, /cdn, etcIf someone gets auto-added to countdown unwanted, he can use /cstop to leave the countdown (as indicated in chat) so barely abusable; also it has anti spam timer, using countdown is limited by default to once per 40 seconds (you can modify the value in .lua, and also other values like area width for participants auto-add, max lenght in seconds etc)1 point
-
function getPlayerByIP ( aIP ) if ( type ( aIP ) == 'string' ) then for _ , aPlayers in ipairs ( getElementsByType ( 'player' ) ) do if ( getPlayerIP ( aPlayers ) == aIP ) then return aPlayers end end end return false end مادري اذا مفيد ولا لا هو وظيفته يجيب الاعب من الاي بي حقه1 point
