JIT
NPC chasing and killing player script
ابا سكربت لي NPC يشمي الي ورا بي قيمة مثل 109 وفيه مكعب اسمه safezone اريد اذا لم يكون لاعب داخل و NPC وصل الي هدفه يقتل لاعب او اذا كان قريب شوي مثل 30 مبتقي الي

بالتأكيد، يمكنني مساعدتك في إنشاء سكربت لشخصية غير لاعب (NPC) تتبع اللاعب وتحقق من شروط معينة.

هذا السكربت يقوم بالتالي:

  1. يجعل الـ NPC يتبع اللاعب محاولاً الحفاظ على مسافة معينة خلفه (القيمة 109).
  2. يتحقق مما إذا كان اللاعب داخل منطقة آمنة اسمها safezone.
  3. إذا كان اللاعب خارج المنطقة الآمنة واقترب الـ NPC من اللاعب لمسافة قريبة جداً (أقل من 30 وحدة)، يقوم الـ NPC بقتل اللاعب.

ستحتاج إلى دمج دالة updateNPC في حلقة التحديث الرئيسية للعبتك، وتزويدها باستمرار بالمواقع المحدثة للاعب والـ NPC. يمكنك تعديل قيم FOLLOW_DISTANCE و CLOSE_KILL_DISTANCE و npc.speed لتناسب لعبتك._

Updated files
v1
وايضا اريد اذا تم معرفة ان لاعب ليس في safezone وكان NPC وصل الي هدفه او تبقي 30 يظهر Gui نسميه jumpsacre واريده ان شاشة تتلون من اسود الي ابيض الي اسود بسرعة جدا جدا جدا سريعة وهي لوب وصورة تققرب الي شاشة بسرعة كبيرة وهي قترب تصبح اكبر واكبر الي ان تغطي 70% من شاشة لاعب ثم يتم set صحة لاعب 0 او قتله

حسنًا، سأقوم بتعديل السكربت وإضافة واجهة المستخدم (GUI) لتأثير الـ "jumpscare" مع التأثيرات البصرية التي وصفتها.

سنحتاج إلى ملف HTML لإنشاء الواجهة وملف CSS لتنسيقها وتحريكها، بالإضافة إلى تحديث ملف JavaScript.

