Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 14/07/21 in Posts

  1. MTASA Typescript I am developing utility packages for transpiling TypeScript into an MTASA-compatible Lua code. I would like to share that project to receive some suggestions and, I believe, to help someone in resource writing. Why Lua is not so good Classes. Lua does not support classes (syntax) from scratch. If you want to write OOP code with your own classes, you have to use metatables to implement class objects behavior. That's make the source code more complicated, than it could be. Hints (from your IDE). Lua is dynamic typed language, therefore, it's hard to determine, what the variable is and, hence, IDE cannot hint you function declarations, object methods and etc. MTASA Lua is still 5.1 (it is not developing). Lua, like any programming language, is developing, however MTASA core strongly linked to Lua 5.1. Why TypeScript There is TypeScriptToLua project. My project is based on TypeScriptToLua (I use it as a dependency). General purpose of TypeScriptToLua: convert (transpile) typescript code into Lua code. Thus, you can use TypeScript without modifying MTASA core. You are available to not use types in some parts of code (you are not restricted to use types everywhere). The TypeScript is being developed by Microsoft and, I believe, that TypeScript will be alive for several years. When to not use TypeScript (where to use Lua instead of TypeScript) 1. If you are not familiar with Lua or with scripting in general. 2. if you are writing simple script. Introduction Video I have made the video, where I describe Lua disadvantages, explain, why I have chosen TypeScript (and language transpiling) and write an example. Few word about mtasa-lua-types I have created this package to provide MTASA declarations in TypeScript. If you would like to create a resource, you haven't to install it manually, just use the boilerplate. Quick Start I have provided the tutorial here: https://github.com/mtasa-typescript/resource-boilerplate. So, you have to install NodeJS and download my boilerplate. And,... you are ready to code. If you have any ideas, issues or suggestions -- post them below, or in youtube comments, or in github issues ? Example code (from youtube video) import { Player } from 'mtasa-lua-types/types/mtasa/server/oop/Player'; import { mtasa } from 'mtasa-lua-types/types/mtasa/server'; interface GithubCommitApiResponse { commit: { message: string; } } mtasa.addCommandHandler('getcommit', function(player: Player, cmd: string) { mtasa.fetchRemote( 'https://api.github.com/repos/mtasa-typescript/mtasa-lua-types/commits?per_page=1', (data: string) => { const json = mtasa.fromJSON(data) as GithubCommitApiResponse mtasa.outputConsole(`The last commit message: ${json.commit.message}`) } ) }) Future plans - Github bot, that will crawl mtasa wiki and update mtasa-lua-types continuously - Add better hinting for `addEventHandler` function Links WebSite: https://mtasa-typescript.github.io/ GitHub MTASA TypeScript Projects: https://github.com/mtasa-typescript Resource Boilerplate: https://github.com/mtasa-typescript/resource-boilerplate Resource Example: https://github.com/mtasa-typescript/resource-example
    2 points
  2. # السسلام عليكم ورحمة الله وبركاته ~ فـ بهذي الداتا تقدر تسوي اي شي تبيه Element data set / get حبيت اشرح عن الـ * واشياء تتعلق بها نبدأ بـ الشرح .... : # اول شي نتعرف على السينتكس حق الداتا Syntax bool setElementData ( element theElement, string key, var value [, bool synchronize = true ] ) var getElementData ( element theElement, string key [, inherit = true] ) توضضيح بسيط للارقمنات ... : element theElement = الألمنت اللي تبي تحط عليه الداتا string key = اسم الداتا .. وبأمكانك وضع اي اسم var value = وهي قيمة الداتا نفسها .. وبامكانك تحط قيمة الداتا اي قيمة بـ راسك او قيمة فعلية كـ انك تحط قيمة الداتا اسم اللاعب ولا اللاعب نفسه وتجيب اللاعب عبر الداتا # طيب الحين نتعرف على الداتا وش فاديتها فـ وش تسخدم # الدأتا : هي وظيفة لمساعدتك للتحقق من شرط ما وتسوي كودك + الداتا هي وهمية يعني مجرد ما اللاعب بخرج او يدخل فـ الداتا بتروح والداتا مهمة تفديك فـ اي شي تبغاه local vehicle = createVehicle ( id, x, y, z ) ---# قمنا بـ صنع سيارة جديدة setElementData( vehicle, "Anything", true ) ---# وضعنا الداتا على السيارة وقيمة الداتا ترو addCommandHandler( "GetDataVeh", function ( ) ---# امر جديد بـ الكونسل if ( isElement( vehicle ) ) then ---# نتحقق من وجود السيارة if not ( getElementData ( vehicle, "Anything" ) == true ) then ---# وهذي تعني عكس الشرط اللي مسويه يعني هنا يقول الشرط لو ما كانت الداتا ترو not نلاحظ وجود اول الشرط outputChatBox( "** Data Not Found" ) ---# لو كانت مو ترو يجي لم يتم ايجاد الداتا else ---- لو كانت الداتا قيمتها ترو . outputChatBox( "** Data Found" ) ---# يجي بالشات الداتا موجودة . end end end ) marker = createMarker ( .... ) addEventHandler ( "onMarkerHit", marker, function ( element ) if getElementType ( element ) == 'player' then -- نتحقق إن الشي إللي دخل الماركر الي هو لاعب if getElementData ( element, "ZA7F" ) == "MTA" then --- MTA اذا كانت قيمتها ZA7F نتحقق هنا من الداتا الي هي outputChatBox ( "لقد قمت بالدخول مسبقاً", element ) return else --- # MTA هنا نسوي لو مو مسوين الداتا الي ما ماخذاة قمية setElementData ( element, "ZA7F", "MTA" ) --- # عشان ما يستخدم الماركر مرة ثانية MTA هنا نسوي الداتا قيمتها givePlayerMoney ( element, 100 ) -- نعطي اللاعب 100 end end end ) مثألين بسيطين للتوضيح اكثر مع الشرحح ... : addEventHandler ( "onClientMarkerHit", marker, function( element ) --- حدث دخول الالمنت للماركر if ( element == localPlayer ) then --- نتحقق من الشي اللي دخل هل هو لاعب setElementData ( element, "NamePlayer", getPlayerName( element ) ) --- نحط داتا للالمنت اللي دخلت قيمتها اسم اللاعب end end ) addEventHandler ( "onClientMarkerLeave", marker, function( element ) --- حدث الخروج من الماركر if ( element == localPlayer ) then --- نتحقق من الشي اللي خرج . if ( getElementData( element, "NamePlayer" ) == getPlayerName( element ) ) then --- نتحقق انه قيمة الداتا اللي على اللاعب اللي خرج انها ع اسمه setElementData ( element, "NamePlayer", nil ) --- لا شي , بدون قيمة ذذ nil نحط قيمة الداتا للاعب اللي خرج end end end ) .... true - false طبعأ ملأحظين انه بـ اخر مثالين قيمة الداتا هي اسم اللاعب .. يعني مو ضروري تكون قيمة الداتا . ممكن تكون قيمةة الداتا هي اللاعب نفسه .. فـ بامكانك انك تجيب اللاعب من الداتا _ يعني تقدر تحط قيمة الداتا اي شي تبيه وفي شي مهم حبيت اوضحه .. انه يمديكـ تحفظ اكثر من قيمة بالداتا كيف ؟ بالتيبل يكون قيمة الداتا تيبل مثال بسيط ... : addCommandHandler ( "getPosToData", function ( ) --- # اضافة امر جديد للكونسل if ( getElementData ( localPlayer, "TablePos" ) ) then --- # التحقق من وجود الداتا return outputChatBox ( "Your Position In Data"..unpack ( getElementData ( localPlayer, "TablePos" ) ) ) --- # لو موجودة نسوي مخرج شات ونجيب الاحداثيات --- # طبعا استخدام ان باكـ .. وظيفتها تجيب القيم كلها بالترتيب من الجدول وقيمة الداتا ذي جدول else --- # لو كانت الداتا موب موجودة local x, y, z = getElementPosition ( localPlayer ) --- # جلبنا احداثيات اللاعب setElementData ( localPlayer, "TablePos", { x, y, z } ) --- # سوينا المنت داتا للاعب قيمتها جدول والجدول به احداثيات اللاعب end --- # اغلأق if end ) --- # اغلا الفنكشن واغلاق قوس الحدث موب ضروري استخدم ان باكـ .. بامكانك تسوي لوب بس ملاحظة مهمة وهذا ايضضضا .. : CPU فـ استخدم الداتا ياخذ من الـ .. لا تستخدمها الا للضرورة . ووظيفته بسيطة جدا انه وقت الداتا تتغير onElementDataChange : طبعأ مع الداتا يوجود حدث خاص بها وهو Parameters string theName, var theOldValue نلاحظ انه في عندنا 2 بارتمنت .. الاول هو اسم الداتا اللي تغير _ والثاني قيمة الداتا القديمةة مع هذأ الحدث لجلب القيمة الجديدة للداتا getElementData البعض يسال انه طيب والقيمة الجديدة للداتا ؟ .. تقوم بأستخدام Global parameters source: The source of this event is the element whose element data changed client: The client global variable is set to the client that called setElementData, or nil if it was called on the server. sourceResource: The resource which changed the element data. (Only works in versions above 1.3.4-5937) .. هذي الكتأبات مهمة جدأ .. نشرحها سطر سطر > اول سطر يقول سورس هذا الافنت وش هو ؟ هو الالمنت اللي الداتا عليه وتغيرت _ ممكن يكون لاعب - سيارة الخ : وهذا ليس خاص بـ الحدث هو موجود بـ اي مكان بس له وظيفة بـ لو تستخدمه بـ هذا الحدث وظيفة مختلفة وهي client السطر الثاني وهو ما يسمى بـ لو تقوم بأستخدامه تجيب اللاعب اللي غير الداتا .. او الجهة اللي غيرت الداتا ذذ Only works in versions above 1.3.4-5937 السطر الثالث بسيط جدأ .. هو عبارة عن السكربت اللي فيه الداتا هذي اللي تغيرت > نلاحظ حاط بين قوسين يعني هذي الخاصية تعمل على اصدار 5937-1.3.4 وما فوق Cancelling This event cannot be cancelled using cancelEvent. To reverse the effect, use setElementData with the old value. setElementData بس تقدر تكنسله بـ طريقة مختلفة بـ استخدام cancelEvent وش يقول هنا ؟ .. هنا يقول ما تقدر تكنسل الحدث بـ استخدم مثال بسيط للفهم اكثر .. : addEventHandler( "onElementDataChange", root, function( dataName, OldValue ) ----# اضافة حدث تغير الداتا مع تعريف البارتمنت الاثنين if ( dataName == "Anything" ) then ----# Anything نتحقق من اسم الداتا اللي تغيرت هل هي if ( source and getElementType( source ) == "vehicle" ) then ----# نتحقق من السورس وانه نوع السورس سيارة setElementData( source, dataName, oldValue ) ----# قمنا بوضع قيمة الداتا اللي تغيرت بـ القيمة القديمة يعني ما تغيرت end end end ) متعلق بالمثال اللي بأول الشرح onElementDataChange طبعا نسوي مثال بسيط عن addEventHandler( "onElementDataChange", root, function( dataName, OldValue ) ----# اضافة حدث تغير الداتا مع تعريف البارتمنت الاثنين if ( dataName == "Anything" ) then ----# Anything نتحقق من اسم الداتا اللي تغيرت هل هي if ( source and getElementType( source ) == "vehicle" ) then ----# نتحقق من السورس وانه نوع السورس سيارة local Nv = getElementData( source, dataName ) ----# قمنا بجلب قيمة الداتا الجديدة outputChatBox( data.." ** Has Been Change From "..OldValue.." To "..Nv, root, 255, 0, 0, true ) ----# نقوم بـ اضهار رسالة للكل ب اسسم الداتا والقيمة القديمة والجديدة end end end ) وظيفته ازالة الداتا عن الالمنت : removeElementData طبعا بعد ما انتهينا من الحدث هذا .. في اخر شي فنكشن يتعلق بـ الداتا وهو bool removeElementData ( element theElement, string key ) element theElement, string key = الالمنت اللي بتشيل منه الداتا , اسم الداتا ممثال بسيط .. : addCommandHandler( "RemoveMyData", function( player,_,data ) ---- # اضافة امرة للكونسل وتعريف البلير ونسوي فراغ بين الامر والداتا اللي يكتب اسمها if ( data ) then ---- # نتحقق من كتابته لاسم الداتا if ( getElementData( player, tostring( data ) ) ) then ---- # نتحقق من وجود الداتا على اللاعب اللي كتب الامر if ( getElementData( player, tostring( data ) ) ~= nil ) then ---- # او ما لها وجود او تعني لأ شي nil نتحقق انه الداتا قيمتها مو removeElementData( player, tostring( data ) ) ---- # نسوي ازالة للداتا اللي كتبها end end end end ) معلومة مهمة : اخر حد للاحرف 31 حرف للمفتاح # # واخر شي اقول انه الداتا سهلة جدا .. ومفيدة بـ اشياء كثيرة واكيد بـ تحتاجها يومأ ما . والسسلأم
    1 point
×
×
  • Create New...