/execute: لماذا يهم ترتيب as/at وكيف يعمل store فعليًا
معظم سلاسل execute المعطوبة تنشأ من الخلط بين من ينفّذ الأمر وأين يُنفَّذ. إليك ما يغيّره كل أمر فرعي، والترتيب الذي يحل المشكلة.
/execute أمر واحد يتنكّر في هيئة لغة برمجة نصية. كل إخفاق تقريبًا يعود إلى أمرين فرعيين يبدوان وكأنهما يفعلان الشيء نفسه، لكنهما لا يفعلان ذلك.
as يغيّر مَن. at يغيّر أين.
as <target>— يستبدل المنفّذ.@sالآن يعني ذلك الكيان. الموضع لا يتغيّر.at <target>— يستبدل الموضع والاتجاه والأبعاد. المنفّذ لا يتغيّر.
لذا فإن هذا لا يفعل شيئًا مفيدًا:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
يُنفَّذ مرة لكل زومبي، لكن دائمًا عند قدميك، فيضع كتلة واحدة مرارًا وتكرارًا. الحل هو استخدام كليهما:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
يعيد at @s تثبيت السياق على الزومبي الذي اختاره as للتو. as … at @s هو أكثر اقتران شيوعًا في الأمر بأكمله، ونسيان at @s هو أكثر خطأ شيوعًا.
الترتيب من اليسار إلى اليمين، وهو تراكمي
تُنفَّذ الأوامر الفرعية بالتتابع، وكل واحد منها يعدّل السياق الذي يراه التالي:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— تمريرة واحدة لكل لاعبat @s— الانتقال إلى ذلك اللاعبpositioned ^ ^ ^3— 3 كتل أمام المكان الذي ينظر إليه
بدّل الخطوتين 2 و3 وسيُحسب positioned ^ ^ ^3 من موضعك أنت واتجاه نظرك — ثم يتخلص at @s منه بالعودة إلى اللاعب، فيضيع الإزاحة بالكامل.
علامة الإقحام مقابل التلدة
~ ~ ~— نسبةً إلى الموضع، بمحاذاة محاور العالم^ ^ ^— نسبةً إلى اتجاه النظر: يسار، أعلى، أمام
إحداثيات الإقحام هي سبب كون positioned ^ ^ ^3 تعني "أمام" و~ ~ ~3 تعني "3 كتل جنوبًا". خلط التدوينين في ثلاثية إحداثيات واحدة خطأ نحوي.
store قيمة مُرجَعة، وليس متغيّرًا
store يلتقط ما يُرجعه الأمر — عادةً عدد نجاحات أو قيمة نتيجة:
execute store result score @s Count run data get entity @s Inventory
أمران يخطئ فيهما الناس:
resultمقابلsuccess.resultهو الرقم الذي ينتجه الأمر؛successهو 1 أو 0 لما إذا كان قد نُفِّذ. عدّ الكيانات يحتاجresult.storeيأتي قبلrun، وهو ينطبق على الأمر الذي بعدrun، لا على سلسلة الأوامر الفرعية.
if مقابل unless يقطعان السلسلة
if وunless يرشّحان — تتوقف السلسلة عندهما عندما يفشل الاختبار. وجود عدة جمل if يعني AND. لا يوجد OR؛ ذلك يحتاج أمرين منفصلين أو predicate.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
ابنِ السلسلة أمرًا فرعيًا تلو الآخر، مع عرض السياق في كل خطوة، في Advanced Command Builder — فهو يغطي أيضًا data وitem وloot وschedule وparticle وplaysound من النموذج نفسه.