TeamKind

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

Ժամանակահատված
2018 թ․ օգոստոս — 2023 թ․ դեկտեմբեր
Կարգավիճակ
Ավարտված
Իմ դերը
Հիմնադրել եմ նախագիծը 2018-ին և առաջին երկու տարին վարել համայնքը, իսկ մշակումը՝ 2020-ից։ Որպես առաջատար մշակող պատասխանատու էի ճարտարապետության, միջուկի և հիմնական համակարգերի համար։ Առանձին հարցերով խորհրդակցում էի մեկ այլ խոշոր Minecraft-նախագծի մշակողի հետ, իսկ պլագինների ու առանձին մեխանիկաների մի մասի մշակումը պատվիրում էի ֆրիլանսերներին։
TeamKind-ի պաստառը երեք ռեժիմով՝ Survival, SkyWars և FastBuilders

Տեխնոլոգիաներ

  • 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-ը։ Անցումը դեպի մինի-խաղ տեղի է ունենում դրա ներսում. գույքացանկը պահպանվում է, պատրաստվում ռեժիմի համար և վերադարձվում խաղից հետո։ Խաղացողին ոչ մի տեղ չեն տեղափոխում։ Ինստանսների միջև ընդհանուր են հաշիվը, արտոնությունները, արժույթը և արկղերը։ Տներն ու պաշտպանված տարածքները կապված են քարտեզին և մնում են տեղային։ Դրա համար ես զարգացնում և լրամշակում էի սերվերային միջուկի սեփական տարբերակը՝ հարմարեցնելով այն բարձր բեռնվածությանը, մի քանի խաղային ռեժիմի և խոցելիությունների վերացմանը։

Ճարտարապետություն

TeamKind-ի ճարտարապետությունըԼոբբին մուտքի միակ կետն է. խաղացողը միշտ միանում է դրան, համակարգը ստուգում է ակտիվ սեսիան և խաղացողին ուղարկում է նրա համար ամրագրված ինստանս, իսկ նոր խաղացողին նշանակում է ամենաքիչ բեռնվածը։ Ինստանսը կարելի է ձեռքով փոխել։ Հաշիվը, արտոնությունները, արժույթը և արկղերն ընդհանուր են ինստանսների միջև, իսկ քարտեզը, տներն ու պաշտպանված տարածքները կապված են կոնկրետ ինստանսի։ Յուրաքանչյուր ինստանս պահում է survival-ը, SkyWars-ը և FastBuilders-ը. ռեժիմների միջև անցումը տեղի է ունենում դրա ներսում՝ գույքացանկի պահպանմամբ և վերականգնմամբ։ Հաշիվը կարող է ունենալ միայն մեկ ակտիվ սեսիա։գույքացանկը պահպանվում և վերականգնվում էընդհանուրամրագրված ինստանս, նորի համար՝ ամենաքիչ բեռնվածըԼոբբի— 19132մուտքի միակ կետը՝ խաղացողը միշտ միանում է այստեղստուգում է ակտիվ սեսիան՝ հաշիվը կարող է ունենալ միայն մեկըԽաղային ինստանս 1— 19133SurvivalSkyWarsFastBuildersՔարտեզի տվյալներայս ինստանսի քարտեզը, տներն ու պաշտպանված տարածքներըԽաղային ինստանս 2— 19134նույն ռեժիմների հավաքածունիր քարտեզը, իր տներն ու պաշտպանված տարածքներըՆախագծի ընդհանուր շերտհաշիվ · արտոնություններ · արժույթ · արկղեր
Լոբբին մուտքի միակ կետն է. խաղացողը միշտ միանում է դրան, համակարգը ստուգում է ակտիվ սեսիան և խաղացողին ուղարկում է նրա համար ամրագրված ինստանս, իսկ նոր խաղացողին նշանակում է ամենաքիչ բեռնվածը։ Ինստանսը կարելի է ձեռքով փոխել։ Հաշիվը, արտոնությունները, արժույթը և արկղերն ընդհանուր են ինստանսների միջև, իսկ քարտեզը, տներն ու պաշտպանված տարածքները կապված են կոնկրետ ինստանսի։ Յուրաքանչյուր ինստանս պահում է survival-ը, SkyWars-ը և FastBuilders-ը. ռեժիմների միջև անցումը տեղի է ունենում դրա ներսում՝ գույքացանկի պահպանմամբ և վերականգնմամբ։ Հաշիվը կարող է ունենալ միայն մեկ ակտիվ սեսիա։

