</Mr.Tn6eL> Posted September 15, 2016 Share Posted September 15, 2016 بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته اليوم سأشرح لكم الأحداث ماهي الأحداث؟ الأحداث هي نظام تم برمجة لتشغيل الوظائف عندما يحدث شيء مثل دخول الاعب الماركر او دخول الاعب السيرفر والخ... يتم ربط هذا النظام في نظام الالمنت كيفية استخدام هذا النظام؟ addEventHandler لكي تقوم باستخدام هذا النظام عليك اولا ربط الوظيفة في الاعب عند طريق وعند القيام بذلك سوف تقوم الوظيفة بعملها على الالمنت المربوط بالوظيفة children, parent لكن عندما يكون الالمنت لديه صلة بالمنت اخر سواء كان سوف اشرح هذه الصلة في درس اخر عند استقبال حدث ما يتم تعريف متغيرات مخفية وهذه هي قائمة المتغيرات source : مصدر الحدث وهو الالمنت الذي تم ربط الحدث به eventName : (onPlayerQuit)اسم الحدث مثل this : الالمنت الذي تم ربطه بالوظيفة المستقبلة للحدث جميع الوظائف أعلاه بجانب السيرفر والكلنت وهناك ايضا متغير مخفي فقط في السيرفر client : هو الاعب الذي تم ارسال الحدث من جهته انتهينا من المتغيرات المخفية الآن ننتقل الى العوامل في الوظيفة المستقبلة ليس هناك نوع محدد من العوامل لكن لكل وظيفة عوامله الخاصة إذا كيف اقوم بمعرفة العوامل في الحدث paramaters اذهب إلى صفحة الويكي الخاصة بالحدث وقم بإيجاد قسم كما بالصورة التالية بالصورة تجد العوامل محددة بالمربع الأحمر ملاحظة : قد لا يوجد عوامل في بعض الاحداث لذا راجع الويكي لكي تعرف الوظيفة إذا لننتقل إلى المرحلة التالية هناك نوعين من الأحداث نوع مخصص مسبقا اي انه لا داعي لتشغيله - نوع يتم تخصيصه برمجياً اي أنه يتم تشغيه - كيفية استخدام النوع الأول أولا عليك معرفة الحدث اللي تريد استخدامه والذي خصصه فريق ام تي اي للاستخدام تجدها هنا https://wiki.multitheftauto.com/wiki/Client_Scripting_Events https://wiki.multitheftauto.com/wiki/Server_Scripting_Events النوع الأول مخصص للكلنت والنوع الثاني مخصص للسيرفر الآن سنشرح كيف تقوم باستقبال حدث addEventHandlerلكي نقوم بإستقبال حدث ما علينا استخدام علينا ان نشرح كيف نقوم بتركيب الجملة لدى هذه الوظيفة bool addEventHandler ( string eventName, element attachedTo, function handlerFunction, [ bool getPropagated = true, string priority = "normal" ] ) الارقمنات المطلوبة eventName: اسم الحدث المراد استقباله attachedTo: الالمنت المراد ربطه باستقبال هذا الحدث مثلا اذا كنت تريد للاعب محدد دخول ماركر يجب عليك وضعه هنا لكي يقوم باستقبال (root)الحدث لدى هذا الاعب فقط واذا كنت تريد لجميع الاعب استخدم الالمنت العام handlerFunction: الوظيفة المراد تشغيلها عند استقبال هذا الحدث الارقمنات الاختيارية getPropagated: اذا كنت تريد تشغيل هذا الحدث لدى جميع فروع هذا الالمنت ضعها قيمة صحيحة واذا كنت تريد ضعها خاطئة سأشرحها في درس أخر priority : أولية استقبال هذا الحدث اذا كان هناك حدث تريد استقباله بنفس الطريقة وتريد ان يبدا مثلا باستقبال هذا اولاً وهكذا هناك قيم عليك وضعها ولكل منها عمل خاص "high" "normal" "low" ويمكن وضعها بارقام مثلا low-999 high-999 low+999 اي قيمة رقم لكن يجب ان تكون ال- او + لاغير والآن شرحنا كيفية تركيب الجملة وهكذا onPlayerQuitلنختار حدث (هذا الحدث يقوم بالعمل اذا الاعب خرج من السيرفر(اي لاعب لكي نقوم باستقبال هذا الحدث ومعرفة من خرج من السيرفر يجب استخدام وظيفة addEventHandler("onPlayerQuit", root, function(quitType, reason, responsibleElement) outputChatBox(getPlayerName(source)) -- نقوم بكتابة اسم الاعب اللي خرج -- outputChatBox : اخراج نص بالشات -- getPlayerName : احضار اسم لاعب ما -- source : مصدر الحدث وهو الاعب الذي خرج من السيرفر outputChatBox(quitType) -- كتابة سبب الخروج بالشات if reason then -- نقوم بالتحقق ان هناك سبب outputChatBox(reason) -- كتابة سبب الخروج بالشات -- reason : هو سبب اعطاء الكيك او الباند، سوف يعطيك قيمة فولس اذا كان نوع الخروج ليس باند او كيك end if isElement(responsibleElement) and getElementType(responsibleElement) == "player" then -- نتحقق ان الالمنت اللذي قام بإعطاء كيك او باند لاعب ان نوعه هو لاعب outputChatBox(responsibleElement) --(الشاشة السوداء او اف 8) كتابة الاعب الذي قام بإعطاء الاعب كيك او باند قد يكون كونسل -- لكن نحن تحققنا مسبقاً انه لاعب end end) الآن شرحنا كيفية استخدام النوع الأول الآن النوع الثاني مالفائدة من النوع الأول؟ الفائدة تكمن اذا كنت تريد ارسال حدث خاص بك الى السيرفر او الكلنت او الجهة نفسها اللي تم ارسالها منها ولك مثال مشهور جدا وهو لوحة التسجيل لكي تقوم بعمل لوحة تسجيل عليك استخدام لوحة بالكلنت وتسجيل الدخول بالسيرفركيف اقوم بالربط؟ نعم نعم هذه هي الفائدة منها كيف الاستخدام؟ لكي تقوم بارسال حدث يجب عليك استخدام الوظائف الثانية triggerServerEvent : وظيفة تقوم بتشغيل الحدث من جهة الكلنت الى السيرفر اي لايمكن استخدامها الا بالكلنت bool triggerServerEvent ( string event, element theElement, [arguments...] ) الارقمنات المطلوبة event : اسم الحدث المراد تشغيله theElement : الالمنت هو مصدر الحدث(السورس) الارقمنات الاختيارية arguments : العوامل المراد ارفاقه مع الحدث انظر الشرح فوق لتفهم triggerClientEvent : وظيفة تقوم بتشغيل الحدث من السيرفر الى الكلنت وايضا هي وظيفة سيرفر اي لايمكن تشغيلها الا بالسيرفر bool triggerClientEvent ( [table/element sendTo=getRootElement()], string name, element sourceElement, [arguments...] ) sendTo: القيمة الافتراضية لهذا الارقمنت هو الروت واذا كنت تريد لاعب محدد ترسل اليه الترايقر ضع هذا الاعب وهكذا واذا كنت تريد وضع لاعبين محددين ضع جدول به الاعب وضعه بهذا الارقمنت (ارقمنت اختياري طبعاً) name : اسم الحدث المراد تشغيله بالكلنت sourceElement : مصدر او سورس هذا الحدث arguments : العوامل المراد ارفاقه مع الحدث انظر الشرح فوق لتفهم اختيارية طبعاً triggerEvent : تقوم هذه الوظيفة بتشغيل حدث من الجهة نفسها اي انه اذا تم تشغيلها ممن السيرفر يتم استقبالها بالسيرفر وههكذا ويعني انها وظيفة بكلها الجانبين سيرفر والكلنت لكن الاستقبال بنفس الجهة bool triggerEvent ( string eventName, element baseElement, [ var argument1, ... ] ) eventName : اسم الحدث المراد تشغيله baseElement : مصدر او سورس هذا الحدث , [ var argument1, ... ] : العوامل المراد ارفاقه مع الحدث انظر الشرح فوق لتفهم اختيارية طبعاً الآن نريد ان نعطيك مثال مثلا نريد ان نرسل حدث يقوم بالتأكد أن اي مود انتهى تحميله او لا اولا يجب وضع الكود الذي يقوم بارسال هذا الحدث الى السيرفر addEventHandler("onClientResourceStart", root, function(res) -- استقبال حدث اذا المود اشتغل triggerServerEvent("onPlayerClientResourceLoaded", localPlayer, res) -- ارسال حدث حدث ليتم استقباله بالسيرفر end) الآن نستقبله جانب السيرفر لكن لم اشرح كيف اقوم بتسجيل هذا الحدث بقائمة الأحداث طبعا سنحتاج وظيفة addEvent يتبع... 2 Link to comment
</Mr.Tn6eL> Posted September 15, 2016 Author Share Posted September 15, 2016 bool addEvent ( string eventName [, bool allowRemoteTrigger = false ] ) eventName : اسم الحدث المراد تسجيله allowRemoteTrigger : تمكين الحدث من استقباله عن بعد اي عبر مود اخر الآن نكمل مثالنا السابق ويصبح هكذا addEvent("onPlayerClientResourceLoaded") -- تسجيل هذا الحدث addEventHandler("onPlayerClientResourceLoaded", root, function(res) -- استقبال الحدث كما شرحناه سابقاً outputChatBox(getPlayerName(source).." triggered the "..eventName) -- كتابة اسم الاعب(السورس) و اسم الحدث outputChatBox(getResourceName(res)) -- كتابة اسم المود end) الآن سنعطيك مثال أخر نريد امر في اف 8 يعطينا معلومات الاعبين في ميمو مثلا يكون الامر getinfo ونضع بعدها اسم الاعب ويعطينا اسم الاعب في ميمو الاعب الذي طلب المعلومات سيكون السيرفر هكذا addCommandHandler("getinfo", function(plr, cmd, name) -- اضافة الامر في اف 8 local plr2 = type(name) == "string" and getPlayerFromName(name) -- نجلب الاعب من اسم المدخل if isElement(plr2) then -- نتحقق انه الممنت local serial = getPlayerSerial(plr2) -- نجلب السيريال local account = getPlayerAccount(plr2) -- نجيب الحساب local accountName = "Guest" -- اسم الحساب سيكون زائر if account and not isGuestAccount(account) then --نتحقق ان لديه حساب accountName = getAccountName(account) -- نغير اسم الحساب من زائر الى اسمه الحقيقي end local version = getPlayerVersion(plr2) -- نجلب اصدار ام تي ايه لدى الاعب local ip = getPlayerIP(plr2) -- نجلب الاي بي local frmt = "Name : %s\nSerial : %s\nIP : %s\nAccount : %s\nVersion : %s" -- سيكون النص بالشكل الآتي triggerClientEvent(plr, "onClientRequestPlayerInfo", plr, frmt:format(name, serial, ip, accountName, version)) -- نرسل الآمر الى الكلنت else -- اذا كان ليس لاعب المدخل outputChatBox("Player not found", plr) -- نعلم بأنه لا يوجد لاعب بالاسم المدخل end -- اغلاق التحقق end) -- addCommandHandler اغلاق الوظيفة وقوس اغلاق لدى وسيكون الكلنت بهذه البساطة addEvent("onClientRequestPlayerInfo") -- اضافة الحدث الجديد addEventHandler("onClientRequestPlayerInfo", localPlayer, function(text) -- استقبال الحدث guiSetText(memo, text or "invaild information") -- وضع المعلومات في الميمو end) -- اغلاق قوس الحدث والوظيفة يتبع... الآن سأشرح لكم كيفية إرسال حدث من نفس الجهة bool triggerEvent ( string eventName, element baseElement, [ var argument1, ... ] ) اعتقد ان الارقمنات من الأسماء فهمتها لذا سننتقل الى المثال وسيكون هذا المثال ارسال حدث اذا تم فتح القائمة الرئيسية او إغلاقها local actived = isMainMenuActive( ) -- وضع متفير للتحقق بين القيمة الثابتة والمتغيرة addEventHanlder("onClientRender", root, function( ) if isMainMenuActive( ) ~= actived then -- يتحقق ان القائمة الرئيسية مفتوحة مع المتفير الثابت triggerEvent("onClientMainMenuEvent", localPlayer, isMainMenuActive( )) -- ارسال الحدث مع حالة القائمة الرئيسية actived = isMainMenuActive( ) -- تغير القيمة الثابتة لتحقق من المرات القادمة end end) addEvent("onClientMainMenuEvent") -- تسجيل الحدث الجديد addEventHanlder("onClientMainMenuEvent", root, function(status) -- استقبال الترايقر outputChatBox(status and "Opened" or "Closed") -- كتابة بالشات هل مفتوحة ام لا end) -- اغلاق الحدث والوظيفة Link to comment
</Mr.Tn6eL> Posted September 15, 2016 Author Share Posted September 15, 2016 Latent Eventsالآن سأشرح لكم ال لكن ماهو هذا؟ أنه يشبه الحدث العادي لكن هذا الحدث يتحكم بمقدار البيانات التي يتم ارسالها ما فائدتها ؟ لها فوائد كثيرة منها تحميل الملفات والبيانات الكبيرة هذه الوظائف triggerLatentClientEvent و triggerLatentServerEvent triggerClientEventو triggerServerEvent نفس تركيب الجملة لدى لكن يزداد بعض الارقمنات وهي bool triggerLatentServerEvent ( string event, [int bandwidth=5000, bool persist=false,] element theElement, [arguments...] ) bandwidth: عدد البايتات التي يتم ارسالها بالثانية persist: يتم وضع قيمة صحيحة اذا كنت تريد استمرار نقل البيانات بعد ايقاف المود مثال لتحميل صورة من السيرفر وعرضها يكون السيرفر هكذا if fileExists("image.png") then -- نتحقق ان الصورة موجودة في المود local file = fileOpen("image.png", true) -- نفتح ملف الصورة على وضع القراءة فقط local data = fileRead(file, fileGetSize(file)) -- احظار محتويات الملف triggerLatentClientEvent("onClientSendImageData", 524288, false, root, data) -- ارسال البيانات للكلنت fileClose(file) -- اغلاق الملف end اما الاستقبال بالكلنت يكون كأي استقبال addEvent("onClientSendImageData") addEventHandler("onClientSendImageData", root, function(data) local file = fileCreate("image.png") -- صنع ملف fileWrite(file, data) -- كتابة بيانات الصورة التي تم تحميلها fileClose(file) -- اغلاق الملف guiCreateStaticImage(0, 0, 150, 150, "image.png", false) -- عرض الصورة على الشاشة end) يتبع ليوم غد بإذن الله 2 Link to comment
iMr ~ MnHmAr Posted September 16, 2016 Share Posted September 16, 2016 شرحح رائع آستفدت من بعض الشرحح شكرآ آخوي تنطيل Link to comment
</Mr.Tn6eL> Posted September 16, 2016 Author Share Posted September 16, 2016 (edited) باك، راح أشرح لكم اليوم الغاء الحدث هناك وظيفة وحدة لإلغاء حدث معين وش الفائدة من الغاء الحدث مثلا تبغى تمنع لاعب من الكتابة بالشات او من الدخول للسيرفر او الخ... لكن بعض الاحداث لايمكن الغائها مثل خروج الاعب من السيرفر ولكي تعرف هل الحدث ينلغي أو لا اتبع المربع الأحمر بالصورة التالية الآن راح نشرح لكم كيف تلغي الحدث لكي تلغي الحدث عليك استخدام cancelEvent : للحدث العادي cancelLatentEvent : latent event للأحداث الآن راح نعطي لكم تركيب الجملة تركيب الجملة لدى السيرفر يكون هكذا bool cancelEvent ( [ bool cancel = true, string reason = "" ] ) cancel : قيمة منطقية لإلغاء reason : سبب الإلغاء تركيب الجملة لدى الكلنت يكون بدون اي ارقمنت bool cancelEvent () latent event اما في الغاء bool cancelLatentEvent( player thePlayer, int handle ) thePlayer : الاعب المراد الغاء الحدث له handle : latent eventعملية في الكلنت مايحتاج ارقمنت لاعب زي كذا bool cancelLatentEvent( int handle ) الآن راح نعطي امثلة راح نلغي دخول الاعب لسيارة الشرطة اذا كان مو شرطي addEventHandler("onVehicleStartEnter", root, function(player) -- استقبال افنت عند فتح الباب حق السيارة local model = getElementModel(source) -- نجيب اي دي السيارة if (model >= 596 and model <= 599) and getPlayerTeam(player) ~= getTeamFromName("Police") then -- تحقق ان السيارة شرطة وان الاعب مو في تيم الشرطة cancelEvent( ) -- الغاء الحدث end end) الآن راح نسوي سبب لالغاء الحدث ويصير الكود كذا addEventHandler("onVehicleStartEnter", root, function(player) -- استقبال افنت عند فتح الباب حق السيارة local model = getElementModel(source) -- نجيب اي دي السيارة if (model >= 596 and model <= 599) and getPlayerTeam(player) ~= getTeamFromName("Police") then -- تحقق ان السيارة شرطة وان الاعب مو في تيم الشرطة cancelEvent(true, "You are not a policeman") -- الغاء الحدث outputChatBox(getCancelReason(), player) -- نكتب سبب الالغاء end end) الآن ساشرح لكم كيف تقوم بحذف استقبال حدث معين removeEventHandler لكي تلغي استقبال حدث معين علينا استخدام تركيب الجملة كالآتي bool removeEventHandler ( string eventName, element attachedTo, function functionVar ) eventName : اسم الحدث attachedTo : الالمنت المربوط بهذا الحدث functionVar : الوظيفة المربوطة بالحدث الآن سأعطيك مثال والمثال هذا يظهر نص ل10 ثواني ويختفي function drawText( ) -- وظيفة الحدث dxDrawText("Text", 0, 0) -- رسم النص end addEventHandler("onClientRender", root, drawText) -- اضافة الحدث لكي يرسم النص setTimer(removeEventHandler, 10000, 1, "onClientRender", root, drawText) -- نقوم بحذف الحدث المربوط بالالمنت والوظيفة Edited September 16, 2016 by </Mr.Tn6eL> 1 Link to comment
N3xT Posted September 16, 2016 Share Posted September 16, 2016 شرح فل الفل، واستفدت كثير منه بالتوفيق بالشروحات القادمة Link to comment
</Mr.Tn6eL> Posted September 16, 2016 Author Share Posted September 16, 2016 منورين، اذا عندكم حاجة صعبة مو أنتم فاهمينها قولو لي أشرحها لكم Link to comment
xX|KeMo|Xx Posted September 30, 2016 Share Posted September 30, 2016 On 15/09/2016 at 10:06 AM, </Mr.Tn6eL> said: Latent Eventsالآن سأشرح لكم ال لكن ماهو هذا؟ أنه يشبه الحدث العادي لكن هذا الحدث يتحكم بمقدار البيانات التي يتم ارسالها ما فائدتها ؟ لها فوائد كثيرة منها تحميل الملفات والبيانات الكبيرة هذه الوظائف triggerLatentClientEvent و triggerLatentServerEvent triggerClientEventو triggerServerEvent نفس تركيب الجملة لدى لكن يزداد بعض الارقمنات وهي bool triggerLatentServerEvent ( string event, [int bandwidth=5000, bool persist=false,] element theElement, [arguments...] ) bandwidth: عدد البايتات التي يتم ارسالها بالثانية persist: يتم وضع قيمة صحيحة اذا كنت تريد استمرار نقل البيانات بعد ايقاف المود مثال لتحميل صورة من السيرفر وعرضها يكون السيرفر هكذا if fileExists("image.png") then -- نتحقق ان الصورة موجودة في المود local file = fileOpen("image.png", true) -- نفتح ملف الصورة على وضع القراءة فقط local data = fileRead(file, fileGetSize(file)) -- احظار محتويات الملف triggerLatentClientEvent("onClientSendImageData", 524288, false, root, data) -- ارسال البيانات للكلنت fileClose(file) -- اغلاق الملفend اما الاستقبال بالكلنت يكون كأي استقبال addEvent("onClientSendImageData")addEventHandler("onClientSendImageData", root, function(data) local file = fileCreate("image.png") -- صنع ملف fileWrite(file, data) -- كتابة بيانات الصورة التي تم تحميلها fileClose(file) -- اغلاق الملف guiCreateStaticImage(0, 0, 150, 150, "image.png", false) -- عرض الصورة على الشاشةend) يتبع ليوم غد بإذن الله اقدر احدد كم بايت تحمل وكم باقي بايت لينتهي؟! Link to comment
</Mr.Tn6eL> Posted September 30, 2016 Author Share Posted September 30, 2016 getLatentEventStatus يب عن طريق 1 Link to comment
F[5]aMh Posted September 30, 2016 Share Posted September 30, 2016 شرح جميل من شخص جميل ,. واصل بدون فواصل ^.^ 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