Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 06/09/16 in all areas

  1. Hey, I wonder what this button does... <presses the button> huh? delete all forum users? oh sna- Hi there, the MTA Team is happy to present you with the result of what we have been up to recently - the redesigned and refreshed MTA Forum! This is something that we have wanted to do for a long time, and for several reasons. The forum software we have used until now (phpBB) has served us well through the years, there is no doubt about that. However, as time went by, our needs were changing too. It was becoming less and less feasible for us to use and maintain the forums in their present state, so we decided it was time to try something that is more suited to our current needs. We were recently presented with an opportunity to switch the forum software on attractive terms and we took it. Lo and behold, here are the new forums! Highlights of new features that were not present on the previous forum: forum now runs on a proprietary, secure, well tested and widely used software solution - the IPS Community Suite a completely new, mobile-friendly forum theme a fully fledged rich text editor for posting or editing your content on the forums (instead of the previous plain text box with BBCode buttons) an improved user profile system for greater personalisation of your presence on our forums a new, customizable real-time notifications system also a new, simplified Private Messaging system improvements to the quotation system (quotes link to the original post, and are fully collapsible) and replying in general (the multiquote feature) an ability to 'like' and rate topics and posts, awarding reputation points to their authors topic authors can now assign tags to their topics, making it easier for users to find the content they are looking for several new enhancements and customization features to improve your browsing experience (eg. topic previews; the ability to hide forums you are not interested in) moderators now have an ability to promote your topic on the forum (similar to stickied topics, but separate to them) several new features for us administrators too, which will make forum maintenance easier and possibly allow us to implement new forum features without a hassle ... and more! List of features that were present in the previous forum but are missing or are less functional now: no topic icons Private Messaging system is less pleasant to scroll through. Getting used to it might take some time too it is no longer possible to view the source code of posts. If you really need that functionality, you can check the page's HTML source code directly, then use a third party converter to obtain the BBCode code boxes are no longer integrated with the MTA wiki URLs FAQ: Q: Are my posts still in place? What about my private messages? A: They are both fine. You can find them in the same place you left them before. Q: Will the old forum URLs still work? A bunch of places on the web link to your forum using old URLs... A: Yes, they will work. We have a on-the-fly converter in place for such URLs, so they will still link to where they should. Q: I have found an issue with the new forum. Can I report it? A: Sure. Send a PM to one of the forum administrators (darkdreamingdan, jhxp or Jusonex) and describe the problem you have found. Make sure you provide all the details or steps to reproduce your issue, where applicable. We would like to thank Audifire and the mta-sa.org team for donating the forum software license to us. And naturally, you can not forget about darkdreamingdan and Jusonex, our team members who had both put a tremendous amount of effort in preparing and performing the forum maintenance and migration. Awesome job, guys. Did you like the change? Please let us know in the comments! See you next time. --MTA Team
    3 points
  2. تكشخت وصرت اوتاكو وجيتكم
    3 points
  3. من نفسي والشكر موصل إلى تنطيل ، مودير ، عبدالكريم ، بو شطحه على الاشياء الاساسيه الي علمونياها
    3 points
  4. FPSSERVER و WINDFORCE تقدم لكم عملاق تشفير الأوبجيكت FPSSERVER COMPILER للتشفير الأوبجيت ومنع سرقة قل وداعا للسرقة مجانا 100% بكامل الخصائص حماية سرقة ملفات DFF , TXD قم بتحميل من هنا تحميل بعد عملية تحميل قم بوضع مجلد fps_compiler داخل مجلد ريسورس الخاص بسيرفرك أو جهازك بعد دلك قم بتشغيله /start fps_compiler مهم جدا للحماية قم بفتح ملف secret.txt بعد دلك قم بتغير المفتاح الى مفتاح خاص بيك قم بفتح ملف id.txt وقم بأستبدال الرقم الى رقم الأوبجكت الدي تريد أستبداله بعد دلك أختر أحد هده طرق للتشفير 1- تشفير ملف DFF فقط قم بأستبدال هدا الملف encryptMeMicro.dff باملف الخاص بك من نوع DFF بعد دلك قم برجوع الى سيرفر وقم بوضع الأمر تالي /scdff سوف تظهر لك رسالة بنجاح التشفير , بعد دلك قم برجوع الى مجلد decompiled سوف تشاهد ملفات قم بنسخهم ووضعهم بمجلد خاص فيك وقم بتشغيله كمود ----------------------------------------------- 2- تشفير ملف TXD فقط قم بأستبدال هدا الملف encryptMeMicro.txd باملف الخاص بك من نوع txd بعد دلك قم برجوع الى سيرفر وقم بوضع الأمر تالي /sctxd سوف تظهر لك رسالة بنجاح التشفير , بعد دلك قم برجوع الى مجلد decompiled سوف تشاهد ملفات قم بنسخهم ووضعهم بمجلد خاص فيك وقم بتشغيله كمود ----------------------------------------------- 3- تشفير ملفين DFF و TXD مع بعض قم بأستبدال هدا الملف encryptMeMicro.dff و encryptMeMicro.txd بالمفات الدي تريد تشفيرها بعد دلك قم برجوع الى سيرفر وقم بوضع الأمر تالي /scdt سوف تظهر لك رسالة بنجاح التشفير , بعد دلك قم برجوع الى مجلد decompiled سوف تشاهد ملفات قم بنسخهم ووضعهم بمجلد خاص فيك وقم بتشغيله كمود ----------------------------------------------- صور تشغيل الأداة وأختيار طريقة تالتة للتشفير ملفات المشفرة
    2 points
  5. سبحان الله واحد راح يشوف افلام اباحية "وصخ" قال ماعرف وش اختار قال بغمض عيني واختصار وغمض عينه والله يرحمه "اللهم ما أحسن خاتمتنا امين يارب العالمين"
    2 points
  6. أنت الجميل أشكرك على مرورك شكرا
    2 points
  7. بتوفيق الخوي و افضل اشي انها مجانية
    2 points
  8. من نفسي و بعض المساعدات من مارشميلو و مودير
    2 points
  9. في البداية كنت اسرق وبعدين بديت اخبص ويساعدوني هنا في المنتدى بعدين تعلمت من نفسي
    2 points
  10. В первую очередь тема будет полезна всем, кто только что вошел в скриптинг. ВНИМАНИЕ! Изучение языка Lua должно быть первым шагом в MTASA скриптинге, а не вторым или третьим, поэтому в этой теме я буду в первую очередь делать упор на русские доки по Lua, и во вторую - на доки по MTASA скриптингу. Желающие могут делиться ссылками, которые потом будут добавлены в этот пост. У новичков, обычно, возникают вопросы по языку Lua и по его применению в MTASA скриптинге. Но литературы на русском языке на этот предмет не так уж и много. Все, что касается скриптинга, можно узнать из вики - https://wiki.multitheftauto.com/. Там есть и русские документы, но их все равно мало по сравнению с английской версией, поэтому непонятные моменты можно уточнить здесь на форуме. Ну а что касается самого языка LUA - читаем дальше. Итак начнем просматривать нашу онлайн библиотеку.. Ссылки от юзера MX_Master, т.е. мои рекомендации : --- http://lua.ru/ http://lua.ru/doc/ Вторая ссылка - перевод официального справочника по языку Lua на русский язык. Очень мало пояснительной инфы и перевод местами сильно косноязычный. Дешево и сердито. Помогает уловить общий смысл, но тестировать все придется самому, т.к. примеров немного. http://ilovelua.narod.ru/ http://ilovelua.narod.ru/about_lua.html http://ilovelua.wordpress.com/ Ресурсы одного и того же автора. Все объясняется в самой что ни на есть доступной форме. Даже первоклассник программирования сможет это понять (: Вторая ссылка дает практически 70% того, что должен знать MTASA скриптер по языку Lua. Рекомендую. http://w3d.wiki-site.com/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_Lua Основы Lua. Простые и понятные примеры. Рекомендую. http://ru.wikipedia.org/wiki/Lua Куда же мы денемся без инфы в википедии. http://ltwood.wikidot.com/scripting:lua-lang Весьма понятный мануал. Примеров также много как и в официальном справочнике. http://steps3d.narod.ru/tutorials/lua-tutorial.html Мануальчик с небольшим игровым уклоном, в котором даже больше (вроде) инфы чем в официальном справочнике. Описания функций и примеры к особо непонятным функциям и конструкциям. http://netsago.org/ru/docs/1/4/ Введение в Lua. Небольшое. http://www.script-coding.com/Lua.html Введение. Общее инфо. Много простых примеров. http://xgm.ru/page/400 Немножко про LUA. http://luagml.ucoz.ru/doc/lua/lua.html Своеобразная копия http://lua.ru/doc/. Возможно, кому-то такой вид больше нравится. Cсылки от юзера Kenix : --- http://www.rldp.ru/mysql/mysqldev/glava04.htm - Нормальный перевод официального справочника на русский язык. Рекомендую. Примечание: в этом доке версия Lua 4.0, а не 5.1 как в МТА. Поэтому многие вещи могут отличаться. http://cortexcommandru.3dn.ru/forum/9-801-1 - В середине вся суть. http://progopedia.ru/language/lua/ http://big.vip-zone.su/doc/devel/lua.xml Cсылки от юзера CrazyDude : --- http://gta-rating.ru/forum/showthread.php?t=1370 Cсылки от юзера Kernell : --- Регулярные выражения в Lua http://www.lua.ru/forum/posts/list/57.page#408 Объектно-Ориентированное Программирование (ООП) в Lua http://mydc.ru/topic1429.html Основы декларативного программирования на Lua http://habrahabr.ru/blogs/development/77413/ Cсылки от юзера Elengar : --- Lua за 60 минут. http://zserge.wordpress.com/2012/02/23/lua Cсылки от юзера nikitafloy : --- http://www.cronos.ru/kb-cronospro-lua.html А еще у нас в подфоруме есть целый раздел с туторами по Lua/MTASA: viewforum.php?f=153
    1 point
  11. السلام عليكم ورحمة الله وبركاته بتصميم وخاصيات جديدة IPB إلى phpBB اليوم تم تجديد المنتدى ونقله من ...نسعى لتقديم الأفضل دائماً !شاركونا بآرائكم حول التجديد ملاحظة: لم يتم اكتمال تجديد المنتدى كلياً حتى الآن فإذا تواجهكم بعض المشاكل, فسوف يتم حلها في أقرب وقت بإذن الله يا عيال نبي مشرفين جدد بعد
    1 point
  12. بسم الله الرحمان الرحيم السلام عليكم ورحمة الله تعالى وبركاته . أول موضوع لي بالمنتدى حبيت ابداه بمود اللي هو قيم مود لحرب العصابات . طبعا الكل يعرف وش هو القيم مود وفي كثير منهم منشورة . اكيد هذا القيم مود مو حقي لكنه من تعديلي بالكامل مثلا لوحة التسجيل ومكان تهكير السجن الخ.. . اسف مقدر اعمل فيديو معي مشاكل بالجهاز لذا اوريلكم فقط صور . تابعو معي صورة لوحة التسجيل صورة لاختيار التيمات القيم مود من الداخل مكان تهكير السجن Interior ID : 3 | هذا مركز الشرطة رقم 3 من يريد ماركر دخول وخروج مركز الشرطة 3 يطلب بالكومنت http://up.top4top.net/downloadf-2494rin1-zip.html : رابط تحميل القيم مود .انا مجرد مبتدئ اعرف اغير أشكال و التعديل وليس صنعها من الصفر لذا ارجوكم لا تسخرو مني وتقولي اني سارق المود وشكرا لكم
    1 point
  13. الـسلام عليكم ورحمهـ الله وبركآآآتهـ بعد اعتزآل دام قرآبهـ السنتين عن العبهـ والبرمجهـ الحمدلله اليوم رجعتـ لكم وبدايات تعلمي للبرمجه في سنه الـ2011 وحبيت المجال البرمجهـ ليس فقط ف العبهـ ولاكن اصبح لي معرفهـ لبرمجه البرآمج للكمبيوتر وكمان القليل من برمجه مواقع الويب وبفضل الله اليوم ابتديت في مشروع جديد سـيرفر من الـ0 برمجهـ حديثهـ كليـآ وشغـل جديد على سيرفرآت العرب وان شاء الله رح تشوفوهـ في عودهـ لسيرفر محترفين جرآند واخر برمجهـ لي كان قيم مود السيرفر من حوالي سنتين صوره بالتوقيع [GTA-PRO] احب اشــكر كل الي سألو عني في غيـآبي تحيـآتي لكم والي بيحتاج مسـآعدهـ رح اكون بالخدمهـ ..
    1 point
  14. Here you go: Arabic sub-board
    1 point
  15. @Sha67 @</Mr.Tn6eL> @MoDeR2014 @a7zan @taha201100 @Mr.CoR @Jaer[X]Pro
    1 point
  16. I replace it here local myCol = createColRectangle (1000, 500, 30, 20) function destroyTheVehicles (player) if getElementType (player) == "player" and isPedInVehicle (player) then destroyElement (getPedOccupiedVehicle (player)) outputChatBox ("Vehicles are not allowed here!", player, 255, 0, 0) end end addEventHandler ("onColShapeHit", myCol, destroyTheVehicles)
    1 point
  17. Thanks for the suggestion. Our approach of late is for less customisation to our platforms, rather than more. The current (largely broken) state of the wiki - particularly regarding the logins - is due to the amount of complexity that custom plugins introduce. A motivation for switching to IPB is that it had 90% of PHPBB's features without any customisations. Right now we're focusing on just trying to get the wiki working again with logins etc. Once that happens we can reevaluate customisations, but it is unlikely to happen in the near future.
    1 point
  18. مب الواحد يعرف يجيب الاوبجكت اول حتى يشفره ههههـ مبدع يالربع
    1 point
  19. جميل جداً اخ مايكرو لاهنت على الشرح الجميل والموضوع الجميل وصاحب الموضوع الجميل تحياتي ،
    1 point
  20. جميل جداً اخ كاروتس عقبال ما نشوفك انت مسوي قيم مود كامل وناشره تحياتي
    1 point
  21. You can't edit your posts if someone posted after you, sadly @Micro. They said it's because some people abuse this to edit old posts like "NOTHING HERE" or ".", which I have seen, yes.
    1 point
  22. Added this two lines to your Admin acl. <right name="function.startResource" access="true" /> <right name="function.stopResource" access="true" /> And restart the server or just use aclReload . function reloadACL (player) local reload = aclReload() if ( reload ) then outputChatBox ( "ACL was successfully reloaded.",player, 255, 0, 0) end end addCommandHandler ("reloadACL", reloadACL)
    1 point
  23. لو كان في ديث لايك كنت عطيتك ههههه ليه تفكرنا يحج
    1 point
  24. Promo Code: TMS3DISC2 كوبون خصم 2 دولار على سيرفرات التيم سبيك يشمل طلبات الشراء الجديدة و لمرة واحده فقط يمكنك استخدام الكوبون للحصول على سيرفر تيم سبيك 10 لاعبين مجانا اضغط على الرابط لأستخدام الكوبون مباشرة http://client.tapleto-host.net/cart.php?&language=Arabic&a=add&pid=16&promocode=TMS3DISC2 العدد محدود
    1 point
  25. Shh,poti iesi din aceasta comunitate,oricum esti dejeaba/inutil.
    1 point
  26. Usa killTimer y deja el número como, por ejemplo: n = 0
    1 point
  27. عندك اخطاء , صححتها واختصرت لك الكود Client : GUIEditor = { button = {}, window = {}, staticimage = {} } GUIEditor.window[1] = guiCreateWindow(109, 38, 568, 512, "Wepson Shop | Arabs-Pro | V.1", false) guiWindowSetSizable(GUIEditor.window[1], false) guiSetAlpha(GUIEditor.window[1], 0.72) GUIEditor.staticimage[1] = guiCreateStaticImage(10, 19, 548, 483, ":Weapson-ShopV1/images/1.png", false, GUIEditor.window[1]) GUIEditor.staticimage[2] = guiCreateStaticImage(10, 10, 91, 89, ":Weapson-ShopV1/images/16.png", false, GUIEditor.staticimage[1]) GUIEditor.button[1] = guiCreateButton(7, 109, 94, 45, "500000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[1], "default-bold-small") guiSetProperty(GUIEditor.button[1], "NormalTextColour", "FFE10000") GUIEditor.staticimage[3] = guiCreateStaticImage(217, 10, 107, 89, ":Weapson-ShopV1/images/22.png", false, GUIEditor.staticimage[1]) GUIEditor.button[2] = guiCreateButton(217, 109, 107, 45, "3000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[2], "default-bold-small") guiSetProperty(GUIEditor.button[2], "NormalTextColour", "FFE10000") GUIEditor.staticimage[4] = guiCreateStaticImage(435, 11, 93, 88, ":Weapson-ShopV1/images/23.png", false, GUIEditor.staticimage[1]) GUIEditor.button[3] = guiCreateButton(431, 109, 97, 45, "1000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[3], "default-bold-small") guiSetProperty(GUIEditor.button[3], "NormalTextColour", "FFE10000") GUIEditor.staticimage[5] = guiCreateStaticImage(10, 170, 92, 88, ":Weapson-ShopV1/images/25.png", false, GUIEditor.staticimage[1]) GUIEditor.button[4] = guiCreateButton(8, 268, 94, 45, "25000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[4], "default-bold-small") guiSetProperty(GUIEditor.button[4], "NormalTextColour", "FFE10000") GUIEditor.staticimage[6] = guiCreateStaticImage(212, 170, 102, 88, ":Weapson-ShopV1/images/26.png", false, GUIEditor.staticimage[1]) GUIEditor.button[5] = guiCreateButton(212, 268, 102, 45, "25000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[5], "default-bold-small") guiSetProperty(GUIEditor.button[5], "NormalTextColour", "FFE10000") GUIEditor.staticimage[7] = guiCreateStaticImage(425, 170, 102, 91, ":Weapson-ShopV1/images/28.png", false, GUIEditor.staticimage[1]) GUIEditor.button[6] = guiCreateButton(425, 268, 102, 45, "5000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[6], "default-bold-small") guiSetProperty(GUIEditor.button[6], "NormalTextColour", "FFE10000") GUIEditor.staticimage[8] = guiCreateStaticImage(8, 323, 93, 94, ":Weapson-ShopV1/images/29.png", false, GUIEditor.staticimage[1]) GUIEditor.button[7] = guiCreateButton(7, 428, 94, 45, "30000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[7], "default-bold-small") guiSetProperty(GUIEditor.button[7], "NormalTextColour", "FFE10000") GUIEditor.staticimage[9] = guiCreateStaticImage(211, 329, 103, 93, ":Weapson-ShopV1/images/31.png", false, GUIEditor.staticimage[1]) GUIEditor.button[8] = guiCreateButton(211, 428, 102, 45, "40000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[8], "default-bold-small") guiSetProperty(GUIEditor.button[8], "NormalTextColour", "FFE10000") GUIEditor.staticimage[10] = guiCreateStaticImage(420, 331, 107, 91, ":Weapson-ShopV1/images/32.png", false, GUIEditor.staticimage[1]) GUIEditor.button[9] = guiCreateButton(420, 428, 107, 45, "3000$", false, GUIEditor.staticimage[1]) guiSetFont(GUIEditor.button[9], "default-bold-small") guiSetProperty(GUIEditor.button[9], "NormalTextColour", "FFE10000") function OpenWin() if guiGetVisible ( GUIEditor.window[1] ) then guiSetVisible ( GUIEditor.window[1], false ) showCursor(false) guiSetInputEnabled(false) else guiSetVisible ( GUIEditor.window[1], true ) showCursor(true) guiSetInputEnabled(true) end end bindKey("F7", "down", OpenWin) addEventHandler('onClientGUIClick', root, function ( ) if ( source == GUIEditor.button[1] ) then triggerServerEvent('giveWeapon_', localPlayer , 50000 , 16, 3 , "Grenade " ) elseif ( source == GUIEditor.button[2] ) then triggerServerEvent('giveWeapon_', localPlayer , 3000 , 22, 99999 , "Colt 45" ) elseif ( source == GUIEditor.button[3] ) then triggerServerEvent('giveWeapon_', localPlayer , 1000 , 1000 , 23, 9999 , "Silenced" ) elseif ( source == GUIEditor.button[4] ) then triggerServerEvent('giveWeapon_', localPlayer , 25000 , 27, 99999 , "Combat SG" ) elseif ( source == GUIEditor.button[5] ) then triggerServerEvent('giveWeapon_', localPlayer , 25000 , 26, 9999 , "Sawed-off" ) elseif ( source == GUIEditor.button[6] ) then triggerServerEvent('giveWeapon_', localPlayer , 3000 , 32, 9999 , "Tec-9" ) elseif ( source == GUIEditor.button[7] ) then triggerServerEvent('giveWeapon_', localPlayer , 30000 , 27, 9999 , "MP5" ) elseif ( source == GUIEditor.button[8] ) then triggerServerEvent('giveWeapon_', localPlayer , 40000 , 31, 9999 , "M4") elseif ( source == GUIEditor.button[9] ) then triggerServerEvent('giveWeapon_', localPlayer , 3000 , 28, 9999 , "Uzi") end end ) ; Server : addEvent('giveWeapon_', true) addEventHandler('giveWeapon_', root, function ( arg1 , arg2 , arg3 , arg4 ) local PlayerMoney = getPlayerMoney ( source ) if ( PlayerMoney >= arg1 ) then takePlayerMoney ( source , arg1 ) giveWeapon( source, arg2 , arg3 ) outputChatBox('تم شراء سلاح '..arg4, source, 255, 0 ,0 , true ) else outputChatBox("فلوسك لا تكفي", source, 255, 0, 0, true) end end ) اذا ماشتغل اكتب باف8 debugscript 3 وصور الاخطاء الي تطلع لك بالتوفيق
    1 point
  28. مبروك الافتتاح ي قماعه عجبتني الاضافات الجديدة , وخاصة الايك توقهت وماعرفت اعدل ردي الي فوق
    1 point
  29. إذا بتجدد عبر كروت شحن، افتح تذكرة إذا بتجدد عبر باي بال او بايزا ادخل على الفواتير و سدد الفاتورة
    1 point
  30. a7zan justboy Marshmello x1AhMeD,-09 default Me[Z]O Mr,[C]oR Tabl ماراح ابقى اكتب المهم مرتاح للكل
    1 point
  31. s7BaT a7zan Ram a7zan Marshmello a7zan justboy a7zan default a7zan x1AhMeD,-09 a7zan Bero a7zan Me[Z]O a7zan AboShanab a7zan LoOs a7zan ccw a7zan jhxp a7zan #CrosS a7zan Mr,[C]oR a7zan #_Osker_# a7zan -- a7zan الله يكثر من امثالهم ماقصرو ، خصوصاً الاخ
    1 point
  32. #_Osker_# Sha67 Mr,[C]oR N3XT x1AhMeD,-09 Me[Z]oO
    1 point
  33. السلام عليكم .. اشكرك على مثل هذه المواضيع التي لو اهتم بها البعض لكان القسم العربي من افضل الاقسام اولاً يوجد عدة اشياء غير تغيير اسم العنوان البعض يقوم بحذف الاكواد التي قام بطرحها بحيث انها حصرية للسيرفر وهذا سبب الدمار الاول ثانياً البعض يقوم بالترحيب بشخص لم يقم المشاركة منذ فترة ويخرج عن صلب الموضوع ثالثاً اغلب الاشخاص يطلب من صاحب الموضوع إضافته على السكايب الخاص به مما يجعل الموضوع خارج عن البرمجة واصبح شات للتعارف رابعاً اغلب الاشخاص يقوم بإقتباس الردود الطويلة مما سيجعل الموضوع طويل وقراءته مملة إذا كنت حقاً تريد الإقتباس بإمكانك إستعمال خاصية spoiler البعض اعتقد السبب الحقيقي لدخوله إلى الموقع هو تخريب الاقسام والموقع تحياتي وبالتوفيق للجميع .
    1 point
  34. Математические функции Функция: math.equation Функция: math.double [*]Функция: math.rating [*]Функция: math.float [*]Функция math.decl [*]Функция math.clamp Функции для работы с таблицами Функция: table.sortIndex [*]Функция: table.max [*]Функция: table.min [*]Функция: table.serialize [*]Функция: table.deserialize Примеры к этим 2 функциям. [*]Функция: table.replace [*]Функция для удаления значения из таблицы по маске индекса [*]Функция: table.random [*]Функция: table.last [*]Функция: table.empty [*]Функция: table.size [*]Функция: table.find Функции для работы со строками Функция: string.transfer [*]Функция: string.trim Функции для работы с цветом Функция: HSLtoRGB [*]Функция: tocolorHSB Прочие функции Функция: getAllWeapons Функция: getPlayerCount Функция: takeMoney [*]Функция: getWeaponModelFromID [*]Функция: getWeaponStatFromWeaponID [*]Функция: setRandomMap [*]Функция: getRandomPlayer [*]Функция: elementRotationToPoint [*]Функция: isRussianText Классы Небольшой класс по работе с файлами. Стандартные функции MTA + возможность читать файл построчно. Библиотека для реализации класса от Lua Dev с обновлением от Kernell и Setuper Если у кого нибудь есть ещё функции или классы или ещё что-то, выкладывайте сюда.
    1 point
  35. Как я и обещал – публикую статью о некоторых возможностях шейдера и MTA. Речь пойдёт об изменении цвета нужных нам компонентов автомобиля (а точнее текстуры, которые наложены на полигоны этих компонентов) с помощью пиксельного и вершинного шейдеров. В качестве примера, я буду использовать стандартный автомобиль Sultan, а перекрашивать я ему буду диски на колёсах. На самом деле данный метод будет работать на любых объектах игры, будь-то это объекты ландшафта или же персонажи. Но так как сегодня мы будем работать с ZModeler 2, то их рассматривать мы не будем (так как ZM2 не умеет работать с костями персонажей и плохо экспортирует обычные объекты). Сразу оговорюсь – имеется ввиду, что вы уже владеете основами работы с ZModeler 2, поэтому детально рассматривать эту программу мы не будем. К счастью русскоязычных уроков по ZM2 очень много. Подготовка И так, мы имеем проект с уже готовым автомобилем, который без проблем работает в нашей любимой игре. Теперь можно приступать к делу. Для того чтобы MTA смогла найти с каким материалом ей работать — мы должны передать ей имя с помощью engineApplyShaderToWorldTexture. При экспорте модели из ZModeler 2 все материалы принимают название первой текстуры в самом материале. Т.е. если ваша текстура называется WHEELS.tga – то материал будет называться WHEELS. Это очень важно, так как если вы просто покрасите колёса и не установите текстуру (хотя бы в 1px), то материал в игре будет называться unnamed, как и все у которых нет текстур. Реализация Так уж случилось, что диски моего автомобиля имеют текстуру vehiclegeneric256, которая не является уникальной (ею окрашены ещё другие части автомобиля) – это не редкое явление. Чтобы решить эту проблему, придётся создать копию этой текстуры и назвать так как нам нужно. Далее мы создаём новый материал, называем его как нам удобно (я предпочитаю чтобы имена материалов и имена текстур совпадали), добавляем новую текстуру, выделяем нужные нам полигоны и применяем к ним наш материал. Экспортируем нашу модель.. и а этом наша работа с ZModeler2 закончена. Пишем шейдер Сам по себе шейдер будет очень простой, мы создадим одну переменную которой мы сможем задавать значения цвета из скрипта, все остальные данные нам предоставит MTA. Для загрузки шейдера я использовал следующий скрипт (он очень простой, поэтому отдельно его рассматривать мы не будем): addEventHandler( "onClientResourceStart", resourceRoot, function() local shader = dxCreateShader( "color.fx" ); if shader then dxSetShaderValue( shader, "color", { 1.0, 0.5, 0.0 } ); engineApplyShaderToWorldTexture( shader, "wheels256" ); end end ); Теперь займёмся написанием самого шейдера. Объявляем переменные: float4 color = 1; sampler Sampler0 : register( s0 ); В качестве цвета мы используем переменную color - её значение мы будем устанавливать с помощью engineApplyShaderToWorldTexture Теперь нам необходимо взять текущий цвет пикселя и «смешать» его с нашим цветом (color): struct PSInput { float2 TexCoord : TEXCOORD0; }; float4 PixelShaderFunction( PSInput PS ) : COLOR0 { float4 texColor = tex2D( Sampler0, PS.TexCoord ); texColor *= color; return texColor; } Всё что и делает этот шейдер – просто перекрашивает пиксели текстуры. Как видно мы не учитываем освещение из-за чего наши колёса будут светиться в темноте как огни. И тут на помощь к нам приходит mta-helper.fx написанный нашими любимыми The MTA Team =) Так же они для нас написали замечательную функцию которая просчитывает дифьюзный цвет автомобиля с учётом глобального затенения мира – MTACalcGTAVehicleDiffuse. Функция первым аргументом требует нормали вершин. Так как пиксельный шейдер работает непосредственно с изображением, информацию о нормалях мы не имеем. Для этого нам придётся написать вершинный шейдер. Исправленный код шейдера: #include "mta-helper.fx" float4 color = 1; sampler Sampler0 : register( s0 ); struct VSInput { float4 Position : POSITION0; float3 Normal : NORMAL0; float4 Diffuse : COLOR0; float2 TexCoord : TEXCOORD0; }; struct PSInput { float4 Position : POSITION0; float2 TexCoord : TEXCOORD0; float4 Diffuse : COLOR0; }; PSInput VertexShaderFunction( VSInput VS ) { PSInput PS = (PSInput)0; float4 worldPosition = mul( VS.Position, gWorld ); float4 viewPosition = mul( worldPosition, gView ); float4 position = mul( viewPosition, gProjection ); PS.Position = position; PS.TexCoord = VS.TexCoord; PS.Diffuse = MTACalcGTAVehicleDiffuse( VS.Normal, VS.Diffuse ); return PS; } float4 PixelShaderFunction( PSInput PS ) : COLOR0 { float4 texColor = tex2D( Sampler0, PS.TexCoord ); texColor *= PS.Diffuse * color; return texColor; } technique { pass P0 { VertexShader = compile vs_2_0 VertexShaderFunction(); PixelShader = compile ps_2_0 PixelShaderFunction(); } } В вершинном шейдере мы создаем новый объект типа PSInput, который будет подаваться на вход в нашу функцию PixelShaderFunction. Так как объект изначально не имеет никаких данных, наша задача передать их, как мы и сделали это с TexCoord, Diffuse и Position. Так как основной задачей вершинного шейдера является установка вершин, то он должен определить семантику POSITION для выходного параметра. В нашем случае это Position. Чтобы получить правильную позицию вершины для пиксельного шейдера, мы умножаем её на мировую матрицу объекта (gWorld), затем на матрицу вида камеры (gView), а затем и на матрицу проекции камеры (gProjection). Далее всё просто, с помощью функции написанной разработчиками MTA мы просчитываем новый цвет и передаём в Diffuse. В пиксельном шейдере мы просто умножаем полученный Diffuse на наш color, вот собственно вот и всё. Пишем скрипт для шейдера Скрипт который я использовал выше не подходит для работы на реальном сервере, так как не поддерживает работу с несколькими объектами, ибо шейдер глобальный, а значит цвет колёс у всех машин будет один. Для этого нам нужно для каждого автомобиля создавать новый объект шейдера, который будет иметь своё значение цвета. Хранить информацию о цвете колёс мы будем в ElementData в виде таблицы – это позволит устанавливать цвет с серверной стороны (для этого мы будем отслеживать событие onClientElementDataChange). Так же мы будем отслеживать события onClientElementStreamIn, onClientElementStreamOut и onClientElementDestroy. Событие onClientElementStreamIn необходимо нам для того чтобы создать шейдер когда автомобиль попадёт в стример клиента, остальные два – для удаления шейдера. Скрипт шейдера: local vehicles = {}; function CreateVehicleShader( vehicle ) local color = getElementData( vehicle, "WheelsColor" ); if color then local shader = dxCreateShader( "color.fx" ); if shader then vehicles[ vehicle ] = shader; dxSetShaderValue( shader, "color", color ); engineApplyShaderToWorldTexture( shader, "wheels256", vehicle ); return true; end end return false; end function CheckVehicleShader( element ) local vehicle = element or source; if vehicle and getElementType( vehicle ) == "vehicle" then if vehicles[ vehicle ] then return true; end return CreateVehicleShader( vehicle ); end return false; end function DestroyVehicleShader( element ) local vehicle = element or source; if vehicles[ vehicle ] then destroyElement( vehicles[ vehicle ] ); vehicles[ vehicle ] = NULL; end end addEventHandler( "onClientElementStreamIn", root, CheckVehicleShader ); addEventHandler( "onClientElementStreamOut", root, DestroyVehicleShader ); addEventHandler( "onClientElementDestroy", root, DestroyVehicleShader ); addEventHandler( "onClientElementDataChange", root, function( key, oldValue ) if key == "WheelsColor" and getElementType( source ) == "vehicle" and CheckVehicleShader( source ) then dxSetShaderValue( vehicle[ source ], "color", getElementData( source, "WheelsColor" ) ); end end ); addEventHandler( "onClientResourceStart", resourceRoot, function() for i, vehicle in ipairs( getElementsByType( "vehicle", root, true ) ) do CheckVehicleShader( vehicle ); end end ); Как можно было заметить, функция CreateVehicleShader создаёт шейдер для нашего автомобиля. В случае успеха возвращает true. Вызов функции происходит только из CheckVehicleShader - она проверяет наличие шейдера для автомобиля, если его нет - создаёт его. В случае успеха так же возвращает true. Так как при старте ресурса в стримере уже могут быть автомобили и они могут иметь информацию о цвете (WheelsColor), мы используем событие onClientResourceStart для проверки всех автомобилей, что находятся в стримере. onClientElementDataChange мы отслеживаем на случай изменения информации о цвете со стороны сервера. Так как изначально её может не быть, то шейдер не будет создан при старте ресурса или когда автомобиль попадёт в стример игрока - для этого у нас есть функция CheckVehicleShader.
    1 point
  36. 1) Тут где-то на форуме рекомендовали не пользоваться GTA Crazy IMG Editor (нужно искать), а использовать IMG Tool 2.0 2) Этот квадрат называется LOD (Level of Detail, где-то видел даже такой вариант - Low Object Distance). 3) Зачем клонировать диск? Достаточно просто к нему применить новый материал. 4) Я не знаю как поступает KAM`s Script, но: 5) Судя по ошибке KAM's Script, ты криво его установил, так как он не может найти информацию о материалах. Эта тема не по моделированию, и даже не по 3D Max`у. Максимум на что я могу ответить в этой теме - по шейдерам, Lua, MTA и немного о ZModeler2. Стоп, запаковываем текстуру (TXD), а заменяем модель (DFF), я запутался. Сказано же - обычная процедура. TXD и DFF в любом случае нужно загружать и заменять, так как мы имеем модифицированную модель и текстуры для неё. P.S. Только у меня Submit в Quick Reply не работает в этой теме?
    1 point
  37. Сразу оговорюсь, данный урок требует основных знаний о таблицах Lua На самом деле в просторах сети полно учебников по данной теме, поэтому решил я написать этот учебник просто потому что его тут нет (естественно копировать всё из других учебников я не стану, а постараюсь рассказать своими словами) Зачем это нужно В целом, всё это, позволяет нам изменить поведение Lua в определённых ситуациях 1. Возможность реализации ООП в Lua 2. Перегрузка операторов (это так же может быть необходимым для П.1) Что это такое Метатаблица - это обычная таблица в которой описываются определённые события (например сложение, вычитание, сравнивание и т.д.) В качестве названия события выступает индекс таблицы, а её значение - обработчик события (метод) Как использовать Для использования достаточно просто обозначить таблице нашу мета-таблицу MyTable = {}; MyTableMeta = { __index = MyTable }; setmetatable( MyTable, MyTableMeta ); Методы нашей мета-таблицы можно определить в любое время, в силу для таблицы они вступают сразу после определения. Ниже список всех доступных событий и их описание __index( self, key ) чтение по ключу __newindex( self, key, value ) запись по ключу __call( self, ... ) вызов как функции __add( self, arg ) сложение __sub( self, arg ) вычитание __mul( self, arg ) умножение __div( self, arg ) деление __mod( self, arg ) остаток от деления __pow( self, arg ) возведение в степень __unm( self ) унарный минус __concat( self, arg ) конкатенация строк __len( self ) длина __eq( self, arg ) оператор "равно" __lt( self, arg ) оператор "меньше" __le( self, arg ) оператор "меньше или равно" __tostring( self ) Вызывается при попытке перевести объект в строковое представление (например с помощью функции tostring) __gc Вызывается для userdata-объектов при сборке мусора __metatable Если задать это поле в метатаблице, то getmetatable будет просто возвращать его значение, а setmetatable вернет ошибку. Пример Рассмотрим работу метатаблиц на примере события __call. Допустим мы хотим чтобы таблицу Vector3 можно было использовать как функцию. local Vector3 = {}; local Vector3_meta = { -- Добавляем наше событие __call = function( self, fX, fY, fZ ) -- self это указатель на нашу таблицу Vector3 return { X = fX, Y = fY, Z = fZ }; end; }; setmetatable( Vector3, Vector3_meta ); -- Устанавливаем метатаблицу для Vector3 Готово! Теперь если вызвать Vector3( 1, 2, 3 ) то нам вернётся новый объект - таблица с полями X, Y и Z. Теперь немного усложним задачу, дадим нашему объекту свою метатаблицу Vector3_meta_object = -- Это будет метатаблица для всех новых объектов { -- Добавляем событие сложения __add = function( vec1, vec2 ) -- vec1 - таблица слева, vec2 - таблица справа return Vector3( vec1.X + vec2.X, vec1.Y + vec2.Y, vec1.Z + vec2.Z ); -- Создаём новый объект end; }; Vector3 = {}; Vector3_meta = { __call = function( self, fX, fY, fZ ) local vecObject = { X = fX, Y = fY, Z = fZ }; setmetatable( vecObject, Vector3_meta_object ); -- Тут мы указываем метатаблицу нашему новому объекту return vecObject; end; }; setmetatable( Vector3, Vector3_meta ); -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3.X, vec3.Y, vec3.Z ); -- 90 124 68 В итоге при сложении двух векторов (двух таблиц с этой метатаблицей), у нас получится новый объект с новыми X Y Z. print( vec3.X, vec3.Y, vec3.Z ); - На мой взгляд это немного не удобно, намного удобнее было бы просто передать вектор в функцию print, давайте исправим, для этого нам понадобится событие __tostring function Vector3_meta_object.__tostring( self ) return "( " .. self.X .. ", " .. self.Y .. ", " .. self.Z .. " )"; end -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3 ); -- ( 90, 124, 68 ); Заключение Как видно на примерах, в этом нет ничего сложного. Как и говорилось выше, с помощью данного функционала можно реализовать полноценные классы. Есть пару библиотек которые автоматизируют этот процесс, одна из них идёт в комплекте с Lua (require "classlib"), а вторая валяется где-то тут. Задавайте свои вопросы, постараюсь на них ответить Материал написан специально для mtasa.com. Копирование запрещено
    1 point
  38. Приветствую всех, господа В этой теме я расскажу о некоторых возможностях функции debug.setmetatable Когда я только познакомился с Lua, первым делом у меня возник вопрос "а как получить символ из строки?", кто знаком с Си или с Pawn наверное знают, что это делается путём обращения к строке по индексу, в Lua такого нет, а обращаться через sub( 1, 1 ) не очень то и удобно, но благо разработчики оставили нам возможность "перебивания" мета-таблиц для определённого типа с помощью debug.setmetatable. И так, приступим: Для начала нужно получить мета-таблицу у строки local _string_mt = debug.getmetatable( "" ); И переопределить событие __index которое вызывается при чтении индекса из таблицы function _string_mt:__index( index ) -- обратите внимание, что функция объявлена через двоеточие - это значит, что будет передаваться скрытый аргумент self который будет указывать на нашу строку if type( index ) == 'number' then -- тут всё просто, если индекс числового типа, return self:sub( index, index ); -- то возвращаем подстроку строки self end -- иначе всё необходимое для return string[ index ]; -- для базовой работы методов len, sub, gsub и т.д. end И последний шаг, применяем мета-таблицу к строкам debug.setmetatable( "", _string_mt ); Возможно многим нравится стиль конкатенации строк оператором + (плюс) как в JavaScript или в C++ (например в std::string), способ реализации выкладываю ниже Для этого мы будет использовать событие __add которое вызывается при "сложении" чего либо с чем либо, поэтому когда вы попытаетесь "сложить строку", то будет вызван этот обработчик function _string_mt:__add( str ) return self .. str; end На самом деле я бы не рекомендовал использовать это, так как в случае возникновения ошибки, вы не сможете определить её место (тут вам поможет только pcall) Таким же методом можно сделать и удаление из строки оператором - (минус) Например ("hello from russia")-("from") вернёт нам "hello russia" function _string_mt:__sub( str ) return self:gsub( str, '' ); end А вот так мы добавим возможность вызывать методы для чисел debug.setmetatable( 0, { __index = function( self, index ) return math[ index ]; end } ); Брать мета-таблицу у чисел мы не стали, так как стандартно её нет, но вообще желательно это проверить, мало ли что Теперь мы можем делать так: print( ( 12 ):random( 34 ) ); На этом пока всё. Статья была написана скорее для тех кто уже ознакомлен с понятием "мета-таблицы" в Lua, ибо на самом деле это далеко не весь их функционал, поэтому возможно имеет смысл написать урок на эту тему Если есть вопросы - задавайте, постараюсь ответить Копирование запрещено
    1 point
×
×
  • Create New...