Հիմնական տեխնիկական որոշումները

  • Միջուկի սեփական ֆորք։ PocketMine-MP-ի ապստրիմն այդ պահին այլևս պաշտոնապես չէր սպասարկվում, իսկ բազային միջուկը չէր ծածկում նախագծի պահանջները, ուստի ես էականորեն լրամշակեցի այն՝ անհրաժեշտ բեռնվածության, կայունության և խաղային մեխանիկայի համար։
  • Մինի-խաղերը survival-ի ինստանսի ներսում, այլ ոչ թե առանձին սերվերներում. գույքացանկը պահպանվում և վերականգնվում է, վերամիացում չկա, և SkyWars-ը չի ընկալվում որպես առանձին պրոդուկտ։
  • Հաշիվը, արտոնությունները, արժույթը և արկղերն ընդհանուր են ինստանսների միջև, իսկ քարտեզին կապվածը մնում է տեղային. գնվածն աշխատում է ամենուր, բայց տներն ու պաշտպանված տարածքները մնում են կապված կոնկրետ քարտեզին։
  • Մեկ հաշիվ՝ մեկ ակտիվ խաղային սեսիա. դրանով միաժամանակ մի քանի ինստանսում խաղալ հնարավոր չէ։ Մեկ այլ ինստանս անցնելու համար խաղացողը նախ ավարտում է ընթացիկ սեսիան։
  • Կառավարվող վերագործարկում. թարմացումից առաջ սերվերը ճիշտ ավարտում է ակտիվությունը՝ խաղացողներին կիսատ չկտրելու փոխարեն։

Ստորև ներկայացված սքրինշոթներն ու տեսանյութերը վերցված են աշխատող համակարգից, ուստի ինտերֆեյսը և ձայնը (եթե կա) ռուսերեն են։

Minecraft Bedrock Edition խաղային սերվերների նախագիծ, որտեղ լիարժեք survival-ը միավորված էր SkyWars-ի և FastBuilders-ի հետ։

Միջուկ

Առանձին ինստանսները միաժամանակ պահում էին 180+ խաղացող։ Միջուկն էականորեն լրամշակվում էր նախագծի բեռնվածության համար։

TeamCore-ը սերվերային միջուկի խորապես վերամշակված ֆորք է՝ էական փոփոխություններով արտադրողականության, ցանցային անվտանգության, աշխարհների և չանկերի հետ աշխատանքի, ինչպես նաև խաղային տրամաբանության մեջ։ Լրամշակումներից հետո միջուկն ավելի կայուն էր աշխատում բեռնվածության տակ և ավելի լավ էր համապատասխանում նախագծի պահանջներին։ Այդ փոփոխությունների շնորհիվ TeamKind-ը դարձավ ԱՊՀ-ում Minecraft Bedrock Edition 1.1.X-ի առաջին սերվերներից մեկը, որտեղ լիարժեք survival-ը և SkyWars-ն աշխատում էին մեկ սերվերում՝ այդ միջուկի համար բարձր օնլայնով։ Դա նաև թույլ տվեց ավելացնել բազմաթիվ սեփական հրամաններ և խաղային մեխանիկաներ՝ առանց կայունության կորստի։ Այդ միջուկի կայուն տարբերակներից մեկը հասանելի է այստեղ։

TeamCore-ի լոգոն
Միջուկի սեփական ֆորքի՝ TeamCore-ի լոգոն։

Ակնարկ