شرح التغييرات:

  1. HTML (index.html):

    • أضفنا div بـ id jumpscare-overlay لعمل تأثير الوميض على الشاشة بأكملها.
    • أضفنا div بـ id jumpscare-gui ليحتوي على صورة الـ jumpscare (jumpscare-image). تأكد من تغيير src للصورة التي تريدها.
    • أضفنا عناصر span في قسم المعلومات لتحديث حالة اللاعب والمسافات ديناميكيًا.
    • ربطنا ملف style.css وملف game_simulation.js (اختياري للمحاكاة).
  2. CSS (style.css):

    • أضفنا تنسيقات أساسية للعناصر الجديدة (jumpscare-overlay, jumpscare-gui, jumpscare-image).
    • جعلنا عناصر الـ jumpscare position: fixed لتغطية الشاشة بأكملها و z-index عالي لتكون فوق كل شيء.
    • استخدمنا opacity: 0 و transform: scale(0.1) لإخفاء وتصغير الـ jumpscare في البداية.
    • أضفنا كلاس .hidden لإخفاء العناصر.
    • أنشأنا @keyframes screenFlash لعمل وميض سريع بين الأسود والأبيض.
    • أنشأنا @keyframes zoomIn لتحريك الصورة من المنتصف وتكبيرها.
    • أنشأنا كلاسات .flash-active و .jumpscare-active لتطبيق هذه الأنيميشن عند الحاجة.
  3. JavaScript (npc_script.js):

    • حصلنا على مراجع لعناصر الـ HTML الجديدة.
    • أضفنا متغير isJumpscareActive لمنع تكرار الـ jumpscare.
    • أضفنا ثابت JUMPSCARE_DURATION.
    • triggerJumpscare(playerObj):
      • هذه الدالة الجديدة هي المسؤولة عن تفعيل الـ jumpscare.
      • تتحقق إذا كان الـ jumpscare نشطًا بالفعل أو اللاعب ميتًا.
      • تزيل كلاس hidden وتضيف كلاسات الأنيميشن (jumpscare-active, flash-active).
      • تستخدم setTimeout لانتظار انتهاء مدة الـ jumpscare ثم تستدعي killPlayer وتوقف الوميض.
    • updateNPC(...):
      • توقف التحديث إذا كان isJumpscareActive صحيحًا.
      • حسبنا distToTarget (المسافة إلى النقطة المستهدفة خلف اللاعب).
      • تعديل شرط القتل: الآن الشرط هو !playerInSafezone && (distToPlayer < CLOSE_KILL_DISTANCE || distToTarget < TARGET_REACH_THRESHOLD). هذا يعني أن الـ jumpscare (والقتل) يحدث إذا كان اللاعب خارج المنطقة الآمنة و إما أن الـ NPC قريب جدًا من اللاعب أو أن الـ NPC وصل تقريبًا إلى نقطة التتبع خلف اللاعب.
      • إذا تحقق الشرط، يتم استدعاء triggerJumpscare(playerObj) بدلاً من killPlayer مباشرة.
    • killPlayer(...): لم تتغير وظيفته الأساسية، لكنه الآن يُستدعى من triggerJumpscare.
    • resetGame(): دالة إضافية لإعادة تعيين حالة اللعبة والـ jumpscare (مفيدة للاختبار).
    • تم ربط عناصر اللاعب والـ NPC والمنطقة الآمنة بعناصر الـ HTML المقابلة لتحديث مواقعها بصريًا.
    • تم تحديث الواجهة (المعلومات) في updateNPC و updatePlayerPosition.
  4. JavaScript (game_simulation.js):

    • هذا ملف إضافي اختياري فقط لمحاكاة بيئة اللعبة.
    • يقوم بإنشاء حلقة لعبة بسيطة (setInterval).
    • يسمح بتحريك اللاعب باستخدام مؤشر الفأرة داخل game-area.
    • يستدعي updatePlayerPosition و updateNPC في كل دورة.
    • يضيف زر "إعادة التشغيل" لاستدعاء resetGame.

الآن، عندما يتحقق شرط الاقتراب أو الوصول للهدف خارج المنطقة الآمنة، ستظهر شاشة الوميض وصورة الـ jumpscare التي تكبر بسرعة قبل أن يتم قتل اللاعب.*

Updated files
v2
عفوا لكن اريد خاص بروبلكوس lua وليس موقع

تمام، فهمت. أنت تريد هذا السلوك في لعبة Roblox باستخدام لغة Lua، وليس كصفحة ويب.

سنحتاج إلى تقسيم الكود إلى جزأين رئيسيين:

  1. Server Script (سكربت خادم): يوضع في ServerScriptService أو يكون ملحقًا بنموذج الـ NPC. هذا السكربت سيتحكم في حركة الـ NPC، يتحقق من الشروط (المسافة، المنطقة الآمنة)، ويقرر متى يتم تشغيل الـ jumpscare وقتل اللاعب.
  2. Local Script (سكربت محلي): يوضع في StarterPlayer > StarterPlayerScripts أو StarterGui. هذا السكربت سيستمع لحدث من الخادم ليعرض واجهة الـ jumpscare (GUI) مع التأثيرات البصرية المطلوبة على شاشة اللاعب.

