Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,237 changes: 1,237 additions & 0 deletions lang/en_US.json

Large diffs are not rendered by default.

1,342 changes: 1,342 additions & 0 deletions lang/ru_RU.json

Large diffs are not rendered by default.

Binary file added lang/source.txt
Binary file not shown.
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
"prepare": "git config core.ignorecase false"
},
"dependencies": {
"@formatjs/intl-durationformat": "^0.7.4",
"@formatjs/intl-listformat": "^7.7.11",
"@formatjs/intl-locale": "^4.2.11",
"@formatjs/intl-numberformat": "^8.15.4",
"@formatjs/intl-pluralrules": "^5.4.4",
"@minecraft/server": "2.0.0-beta.1.21.70-stable",
"@minecraft/server-gametest": "1.0.0-beta.1.21.70-stable",
"@minecraft/server-net": "1.0.0-beta.1.21.70-stable",
Expand Down
2 changes: 1 addition & 1 deletion src/lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export * from 'lib/action'
export * from 'lib/cooldown'
export * from 'lib/enchantments'
export * from 'lib/event-signal'
export * from 'lib/i18n/lang'
export * from 'lib/location'
export * from 'lib/mail'
export * from 'lib/player-join'
Expand All @@ -35,7 +36,6 @@ export * from 'lib/settings'
export * from 'lib/sidebar'
export * from 'lib/temporary'
export * from 'lib/utils/game'
export * from 'lib/utils/lang'
export * from 'lib/utils/ms'
export * from 'lib/utils/search'

Expand Down
12 changes: 6 additions & 6 deletions src/lib/achievements/achievement.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Player, world } from '@minecraft/server'
import type { Command } from 'lib/command'
import { t } from 'lib/text'
import { i18n } from 'lib/i18n/text'
import { isNotPlaying } from 'lib/utils/game'
import { Rewards } from 'lib/utils/rewards'