Կարճ ակնարկ՝ ռեժիմները, հիմնական մեխանիկաները և սերվերի կառուցվածքը, որ մասշտաբը միանգամից երևա։ Բարձր որակի բնօրինակը չի պահպանվել։

Հաշիվ և նույնականացում

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

Ակտիվ սեսիայի ստուգում
Մեկ սեսիայի կանոնը գործողության մեջ. խաղացողն արդեն խաղում է մեկ այլ ինստանսում, և հաղորդագրությունը նշում է այն պորտը, որտեղ բաց է այդ սեսիան։

Առցանց խանութ և վճարումներ

Առցանց խանութը կապված էր նախագծի հաշիվների ընդհանուր համակարգի հետ. օգտատերը մուտքագրում էր իր խաղային մականունը, կայքը ստուգում էր գրանցված հաշիվը և գնումը կապում դրան։ Վճարումն անցնում էր մի քանի արտաքին վճարային համակարգերի ինտեգրմամբ՝ բանկային քարտեր, էլեկտրոնային դրամապանակներ և այլ եղանակներ։ Գնված ապրանքները, արժույթը և արտոնությունները կապվում էին հաշվին, ոչ թե սերվերին, ուստի աշխատում էին ցանկացած սերվերում և ցանկացած ռեժիմում։ Կայքում կային ապրանքների կատեգորիաներ և պատվերների հետևում։

Առցանց խանութ. գնումը կապված է նախագծի միասնական հաշվին, ուստի աշխատում է բոլոր սերվերներում, ոչ միայն այնտեղ, որտեղ կատարվել է։

Վճարովի արտոնություններ առանց pay-to-win-ի

Վճարովի արտոնությունները չպետք է առավելություն տային մյուս խաղացողների նկատմամբ կամ հնարավորություն՝ նրանց վնասելու։ Ուստի, օրինակ, առարկաներն ու ռեսուրսները հնարավոր չէր տեղափոխել creative-ից survival, և գործում էին այլ սահմանափակումներ, որոնք պահպանում էին հավասարակշռությունը վճարովի և սովորական հնարավորությունների միջև։

Վճարովի արտոնությունների սահմանները. ինչ են տալիս արտոնությունները և ինչ՝ միտումնավոր չեն տալիս, որպեսզի վճարող խաղացողը մարտում առավելություն չստանա։

Բոնուսային հարցեր

Բոնուսային հարցերը կապում էին խաղը VKontakte-ում նախագծի խմբի հետ։ Հարցը, հրապարակման ժամանակը և պարգևը սահմանվում էին սերվերում, իսկ մեկնարկից հինգ րոպե առաջ սերվերն ինքն էր խմբում ստեղծում պլանավորված գրառում։ Խաղացողը պատասխանում էր /bonus հրամանով նախագծի ցանկացած սերվերում. սերվերը ստուգում էր ժամանակը և պատասխանը և հաջողության դեպքում տալիս պարգևը։

Բոնուսային հարցեր
Բոնուսային հարց. առաջադրանքը հրապարակվում է համայնքում, խաղացողը պատասխանում է հենց խաղում /bonus հրամանով, ճիշտ պատասխանի դիմաց տրվում է պարգև։ Հարցը, ժամանակը և պարգևը կարգավորվում են սերվերում։

Կառավարվող վերագործարկում

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

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

Մոդերացիա

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

Մոդերացիա
Արգելափակումը խաղացողի և սերվերի աչքերով. ով է տվել, պատճառը և որքան է մնացել։ Նույն ծանուցումը գնում է ընդհանուր զրույց։

Առևտուր խաղացողների միջև

Խաղացողներն առարկաներ էին գնում և վաճառում միմյանց ներկառուցված առևտրի միջոցով։ Մեխանիկան փակում էր խաբեության տիպիկ սխեմաները թե՛ վաճառողի, թե՛ գնորդի կողմից։ Առանձնապես արժեքավոր առարկաները վաճառքի հանել չէր թույլատրվում, իսկ յուրաքանչյուր գործարքից սերվերը պահում էր առարկայի արժեքի 10%-ի չափով միջնորդավճար։

