TeamKind
Minecraft Bedrock խաղային սերվերների նախագիծ՝ survival և մինի-խաղեր մեկ ինստանսում, ընդհանուր հաշիվ ու տնտեսություն ինստանսների միջև, խորապես վերամշակված սերվերային միջուկ։

Տեխնոլոգիաներ
- PHP
- PocketMine-MP
- Guzzle
- Slim
- MySQL
- SQLite
- Redis
- WebSocket
- nginx
- JavaScript
Խնդիրը
TeamKind-ից առաջ ես վարում էի Minecraft Bedrock Edition-ի խոշոր նախագծերից մեկի համայնքը. լավ տեսնում էի, թե որ բողոքներն են կրկնվում և ինչ է պակասում խաղացողներին, բայց չէի կարող ազդել պրոդուկտի վրա։ Ուզում էի նախագիծ, որտեղ մշակումը հիմնվում է խաղացողների հետադարձ կապի վրա, վճարովի արտոնություններն ընդլայնում են հնարավորությունները՝ չվերածվելով pay-to-win-ի, իսկ survival-ը, SkyWars-ը և FastBuilders-ը աշխատում են որպես մեկ համակարգ, այլ ոչ թե երեք առանձին պրոդուկտ։ Տեխնիկապես ամեն ինչ սահմանափակվում էր օգտագործվող միջուկի և կոնֆիգուրացիայի հնարավորություններով. սովորական survival-ն սկսում էր կորցնել TPS արդեն մոտ 70–80 խաղացողի դեպքում, իսկ պահել պետք էր միանգամից մի քանի աշխարհ և մինի-խաղեր։ Առանձին խնդիր էին կեղծված ցանցային փաթեթներով չարաշահումները։
Լուծումը
Խաղացողը միշտ մտնում է լոբբիով. այն ստուգում է ակտիվ սեսիան և ուղարկում նրան ամրագրված ինստանս (խաղային սերվերի առանձին օրինակ), իսկ նոր խաղացողին՝ ամենաքիչ բեռնվածը։ Յուրաքանչյուր ինստանս միաժամանակ պահում է survival-ը, SkyWars-ը և FastBuilders-ը։ Անցումը դեպի մինի-խաղ տեղի է ունենում դրա ներսում. գույքացանկը պահպանվում է, պատրաստվում ռեժիմի համար և վերադարձվում խաղից հետո։ Խաղացողին ոչ մի տեղ չեն տեղափոխում։ Ինստանսների միջև ընդհանուր են հաշիվը, արտոնությունները, արժույթը և արկղերը։ Տներն ու պաշտպանված տարածքները կապված են քարտեզին և մնում են տեղային։ Դրա համար ես զարգացնում և լրամշակում էի սերվերային միջուկի սեփական տարբերակը՝ հարմարեցնելով այն բարձր բեռնվածությանը, մի քանի խաղային ռեժիմի և խոցելիությունների վերացմանը։
Ճարտարապետություն
Հիմնական տեխնիկական որոշումները
- Միջուկի սեփական ֆորք։ PocketMine-MP-ի ապստրիմն այդ պահին այլևս պաշտոնապես չէր սպասարկվում, իսկ բազային միջուկը չէր ծածկում նախագծի պահանջները, ուստի ես էականորեն լրամշակեցի այն՝ անհրաժեշտ բեռնվածության, կայունության և խաղային մեխանիկայի համար։
- Մինի-խաղերը survival-ի ինստանսի ներսում, այլ ոչ թե առանձին սերվերներում. գույքացանկը պահպանվում և վերականգնվում է, վերամիացում չկա, և SkyWars-ը չի ընկալվում որպես առանձին պրոդուկտ։
- Հաշիվը, արտոնությունները, արժույթը և արկղերն ընդհանուր են ինստանսների միջև, իսկ քարտեզին կապվածը մնում է տեղային. գնվածն աշխատում է ամենուր, բայց տներն ու պաշտպանված տարածքները մնում են կապված կոնկրետ քարտեզին։
- Մեկ հաշիվ՝ մեկ ակտիվ խաղային սեսիա. դրանով միաժամանակ մի քանի ինստանսում խաղալ հնարավոր չէ։ Մեկ այլ ինստանս անցնելու համար խաղացողը նախ ավարտում է ընթացիկ սեսիան։
- Կառավարվող վերագործարկում. թարմացումից առաջ սերվերը ճիշտ ավարտում է ակտիվությունը՝ խաղացողներին կիսատ չկտրելու փոխարեն։
Ստորև ներկայացված սքրինշոթներն ու տեսանյութերը վերցված են աշխատող համակարգից, ուստի ինտերֆեյսը և ձայնը (եթե կա) ռուսերեն են։
Minecraft Bedrock Edition խաղային սերվերների նախագիծ, որտեղ լիարժեք survival-ը միավորված էր SkyWars-ի և FastBuilders-ի հետ։
Միջուկ
Առանձին ինստանսները միաժամանակ պահում էին 180+ խաղացող։ Միջուկն էականորեն լրամշակվում էր նախագծի բեռնվածության համար։
TeamCore-ը սերվերային միջուկի խորապես վերամշակված ֆորք է՝ էական փոփոխություններով արտադրողականության, ցանցային անվտանգության, աշխարհների և չանկերի հետ աշխատանքի, ինչպես նաև խաղային տրամաբանության մեջ։ Լրամշակումներից հետո միջուկն ավելի կայուն էր աշխատում բեռնվածության տակ և ավելի լավ էր համապատասխանում նախագծի պահանջներին։ Այդ փոփոխությունների շնորհիվ TeamKind-ը դարձավ ԱՊՀ-ում Minecraft Bedrock Edition 1.1.X-ի առաջին սերվերներից մեկը, որտեղ լիարժեք survival-ը և SkyWars-ն աշխատում էին մեկ սերվերում՝ այդ միջուկի համար բարձր օնլայնով։ Դա նաև թույլ տվեց ավելացնել բազմաթիվ սեփական հրամաններ և խաղային մեխանիկաներ՝ առանց կայունության կորստի։ Այդ միջուկի կայուն տարբերակներից մեկը հասանելի է այստեղ։