Expand Down Expand Up @@ -30,7 +30,7 @@ export class Achievement<T> {
static create() {
return {
id: (id: string) => ({
name: (name: string) => ({
name: (name: SharedText) => ({
defaultStorage: <T>(defaultStorage: () => T) => ({
creator: (creator: CreatorAchievement<T>) => ({
reward: (reward: Rewards) => {
Expand All @@ -47,7 +47,7 @@ export class Achievement<T> {

protected constructor(
readonly id: string,
readonly name: string,
readonly name: SharedText,
protected readonly databaseDefaultValue: () => T,
creator: (ctx: Achievement<T>) => void,
readonly reward: Rewards,
Expand All @@ -68,7 +68,7 @@ export class Achievement<T> {
const db = this.getDatabase(player)
if (db.d) return

player.success(t`Достижение получено: ${this.name}! Заберите награды, используя ${Achievement.command}`)
player.success(i18n`Достижение получено: ${this.name}! Заберите награды, используя ${Achievement.command}`)
db.d = Date.now()
}

Expand Down Expand Up @@ -127,7 +127,7 @@ export class CountingAchievement<T extends { count: number }> extends Achievemen
return {
value: (value: number) => ({
id: (id: (v: number) => string) => ({
name: (name: (v: number) => string) => ({
name: (name: (v: number) => SharedText) => ({
creator: (creator: (ctx: CountingAchievement<T>) => void) => {
let d: undefined | (() => T)

Expand All @@ -149,7 +149,7 @@ export class CountingAchievement<T extends { count: number }> extends Achievemen
protected constructor(
protected readonly value: number,
id: (v: number) => string,
name: (v: number) => string,
name: (v: number) => SharedText,
creator: (ctx: StripUnneded<CountingAchievement<T>>) => void,
reward: Rewards,
databaseDefaultValue: () => T = () => ({ count: 0 }) as T,
Expand Down
29 changes: 15 additions & 14 deletions src/lib/achievements/command.ts
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
import { Player } from '@minecraft/server'
import { ArrayForm } from 'lib/form/array'
import { form, NewFormCallback } from 'lib/form/new'
import { i18n } from 'lib/i18n/text'
import { is } from 'lib/roles'
import { t } from 'lib/text'
import { Achievement } from './achievement'

Achievement.command = new Command('achiv')
.setAliases('ach', 'achievement', 'achiev', 'achivs', 'achievs')
.setDescription(t`Достижения`)
.setDescription(i18n`Достижения`)
.setPermissions('member')
.executes(ctx => achievementsForm(ctx.player))

export function achievementsFormName(player: Player) {
const notTaken = Achievement.list.filter(e => e.isDone(player) && !e.isRewardTaken(player))
return t.unreadBadge`§eДостижения ${notTaken.length}`
return i18n.warn`Достижения`.badge(notTaken.length)
}

export function achievementsForm(player: Player, back?: NewFormCallback) {
const self = () => achievementsForm(player, back)

new ArrayForm(t`Достижения`, Achievement.list)
new ArrayForm(i18n`Достижения`, Achievement.list)
.back(back)
.filters({
sortMode: {
name: t`Режим сортировки`,
name: i18n`Режим сортировки`,
value: [
['achivDate', t`По дате получения`],
['alphabet', t`По алфавиту`],
['achivDate', i18n`По дате получения`],
['alphabet', i18n`По алфавиту`],
],
},
hideUnknown: {
name: t`Скрыть неизвестные`,
name: i18n`Скрыть неизвестные`,
value: false,
},
showOnlyUncollected: {
name: t`Несобранные вверху`,
name: i18n`Несобранные вверху`,
value: true,
},
})
.sort((array, filters) => {
if (filters.hideUnknown) array = array.filter(e => e.isDone(player))

if (filters.sortMode === 'alphabet') {
array = array.slice().sort((a, b) => b.name.localeCompare(a.name))
array = array.slice().sort((a, b) => b.name.toString(player.lang).localeCompare(a.name.toString(player.lang)))
} else array = array.slice().sort((a, b) => (b.getDatabase(player).d ?? 0) - (a.getDatabase(player).d ?? 0))

const notTaken = array.filter(e => e.isDone(player) && !e.isRewardTaken(player))
Expand All @@ -55,20 +55,21 @@ export function achievementsForm(player: Player, back?: NewFormCallback) {
.button(item => {
const isDone = item.isDone(player)
const isRewardTaken = item.isRewardTaken(player)
// TODO Fix colors
return [
isDone ? (isRewardTaken ? item.name : t`${item.name}§c*\n§aЗаберите награды!`) : t`?\nНеизвестно`,
isDone ? (isRewardTaken ? item.name : i18n`${item.name}§c*\n§aЗаберите награды!`) : i18n`?\nНеизвестно`,
isDone ? p => achievementDetails(item).show(p, self) : self,
] as const
})
.show(player)
}

const achievementDetails = (achiv: Achievement<unknown>) =>
form((f, player, back) => {
form((f, { player, back }) => {
f.title(achiv.name)
f.body(t.raw`Награда: ${achiv.reward.toString()}`)
f.body(i18n`Награда: ${achiv.reward.toString(player)}`)
f.button(
achiv.isRewardTaken(player) ? t`Награды забраны` : t`§aЗабрать награды`,
achiv.isRewardTaken(player) ? i18n`Награды забраны` : i18n.success`Забрать награды`,
() => (achiv.takeRewards(player), achievementDetails(achiv).show(player, back)),
)
if (is(player.id, 'admin')) {
Expand Down
6 changes: 2 additions & 4 deletions src/lib/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export class PlaceAction {
}
}

type LockActionFunction = (player: Player) => boolean | { lockText: string }
type LockActionFunction = (player: Player) => boolean | { lockText: Text }

export interface LockActionCheckOptions {
ignore?: LockAction[]
Expand All @@ -85,10 +85,8 @@ export class LockAction {
* Checks if player is locked by any LockerAction and returns first lockText from it
*
* @param {Player} player - Player to check
* @param {object} o
* @param {LockAction[]} [o.ignore] - Which LockerActions ignore
* @param {LockAction[]} [o.accept] - Which LockerActions only accept
* @param {boolean} [o.tell]
* @param {boolean} [o.returnText] - Return lock text instead of boolean
*/
static locked(player: Player, { ignore, accept, tell = true, returnText }: LockActionCheckOptions = {}) {
Expand All @@ -112,7 +110,7 @@ export class LockAction {
/** Function that checks if player is being locked */
readonly isLocked: LockActionFunction,
/** Text that returns when player is locked */
readonly lockText: string,
readonly lockText: Text,
) {
LockAction.instances.push(this)
}
Expand Down
34 changes: 34 additions & 0 deletions src/lib/assets/intl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// prettier-ignore
/* eslint-disable */
// This file is autogenerated by script.
// Do not modify manually.

// intl-locale
import '@formatjs/intl-locale/polyfill-force';

// intl-getcanonicallocales
import '@formatjs/intl-getcanonicallocales/polyfill-force';

// intl-enumerator
import '@formatjs/intl-enumerator/polyfill-force';

// intl-pluralrules
import '@formatjs/intl-pluralrules/polyfill-force';

import '@formatjs/intl-pluralrules/locale-data/en';
import '@formatjs/intl-pluralrules/locale-data/ru';

// intl-listformat
import '@formatjs/intl-listformat/polyfill-force';

import '@formatjs/intl-listformat/locale-data/en';
import '@formatjs/intl-listformat/locale-data/ru';

// intl-numberformat
import '@formatjs/intl-numberformat/polyfill-force';

import '@formatjs/intl-numberformat/locale-data/en';
import '@formatjs/intl-numberformat/locale-data/ru';

// intl-durationformat
import '@formatjs/intl-durationformat/polyfill-force';
Loading
Loading