Գործարք խաղացողների միջև՝ հասանելի ապրանքների ցուցափեղկ, 10% միջնորդավճար և մեխանիկա, որը փակում է խաբեությունը երկու կողմից։ Առանձնապես արժեքավոր առարկաները հնարավոր չէ վաճառքի հանել։

Խաղային մեխանիկաներ

Մակարդակներ

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

Մակարդակների համակարգը. մակարդակը բարձրանում է խաղում անցկացրած ժամանակից, ընդ որում անգործությունը հաշվի չի առնվում։

FastBuilders

Արագ կառուցման մարզման ռեժիմ. հարթակները ստեղծվում էին ավտոմատ, արդյունքը գրանցվում էր, և դրա դիմաց տրվում էր պարգև։ Survival-ի հնարավորությունները ռեժիմում մնում էին, եթե չէին խանգարում մարզմանը։

FastBuilders՝ արագ կառուցման մարզման ռեժիմ։ Հարթակները ստեղծվում են ավտոմատ, արդյունքը գրանցվում է, և դրա դիմաց տրվում է պարգև։

Մոգական բաշխում

Սփոնի հատուկ հատվածներում պարբերաբար հայտնվում էին հազվագյուտ և արժեքավոր առարկաներ։

Մոգական բաշխում. սփոնի առանձին հատվածներում պարբերաբար հայտնվում են հազվագյուտ առարկաներ։ Այս մեխանիկան խաղացողներին հավաքում է մեկ տեղում։

Անտեսանելիություն

Ի տարբերություն ստանդարտ էֆեկտի՝ անտեսանելիությունը հեռացնում էր ոչ միայն կերպարի մոդելը, այլև ներկայության բոլոր նշանները՝ էֆեկտների մասնիկները, քայլերի ձայները, զրահը և փոխազդեցության հուշումները։ /vanish list հրամանը մոդերատորներին ցույց էր տալիս բոլոր նրանց, ովքեր այդ պահին անտեսանելի են։

Անտեսանելիություն. խաղացողը թաքնվում է ամբողջությամբ՝ ոչ միայն մոդելը, այլև ներկայության բոլոր նշանները։

Այլ մեխանիկաներ

Տեսանյութում՝ պատահական առաջադրանքների համակարգը՝ պարգևներով, և մականվան, նախածանցի ու սքինի փոփոխությունը հենց խաղում։

Տարիների ընթացքում արված ևս մի քանի համակարգ՝ փոքր, բայց ամենօրյա խաղում նկատելի։

Արդյունքներ

  • Մեկ ինստանսը միաժամանակ պահում էր 180+ խաղացող։
  • Survival-ը, SkyWars-ը և FastBuilders-ը աշխատում էին մեկ ինստանսի ներսում՝ առանց խաղացողին սերվերների միջև տեղափոխելու։
  • Հաշիվը, արտոնությունները, արժույթը և արկղերը մնում էին ընդհանուր ինստանսների միջև։
  • Լրամշակված միջուկը վերացրեց արտադրողականության սկզբնական սահմանափակումը. մինչ այդ օգտագործվող կոնֆիգուրացիան սկսում էր կորցնել TPS արդեն 70–80 խաղացողի դեպքում։

Մետրիկաներ

խաղացող միաժամանակ մեկ ինստանսում
180+

Փաստեր

  • Նախագծի ամենաակտիվ խաղացողը՝ Wauder-ը, TeamKind-ի աշխատանքի վերջին տարում խաղում անցկացրել է 1339,3 ժամ. երկրորդ արդյունքը՝ 797,5 ժամ, Said_123-ինն է։
  • Միջուկի սեփական ֆորքի՝ TeamCore-ի կայուն տարբերակներից մեկը պահպանվել է բաց հասանելիությամբ GitHub-ում։