Ակնարկ
Հաշիվ և նույնականացում
Նախագծի բոլոր սերվերների համար օգտագործվում էր միասնական հաշիվ։ Սկզբում գաղտնաբառերը հեշավորվում էին SHA-512-ով՝ անհատական աղով և լրացուցիչ սերվերային գաղտնիքով, որը չէր պահվում բազայում։ Մի քանի ամիս անց սխեման փոխարինվեց bcrypt-ով. այն ստեղծված է գաղտնաբառերի պահպանման համար, իսկ դրա միտումնավոր բարձր հաշվողական արժեքը թանկ է դարձնում brute-force հարձակումները։ Մուտքից հետո սեսիան պահպանվում էր, և սերվերների միջև անցնելիս գաղտնաբառը կրկին մուտքագրել պետք չէր։

Առցանց խանութ և վճարումներ
Առցանց խանութը կապված էր նախագծի հաշիվների ընդհանուր համակարգի հետ. օգտատերը մուտքագրում էր իր խաղային մականունը, կայքը ստուգում էր գրանցված հաշիվը և գնումը կապում դրան։ Վճարումն անցնում էր մի քանի արտաքին վճարային համակարգերի ինտեգրմամբ՝ բանկային քարտեր, էլեկտրոնային դրամապանակներ և այլ եղանակներ։ Գնված ապրանքները, արժույթը և արտոնությունները կապվում էին հաշվին, ոչ թե սերվերին, ուստի աշխատում էին ցանկացած սերվերում և ցանկացած ռեժիմում։ Կայքում կային ապրանքների կատեգորիաներ և պատվերների հետևում։
Վճարովի արտոնություններ առանց pay-to-win-ի
Վճարովի արտոնությունները չպետք է առավելություն տային մյուս խաղացողների նկատմամբ կամ հնարավորություն՝ նրանց վնասելու։ Ուստի, օրինակ, առարկաներն ու ռեսուրսները հնարավոր չէր տեղափոխել creative-ից survival, և գործում էին այլ սահմանափակումներ, որոնք պահպանում էին հավասարակշռությունը վճարովի և սովորական հնարավորությունների միջև։
Բոնուսային հարցեր
Բոնուսային հարցերը կապում էին խաղը VKontakte-ում նախագծի խմբի հետ։ Հարցը, հրապարակման ժամանակը և պարգևը սահմանվում էին սերվերում, իսկ մեկնարկից հինգ րոպե առաջ սերվերն ինքն էր խմբում ստեղծում պլանավորված գրառում։ Խաղացողը պատասխանում էր /bonus հրամանով նախագծի ցանկացած սերվերում. սերվերը ստուգում էր ժամանակը և պատասխանը և հաջողության դեպքում տալիս պարգևը։

