एक विचार से शुरू करें#
एक मॉड निर्देश और डेटा प्रदान करता है जो X4 उचित समय पर पढ़ता है। उसे एक मुख्य फ़ाइल की आवश्यकता नहीं है जिसके माध्यम से प्रत्येक घटना गुजरती है। डेटा संसाधनों के रूप में लोड होता है, एमडी परिस्थितियों का इंतजार करता है, एआई व्यवहार चलाता है, और Lua UI को संभालता है।
इंजन खेल का निष्पादित भाग हैः यह वस्तुओं को बनाता है, आंदोलन की गणना करता है, दुनिया को संग्रहीत करता है और स्क्रिप्ट के संपर्क में आने वाले संचालन करता है। इसका पूरा स्रोत एक मॉड फ़ोल्डर में नहीं है। एक एक्सटेंशन समर्थित प्रारूपों और एपीआई का उपयोग करता है। एपीआई एक प्रणाली के साथ बातचीत करने के लिए उपलब्ध तरीकों का एक सेट है, जैसे किसी वस्तु का नाम पढ़ना या एक घटना भेजना।
यह मार्गदर्शिका नियमित रूप से मॉडिफिकेशन को कवर करती है। नए उदाहरण स्पष्टीकरणात्मक हैं और खेल में अलग से निष्पादित नहीं किए गए थे। मूल एलिट मान स्थापित X4 9.00 फ़ाइलों के साथ जाँच की गई थी।
क्यों कई भाषाएं शामिल हैं#
विभिन्न कार्यों को अलग-अलग प्रतिनिधित्व की आवश्यकता होती है। एक शेल मान को आसानी से डेटा के रूप में संग्रहीत किया जाता है; एक घटना प्रतिक्रिया को एक हैंडलर की आवश्यकता होती है; एक बटन को एक विजेट और एक क्लिक फ़ंक्शन की आवश्यकता होती है।
| परत | विशिष्ट स्थान | अय्यूब |
|---|---|---|
| एक्सएमएल डेटा | assets/, libraries/, t/ |
गुण, वस्तुएं और अनुवादित पाठ |
| एक्सएमएल अंतर | लक्ष्य संसाधन पथ को मेल | दस्तावेज़ के चयनित भागों को बदलें |
| Mission Director | md/*.xml |
घटनाओं पर प्रतिक्रिया और विश्व तर्क का प्रदर्शन |
| एआई स्क्रिप्ट | aiscripts/*.xml |
अभिनेता का व्यवहार और आदेश |
| Lua UI | ui/*.lua, पंजीकृत ui.xml |
खिड़कियां, तालिकाएँ और इनपुट |
| मूल कोड | इंजन या मॉड की डीएलएल | निम्न स्तर की एकीकरण |
एमडी और एआई एक्सएमएल का उपयोग करते हैं लेकिन उनके अपने तत्व और निष्पादन नियम हैं। केवल विस्तार के आधार पर न्याय करने के बजाय रूट तत्व और निर्देशिका की जांच करें। Python या C# उपकरण और जटिल परियोजनाओं में दिखाई दे सकते हैं; यह उन्हें अंतर्निहित MD भाषाओं में नहीं बनाता है। एक पहला एक्सएमएल पैच केवल इसके मैनिफेस्ट और डिफरेंट की आवश्यकता होती है।
जब एक एक्सटेंशन लोड होता है तो क्या होता है#
नीचे दिए गए मूल आरेख में एक सटीक सार्वभौमिक लोड क्रम का वादा करने के बजाय जिम्मेदारियों का सारांश दिया गया है। X4 संस्करण, DLC, निर्भरता, अन्य मॉड और सहेजे गए राज्य सभी परिणाम को प्रभावित करते हैं। content.xml विस्तार और उसके संस्करण/निर्भरता की पहचान करता है। ui.xml UI वातावरण के लिए Lua फ़ाइलों की सूची देता है। प्रकट संस्करण क्षेत्रों में एक परिभाषित संख्यात्मक प्रारूप है; 0.1.0 जैसे मनमानी मानव संस्करण स्ट्रिंग को प्रतिस्थापित न करें।
extensions/имя_мода/content.xml
→ игра узнаёт расширение и его зависимости
→ получает ресурсы с учётом расширений и патчей
→ загружает подходящие скрипты и UI
→ события и callbacks вызывают обработчики
→ движок меняет состояние мираउदाहरण 1: XML एक संपत्ति संग्रहीत करता है#
नीचे दिए गए संक्षिप्त मैक्रो चित्र में, शेल एक तत्व है, मैक्स एक विशेषता है और 1800 इसका मूल्य है। XML स्वयं लूप नहीं चलाता है; इंजन संसाधन संदर्भ में उस क्षेत्र की व्याख्या करता है। एक अलग अंतर चयनित विशेषता को बदलता है।
चयनकर्ता को इस प्रकार पढ़ेंः दर्ज करें /macros/macro, निर्दिष्ट नाम के साथ मैक्रो को बनाए रखें, दर्ज करें /properties/hull, फिर चयन करें /@max. मुक़द्दमायह एक दस्तावेज पर XPath है, एक एमडी स्थिति या एक जीवित जहाज की खोज नहीं है। संसाधन परिवर्तन को अभी भी मौजूदा सहेजे गए वस्तुओं पर परीक्षण की आवश्यकता होती है। देखिये पूरा पहला पैच.
<properties>
<hull max="1800" />
</properties><diff>
<replace sel="/macros/macro[@name='ship_arg_s_fighter_02_a_macro']/properties/hull/@max">3600</replace>
</diff>उदाहरण 2: एमडी कार्य करता है#
पहले खंड में 3 को $Count, जांच करता है कि क्या यह शून्य से अधिक है और एक निदान प्रिंट करता है। यह एक उपयुक्त संकेत के अंदर से संबंधित है actions; यह एक स्वतंत्र विस्तार नहीं है। एक्सएमएल बाहरी उद्धरण एक विशेषता को सीमांकित करते हैं; अंदर सटीक, संख्या 3 उद्धृत स्ट्रिंग से भिन्न होती है।
एक पूर्ण एमडी स्क्रिप्ट में एमडी स्क्रिप्ट, संकेत, संकेत शर्तें और क्रियाएं हैं। एक संकेत एक तर्क नोड है जिसमें राज्य हैः यह प्रतीक्षा, सक्रिय और पूर्ण हो सकता है। एक पूरी फ़ाइल को लगातार शीर्ष से फिर से चलाए जाने के बजाय घटना-चालित हैंडलर के बारे में सोचें। instantiate=true namespace=this दोहराए गए घटनाओं के अपने स्वयं के परिवर्तनीय संदर्भ के साथ उदाहरण है. पढ़ें cue, वेरिएबल और वास्तविक गेम संस्करण के लिए लिंक्ड प्राथमिक प्रलेखन।
<set_value name="$Count" exact="3" />
<do_if value="$Count gt 0">
<debug_text text="'Есть элементы для обработки'" />
</do_if><set_value name="$Count" exact="3" />
<set_value name="$Label" exact="'Три'" />उदाहरण 3: UI द्वारा Lua को बुलाया जाता है#
नीचे दिए गए सादे Lua उदाहरण में गेम एपीआई का उपयोग नहीं किया गया है। local स्थानीय नाम बनाता है, function फ़ंक्शन को परिभाषित करता है, उसका तर्क इनपुट प्राप्त करता है, return परिणाम देता है, और .. तारों में शामिल होता है। मूल नमूना संदेश अपनी मूल भाषा को बनाए रखते हैं।
एक बटन को सौंपे गए फ़ंक्शन को बाद में UI द्वारा बुलाया जाता है; यह एक कॉलबैक है। किसी कार्य को सौंपना और उसे तुरंत बुला लेना अलग-अलग कार्य हैं। उदाहरण एक बटन एपीआई का आविष्कार किए बिना उस अंतर को दर्शाता है।
local function makeLabel(name)
if type(name) ~= "string" or name == "" then
return "Без имени"
end
return "Корабль: " .. name
end
local label = makeLabel("Север")local callback = makeLabel -- сохранить саму функцию
local result = makeLabel("Север") -- вызвать и сохранить ответएक खिड़की और दुनिया कैसे संवाद करती है#
Lua में गेम रीडिंग एपीआई और कुछ इंजन ऑपरेशन हैं; एमडी विभिन्न कार्यों और गुणों का खुलासा करता है। उपलब्ध संचालन और जीवन चक्र के आधार पर परत का चयन करें। दुनिया में हर बदलाव एमडी से गुजरना नहीं चाहिए।
एक आम एक्सचेंज में AddUITriggeredEvent को MD, फिर raise_lua_event को RegisterEvent कॉलबैक के लिए उपयोग किया जाता है। ये X4 पर्यावरण सुविधाएं हैं: सामान्य Lua उन्हें प्रदान नहीं करता है। MD set_value और raise_lua_event XML तत्व हैं, Lua फ़ंक्शन नहीं। देखिये जोड़ी उदाहरण.
Lua: AddUITriggeredEvent(screen, control, payload)
→ MD: event_ui_triggered
→ данные запроса: event.param3
→ действия и чтение результата
→ MD: raise_lua_event
→ Lua: RegisterEvent(name, callback)फ़ाइल को संपादित करने से पुराना परिणाम क्यों रह सकता है#
एक पैच एक अन्य मैक्रो को लक्षित कर सकता है या संगतता संघर्ष द्वारा ओवरराइट किया जा सकता है। Lua ui.xml से गायब हो सकता है। एक संकेत पहले से ही सहेज में पूरा किया जा सकता है। लोड होने के बाद वस्तु संदर्भ पुराना हो सकता है। एक सहेज दुनिया और एमडी राज्य को बहाल करता है बस हर स्रोत फ़ाइल को पुनरारंभ करने के बजाय। कुछ परिवर्तनों को आरंभिकरण या माइग्रेशन की आवश्यकता होती है।
अलग से पूछेंः क्या फ़ाइल लोड हुई, क्या इच्छित हैंडल चल रहा है, और क्या वास्तविक वस्तु बदल गई और उस परिवर्तन को बरकरार रखा गया? संभालकर्ता के लिए लॉग मार्कर अंतिम प्रभाव का प्रमाण नहीं है। नए खेलों और प्रासंगिक मौजूदा बचत को अलग से देखें।
आगे क्या पढ़ना है#
साथ जारी रखें ऑपरेटर और आम कार्य, फिर चुनें संपत्ति पैच, एमडी स्क्रिप्ट या एक खिड़की. (स)इस लेख के स्रोतों में आधिकारिक मॉडिंग सहायता का लिंक दिया गया है।