एक साधारण वाह बॉट बनाना: निरंतर

यह पिछले लेख की एक निरंतरता है:
युद्धक्राफ्ट की ऑनलाइन गेम की दुनिया के लिए एक सरल बॉट बनाना

इस भाग में, मैं नीलामकर्ता और मेलबॉक्स के साथ बातचीत करने की प्रक्रिया पर चर्चा करूँगा। यदि पिछला भाग अधिक सामान्य था, तो यह भाग वाह दुनिया के साथ अधिक जुड़ा हुआ है और बहुत कुछ अन्य ऑनलाइन खेलों के लिए लागू होने की संभावना नहीं है।



उस लेख में, हमने एक बॉट बनाया जो स्वतंत्र रूप से एक एनपीसी नीलामीकर्ता के पास आ सकता है। अब हमें अपने आगे के कार्यों को लागू करने की आवश्यकता है। सबसे पहले, मैं इस बारे में थोड़ी बात करता हूं कि नीलामी कैसे काम करती है। मैं व्यक्तिगत रूप से प्रतीकों का व्यापार करता हूं, लेकिन मेरे द्वारा उपयोग किए जाने वाले एडऑन आपको किसी भी क्राफ्टिंग आइटम के व्यापार को स्वचालित करने की अनुमति देते हैं। मैं TradeSkill मास्टर का उपयोग करता हूं , यह नीलामी लाभ मास्टर के लेखकों का एक ऐडऑन है , जिसे त्वरित नीलामी कहा जाता था। मुद्दा यह है: मेरे पास नीलामी में मेरी लगभग 400-500 वस्तुएं हैं। मेरे अलावा, सर्वर पर 4-5 अधिक लोग हैं जो समान वॉल्यूम में समान सामान का व्यापार करते हैं। मेरा काम है कि हर समय सामान की कीमत उनके मुकाबले कम रखी जाए। यह आपको एक ऐडऑन बनाने की अनुमति देता है: यह स्वचालित रूप से नीलामी को स्कैन करता है, अगर यह पाता है कि किसी ने मेरा से कम कीमत पर एक आइटम रखा है, तो यह नीलामी से मेरा बहुत कुछ हटा देता है। आइटम को मेल पर भेजा जाता है। तदनुसार, तब आपको इसे पोस्ट ऑफिस से लेने और प्रतियोगियों की तुलना में कम कीमत पर पोस्ट करने की आवश्यकता है। मूल्य भी addon द्वारा सौंपा गया है।

यानी वास्तव में, बॉट का कार्य नीलामीकर्ता के पास जाना, नीलामी खिड़की खोलना, वस्तुओं की नीलामी शुरू करना, फिर बहुत कुछ रद्द करना शुरू करना है जब सब कुछ रद्द हो जाता है - पोस्ट ऑफिस पर जाएँ और सब कुछ उठाएँ, फिर नीलामी में वापस जाएँ। हमने पहले से ही एक बॉट लिखा है जो जानता है कि एनपीसी नीलामीकर्ता को कैसे आना है। अब हमारा काम ट्रेडिंग शुरू करना है।

व्यापार


यहाँ पहले से ही एक स्वच्छ AutoIt है, जिसमें कुछ मैक्रोज़ जोड़े गए हैं।
हमें एक मैक्रो की आवश्यकता है जो नीलामीकर्ता के लक्ष्य को ले जाएगा - यह
/   