Կառավարվող վերագործարկում
Թարմացումից առաջ սերվերը ճիշտ ավարտում էր ակտիվ պրոցեսներն ու մինի-խաղերը, խաղացողներին տալիս էր պարգևները և կասեցնում համապատասխան սցենարները։ Վերագործարկումն սկսվում էր միայն խաղացողներին նախազգուշացնելուց և նրանց ընթացիկ գործողություններն ավարտվելուց հետո, որպեսզի տվյալներ չկորչեն։

Մոդերացիա
Մոդերատորներն ունեին գործիքների հավաքածու տարբեր խախտումների համար՝ արգելափակումներ, ժամանակավոր սահմանափակումներ, առանձին հնարավորությունների անջատում, խաղացողի հեռացում սերվերից։ Մոդերատորների իրավունքները ճկուն կարգավորվում էին։

Առևտուր խաղացողների միջև
Խաղացողներն առարկաներ էին գնում և վաճառում միմյանց ներկառուցված առևտրի միջոցով։ Մեխանիկան փակում էր խաբեության տիպիկ սխեմաները թե՛ վաճառողի, թե՛ գնորդի կողմից։ Առանձնապես արժեքավոր առարկաները վաճառքի հանել չէր թույլատրվում, իսկ յուրաքանչյուր գործարքից սերվերը պահում էր առարկայի արժեքի 10%-ի չափով միջնորդավճար։
Խաղային մեխանիկաներ
Մակարդակներ
Մակարդակը բարձրանում էր խաղում անցկացրած ժամանակի հաշվին, անգործությունը հաշվի չէր առնվում։ Մակարդակների համար տրվում էին արժույթ, մոգական արկղեր, արտոնություններ և առանձին հնարավորությունների հասանելիություն։ Պարգևների մի մասը համընկնում էր վճարովի արտոնությունների և բոնուսների հետ, ուստի ակտիվ խաղացողները դրանք ստանում էին անվճար. եթե խաղացողն արդեն ուներ ավելի բարձր արտոնություն, կրկնվող պարգևի փոխարեն նա ստանում էր արժույթ։
FastBuilders
Արագ կառուցման մարզման ռեժիմ. հարթակները ստեղծվում էին ավտոմատ, արդյունքը գրանցվում էր, և դրա դիմաց տրվում էր պարգև։ Survival-ի հնարավորությունները ռեժիմում մնում էին, եթե չէին խանգարում մարզմանը։
Մոգական բաշխում
Սփոնի հատուկ հատվածներում պարբերաբար հայտնվում էին հազվագյուտ և արժեքավոր առարկաներ։
Անտեսանելիություն
Ի տարբերություն ստանդարտ էֆեկտի՝ անտեսանելիությունը հեռացնում էր ոչ միայն կերպարի մոդելը, այլև ներկայության բոլոր նշանները՝ էֆեկտների մասնիկները, քայլերի ձայները, զրահը և փոխազդեցության հուշումները։ /vanish list հրամանը մոդերատորներին ցույց էր տալիս բոլոր նրանց, ովքեր այդ պահին անտեսանելի են։
Այլ մեխանիկաներ
Տեսանյութում՝ պատահական առաջադրանքների համակարգը՝ պարգևներով, և մականվան, նախածանցի ու սքինի փոփոխությունը հենց խաղում։
Արդյունքներ
- Մեկ ինստանսը միաժամանակ պահում էր 180+ խաղացող։
- Survival-ը, SkyWars-ը և FastBuilders-ը աշխատում էին մեկ ինստանսի ներսում՝ առանց խաղացողին սերվերների միջև տեղափոխելու։
- Հաշիվը, արտոնությունները, արժույթը և արկղերը մնում էին ընդհանուր ինստանսների միջև։
- Լրամշակված միջուկը վերացրեց արտադրողականության սկզբնական սահմանափակումը. մինչ այդ օգտագործվող կոնֆիգուրացիան սկսում էր կորցնել TPS արդեն 70–80 խաղացողի դեպքում։
Մետրիկաներ
- խաղացող միաժամանակ մեկ ինստանսում
- 180+
Փաստեր
- Նախագծի ամենաակտիվ խաղացողը՝
Wauder-ը, TeamKind-ի աշխատանքի վերջին տարում խաղում անցկացրել է 1339,3 ժամ. երկրորդ արդյունքը՝ 797,5 ժամ,Said_123-ինն է։ - Միջուկի սեփական ֆորքի՝ TeamCore-ի կայուն տարբերակներից մեկը պահպանվել է բաց հասանելիությամբ GitHub-ում։