Don't Starve Together-ის გამოყოფილ სერვერზე მოდებს ორი ფაილი სჭირდება: mods/dedicated_server_mods_setup.lua სერვერის ინსტალაციაში ეუბნება, რომელი workshop-ის ელემენტები ჩამოტვირთოს, ხოლო modoverrides.lua თითოეული shard-ის საქაღალდეში წყვეტს, რომელია მათგან ჩართული და რა პარამეტრებით. ადმინები Klei-ის მომხმარებლის ID-ებია, თითო ხაზზე თითო, adminlist.txt-ში კლასტერის საქაღალდეში. დანარჩენი ყველაფერი - kick-ები, ბანები, შენახვები, rollback-ები, ნივთების გამოძახება - Lua-ა, რომელიც shard-ის კონსოლში იკრიფება, და ამ ბრძანებებიდან რამდენიმე სერვერის კონსოლზე სხვანაირად იქცევა, ვიდრე თამაშში. ეს სტატია სიღრმისეულად აღწერს მოდების ფაილებს, როგორ დააყენო ყოველი მოდის კონფიგურაცია სწორად გამოცნობის გარეშე, ადმინების დაყენებას, ბრძანებების სრულ ცნობარს და როგორ დააბრუნო უკან ისე, რომ შენი Forest და Caves სხვადასხვა დღეზე არ დარჩეს.
თავად კლასტერისთვის - token, cluster.ini, server.ini, პორტები და shard-ები - დაიწყე Don't Starve Together-ის სერვერის გზამკვლევით. ეს სტატია გულისხმობს კლასტერს, რომელიც ეშვება.
როგორ აღწევს მოდები გამოყოფილ სერვერამდე#
DST-ის სერვერი მოდებს მოთამაშეებიდან არასდროს ტვირთავს. ის მათ თავად ჩამოტვირთავს Steam Workshop-იდან, როცა shard ეშვება. ნაკადი ასეთია:
- Shard კითხულობს
dedicated_server_mods_setup.lua-ს და ჩამოტვირთავს ან ანახლებს იქ ჩამოთვლილ ყოველ workshop-ის ელემენტს. - კითხულობს თავის საკუთარ
modoverrides.lua-ს და რთავსenabled = true-ით მონიშნულ მოდებს, მითითებული კონფიგურაციით. - როცა მოთამაშე შემოდის, სერვერი მის კლიენტს ეუბნება, რომელი მოდებია საჭირო, და კლიენტი მათ Workshop-იდან ავტომატურად ჩამოტვირთავს.
ამ დიზაინის შედეგი ის არის, რომ კლასტერი ონლაინ უნდა იყოს - offline_cluster = false - რომ workshop-ის მოდებმა საერთოდ იმუშაოს, და ყოველი shard გაშვებისას ჩამოტვირთავს იმას, რაც სჭირდება, ამიტომ მოდების გრძელი სია უფრო ნელ გაშვებას ნიშნავს.
სად ხვდება ჩამოტვირთული ფაილები, დამოკიდებულია მოდის workshop-ის ფორმატზე. ძველი მოდები ინსტალაციის mods საქაღალდეში workshop-<id> დირექტორიებად იხსნება. ახლები ugc_mods საქაღალდეში ინახება, კლასტერისა და shard-ის მიხედვით დაყოფილი, თუ სერვერი -ugc_directory-ით სხვაგან მიმართულად არ ეშვება. რომელიმეს შეხება იშვიათად გჭირდება; სასარგებლოა იცოდე, როცა ამოწმებ, მოხდა თუ არა ჩამოტვირთვა სინამდვილეში.
dedicated_server_mods_setup.lua#
ეს ფაილი სერვერის ინსტალაციის დირექტორიაშია და არა კლასტერის საქაღალდეში - mods/dedicated_server_mods_setup.lua თამაშის ბინარების გვერდით. ეს ჩამოსატვირთი სიაა, და მხოლოდ ჩამოსატვირთი სია:
-- Individual workshop items, by idServerModSetup("1234567890")ServerModSetup("2345678901")-- Or a whole workshop collectionServerModCollectionSetup("3456789012")ID არის რიცხვი მოდის Workshop-ის URL-ის ბოლოს, ?id=-ის შემდეგ. კოლექციის ID იგივენაირად მუშაობს და კოლექციის ყოველ ელემენტს ჩამოტვირთავს - მოსახერხებელია დიდი სიისთვის, მაგრამ ნიშნავს, რომ ყველას, ვისაც კოლექციის რედაქტირება შეუძლია, შეუძლია შეცვალოს, რას ჩამოტვირთავს შენი სერვერი. გამოიყენე კოლექცია, რომელსაც შენ ფლობ.
აქ სამი რამ აბნევს ხალხს:
- ეს ფაილი ინსტალაციაშია, ამიტომ ხელახალმა ინსტალაციამ ან validate-მა შეიძლება ის განულოს. შეინახე ასლი კლასტერის საქაღალდეში ან შენს ჩანაწერებში და განახლებების შემდეგ აღადგინე.
- მოდის აქ ჩამოთვლა მას არ რთავს. მხოლოდ ჩამოტვირთავს. მოდი, რომელიც ამ ფაილშია და
modoverrides.lua-ში არა, ყოველ გაშვებაზე ჩამოიტვირთება და არასდროს გამოიყენება. - მოდები ყოველ გაშვებაზე ახლდება. როცა ავტორი აქვეყნებს, შენი შემდეგი restart მას აიღებს. ვერსიის დაფიქსირება არ არსებობს, რის გამოც თამაშის ან მოდის განახლებამ შეიძლება გააფუჭოს კლასტერი, რომელიც გუშინ კარგად მუშაობდა.
modoverrides.lua, თითო shard-ზე#
ყოველ shard-ს თავისი modoverrides.lua აქვს კლასტერში მის საქაღალდეში - Master/modoverrides.lua და Caves/modoverrides.lua. ეს Lua-ს ცხრილია, რომლის გასაღებებია workshop- პლუს ID:
return { ["workshop-1234567890"] = { enabled = true, configuration_options = { stack_size = 99, show_in_inventory = true, }, }, ["workshop-2345678901"] = { enabled = true },}წესი, რომელიც წყვეტს, იმუშავებს თუ არა კლასტერი: ყოველი მოდი, რომელიც სამყაროზე მოქმედებს, ორივე shard-ში იდენტური ოფციებით უნდა იყოს ჩართული. როცა მოთამაშე sinkhole-ში ჩადის, ის სერვერის პროცესებს შორის გადადის. თუ მოდი Forest-ში ჩართულია და Caves-ში გამორთული, ამ მოდის ნივთები და არსებები მეორე მხარეს არ არსებობს, და შედეგი მერყეობს გამქრალი ნივთებიდან crash-ით ჩავარდნილ shard-მდე. შეინახე ერთი ფაილი და ყოველი ცვლილების შემდეგ ორივე საქაღალდეში დააკოპირე.
კონფიგურაციის გასაღებები არსად არის დოკუმენტირებული, გარდა თავად მოდისა. ყოველ მოდს აქვს modinfo.lua, და მისი configuration_options ცხრილი ჩამოთვლის თითოეული ოფციის შიდა name-ს, დაშვებულ data მნიშვნელობებს და default-ს. modoverrides.lua-ში მნიშვნელობები ზუსტად ერთ-ერთი ამ data მნიშვნელობათაგანი უნდა იყოს - რიცხვი, სადაც მოდი სტრიქონს ელის, ან მნიშვნელობა, რომელიც მის სიაში არ არის, ჩუმად იგნორირდება და ნაგულისხმევი გამოიყენება.
რომელი მოდები ეკუთვნის სერვერს#
DST-ის ყოველი მოდი თავის modinfo.lua-ში აცხადებს, სად მუშაობს, და ღირს მისი წაკითხვა, სანამ რამეს დაამატებ:
დროშა modinfo.lua-ში | რას ნიშნავს სერვერისთვის |
|---|---|
client_only_mod = true | სერვერებისთვის საერთოდ არ არის. ყოველი მოთამაშე თავად აყენებს |
all_clients_require_mod = true | მუშაობს სერვერზე და ყოველ კლიენტზე. შესვლისას ავტომატურად ჩამოიტვირთება |
all_clients_require_mod = false | მხოლოდ სერვერზე მუშაობს. მოთამაშეებს არაფერი სჭირდებათ |
dst_compatible = true | დაწერილია DST-ისთვის და არა ერთმოთამაშიანი Don't Starve-ისთვის |
მხოლოდ კლიენტის მოდები - მინირუკის HUD-ები, განლაგების ბადეები, ინტერფეისის ცვლილებები - სერვერზე არაფერს აკეთებს. ნუ დაამატებ მათ სერვერის სიაში; მის ნაცვლად მოთამაშეებს უთხარი, რომლებს ურჩევ.
მხოლოდ სერვერის მოდები ჯგუფისთვის ყველაზე იაფი სახეობაა: ისინი წესებს, ჩამოვარდნებს ან spawn-ებს ცვლიან ისე, რომ არავის არაფრის ჩამოტვირთვა არ სჭირდება. მოდები, რომლებიც ყველა კლიენტს სჭირდება, იქ არის, სადაც ჩამოტვირთვის ზომის, ვერსიების ცვლის და თავსებადობის პრობლემები ცხოვრობს. კლასტერს ორმოცი ყველა-კლიენტის მოდით ორმოცი რამე აქვს, რაც თამაშის შემდეგ განახლებაზე შეიძლება გაფუჭდეს, და ახალი მოთამაშის პირველი შესვლა ყველა მათგანს ჩამოტვირთავს.
კარგი დისციპლინაა მოკლე სიის შენახვა, ყოველი დამატების სამყაროს ასლზე შემოწმება და მოდების დამატება სათამაშო სესიებს შორის და არა მათ დროს. მოდიანი სერვერის სისუფთავე უფრო ფართო ჩვევას აღწერს, ხოლო workshop-ის კონტენტის ზოგადი მექანიკა სერვერებზე Steam Workshop-ის მოდები გამოყოფილ სერვერებზე სტატიაშია.
მოდები, რომლებიც Workshop-ზე არ არის - შენი საკუთარი ან პრივატული fork - სერვერის mods დირექტორიაში საქაღალდედ იდება და modoverrides.lua-ში ამ საქაღალდის სახელით ირთვება workshop- გასაღების ნაცვლად. მოთამაშეებს მაშინ ასლი ხელით სჭირდებათ, რადგან ავტო-ჩამოტვირთვა მხოლოდ Workshop-ის ელემენტებისთვის მუშაობს.
ადმინები და როგორ ვიპოვოთ Klei-ის ID-ები#
ადმინები ჩამოთვლილია adminlist.txt-ში კლასტერის საქაღალდეში, cluster.ini-ის გვერდით:
KU_aB3dEf7hKU_9zQ2mNp1ჩანაწერები Klei-ის მომხმარებლის ID-ებია, რომლებიც KU_-ით იწყება და ერთნაირია ყოველ პლატფორმაზე, სადაც ანგარიში თამაშობს. ეს არ არის Steam-ის ID-ები ან მოთამაშის სახელები. ერთის საპოვნელად სთხოვე მოთამაშეს შემოვიდეს და shard-ის კონსოლში გაუშვი:
c_listallplayers()ის ბეჭდავს ყოველ დაკავშირებულ მოთამაშეს მისი ID-ით. მოთამაშეებს თავიანთი ID-ის პოვნა Klei-ის ანგარიშის გვერდზეც შეუძლიათ. ფაილი shard-ის გაშვებისას იკითხება, ამიტომ რედაქტირების შემდეგ გადატვირთე.
თამაშში ადმინი ორ რამეს იღებს. მოთამაშეების სია (დაჭერილი Tab) ყოველი სახელის გვერდით kick-ისა და ბანის ღილაკებს აჩვენებს. ხოლო თამაშის კონსოლს - რომელიც backtick ღილაკით იხსნება - შეუძლია სერვერს ბრძანებები გაუგზავნოს: ის ლოკალურ რეჟიმში იწყება, და აკრეფამდე remote-ზე Ctrl-ით გადართავ. ლოკალურ რეჟიმში გაშვებული ბრძანება მხოლოდ შენს კლიენტზე მოქმედებს, რის გამოც "აკრიფე c_save() და არაფერი მოხდა" ასე ხშირია.
whitelist.txt იმავე ID-ებს იყენებს და cluster.ini-ში whitelist_slots-თან ერთად სლოტების დასაჯავშნად მუშაობს. blocklist.txt ბანების სიაა, და სერვერი მასში წერს, როცა ვინმეს დაბანავ.
კონსოლის ბრძანებების ცნობარი#
ბრძანებები Lua-ა, რომელიც იმ shard-ის კონსოლში იკრიფება, რომელსაც გულისხმობ - Forest-ის ბრძანებები Master-ს ეგზავნება, Caves-ის ბრძანებები - Caves-ს.
| ბრძანება | რას აკეთებს |
|---|---|
c_save() | ახლავე ინახავს ამ shard-ს |
c_shutdown() | ინახავს და აჩერებს. c_shutdown(false) შენახვის გარეშე აჩერებს |
c_reset() | ამ shard-ს ბოლო შენახვიდან ხელახლა ტვირთავს |
c_rollback(n) | n snapshot-ით აბრუნებს უკან |
c_regenerateshard() | შლის და თავიდან აგენერირებს მხოლოდ ამ shard-ს |
c_regenerateworld() | შლის და თავიდან აგენერირებს მთელ სამყაროს |
c_announce("text") | შეტყობინება ყოველ მოთამაშეს |
c_listallplayers() | დაკავშირებული მოთამაშეები მათი Klei-ის ID-ებით |
TheNet:Kick("KU_...") | Kick ID-ით |
TheNet:Ban("KU_...") | ბანი ID-ით და ბლოკ-სიაში ჩაწერა |
c_despawn(player) | მოთამაშეს პერსონაჟის არჩევაზე აბრუნებს |
c_godmode(player) | უკვდავებას რთავს და თიშავს |
c_spawn("prefab", n) | იძახებს prefab-ის n ცალს |
c_give("prefab", n) | აძლევს ნივთებს |
c_countprefabs("prefab") | ითვლის, რამდენი არსებობს ამ shard-ში |
c_gonext("prefab") | ტელეპორტირდება prefab-ის შემდეგ ეგზემპლართან |
TheWorld:PushEvent("ms_nextcycle") | გადადის დღის შემდეგ მონაკვეთზე |
ხაფანგი ის არის, ვის ეხება ბრძანება. თამაშში ბრძანებები მოთამაშის არგუმენტის გარეშე შენზე მოქმედებს - ან იმაზე, რაც მონიშნული გაქვს. სერვერის საკუთარ კონსოლზე "შენ" არ არსებობს, და ამათგან ბევრი მოთამაშეების სიის პირველ მოთამაშეზე გადადის. ასე რომ, პანელის კონსოლში აკრეფილი c_give("goldnugget", 10) ოქროს აძლევს მას, ვინც შემთხვევით პირველია, და არა მას, ვინც ითხოვა.
მის ნაცვლად მოთამაშეები ცხადად მიუთითე:
-- Look up a player by namelocal p = UserToPlayer("Wendy_main")c_godmode(p)c_despawn(p)-- Give items to one specific playerp.components.inventory:GiveItem(SpawnPrefab("goldnugget"))-- The connected players, in join orderfor i, v in ipairs(AllPlayers) do print(i, v.name, v.userid) endc_countprefabs ადმინის ის ხელსაწყოა, რომელსაც ხალხი ყურადღებას არ აქცევს. კლასტერს, რომელმაც ლაგი დაიწყო, ჩვეულებრივ რაღაც ზედმეტად ბევრი აქვს - დაგდებული ნივთები, დარგული ხეები, გამოძახებული არსებები - და c_countprefabs("log") ან c_countprefabs("evergreen") წამებში გეუბნება, რამდენია.
Rollback-ები და snapshot-ები#
DST snapshot-ებს ინახავს: შენახვის წერტილებს, რომლებსაც autosaver იღებს, cluster.ini-დან max_snapshots-მდე (ნაგულისხმევად 6). c_rollback(1) ერთით ბრუნდება უკან, c_rollback(3) - სამით. მოთამაშეები ითიშებიან და აღდგენილ მდგომარეობას ხელახლა უკავშირდებიან.
პრობლემა ის არის, რომ კლასტერი ორი სამყაროა. თუ Forest-ს დააბრუნებ უკან და Caves-ს არა, მოთამაშეები, რომლებიც მიწისქვეშ იყვნენ, ახალ მდგომარეობას ინარჩუნებენ, ზედაპირი კი უკან მიდის, და დღის ორი მთვლელი ერთმანეთს არ ემთხვევა. დააბრუნე უკან ორივე shard-ში ერთი და იმავე რიცხვით, ერთმანეთის მიყოლებით, და ორივე დღის მთვლელი შეამოწმე, სანამ ხალხს უკან შემოუშვებ. თუ დარწმუნებული არ ხარ, საიმედო გზაა მთელი კლასტერის საქაღალდის სრული აღდგენა backup-იდან, ორივე shard-ის გაჩერებით.
Snapshot-ები ასევე იმავე დისკზე ცხოვრობს, სადაც save. ისინი ფარავს "საათის წინ ცუდი გადაწყვეტილება მივიღეთ"-ს და არა "სერვერი წაიშალა"-ს. ამისთვის ნამდვილი backup გინდა მანქანის გარეთ - backup-ები, რომლებიც ნამდვილად აღდგება ამის არგუმენტია. RE:NODE-ზე backup-ის სლოტები ყოველ Don't Starve Together-ის გეგმაში შედის, მანქანის გარეთ ინახება და ღილაკით აღდგება; Schedules ჩანართს შეუძლია cron გამოსახულებით გააგზავნოს c_announce("Saving for backup") და c_save() კონსოლის ბრძანებებად, შემდეგ კი ერთი წუთის შემდეგ აიღოს backup.
მოთამაშეებს ასევე შეუძლიათ ხმის მიცემის დაწყება სამყაროს უკან დასაბრუნებლად ან თავიდან დასაგენერირებლად, თუ vote_enabled = true. საჯარო სერვერზე გადაწყვიტე, გინდა თუ არა ეს ძალაუფლება მოთამაშეების ხელში.
განახლებები და როცა მოდები ფუჭდება#
თამაშის განახლებები DST-ის მოდების პრობლემების მთავარი წყაროა. Klei-ის პატჩები ცვლის შიდა მექანიზმებს, რომლებსაც მოდები ებმის, და ყოველი პატჩი მოდების ნაწილს აფუჭებს, სანამ მათი ავტორები არ დაეწევიან. რადგან სერვერი მოდებს ყოველ გაშვებაზე ხელახლა ჩამოტვირთავს, მოდის გაფუჭებული განახლებაც გაფრთხილების გარეშე გწვდება.
მოკლე რუტინა:
- თამაშის განახლებამდე გააკეთე მთელი კლასტერის საქაღალდის backup.
- განახლების შემდეგ გაუშვი Master და წაიკითხე მისი ლოგი, სანამ მოდები იტვირთება. ჩავარდნილი მოდი თავის სახელს და Lua-ს შეცდომას ბეჭდავს.
- გამორთე ჩავარდნილი მოდი ორივე
modoverrides.luaფაილში, გადატვირთე და შეამოწმე სამყარო. - ხელახლა ჩართე, როცა ავტორი შესწორებას გამოაქვეყნებს.
მოდი, რომელმაც ნივთები ან არსებები დაამატა, არსებული სამყაროდან ყოველთვის სუფთად ვერ მოიშორება; shard-მა შეიძლება მისი ობიექტები გადააგდოს ან ჩატვირთვაზე უარი თქვას. მოშორებამდე გააკეთე backup, და აღდგენის ზოგადი პროცედურისთვის ნახე რა ქნა, როცა მოდის განახლება რამეს ამტვრევს.
პრობლემების მოგვარება#
მოდები setup-შია ჩამოთვლილი, მაგრამ აქტიური არ არის. ისინი modoverrides.lua-ში არ არის, ან გასაღებს workshop- პრეფიქსი აკლია.
მოდი Forest-ში მუშაობს და Caves-ს crash-ს აძლევს. ორი modoverrides.lua ფაილი განსხვავდება. ერთი მეორეს გადააწერე.
მოდის პარამეტრები იგნორირდება. ოფციის სახელი ან მნიშვნელობა მოდის modinfo.lua-ს ზუსტად არ ემთხვევა. მის ნაცვლად ფაილი თამაშიდან დააგენერირე.
მოთამაშეები მოდის განახლების შემდეგ ვერ შემოდიან. მათ კლიენტს ძველი ასლი აქვს. თამაშის გადატვირთვა ჩვეულებრივ Workshop-ის განახლებას იწვევს.
`c_give`-მ ნივთები არასწორ ადამიანს მისცა. სერვერის კონსოლი, როცა მოთამაშე მითითებული არ არის, პირველ მოთამაშეს მიმართავს. გამოიყენე UserToPlayer("name").
თამაშის კონსოლიდან ადმინის ბრძანებები არაფერს აკეთებს. კონსოლი ლოკალურ რეჟიმშია. გადართე remote-ზე და შეამოწმე, რომ ID adminlist.txt-შია და shard გადაიტვირთა.
FAQ#
უნდა დააყენონ მოთამაშეებმა სერვერის მოდები შესვლამდე?
არა. მოდები, რომლებიც ყველა კლიენტისთვის საჭიროდაა მონიშნული, მოთამაშის შესვლისას ავტომატურად ჩამოიტვირთება. მხოლოდ კლიენტის მოდები თითოეული მოთამაშის არჩევანია და არასდროს არის სავალდებულო.
შეიძლება Forest-სა და Caves-ს სხვადასხვა მოდი ჰქონდეთ?
მხოლოდ ისეთი მოდები, რომლებიც საერთო რამეებს არ ეხება, მაგალითად სერვერის მხარის ზოგიერთი ცვლილება. ყველაფერი, რაც ნივთებს, არსებებს ან რეცეპტებს ამატებს, ორივე shard-ში იდენტური უნდა იყოს, თორემ მათ შორის მოძრავი მოთამაშეები დაკარგულ ობიექტებს წააწყდებიან.
სად ვიპოვო მოდის კონფიგურაციის ოფციები?
მის modinfo.lua-ში, configuration_options-ის ქვეშ. უფრო მარტივად: დააყენე ოფციები თამაშში ლოკალურ სამყაროზე და დაგენერირებული modoverrides.lua სერვერზე დააკოპირე.
მოქმედებს თუ არა c_rollback ორივე shard-ზე?
ჩათვალე, რომ ის მოქმედებს shard-ზე, სადაც უშვებ, და ორივე ერთი და იმავე რიცხვით დააბრუნე. შემდეგ ორივე სამყაროში დღის მთვლელი შეამოწმე.
როგორ გავხადო ვინმე ადმინი restart-ის გარეშე?
ადმინების სია გაშვებისას იკითხება, ამიტომ საიმედო მეთოდია მისი Klei-ის ID-ის დამატება adminlist.txt-ში და მშვიდ მომენტში restart.




კომენტარები
სრულიად ანონიმურად: ანგარიშის, ელფოსტის და cookie-ის გარეშე. ინახება მხოლოდ სახელი, ტექსტი და დრო - სხვა არაფერი. ბმულების რაოდენობა ლიმიტირებულია.