Recommended Posts

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اليوم سأشرح لكم الأحداث

ماهي الأحداث؟

الأحداث هي نظام تم برمجة لتشغيل الوظائف عندما يحدث شيء مثل دخول الاعب الماركر او دخول الاعب السيرفر والخ...

يتم ربط هذا النظام في نظام الالمنت

كيفية استخدام هذا النظام؟

addEventHandler لكي تقوم باستخدام هذا النظام عليك اولا ربط الوظيفة في الاعب عند طريق

وعند القيام بذلك سوف تقوم الوظيفة بعملها على الالمنت المربوط بالوظيفة

children, parent لكن عندما يكون الالمنت لديه صلة بالمنت اخر سواء كان

سوف اشرح هذه الصلة في درس اخر

عند استقبال حدث ما يتم تعريف متغيرات مخفية

وهذه هي قائمة المتغيرات

source : مصدر الحدث وهو الالمنت الذي تم ربط الحدث به

eventName : (onPlayerQuit)اسم الحدث مثل

this : الالمنت الذي تم ربطه بالوظيفة المستقبلة للحدث

جميع الوظائف أعلاه بجانب السيرفر والكلنت

وهناك ايضا متغير مخفي فقط في السيرفر

client : هو الاعب الذي تم ارسال الحدث من جهته

انتهينا من المتغيرات المخفية

الآن ننتقل الى العوامل في الوظيفة المستقبلة

ليس هناك نوع محدد من العوامل لكن لكل وظيفة عوامله الخاصة

إذا كيف اقوم بمعرفة العوامل في الحدث

paramaters اذهب إلى صفحة الويكي الخاصة بالحدث وقم بإيجاد قسم

كما بالصورة التالية

d46fb00315c64d0fa7520fa7e262817b.png

بالصورة تجد العوامل محددة بالمربع الأحمر

ملاحظة : قد لا يوجد عوامل في بعض الاحداث لذا راجع الويكي لكي تعرف الوظيفة

إذا لننتقل إلى المرحلة التالية

هناك نوعين من الأحداث

نوع مخصص مسبقا اي انه لا داعي لتشغيله -

نوع يتم تخصيصه برمجياً اي أنه يتم تشغيه -

كيفية استخدام النوع الأول

أولا عليك معرفة الحدث اللي تريد استخدامه والذي خصصه فريق ام تي اي للاستخدام

تجدها هنا

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

يتبع...

  • Like 2

Share this post


Link to post
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) -- اغلاق الحدث والوظيفة

Share this post


Link to post

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)

 

يتبع ليوم غد بإذن الله

  • Like 2

Share this post


Link to post

باك، راح  أشرح لكم اليوم الغاء الحدث

هناك وظيفة وحدة لإلغاء حدث معين

وش الفائدة من الغاء الحدث

مثلا تبغى تمنع لاعب من الكتابة بالشات او من الدخول للسيرفر او الخ...

لكن بعض الاحداث لايمكن الغائها مثل خروج الاعب من السيرفر

ولكي تعرف هل الحدث ينلغي أو لا

اتبع المربع الأحمر  بالصورة التالية

98ca8ed12e7f48abbb142643a9aef37d.png

الآن راح نشرح لكم كيف تلغي الحدث

لكي تلغي الحدث عليك استخدام

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 by </Mr.Tn6eL>
  • Like 1

Share this post


Link to post

شرح فل الفل، واستفدت كثير منه

بالتوفيق بالشروحات القادمة

Share this post


Link to post

منورين، اذا عندكم حاجة صعبة مو أنتم فاهمينها قولو لي أشرحها لكم

Share this post


Link to post
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)

 

يتبع ليوم غد بإذن الله

   اقدر احدد كم بايت تحمل وكم باقي بايت لينتهي؟!

 

Share this post


Link to post

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.