الخطوات:

  1. إنشاء العناصر في Roblox Studio:

    • NPC Model: قم بإنشاء أو استخدام نموذج NPC موجود. تأكد من أن لديه Humanoid و HumanoidRootPart (أو جزء آخر معين كـ PrimaryPart).
    • Safe Zone Part: أنشئ Part في Workspace ليمثل المنطقة الآمنة. سمّه "SafeZone" (أو أي اسم تختاره، لكن تأكد من مطابقته في السكربت). اجعله شفافًا (Transparency = 1) وغير قابل للاصطدام (CanCollide = false) إذا أردت.
    • RemoteEvent: في ReplicatedStorage، أنشئ RemoteEvent وسمّه "TriggerJumpscareEvent".
    • ScreenGui (للـ Jumpscare): في StarterGui، أنشئ ScreenGui وسمّه "JumpscareGui". داخل هذا الـ Gui:
      • أنشئ Frame وسمّه "FlashOverlay". اجعل حجمه UDim2.new(1, 0, 1, 0) ليغطي الشاشة بالكامل. اضبط BackgroundColor3 على الأسود (0, 0, 0) و BackgroundTransparency على 1 (شفاف تمامًا في البداية). اضبط ZIndex على قيمة عالية (مثل 10).
      • أنشئ ImageLabel وسمّه "JumpscareImage". اضبط AnchorPoint على Vector2.new(0.5, 0.5) و Position على UDim2.new(0.5, 0, 0.5, 0) ليكون في المنتصف. اضبط Size على قيمة صغيرة جدًا في البداية (مثل UDim2.new(0, 50, 0, 50)). اضبط BackgroundTransparency على 1. اضبط ImageTransparency على 1. قم بتعيين Image إلى معرف الصورة (asset ID) الذي تريده للـ jumpscare. اضبط ZIndex على قيمة أعلى من الـ Frame (مثل 11).
      • تأكد من أن ScreenGui نفسه غير مفعل (Enabled = false) في البداية.
  2. كتابة السكربتات:

شرح الكود:

  • NPC_AI_Script.server.lua (الخادم):
    • يحدد المتغيرات الأساسية (نموذج الـ NPC، المنطقة الآمنة، الحدث).
    • findNearestPlayerCharacter: تبحث عن أقرب لاعب حي للـ NPC.
    • isPlayerInSafeZone: تستخدم Workspace:GetPartsInPart() للتحقق مما إذا كان أي جزء من جسم اللاعب يلامس منطقة الأمان.
    • npcLogic: الحلقة الرئيسية التي تعمل باستمرار.
      • تجد أقرب لاعب.
      • تحسب النقطة المستهدفة خلف اللاعب (targetPosition).
      • تحرك الـ NPC باستخدام Humanoid:MoveTo().
      • تتحقق من الشروط: هل اللاعب خارج المنطقة الآمنة؟ وهل الـ NPC قريب جدًا من اللاعب (CLOSE_KILL_DISTANCE) أو قريب جدًا من نقطة الهدف (TARGET_REACH_THRESHOLD
      • إذا تحققت الشروط، تضع علامة على اللاعب في activeJumpscares لمنع إرسال الحدث بشكل متكرر لنفس اللاعب، ثم تطلق JUMPSCARE_EVENT:FireClient(targetPlayer).
      • تنتظر فترة قصيرة جدًا ثم تقتل اللاعب (playerHumanoid.Health = 0).
      • تزيل علامة اللاعب بعد فترة للسماح بحدوث jumpscare آخر إذا لزم الأمر.
  • JumpscareHandler.client.lua (العميل):
    • يحصل على اللاعب المحلي وواجهة المستخدم (GUI).
    • playJumpscare: الدالة التي تنفذ التأثيرات البصرية.
      • تفعل الـ ScreenGui.
      • تجعل الـ Frame والصورة مرئيين.
      • الوميض: تستخدم TweenService لتغيير لون FlashOverlay بسرعة بين الأسود والأبيض لعدد محدد من الدورات (FLASH_CYCLES).
      • التقريب: تستخدم TweenService لتكبير JumpscareImage من حجم صغير إلى الحجم المستهدف (TARGET_IMAGE_SCALE) خلال فترة ZOOM_DURATION.
      • تمنع التداخل باستخدام isJumpscareActive.
    • JUMPSCARE_EVENT.OnClientEvent:Connect(...): تستمع للحدث القادم من الخادم وعند استقباله، تستدعي playJumpscare.

ملاحظات هامة:

  • استبدل الأسماء: تأكد من استبدال "NPC_Model" و "SafeZone" بالأسماء الصحيحة للعناصر في لعبتك.
  • معرف الصورة: لا تنس وضع معرف الصورة (Asset ID) الصحيح في خاصية Image للـ JumpscareImage في Roblox Studio.
  • الاختبار: اختبر السكربت جيدًا في وضع اللعب للتأكد من أن المسافات والشروط تعمل كما هو متوقع.
  • التحسين: يمكن تحسين أداء isPlayerInSafeZone باستخدام طرق أخرى مثل Region3 أو تتبع اللاعبين الذين يدخلون ويخرجون من المنطقة باستخدام أحداث .Touched و .TouchEnded إذا كان لديك عدد كبير من اللاعبين. الطريقة الحالية (GetPartsInPart) مناسبة لعدد قليل من اللاعبين.
  • سلوك الخمول: يمكنك إضافة سلوك للـ NPC عندما لا يكون هناك لاعب قريب (مثل التجول العشوائي) في الجزء else من npcLogic.*_
Updated files
v3
اريد سكربت يكون داخل NPC خاص بسفير

بالتأكيد. يمكنك وضع سكربت الخادم مباشرة داخل نموذج الـ NPC في Workspace. هذا يجعل الـ NPC أكثر استقلالية.

السكربت المحلي (JumpscareHandler.client.lua) سيبقى في StarterPlayer > StarterPlayerScripts لأنه يحتاج للتشغيل على جهاز كل لاعب للتحكم في واجهة المستخدم الخاصة به.

التعديل المطلوب:

في سكربت الخادم، سنقوم بتغيير طريقة الحصول على مرجع نموذج الـ NPC. بدلاً من البحث عنه في Workspace بالاسم، سنستخدم script.Parent للإشارة إلى النموذج الذي يحتوي على السكربت مباشرة.

إليك السكربتات المحدثة مع التعليمات لوضعها في الأماكن الصحيحة:

الخطوات:

  1. ضع NPC_AI_Script.server.lua: داخل نموذج الـ NPC الخاص بك في Workspace (مثلاً Workspace.MyScaryNPC.NPC_AI_Script).
  2. ضع JumpscareHandler.client.lua: داخل StarterPlayer > StarterPlayerScripts.
  3. تأكد من العناصر الأخرى:
    • نموذج الـ NPC (MyScaryNPC في المثال) لديه Humanoid و HumanoidRootPart.
    • جزء المنطقة الآمنة (SafeZone) موجود في Workspace.
    • RemoteEvent باسم TriggerJumpscareEvent موجود في ReplicatedStorage.
    • ScreenGui باسم JumpscareGui موجود في StarterGui ويحتوي على FlashOverlay (Frame) و JumpscareImage (ImageLabel) بالإعدادات المذكورة سابقًا.

بهذه الطريقة، كل NPC تضع فيه سكربت NPC_AI_Script.server.lua سيعمل بشكل مستقل ويستخدم نفس الحدث لتشغيل الـ jumpscare على اللاعبين القريبين.

Updated files
v4
اقولك ابا سكربت جديد موضوع ان NPC يلاحق لاعب لكن يسرم مخطط معين يمشي فيه NPC علشان ما يصدم بي جدار

تمام، فهمت الآن. أنت تريد أن يتبع الـ NPC اللاعب، ولكن باستخدام نظام تحديد المسارات (Pathfinding) لتجنب الاصطدام بالعوائق مثل الجدران. هذا يتطلب استخدام PathfindingService في Roblox.

سنقوم بتعديل سكربت الخادم (NPC_AI_Script.server.lua) لاستخدام PathfindingService. السكربت المحلي (JumpscareHandler.client.lua) سيبقى كما هو لأنه مسؤول فقط عن عرض التأثير البصري عند تلقي الحدث.

المتطلبات:

  • تأكد من أن العوائق التي تريد أن يتجنبها الـ NPC هي أجزاء Roblox عادية (Parts, MeshParts, etc.) وأن خاصية CanCollide لها مفعلة (أو على الأقل ليست CanQuery = false).
  • السكربت سيوضع داخل نموذج الـ NPC.

إليك سكربت الخادم المحدث:

شرح التغييرات الرئيسية في سكربت الخادم:

  1. PathfindingService: تم الحصول على الخدمة.
  2. pathComputeParams: تم تعريف جدول يحتوي على معلمات حجم الـ NPC للـ Pathfinding. عدّل AGENT_RADIUS و AGENT_HEIGHT لتناسب حجم الـ NPC الخاص بك.
  3. متغيرات الحالة: تمت إضافة currentPath, currentWaypointIndex, lastTargetPosition, pathBlockedConnection لتتبع حالة المسار الحالي.
  4. followPath(targetPosition):
    • هذه الدالة هي المسؤولة عن حساب المسار الجديد.
    • تستخدم PathfindingService:CreatePath(pathComputeParams) لإنشاء كائن مسار مع الأخذ في الاعتبار حجم الـ NPC.
    • تستخدم currentPath:ComputeAsync(npcPosition, targetPosition) لحساب المسار بشكل غير متزامن.
    • تتحقق من currentPath.Status للتأكد من نجاح الحساب.
    • تحصل على نقاط المسار (GetWaypoints).
    • تربط حدث currentPath.Blocked لاكتشاف ما إذا أصبح المسار غير صالح وتحتاج إلى إعادة الحساب.
    • تبدأ بتحريك الـ NPC إلى أول (أو ثاني) نقطة في المسار.
  5. npcLogic() (الحلقة الرئيسية):
    • إعادة حساب المسار: تتحقق مما إذا كان الهدف قد تغير، أو لا يوجد مسار حالي، أو أن الهدف قد تحرك مسافة كبيرة (RECALCULATE_DISTANCE_THRESHOLD) منذ آخر حساب. إذا كان الأمر كذلك، تستدعي followPath.
    • متابعة المسار: إذا كان هناك مسار صالح (currentPath)، تتحقق من المسافة إلى نقطة المسار الحالية (targetWaypoint).
    • إذا كانت المسافة أقل من WAYPOINT_REACH_THRESHOLD، تنتقل إلى النقطة التالية (currentWaypointIndex + 1) وتحرك الـ NPC إليها.
    • إذا وصلت إلى نهاية المسار، يتم مسح currentPath للسماح بإعادة الحساب في الدورة التالية.
    • شرط الـ Jumpscare: لا يزال يعتمد على المسافة المباشرة (distToPlayer) والمنطقة الآمنة، وليس على طول المسار المتبقي. يتم تشغيله إذا كان اللاعب قريبًا جدًا بغض النظر عن المسار.
  6. Humanoid.Died: تمت إضافة معالج لتنظيف متغيرات المسار عند موت الـ NPC.

كيفية الاستخدام:

  1. ضع سكربت NPC_Pathfinding_AI.server.lua داخل نموذج الـ NPC في Workspace.
  2. تأكد من أن اسم HumanoidRootPath صحيح في السكربت (أو غيره إلى PrimaryPart إذا كنت تستخدم ذلك).
  3. تأكد من وجود SafeZone و TriggerJumpscareEvent و JumpscareGui بالإعدادات الصحيحة كما في الشروحات السابقة.
  4. اضبط قيم AGENT_RADIUS و AGENT_HEIGHT في بداية السكربت لتناسب حجم الـ NPC.
  5. اختبر السكربت. يجب أن ترى الـ NPC الآن يتتبع اللاعب ويتجنب الجدران والعوائق الأخرى.
Updated files
v5