इस मैक्रो को असाइन करें, उदाहरण के लिए, बटन "9" पर। आगे हमें उसके साथ व्यापार शुरू करने की आवश्यकता है। यहां, सब कुछ सरल है: कुंजियों को असाइन करने के लिए सेटिंग्स में, अनुभाग "लक्ष्यों का उपयोग करने के लिए फ़ंक्शन" आपको "लक्ष्य के साथ बातचीत" बटन असाइन करने की आवश्यकता है, मैंने इसे उदाहरण के लिए "\" को सौंपा।
नीलामी खुलने के बाद, आपको सामान को बैग से नीलामी में डालने की प्रक्रिया शुरू करनी चाहिए। मेरे ऐडऑन में, यह बटन पर एक साधारण क्लिक द्वारा वांछित है, अन्य ऐड-ऑन में इसे दो क्लिक लग सकते हैं - यह कोई फर्क नहीं पड़ता, फ़ंक्शन वैसे भी तुच्छ है:
 Func StartPostingAuc() Send("9") ;     Sleep(300) Send("\") ;   Sleep(2000);           -   MouseClick("left", 1278, 155) ;    " " Sleep(2000) $state = "posting" ;  EndFunc 


वास्तव में पोस्टिंग फ़ंक्शन स्वयं भी काफी सरल है। बटन पर क्लिक करने के बाद, यह विंडो दिखाई देती है:

नीचे एक प्रगति पट्टी है, और एक बटन शीर्ष पर दिखाई देता है, उस पर क्लिक करके हमारे माल को नीलामी के लिए रखा जाता है।
तदनुसार, हमारा कार्य बटन पर क्लिक करना है जबकि एक प्रगति बार है, जैसे ही प्रगति पट्टी समाप्त होती है, अगले चरण पर जाएं - उस माल को रद्द करने के लिए जिसके लिए कीमत तोड़ी गई है
 Func PostingAuc() $borderPixelColor = PixelGetColor(937,527);       -   ,   - While $borderPixelColor = 6249826 and $state = "posting" ;   - -  MouseClick("left", 1026, 210) Sleep(500); $borderPixelColor = PixelGetColor(937,527); Wend if $state = "posting" then ;    -     -  $state = "startcancel" EndIf EndFunc 


रद्दीकरण पोस्टिंग से अलग नहीं है, एक प्रगति पट्टी और एक बटन के साथ एक ही खिड़की। तदनुसार, फ़ंक्शन बिल्कुल समान हैं, बस क्लिक करें। यह पूरी ट्रेडिंग प्रक्रिया है।

मेलबॉक्स में ले जाएं


सभी रद्द किए गए सामान मेल में होने के बाद, आपको उन्हें वहां से लेने की आवश्यकता है। ऐसा करने के लिए, हम मेलबॉक्स पर जाते हैं। सिद्धांत रूप में, मेलबॉक्स तक चलने की प्रक्रिया नीलामीकर्ता के चलने की प्रक्रिया से लगभग भिन्न नहीं है:
हम एक सेमाफोर भी लिखते हैं जो दिखाएगा कि कहाँ जाना है। हम नेविगेट करने में आसान बनाने के लिए समन्वय प्रणाली के रोटेशन को भी बनाते हैं। जब चरित्र मेलबॉक्स का सामना कर रहा है, तो कोण 2.31 रेडियन है।

एकमात्र अंतर: जब आप मेलबॉक्स के किनारे जाते हैं, तो दीवारों में उभरे हुए तत्व होते हैं, जिन्हें मैं कभी-कभी दुर्घटनाग्रस्त कर देता हूं, इसलिए सेमाफोर बनाते समय, मैंने इस क्षण को ध्यान में रखा और दीवार के पास जाने पर इसे दाईं ओर ले गया। सिद्धांत रूप में, यह बस एक और शाखा को जोड़कर किया गया था:
  elseif(mailPosX < 0.2000 and mailPosY > 0.896) then PlayerMailGoForvard:SetTexture(1,0,0); PlayerMailGoBack:SetTexture(1,0,0); PlayerMailGoLeft:SetTexture(1,0,0); PlayerMailGoRight:SetTexture(0,1,0); PlayerOnMail:SetTexture(1,0,0); 

यानी x <0.2 जब तक मैं भवन नहीं छोड़ देता, y> 0.896 - मैं दीवार के पास जा रहा हूं, हमें दूर जाना चाहिए। जैसे ही दीवारों ने इमारत छोड़ दी, छोड़ने की कोई जरूरत नहीं है।

अब यह चरित्र मेलबॉक्स में आ चुका है, आपको इसे किसी तरह खोलने की आवश्यकता है।
नीलामीकर्ता जिस तरह से यहां काम नहीं करता है वह यह है कि मेलबॉक्स को लक्ष्य पर नहीं ले जाया जा सकता है।
इसलिए, यहां थोड़ी तैयारी की आवश्यकता है: बॉट शुरू करने से पहले, आपको कैमरे को यथासंभव करीब लाने की आवश्यकता है और इसे आगे और नीचे देखो। इससे पहले, एपी वोवा ने आपको कैमरे की वर्तमान स्थिति का पता लगाने की अनुमति दी थी, और आप कैमरे को नियंत्रित करने के लिए एक सेमीफोर लिख सकते थे, लेकिन लोगों को एंटरटेन करने के बाद एक संवर्धित वास्तविकता एडऑन लिखी, जिसने खिलाड़ी के जीवन को बहुत सरल बना दिया, ऐड-ऑन में उपयोग के लिए इस एप फ़ंक्शन को निषिद्ध किया गया था। इसलिए, आपको बॉट शुरू होने पर कैमरे को मैन्युअल रूप से कॉन्फ़िगर करना होगा: नीलामकर्ता के साथ बातचीत करने के लिए, इससे कोई फर्क नहीं पड़ता कि कैमरा कैसे निर्देशित किया गया है।

इसलिए, हम मेलबॉक्स पर आए, कैमरा नीचे इंगित कर रहा है। हम कुछ इस तरह देखते हैं:

हमारा काम मेलबॉक्स पर राइट-क्लिक करना है।
यहाँ समस्याएं हैं:
1. हम केवल उसी बिंदु की गारंटी नहीं दे सकते जो हम करेंगे, केवल लगभग
2. मेलबॉक्स को किसी अन्य खिलाड़ी द्वारा अवरुद्ध किया जा सकता है

इन समस्याओं का अर्थ निम्न है: हम उस बिंदु को हार्डकोड नहीं कर सकते हैं जिस पर हमें मेलबॉक्स खोलने के लिए क्लिक करने की आवश्यकता है, जैसा कि हम अन्य बटनों के मामले में करते हैं।
लेकिन मेलबॉक्स के लिए हमारे दृष्टिकोण को ध्यान में रखते हुए, हम मानते हैं कि सबसे अधिक संभावना है कि यह स्क्रीन के बाएं तीसरे में कहीं होगा।
तदनुसार, हम एक फ़ंक्शन लिखेंगे जो उस स्थान पर पहले क्लिक करेगा जहां मेलबॉक्स सबसे अधिक बार स्थित है, और अगर यह नहीं मिलता है, तो स्क्रीन के बाईं तीसरे पर क्लिक करें जब तक कि यह नहीं मिल जाता है।
9 घंटे के परीक्षण के लिए, यह फ़ंक्शन केवल 2 बार मेलबॉक्स को नहीं ढूंढ सका, और यह मेरी गलती थी: मेलबॉक्स का मार्ग खराब तरीके से पंजीकृत था, चरित्र उस सीमा से गिर गया जिस पर वह खड़ा था और स्क्रीन पर कोई मेलबॉक्स नहीं था। इस समस्या को सेमाफोर में एक शर्त को निर्धारित करके हल किया गया था जिसके तहत चरित्र को थोड़ा पीछे हटना चाहिए ताकि गिरना न पड़े।
  elseif (mailposX > 0.203) then PlayerMailGoForvard:SetTexture(1,0,0); PlayerMailGoBack:SetTexture(0,1,0); PlayerMailGoLeft:SetTexture(1,0,0); PlayerMailGoRight:SetTexture(1,0,0); PlayerOnMail:SetTexture(1,0,0); 

मेलबॉक्स खुली स्थिति में है (ऊपर बाईं ओर आप अपडेट किए गए सेमाफ़ोर का एक टुकड़ा, अधिक कॉम्पैक्ट देख सकते हैं):


दरअसल, हम लाल बटन "सब कुछ पाओ" के रूप में मेलबॉक्स के उद्घाटन का निर्धारण करेंगे। ऑटोिट के लिए कार्य, मुझे यह मिला:
 Func OpenMail() $x1 = 392 ; ,        $y1 = 382 While not (PixelGetColor(237,515) = 6226176) ;      -     MouseClick("right", $x1, $y1); $y1 = $y1 + 20 if $y1 > 620 Then $x1 = $x1 + 10 $y1 = 54 if $x1 > 650 and $y1 > 620 Then $x1 = 194 $y1 = 54 EndIf EndIf Sleep(200) Wend MouseClick("left", 237,515)4    -    Sleep(1000) MouseClick("left", 237,535);     $state = "givingmails";     EndFunc 

इस मामले में, लाल बटन पर क्लिक करने के बाद, यह तब तक ग्रे हो जाता है जब तक कि सभी पत्र प्राप्त नहीं हो जाते

ईमेल प्राप्त करें


सामान्य तौर पर, पत्र प्राप्त करना काफी सरलता से काम करता है: आपको बस इंतजार करना होगा और तब तक इंतजार करना होगा जब तक कि चतुर TradeSkillMaster मेल से सभी पत्र नहीं निकाल देगा। जैसे ही एडऑन सब कुछ हटा देता है, बटन लाल रंग में बदल जाता है और आप नीलामकर्ता के पास वापस जा सकते हैं: हम पहले से ही जानते हैं कि कैसे।

ऐसा लगता है कि बॉट लिखा गया है। लेकिन तब सबसे बड़ी समस्याओं का मुझे इंतजार था: यह पता लगाने के लिए कि सभी पत्र प्राप्त हुए थे, ऐसा कोई तुच्छ कार्य नहीं था क्योंकि यह पहली बार देखा गया था। सामान्य तौर पर, यह पता लगाने के दो तरीके हैं कि सभी पत्र प्राप्त होते हैं:
1. बटन फिर से लाल हो जाता है। सबसे आसान विकल्प, दुर्भाग्य से - दुर्लभतम।
2. बैग भरे हुए - जबकि बटन लाल नहीं होता है और बॉट हमेशा के लिए खड़े हो सकते हैं और पोस्ट ऑफिस के पास इंतजार कर सकते हैं। इस समस्या को हल करने के लिए, बॉट स्वचालित रूप से स्टार्टअप पर अंतिम बैग खोलता है और यह सुनिश्चित करता है कि इसमें अंतिम सेल खाली है। जैसे ही बैग के अंतिम सेल का रंग बदलता है, तो बैग भरे हुए हैं, नीलामी का समय आ गया है
3. कभी-कभी व्यापार कौशल मास्टर छोटी गाड़ी है और कुछ खाली पत्र मेल से हटाए नहीं जाते हैं। इस मामले में, बटन कभी भी लाल नहीं होता है, भले ही मेल में अधिक अक्षर न हों। इस मामले में, समस्या को सरल रूप से हल किया जाता है: मैंने आखिरी मेल स्लॉट लिया, और मैं देखता हूं कि यह बदलता है या नहीं: जब पत्र प्राप्त होते हैं तो वे लगातार बढ़ते हैं और स्लॉट बदल जाता है। जब सभी पत्र प्राप्त होते हैं तो इसे बदलना बंद हो जाता है। यदि यह 20 सेकंड के भीतर नहीं बदलता है, तो यह माल का प्रदर्शन करने के लिए जाने का समय है।

कुल समारोह यह निकला:
 Func GiveMails() if PixelGetColor(237,515) = 6226176 or $i = 25 or not (PixelGetColor(1665, 868) = 2761500) then ;        $state = "goingtoauc" $i = 0 EndIf if PixelGetColor(52,470) = $prevcolor then ;       ,      $i = $i+1 else $i = 0 EndIf $prevcolor = PixelGetColor(52,470) Sleep(1000) EndFunc 


यह सब है, हम सफलतापूर्वक पत्र प्राप्त कर चुके हैं, हम नीलामीकर्ता को लौटा रहे हैं!


सामान्य तौर पर, मैंने इस पर अपना विकास पूरा कर लिया, क्योंकि अब मेरा बॉट जानता है कि वह सब कुछ कैसे करना है जो मैं मूल रूप से उससे चाहता था: यह नीलामीकर्ता के पास आता है, अपनी वस्तुओं को उजागर करता है, टूटी कीमतों के साथ आइटम को रद्द करता है, डाकघर में आता है, अपनी चीजों को उठाता है, नीलामी में लौटता है। , उजागर करता है, और आगे एक सर्कल में।

अंत में, मैं यह कहना चाहता हूं कि ऑनलाइन गेम्स के लिए बॉट्स का विकास एक तार्किक गेम की तरह है:
कैसे उसे सभी पत्र लेने के लिए? इस या उस सुविधा के आसपास कैसे जाएं? इस या उस फ़ंक्शन को लागू करने का सबसे अच्छा तरीका क्या है? मैं सप्ताहांत को ठीक से बिताने पर विचार करता हूं, मस्तिष्क के लिए एक अच्छी कसरत :)

Source: https://habr.com/ru/post/In113271/


All Articles